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 }