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  }