def setUp(self): self.proc = NotesMarkupTreeProcessor()
class NotesMarkupTreeProcessorTest(unittest.TestCase): def setUp(self): self.proc = NotesMarkupTreeProcessor() def htmlToString(self, html): inputHtml = '<div>' + html + '</div>' inputRoot = etree.fromstring(inputHtml) outputRoot = self.proc.run(inputRoot) outputText = b''.join(etree.tostring(child, encoding="utf-8") for child in outputRoot).decode("utf-8") return outputText def test_basic(self): html = ''' <h1>Первая заметка</h1> <p>Текст первой заметки</p> <h1>Вторая заметка</h1> <p>Текст второй заметки</p>''' expectedRe = re.compile( r'''^ <div\ class=["']note["']>\s* <div\ class=["']header["']>\s* <div\ class=["']title["']>Первая\ заметка</div>\s* </div>\s* <div\ class=["']content["']>\s* <p>Текст\ первой\ заметки</p>\s* </div>\s* </div>\s* <div\ class=["']note["']>\s* <div\ class=["']header["']>\s* <div\ class=["']title["']>Вторая\ заметка</div>\s* </div>\s* <div\ class=["']content["']>\s* <p>Текст\ второй\ заметки</p>\s* </div>\s* </div> $''', re.VERBOSE) self.assertRegex(self.htmlToString(html), expectedRe) def test_content_before_first_heading_is_ignored(self): html = '''<p>Текст до первой заметки</p>''' self.assertEqual("", self.htmlToString(html)) def test_text_content_and_markup_is_preserved(self): html = ''' <h1>Очень <strong>жирная</strong> заметка</h1> Текст <div class="empty"/> <div class="note_meta"/> Выделенный <em>курсивом</em> текст''' expectedRe = re.compile( r'''^ <div\ class=["']note["']>\s* <div\ class=["']header["']>\s* <div\ class=["']title["']>Очень\ <strong>жирная</strong>\ заметка</div>\s* </div>\s* <div\ class=["']content["']>\s* Текст\s* <div\ class=["']empty["'] (\ */>|></div>) \s* Выделенный\ <em>курсивом</em>\ текст\s* </div>\s* </div>\s* $''', re.VERBOSE) self.assertRegex(self.htmlToString(html), expectedRe) def test_note_meta(self): html = ''' <h1>Заметка</h1> Текст <div class="note_meta"> <div class="date">01.01.2000</div> <div class="tags"> <a href="#" class="note_tag">метка</a> </div> </div> Продолжение текста''' expectedRe = re.compile( r'''^ <div\ class=["']note["']>\s* <div\ class=["']header["']>\s* ( <div\ class=["']title["']>Заметка</div>\s* <div\ class=["']date["']>01\.01\.2000</div> | <div\ class=["']date["']>01\.01\.2000</div>\s* <div\ class=["']title["']>Заметка</div> ) \s* </div>\s* <div\ class=["']content["']>\s* Текст\s+Продолжение\ текста\s* </div>\s* <div\ class=['"]tags['"]>\s* <a\ ( href=['"]\#['"]\ class=['"]note_tag['"] | class=['"]note_tag['"]\ href=['"]\#['"] ) >метка</a>\s* </div>\s* </div>\s* $''', re.VERBOSE) self.assertRegex(self.htmlToString(html), expectedRe) def test_note_meta_in_several_blocks(self): html = ''' <h1>Заметка</h1> Текст <div class="note_meta"> <div class="date">01.01.2000</div> </div> Продолжение текста <div class="note_meta"> <div class="tags"> <a href="#" class="note_tag">метка</a> </div> </div> ''' expectedRe = re.compile( r'''^ <div\ class=["']note["']>\s* <div\ class=["']header["']>\s* <div\ class=["']title["']>Заметка</div>\s* <div\ class=["']date["']>01\.01\.2000</div>\s* </div>\s* <div\ class=["']content["']>\s* Текст\s+Продолжение\ текста\s* </div>\s* <div\ class=['"]tags['"]>\s* <a\ ( href=['"]\#['"]\ class=['"]note_tag['"] | class=['"]note_tag['"]\ href=['"]\#['"] ) >метка</a>\s* </div>\s* </div>\s* $''', re.VERBOSE) self.assertRegex(self.htmlToString(html), expectedRe)