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 }