github.com/openfga/openfga@v1.5.4-rc1/pkg/storage/test/stores.go (about) 1 package test 2 3 import ( 4 "context" 5 "testing" 6 "time" 7 8 "github.com/oklog/ulid/v2" 9 openfgav1 "github.com/openfga/api/proto/openfga/v1" 10 "github.com/stretchr/testify/require" 11 "google.golang.org/protobuf/types/known/timestamppb" 12 13 "github.com/openfga/openfga/pkg/storage" 14 "github.com/openfga/openfga/pkg/testutils" 15 ) 16 17 func StoreTest(t *testing.T, datastore storage.OpenFGADatastore) { 18 ctx := context.Background() 19 20 // Create some stores. 21 numStores := 10 22 var stores []*openfgav1.Store 23 for i := 0; i < numStores; i++ { 24 store := &openfgav1.Store{ 25 Id: ulid.Make().String(), 26 Name: testutils.CreateRandomString(10), 27 CreatedAt: timestamppb.New(time.Now()), 28 } 29 30 _, err := datastore.CreateStore(ctx, store) 31 require.NoError(t, err) 32 33 stores = append(stores, store) 34 } 35 36 t.Run("inserting_store_in_twice_fails", func(t *testing.T) { 37 _, err := datastore.CreateStore(ctx, stores[0]) 38 require.ErrorIs(t, err, storage.ErrCollision) 39 }) 40 41 t.Run("list_stores_succeeds", func(t *testing.T) { 42 gotStores, ct, err := datastore.ListStores(ctx, storage.PaginationOptions{PageSize: 1}) 43 require.NoError(t, err) 44 45 require.Len(t, gotStores, 1) 46 require.NotEmpty(t, len(ct)) 47 48 _, ct, err = datastore.ListStores(ctx, storage.PaginationOptions{PageSize: 100, From: string(ct)}) 49 require.NoError(t, err) 50 51 // This will fail if there are actually over 101 stores in the DB at the time of running. 52 require.Zero(t, len(ct)) 53 }) 54 55 t.Run("get_store_succeeds", func(t *testing.T) { 56 store := stores[0] 57 gotStore, err := datastore.GetStore(ctx, store.GetId()) 58 require.NoError(t, err) 59 require.Equal(t, store.GetId(), gotStore.GetId()) 60 require.Equal(t, store.GetName(), gotStore.GetName()) 61 }) 62 63 t.Run("get_non-existent_store_returns_not_found", func(t *testing.T) { 64 _, err := datastore.GetStore(ctx, "foo") 65 require.ErrorIs(t, err, storage.ErrNotFound) 66 }) 67 68 t.Run("delete_store_succeeds", func(t *testing.T) { 69 store := stores[1] 70 err := datastore.DeleteStore(ctx, store.GetId()) 71 require.NoError(t, err) 72 73 // Should not be able to get the store now. 74 _, err = datastore.GetStore(ctx, store.GetId()) 75 require.ErrorIs(t, err, storage.ErrNotFound) 76 }) 77 78 t.Run("deleted_store_does_not_appear_in_list", func(t *testing.T) { 79 store := stores[2] 80 err := datastore.DeleteStore(ctx, store.GetId()) 81 require.NoError(t, err) 82 83 // Store id should not appear in the list of store ids. 84 gotStores, _, err := datastore.ListStores(ctx, storage.PaginationOptions{PageSize: storage.DefaultPageSize}) 85 require.NoError(t, err) 86 87 for _, s := range gotStores { 88 require.NotEqual(t, store.GetId(), s.GetId()) 89 } 90 }) 91 }