예제 #1
0
class XmlEventHandlerTests(TestCase):
    def setUp(self):
        self.parser = RecordParser(handler=XmlEventHandler)
        self.fixture = fixtures_dir.joinpath("books/books.xml")

    def test_parse(self):
        self.assertEqual(books, self.parser.from_path(self.fixture, Books))
        self.assertEqual({"brk": "urn:books"}, self.parser.ns_map)
        self.assertEqual(events, self.parser.events)

    def test_parse_with_xinclude_raises_exception(self):
        self.parser.config.process_xinclude = True

        with self.assertRaises(XmlHandlerError) as cm:
            self.parser.from_path(self.fixture, Books)

        self.assertEqual("XmlEventHandler doesn't support xinclude elements.",
                         str(cm.exception))

    def test_parse_context_with_unhandled_event(self):
        context = [("reverse", None)]
        handler = XmlEventHandler(parser=self.parser, clazz=Books)

        with self.assertRaises(XmlHandlerError) as cm:
            handler.process_context(context)

        self.assertEqual("Unhandled event: `reverse`.", str(cm.exception))
예제 #2
0
class LxmlEventHandlerTests(TestCase):
    def setUp(self) -> None:
        self.parser = RecordParser(handler=LxmlEventHandler)

    def test_parse(self):
        path = fixtures_dir.joinpath("books/books.xml")
        self.assertEqual(books, self.parser.from_path(path, Books))
        self.assertEqual({"brk": "urn:books"}, self.parser.ns_map)
        self.assertEqual(events, self.parser.events)

    def test_parse_with_xinclude(self):
        path = fixtures_dir.joinpath("books/books-xinclude.xml")
        ns_map = {"brk": "urn:books", "xi": "http://www.w3.org/2001/XInclude"}

        self.parser.config.process_xinclude = True
        self.assertEqual(books, self.parser.from_path(path, Books))
        self.assertEqual(ns_map, self.parser.ns_map)

    def test_parse_with_xinclude_from_memory(self):
        path = fixtures_dir.joinpath("books/books-xinclude.xml")
        ns_map = {"brk": "urn:books", "xi": "http://www.w3.org/2001/XInclude"}

        self.parser.config.process_xinclude = True
        self.parser.config.base_url = path.as_uri()
        self.assertEqual(books, self.parser.from_bytes(path.read_bytes(), Books))
        self.assertEqual(ns_map, self.parser.ns_map)

    def test_parse_context_with_unhandled_event(self):
        handler = LxmlEventHandler(clazz=Books, parser=self.parser)

        with self.assertRaises(XmlHandlerError) as cm:
            handler.process_context([("reverse", "")])

        self.assertEqual("Unhandled event: `reverse`.", str(cm.exception))
예제 #3
0
class LxmlSaxHandlerTests(TestCase):
    def setUp(self):
        self.parser = RecordParser(handler=LxmlSaxHandler)

    def test_parse(self):
        path = fixtures_dir.joinpath("books/books.xml")
        self.assertEqual(books, self.parser.from_path(path, Books))
        self.assertEqual({"brk": "urn:books"}, self.parser.ns_map)
        self.assertEqual(events, self.parser.events)

    def test_parse_from_memory(self):
        path = fixtures_dir.joinpath("books/books.xml")
        self.assertEqual(books, self.parser.from_bytes(path.read_bytes(), Books))
        self.assertEqual({"brk": "urn:books"}, self.parser.ns_map)
        self.assertEqual(events, self.parser.events)

    def test_close_with_no_objects_returns_none(self):
        handler = LxmlSaxHandler(clazz=Books, parser=self.parser)
        self.assertIsNone(handler.close())

    @mock.patch.object(RecordParser, "end")
    def test_flush_normalizes_data_frames(self, mock_end):
        queue = []
        objects = []
        handler = LxmlSaxHandler(
            parser=self.parser, clazz=Books, queue=queue, objects=objects
        )
        handler.data_frames.append(([], []))
        handler.flush_next = "value"
        handler.flush()

        handler.data_frames.append((["a", "b"], [""]))
        handler.flush_next = "value"
        handler.flush()

        mock_end.assert_has_calls(
            [
                mock.call(queue, objects, "value", None, None),
                mock.call(queue, objects, "value", "ab", ""),
            ]
        )
        self.assertEqual(2, mock_end.call_count)

    def test_parse_with_xinclude_raises_exception(self):
        self.parser.config.process_xinclude = True

        with self.assertRaises(XmlHandlerError) as cm:
            self.parser.from_string("", Books)

        self.assertEqual(
            "LxmlSaxHandler doesn't support xinclude elements.", str(cm.exception)
        )
예제 #4
0
class EventsHandlerTests(TestCase):
    def setUp(self) -> None:
        self.parser = RecordParser(handler=EventsHandler)

    def test_parse(self):
        self.assertEqual(books, self.parser.parse(events, Books))
        self.assertEqual({"brk": "urn:books"}, self.parser.ns_map)

    def test_parse_with_unhandled_event(self):

        with self.assertRaises(XmlHandlerError) as cm:
            self.parser.parse([("reverse", "")], Books)

        self.assertEqual("Unhandled event: `reverse`.", str(cm.exception))
예제 #5
0
    def test_process(self):
        parser = RecordParser()
        handler = XmlHandler(clazz=Books, parser=parser)

        self.assertEqual([], handler.queue)
        self.assertEqual([], handler.objects)

        with self.assertRaises(NotImplementedError):
            handler.parse(None)
예제 #6
0
class SaxHandlerTests(TestCase):
    def setUp(self):
        self.parser = RecordParser(handler=XmlSaxHandler)
        self.fixture = fixtures_dir.joinpath("books/books.xml")

    def test_parse(self):
        self.assertEqual(books, self.parser.from_path(self.fixture, Books))
        self.assertEqual({"brk": "urn:books"}, self.parser.ns_map)
        self.assertEqual(events, self.parser.events)

    @mock.patch.object(RecordParser, "end")
    @mock.patch.object(RecordParser, "start")
    def test_parse_returns_none_if_objects_empty(self, mock_start, mock_end):
        handler = XmlSaxHandler(parser=self.parser, clazz=Books)
        self.assertIsNone(handler.parse(self.fixture.as_uri()))

    def test_parse_with_xinclude_raises_exception(self):
        self.parser.config.process_xinclude = True

        with self.assertRaises(XmlHandlerError) as cm:
            self.parser.from_path(self.fixture, Books)

        self.assertEqual("XmlSaxHandler doesn't support xinclude elements.",
                         str(cm.exception))
예제 #7
0
 def setUp(self):
     self.parser = RecordParser(handler=XmlSaxHandler)
     self.fixture = fixtures_dir.joinpath("books/books.xml")
예제 #8
0
 def setUp(self) -> None:
     self.parser = RecordParser(handler=EventsHandler)
예제 #9
0
 def setUp(self):
     self.parser = RecordParser(handler=LxmlSaxHandler)
예제 #10
0
 def setUp(self) -> None:
     self.parser = RecordParser(handler=LxmlEventHandler)