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  }