11import operator
22import unittest
33from functools import reduce
4+ from typing import Sequence
45
56from bs4 import BeautifulSoup
67from markdown import markdown
78from markupsafe import Markup , escape
89
910from fluent_compiler .bundle import FluentBundle
11+ from fluent_compiler .escapers import IsEscaper
1012
1113from ..utils import dedent_ftl
1214
@@ -17,22 +19,19 @@ class HtmlEscaper:
1719 output_type = Markup
1820 use_isolating = False
1921
20- def __init__ (self , test_case ):
21- self .test_case = test_case
22-
23- def select (self , message_id : str , ** hints ):
22+ def select (self , message_id : str , ** kwargs : object ):
2423 return message_id .endswith ("-html" )
2524
26- def mark_escaped (self , escaped ) :
27- self . test_case . assertEqual ( type (escaped ), str )
25+ def mark_escaped (self , escaped : str ) -> Markup :
26+ assert type (escaped ) is str
2827 return Markup (escaped )
2928
30- def escape (self , unescaped ) :
29+ def escape (self , unescaped : str ) -> Markup :
3130 return escape (unescaped )
3231
33- def join (self , parts ) :
32+ def join (self , parts : Sequence [ Markup ]) -> Markup :
3433 for p in parts :
35- self . test_case . assertEqual ( type (p ), Markup )
34+ assert type (p ) is Markup
3635 return Markup ("" ).join (parts )
3736
3837
@@ -79,15 +78,13 @@ def __init__(self, text):
7978class MarkdownEscaper :
8079 name = "MarkdownEscaper"
8180 output_type = Markdown
81+ use_isolating = False
8282
83- def __init__ (self , test_case ):
84- self .test_case = test_case
85-
86- def select (self , message_id : str , ** hints ):
83+ def select (self , message_id : str , ** kwargs : object ):
8784 return message_id .endswith ("-md" )
8885
8986 def mark_escaped (self , escaped ):
90- self . test_case . assertEqual ( type (escaped ), str )
87+ assert type (escaped ) is str
9188 return LiteralMarkdown (escaped )
9289
9390 def escape (self , unescaped ):
@@ -98,13 +95,13 @@ def escape(self, unescaped):
9895
9996 def join (self , parts ):
10097 for p in parts :
101- self . test_case . assertTrue ( isinstance (p , Markdown ) )
98+ assert isinstance (p , Markdown )
10299 return reduce (operator .add , parts , empty_markdown )
103100
104101
105102class TestHtmlEscaping (unittest .TestCase ):
106103 def setUp (self ):
107- escaper = HtmlEscaper (self )
104+ escaper : IsEscaper [ Markup ] = HtmlEscaper ()
108105
109106 # A function that outputs '> ' that needs to be escaped. Part of the
110107 # point of this is to ensure that escaping is being done at the correct
@@ -113,7 +110,7 @@ def setUp(self):
113110 def QUOTE (arg ):
114111 return "\n " + "\n " .join (f"> { line } " for line in arg .split ("\n " ))
115112
116- self .bundle = FluentBundle .from_string (
113+ self .html_escaping_bundle = FluentBundle .from_string (
117114 "en-US" ,
118115 dedent_ftl (
119116 """
@@ -180,123 +177,125 @@ def assertTypeAndValueEqual(self, val1, val2):
180177 self .assertEqual (type (val1 ), type (val2 ))
181178
182179 def test_select_false (self ):
183- val , errs = self .bundle .format ("not-html-message" )
180+ val , errs = self .html_escaping_bundle .format ("not-html-message" )
184181 self .assertTypeAndValueEqual (val , "x < y" )
185182
186183 def test_simple (self ):
187- val , errs = self .bundle .format ("simple-html" )
184+ val , errs = self .html_escaping_bundle .format ("simple-html" )
188185 self .assertTypeAndValueEqual (val , Markup ("This is <b>great</b>." ))
189186 self .assertEqual (errs , [])
190187
191188 def test_argument_is_escaped (self ):
192- val , errs = self .bundle .format ("argument-html" , {"arg" : "Jack & Jill" })
189+ val , errs = self .html_escaping_bundle .format ("argument-html" , {"arg" : "Jack & Jill" })
193190 self .assertTypeAndValueEqual (val , Markup ("This <b>thing</b> is called Jack & Jill." ))
194191 self .assertEqual (errs , [])
195192
196193 def test_argument_already_escaped (self ):
197- val , errs = self .bundle .format ("argument-html" , {"arg" : Markup ("<b>Jack</b>" )})
194+ val , errs = self .html_escaping_bundle .format ("argument-html" , {"arg" : Markup ("<b>Jack</b>" )})
198195 self .assertTypeAndValueEqual (val , Markup ("This <b>thing</b> is called <b>Jack</b>." ))
199196 self .assertEqual (errs , [])
200197
201198 def test_included_html_term (self ):
202- val , errs = self .bundle .format ("references-html-term-html" )
199+ val , errs = self .html_escaping_bundle .format ("references-html-term-html" )
203200 self .assertTypeAndValueEqual (val , Markup ("<b>Jack & Jill</b> are <b>great!</b>" ))
204201 self .assertEqual (errs , [])
205202
206203 def test_included_plain_term (self ):
207- val , errs = self .bundle .format ("references-plain-term-html" )
204+ val , errs = self .html_escaping_bundle .format ("references-plain-term-html" )
208205 self .assertTypeAndValueEqual (val , Markup ("Jack & Jill are <b>great!</b>" ))
209206 self .assertEqual (errs , [])
210207
211208 def test_included_html_term_from_plain (self ):
212- val , errs = self .bundle .format ("references-html-term-plain" )
209+ val , errs = self .html_escaping_bundle .format ("references-html-term-plain" )
213210 self .assertTypeAndValueEqual (val , "\u2068 -term-html\u2069 are great!" )
214211 self .assertEqual (type (errs [0 ]), TypeError )
215212
216213 def test_compound_message (self ):
217- val , errs = self .bundle .format ("compound-message-html" , {"arg" : "Jack & Jill" })
214+ val , errs = self .html_escaping_bundle .format ("compound-message-html" , {"arg" : "Jack & Jill" })
218215 self .assertTypeAndValueEqual (
219216 val ,
220217 Markup ("A message about Jack & Jill. " "This <b>thing</b> is called Jack & Jill." ),
221218 )
222219 self .assertEqual (errs , [])
223220
224221 def test_function (self ):
225- val , errs = self .bundle .format ("function-html" , {"text" : "Jack & Jill" })
222+ val , errs = self .html_escaping_bundle .format ("function-html" , {"text" : "Jack & Jill" })
226223 self .assertTypeAndValueEqual (val , Markup ("You said: \n > Jack & Jill" ))
227224 self .assertEqual (errs , [])
228225
229226 def test_plain_parent (self ):
230- val , errs = self .bundle .format ("parent-plain" )
227+ val , errs = self .html_escaping_bundle .format ("parent-plain" )
231228 self .assertTypeAndValueEqual (val , "Some stuff" )
232229 self .assertEqual (errs , [])
233230
234231 def test_html_attribute (self ):
235- val , errs = self .bundle .format ("parent-plain.attr-html" )
232+ val , errs = self .html_escaping_bundle .format ("parent-plain.attr-html" )
236233 self .assertTypeAndValueEqual (val , Markup ("Some <b>HTML</b> stuff" ))
237234 self .assertEqual (errs , [])
238235
239236 def test_html_message_reference_from_plain (self ):
240- val , errs = self .bundle .format ("references-html-message-plain" )
237+ val , errs = self .html_escaping_bundle .format ("references-html-message-plain" )
241238 self .assertTypeAndValueEqual (val , "Plain. \u2068 simple-html\u2069 " )
242239 self .assertEqual (len (errs ), 1 )
243240 self .assertEqual (type (errs [0 ]), TypeError )
244241
245242 # Message attr references
246243 def test_html_message_attr_reference_from_plain (self ):
247- val , errs = self .bundle .format ("references-html-message-attr-plain" )
244+ val , errs = self .html_escaping_bundle .format ("references-html-message-attr-plain" )
248245 self .assertTypeAndValueEqual (val , "Plain. \u2068 parent-plain.attr-html\u2069 " )
249246 self .assertEqual (len (errs ), 1 )
250247 self .assertEqual (type (errs [0 ]), TypeError )
251248
252249 def test_html_message_attr_reference_from_html (self ):
253- val , errs = self .bundle .format ("references-html-message-attr-html" )
250+ val , errs = self .html_escaping_bundle .format ("references-html-message-attr-html" )
254251 self .assertTypeAndValueEqual (val , Markup ("<b>HTML</b>. Some <b>HTML</b> stuff" ))
255252 self .assertEqual (errs , [])
256253
257254 def test_plain_message_attr_reference_from_html (self ):
258- val , errs = self .bundle .format ("references-plain-message-attr-html" )
255+ val , errs = self .html_escaping_bundle .format ("references-plain-message-attr-html" )
259256 self .assertTypeAndValueEqual (val , Markup ("<b>HTML</b>. This & That" ))
260257 self .assertEqual (errs , [])
261258
262259 # Term variant references
263260 def test_html_variant_from_plain (self ):
264- val , errs = self .bundle .format ("references-html-variant-plain" )
261+ val , errs = self .html_escaping_bundle .format ("references-html-variant-plain" )
265262 self .assertTypeAndValueEqual (val , "\u2068 -brand-html\u2069 is cool" )
266263 self .assertEqual (len (errs ), 1 )
267264 self .assertEqual (type (errs [0 ]), TypeError )
268265
269266 def test_html_variant_from_html (self ):
270- val , errs = self .bundle .format ("references-html-variant-html" )
267+ val , errs = self .html_escaping_bundle .format ("references-html-variant-html" )
271268 self .assertTypeAndValueEqual (val , Markup ("CoolBrand<sup>2</sup> is cool" ))
272269 self .assertEqual (errs , [])
273270
274271 def test_plain_variant_from_plain (self ):
275- val , errs = self .bundle .format ("references-plain-variant-plain" )
272+ val , errs = self .html_escaping_bundle .format ("references-plain-variant-plain" )
276273 self .assertTypeAndValueEqual (val , "\u2068 A&B\u2069 is awesome" )
277274 self .assertEqual (errs , [])
278275
279276 def test_plain_variant_from_html (self ):
280- val , errs = self .bundle .format ("references-plain-variant-html" )
277+ val , errs = self .html_escaping_bundle .format ("references-plain-variant-html" )
281278 self .assertTypeAndValueEqual (val , Markup ("A&B is awesome" ))
282279 self .assertEqual (errs , [])
283280
284281 def test_use_isolating (self ):
285- val , errs = self .bundle .format ("attribute-argument-html" , {"url" : "http://example.com" , "place" : "A Place" })
282+ val , errs = self .html_escaping_bundle .format (
283+ "attribute-argument-html" , {"url" : "http://example.com" , "place" : "A Place" }
284+ )
286285 self .assertTypeAndValueEqual (val , Markup ('A <a href="http://example.com">link to A Place</a>' ))
287286
288287
289288class TestMarkdownEscaping (unittest .TestCase ):
290289 maxDiff = None
291290
292291 def setUp (self ):
293- escaper = MarkdownEscaper (self )
292+ escaper : IsEscaper [ Markdown ] = MarkdownEscaper ()
294293
295294 # This QUOTE function outputs Markdown that should not be removed.
296295 def QUOTE (arg ):
297296 return Markdown ("\n " + "\n " .join (f"> { line } " for line in arg .split ("\n " )))
298297
299- self .bundle = FluentBundle .from_string (
298+ self .markdown_escaping_bundle = FluentBundle .from_string (
300299 "en-US" ,
301300 dedent_ftl (
302301 """
@@ -373,96 +372,96 @@ def test_strip_markdown(self):
373372 )
374373
375374 def test_select_false (self ):
376- val , errs = self .bundle .format ("not-md-message" )
375+ val , errs = self .markdown_escaping_bundle .format ("not-md-message" )
377376 self .assertEqual (val , "**some text**" )
378377
379378 def test_simple (self ):
380- val , errs = self .bundle .format ("simple-md" )
379+ val , errs = self .markdown_escaping_bundle .format ("simple-md" )
381380 self .assertEqual (val , Markdown ("This is **great**" ))
382381 self .assertEqual (errs , [])
383382
384383 def test_argument_is_escaped (self ):
385- val , errs = self .bundle .format ("argument-md" , {"arg" : "**Jack**" })
384+ val , errs = self .markdown_escaping_bundle .format ("argument-md" , {"arg" : "**Jack**" })
386385 self .assertEqual (val , Markdown ("This **thing** is called Jack." ))
387386 self .assertEqual (errs , [])
388387
389388 def test_argument_already_escaped (self ):
390- val , errs = self .bundle .format ("argument-md" , {"arg" : Markdown ("**Jack**" )})
389+ val , errs = self .markdown_escaping_bundle .format ("argument-md" , {"arg" : Markdown ("**Jack**" )})
391390 self .assertEqual (val , Markdown ("This **thing** is called **Jack**." ))
392391 self .assertEqual (errs , [])
393392
394393 def test_included_md (self ):
395- val , errs = self .bundle .format ("term-md-ref-md" )
394+ val , errs = self .markdown_escaping_bundle .format ("term-md-ref-md" )
396395 self .assertEqual (val , Markdown ("**Jack** & __Jill__ are **great!**" ))
397396 self .assertEqual (errs , [])
398397
399398 def test_included_plain (self ):
400- val , errs = self .bundle .format ("term-plain-ref-md" )
399+ val , errs = self .markdown_escaping_bundle .format ("term-plain-ref-md" )
401400 self .assertEqual (val , Markdown ("Jack & Jill are **great!**" ))
402401 self .assertEqual (errs , [])
403402
404403 def test_compound_message (self ):
405- val , errs = self .bundle .format ("compound-message-md" , {"arg" : "**Jack & Jill**" })
404+ val , errs = self .markdown_escaping_bundle .format ("compound-message-md" , {"arg" : "**Jack & Jill**" })
406405 self .assertEqual (
407406 val ,
408407 Markdown ("A message about Jack & Jill. " "This **thing** is called Jack & Jill." ),
409408 )
410409 self .assertEqual (errs , [])
411410
412411 def test_function (self ):
413- val , errs = self .bundle .format ("function-md" , {"text" : "Jack & Jill" })
412+ val , errs = self .markdown_escaping_bundle .format ("function-md" , {"text" : "Jack & Jill" })
414413 self .assertEqual (val , Markdown ("You said: \n > Jack & Jill" ))
415414 self .assertEqual (errs , [])
416415
417416 def test_plain_parent (self ):
418- val , errs = self .bundle .format ("parent-plain" )
417+ val , errs = self .markdown_escaping_bundle .format ("parent-plain" )
419418 self .assertEqual (val , "Some stuff" )
420419 self .assertEqual (errs , [])
421420
422421 def test_md_attribute (self ):
423- val , errs = self .bundle .format ("parent-plain.attr-md" )
422+ val , errs = self .markdown_escaping_bundle .format ("parent-plain.attr-md" )
424423 self .assertEqual (val , Markdown ("Some **Markdown** stuff" ))
425424 self .assertEqual (errs , [])
426425
427426 def test_md_message_reference_from_plain (self ):
428- val , errs = self .bundle .format ("references-md-message-plain" )
427+ val , errs = self .markdown_escaping_bundle .format ("references-md-message-plain" )
429428 self .assertEqual (val , "Plain. simple-md" )
430429 self .assertEqual (len (errs ), 1 )
431430 self .assertEqual (type (errs [0 ]), TypeError )
432431
433432 def test_md_attr_reference_from_plain (self ):
434- val , errs = self .bundle .format ("references-md-attr-plain" )
433+ val , errs = self .markdown_escaping_bundle .format ("references-md-attr-plain" )
435434 self .assertEqual (val , "Plain. parent-plain.attr-md" )
436435 self .assertEqual (len (errs ), 1 )
437436 self .assertEqual (type (errs [0 ]), TypeError )
438437
439438 def test_md_reference_from_md (self ):
440- val , errs = self .bundle .format ("references-md-attr-md" )
439+ val , errs = self .markdown_escaping_bundle .format ("references-md-attr-md" )
441440 self .assertEqual (val , Markdown ("**Markdown**. Some **Markdown** stuff" ))
442441 self .assertEqual (errs , [])
443442
444443 def test_plain_reference_from_md (self ):
445- val , errs = self .bundle .format ("references-plain-attr-md" )
444+ val , errs = self .markdown_escaping_bundle .format ("references-plain-attr-md" )
446445 self .assertEqual (val , Markdown ("**Markdown**. This and That" ))
447446 self .assertEqual (errs , [])
448447
449448 def test_md_variant_from_plain (self ):
450- val , errs = self .bundle .format ("references-md-variant-plain" )
449+ val , errs = self .markdown_escaping_bundle .format ("references-md-variant-plain" )
451450 self .assertEqual (val , "-brand-md is cool" )
452451 self .assertEqual (len (errs ), 1 )
453452 self .assertEqual (type (errs [0 ]), TypeError )
454453
455454 def test_md_variant_from_md (self ):
456- val , errs = self .bundle .format ("references-md-variant-md" )
455+ val , errs = self .markdown_escaping_bundle .format ("references-md-variant-md" )
457456 self .assertEqual (val , Markdown ("CoolBrand **2** is cool" ))
458457 self .assertEqual (errs , [])
459458
460459 def test_plain_variant_from_plain (self ):
461- val , errs = self .bundle .format ("references-plain-variant-plain" )
460+ val , errs = self .markdown_escaping_bundle .format ("references-plain-variant-plain" )
462461 self .assertEqual (val , "*A&B* is awesome" )
463462 self .assertEqual (errs , [])
464463
465464 def test_plain_variant_from_md (self ):
466- val , errs = self .bundle .format ("references-plain-variant-md" )
465+ val , errs = self .markdown_escaping_bundle .format ("references-plain-variant-md" )
467466 self .assertEqual (val , Markdown ("A&B is awesome" ))
468467 self .assertEqual (errs , [])
0 commit comments