github.com/altipla-consulting/ravendb-go-client@v0.1.3/tests/lazy_test.go (about)

     1  package tests
     2  
     3  import (
     4  	"fmt"
     5  	"testing"
     6  
     7  	"github.com/stretchr/testify/assert"
     8  )
     9  
    10  func lazyCanLazilyLoadEntity(t *testing.T, driver *RavenTestDriver) {
    11  	var err error
    12  	store := driver.getDocumentStoreMust(t)
    13  	defer store.Close()
    14  
    15  	{
    16  		session := openSessionMust(t, store)
    17  		for i := 1; i <= 6; i++ {
    18  			company := &Company{
    19  				ID: fmt.Sprintf("companies/%d", i),
    20  			}
    21  			err = session.StoreWithID(company, fmt.Sprintf("companies/%d", i))
    22  			assert.NoError(t, err)
    23  		}
    24  
    25  		err = session.SaveChanges()
    26  		assert.NoError(t, err)
    27  
    28  		session.Close()
    29  	}
    30  
    31  	{
    32  		session := openSessionMust(t, store)
    33  		query := session.Advanced().Lazily()
    34  		lazyOrder, err := query.Load("companies/1")
    35  		assert.NoError(t, err)
    36  
    37  		assert.False(t, lazyOrder.IsValueCreated())
    38  		var order *Company
    39  		err = lazyOrder.GetValue(&order)
    40  		assert.NoError(t, err)
    41  		assert.Equal(t, order.ID, "companies/1")
    42  
    43  		lazyOrders, err := session.Advanced().Lazily().LoadMulti([]string{"companies/1", "companies/2"})
    44  		assert.NoError(t, err)
    45  		assert.False(t, lazyOrders.IsValueCreated())
    46  
    47  		orders := map[string]*Company{}
    48  		err = lazyOrders.GetValue(orders)
    49  		assert.NoError(t, err)
    50  		assert.Equal(t, len(orders), 2)
    51  
    52  		fmt.Printf("!!!orders:\n%#v\n", orders)
    53  
    54  		company1 := orders["companies/1"]
    55  		company2 := orders["companies/2"]
    56  
    57  		assert.NotNil(t, company1)
    58  		assert.NotNil(t, company2)
    59  
    60  		assert.Equal(t, company1.ID, "companies/1")
    61  
    62  		assert.Equal(t, company2.ID, "companies/2")
    63  
    64  		lazyOrder, err = session.Advanced().Lazily().Load("companies/3")
    65  		assert.NoError(t, err)
    66  		assert.False(t, lazyOrder.IsValueCreated())
    67  
    68  		err = lazyOrder.GetValue(&order)
    69  		assert.NoError(t, err)
    70  		assert.Equal(t, order.ID, "companies/3")
    71  
    72  		load, err := session.Advanced().Lazily().LoadMulti([]string{"no_such_1", "no_such_2"})
    73  		assert.NoError(t, err)
    74  		missingItems := map[string]*Company{}
    75  		err = load.GetValue(missingItems)
    76  		assert.NoError(t, err)
    77  		assert.Equal(t, 2, len(missingItems))
    78  
    79  		assert.Nil(t, missingItems["no_such_1"])
    80  		assert.Nil(t, missingItems["no_such_2"])
    81  
    82  		session.Close()
    83  	}
    84  }
    85  
    86  func lazyCanExecuteAllPendingLazyOperations(t *testing.T, driver *RavenTestDriver) {
    87  	var err error
    88  	store := driver.getDocumentStoreMust(t)
    89  	defer store.Close()
    90  
    91  	{
    92  		session := openSessionMust(t, store)
    93  		for i := 1; i <= 2; i++ {
    94  			company := &Company{
    95  				ID: fmt.Sprintf("companies/%d", i),
    96  			}
    97  			err = session.StoreWithID(company, company.ID)
    98  			assert.NoError(t, err)
    99  		}
   100  
   101  		err = session.SaveChanges()
   102  		assert.NoError(t, err)
   103  
   104  		session.Close()
   105  	}
   106  
   107  	{
   108  		session := openSessionMust(t, store)
   109  		var company1Ref *Company
   110  		var company2Ref *Company
   111  		query := session.Advanced().Lazily()
   112  		fn1 := func() {
   113  			assert.NotNil(t, company1Ref)
   114  		}
   115  		lazy1, err := query.LoadWithEval("companies/1", fn1, &company1Ref)
   116  		assert.NoError(t, err)
   117  
   118  		fn2 := func() {
   119  			assert.NotNil(t, company2Ref)
   120  		}
   121  		lazy2, err := query.LoadWithEval("companies/2", fn2, &company2Ref)
   122  		assert.NoError(t, err)
   123  
   124  		assert.Nil(t, company1Ref)
   125  		assert.Nil(t, company2Ref)
   126  
   127  		_, err = session.Advanced().Eagerly().ExecuteAllPendingLazyOperations()
   128  		assert.NoError(t, err)
   129  		assert.Equal(t, company1Ref.ID, "companies/1")
   130  		assert.Equal(t, company2Ref.ID, "companies/2")
   131  
   132  		var c1, c2 *Company
   133  		err = lazy1.GetValue(&c1)
   134  		assert.NoError(t, err)
   135  		err = lazy2.GetValue(&c2)
   136  		assert.NoError(t, err)
   137  		assert.Equal(t, c1, company1Ref)
   138  		assert.Equal(t, c2, company2Ref)
   139  
   140  		session.Close()
   141  	}
   142  }
   143  
   144  func lazyWithQueuedActionsLoad(t *testing.T, driver *RavenTestDriver) {
   145  	var err error
   146  	store := driver.getDocumentStoreMust(t)
   147  	defer store.Close()
   148  
   149  	{
   150  		session := openSessionMust(t, store)
   151  		user := &User{}
   152  		user.setLastName("Oren")
   153  		err = session.StoreWithID(user, "users/1")
   154  		assert.NoError(t, err)
   155  
   156  		err = session.SaveChanges()
   157  		assert.NoError(t, err)
   158  
   159  		session.Close()
   160  	}
   161  
   162  	{
   163  		session := openSessionMust(t, store)
   164  
   165  		var userRef *User
   166  
   167  		query := session.Advanced().Lazily()
   168  		fn := func() {
   169  			assert.NotNil(t, userRef)
   170  		}
   171  		lazy, err := query.LoadWithEval("users/1", fn, &userRef)
   172  		assert.NoError(t, err)
   173  		lazy.Value = &userRef
   174  
   175  		assert.Nil(t, userRef)
   176  
   177  		_, err = session.Advanced().Eagerly().ExecuteAllPendingLazyOperations()
   178  		assert.NoError(t, err)
   179  		assert.Equal(t, *userRef.LastName, "Oren")
   180  
   181  		session.Close()
   182  	}
   183  }
   184  
   185  func lazyCanUseCacheWhenLazyLoading(t *testing.T, driver *RavenTestDriver) {
   186  	var err error
   187  	store := driver.getDocumentStoreMust(t)
   188  	defer store.Close()
   189  
   190  	{
   191  		session := openSessionMust(t, store)
   192  		user := &User{}
   193  		user.setLastName("Oren")
   194  		err = session.StoreWithID(user, "users/1")
   195  		assert.NoError(t, err)
   196  
   197  		err = session.SaveChanges()
   198  		assert.NoError(t, err)
   199  
   200  		session.Close()
   201  	}
   202  
   203  	{
   204  		session := openSessionMust(t, store)
   205  		lazyUser, err := session.Advanced().Lazily().Load("users/1")
   206  		assert.NoError(t, err)
   207  		assert.False(t, lazyUser.IsValueCreated())
   208  
   209  		var user *User
   210  		err = lazyUser.GetValue(&user)
   211  		assert.NoError(t, err)
   212  		assert.NotNil(t, user)
   213  		assert.Equal(t, user.ID, "users/1")
   214  
   215  		session.Close()
   216  	}
   217  
   218  	{
   219  		session := openSessionMust(t, store)
   220  		lazyUser, err := session.Advanced().Lazily().Load("users/1")
   221  		assert.NoError(t, err)
   222  		assert.False(t, lazyUser.IsValueCreated())
   223  
   224  		var user *User
   225  		err = lazyUser.GetValue(&user)
   226  		assert.NoError(t, err)
   227  		assert.Equal(t, *user.LastName, "Oren")
   228  
   229  		session.Close()
   230  	}
   231  }
   232  
   233  func lazDontLazyLoadAlreadyLoadedValues(t *testing.T, driver *RavenTestDriver) {
   234  	var err error
   235  	store := driver.getDocumentStoreMust(t)
   236  	defer store.Close()
   237  
   238  	{
   239  		session := openSessionMust(t, store)
   240  
   241  		user := &User{}
   242  		user.setLastName("Oren")
   243  		err = session.StoreWithID(user, "users/1")
   244  		assert.NoError(t, err)
   245  
   246  		user2 := &User{}
   247  		user2.setLastName("Marcin")
   248  		err = session.StoreWithID(user2, "users/2")
   249  		assert.NoError(t, err)
   250  
   251  		user3 := &User{}
   252  		user3.setLastName("John")
   253  		err = session.StoreWithID(user3, "users/3")
   254  		assert.NoError(t, err)
   255  
   256  		err = session.SaveChanges()
   257  		assert.NoError(t, err)
   258  
   259  		session.Close()
   260  	}
   261  
   262  	{
   263  		session := openSessionMust(t, store)
   264  
   265  		lazyLoad, err := session.Advanced().Lazily().LoadMulti([]string{"users/2", "users/3"})
   266  		assert.NoError(t, err)
   267  
   268  		//users2 := map[string]*User{}
   269  		_, err = session.Advanced().Lazily().LoadMulti([]string{"users/1", "users/3"})
   270  		assert.NoError(t, err)
   271  
   272  		var u1, u2 *User
   273  		err = session.Load(&u1, "users/2")
   274  		assert.NoError(t, err)
   275  		err = session.Load(&u2, "users/3")
   276  		assert.NoError(t, err)
   277  
   278  		_, err = session.Advanced().Eagerly().ExecuteAllPendingLazyOperations()
   279  		assert.NoError(t, err)
   280  
   281  		assert.True(t, session.Advanced().IsLoaded("users/1"))
   282  
   283  		users := map[string]*User{}
   284  		err = lazyLoad.GetValue(users)
   285  		assert.NoError(t, err)
   286  		assert.Equal(t, len(users), 2)
   287  
   288  		oldRequestCount := session.Advanced().GetNumberOfRequests()
   289  
   290  		lazyLoad, err = session.Advanced().Lazily().LoadMulti([]string{"users/3"})
   291  		assert.NoError(t, err)
   292  		_, err = session.Advanced().Eagerly().ExecuteAllPendingLazyOperations()
   293  		assert.NoError(t, err)
   294  
   295  		assert.Equal(t, session.Advanced().GetNumberOfRequests(), oldRequestCount)
   296  
   297  		session.Close()
   298  	}
   299  }
   300  
   301  func TestLazy(t *testing.T) {
   302  	driver := createTestDriver(t)
   303  	destroy := func() { destroyDriver(t, driver) }
   304  	defer recoverTest(t, destroy)
   305  
   306  	// matches order of Java tests
   307  	lazyCanExecuteAllPendingLazyOperations(t, driver)
   308  	lazyCanLazilyLoadEntity(t, driver)
   309  	lazyCanUseCacheWhenLazyLoading(t, driver)
   310  	lazyWithQueuedActionsLoad(t, driver)
   311  
   312  	// TODO: order not same as Java
   313  	lazDontLazyLoadAlreadyLoadedValues(t, driver)
   314  }