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  }