github.com/altipla-consulting/ravendb-go-client@v0.1.3/tests/crud_test.go (about) 1 package tests 2 3 import ( 4 "fmt" 5 "testing" 6 7 "github.com/altipla-consulting/ravendb-go-client" 8 "github.com/stretchr/testify/assert" 9 ) 10 11 type Family struct { 12 Names []string 13 } 14 15 type FamilyMembers struct { 16 Members []*Member 17 } 18 19 type Member struct { 20 Name string 21 Age int 22 } 23 24 type Arr1 struct { 25 Str []string 26 } 27 28 type Arr2 struct { 29 Arr1 []*Arr1 30 } 31 32 type Poc struct { 33 Name string 34 Obj *User 35 } 36 37 func crudTestEntitiesAreSavedUsingLowerCase(t *testing.T, driver *RavenTestDriver) { 38 var err error 39 store := driver.getDocumentStoreMust(t) 40 defer store.Close() 41 42 { 43 newSession := openSessionMust(t, store) 44 user1 := &User{} 45 user1.setLastName("user1") 46 47 err = newSession.StoreWithID(user1, "users/1") 48 assert.NoError(t, err) 49 err = newSession.SaveChanges() 50 assert.NoError(t, err) 51 newSession.Close() 52 } 53 54 documentsCommand, err := ravendb.NewGetDocumentsCommand([]string{"users/1"}, nil, false) 55 assert.NoError(t, err) 56 err = store.GetRequestExecutor("").ExecuteCommand(documentsCommand, nil) 57 assert.NoError(t, err) 58 59 result := documentsCommand.Result 60 userJSON := result.Results[0] 61 _, exists := userJSON["lastName"] 62 assert.True(t, exists) 63 64 { 65 newSession := openSessionMust(t, store) 66 var users []*User 67 q := newSession.Advanced().RawQuery("from Users where lastName = 'user1'") 68 err = q.GetResults(&users) 69 assert.NoError(t, err) 70 71 assert.Equal(t, len(users), 1) 72 73 newSession.Close() 74 } 75 } 76 77 func crudTestCanCustomizePropertyNamingStrategy(t *testing.T, driver *RavenTestDriver) { 78 // Note: not possible to tweak behavior of JSON serialization 79 // (entity mapper) in Go 80 } 81 82 func crudTestCrudOperations(t *testing.T, driver *RavenTestDriver) { 83 var err error 84 store := driver.getDocumentStoreMust(t) 85 defer store.Close() 86 87 { 88 newSession := openSessionMust(t, store) 89 90 user1 := &User{} 91 user1.setLastName("user1") 92 err = newSession.StoreWithID(user1, "users/1") 93 assert.NoError(t, err) 94 95 user2 := &User{} 96 user2.setName("user2") 97 user1.Age = 1 98 err = newSession.StoreWithID(user2, "users/2") 99 assert.NoError(t, err) 100 101 user3 := &User{} 102 user3.setName("user3") 103 user3.Age = 1 104 err = newSession.StoreWithID(user3, "users/3") 105 assert.NoError(t, err) 106 107 user4 := &User{} 108 user4.setName("user4") 109 err = newSession.StoreWithID(user4, "users/4") 110 assert.NoError(t, err) 111 112 err = newSession.Delete(user2) 113 assert.NoError(t, err) 114 user3.Age = 3 115 err = newSession.SaveChanges() 116 assert.NoError(t, err) 117 118 var tempUser *User 119 err = newSession.Load(&tempUser, "users/2") 120 assert.NoError(t, err) 121 assert.Nil(t, tempUser) 122 123 tempUser = nil 124 err = newSession.Load(&tempUser, "users/3") 125 assert.NoError(t, err) 126 assert.Equal(t, tempUser.Age, 3) 127 128 user1 = nil 129 err = newSession.Load(&user1, "users/1") 130 assert.NoError(t, err) 131 132 user4 = nil 133 err = newSession.Load(&user4, "users/4") 134 assert.NoError(t, err) 135 136 err = newSession.Delete(user4) 137 assert.NoError(t, err) 138 user1.Age = 10 139 err = newSession.SaveChanges() 140 assert.NoError(t, err) 141 142 tempUser = nil 143 err = newSession.Load(&tempUser, "users/4") 144 assert.NoError(t, err) 145 assert.Nil(t, tempUser) 146 tempUser = nil 147 err = newSession.Load(&tempUser, "users/1") 148 assert.NoError(t, err) 149 assert.Equal(t, tempUser.Age, 10) 150 newSession.Close() 151 } 152 } 153 154 func crudTestCrudOperationsWithWhatChanged(t *testing.T, driver *RavenTestDriver) { 155 var err error 156 store := driver.getDocumentStoreMust(t) 157 defer store.Close() 158 159 { 160 newSession := openSessionMust(t, store) 161 162 { 163 user1 := &User{} 164 user1.setLastName("user1") 165 err = newSession.StoreWithID(user1, "users/1") 166 assert.NoError(t, err) 167 168 user2 := &User{} 169 user2.setName("user2") 170 user1.Age = 1 // TODO: that's probably a bug in Java code 171 err = newSession.StoreWithID(user2, "users/2") 172 assert.NoError(t, err) 173 174 user3 := &User{} 175 user3.setName("user3") 176 user3.Age = 1 177 err = newSession.StoreWithID(user3, "users/3") 178 assert.NoError(t, err) 179 180 user4 := &User{} 181 user4.setName("user4") 182 err = newSession.StoreWithID(user4, "users/4") 183 assert.NoError(t, err) 184 185 err = newSession.Delete(user2) 186 assert.NoError(t, err) 187 user3.Age = 3 188 189 changes, _ := newSession.Advanced().WhatChanged() 190 assert.Equal(t, len(changes), 4) 191 192 err = newSession.SaveChanges() 193 assert.NoError(t, err) 194 } 195 196 { 197 var user1, user2, user3, user4 *User 198 err = newSession.Load(&user2, "users/2") 199 assert.NoError(t, err) 200 assert.Nil(t, user2) 201 202 err = newSession.Load(&user3, "users/3") 203 assert.NoError(t, err) 204 assert.Equal(t, user3.Age, 3) 205 206 err = newSession.Load(&user1, "users/1") 207 assert.NoError(t, err) 208 assert.NotNil(t, user1) 209 210 err = newSession.Load(&user4, "users/4") 211 assert.NoError(t, err) 212 assert.NotNil(t, user4) 213 214 err = newSession.Delete(user4) 215 assert.NoError(t, err) 216 217 user1.Age = 10 218 219 var changes map[string][]*ravendb.DocumentsChanges 220 changes, err = newSession.Advanced().WhatChanged() 221 assert.NoError(t, err) 222 assert.Equal(t, len(changes), 2) 223 224 err = newSession.SaveChanges() 225 assert.NoError(t, err) 226 227 } 228 229 var tempUser *User 230 err = newSession.Load(&tempUser, "users/4") 231 assert.NoError(t, err) 232 assert.Nil(t, tempUser) 233 234 tempUser = nil 235 err = newSession.Load(&tempUser, "users/1") 236 assert.NoError(t, err) 237 assert.Equal(t, tempUser.Age, 10) 238 newSession.Close() 239 } 240 } 241 242 func crudTestCrudOperationsWithArrayInObject(t *testing.T, driver *RavenTestDriver) { 243 var err error 244 store := driver.getDocumentStoreMust(t) 245 defer store.Close() 246 247 { 248 newSession := openSessionMust(t, store) 249 family := &Family{} 250 family.Names = []string{"Hibernating Rhinos", "RavenDB"} 251 err = newSession.StoreWithID(family, "family/1") 252 assert.NoError(t, err) 253 err = newSession.SaveChanges() 254 assert.NoError(t, err) 255 256 var newFamily *Family 257 err = newSession.Load(&newFamily, "family/1") 258 assert.NoError(t, err) 259 newFamily.Names = []string{"Toli", "Mitzi", "Boki"} 260 changes, _ := newSession.Advanced().WhatChanged() 261 assert.Equal(t, len(changes), 1) 262 err = newSession.SaveChanges() 263 assert.NoError(t, err) 264 newSession.Close() 265 } 266 } 267 268 func crudTestCrudOperationsWithArrayInObject2(t *testing.T, driver *RavenTestDriver) { 269 var err error 270 store := driver.getDocumentStoreMust(t) 271 defer store.Close() 272 273 { 274 newSession := openSessionMust(t, store) 275 family := &Family{} 276 family.Names = []string{"Hibernating Rhinos", "RavenDB"} 277 err = newSession.StoreWithID(family, "family/1") 278 assert.NoError(t, err) 279 err = newSession.SaveChanges() 280 assert.NoError(t, err) 281 282 var newFamily *Family 283 err = newSession.Load(&newFamily, "family/1") 284 assert.NoError(t, err) 285 newFamily.Names = []string{"Hibernating Rhinos", "RavenDB"} 286 changes, _ := newSession.Advanced().WhatChanged() 287 assert.Equal(t, len(changes), 0) 288 289 newFamily.Names = []string{"RavenDB", "Hibernating Rhinos"} 290 changes, _ = newSession.Advanced().WhatChanged() 291 assert.Equal(t, len(changes), 1) 292 293 err = newSession.SaveChanges() 294 assert.NoError(t, err) 295 newSession.Close() 296 } 297 } 298 299 func crudTestCrudOperationsWithArrayInObject3(t *testing.T, driver *RavenTestDriver) { 300 var err error 301 store := driver.getDocumentStoreMust(t) 302 defer store.Close() 303 304 { 305 newSession := openSessionMust(t, store) 306 family := &Family{} 307 family.Names = []string{"Hibernating Rhinos", "RavenDB"} 308 err = newSession.StoreWithID(family, "family/1") 309 assert.NoError(t, err) 310 err = newSession.SaveChanges() 311 assert.NoError(t, err) 312 313 var newFamily *Family 314 err = newSession.Load(&newFamily, "family/1") 315 assert.NoError(t, err) 316 newFamily.Names = []string{"RavenDB"} 317 changes, _ := newSession.Advanced().WhatChanged() 318 assert.Equal(t, len(changes), 1) 319 320 err = newSession.SaveChanges() 321 assert.NoError(t, err) 322 newSession.Close() 323 } 324 } 325 326 func crudTestCrudOperationsWithArrayInObject4(t *testing.T, driver *RavenTestDriver) { 327 var err error 328 store := driver.getDocumentStoreMust(t) 329 defer store.Close() 330 331 { 332 newSession := openSessionMust(t, store) 333 family := &Family{} 334 family.Names = []string{"Hibernating Rhinos", "RavenDB"} 335 err = newSession.StoreWithID(family, "family/1") 336 assert.NoError(t, err) 337 err = newSession.SaveChanges() 338 assert.NoError(t, err) 339 340 var newFamily *Family 341 err = newSession.Load(&newFamily, "family/1") 342 assert.NoError(t, err) 343 newFamily.Names = []string{"RavenDB", "Hibernating Rhinos", "Toli", "Mitzi", "Boki"} 344 changes, _ := newSession.Advanced().WhatChanged() 345 assert.Equal(t, len(changes), 1) 346 347 err = newSession.SaveChanges() 348 assert.NoError(t, err) 349 newSession.Close() 350 } 351 } 352 353 func crudTestCrudOperationsWithNull(t *testing.T, driver *RavenTestDriver) { 354 var err error 355 store := driver.getDocumentStoreMust(t) 356 defer store.Close() 357 358 { 359 newSession := openSessionMust(t, store) 360 user := &User{} 361 362 err = newSession.StoreWithID(user, "users/1") 363 assert.NoError(t, err) 364 err = newSession.SaveChanges() 365 assert.NoError(t, err) 366 367 var user2 *User 368 err = newSession.Load(&user2, "users/1") 369 assert.NoError(t, err) 370 WhatChanged, _ := newSession.Advanced().WhatChanged() 371 assert.Equal(t, len(WhatChanged), 0) 372 373 user2.Age = 3 374 WhatChanged, _ = newSession.Advanced().WhatChanged() 375 assert.Equal(t, len(WhatChanged), 1) 376 newSession.Close() 377 } 378 } 379 380 func crudTestCrudOperationsWithArrayOfObjects(t *testing.T, driver *RavenTestDriver) { 381 var err error 382 store := driver.getDocumentStoreMust(t) 383 defer store.Close() 384 385 { 386 newSession := openSessionMust(t, store) 387 388 member1 := &Member{} 389 member1.Name = "Hibernating Rhinos" 390 member1.Age = 8 391 392 member2 := &Member{} 393 member2.Name = "RavenDB" 394 member2.Age = 4 395 396 family := &FamilyMembers{} 397 family.Members = []*Member{member1, member2} 398 399 err = newSession.StoreWithID(family, "family/1") 400 assert.NoError(t, err) 401 err = newSession.SaveChanges() 402 assert.NoError(t, err) 403 404 member1 = &Member{} 405 member1.Name = "RavenDB" 406 member1.Age = 4 407 408 member2 = &Member{} 409 member2.Name = "Hibernating Rhinos" 410 member2.Age = 8 411 412 var newFamily *FamilyMembers 413 err = newSession.Load(&newFamily, "family/1") 414 assert.NoError(t, err) 415 newFamily.Members = []*Member{member1, member2} 416 417 changes, _ := newSession.Advanced().WhatChanged() 418 assert.Equal(t, len(changes), 1) 419 420 family1Changes := changes["family/1"] 421 assert.Equal(t, len(family1Changes), 4) 422 423 // Note: order or fields differs from Java. In Java the order seems to be the order 424 // of declaration in a class. In Go it's alphabetical 425 { 426 change := family1Changes[0] 427 assert.Equal(t, change.FieldName, "Age") 428 assert.Equal(t, change.Change, ravendb.DocumentChangeFieldChanged) 429 oldVal := change.FieldOldValue 430 assert.Equal(t, oldVal, 8.0) 431 newVal := change.FieldNewValue 432 assert.Equal(t, newVal, 4.0) 433 } 434 435 { 436 change := family1Changes[1] 437 assert.Equal(t, change.FieldName, "Name") 438 assert.Equal(t, change.Change, ravendb.DocumentChangeFieldChanged) 439 oldValStr := fmt.Sprintf("%#v", change.FieldOldValue) 440 assert.Equal(t, oldValStr, "\"Hibernating Rhinos\"") 441 newValStr := fmt.Sprintf("%#v", change.FieldNewValue) 442 assert.Equal(t, newValStr, "\"RavenDB\"") 443 } 444 445 { 446 change := family1Changes[2] 447 assert.Equal(t, change.FieldName, "Age") 448 assert.Equal(t, change.Change, ravendb.DocumentChangeFieldChanged) 449 oldVal := change.FieldOldValue 450 assert.Equal(t, oldVal, 4.0) 451 newVal := change.FieldNewValue 452 assert.Equal(t, newVal, 8.0) 453 } 454 455 { 456 change := family1Changes[3] 457 assert.Equal(t, change.FieldName, "Name") 458 assert.Equal(t, change.Change, ravendb.DocumentChangeFieldChanged) 459 oldValStr := fmt.Sprintf("%#v", change.FieldOldValue) 460 assert.Equal(t, oldValStr, "\"RavenDB\"") 461 newValStr := fmt.Sprintf("%#v", change.FieldNewValue) 462 assert.Equal(t, newValStr, "\"Hibernating Rhinos\"") 463 } 464 465 member1 = &Member{} 466 member1.Name = "Toli" 467 member1.Age = 5 468 469 member2 = &Member{} 470 member2.Name = "Boki" 471 member2.Age = 15 472 473 newFamily.Members = []*Member{member1, member2} 474 changes, _ = newSession.Advanced().WhatChanged() 475 476 assert.Equal(t, len(changes), 1) 477 478 family1Changes = changes["family/1"] 479 assert.Equal(t, len(family1Changes), 4) 480 481 // Note: the order of fields in Go is different than in Java. In Go it's alphabetic. 482 { 483 change := family1Changes[0] 484 assert.Equal(t, change.FieldName, "Age") 485 assert.Equal(t, change.Change, ravendb.DocumentChangeFieldChanged) 486 oldVal := change.FieldOldValue 487 assert.Equal(t, oldVal, 8.0) 488 newVal := change.FieldNewValue 489 assert.Equal(t, newVal, 5.0) 490 } 491 492 { 493 change := family1Changes[1] 494 assert.Equal(t, change.FieldName, "Name") 495 assert.Equal(t, change.Change, ravendb.DocumentChangeFieldChanged) 496 oldValStr := fmt.Sprintf("%#v", change.FieldOldValue) 497 assert.Equal(t, oldValStr, "\"Hibernating Rhinos\"") 498 newValStr := fmt.Sprintf("%#v", change.FieldNewValue) 499 assert.Equal(t, newValStr, "\"Toli\"") 500 } 501 502 { 503 change := family1Changes[2] 504 assert.Equal(t, change.FieldName, "Age") 505 assert.Equal(t, change.Change, ravendb.DocumentChangeFieldChanged) 506 oldVal := change.FieldOldValue 507 assert.Equal(t, oldVal, 4.0) 508 newVal := change.FieldNewValue 509 assert.Equal(t, newVal, 15.0) 510 } 511 512 { 513 change := family1Changes[3] 514 assert.Equal(t, change.FieldName, "Name") 515 assert.Equal(t, change.Change, ravendb.DocumentChangeFieldChanged) 516 oldValStr := fmt.Sprintf("%#v", change.FieldOldValue) 517 assert.Equal(t, oldValStr, "\"RavenDB\"") 518 newValStr := fmt.Sprintf("%#v", change.FieldNewValue) 519 assert.Equal(t, newValStr, "\"Boki\"") 520 } 521 newSession.Close() 522 } 523 } 524 525 func crudTestCrudOperationsWithArrayOfArrays(t *testing.T, driver *RavenTestDriver) { 526 var err error 527 store := driver.getDocumentStoreMust(t) 528 defer store.Close() 529 530 { 531 newSession := openSessionMust(t, store) 532 a1 := &Arr1{} 533 a1.Str = []string{"a", "b"} 534 535 a2 := &Arr1{} 536 a2.Str = []string{"c", "d"} 537 538 arr := &Arr2{} 539 arr.Arr1 = []*Arr1{a1, a2} 540 541 err = newSession.StoreWithID(arr, "arr/1") 542 assert.NoError(t, err) 543 err = newSession.SaveChanges() 544 assert.NoError(t, err) 545 546 var newArr *Arr2 547 err = newSession.Load(&newArr, "arr/1") 548 assert.NoError(t, err) 549 550 a1 = &Arr1{} 551 a1.Str = []string{"d", "c"} 552 553 a2 = &Arr1{} 554 a2.Str = []string{"a", "b"} 555 556 newArr.Arr1 = []*Arr1{a1, a2} 557 558 WhatChanged, _ := newSession.Advanced().WhatChanged() 559 assert.Equal(t, 1, len(WhatChanged)) 560 561 change := WhatChanged["arr/1"] 562 assert.Equal(t, len(change), 4) 563 564 { 565 oldValueStr := fmt.Sprintf("%#v", change[0].FieldOldValue) 566 assert.Equal(t, oldValueStr, "\"a\"") 567 newValueStr := fmt.Sprintf("%#v", change[0].FieldNewValue) 568 assert.Equal(t, newValueStr, "\"d\"") 569 } 570 571 { 572 oldValueStr := fmt.Sprintf("%#v", change[1].FieldOldValue) 573 assert.Equal(t, oldValueStr, "\"b\"") 574 newValueStr := fmt.Sprintf("%#v", change[1].FieldNewValue) 575 assert.Equal(t, newValueStr, "\"c\"") 576 } 577 578 { 579 oldValueStr := fmt.Sprintf("%#v", change[2].FieldOldValue) 580 assert.Equal(t, oldValueStr, "\"c\"") 581 newValueStr := fmt.Sprintf("%#v", change[2].FieldNewValue) 582 assert.Equal(t, newValueStr, "\"a\"") 583 } 584 585 { 586 oldValueStr := fmt.Sprintf("%#v", change[3].FieldOldValue) 587 assert.Equal(t, oldValueStr, "\"d\"") 588 newValueStr := fmt.Sprintf("%#v", change[3].FieldNewValue) 589 assert.Equal(t, newValueStr, "\"b\"") 590 } 591 592 err = newSession.SaveChanges() 593 assert.NoError(t, err) 594 newSession.Close() 595 } 596 597 { 598 newSession := openSessionMust(t, store) 599 var newArr *Arr2 600 err = newSession.Load(&newArr, "arr/1") 601 assert.NoError(t, err) 602 a1 := &Arr1{} 603 a1.Str = []string{"q", "w"} 604 605 a2 := &Arr1{} 606 a2.Str = []string{"a", "b"} 607 newArr.Arr1 = []*Arr1{a1, a2} 608 609 WhatChanged, _ := newSession.Advanced().WhatChanged() 610 assert.Equal(t, len(WhatChanged), 1) 611 612 change := WhatChanged["arr/1"] 613 assert.Equal(t, len(change), 2) 614 615 { 616 oldValueStr := fmt.Sprintf("%#v", change[0].FieldOldValue) 617 assert.Equal(t, oldValueStr, "\"d\"") 618 newValueStr := fmt.Sprintf("%#v", change[0].FieldNewValue) 619 assert.Equal(t, newValueStr, "\"q\"") 620 } 621 622 { 623 oldValueStr := fmt.Sprintf("%#v", change[1].FieldOldValue) 624 assert.Equal(t, oldValueStr, "\"c\"") 625 newValueStr := fmt.Sprintf("%#v", change[1].FieldNewValue) 626 assert.Equal(t, newValueStr, "\"w\"") 627 } 628 629 err = newSession.SaveChanges() 630 assert.NoError(t, err) 631 newSession.Close() 632 } 633 } 634 635 func crudTestCrudCanUpdatePropertyToNull(t *testing.T, driver *RavenTestDriver) { 636 var err error 637 store := driver.getDocumentStoreMust(t) 638 defer store.Close() 639 640 { 641 { 642 newSession := openSessionMust(t, store) 643 user1 := &User{} 644 user1.setLastName("user1") 645 err = newSession.StoreWithID(user1, "users/1") 646 assert.NoError(t, err) 647 err = newSession.SaveChanges() 648 assert.NoError(t, err) 649 newSession.Close() 650 } 651 652 { 653 newSession := openSessionMust(t, store) 654 var user *User 655 err = newSession.Load(&user, "users/1") 656 assert.NoError(t, err) 657 user.Name = nil 658 err = newSession.SaveChanges() 659 assert.NoError(t, err) 660 newSession.Close() 661 } 662 663 { 664 newSession := openSessionMust(t, store) 665 var user *User 666 err = newSession.Load(&user, "users/1") 667 assert.NoError(t, err) 668 assert.Nil(t, user.Name) 669 newSession.Close() 670 } 671 } 672 } 673 674 func crudTestCrudCanUpdatePropertyFromNullToObject(t *testing.T, driver *RavenTestDriver) { 675 var err error 676 store := driver.getDocumentStoreMust(t) 677 defer store.Close() 678 679 { 680 session := openSessionMust(t, store) 681 poc := &Poc{} 682 poc.Name = "aviv" 683 684 err = session.StoreWithID(poc, "pocs/1") 685 assert.NoError(t, err) 686 err = session.SaveChanges() 687 assert.NoError(t, err) 688 session.Close() 689 } 690 691 { 692 session := openSessionMust(t, store) 693 var poc *Poc 694 err = session.Load(&poc, "pocs/1") 695 assert.NoError(t, err) 696 assert.Nil(t, poc.Obj) 697 698 user := &User{} 699 poc.Obj = user 700 err = session.SaveChanges() 701 assert.NoError(t, err) 702 session.Close() 703 } 704 705 { 706 session := openSessionMust(t, store) 707 var poc *Poc 708 err = session.Load(&poc, "pocs/1") 709 assert.NoError(t, err) 710 assert.NotNil(t, poc.Obj) 711 session.Close() 712 } 713 } 714 715 func TestCrud(t *testing.T) { 716 driver := createTestDriver(t) 717 destroy := func() { destroyDriver(t, driver) } 718 defer recoverTest(t, destroy) 719 720 // matches order of Java tests 721 crudTestCrudOperationsWithNull(t, driver) 722 crudTestCrudOperationsWithArrayOfObjects(t, driver) 723 crudTestCrudOperationsWithWhatChanged(t, driver) 724 crudTestCrudOperations(t, driver) 725 crudTestCrudOperationsWithArrayInObject(t, driver) 726 crudTestCrudCanUpdatePropertyToNull(t, driver) 727 crudTestEntitiesAreSavedUsingLowerCase(t, driver) 728 crudTestCanCustomizePropertyNamingStrategy(t, driver) 729 crudTestCrudCanUpdatePropertyFromNullToObject(t, driver) 730 crudTestCrudOperationsWithArrayInObject2(t, driver) 731 crudTestCrudOperationsWithArrayInObject3(t, driver) 732 crudTestCrudOperationsWithArrayInObject4(t, driver) 733 crudTestCrudOperationsWithArrayOfArrays(t, driver) 734 }