Created
February 22, 2024 23:56
-
-
Save jon-whit/d59ea63d26f5e509ec61d3776185ea2b to your computer and use it in GitHub Desktop.
Dispatch Count Test
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) | |
}) | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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
andgroup:3#member
beforegroup:1#member
then you'll have 4 dispatches, but if you evaluategroup:1#member
first then you'll have 2 dispatches.