Skip to content

Instantly share code, notes, and snippets.

@jon-whit
Created February 22, 2024 23:56
Show Gist options
  • Save jon-whit/d59ea63d26f5e509ec61d3776185ea2b to your computer and use it in GitHub Desktop.
Save jon-whit/d59ea63d26f5e509ec61d3776185ea2b to your computer and use it in GitHub Desktop.
Dispatch Count Test
t.Run("dispatch_direct_userset_lookups", func(t *testing.T) {
ds := memory.New()
ctx := storage.ContextWithRelationshipTupleReader(context.Background(), ds)
storeID := ulid.Make().String()
model := parser.MustTransformDSLToProto(`model
schema 1.1
type user
type group
relations
define member: [user, group#member]
type document
relations
define viewer: [group#member]
`)
err := ds.Write(ctx, storeID, nil, []*openfgav1.TupleKey{
{
User: "user:jon",
Relation: "member",
Object: "group:1",
},
{
User: "group:1#member",
Relation: "member",
Object: "group:eng",
},
{
User: "group:2#member",
Relation: "member",
Object: "group:eng",
},
{
User: "group:3#member",
Relation: "member",
Object: "group:eng",
},
{
User: "group:eng#member",
Relation: "viewer",
Object: "document:1",
},
})
require.NoError(t, err)
checker := NewLocalChecker()
typesys, err := typesystem.NewAndValidate(
context.Background(),
model,
)
require.NoError(t, err)
ctx = typesystem.ContextWithTypesystem(ctx, typesys)
resp, err := checker.ResolveCheck(ctx, &ResolveCheckRequest{
StoreID: storeID,
AuthorizationModelID: model.GetId(),
TupleKey: tuple.NewTupleKey("document:1", "viewer", "user:jon"),
ResolutionMetadata: &ResolutionMetadata{Depth: 5},
})
require.NoError(t, err)
require.True(t, resp.Allowed)
require.Equal(t, uint32(2), resp.GetResolutionMetadata().DispatchCount)
resp, err = checker.ResolveCheck(ctx, &ResolveCheckRequest{
StoreID: storeID,
AuthorizationModelID: model.GetId(),
TupleKey: tuple.NewTupleKey("document:1", "viewer", "user:other"),
ResolutionMetadata: &ResolutionMetadata{Depth: 5},
})
require.NoError(t, err)
require.False(t, resp.Allowed)
require.Equal(t, uint32(4), resp.GetResolutionMetadata().DispatchCount)
})
}
@jon-whit
Copy link
Author

Note that https://gist.github.com/jon-whit/d59ea63d26f5e509ec61d3776185ea2b#file-check_test-go-L69 requires a range equality, because if you dispatch group:2#member and group:3#member before group:1#member then you'll have 4 dispatches, but if you evaluate group:1#member first then you'll have 2 dispatches.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment