github.com/voedger/voedger@v0.0.0-20240520144910-273e84102129/pkg/state/impl_wlog_storage_test.go (about)

     1  /*
     2   * Copyright (c) 2022-present unTill Pro, Ltd.
     3   */
     4  
     5  package state
     6  
     7  import (
     8  	"context"
     9  	"testing"
    10  
    11  	"github.com/stretchr/testify/mock"
    12  	"github.com/stretchr/testify/require"
    13  
    14  	"github.com/voedger/voedger/pkg/appdef"
    15  	"github.com/voedger/voedger/pkg/istructs"
    16  )
    17  
    18  func TestWLogStorage_Read(t *testing.T) {
    19  	t.Run("Should be ok", func(t *testing.T) {
    20  		require := require.New(t)
    21  		touched := false
    22  		events := &mockEvents{}
    23  		events.On("ReadWLog", context.Background(), istructs.WSID(1), istructs.FirstOffset, 1, mock.AnythingOfType("istructs.WLogEventsReaderCallback")).
    24  			Return(nil).
    25  			Run(func(args mock.Arguments) {
    26  				require.NoError(args.Get(4).(istructs.WLogEventsReaderCallback)(istructs.FirstOffset, nil))
    27  			})
    28  		appStructs := &mockAppStructs{}
    29  		appStructs.On("AppDef").Return(&nilAppDef{})
    30  		appStructs.On("Events").Return(events)
    31  		appStructs.On("Records").Return(&nilRecords{})
    32  		appStructs.On("ViewRecords").Return(&nilViewRecords{})
    33  		s := ProvideQueryProcessorStateFactory()(context.Background(), appStructsFunc(appStructs), nil, SimpleWSIDFunc(istructs.WSID(1)), nil, nil, nil, nil, nil, nil, nil, nil)
    34  		kb, err := s.KeyBuilder(WLog, appdef.NullQName)
    35  		require.NoError(err)
    36  		kb.PutInt64(Field_Offset, 1)
    37  		kb.PutInt64(Field_Count, 1)
    38  
    39  		require.NoError(s.Read(kb, func(key istructs.IKey, _ istructs.IStateValue) (err error) {
    40  			touched = true
    41  			require.Equal(int64(1), key.AsInt64(Field_Offset))
    42  			return err
    43  		}))
    44  
    45  		require.True(touched)
    46  	})
    47  	t.Run("Should return error on read wlog", func(t *testing.T) {
    48  		require := require.New(t)
    49  		events := &mockEvents{}
    50  		events.On("ReadWLog", context.Background(), istructs.WSID(1), istructs.FirstOffset, 1, mock.AnythingOfType("istructs.WLogEventsReaderCallback")).Return(errTest)
    51  		appStructs := &mockAppStructs{}
    52  		appStructs.On("AppDef").Return(&nilAppDef{})
    53  		appStructs.On("Events").Return(events)
    54  		appStructs.On("Records").Return(&nilRecords{})
    55  		appStructs.On("ViewRecords").Return(&nilViewRecords{})
    56  		s := ProvideQueryProcessorStateFactory()(context.Background(), appStructsFunc(appStructs), nil, SimpleWSIDFunc(istructs.WSID(1)), nil, nil, nil, nil, nil, nil, nil, nil)
    57  		k, err := s.KeyBuilder(WLog, appdef.NullQName)
    58  		require.NoError(err)
    59  		k.PutInt64(Field_Offset, 1)
    60  		k.PutInt64(Field_Count, 1)
    61  
    62  		err = s.Read(k, func(istructs.IKey, istructs.IStateValue) error { return nil })
    63  
    64  		require.ErrorIs(err, errTest)
    65  	})
    66  }
    67  func TestWLogStorage_GetBatch(t *testing.T) {
    68  	t.Run("Should be ok", func(t *testing.T) {
    69  		require := require.New(t)
    70  		event := new(mockWLogEvent)
    71  		event.On("CUDs", mock.Anything).Return(nil).Run(func(args mock.Arguments) {
    72  			cb := args.Get(0).(func(rec istructs.ICUDRow))
    73  			cb(new(mockCUDRow))
    74  		})
    75  		events := &mockEvents{}
    76  		events.On("ReadWLog", context.Background(), istructs.WSID(1), istructs.FirstOffset, 1, mock.AnythingOfType("istructs.WLogEventsReaderCallback")).
    77  			Return(nil).
    78  			Run(func(args mock.Arguments) {
    79  				cb := args.Get(4).(istructs.WLogEventsReaderCallback)
    80  				require.NoError(cb(istructs.FirstOffset, event))
    81  			})
    82  		appStructs := &mockAppStructs{}
    83  		appStructs.On("AppDef").Return(&nilAppDef{})
    84  		appStructs.On("Events").Return(events)
    85  		appStructs.On("Records").Return(&nilRecords{})
    86  		appStructs.On("ViewRecords").Return(&nilViewRecords{})
    87  		s := ProvideCommandProcessorStateFactory()(context.Background(), func() istructs.IAppStructs { return appStructs },
    88  			nil, SimpleWSIDFunc(istructs.WSID(1)), nil, nil, nil, nil, 0, nil, nil, nil, nil)
    89  		kb, err := s.KeyBuilder(WLog, appdef.NullQName)
    90  		require.NoError(err)
    91  		kb.PutInt64(Field_Offset, 1)
    92  		kb.PutInt64(Field_Count, 1)
    93  
    94  		sv, ok, err := s.CanExist(kb)
    95  		require.NoError(err)
    96  
    97  		require.True(ok)
    98  		require.Equal(int64(1), sv.AsInt64(Field_Offset))
    99  
   100  		cuds := sv.AsValue(Field_CUDs)
   101  		cud := cuds.GetAsValue(0)
   102  
   103  		require.Equal(1, cuds.Length())
   104  		require.NotNil(cud)
   105  		require.PanicsWithValue(errFieldByIndexIsNotAnObjectOrArray, func() { sv.GetAsValue(0) })
   106  		require.PanicsWithValue(errFieldByNameIsNotAnObjectOrArray, func() { cud.AsValue(Field_CUDs) })
   107  		require.PanicsWithValue(errCurrentValueIsNotAnArray, func() { sv.GetAsInt64(0) })
   108  		require.PanicsWithValue(errNotImplemented, func() { sv.AsRecordID(Field_Offset) })
   109  	})
   110  	t.Run("Should return error when error occurred on read wlog", func(t *testing.T) {
   111  		require := require.New(t)
   112  		events := &mockEvents{}
   113  		events.
   114  			On("ReadWLog", context.Background(), istructs.WSID(1), istructs.FirstOffset, 1, mock.AnythingOfType("istructs.WLogEventsReaderCallback")).
   115  			Return(nil).
   116  			Run(func(args mock.Arguments) {
   117  				require.NoError(args.Get(4).(istructs.WLogEventsReaderCallback)(istructs.FirstOffset, nil))
   118  			}).
   119  			On("ReadWLog", context.Background(), istructs.WSID(1), istructs.Offset(2), 1, mock.AnythingOfType("istructs.WLogEventsReaderCallback")).
   120  			Return(errTest)
   121  		appStructs := &mockAppStructs{}
   122  		appStructs.On("AppDef").Return(&nilAppDef{})
   123  		appStructs.On("Events").Return(events)
   124  		appStructs.On("Records").Return(&nilRecords{})
   125  		appStructs.On("ViewRecords").Return(&nilViewRecords{})
   126  		s := ProvideCommandProcessorStateFactory()(context.Background(), func() istructs.IAppStructs { return appStructs },
   127  			nil, SimpleWSIDFunc(istructs.WSID(1)), nil, nil, nil, nil, 0, nil, nil, nil, nil)
   128  		kb1, err := s.KeyBuilder(WLog, appdef.NullQName)
   129  		require.NoError(err)
   130  		kb1.PutInt64(Field_Offset, 1)
   131  		kb1.PutInt64(Field_Count, 1)
   132  		kb2, err := s.KeyBuilder(WLog, appdef.NullQName)
   133  		require.NoError(err)
   134  		kb2.PutInt64(Field_Offset, 2)
   135  		kb2.PutInt64(Field_Count, 1)
   136  
   137  		err = s.CanExistAll([]istructs.IStateKeyBuilder{kb1, kb2}, nil)
   138  
   139  		require.ErrorIs(err, errTest)
   140  	})
   141  }