@@ -181,7 +181,109 @@ def test_specification_with_default():
181181 assert specification is Specification .OPAQUE
182182
183183
184- # FIXME: These two also ideally should live in the referencing suite.
184+ # FIXME: The tests below should move to the referencing suite but I haven't yet
185+ # figured out how to represent dynamic (& recursive) ref lookups in it.
186+ def test_lookup_trivial_dynamic_ref ():
187+ one = referencing .jsonschema .DRAFT202012 .create_resource (
188+ {"$dynamicAnchor" : "foo" },
189+ )
190+ resolver = Registry ().with_resource ("http://example.com" , one ).resolver ()
191+ resolved = resolver .lookup ("http://example.com#foo" )
192+ assert resolved .contents == one .contents
193+
194+
195+ def test_multiple_lookup_trivial_dynamic_ref ():
196+ TRUE = referencing .jsonschema .DRAFT202012 .create_resource (True )
197+ root = referencing .jsonschema .DRAFT202012 .create_resource (
198+ {
199+ "$id" : "http://example.com" ,
200+ "$dynamicAnchor" : "fooAnchor" ,
201+ "$defs" : {
202+ "foo" : {
203+ "$id" : "foo" ,
204+ "$dynamicAnchor" : "fooAnchor" ,
205+ "$defs" : {
206+ "bar" : True ,
207+ "baz" : {
208+ "$dynamicAnchor" : "fooAnchor" ,
209+ },
210+ },
211+ },
212+ },
213+ },
214+ )
215+ resolver = (
216+ Registry ()
217+ .with_resources (
218+ [
219+ ("http://example.com" , root ),
220+ ("http://example.com/foo/" , TRUE ),
221+ ("http://example.com/foo/bar" , root ),
222+ ],
223+ )
224+ .resolver ()
225+ )
226+
227+ first = resolver .lookup ("http://example.com" )
228+ second = first .resolver .lookup ("foo/" )
229+ resolver = second .resolver .lookup ("bar" ).resolver
230+ fourth = resolver .lookup ("#fooAnchor" )
231+ assert fourth .contents == root .contents
232+
233+
234+ def test_multiple_lookup_dynamic_ref_to_nondynamic_ref ():
235+ one = referencing .jsonschema .DRAFT202012 .create_resource (
236+ {"$anchor" : "fooAnchor" },
237+ )
238+ two = referencing .jsonschema .DRAFT202012 .create_resource (
239+ {
240+ "$id" : "http://example.com" ,
241+ "$dynamicAnchor" : "fooAnchor" ,
242+ "$defs" : {
243+ "foo" : {
244+ "$id" : "foo" ,
245+ "$dynamicAnchor" : "fooAnchor" ,
246+ "$defs" : {
247+ "bar" : True ,
248+ "baz" : {
249+ "$dynamicAnchor" : "fooAnchor" ,
250+ },
251+ },
252+ },
253+ },
254+ },
255+ )
256+ resolver = (
257+ Registry ()
258+ .with_resources (
259+ [
260+ ("http://example.com" , two ),
261+ ("http://example.com/foo/" , one ),
262+ ("http://example.com/foo/bar" , two ),
263+ ],
264+ )
265+ .resolver ()
266+ )
267+
268+ first = resolver .lookup ("http://example.com" )
269+ second = first .resolver .lookup ("foo/" )
270+ resolver = second .resolver .lookup ("bar" ).resolver
271+ fourth = resolver .lookup ("#fooAnchor" )
272+ assert fourth .contents == two .contents
273+
274+
275+ def test_lookup_trivial_recursive_ref ():
276+ one = referencing .jsonschema .DRAFT201909 .create_resource (
277+ {"$recursiveAnchor" : True },
278+ )
279+ resolver = Registry ().with_resource ("http://example.com" , one ).resolver ()
280+ first = resolver .lookup ("http://example.com" )
281+ resolved = referencing .jsonschema .lookup_recursive_ref (
282+ resolver = first .resolver ,
283+ )
284+ assert resolved .contents == one .contents
285+
286+
185287def test_lookup_recursive_ref_to_bool ():
186288 TRUE = referencing .jsonschema .DRAFT201909 .create_resource (True )
187289 registry = Registry ({"http://example.com" : TRUE })
@@ -229,3 +331,48 @@ def test_multiple_lookup_recursive_ref_to_bool():
229331 resolver = second .resolver .lookup ("bar" ).resolver
230332 fourth = referencing .jsonschema .lookup_recursive_ref (resolver = resolver )
231333 assert fourth .contents == root .contents
334+
335+
336+ def test_multiple_lookup_recursive_ref_with_nonrecursive_ref ():
337+ one = referencing .jsonschema .DRAFT201909 .create_resource (
338+ {"$recursiveAnchor" : True },
339+ )
340+ two = referencing .jsonschema .DRAFT201909 .create_resource (
341+ {
342+ "$id" : "http://example.com" ,
343+ "$recursiveAnchor" : True ,
344+ "$defs" : {
345+ "foo" : {
346+ "$id" : "foo" ,
347+ "$recursiveAnchor" : True ,
348+ "$defs" : {
349+ "bar" : True ,
350+ "baz" : {
351+ "$recursiveAnchor" : True ,
352+ "$anchor" : "fooAnchor" ,
353+ },
354+ },
355+ },
356+ },
357+ },
358+ )
359+ three = referencing .jsonschema .DRAFT201909 .create_resource (
360+ {"$recursiveAnchor" : False },
361+ )
362+ resolver = (
363+ Registry ()
364+ .with_resources (
365+ [
366+ ("http://example.com" , three ),
367+ ("http://example.com/foo/" , two ),
368+ ("http://example.com/foo/bar" , one ),
369+ ],
370+ )
371+ .resolver ()
372+ )
373+
374+ first = resolver .lookup ("http://example.com" )
375+ second = first .resolver .lookup ("foo/" )
376+ resolver = second .resolver .lookup ("bar" ).resolver
377+ fourth = referencing .jsonschema .lookup_recursive_ref (resolver = resolver )
378+ assert fourth .contents == two .contents
0 commit comments