github.com/voedger/voedger@v0.0.0-20240520144910-273e84102129/pkg/istructsmem/internal/qnames/rename_test.go (about) 1 /* 2 * Copyright (c) 2021-present Sigma-Soft, Ltd. 3 * @author: Nikolay Nikitin 4 */ 5 6 package qnames 7 8 import ( 9 "errors" 10 "testing" 11 12 "github.com/stretchr/testify/require" 13 14 "github.com/voedger/voedger/pkg/appdef" 15 "github.com/voedger/voedger/pkg/istructsmem/internal/consts" 16 "github.com/voedger/voedger/pkg/istructsmem/internal/teststore" 17 "github.com/voedger/voedger/pkg/istructsmem/internal/utils" 18 "github.com/voedger/voedger/pkg/istructsmem/internal/vers" 19 ) 20 21 func TestRenameQName(t *testing.T) { 22 23 require := require.New(t) 24 25 oldQName := appdef.NewQName("test", "old") 26 newQName := appdef.NewQName("test", "new") 27 28 storage := teststore.NewStorage() 29 30 t.Run("prepare storage with old QName", func(t *testing.T) { 31 versions := vers.New() 32 err := versions.Prepare(storage) 33 require.NoError(err) 34 35 adb := appdef.New() 36 adb.AddPackage("test", "test.com/test") 37 38 _ = adb.AddObject(oldQName) 39 appDef, err := adb.Build() 40 require.NoError(err) 41 42 names := New() 43 err = names.Prepare(storage, versions, appDef, nil) 44 require.NoError(err) 45 }) 46 47 t.Run("basic usage", func(t *testing.T) { 48 err := Rename(storage, oldQName, newQName) 49 require.NoError(err) 50 }) 51 52 t.Run("check result", func(t *testing.T) { 53 versions := vers.New() 54 err := versions.Prepare(storage) 55 require.NoError(err) 56 57 names := New() 58 err = names.Prepare(storage, versions, nil, nil) 59 require.NoError(err) 60 61 t.Run("check old is deleted", func(t *testing.T) { 62 id, err := names.ID(oldQName) 63 require.ErrorIs(err, ErrNameNotFound) 64 require.Equal(NullQNameID, id) 65 }) 66 67 t.Run("check new is not null", func(t *testing.T) { 68 id, err := names.ID(newQName) 69 require.NoError(err) 70 require.Greater(id, QNameIDSysLast) 71 }) 72 }) 73 } 74 75 func TestRenameQName_Errors(t *testing.T) { 76 77 require := require.New(t) 78 79 oldQName := appdef.NewQName("test", "old") 80 newQName := appdef.NewQName("test", "new") 81 other := appdef.NewQName("test", "other") 82 83 storage := teststore.NewStorage() 84 85 t.Run("prepare storage with old QName", func(t *testing.T) { 86 versions := vers.New() 87 err := versions.Prepare(storage) 88 require.NoError(err) 89 90 adb := appdef.New() 91 adb.AddPackage("test", "test.com/test") 92 93 _ = adb.AddObject(oldQName) 94 _ = adb.AddObject(other) 95 appDef, err := adb.Build() 96 require.NoError(err) 97 98 names := New() 99 err = names.Prepare(storage, versions, appDef, nil) 100 require.NoError(err) 101 }) 102 103 t.Run("must error if old and new are equals", func(t *testing.T) { 104 err := Rename(storage, oldQName, oldQName) 105 require.ErrorContains(err, "equals") 106 }) 107 108 t.Run("must error if twice rename", func(t *testing.T) { 109 err := Rename(storage, oldQName, newQName) 110 require.NoError(err) 111 112 err = Rename(storage, oldQName, newQName) 113 require.ErrorIs(err, ErrNameNotFound) 114 115 t.Run("but must ok reverse rename", func(t *testing.T) { 116 err = Rename(storage, newQName, oldQName) 117 require.NoError(err) 118 }) 119 }) 120 121 t.Run("must error if old name not found", func(t *testing.T) { 122 err := Rename(storage, appdef.NewQName("test", "unknown"), newQName) 123 require.ErrorIs(err, ErrNameNotFound) 124 }) 125 126 t.Run("must error if new name is already exists", func(t *testing.T) { 127 err := Rename(storage, oldQName, other) 128 require.ErrorContains(err, "exists") 129 }) 130 } 131 132 func TestRenameQName_Fails(t *testing.T) { 133 134 require := require.New(t) 135 136 oldQName := appdef.NewQName("test", "old") 137 newQName := appdef.NewQName("test", "new") 138 139 t.Run("must error if unsupported version of Versions system view", func(t *testing.T) { 140 testError := errors.New("error read versions") 141 storage := teststore.NewStorage() 142 143 versions := vers.New() 144 err := versions.Prepare(storage) 145 require.NoError(err) 146 versions.Put(vers.SysQNamesVersion, latestVersion+1) // future version 147 148 storage.ScheduleGetError(testError, utils.ToBytes(consts.SysView_Versions), nil) 149 150 err = Rename(storage, oldQName, newQName) 151 require.ErrorIs(err, testError) 152 }) 153 154 t.Run("must error if unsupported version of QNames system view", func(t *testing.T) { 155 storage := teststore.NewStorage() 156 157 versions := vers.New() 158 err := versions.Prepare(storage) 159 require.NoError(err) 160 versions.Put(vers.SysQNamesVersion, latestVersion+1) // future version 161 162 err = Rename(storage, oldQName, newQName) 163 require.ErrorIs(err, vers.ErrorInvalidVersion) 164 }) 165 166 storage := teststore.NewStorage() 167 168 t.Run("prepare storage with old QName", func(t *testing.T) { 169 versions := vers.New() 170 err := versions.Prepare(storage) 171 require.NoError(err) 172 173 adb := appdef.New() 174 adb.AddPackage("test", "test.com/test") 175 176 _ = adb.AddObject(oldQName) 177 appDef, err := adb.Build() 178 require.NoError(err) 179 180 names := New() 181 err = names.Prepare(storage, versions, appDef, nil) 182 require.NoError(err) 183 }) 184 185 t.Run("must error if storage read failed", func(t *testing.T) { 186 testError := errors.New("can not read old qname") 187 188 storage.ScheduleGetError(testError, nil, []byte(oldQName.String())) 189 190 err := Rename(storage, oldQName, newQName) 191 require.ErrorIs(err, testError) 192 }) 193 194 t.Run("must error if storage put failed", func(t *testing.T) { 195 testError := errors.New("can not delete old qname") 196 197 storage.SchedulePutError(testError, nil, []byte(newQName.String())) 198 199 err := Rename(storage, oldQName, newQName) 200 require.ErrorIs(err, testError) 201 }) 202 }