github.com/voedger/voedger@v0.0.0-20240520144910-273e84102129/pkg/istorage/provider/impl_test.go (about)

     1  /*
     2   * Copyright (c) 2020-present unTill Pro, Ltd.
     3   */
     4  
     5  package provider
     6  
     7  import (
     8  	"testing"
     9  
    10  	"github.com/stretchr/testify/require"
    11  
    12  	"github.com/voedger/voedger/pkg/istorage"
    13  	"github.com/voedger/voedger/pkg/istorage/mem"
    14  	"github.com/voedger/voedger/pkg/istructs"
    15  )
    16  
    17  func TestBasicUsage(t *testing.T) {
    18  	require := require.New(t)
    19  	asf := mem.Provide()
    20  	asp := Provide(asf)
    21  
    22  	app1 := istructs.NewAppQName("sys", "_") // SafeAppName is "sys"
    23  	app2 := istructs.NewAppQName("sys", "/") // SafeAppName is "sys{uuid}"
    24  
    25  	// basic IAppStorage obtain
    26  	storage, err := asp.AppStorage(app1)
    27  	require.NoError(err)
    28  	storageApp2, err := asp.AppStorage(app2)
    29  	require.NoError(err)
    30  
    31  	t.Run("same IAppStorage instances on AppStorage calls for the same app", func(t *testing.T) {
    32  		storage2, err := asp.AppStorage(app1)
    33  		require.NoError(err)
    34  		require.Same(storage, storage2)
    35  
    36  		storageApp3, err := asp.AppStorage(app2)
    37  		require.NoError(err)
    38  		require.Same(storageApp2, storageApp3)
    39  	})
    40  
    41  	t.Run("safe app name is obtained once -> read it from sysmeta in future", func(t *testing.T) {
    42  		// store something for app2
    43  		require.NoError(storageApp2.Put([]byte{1}, []byte{1}, []byte{2}))
    44  
    45  		// re-initialize
    46  		asp = Provide(asf, asp.(*implIAppStorageProvider).suffix)
    47  
    48  		// obtain IAppStorage for app2
    49  		// it should be the same as before
    50  		storage, err := asp.AppStorage(app2)
    51  		require.NoError(err)
    52  
    53  		// now check we've got into sysab for app2, not sysaa that could be if there was just single app2
    54  		// because we've get sysab once for app2 so it should be stored in sysmeta
    55  		val := []byte{}
    56  		_, err = storage.Get([]byte{1}, []byte{1}, &val)
    57  		require.NoError(err)
    58  		require.Equal([]byte{2}, val)
    59  	})
    60  }
    61  
    62  func TestInitErrorPersistence(t *testing.T) {
    63  	require := require.New(t)
    64  	asf := mem.Provide()
    65  	asp := Provide(asf)
    66  
    67  	app1 := istructs.NewAppQName("sys", "_")
    68  	app1SafeName, err := istorage.NewSafeAppName(app1, func(name string) (bool, error) { return true, nil })
    69  	require.NoError(err)
    70  
    71  	// init the storage manually to force the error
    72  	app1SafeName = asp.(*implIAppStorageProvider).clarifyKeyspaceName(app1SafeName)
    73  	require.NoError(asf.Init(app1SafeName))
    74  
    75  	// expect an error
    76  	_, err = asp.AppStorage(app1)
    77  	require.ErrorIs(err, ErrStorageInitError)
    78  
    79  	// re-init
    80  	asp = Provide(asf, asp.(*implIAppStorageProvider).suffix)
    81  
    82  	// expect Init() error is stored in sysmeta
    83  	_, err = asp.AppStorage(app1)
    84  	require.ErrorIs(err, ErrStorageInitError)
    85  }