diff tests/test_schema.py @ 46:92ae1e882cef

Enhance pickling support
author Franz Glasner <f.glasner@feldmann-mg.com>
date Wed, 02 Aug 2023 16:51:34 +0200
parents ea8c2d01a9d9
children 6b8fcd0d2175
line wrap: on
line diff
--- a/tests/test_schema.py	Wed Aug 02 13:58:25 2023 +0200
+++ b/tests/test_schema.py	Wed Aug 02 16:51:34 2023 +0200
@@ -25,6 +25,12 @@
 
 class Pickling(unittest.TestCase):
 
+    def test_sentinel_singleinst(self):
+        s = data_schema._SENTINEL
+        s2 = pickle.loads(pickle.dumps(s))
+        self.assertIs(s, s2)
+        self.assertIs(s2, s)
+
     def test_severity(self):
         for sev in SEVERITY:
             b = pickle.dumps(sev)
@@ -112,6 +118,12 @@
         self.assertEqual(0, len(schema))
         self.assertFalse(schema)
 
+    def test_root_creation_pickle(self):
+        schema = data_schema._Schema(None, True)
+        self.assertIsInstance(schema, dict)
+        schema2 = pickle.loads(pickle.dumps(schema))
+        self.assertEqual(schema, schema2)
+
     def test_root_creation_wrong(self):
         self.assertRaises(
             ValueError,
@@ -126,6 +138,14 @@
         self.assertTrue(schema.is_sub_root)
         self.assertIs(schema, schema.SELF)
 
+    def test_root_properties_pickle(self):
+        schema = data_schema._Schema(None, True)
+        schema2 = pickle.loads(pickle.dumps(schema))
+        self.assertIsNone(schema2.parent)
+        self.assertIs(schema2, schema2.ROOT)
+        self.assertTrue(schema2.is_sub_root)
+        self.assertIs(schema2, schema2.SELF)
+
     def test_dict_len_bool(self):
         schema = data_schema._Schema(None, True, a=1, b=2)
         self.assertTrue(schema)
@@ -137,6 +157,15 @@
         self.assertEqual(schema1, schema2)
         self.assertIsNot(schema1, schema2)
 
+    def test_pickle(self):
+        schema1 = data_schema._Schema(None, True, a=1, b=2)
+        schema2 = pickle.loads(pickle.dumps(schema1))
+        self.assertEqual(schema1, schema2)
+        self.assertIsNot(schema1, schema2)
+        self.assertEqual(2, len(schema2))
+        self.assertEqual(1, schema2["a"])
+        self.assertEqual(2, schema2["b"])
+
     def test_copy(self):
         schema = data_schema._Schema(None, True, type="str")
         schema2 = schema.copy()
@@ -200,6 +229,22 @@
         self.assertTrue(ctx.root_schema is schema)
         self.assertTrue(ctx.settings is settings)
 
+    def test_root_context_pickle(self):
+        obj = object()
+        schema = object()
+        settings = data_schema.ValidationSettings(
+            skip_keys=[], break_on_keynames_problems=True,
+            data_stream_loader=None,
+            schema_loader=data_schema.default_schema_loader)
+        ctx = data_schema.Context(
+            None, root_object=obj, root_schema=schema, settings=settings)
+        self.assertEqual("<ROOT>", str(ctx))
+        self.assertTrue(ctx.root_object is obj)
+        self.assertTrue(ctx.root_schema is schema)
+        self.assertTrue(ctx.settings is settings)
+        ctx2 = pickle.loads(pickle.dumps(ctx))
+        self.assertEqual(ctx, ctx2)
+
     def test_parent_of_root_context(self):
         obj = object()
         schema = object()
@@ -289,6 +334,22 @@
         ctx3 = data_schema.Context(ctx2, key="key3")
         self.assertEqual("<Context path=`key1 / INDEX:2 / key3'>", repr(ctx3))
 
+    def test_repr_pickle(self):
+        settings = data_schema.ValidationSettings(
+            skip_keys=[], break_on_keynames_problems=True,
+            data_stream_loader=None,
+            schema_loader=data_schema.default_schema_loader)
+        root = data_schema.Context(None, settings=settings)
+        ctx1 = data_schema.Context(root, key="key1")
+        ctx2 = data_schema.Context(ctx1, index=2)
+        ctx3 = data_schema.Context(ctx2, key="key3")
+
+        ctx3_2 = pickle.loads(pickle.dumps(ctx3))
+
+        self.assertEqual(ctx3, ctx3_2)
+        self.assertEqual(repr(ctx3), repr(ctx3_2))
+        self.assertEqual("<Context path=`key1 / INDEX:2 / key3'>", repr(ctx3_2))
+
     def test_root(self):
         settings = data_schema.ValidationSettings(
             skip_keys=[], break_on_keynames_problems=True,