Mercurial > hgrepos > Python > libs > data-schema
comparison tests/test_schema.py @ 29:68286d27f27d
FIX: Allow customization of the data stream loader (get_data_stream())
| author | Franz Glasner <fzglas.hg@dom66.de> |
|---|---|
| date | Sat, 08 Jul 2023 16:10:36 +0200 |
| parents | db3491e1b590 |
| children | 2e7c08c356ee |
comparison
equal
deleted
inserted
replaced
| 28:db3491e1b590 | 29:68286d27f27d |
|---|---|
| 1 | 1 |
| 2 import copy | 2 import copy |
| 3 import datetime | 3 import datetime |
| 4 import functools | |
| 4 import re | 5 import re |
| 5 import unittest | 6 import unittest |
| 6 | 7 |
| 7 import _config | 8 import _config |
| 8 | 9 |
| 139 def test_root_context(self): | 140 def test_root_context(self): |
| 140 obj = object() | 141 obj = object() |
| 141 schema = object() | 142 schema = object() |
| 142 settings = data_schema.ValidationSettings( | 143 settings = data_schema.ValidationSettings( |
| 143 skip_keys=[], break_on_keynames_problems=True, | 144 skip_keys=[], break_on_keynames_problems=True, |
| 145 data_stream_loader=None, | |
| 144 schema_loader=data_schema.default_schema_loader) | 146 schema_loader=data_schema.default_schema_loader) |
| 145 ctx = data_schema.Context( | 147 ctx = data_schema.Context( |
| 146 None, root_object=obj, root_schema=schema, settings=settings) | 148 None, root_object=obj, root_schema=schema, settings=settings) |
| 147 self.assertEqual("<ROOT>", str(ctx)) | 149 self.assertEqual("<ROOT>", str(ctx)) |
| 148 self.assertTrue(ctx.root_object is obj) | 150 self.assertTrue(ctx.root_object is obj) |
| 152 def test_parent_of_root_context(self): | 154 def test_parent_of_root_context(self): |
| 153 obj = object() | 155 obj = object() |
| 154 schema = object() | 156 schema = object() |
| 155 settings = data_schema.ValidationSettings( | 157 settings = data_schema.ValidationSettings( |
| 156 skip_keys=[], break_on_keynames_problems=True, | 158 skip_keys=[], break_on_keynames_problems=True, |
| 159 data_stream_loader=None, | |
| 157 schema_loader=data_schema.default_schema_loader) | 160 schema_loader=data_schema.default_schema_loader) |
| 158 ctx = data_schema.Context( | 161 ctx = data_schema.Context( |
| 159 None, root_object=obj, root_schema=schema, settings=settings) | 162 None, root_object=obj, root_schema=schema, settings=settings) |
| 160 self.assertTrue(ctx.is_root) | 163 self.assertTrue(ctx.is_root) |
| 161 self.assertIsNone(ctx.parent) | 164 self.assertIsNone(ctx.parent) |
| 168 "Context.safe_parent was expected to raise for a root context") | 171 "Context.safe_parent was expected to raise for a root context") |
| 169 | 172 |
| 170 def test_root_context_init_root_empty(self): | 173 def test_root_context_init_root_empty(self): |
| 171 settings = data_schema.ValidationSettings( | 174 settings = data_schema.ValidationSettings( |
| 172 skip_keys=[], break_on_keynames_problems=True, | 175 skip_keys=[], break_on_keynames_problems=True, |
| 176 data_stream_loader=None, | |
| 173 schema_loader=data_schema.default_schema_loader) | 177 schema_loader=data_schema.default_schema_loader) |
| 174 self.assertRaises( | 178 self.assertRaises( |
| 175 TypeError, | 179 TypeError, |
| 176 data_schema.Context, None, key="key", settings=settings) | 180 data_schema.Context, None, key="key", settings=settings) |
| 177 self.assertRaises( | 181 self.assertRaises( |
| 179 data_schema.Context, None, index="key", settings=settings) | 183 data_schema.Context, None, index="key", settings=settings) |
| 180 | 184 |
| 181 def test_root_context_init_only_one_of_key_index(self): | 185 def test_root_context_init_only_one_of_key_index(self): |
| 182 settings = data_schema.ValidationSettings( | 186 settings = data_schema.ValidationSettings( |
| 183 skip_keys=[], break_on_keynames_problems=True, | 187 skip_keys=[], break_on_keynames_problems=True, |
| 188 data_stream_loader=None, | |
| 184 schema_loader=data_schema.default_schema_loader) | 189 schema_loader=data_schema.default_schema_loader) |
| 185 root = data_schema.Context(None, settings=settings) | 190 root = data_schema.Context(None, settings=settings) |
| 186 self.assertRaises( | 191 self.assertRaises( |
| 187 ValueError, | 192 ValueError, |
| 188 data_schema.Context, root, key="key", index="index") | 193 data_schema.Context, root, key="key", index="index") |
| 189 | 194 |
| 190 def test_root_context_init_exactly_one(self): | 195 def test_root_context_init_exactly_one(self): |
| 191 settings = data_schema.ValidationSettings( | 196 settings = data_schema.ValidationSettings( |
| 192 skip_keys=[], break_on_keynames_problems=True, | 197 skip_keys=[], break_on_keynames_problems=True, |
| 198 data_stream_loader=None, | |
| 193 schema_loader=data_schema.default_schema_loader) | 199 schema_loader=data_schema.default_schema_loader) |
| 194 root = data_schema.Context(None, settings=settings) | 200 root = data_schema.Context(None, settings=settings) |
| 195 self.assertRaises(TypeError, data_schema.Context, root) | 201 self.assertRaises(TypeError, data_schema.Context, root) |
| 196 | 202 |
| 197 def test_nonroot_rootobj_schema(self): | 203 def test_nonroot_rootobj_schema(self): |
| 198 settings = data_schema.ValidationSettings( | 204 settings = data_schema.ValidationSettings( |
| 199 skip_keys=[], break_on_keynames_problems=True, | 205 skip_keys=[], break_on_keynames_problems=True, |
| 206 data_stream_loader=None, | |
| 200 schema_loader=data_schema.default_schema_loader) | 207 schema_loader=data_schema.default_schema_loader) |
| 201 obj = object() | 208 obj = object() |
| 202 schema = object() | 209 schema = object() |
| 203 ctx = data_schema.Context( | 210 ctx = data_schema.Context( |
| 204 None, root_object=obj, root_schema=schema, settings=settings) | 211 None, root_object=obj, root_schema=schema, settings=settings) |
| 212 root_schema=object()) | 219 root_schema=object()) |
| 213 | 220 |
| 214 def test_str(self): | 221 def test_str(self): |
| 215 settings = data_schema.ValidationSettings( | 222 settings = data_schema.ValidationSettings( |
| 216 skip_keys=[], break_on_keynames_problems=True, | 223 skip_keys=[], break_on_keynames_problems=True, |
| 224 data_stream_loader=None, | |
| 217 schema_loader=data_schema.default_schema_loader) | 225 schema_loader=data_schema.default_schema_loader) |
| 218 root = data_schema.Context(None, settings=settings) | 226 root = data_schema.Context(None, settings=settings) |
| 219 ctx1 = data_schema.Context(root, key="key1") | 227 ctx1 = data_schema.Context(root, key="key1") |
| 220 ctx2 = data_schema.Context(ctx1, index=2) | 228 ctx2 = data_schema.Context(ctx1, index=2) |
| 221 ctx3 = data_schema.Context(ctx2, key="key3") | 229 ctx3 = data_schema.Context(ctx2, key="key3") |
| 222 self.assertEqual("key1 / INDEX:2 / key3", str(ctx3)) | 230 self.assertEqual("key1 / INDEX:2 / key3", str(ctx3)) |
| 223 | 231 |
| 224 def test_repr(self): | 232 def test_repr(self): |
| 225 settings = data_schema.ValidationSettings( | 233 settings = data_schema.ValidationSettings( |
| 226 skip_keys=[], break_on_keynames_problems=True, | 234 skip_keys=[], break_on_keynames_problems=True, |
| 235 data_stream_loader=None, | |
| 227 schema_loader=data_schema.default_schema_loader) | 236 schema_loader=data_schema.default_schema_loader) |
| 228 root = data_schema.Context(None, settings=settings) | 237 root = data_schema.Context(None, settings=settings) |
| 229 ctx1 = data_schema.Context(root, key="key1") | 238 ctx1 = data_schema.Context(root, key="key1") |
| 230 ctx2 = data_schema.Context(ctx1, index=2) | 239 ctx2 = data_schema.Context(ctx1, index=2) |
| 231 ctx3 = data_schema.Context(ctx2, key="key3") | 240 ctx3 = data_schema.Context(ctx2, key="key3") |
| 232 self.assertEqual("<Context path=`key1 / INDEX:2 / key3'>", repr(ctx3)) | 241 self.assertEqual("<Context path=`key1 / INDEX:2 / key3'>", repr(ctx3)) |
| 233 | 242 |
| 234 def test_root(self): | 243 def test_root(self): |
| 235 settings = data_schema.ValidationSettings( | 244 settings = data_schema.ValidationSettings( |
| 236 skip_keys=[], break_on_keynames_problems=True, | 245 skip_keys=[], break_on_keynames_problems=True, |
| 246 data_stream_loader=None, | |
| 237 schema_loader=data_schema.default_schema_loader) | 247 schema_loader=data_schema.default_schema_loader) |
| 238 root = data_schema.Context(None, settings=settings) | 248 root = data_schema.Context(None, settings=settings) |
| 239 self.assertTrue(root.is_root) | 249 self.assertTrue(root.is_root) |
| 240 self.assertTrue(root is root.root) | 250 self.assertTrue(root is root.root) |
| 241 self.assertTrue(root.settings is settings) | 251 self.assertTrue(root.settings is settings) |
| 252 self.assertTrue(ctx3.settings is settings) | 262 self.assertTrue(ctx3.settings is settings) |
| 253 | 263 |
| 254 def test_extra_settings_in_between(self): | 264 def test_extra_settings_in_between(self): |
| 255 settings = data_schema.ValidationSettings( | 265 settings = data_schema.ValidationSettings( |
| 256 skip_keys=[], break_on_keynames_problems=True, | 266 skip_keys=[], break_on_keynames_problems=True, |
| 267 data_stream_loader=None, | |
| 257 schema_loader=data_schema.default_schema_loader) | 268 schema_loader=data_schema.default_schema_loader) |
| 258 settings2 = data_schema.ValidationSettings( | 269 settings2 = data_schema.ValidationSettings( |
| 259 skip_keys=[], break_on_keynames_problems=True, | 270 skip_keys=[], break_on_keynames_problems=True, |
| 271 data_stream_loader=None, | |
| 260 schema_loader=data_schema.default_schema_loader) | 272 schema_loader=data_schema.default_schema_loader) |
| 261 root = data_schema.Context(None, settings=settings) | 273 root = data_schema.Context(None, settings=settings) |
| 262 self.assertTrue(root.is_root) | 274 self.assertTrue(root.is_root) |
| 263 self.assertTrue(root is root.root) | 275 self.assertTrue(root is root.root) |
| 264 self.assertTrue(root.settings is settings) | 276 self.assertTrue(root.settings is settings) |
| 275 self.assertTrue(ctx3.settings is settings2) | 287 self.assertTrue(ctx3.settings is settings2) |
| 276 | 288 |
| 277 def test_key_xor_index(self): | 289 def test_key_xor_index(self): |
| 278 settings = data_schema.ValidationSettings( | 290 settings = data_schema.ValidationSettings( |
| 279 skip_keys=[], break_on_keynames_problems=True, | 291 skip_keys=[], break_on_keynames_problems=True, |
| 292 data_stream_loader=None, | |
| 280 schema_loader=data_schema.default_schema_loader) | 293 schema_loader=data_schema.default_schema_loader) |
| 281 root = data_schema.Context(None, settings=settings) | 294 root = data_schema.Context(None, settings=settings) |
| 282 self.assertRaises( | 295 self.assertRaises( |
| 283 ValueError, | 296 ValueError, |
| 284 data_schema.Context, | 297 data_schema.Context, |
| 287 key="huhu") | 300 key="huhu") |
| 288 | 301 |
| 289 def test_keyindex_requires_key(self): | 302 def test_keyindex_requires_key(self): |
| 290 settings = data_schema.ValidationSettings( | 303 settings = data_schema.ValidationSettings( |
| 291 skip_keys=[], break_on_keynames_problems=True, | 304 skip_keys=[], break_on_keynames_problems=True, |
| 305 data_stream_loader=None, | |
| 292 schema_loader=data_schema.default_schema_loader) | 306 schema_loader=data_schema.default_schema_loader) |
| 293 self.assertRaises( | 307 self.assertRaises( |
| 294 ValueError, | 308 ValueError, |
| 295 data_schema.Context, | 309 data_schema.Context, |
| 296 None, | 310 None, |
| 1248 self._ctx) | 1262 self._ctx) |
| 1249 | 1263 |
| 1250 def test_raise_no_schema_loader_available(self): | 1264 def test_raise_no_schema_loader_available(self): |
| 1251 settings = data_schema.ValidationSettings( | 1265 settings = data_schema.ValidationSettings( |
| 1252 skip_keys=[], break_on_keynames_problems=True, | 1266 skip_keys=[], break_on_keynames_problems=True, |
| 1267 data_stream_loader=None, | |
| 1253 schema_loader=None) | 1268 schema_loader=None) |
| 1254 schema = data_schema._Schema( | 1269 schema = data_schema._Schema( |
| 1255 None, True, {"$ref": "schema:file:/tmp/xxx#/"}) | 1270 None, True, {"$ref": "schema:file:/tmp/xxx#/"}) |
| 1256 ctx = data_schema.Context( | 1271 ctx = data_schema.Context( |
| 1257 None, root_schema=schema, settings=settings) | 1272 None, root_schema=schema, settings=settings) |
| 1262 ctx) | 1277 ctx) |
| 1263 | 1278 |
| 1264 def test_raise_schema_loader_available_but_invalid_basedir(self): | 1279 def test_raise_schema_loader_available_but_invalid_basedir(self): |
| 1265 settings = data_schema.ValidationSettings( | 1280 settings = data_schema.ValidationSettings( |
| 1266 skip_keys=[], break_on_keynames_problems=True, | 1281 skip_keys=[], break_on_keynames_problems=True, |
| 1282 data_stream_loader=None, | |
| 1267 schema_loader=data_schema.default_schema_loader) | 1283 schema_loader=data_schema.default_schema_loader) |
| 1268 schema = data_schema._Schema( | 1284 schema = data_schema._Schema( |
| 1269 None, True, {"$ref": "schema:file:/tmp/xxx#/"}) | 1285 None, True, { |
| 1286 "$ref": "schema:" + _config.FILEURI_PREFIX + "test1.schema.yml#/" | |
| 1287 }) | |
| 1270 ctx = data_schema.Context( | 1288 ctx = data_schema.Context( |
| 1271 None, root_schema=schema, settings=settings) | 1289 None, root_schema=schema, settings=settings) |
| 1272 self.assertRaises( | 1290 self.assertRaises( |
| 1273 TypeError, # no basedir given | 1291 TypeError, # no basedir given |
| 1274 data_schema.process_schema_references, | 1292 data_schema.process_schema_references, |
| 1275 schema, | 1293 schema, |
| 1276 ctx) | 1294 ctx) |
| 1295 | |
| 1296 def test_schema_loader_and_data_stream_available_file(self): | |
| 1297 dsl = functools.partial( | |
| 1298 data_schema.util.get_data_stream, | |
| 1299 basedir=_config.PROJECTDIR) | |
| 1300 settings = data_schema.ValidationSettings( | |
| 1301 skip_keys=[], break_on_keynames_problems=True, | |
| 1302 data_stream_loader=dsl, | |
| 1303 schema_loader=data_schema.default_schema_loader) | |
| 1304 schema = data_schema._Schema( | |
| 1305 None, True, { | |
| 1306 "$ref": "schema:" + _config.FILEURI_PREFIX + "test1.schema.yml#/" | |
| 1307 }) | |
| 1308 ctx = data_schema.Context( | |
| 1309 None, root_schema=schema, settings=settings) | |
| 1310 data_schema.process_schema_references(schema, ctx) | |
| 1311 | |
| 1312 def test_schema_loader_and_data_stream_available_package_explicit_subdir(self): | |
| 1313 dsl = functools.partial( | |
| 1314 data_schema.util.get_data_stream, | |
| 1315 basedir=_config.PROJECTDIR, | |
| 1316 packagesubdir=None) | |
| 1317 settings = data_schema.ValidationSettings( | |
| 1318 skip_keys=[], break_on_keynames_problems=True, | |
| 1319 data_stream_loader=dsl, | |
| 1320 schema_loader=data_schema.default_schema_loader) | |
| 1321 schema = data_schema._Schema( | |
| 1322 None, True, { | |
| 1323 "$ref": "schema:data:testschematalib.packagedata:test2.schema.yml#/" | |
| 1324 }) | |
| 1325 ctx = data_schema.Context( | |
| 1326 None, root_schema=schema, settings=settings) | |
| 1327 data_schema.process_schema_references(schema, ctx) | |
| 1328 | |
| 1329 def test_schema_loader_and_data_stream_available_package_implicit_subdir(self): | |
| 1330 dsl = functools.partial( | |
| 1331 data_schema.util.get_data_stream, | |
| 1332 basedir=_config.PROJECTDIR) | |
| 1333 settings = data_schema.ValidationSettings( | |
| 1334 skip_keys=[], break_on_keynames_problems=True, | |
| 1335 data_stream_loader=dsl, | |
| 1336 schema_loader=data_schema.default_schema_loader) | |
| 1337 schema = data_schema._Schema( | |
| 1338 None, True, { | |
| 1339 "$ref": "schema:data:testschematalib:test2.schema.yml#/" | |
| 1340 }) | |
| 1341 ctx = data_schema.Context( | |
| 1342 None, root_schema=schema, settings=settings) | |
| 1343 data_schema.process_schema_references(schema, ctx) | |
| 1277 | 1344 |
| 1278 def test_raise_if_scheme_ref_is_not_the_single_key(self): | 1345 def test_raise_if_scheme_ref_is_not_the_single_key(self): |
| 1279 schema = data_schema._Schema( | 1346 schema = data_schema._Schema( |
| 1280 None, True, {"$ref": "schema:#/", | 1347 None, True, {"$ref": "schema:#/", |
| 1281 "type": None | 1348 "type": None |
