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