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  }