@@ -3060,6 +3060,149 @@ var _ = Describe("lookup-entity-engine", func() {
30603060 })
30613061 })
30623062
3063+ PropagationAcrossEntitiesEntityFilter := `
3064+ entity user {}
3065+
3066+ entity aaa {
3067+ relation role__admin @user
3068+ permission ccc__read = role__admin
3069+ }
3070+
3071+ entity bbb {
3072+ relation resource__aaa @aaa
3073+ relation role__admin @user
3074+ attribute attr__is_public boolean
3075+ permission ccc__read = role__admin or attr__is_public
3076+
3077+ }
3078+
3079+ entity ccc {
3080+ relation resource__aaa @aaa
3081+ relation resource__bbb @bbb
3082+ permission ccc__read = resource__aaa.ccc__read or resource__bbb.ccc__read
3083+ }`
3084+
3085+ Context ("Propagation Across Entities: Entity Filter" , func () {
3086+ It ("Drive Sample: Case 1" , func () {
3087+ db , err := factories .DatabaseFactory (
3088+ config.Database {
3089+ Engine : "memory" ,
3090+ },
3091+ )
3092+
3093+ Expect (err ).ShouldNot (HaveOccurred ())
3094+
3095+ conf , err := newSchema (PropagationAcrossEntitiesEntityFilter )
3096+ Expect (err ).ShouldNot (HaveOccurred ())
3097+
3098+ schemaWriter := factories .SchemaWriterFactory (db )
3099+ err = schemaWriter .WriteSchema (context .Background (), conf )
3100+
3101+ Expect (err ).ShouldNot (HaveOccurred ())
3102+
3103+ type filter struct {
3104+ entityType string
3105+ subject string
3106+ assertions map [string ][]string
3107+ }
3108+
3109+ tests := struct {
3110+ relationships []string
3111+ attributes []string
3112+ filters []filter
3113+ }{
3114+ relationships : []string {
3115+ "aaa:a1#role__admin@user:u1" ,
3116+ "bbb:b1#resource__aaa@aaa:a1" ,
3117+ "ccc:c1#resource__aaa@aaa:a1" ,
3118+ "ccc:c1#resource__bbb@bbb:b1" ,
3119+ },
3120+ attributes : []string {
3121+ "bbb:b1$attr__is_public|boolean:true" ,
3122+ },
3123+ filters : []filter {
3124+ {
3125+ entityType : "ccc" ,
3126+ subject : "user:u1" ,
3127+ assertions : map [string ][]string {
3128+ "ccc__read" : {"c1" },
3129+ },
3130+ },
3131+ },
3132+ }
3133+
3134+ schemaReader := factories .SchemaReaderFactory (db )
3135+ dataReader := factories .DataReaderFactory (db )
3136+ dataWriter := factories .DataWriterFactory (db )
3137+
3138+ checkEngine := NewCheckEngine (schemaReader , dataReader )
3139+
3140+ lookupEngine := NewLookupEngine (
3141+ checkEngine ,
3142+ schemaReader ,
3143+ dataReader ,
3144+ )
3145+
3146+ invoker := invoke .NewDirectInvoker (
3147+ schemaReader ,
3148+ dataReader ,
3149+ checkEngine ,
3150+ nil ,
3151+ lookupEngine ,
3152+ nil ,
3153+ )
3154+
3155+ checkEngine .SetInvoker (invoker )
3156+
3157+ var tuples []* base.Tuple
3158+
3159+ for _ , relationship := range tests .relationships {
3160+ t , err := tuple .Tuple (relationship )
3161+ Expect (err ).ShouldNot (HaveOccurred ())
3162+ tuples = append (tuples , t )
3163+ }
3164+
3165+ var attributes []* base.Attribute
3166+
3167+ for _ , attr := range tests .attributes {
3168+ a , err := attribute .Attribute (attr )
3169+ Expect (err ).ShouldNot (HaveOccurred ())
3170+ attributes = append (attributes , a )
3171+ }
3172+
3173+ _ , err = dataWriter .Write (context .Background (), "t1" , database .NewTupleCollection (tuples ... ), database .NewAttributeCollection (attributes ... ))
3174+ Expect (err ).ShouldNot (HaveOccurred ())
3175+
3176+ for _ , filter := range tests .filters {
3177+ ear , err := tuple .EAR (filter .subject )
3178+ Expect (err ).ShouldNot (HaveOccurred ())
3179+
3180+ subject := & base.Subject {
3181+ Type : ear .GetEntity ().GetType (),
3182+ Id : ear .GetEntity ().GetId (),
3183+ Relation : ear .GetRelation (),
3184+ }
3185+
3186+ for permission , res := range filter .assertions {
3187+ response , err := invoker .LookupEntity (context .Background (), & base.PermissionLookupEntityRequest {
3188+ TenantId : "t1" ,
3189+ EntityType : filter .entityType ,
3190+ Subject : subject ,
3191+ Permission : permission ,
3192+ Metadata : & base.PermissionLookupEntityRequestMetadata {
3193+ SnapToken : token .NewNoopToken ().Encode ().String (),
3194+ SchemaVersion : "" ,
3195+ Depth : 100 ,
3196+ },
3197+ })
3198+
3199+ Expect (err ).ShouldNot (HaveOccurred ())
3200+ Expect (response .GetEntityIds ()).Should (Equal (res ))
3201+ }
3202+ }
3203+ })
3204+ })
3205+
30633206 driveSchemaSubjectFilter := `
30643207 entity user {}
30653208
0 commit comments