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

     1  /*
     2   * Copyright (c) 2022-present unTill Pro, Ltd.
     3   */
     4  
     5  package state
     6  
     7  import (
     8  	"context"
     9  	"math"
    10  	"testing"
    11  
    12  	"github.com/stretchr/testify/mock"
    13  	"github.com/stretchr/testify/require"
    14  	"github.com/voedger/voedger/pkg/appdef"
    15  	"github.com/voedger/voedger/pkg/istructs"
    16  )
    17  
    18  func TestHostState_BasicUsage(t *testing.T) {
    19  	require := require.New(t)
    20  
    21  	factory := ProvideQueryProcessorStateFactory()
    22  	hostState := factory(context.Background(), mockedHostStateStructs, nil, SimpleWSIDFunc(istructs.WSID(1)), nil, nil, nil, nil, nil, nil, nil, nil)
    23  
    24  	// Declare simple extension
    25  	extension := func(state istructs.IState) {
    26  		//Create key
    27  		key, err := state.KeyBuilder(View, testViewRecordQName1)
    28  		require.NoError(err)
    29  		key.PutInt64("pkFld", 64)
    30  
    31  		// Call to storage
    32  		require.NoError(state.MustNotExist(key))
    33  	}
    34  
    35  	// Run extension
    36  	extension(hostState)
    37  
    38  	require.NoError(hostState.ValidateIntents())
    39  	require.NoError(hostState.ApplyIntents())
    40  }
    41  
    42  func mockedHostStateStructs() istructs.IAppStructs {
    43  	mv := &mockValue{}
    44  	mv.
    45  		On("AsInt64", "vFld").Return(int64(10)).
    46  		On("AsInt64", ColOffset).Return(int64(45))
    47  	mvb1 := &mockValueBuilder{}
    48  	mvb1.
    49  		On("PutInt64", "vFld", int64(10)).
    50  		On("PutInt64", ColOffset, int64(45)).
    51  		On("Build").Return(mv)
    52  	mvb2 := &mockValueBuilder{}
    53  	mvb2.
    54  		On("PutInt64", "vFld", int64(10)).Once().
    55  		On("PutInt64", ColOffset, int64(45)).Once().
    56  		On("PutInt64", "vFld", int64(17)).Once().
    57  		On("PutInt64", ColOffset, int64(46)).Once()
    58  	mkb := &mockKeyBuilder{}
    59  	mkb.
    60  		On("PutInt64", "pkFld", int64(64))
    61  	value := &mockValue{}
    62  	value.On("AsString", "vk").Return("value")
    63  	viewRecords := &mockViewRecords{}
    64  	viewRecords.
    65  		On("KeyBuilder", testViewRecordQName1).Return(mkb).
    66  		On("NewValueBuilder", testViewRecordQName1).Return(mvb1).Once().
    67  		On("NewValueBuilder", testViewRecordQName1).Return(mvb2).Once().
    68  		On("GetBatch", istructs.WSID(1), mock.AnythingOfType("[]istructs.ViewRecordGetBatchItem")).
    69  		Return(nil).
    70  		Run(func(args mock.Arguments) {
    71  			args.Get(1).([]istructs.ViewRecordGetBatchItem)[0].Value = value
    72  		}).
    73  		On("Get", istructs.WSID(1), mock.Anything).Return(nil, nil).
    74  		On("PutBatch", istructs.WSID(1), mock.AnythingOfType("[]istructs.ViewKV")).Return(nil)
    75  
    76  	appDef := appdef.New()
    77  
    78  	view := appDef.AddView(testViewRecordQName1)
    79  	view.Key().PartKey().AddField("pkFld", appdef.DataKind_int64)
    80  	view.Key().ClustCols().AddField("ccFld", appdef.DataKind_string)
    81  	view.Value().
    82  		AddField("vFld", appdef.DataKind_int64, false).
    83  		AddField(ColOffset, appdef.DataKind_int64, false)
    84  
    85  	mockWorkspaceRecord := &mockRecord{}
    86  	mockWorkspaceRecord.On("AsQName", "WSKind").Return(testWSDescriptorQName)
    87  	mockWorkspaceRecord.On("QName").Return(qNameCDocWorkspaceDescriptor)
    88  	mockedRecords := &mockRecords{}
    89  	mockedRecords.On("GetSingleton", istructs.WSID(1), mock.Anything).Return(mockWorkspaceRecord, nil)
    90  
    91  	wsDesc := appDef.AddCDoc(testWSDescriptorQName)
    92  	wsDesc.AddField(field_WSKind, appdef.DataKind_bytes, false)
    93  
    94  	ws := appDef.AddWorkspace(testWSQName)
    95  	ws.AddType(testViewRecordQName1)
    96  	ws.SetDescriptor(testWSDescriptorQName)
    97  
    98  	app, err := appDef.Build()
    99  	if err != nil {
   100  		panic(err)
   101  	}
   102  
   103  	appStructs := &mockAppStructs{}
   104  	appStructs.
   105  		On("AppDef").Return(app).
   106  		On("AppQName").Return(testAppQName).
   107  		On("ViewRecords").Return(viewRecords).
   108  		On("Events").Return(&nilEvents{}).
   109  		On("Records").Return(mockedRecords)
   110  	return appStructs
   111  }
   112  func TestHostState_KeyBuilder_Should_return_unknown_storage_ID_error(t *testing.T) {
   113  	require := require.New(t)
   114  	s := hostStateForTest(&mockStorage{})
   115  
   116  	_, err := s.KeyBuilder(appdef.NullQName, appdef.NullQName)
   117  
   118  	require.ErrorIs(err, ErrUnknownStorage)
   119  }
   120  func TestHostState_CanExist(t *testing.T) {
   121  	t.Run("Should be ok", func(t *testing.T) {
   122  		require := require.New(t)
   123  		ms := &mockStorage{}
   124  		ms.
   125  			On("NewKeyBuilder", appdef.NullQName, nil).Return(newKeyBuilder(testStorage, appdef.NullQName)).
   126  			On("GetBatch", mock.AnythingOfType("[]state.GetBatchItem")).
   127  			Return(nil).
   128  			Run(func(args mock.Arguments) {
   129  				args.Get(0).([]GetBatchItem)[0].value = &mockStateValue{}
   130  			})
   131  		s := hostStateForTest(ms)
   132  		k, err := s.KeyBuilder(testStorage, appdef.NullQName)
   133  		require.NoError(err)
   134  
   135  		_, ok, err := s.CanExist(k)
   136  		require.NoError(err)
   137  
   138  		require.True(ok)
   139  	})
   140  	t.Run("Should return error when error occurred", func(t *testing.T) {
   141  		require := require.New(t)
   142  		ms := &mockStorage{}
   143  		ms.
   144  			On("NewKeyBuilder", appdef.NullQName, nil).Return(newKeyBuilder(testStorage, appdef.NullQName)).
   145  			On("GetBatch", mock.AnythingOfType("[]state.GetBatchItem")).Return(errTest)
   146  		s := hostStateForTest(ms)
   147  		k, err := s.KeyBuilder(testStorage, appdef.NullQName)
   148  		require.NoError(err)
   149  
   150  		_, _, err = s.CanExist(k)
   151  
   152  		require.ErrorIs(err, errTest)
   153  	})
   154  	t.Run("Should return get batch not supported by storage error", func(t *testing.T) {
   155  		require := require.New(t)
   156  		ms := &mockStorage{}
   157  		ms.On("NewKeyBuilder", appdef.NullQName, nil).Return(newKeyBuilder(testStorage, appdef.NullQName))
   158  		s, _ := emptyHostStateForTest(ms)
   159  		kb, err := s.KeyBuilder(testStorage, appdef.NullQName)
   160  		require.NoError(err)
   161  
   162  		_, _, err = s.CanExist(kb)
   163  
   164  		require.ErrorIs(err, ErrGetNotSupportedByStorage)
   165  	})
   166  }
   167  func TestHostState_CanExistAll(t *testing.T) {
   168  	t.Run("Should be ok", func(t *testing.T) {
   169  		require := require.New(t)
   170  		times := 0
   171  		ms := &mockStorage{}
   172  		ms.
   173  			On("NewKeyBuilder", appdef.NullQName, nil).Return(newKeyBuilder(testStorage, appdef.NullQName)).
   174  			On("GetBatch", mock.AnythingOfType("[]state.GetBatchItem")).
   175  			Return(nil).
   176  			Run(func(args mock.Arguments) {
   177  				args.Get(0).([]GetBatchItem)[0].value = &mockStateValue{}
   178  			})
   179  		s := hostStateForTest(ms)
   180  		k, err := s.KeyBuilder(testStorage, appdef.NullQName)
   181  		require.NoError(err)
   182  
   183  		err = s.CanExistAll([]istructs.IStateKeyBuilder{k}, func(key istructs.IKeyBuilder, value istructs.IStateValue, ok bool) (err error) {
   184  			times++
   185  			require.Equal(k, key)
   186  			require.True(ok)
   187  			return
   188  		})
   189  		require.NoError(err)
   190  
   191  		require.Equal(1, times)
   192  	})
   193  	t.Run("Should return error when error occurred", func(t *testing.T) {
   194  		require := require.New(t)
   195  		ms := &mockStorage{}
   196  		ms.
   197  			On("NewKeyBuilder", appdef.NullQName, nil).Return(newKeyBuilder(testStorage, appdef.NullQName)).
   198  			On("GetBatch", mock.AnythingOfType("[]state.GetBatchItem")).Return(errTest)
   199  		s := hostStateForTest(ms)
   200  		k, err := s.KeyBuilder(testStorage, appdef.NullQName)
   201  		require.NoError(err)
   202  
   203  		err = s.CanExistAll([]istructs.IStateKeyBuilder{k}, nil)
   204  
   205  		require.ErrorIs(err, errTest)
   206  	})
   207  	t.Run("Should return get not supported by storage error", func(t *testing.T) {
   208  		require := require.New(t)
   209  		ms := &mockStorage{}
   210  		ms.On("NewKeyBuilder", appdef.NullQName, nil).Return(newKeyBuilder(testStorage, appdef.NullQName))
   211  		s, _ := emptyHostStateForTest(ms)
   212  		kb, err := s.KeyBuilder(testStorage, appdef.NullQName)
   213  		require.NoError(err)
   214  
   215  		err = s.CanExistAll([]istructs.IStateKeyBuilder{kb}, nil)
   216  
   217  		require.ErrorIs(err, ErrGetNotSupportedByStorage)
   218  	})
   219  }
   220  func TestHostState_MustExist(t *testing.T) {
   221  	t.Run("Should be ok", func(t *testing.T) {
   222  		require := require.New(t)
   223  		ms := &mockStorage{}
   224  		ms.
   225  			On("NewKeyBuilder", appdef.NullQName, nil).Return(newKeyBuilder(testStorage, appdef.NullQName)).
   226  			On("GetBatch", mock.AnythingOfType("[]state.GetBatchItem")).
   227  			Return(nil).
   228  			Run(func(args mock.Arguments) {
   229  				args.Get(0).([]GetBatchItem)[0].value = &mockStateValue{}
   230  			})
   231  		s := hostStateForTest(ms)
   232  		k, err := s.KeyBuilder(testStorage, appdef.NullQName)
   233  		require.NoError(err)
   234  
   235  		_, err = s.MustExist(k)
   236  
   237  		require.NoError(err)
   238  	})
   239  	t.Run("Should return error when entity not exists", func(t *testing.T) {
   240  		require := require.New(t)
   241  		ms := &mockStorage{}
   242  		ms.
   243  			On("NewKeyBuilder", appdef.NullQName, nil).Return(newKeyBuilder(testStorage, appdef.NullQName)).
   244  			On("GetBatch", mock.AnythingOfType("[]state.GetBatchItem")).
   245  			Return(nil).
   246  			Run(func(args mock.Arguments) {
   247  				args.Get(0).([]GetBatchItem)[0].value = nil
   248  			})
   249  		s := hostStateForTest(ms)
   250  		k, err := s.KeyBuilder(testStorage, appdef.NullQName)
   251  		require.NoError(err)
   252  
   253  		_, err = s.MustExist(k)
   254  
   255  		require.ErrorIs(err, ErrNotExists)
   256  	})
   257  	t.Run("Should return error when error occurred on get batch", func(t *testing.T) {
   258  		require := require.New(t)
   259  		ms := &mockStorage{}
   260  		ms.
   261  			On("NewKeyBuilder", appdef.NullQName, nil).Return(newKeyBuilder(testStorage, appdef.NullQName)).
   262  			On("GetBatch", mock.AnythingOfType("[]state.GetBatchItem")).Return(errTest)
   263  		s := hostStateForTest(ms)
   264  		k, err := s.KeyBuilder(testStorage, appdef.NullQName)
   265  		require.NoError(err)
   266  
   267  		_, err = s.MustExist(k)
   268  
   269  		require.ErrorIs(err, errTest)
   270  	})
   271  }
   272  func TestHostState_MustExistAll(t *testing.T) {
   273  	t.Run("Should be ok", func(t *testing.T) {
   274  		require := require.New(t)
   275  		ms := &mockStorage{}
   276  		ms.
   277  			On("NewKeyBuilder", appdef.NullQName, nil).Return(newKeyBuilder(testStorage, appdef.NullQName)).
   278  			On("GetBatch", mock.AnythingOfType("[]state.GetBatchItem")).
   279  			Return(nil).
   280  			Run(func(args mock.Arguments) {
   281  				args.Get(0).([]GetBatchItem)[0].value = &mockStateValue{}
   282  				args.Get(0).([]GetBatchItem)[1].value = &mockStateValue{}
   283  			})
   284  		s := hostStateForTest(ms)
   285  		k1, err := s.KeyBuilder(testStorage, appdef.NullQName)
   286  		require.NoError(err)
   287  		k2, err := s.KeyBuilder(testStorage, appdef.NullQName)
   288  		require.NoError(err)
   289  		kk := make([]istructs.IKeyBuilder, 0, 2)
   290  
   291  		err = s.MustExistAll([]istructs.IStateKeyBuilder{k1, k2}, func(key istructs.IKeyBuilder, value istructs.IStateValue, ok bool) (err error) {
   292  			kk = append(kk, key)
   293  			require.True(ok)
   294  			return
   295  		})
   296  		require.NoError(err)
   297  
   298  		require.Equal(k1, kk[0])
   299  		require.Equal(k1, kk[1])
   300  	})
   301  	t.Run("Should return error on get batch", func(t *testing.T) {
   302  		require := require.New(t)
   303  		ms := &mockStorage{}
   304  		ms.
   305  			On("NewKeyBuilder", appdef.NullQName, nil).Return(newKeyBuilder(testStorage, appdef.NullQName)).
   306  			On("GetBatch", mock.AnythingOfType("[]state.GetBatchItem")).Return(errTest)
   307  		s := hostStateForTest(ms)
   308  		k, err := s.KeyBuilder(testStorage, appdef.NullQName)
   309  		require.NoError(err)
   310  
   311  		err = s.MustExistAll([]istructs.IStateKeyBuilder{k}, nil)
   312  
   313  		require.ErrorIs(err, errTest)
   314  	})
   315  	t.Run("Should return error when entity not exists", func(t *testing.T) {
   316  		require := require.New(t)
   317  		ms := &mockStorage{}
   318  		ms.
   319  			On("NewKeyBuilder", appdef.NullQName, nil).Return(newKeyBuilder(testStorage, appdef.NullQName)).
   320  			On("GetBatch", mock.AnythingOfType("[]state.GetBatchItem")).
   321  			Return(nil).
   322  			Run(func(args mock.Arguments) {
   323  				args.Get(0).([]GetBatchItem)[0].value = &mockStateValue{}
   324  				args.Get(0).([]GetBatchItem)[1].value = nil
   325  			})
   326  		s := hostStateForTest(ms)
   327  		k1, err := s.KeyBuilder(testStorage, appdef.NullQName)
   328  		require.NoError(err)
   329  		k2, err := s.KeyBuilder(testStorage, appdef.NullQName)
   330  		require.NoError(err)
   331  
   332  		err = s.MustExistAll([]istructs.IStateKeyBuilder{k1, k2}, nil)
   333  
   334  		require.ErrorIs(err, ErrNotExists)
   335  	})
   336  	t.Run("Should return get not supported by storage error", func(t *testing.T) {
   337  		require := require.New(t)
   338  		ms := &mockStorage{}
   339  		ms.On("NewKeyBuilder", appdef.NullQName, nil).Return(newKeyBuilder(testStorage, appdef.NullQName))
   340  		s, _ := emptyHostStateForTest(ms)
   341  		kb, err := s.KeyBuilder(testStorage, appdef.NullQName)
   342  		require.NoError(err)
   343  
   344  		err = s.MustExistAll([]istructs.IStateKeyBuilder{kb}, nil)
   345  
   346  		require.ErrorIs(err, ErrGetNotSupportedByStorage)
   347  	})
   348  }
   349  func TestHostState_MustNotExist(t *testing.T) {
   350  	t.Run("Should be ok", func(t *testing.T) {
   351  		require := require.New(t)
   352  		ms := &mockStorage{}
   353  		ms.
   354  			On("NewKeyBuilder", appdef.NullQName, nil).Return(newKeyBuilder(testStorage, appdef.NullQName)).
   355  			On("GetBatch", mock.AnythingOfType("[]state.GetBatchItem")).
   356  			Return(nil).
   357  			Run(func(args mock.Arguments) {
   358  				args.Get(0).([]GetBatchItem)[0].value = nil
   359  			})
   360  		s := hostStateForTest(ms)
   361  		k, err := s.KeyBuilder(testStorage, appdef.NullQName)
   362  		require.NoError(err)
   363  
   364  		err = s.MustNotExist(k)
   365  
   366  		require.NoError(err)
   367  	})
   368  	t.Run("Should return error when entity exists", func(t *testing.T) {
   369  		require := require.New(t)
   370  		ms := &mockStorage{}
   371  		ms.
   372  			On("NewKeyBuilder", appdef.NullQName, nil).Return(newKeyBuilder(testStorage, appdef.NullQName)).
   373  			On("GetBatch", mock.AnythingOfType("[]state.GetBatchItem")).
   374  			Return(nil).
   375  			Run(func(args mock.Arguments) {
   376  				args.Get(0).([]GetBatchItem)[0].value = &mockStateValue{}
   377  			})
   378  		s := hostStateForTest(ms)
   379  		k, err := s.KeyBuilder(testStorage, appdef.NullQName)
   380  		require.NoError(err)
   381  
   382  		err = s.MustNotExist(k)
   383  
   384  		require.ErrorIs(err, ErrExists)
   385  	})
   386  	t.Run("Should return error when error occurred on get batch", func(t *testing.T) {
   387  		require := require.New(t)
   388  		ms := &mockStorage{}
   389  		ms.
   390  			On("NewKeyBuilder", appdef.NullQName, nil).Return(newKeyBuilder(testStorage, appdef.NullQName)).
   391  			On("GetBatch", mock.AnythingOfType("[]state.GetBatchItem")).Return(errTest)
   392  		s := hostStateForTest(ms)
   393  		k, err := s.KeyBuilder(testStorage, appdef.NullQName)
   394  		require.NoError(err)
   395  
   396  		err = s.MustNotExist(k)
   397  
   398  		require.ErrorIs(err, errTest)
   399  	})
   400  }
   401  func TestHostState_MustNotExistAll(t *testing.T) {
   402  	t.Run("Should be ok", func(t *testing.T) {
   403  		require := require.New(t)
   404  		ms := &mockStorage{}
   405  		ms.
   406  			On("NewKeyBuilder", appdef.NullQName, nil).Return(newKeyBuilder(testStorage, appdef.NullQName)).
   407  			On("GetBatch", mock.AnythingOfType("[]state.GetBatchItem")).
   408  			Return(nil).
   409  			Run(func(args mock.Arguments) {
   410  				args.Get(0).([]GetBatchItem)[0].value = nil
   411  				args.Get(0).([]GetBatchItem)[1].value = nil
   412  			})
   413  		s := hostStateForTest(ms)
   414  		k1, err := s.KeyBuilder(testStorage, appdef.NullQName)
   415  		require.NoError(err)
   416  		k2, err := s.KeyBuilder(testStorage, appdef.NullQName)
   417  		require.NoError(err)
   418  
   419  		err = s.MustNotExistAll([]istructs.IStateKeyBuilder{k1, k2})
   420  
   421  		require.NoError(err)
   422  	})
   423  	t.Run("Should return error on get batch", func(t *testing.T) {
   424  		require := require.New(t)
   425  		ms := &mockStorage{}
   426  		ms.
   427  			On("NewKeyBuilder", appdef.NullQName, nil).Return(newKeyBuilder(testStorage, appdef.NullQName)).
   428  			On("GetBatch", mock.AnythingOfType("[]state.GetBatchItem")).Return(errTest)
   429  		s := hostStateForTest(ms)
   430  		k, err := s.KeyBuilder(testStorage, appdef.NullQName)
   431  		require.NoError(err)
   432  
   433  		err = s.MustNotExistAll([]istructs.IStateKeyBuilder{k})
   434  
   435  		require.ErrorIs(err, errTest)
   436  	})
   437  	t.Run("Should return error when entity exists", func(t *testing.T) {
   438  		require := require.New(t)
   439  		ms := &mockStorage{}
   440  		ms.
   441  			On("NewKeyBuilder", appdef.NullQName, nil).Return(newKeyBuilder(testStorage, appdef.NullQName)).
   442  			On("GetBatch", mock.AnythingOfType("[]state.GetBatchItem")).
   443  			Return(nil).
   444  			Run(func(args mock.Arguments) {
   445  				args.Get(0).([]GetBatchItem)[0].value = nil
   446  				args.Get(0).([]GetBatchItem)[1].value = &mockStateValue{}
   447  			})
   448  		s := hostStateForTest(ms)
   449  		k1, err := s.KeyBuilder(testStorage, appdef.NullQName)
   450  		require.NoError(err)
   451  		k2, err := s.KeyBuilder(testStorage, appdef.NullQName)
   452  		require.NoError(err)
   453  
   454  		err = s.MustNotExistAll([]istructs.IStateKeyBuilder{k1, k2})
   455  
   456  		require.ErrorIs(err, ErrExists)
   457  	})
   458  	t.Run("Should return get not supported by storage error", func(t *testing.T) {
   459  		require := require.New(t)
   460  		ms := &mockStorage{}
   461  		ms.On("NewKeyBuilder", appdef.NullQName, nil).Return(newKeyBuilder(testStorage, appdef.NullQName))
   462  		s, _ := emptyHostStateForTest(ms)
   463  		kb, err := s.KeyBuilder(testStorage, appdef.NullQName)
   464  		require.NoError(err)
   465  
   466  		err = s.MustNotExistAll([]istructs.IStateKeyBuilder{kb})
   467  
   468  		require.ErrorIs(err, ErrGetNotSupportedByStorage)
   469  	})
   470  }
   471  func TestHostState_Read(t *testing.T) {
   472  	t.Run("Should be ok", func(t *testing.T) {
   473  		ms := &mockStorage{}
   474  		ms.
   475  			On("NewKeyBuilder", appdef.NullQName, nil).Return(newKeyBuilder(testStorage, appdef.NullQName)).
   476  			On("Read", mock.Anything, mock.AnythingOfType("istructs.ValueCallback")).Return(nil)
   477  		s := hostStateForTest(ms)
   478  		k, err := s.KeyBuilder(testStorage, appdef.NullQName)
   479  		require.NoError(t, err)
   480  
   481  		require.NoError(t, s.Read(k, nil))
   482  
   483  		ms.AssertExpectations(t)
   484  	})
   485  	t.Run("Should return read not supported by storage error", func(t *testing.T) {
   486  		require := require.New(t)
   487  		ms := &mockStorage{}
   488  		ms.On("NewKeyBuilder", appdef.NullQName, nil).Return(newKeyBuilder(testStorage, appdef.NullQName))
   489  		s, _ := emptyHostStateForTest(ms)
   490  		kb, err := s.KeyBuilder(testStorage, appdef.NullQName)
   491  		require.NoError(err)
   492  
   493  		err = s.Read(kb, nil)
   494  
   495  		require.ErrorIs(err, ErrReadNotSupportedByStorage)
   496  	})
   497  }
   498  func TestHostState_NewValue(t *testing.T) {
   499  	t.Run("Should return error when intents limit exceeded", func(t *testing.T) {
   500  		require := require.New(t)
   501  		ms := &mockStorage{}
   502  		ms.On("NewKeyBuilder", appdef.NullQName, nil).Return(newKeyBuilder(testStorage, appdef.NullQName))
   503  		s, i := limitedIntentsHostStateForTest(ms)
   504  		kb, err := s.KeyBuilder(testStorage, appdef.NullQName)
   505  		require.NoError(err)
   506  
   507  		_, err = i.NewValue(kb)
   508  
   509  		require.ErrorIs(err, ErrIntentsLimitExceeded)
   510  	})
   511  	t.Run("Should return insert not supported by storage error", func(t *testing.T) {
   512  		require := require.New(t)
   513  		ms := &mockStorage{}
   514  		ms.On("NewKeyBuilder", appdef.NullQName, nil).Return(newKeyBuilder(testStorage, appdef.NullQName))
   515  		s, i := emptyHostStateForTest(ms)
   516  		kb, err := s.KeyBuilder(testStorage, appdef.NullQName)
   517  		require.NoError(err)
   518  
   519  		_, err = i.NewValue(kb)
   520  
   521  		require.ErrorIs(err, ErrInsertNotSupportedByStorage)
   522  	})
   523  }
   524  func TestHostState_UpdateValue(t *testing.T) {
   525  	t.Run("Should return error when intents limit exceeded", func(t *testing.T) {
   526  		require := require.New(t)
   527  		ms := &mockStorage{}
   528  		ms.On("NewKeyBuilder", appdef.NullQName, nil).Return(newKeyBuilder(testStorage, appdef.NullQName))
   529  		s, i := limitedIntentsHostStateForTest(ms)
   530  		kb, err := s.KeyBuilder(testStorage, appdef.NullQName)
   531  		require.NoError(err)
   532  
   533  		_, err = i.UpdateValue(kb, nil)
   534  
   535  		require.ErrorIs(err, ErrIntentsLimitExceeded)
   536  	})
   537  	t.Run("Should return update not supported by storage error", func(t *testing.T) {
   538  		require := require.New(t)
   539  		ms := &mockStorage{}
   540  		ms.On("NewKeyBuilder", appdef.NullQName, nil).Return(newKeyBuilder(testStorage, appdef.NullQName))
   541  		s, i := emptyHostStateForTest(ms)
   542  		kb, err := s.KeyBuilder(testStorage, appdef.NullQName)
   543  		require.NoError(err)
   544  
   545  		_, err = i.UpdateValue(kb, nil)
   546  
   547  		require.ErrorIs(err, ErrUpdateNotSupportedByStorage)
   548  	})
   549  }
   550  func TestHostState_ValidateIntents(t *testing.T) {
   551  	t.Run("Should be ok", func(t *testing.T) {
   552  		ms := &mockStorage{}
   553  		ms.
   554  			On("NewKeyBuilder", appdef.NullQName, nil).Return(newKeyBuilder(testStorage, appdef.NullQName)).
   555  			On("ProvideValueBuilder", mock.Anything, mock.Anything).Return(&viewValueBuilder{}, nil).
   556  			On("Validate", mock.Anything).Return(nil)
   557  		s := hostStateForTest(ms)
   558  		kb, err := s.KeyBuilder(testStorage, appdef.NullQName)
   559  		require.NoError(t, err)
   560  		_, err = s.NewValue(kb)
   561  		require.NoError(t, err)
   562  
   563  		err = s.ValidateIntents()
   564  
   565  		require.NoError(t, err)
   566  	})
   567  	t.Run("Should return immediately when intents are empty", func(t *testing.T) {
   568  		ms := &mockStorage{}
   569  		s := hostStateForTest(&mockStorage{})
   570  
   571  		require.NoError(t, s.ValidateIntents())
   572  
   573  		ms.AssertNotCalled(t, "Validate", mock.Anything)
   574  	})
   575  	t.Run("Should return validation error", func(t *testing.T) {
   576  		ms := &mockStorage{}
   577  		ms.
   578  			On("NewKeyBuilder", appdef.NullQName, nil).Return(newKeyBuilder(testStorage, appdef.NullQName)).
   579  			On("ProvideValueBuilder", mock.Anything, mock.Anything).Return(&viewValueBuilder{}, nil).
   580  			On("Validate", mock.Anything).Return(errTest)
   581  		s := hostStateForTest(ms)
   582  		kb, err := s.KeyBuilder(testStorage, appdef.NullQName)
   583  		require.NoError(t, err)
   584  		_, err = s.NewValue(kb)
   585  		require.NoError(t, err)
   586  
   587  		err = s.ValidateIntents()
   588  
   589  		require.ErrorIs(t, err, errTest)
   590  	})
   591  }
   592  func TestHostState_ApplyIntents(t *testing.T) {
   593  	t.Run("Should be ok", func(t *testing.T) {
   594  		ms := &mockStorage{}
   595  		ms.
   596  			On("NewKeyBuilder", appdef.NullQName, nil).Return(newKeyBuilder(testStorage, appdef.NullQName)).
   597  			On("ProvideValueBuilder", mock.Anything, mock.Anything).Return(&viewValueBuilder{}, nil).
   598  			On("ApplyBatch", mock.Anything).Return(nil)
   599  		s := hostStateForTest(ms)
   600  		kb, err := s.KeyBuilder(testStorage, appdef.NullQName)
   601  		require.NoError(t, err)
   602  		_, err = s.NewValue(kb)
   603  		require.NoError(t, err)
   604  
   605  		require.NoError(t, s.ApplyIntents())
   606  
   607  		ms.AssertExpectations(t)
   608  	})
   609  	t.Run("Should return apply batch error", func(t *testing.T) {
   610  		ms := &mockStorage{}
   611  		ms.
   612  			On("NewKeyBuilder", appdef.NullQName, nil).Return(newKeyBuilder(testStorage, appdef.NullQName)).
   613  			On("ProvideValueBuilder", mock.Anything, mock.Anything).Return(&viewValueBuilder{}, nil).
   614  			On("ApplyBatch", mock.Anything).Return(errTest)
   615  		s := hostStateForTest(ms)
   616  		kb, err := s.KeyBuilder(testStorage, appdef.NullQName)
   617  		require.NoError(t, err)
   618  		_, err = s.NewValue(kb)
   619  		require.NoError(t, err)
   620  
   621  		err = s.ApplyIntents()
   622  
   623  		require.ErrorIs(t, err, errTest)
   624  	})
   625  }
   626  func hostStateForTest(s IStateStorage) IHostState {
   627  	hs := newHostState("ForTest", 10, nil)
   628  	hs.addStorage(testStorage, s, S_GET_BATCH|S_READ|S_INSERT|S_UPDATE)
   629  	return hs
   630  }
   631  func emptyHostStateForTest(s IStateStorage) (istructs.IState, istructs.IIntents) {
   632  	bs := ProvideQueryProcessorStateFactory()(context.Background(), nilAppStructsFunc, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil).(*hostState)
   633  	bs.addStorage(testStorage, s, math.MinInt)
   634  	return bs, bs
   635  }
   636  func limitedIntentsHostStateForTest(s IStateStorage) (istructs.IState, istructs.IIntents) {
   637  	hs := newHostState("LimitedIntentsForTest", 0, nil)
   638  	hs.addStorage(testStorage, s, S_GET_BATCH|S_READ|S_INSERT|S_UPDATE)
   639  	return hs, hs
   640  }