def test_render(self,mock_graph): @render def testfunc(repo,doc): pass mockdoc = Mock() mockrepo = Mock() mockrepo.store.parsed_path.return_value = "parsed_path.xhtml" with open("parsed_path.xhtml", "w") as fp: fp.write("""<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.0//EN" "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:dct="http://purl.org/dc/terms/"> <head about="http://example.org/doc"> <title property="dct:title">Document title</title> </head> <body> <h1>Hello!</h1> </body> </html>""") mockrepo.store.distilled_path.return_value = "distilled_path.xhtml" mockrepo.get_globals.return_value = {'symbol table':'fake'} mockdoc.meta = MagicMock() # need Magicmock which supports magic funcs like __iter__ bodypart = MagicMock() bodypart.meta = MagicMock() mockdoc.body = [bodypart] mockdoc.meta.__iter__.return_value = [] mockdoc.uri = "http://example.org/doc" with patch('ferenda.util.ensure_dir', return_value=True): testfunc(mockrepo, mockdoc) # 1 ensure that DocumentRepository.render_xhtml is called with # four arguments mockrepo.render_xhtml.assert_called_with(mockdoc, "parsed_path.xhtml") # 2 ensure that DocumentRepository.create_external_resources # is called with 1 argument mockrepo.create_external_resources.assert_called_with(mockdoc) # 3 ensure that a Graph object is created, its parse and # serialize methods called # FIXME: Why doesn't the patching work?! # self.assertTrue(mock_graph().parse.called) # self.assertTrue(mock_graph().serialize.called) # (4. ensure that a warning gets printed if doc.meta and # distilled_graph do not agree) mock_graph().__iter__.return_value = ['a','b'] mockdoc.meta.__iter__.return_value = ['a','b','c'] mockdoc.meta.serialize.return_value = b"<c>" with patch('ferenda.util.ensure_dir', return_value=True): testfunc(mockrepo, mockdoc) self.assertTrue(mockrepo.log.warning.called) os.remove("parsed_path.xhtml") os.remove("distilled_path.xhtml")
def test_render(self, mock_graph): @render def testfunc(repo, doc): pass mockdoc = Mock() mockrepo = MagicMock() mockrepo.store.parsed_path.return_value = "parsed_path.xhtml" with open("parsed_path.xhtml", "w") as fp: fp.write("""<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.0//EN" "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:dcterms="http://purl.org/dc/terms/"> <head about="http://example.org/doc"> <title property="dcterms:title">Document title</title> </head> <body> <h1>Hello!</h1> </body> </html>""") with open("entry_path.json", "w") as fp: fp.write("""{ "id": "https://lagen.nu/concept/St\\u00e5ende_anbud", "title": "St\\u00e5ende anbud", }""") mockrepo.store.distilled_path.return_value = "distilled_path.xhtml" mockrepo.get_globals.return_value = {'symbol table': 'fake'} mockrepo.required_predicates = [] mockrepo.config = MagicMock() mockdoc.meta = MagicMock( ) # need Magicmock which supports magic funcs like __iter__ bodypart = MagicMock() bodypart.meta = MagicMock() mockdoc.body = [bodypart] mockdoc.meta.__iter__.return_value = [] mockdoc.uri = "http://example.org/doc" mockrepo.store.documententry_path.return_value = None with patch('ferenda.util.ensure_dir', return_value=True): testfunc(mockrepo, mockdoc) # 1 ensure that DocumentRepository.render_xhtml is called with # four arguments mockrepo.render_xhtml.assert_called_with(mockdoc, "parsed_path.xhtml") # 2 ensure that DocumentRepository.create_external_resources # is called with 1 argument mockrepo.create_external_resources.assert_called_with(mockdoc) # 3 ensure that a Graph object is created, its parse and # serialize methods called # FIXME: Why doesn't the patching work?! # self.assertTrue(mock_graph().parse.called) # self.assertTrue(mock_graph().serialize.called) # (4. ensure that a warning gets printed if doc.meta and # distilled_graph do not agree) mock_graph().__iter__.return_value = ['a', 'b'] mockdoc.meta.__iter__.return_value = ['a', 'b', 'c'] mockdoc.meta.serialize.return_value = b"<c>" with patch('ferenda.util.ensure_dir', return_value=True): testfunc(mockrepo, mockdoc) self.assertTrue(mockrepo.log.warning.called) os.remove("parsed_path.xhtml") os.remove("distilled_path.xhtml") os.remove("entry_path.json")
# -*- coding: utf-8 -*- from __future__ import unicode_literals from ferenda.compat import Mock from ferenda.elements.html import elements_from_soup from bs4 import BeautifulSoup doc = Mock() filedir = os.path.dirname(__file__) with open(filedir + "/../doc/examples/citationparsing-before.xhtml") as fp: doc.body = elements_from_soup(BeautifulSoup(fp.read(), "lxml").body) # begin from pyparsing import Word, nums from ferenda import CitationParser from ferenda import URIFormatter import ferenda.citationpatterns import ferenda.uriformats # Create two ParserElements for IETF document references and internal # references rfc_citation = "RFC" + Word(nums).setResultsName("RFCRef") bcp_citation = "BCP" + Word(nums).setResultsName("BCPRef") std_citation = "STD" + Word(nums).setResultsName("STDRef") ietf_doc_citation = (rfc_citation | bcp_citation | std_citation).setResultsName("IETFRef") endnote_citation = ("[" + Word(nums).setResultsName("EndnoteID") + "]").setResultsName("EndnoteRef")
# -*- coding: utf-8 -*- from __future__ import unicode_literals from ferenda.compat import Mock from ferenda.elements.html import elements_from_soup from bs4 import BeautifulSoup doc = Mock() doc.body = elements_from_soup( BeautifulSoup( """<html> <body> URLs often appear like http://example.org/foo, in running text </body> </html>""", "lxml").body) # begin from ferenda import CitationParser from ferenda import URIFormatter import ferenda.citationpatterns import ferenda.uriformats # CitationParser is initialized with a list of pyparsing # ParserElements (or any other object that has a scanString method # that returns a generator of (tokens,start,end) tuples, where start # and end are integer string indicies and tokens are dict-like # objects) citparser = CitationParser(ferenda.citationpatterns.url) # URIFormatter is initialized with a list of tuples, where each # tuple is a string (identifying a named ParseResult) and a function # (that takes as a single argument a dict-like object and returns a # URI string (possibly relative)
# -*- coding: utf-8 -*- from __future__ import unicode_literals from ferenda.compat import Mock from ferenda.elements.html import elements_from_soup from bs4 import BeautifulSoup doc = Mock() doc.body = elements_from_soup(BeautifulSoup("""<html> <body> URLs often appear like http://example.org/foo, in running text </body> </html>""").body) # begin from ferenda import CitationParser from ferenda import URIFormatter import ferenda.citationpatterns import ferenda.uriformats # CitationParser is initialized with a list of pyparsing # ParserElements (or any other object that has a scanString method # that returns a generator of (tokens,start,end) tuples, where start # and end are integer string indicies and tokens are dict-like # objects) citparser = CitationParser(ferenda.citationpatterns.url) # URIFormatter is initialized with a list of tuples, where each # tuple is a string (identifying a named ParseResult) and a function # (that takes as a single argument a dict-like object and returns a # URI string (possibly relative) citparser.set_formatter(URIFormatter(("URLRef", ferenda.uriformats.url)))
# -*- coding: utf-8 -*- from __future__ import unicode_literals from ferenda.compat import Mock from ferenda.elements.html import elements_from_soup from bs4 import BeautifulSoup doc = Mock() filedir = os.path.dirname(__file__) doc.body = elements_from_soup( BeautifulSoup( open(filedir + "/../doc/examples/citationparsing-before.xhtml").read(), "lxml").body) # begin from pyparsing import Word, nums from ferenda import CitationParser from ferenda import URIFormatter import ferenda.citationpatterns import ferenda.uriformats # Create two ParserElements for IETF document references and internal # references rfc_citation = "RFC" + Word(nums).setResultsName("RFCRef") bcp_citation = "BCP" + Word(nums).setResultsName("BCPRef") std_citation = "STD" + Word(nums).setResultsName("STDRef") ietf_doc_citation = (rfc_citation | bcp_citation | std_citation).setResultsName("IETFRef") endnote_citation = ("[" + Word(nums).setResultsName("EndnoteID") +
# -*- coding: utf-8 -*- from __future__ import unicode_literals from ferenda.compat import Mock from ferenda.elements.html import elements_from_soup from bs4 import BeautifulSoup doc = Mock() filedir = os.path.dirname(__file__) doc.body = elements_from_soup(BeautifulSoup(open(filedir+"/../doc/examples/citationparsing-before.xhtml").read()).body) # begin from pyparsing import Word, nums from ferenda import CitationParser from ferenda import URIFormatter import ferenda.citationpatterns import ferenda.uriformats # Create two ParserElements for IETF document references and internal # references rfc_citation = "RFC" + Word(nums).setResultsName("RFCRef") bcp_citation = "BCP" + Word(nums).setResultsName("BCPRef") std_citation = "STD" + Word(nums).setResultsName("STDRef") ietf_doc_citation = (rfc_citation | bcp_citation | std_citation).setResultsName("IETFRef") endnote_citation = ("[" + Word(nums).setResultsName("EndnoteID") + "]").setResultsName("EndnoteRef") # Create a URI formatter for IETF documents (URI formatter for endnotes # is so simple that we just use a lambda function below def rfc_uri_formatter(parts):
# -*- coding: utf-8 -*- from __future__ import unicode_literals from ferenda.compat import Mock from ferenda.elements.html import elements_from_soup from bs4 import BeautifulSoup doc = Mock() filedir = os.path.dirname(__file__) with open(filedir+"/../doc/examples/citationparsing-before.xhtml") as fp: doc.body = elements_from_soup(BeautifulSoup(fp.read(), "lxml").body) # begin from pyparsing import Word, nums from ferenda import CitationParser from ferenda import URIFormatter import ferenda.citationpatterns import ferenda.uriformats # Create two ParserElements for IETF document references and internal # references rfc_citation = "RFC" + Word(nums).setResultsName("RFCRef") bcp_citation = "BCP" + Word(nums).setResultsName("BCPRef") std_citation = "STD" + Word(nums).setResultsName("STDRef") ietf_doc_citation = (rfc_citation | bcp_citation | std_citation).setResultsName("IETFRef") endnote_citation = ("[" + Word(nums).setResultsName("EndnoteID") + "]").setResultsName("EndnoteRef") # Create a URI formatter for IETF documents (URI formatter for endnotes # is so simple that we just use a lambda function below