@@ -306,6 +306,200 @@ func TestValidateRelationshipOperations(t *testing.T) {
306306 core .RelationTupleUpdate_CREATE ,
307307 "subjects of type `user with somecaveat and expiration` are not allowed on relation `resource#viewer`" ,
308308 },
309+ {
310+ "deprecation relation test" ,
311+ `use deprecation
312+ definition testuser {}
313+ definition user {}
314+
315+ definition document {
316+ @deprecated(error,"deprecated, migrate away")
317+ relation editor: testuser
318+ relation viewer: user
319+ }` ,
320+ "document:foo#editor@testuser:tom" ,
321+ core .RelationTupleUpdate_CREATE ,
322+ "relation document#editor is deprecated: deprecated, migrate away" ,
323+ },
324+ {
325+ "deprecated namespace test" ,
326+ `use deprecation
327+ @deprecated(error, "deprecated, migrate away")
328+ definition testuser {}
329+ definition user {}
330+
331+ definition document {
332+ relation editor: testuser
333+ }` ,
334+ "document:foo#editor@testuser:tom" ,
335+ core .RelationTupleUpdate_CREATE ,
336+ "object type testuser is deprecated: deprecated, migrate away" ,
337+ },
338+ {
339+ "deprecated relation subject type" ,
340+ `use deprecation
341+ definition user {}
342+ definition testuser {}
343+
344+ definition platform {
345+ relation viewer: user | @deprecated(warn, "comments") testuser
346+ relation auditor: user | @deprecated(error, "test") testuser
347+ }` ,
348+ "platform:foo#auditor@testuser:test" ,
349+ core .RelationTupleUpdate_CREATE ,
350+ "object type testuser is deprecated: test" ,
351+ },
352+ {
353+ "deprecated relation same subject type with wildcard" ,
354+ `use deprecation
355+ definition user {}
356+ definition testuser {}
357+
358+ definition platform {
359+ relation viewer: user | @deprecated(warn, "comments") testuser
360+ relation auditor: testuser | @deprecated(error, "no wildcard please") testuser:*
361+ }` ,
362+ "platform:foo#auditor@testuser:*" ,
363+ core .RelationTupleUpdate_CREATE ,
364+ "wildcard allowed type testuser:* is deprecated: no wildcard please" ,
365+ },
366+ {
367+ "deprecated subject without expiration when expiration required" ,
368+ `use expiration
369+ use deprecation
370+
371+ @deprecated(error, "do not use testuser")
372+ definition testuser {}
373+
374+ definition document {
375+ relation viewer: testuser with expiration
376+ }` ,
377+ "document:foo#viewer@testuser:tom" ,
378+ core .RelationTupleUpdate_CREATE ,
379+ "subjects of type `testuser` are not allowed on relation `document#viewer`; did you mean `testuser with expiration`?" ,
380+ },
381+ {
382+ "deprecated subject with expiration" ,
383+ `use expiration
384+ use deprecation
385+
386+ @deprecated(error, "do not use testuser")
387+ definition testuser {}
388+
389+ definition document {
390+ relation viewer: testuser with expiration
391+ }` ,
392+ "document:foo#viewer@testuser:tom[expiration:2021-01-01T00:00:00Z]" ,
393+ core .RelationTupleUpdate_CREATE ,
394+ "object type testuser is deprecated: do not use testuser" ,
395+ },
396+ {
397+ "deprecated subject with wrong caveat" ,
398+ `use deprecation
399+
400+ caveat somecaveat(somecondition int) {
401+ somecondition == 42
402+ }
403+
404+ caveat anothercaveat(somecondition int) {
405+ somecondition == 42
406+ }
407+
408+ @deprecated(error, "do not use testuser")
409+ definition testuser {}
410+
411+ definition document {
412+ relation viewer: testuser with somecaveat
413+ }` ,
414+ "document:foo#viewer@testuser:tom[anothercaveat]" ,
415+ core .RelationTupleUpdate_CREATE ,
416+ "subjects of type `testuser with anothercaveat` are not allowed on relation `document#viewer`" ,
417+ },
418+ {
419+ "deprecated subject with correct caveat" ,
420+ `use deprecation
421+
422+ caveat somecaveat(somecondition int) {
423+ somecondition == 42
424+ }
425+
426+ @deprecated(error, "do not use testuser")
427+ definition testuser {}
428+
429+ definition document {
430+ relation viewer: testuser with somecaveat
431+ }` ,
432+ "document:foo#viewer@testuser:tom[somecaveat]" ,
433+ core .RelationTupleUpdate_CREATE ,
434+ "object type testuser is deprecated: do not use testuser" ,
435+ },
436+ {
437+ "deprecated subject without caveat when required" ,
438+ `use deprecation
439+
440+ caveat somecaveat(somecondition int) {
441+ somecondition == 42
442+ }
443+
444+ @deprecated(error, "do not use testuser")
445+ definition testuser {}
446+
447+ definition document {
448+ relation viewer: testuser with somecaveat
449+ }` ,
450+ "document:foo#viewer@testuser:tom" ,
451+ core .RelationTupleUpdate_CREATE ,
452+ "subjects of type `testuser` are not allowed on relation `document#viewer` without one of the following caveats: somecaveat" ,
453+ },
454+ {
455+ "deprecated user with caveat and expiration" ,
456+ `use expiration
457+ use deprecation
458+
459+ caveat somecaveat(somecondition int) {
460+ somecondition == 42
461+ }
462+
463+ definition user {}
464+
465+ definition document {
466+ relation viewer: user | @deprecated(error, "don't use this") user with somecaveat and expiration
467+ }` ,
468+ "document:foo#viewer@user:tom[somecaveat][expiration:2021-01-01T00:00:00Z]" ,
469+ core .RelationTupleUpdate_CREATE ,
470+ "object type user with caveat `somecaveat` and expiration is deprecated: don't use this" ,
471+ },
472+ {
473+ "deprecated user with caveat only" ,
474+ `use deprecation
475+
476+ caveat somecaveat(somecondition int) {
477+ somecondition == 42
478+ }
479+
480+ definition user {}
481+
482+ definition document {
483+ relation viewer: user | @deprecated(error, "caveated access deprecated") user with somecaveat
484+ }` ,
485+ "document:foo#viewer@user:tom[somecaveat]" ,
486+ core .RelationTupleUpdate_CREATE ,
487+ "object type user with caveat `somecaveat` is deprecated: caveated access deprecated" ,
488+ },
489+ {
490+ "deprecated user with expiration only" ,
491+ `use expiration
492+ use deprecation
493+
494+ definition user {}
495+
496+ definition document {
497+ relation viewer: user | @deprecated(error, "expiring access deprecated") user with expiration
498+ }` ,
499+ "document:foo#viewer@user:tom[expiration:2021-01-01T00:00:00Z]" ,
500+ core .RelationTupleUpdate_CREATE ,
501+ "object type user with expiration is deprecated: expiring access deprecated" ,
502+ },
309503 }
310504
311505 for _ , tc := range tcs {
0 commit comments