Drop lots of legacy code. Support Python 3.7-3.11.
[librarian.git] / tests / test_dcparser.py
old mode 100755 (executable)
new mode 100644 (file)
index 62e664c..9e2b3ef
@@ -1,56 +1,48 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
+# This file is part of Librarian, licensed under GNU Affero GPLv3 or later.
+# Copyright © Fundacja Wolne Lektury. See NOTICE for more information.
+#
 import unittest
-
+from librarian import dcparser
 from lxml import etree
-from utils import get_file_path
-from librarian import dcparser, html, ParseError
-from utils import AutoTestMetaclass
-
-class TestDCParser(unittest.TestCase):
-    __metaclass__ = AutoTestMetaclass
-
-    TEST_DIR = 'dcparser'
-
-    def run_auto_test(self, in_data, out_data):
-        info = dcparser.BookInfo.from_string(in_data).to_dict()
-        should_be = eval(out_data)
+from os.path import splitext
+from tests.utils import get_all_fixtures
+
+
+class MetaTests(unittest.TestCase):
+    def check_dcparser(self, xml_file, result_file):
+        with open(xml_file, 'rb') as f:
+            xml = f.read()
+        with open(result_file) as f:
+            result = f.read()
+        info = dcparser.BookInfo.from_bytes(xml).to_dict()
+        should_be = eval(result)
         for key in should_be:
-            self.assertEqual( info[key], should_be[key] )
+            self.assertEqual(info[key], should_be[key])
 
-class TestDCSerialize(unittest.TestCase):
-    __metaclass__ = AutoTestMetaclass
 
-    TEST_DIR = 'dcserialize'
+    def test_dcparser(self):
+        for fixture in get_all_fixtures('dcparser', '*.xml'):
+            base_name = splitext(fixture)[0]
+            with self.subTest(name=base_name):
+                self.check_dcparser(fixture, base_name + '.out')
 
-    def run_auto_test(self, in_data, out_data):
-        import lxml.etree
-        # first parse the input
-        info = dcparser.BookInfo.from_string(in_data)
+    def check_serialize(self, xml_file):
+        with open(xml_file, 'rb') as f:
+            xml = f.read()
+        info = dcparser.BookInfo.from_bytes(xml)
 
         # serialize
-        serialized = lxml.etree.tostring(info.to_etree(), encoding=unicode).encode('utf-8')
-
+        serialized = etree.tostring(info.to_etree(), encoding='unicode').encode('utf-8')
         # then parse again
-        info_bis = dcparser.BookInfo.from_string(serialized)
+        info_bis = dcparser.BookInfo.from_bytes(serialized)
 
         # check if they are the same
         for key in vars(info):
-            self.assertEqual( getattr(info, key), getattr(info_bis, key))
-
+            self.assertEqual(getattr(info, key), getattr(info_bis, key))
         for key in vars(info_bis):
-            self.assertEqual( getattr(info, key), getattr(info_bis, key))
-
-class TestParserErrors(unittest.TestCase):
-    def test_error(self):
-        try:
-            html.transform(get_file_path('erroneous', 'asnyk_miedzy_nami.xml'),
-                           get_file_path('erroneous', 'asnyk_miedzy_nami.html'))
-            self.fail()
-        except ParseError:
-            pass
-            #self.assertEqual(e.position, (25, 13))    
-
-if __name__ == '__main__':
-    unittest.main()
+            self.assertEqual(getattr(info, key), getattr(info_bis, key))
+
+    def test_serialize(self):
+        for fixture in get_all_fixtures('dcparser', '*.xml'):
+            with self.subTest(name=fixture):
+                self.check_serialize(fixture)