1
1
import operator
2
2
import unittest
3
3
from functools import reduce
4
+ from typing import Sequence
4
5
5
6
from bs4 import BeautifulSoup
6
7
from markdown import markdown
7
8
from markupsafe import Markup , escape
8
9
9
10
from fluent_compiler .bundle import FluentBundle
11
+ from fluent_compiler .escapers import IsEscaper
10
12
11
13
from ..utils import dedent_ftl
12
14
@@ -17,22 +19,19 @@ class HtmlEscaper:
17
19
output_type = Markup
18
20
use_isolating = False
19
21
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 ):
24
23
return message_id .endswith ("-html" )
25
24
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
28
27
return Markup (escaped )
29
28
30
- def escape (self , unescaped ) :
29
+ def escape (self , unescaped : str ) -> Markup :
31
30
return escape (unescaped )
32
31
33
- def join (self , parts ) :
32
+ def join (self , parts : Sequence [ Markup ]) -> Markup :
34
33
for p in parts :
35
- self . test_case . assertEqual ( type (p ), Markup )
34
+ assert type (p ) is Markup
36
35
return Markup ("" ).join (parts )
37
36
38
37
@@ -79,15 +78,13 @@ def __init__(self, text):
79
78
class MarkdownEscaper :
80
79
name = "MarkdownEscaper"
81
80
output_type = Markdown
81
+ use_isolating = False
82
82
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 ):
87
84
return message_id .endswith ("-md" )
88
85
89
86
def mark_escaped (self , escaped ):
90
- self . test_case . assertEqual ( type (escaped ), str )
87
+ assert type (escaped ) is str
91
88
return LiteralMarkdown (escaped )
92
89
93
90
def escape (self , unescaped ):
@@ -98,13 +95,13 @@ def escape(self, unescaped):
98
95
99
96
def join (self , parts ):
100
97
for p in parts :
101
- self . test_case . assertTrue ( isinstance (p , Markdown ) )
98
+ assert isinstance (p , Markdown )
102
99
return reduce (operator .add , parts , empty_markdown )
103
100
104
101
105
102
class TestHtmlEscaping (unittest .TestCase ):
106
103
def setUp (self ):
107
- escaper = HtmlEscaper (self )
104
+ escaper : IsEscaper [ Markup ] = HtmlEscaper ()
108
105
109
106
# A function that outputs '> ' that needs to be escaped. Part of the
110
107
# point of this is to ensure that escaping is being done at the correct
@@ -113,7 +110,7 @@ def setUp(self):
113
110
def QUOTE (arg ):
114
111
return "\n " + "\n " .join (f"> { line } " for line in arg .split ("\n " ))
115
112
116
- self .bundle = FluentBundle .from_string (
113
+ self .html_escaping_bundle = FluentBundle .from_string (
117
114
"en-US" ,
118
115
dedent_ftl (
119
116
"""
@@ -180,123 +177,125 @@ def assertTypeAndValueEqual(self, val1, val2):
180
177
self .assertEqual (type (val1 ), type (val2 ))
181
178
182
179
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" )
184
181
self .assertTypeAndValueEqual (val , "x < y" )
185
182
186
183
def test_simple (self ):
187
- val , errs = self .bundle .format ("simple-html" )
184
+ val , errs = self .html_escaping_bundle .format ("simple-html" )
188
185
self .assertTypeAndValueEqual (val , Markup ("This is <b>great</b>." ))
189
186
self .assertEqual (errs , [])
190
187
191
188
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" })
193
190
self .assertTypeAndValueEqual (val , Markup ("This <b>thing</b> is called Jack & Jill." ))
194
191
self .assertEqual (errs , [])
195
192
196
193
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>" )})
198
195
self .assertTypeAndValueEqual (val , Markup ("This <b>thing</b> is called <b>Jack</b>." ))
199
196
self .assertEqual (errs , [])
200
197
201
198
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" )
203
200
self .assertTypeAndValueEqual (val , Markup ("<b>Jack & Jill</b> are <b>great!</b>" ))
204
201
self .assertEqual (errs , [])
205
202
206
203
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" )
208
205
self .assertTypeAndValueEqual (val , Markup ("Jack & Jill are <b>great!</b>" ))
209
206
self .assertEqual (errs , [])
210
207
211
208
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" )
213
210
self .assertTypeAndValueEqual (val , "\u2068 -term-html\u2069 are great!" )
214
211
self .assertEqual (type (errs [0 ]), TypeError )
215
212
216
213
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" })
218
215
self .assertTypeAndValueEqual (
219
216
val ,
220
217
Markup ("A message about Jack & Jill. " "This <b>thing</b> is called Jack & Jill." ),
221
218
)
222
219
self .assertEqual (errs , [])
223
220
224
221
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" })
226
223
self .assertTypeAndValueEqual (val , Markup ("You said: \n > Jack & Jill" ))
227
224
self .assertEqual (errs , [])
228
225
229
226
def test_plain_parent (self ):
230
- val , errs = self .bundle .format ("parent-plain" )
227
+ val , errs = self .html_escaping_bundle .format ("parent-plain" )
231
228
self .assertTypeAndValueEqual (val , "Some stuff" )
232
229
self .assertEqual (errs , [])
233
230
234
231
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" )
236
233
self .assertTypeAndValueEqual (val , Markup ("Some <b>HTML</b> stuff" ))
237
234
self .assertEqual (errs , [])
238
235
239
236
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" )
241
238
self .assertTypeAndValueEqual (val , "Plain. \u2068 simple-html\u2069 " )
242
239
self .assertEqual (len (errs ), 1 )
243
240
self .assertEqual (type (errs [0 ]), TypeError )
244
241
245
242
# Message attr references
246
243
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" )
248
245
self .assertTypeAndValueEqual (val , "Plain. \u2068 parent-plain.attr-html\u2069 " )
249
246
self .assertEqual (len (errs ), 1 )
250
247
self .assertEqual (type (errs [0 ]), TypeError )
251
248
252
249
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" )
254
251
self .assertTypeAndValueEqual (val , Markup ("<b>HTML</b>. Some <b>HTML</b> stuff" ))
255
252
self .assertEqual (errs , [])
256
253
257
254
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" )
259
256
self .assertTypeAndValueEqual (val , Markup ("<b>HTML</b>. This & That" ))
260
257
self .assertEqual (errs , [])
261
258
262
259
# Term variant references
263
260
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" )
265
262
self .assertTypeAndValueEqual (val , "\u2068 -brand-html\u2069 is cool" )
266
263
self .assertEqual (len (errs ), 1 )
267
264
self .assertEqual (type (errs [0 ]), TypeError )
268
265
269
266
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" )
271
268
self .assertTypeAndValueEqual (val , Markup ("CoolBrand<sup>2</sup> is cool" ))
272
269
self .assertEqual (errs , [])
273
270
274
271
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" )
276
273
self .assertTypeAndValueEqual (val , "\u2068 A&B\u2069 is awesome" )
277
274
self .assertEqual (errs , [])
278
275
279
276
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" )
281
278
self .assertTypeAndValueEqual (val , Markup ("A&B is awesome" ))
282
279
self .assertEqual (errs , [])
283
280
284
281
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
+ )
286
285
self .assertTypeAndValueEqual (val , Markup ('A <a href="http://example.com">link to A Place</a>' ))
287
286
288
287
289
288
class TestMarkdownEscaping (unittest .TestCase ):
290
289
maxDiff = None
291
290
292
291
def setUp (self ):
293
- escaper = MarkdownEscaper (self )
292
+ escaper : IsEscaper [ Markdown ] = MarkdownEscaper ()
294
293
295
294
# This QUOTE function outputs Markdown that should not be removed.
296
295
def QUOTE (arg ):
297
296
return Markdown ("\n " + "\n " .join (f"> { line } " for line in arg .split ("\n " )))
298
297
299
- self .bundle = FluentBundle .from_string (
298
+ self .markdown_escaping_bundle = FluentBundle .from_string (
300
299
"en-US" ,
301
300
dedent_ftl (
302
301
"""
@@ -373,96 +372,96 @@ def test_strip_markdown(self):
373
372
)
374
373
375
374
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" )
377
376
self .assertEqual (val , "**some text**" )
378
377
379
378
def test_simple (self ):
380
- val , errs = self .bundle .format ("simple-md" )
379
+ val , errs = self .markdown_escaping_bundle .format ("simple-md" )
381
380
self .assertEqual (val , Markdown ("This is **great**" ))
382
381
self .assertEqual (errs , [])
383
382
384
383
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**" })
386
385
self .assertEqual (val , Markdown ("This **thing** is called Jack." ))
387
386
self .assertEqual (errs , [])
388
387
389
388
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**" )})
391
390
self .assertEqual (val , Markdown ("This **thing** is called **Jack**." ))
392
391
self .assertEqual (errs , [])
393
392
394
393
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" )
396
395
self .assertEqual (val , Markdown ("**Jack** & __Jill__ are **great!**" ))
397
396
self .assertEqual (errs , [])
398
397
399
398
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" )
401
400
self .assertEqual (val , Markdown ("Jack & Jill are **great!**" ))
402
401
self .assertEqual (errs , [])
403
402
404
403
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**" })
406
405
self .assertEqual (
407
406
val ,
408
407
Markdown ("A message about Jack & Jill. " "This **thing** is called Jack & Jill." ),
409
408
)
410
409
self .assertEqual (errs , [])
411
410
412
411
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" })
414
413
self .assertEqual (val , Markdown ("You said: \n > Jack & Jill" ))
415
414
self .assertEqual (errs , [])
416
415
417
416
def test_plain_parent (self ):
418
- val , errs = self .bundle .format ("parent-plain" )
417
+ val , errs = self .markdown_escaping_bundle .format ("parent-plain" )
419
418
self .assertEqual (val , "Some stuff" )
420
419
self .assertEqual (errs , [])
421
420
422
421
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" )
424
423
self .assertEqual (val , Markdown ("Some **Markdown** stuff" ))
425
424
self .assertEqual (errs , [])
426
425
427
426
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" )
429
428
self .assertEqual (val , "Plain. simple-md" )
430
429
self .assertEqual (len (errs ), 1 )
431
430
self .assertEqual (type (errs [0 ]), TypeError )
432
431
433
432
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" )
435
434
self .assertEqual (val , "Plain. parent-plain.attr-md" )
436
435
self .assertEqual (len (errs ), 1 )
437
436
self .assertEqual (type (errs [0 ]), TypeError )
438
437
439
438
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" )
441
440
self .assertEqual (val , Markdown ("**Markdown**. Some **Markdown** stuff" ))
442
441
self .assertEqual (errs , [])
443
442
444
443
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" )
446
445
self .assertEqual (val , Markdown ("**Markdown**. This and That" ))
447
446
self .assertEqual (errs , [])
448
447
449
448
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" )
451
450
self .assertEqual (val , "-brand-md is cool" )
452
451
self .assertEqual (len (errs ), 1 )
453
452
self .assertEqual (type (errs [0 ]), TypeError )
454
453
455
454
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" )
457
456
self .assertEqual (val , Markdown ("CoolBrand **2** is cool" ))
458
457
self .assertEqual (errs , [])
459
458
460
459
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" )
462
461
self .assertEqual (val , "*A&B* is awesome" )
463
462
self .assertEqual (errs , [])
464
463
465
464
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" )
467
466
self .assertEqual (val , Markdown ("A&B is awesome" ))
468
467
self .assertEqual (errs , [])
0 commit comments