github.com/cosmos/cosmos-sdk@v0.50.10/x/group/internal/orm/table_test.go (about) 1 package orm 2 3 import ( 4 "fmt" 5 "testing" 6 7 "github.com/cosmos/gogoproto/proto" 8 "github.com/stretchr/testify/assert" 9 "github.com/stretchr/testify/require" 10 11 errorsmod "cosmossdk.io/errors" 12 storetypes "cosmossdk.io/store/types" 13 14 "github.com/cosmos/cosmos-sdk/codec" 15 "github.com/cosmos/cosmos-sdk/codec/types" 16 "github.com/cosmos/cosmos-sdk/testutil/testdata" 17 sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" 18 "github.com/cosmos/cosmos-sdk/x/group/errors" 19 ) 20 21 func TestNewTable(t *testing.T) { 22 interfaceRegistry := types.NewInterfaceRegistry() 23 cdc := codec.NewProtoCodec(interfaceRegistry) 24 25 testCases := []struct { 26 name string 27 model proto.Message 28 expectErr bool 29 expectedErr string 30 }{ 31 { 32 name: "nil model", 33 model: nil, 34 expectErr: true, 35 expectedErr: "Model must not be nil", 36 }, 37 { 38 name: "all not nil", 39 model: &testdata.TableModel{}, 40 expectErr: false, 41 }, 42 } 43 44 for _, tc := range testCases { 45 t.Run(tc.name, func(t *testing.T) { 46 table, err := newTable([2]byte{0x1}, tc.model, cdc) 47 if tc.expectErr { 48 require.Error(t, err) 49 require.Contains(t, err.Error(), tc.expectedErr) 50 } else { 51 require.NoError(t, err) 52 require.NotNil(t, table) 53 } 54 }) 55 } 56 } 57 58 func TestCreate(t *testing.T) { 59 specs := map[string]struct { 60 rowID RowID 61 src proto.Message 62 expErr *errorsmod.Error 63 }{ 64 "empty rowID": { 65 rowID: []byte{}, 66 src: &testdata.TableModel{ 67 Id: 1, 68 Name: "some name", 69 }, 70 expErr: errors.ErrORMEmptyKey, 71 }, 72 "happy path": { 73 rowID: EncodeSequence(1), 74 src: &testdata.TableModel{ 75 Id: 1, 76 Name: "some name", 77 }, 78 }, 79 "wrong type": { 80 rowID: EncodeSequence(1), 81 src: &testdata.Cat{ 82 Moniker: "cat moniker", 83 Lives: 10, 84 }, 85 expErr: sdkerrors.ErrInvalidType, 86 }, 87 "model validation fails": { 88 rowID: EncodeSequence(1), 89 src: &testdata.TableModel{ 90 Id: 1, 91 Name: "", 92 }, 93 expErr: testdata.ErrTest, 94 }, 95 } 96 for msg, spec := range specs { 97 t.Run(msg, func(t *testing.T) { 98 interfaceRegistry := types.NewInterfaceRegistry() 99 cdc := codec.NewProtoCodec(interfaceRegistry) 100 101 ctx := NewMockContext() 102 store := ctx.KVStore(storetypes.NewKVStoreKey("test")) 103 104 anyPrefix := [2]byte{0x10} 105 myTable, err := newTable(anyPrefix, &testdata.TableModel{}, cdc) 106 require.NoError(t, err) 107 108 err = myTable.Create(store, spec.rowID, spec.src) 109 110 require.True(t, spec.expErr.Is(err), err) 111 shouldExists := spec.expErr == nil 112 assert.Equal(t, shouldExists, myTable.Has(store, spec.rowID), fmt.Sprintf("expected %v", shouldExists)) 113 114 // then 115 var loaded testdata.TableModel 116 err = myTable.GetOne(store, spec.rowID, &loaded) 117 if spec.expErr != nil { 118 require.True(t, sdkerrors.ErrNotFound.Is(err)) 119 return 120 } 121 require.NoError(t, err) 122 assert.Equal(t, spec.src, &loaded) 123 }) 124 } 125 } 126 127 func TestUpdate(t *testing.T) { 128 specs := map[string]struct { 129 src proto.Message 130 expErr *errorsmod.Error 131 }{ 132 "happy path": { 133 src: &testdata.TableModel{ 134 Id: 1, 135 Name: "some name", 136 }, 137 }, 138 "wrong type": { 139 src: &testdata.Cat{ 140 Moniker: "cat moniker", 141 Lives: 10, 142 }, 143 expErr: sdkerrors.ErrInvalidType, 144 }, 145 "model validation fails": { 146 src: &testdata.TableModel{ 147 Id: 1, 148 Name: "", 149 }, 150 expErr: testdata.ErrTest, 151 }, 152 } 153 for msg, spec := range specs { 154 t.Run(msg, func(t *testing.T) { 155 interfaceRegistry := types.NewInterfaceRegistry() 156 cdc := codec.NewProtoCodec(interfaceRegistry) 157 158 ctx := NewMockContext() 159 store := ctx.KVStore(storetypes.NewKVStoreKey("test")) 160 161 anyPrefix := [2]byte{0x10} 162 myTable, err := newTable(anyPrefix, &testdata.TableModel{}, cdc) 163 require.NoError(t, err) 164 165 initValue := testdata.TableModel{ 166 Id: 1, 167 Name: "old name", 168 } 169 170 err = myTable.Create(store, EncodeSequence(1), &initValue) 171 require.NoError(t, err) 172 173 // when 174 err = myTable.Update(store, EncodeSequence(1), spec.src) 175 require.True(t, spec.expErr.Is(err), "got ", err) 176 177 // then 178 var loaded testdata.TableModel 179 require.NoError(t, myTable.GetOne(store, EncodeSequence(1), &loaded)) 180 if spec.expErr == nil { 181 assert.Equal(t, spec.src, &loaded) 182 } else { 183 assert.Equal(t, initValue, loaded) 184 } 185 }) 186 } 187 } 188 189 func TestDelete(t *testing.T) { 190 specs := map[string]struct { 191 rowID []byte 192 expErr *errorsmod.Error 193 }{ 194 "happy path": { 195 rowID: EncodeSequence(1), 196 }, 197 "not found": { 198 rowID: []byte("not-found"), 199 expErr: sdkerrors.ErrNotFound, 200 }, 201 } 202 for msg, spec := range specs { 203 t.Run(msg, func(t *testing.T) { 204 interfaceRegistry := types.NewInterfaceRegistry() 205 cdc := codec.NewProtoCodec(interfaceRegistry) 206 207 ctx := NewMockContext() 208 store := ctx.KVStore(storetypes.NewKVStoreKey("test")) 209 210 anyPrefix := [2]byte{0x10} 211 myTable, err := newTable(anyPrefix, &testdata.TableModel{}, cdc) 212 require.NoError(t, err) 213 214 initValue := testdata.TableModel{ 215 Id: 1, 216 Name: "some name", 217 } 218 219 err = myTable.Create(store, EncodeSequence(1), &initValue) 220 require.NoError(t, err) 221 222 // when 223 err = myTable.Delete(store, spec.rowID) 224 require.True(t, spec.expErr.Is(err), "got ", err) 225 226 // then 227 var loaded testdata.TableModel 228 if spec.expErr == sdkerrors.ErrNotFound { 229 require.NoError(t, myTable.GetOne(store, EncodeSequence(1), &loaded)) 230 assert.Equal(t, initValue, loaded) 231 } else { 232 err := myTable.GetOne(store, EncodeSequence(1), &loaded) 233 require.Error(t, err) 234 require.Equal(t, err, sdkerrors.ErrNotFound) 235 } 236 }) 237 } 238 }