github.com/openfga/openfga@v1.5.4-rc1/pkg/storage/test/assertions.go (about) 1 package test 2 3 import ( 4 "context" 5 "testing" 6 7 "github.com/google/go-cmp/cmp" 8 "github.com/oklog/ulid/v2" 9 openfgav1 "github.com/openfga/api/proto/openfga/v1" 10 "github.com/stretchr/testify/require" 11 12 "github.com/openfga/openfga/pkg/storage" 13 tupleUtils "github.com/openfga/openfga/pkg/tuple" 14 ) 15 16 func AssertionsTest(t *testing.T, datastore storage.OpenFGADatastore) { 17 ctx := context.Background() 18 19 t.Run("writing_and_reading_assertions_succeeds", func(t *testing.T) { 20 store := ulid.Make().String() 21 modelID := ulid.Make().String() 22 assertions := []*openfgav1.Assertion{ 23 { 24 TupleKey: tupleUtils.NewAssertionTupleKey("doc:readme", "owner", "10"), 25 Expectation: false, 26 }, 27 { 28 TupleKey: tupleUtils.NewAssertionTupleKey("doc:readme", "viewer", "11"), 29 Expectation: true, 30 }, 31 } 32 33 err := datastore.WriteAssertions(ctx, store, modelID, assertions) 34 require.NoError(t, err) 35 36 gotAssertions, err := datastore.ReadAssertions(ctx, store, modelID) 37 require.NoError(t, err) 38 39 if diff := cmp.Diff(assertions, gotAssertions, cmpOpts...); diff != "" { 40 t.Fatalf("mismatch (-want +got):\n%s", diff) 41 } 42 }) 43 44 t.Run("writing_twice_overwrites_assertions", func(t *testing.T) { 45 store := ulid.Make().String() 46 modelID := ulid.Make().String() 47 assertions := []*openfgav1.Assertion{{TupleKey: tupleUtils.NewAssertionTupleKey("doc:readme", "viewer", "11"), Expectation: true}} 48 49 err := datastore.WriteAssertions(ctx, store, modelID, []*openfgav1.Assertion{ 50 { 51 TupleKey: tupleUtils.NewAssertionTupleKey("doc:readme", "owner", "10"), 52 Expectation: false, 53 }, 54 }) 55 require.NoError(t, err) 56 57 err = datastore.WriteAssertions(ctx, store, modelID, assertions) 58 require.NoError(t, err) 59 60 gotAssertions, err := datastore.ReadAssertions(ctx, store, modelID) 61 require.NoError(t, err) 62 63 if diff := cmp.Diff(assertions, gotAssertions, cmpOpts...); diff != "" { 64 t.Fatalf("mismatch (-want +got):\n%s", diff) 65 } 66 }) 67 68 t.Run("writing_to_one_modelID_and_reading_from_other_returns_nothing", func(t *testing.T) { 69 store := ulid.Make().String() 70 oldModelID := ulid.Make().String() 71 newModelID := ulid.Make().String() 72 assertions := []*openfgav1.Assertion{ 73 { 74 TupleKey: tupleUtils.NewAssertionTupleKey("doc:readme", "owner", "10"), 75 Expectation: false, 76 }, 77 } 78 79 err := datastore.WriteAssertions(ctx, store, oldModelID, assertions) 80 require.NoError(t, err) 81 82 gotAssertions, err := datastore.ReadAssertions(ctx, store, newModelID) 83 require.NoError(t, err) 84 85 require.Empty(t, gotAssertions) 86 }) 87 }