github.com/altipla-consulting/ravendb-go-client@v0.1.3/tests/attachments_session_test.go (about) 1 package tests 2 3 import ( 4 "bytes" 5 "io/ioutil" 6 "runtime" 7 "sort" 8 "strconv" 9 "testing" 10 11 "github.com/altipla-consulting/ravendb-go-client" 12 "github.com/stretchr/testify/assert" 13 ) 14 15 func attachmentsSessionPutAttachments(t *testing.T, driver *RavenTestDriver) { 16 var err error 17 store := driver.getDocumentStoreMust(t) 18 defer store.Close() 19 names := []string{"profile.png", "background-photo.jpg", "fileNAME_#$1^%_בעברית.txt"} 20 21 { 22 session := openSessionMust(t, store) 23 profileStream := bytes.NewBuffer([]byte{1, 2, 3}) 24 backgroundStream := bytes.NewBuffer([]byte{10, 20, 30, 40, 50}) 25 fileStream := bytes.NewBuffer([]byte{1, 2, 3, 4, 5}) 26 27 user := &User{} 28 user.setName("Fitzchak") 29 30 err = session.StoreWithID(user, "users/1") 31 assert.NoError(t, err) 32 33 err = session.Advanced().Attachments().StoreByID("users/1", names[0], profileStream, "image/png") 34 assert.NoError(t, err) 35 err = session.Advanced().Attachments().Store(user, names[1], backgroundStream, "ImGgE/jPeG") 36 assert.NoError(t, err) 37 err = session.Advanced().Attachments().Store(user, names[2], fileStream, "") 38 assert.NoError(t, err) 39 40 err = session.SaveChanges() 41 assert.NoError(t, err) 42 43 session.Close() 44 } 45 46 { 47 session := openSessionMust(t, store) 48 49 var user *User 50 err = session.Load(&user, "users/1") 51 assert.NoError(t, err) 52 metadata, err := session.Advanced().GetMetadataFor(user) 53 assert.NoError(t, err) 54 v, ok := metadata.Get(ravendb.MetadataFlags) 55 assert.True(t, ok) 56 vStr := v.(string) 57 assert.Equal(t, vStr, "HasAttachments") 58 59 attachmentsI, ok := metadata.Get(ravendb.MetadataAttachments) 60 assert.True(t, ok) 61 attachments := attachmentsI.([]interface{}) 62 assert.Equal(t, len(attachments), 3) 63 64 sort.Strings(names) 65 var gotNames []string 66 for _, v := range attachments { 67 68 //TODO: dig deeper into what type metadata.Get() returns. It used to be 69 // *ravendb.MetadataDictionary and is now map[string]interface{} 70 //attachment := v.(*ravendb.MetadataDictionary) 71 //name, ok := attachment.Get("Name") 72 73 attachment := v.(map[string]interface{}) 74 name, ok := attachment["Name"] 75 76 assert.True(t, ok) 77 gotNames = append(gotNames, name.(string)) 78 } 79 sort.Strings(gotNames) 80 assert.Equal(t, names, gotNames) 81 session.Close() 82 } 83 } 84 85 func attachmentsSessionThrowIfStreamIsUseTwice(t *testing.T, driver *RavenTestDriver) { 86 var err error 87 store := driver.getDocumentStoreMust(t) 88 defer store.Close() 89 90 { 91 session := openSessionMust(t, store) 92 93 stream := bytes.NewBuffer([]byte{1, 2, 3}) 94 95 user := &User{} 96 user.setName("Fitzchak") 97 err = session.StoreWithID(user, "users/1") 98 assert.NoError(t, err) 99 100 err = session.Advanced().Attachments().Store(user, "profile", stream, "image/png") 101 assert.NoError(t, err) 102 err = session.Advanced().Attachments().Store(user, "other", stream, "") 103 assert.NoError(t, err) 104 105 err = session.SaveChanges() 106 assert.Error(t, err) 107 _, ok := err.(*ravendb.IllegalStateError) 108 assert.True(t, ok) 109 110 session.Close() 111 } 112 } 113 114 func attachmentsSessionThrowWhenTwoAttachmentsWithTheSameNameInSession(t *testing.T, driver *RavenTestDriver) { 115 var err error 116 store := driver.getDocumentStoreMust(t) 117 defer store.Close() 118 119 { 120 session := openSessionMust(t, store) 121 122 stream := bytes.NewBuffer([]byte{1, 2, 3}) 123 stream2 := bytes.NewBuffer([]byte{1, 2, 3, 4, 5}) 124 125 user := &User{} 126 user.setName("Fitzchak") 127 err = session.StoreWithID(user, "users/1") 128 assert.NoError(t, err) 129 130 err = session.Advanced().Attachments().Store(user, "profile", stream, "image/png") 131 assert.NoError(t, err) 132 133 err = session.Advanced().Attachments().Store(user, "profile", stream2, "") 134 assert.Error(t, err) 135 _, ok := err.(*ravendb.IllegalStateError) 136 assert.True(t, ok) 137 138 session.Close() 139 } 140 } 141 142 func attachmentsSessionPutDocumentAndAttachmentAndDeleteShouldThrow(t *testing.T, driver *RavenTestDriver) { 143 var err error 144 store := driver.getDocumentStoreMust(t) 145 defer store.Close() 146 147 { 148 session := openSessionMust(t, store) 149 profileStream := bytes.NewBuffer([]byte{1, 2, 3}) 150 user := &User{} 151 user.setName("Fitzchak") 152 err = session.StoreWithID(user, "users/1") 153 assert.NoError(t, err) 154 155 err = session.Advanced().Attachments().Store(user, "profile.png", profileStream, "image/png") 156 assert.NoError(t, err) 157 158 err = session.Delete(user) 159 assert.NoError(t, err) 160 161 err = session.SaveChanges() 162 assert.Error(t, err) 163 _, ok := err.(*ravendb.IllegalStateError) 164 assert.True(t, ok) 165 166 session.Close() 167 } 168 } 169 170 func attachmentsSessionDeleteAttachments(t *testing.T, driver *RavenTestDriver) { 171 var err error 172 store := driver.getDocumentStoreMust(t) 173 defer store.Close() 174 175 { 176 session := openSessionMust(t, store) 177 178 user := &User{} 179 user.setName("Fitzchak") 180 err = session.StoreWithID(user, "users/1") 181 assert.NoError(t, err) 182 183 stream1 := bytes.NewBuffer([]byte{1, 2, 3}) 184 stream2 := bytes.NewBuffer([]byte{1, 2, 3, 4, 5, 6}) 185 stream3 := bytes.NewBuffer([]byte{1, 2, 3, 4, 5, 6, 7, 8, 9}) 186 stream4 := bytes.NewBuffer([]byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}) 187 188 err = session.Advanced().Attachments().Store(user, "file1", stream1, "image/png") 189 assert.NoError(t, err) 190 err = session.Advanced().Attachments().Store(user, "file2", stream2, "image/png") 191 assert.NoError(t, err) 192 err = session.Advanced().Attachments().Store(user, "file3", stream3, "image/png") 193 assert.NoError(t, err) 194 err = session.Advanced().Attachments().Store(user, "file4", stream4, "image/png") 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 206 var user *User 207 err = session.Load(&user, "users/1") 208 assert.NoError(t, err) 209 210 // test get attachment by its name 211 { 212 var attachmentResult *ravendb.AttachmentResult 213 attachmentResult, err = session.Advanced().Attachments().GetByID("users/1", "file2") 214 assert.NoError(t, err) 215 name := attachmentResult.Details.Name 216 assert.Equal(t, name, "file2") 217 attachmentResult.Close() 218 } 219 220 err = session.Advanced().Attachments().DeleteByID("users/1", "file2") 221 assert.NoError(t, err) 222 err = session.Advanced().Attachments().Delete(user, "file4") 223 assert.NoError(t, err) 224 err = session.SaveChanges() 225 assert.NoError(t, err) 226 227 session.Close() 228 } 229 230 { 231 session := openSessionMust(t, store) 232 233 var user *User 234 err = session.Load(&user, "users/1") 235 assert.NoError(t, err) 236 237 metadata, err := session.Advanced().GetMetadataFor(user) 238 assert.NoError(t, err) 239 240 v, ok := metadata.Get(ravendb.MetadataFlags) 241 assert.True(t, ok) 242 assert.Equal(t, v, "HasAttachments") 243 244 attachmentsI, ok := metadata.Get(ravendb.MetadataAttachments) 245 assert.True(t, ok) 246 attachments := attachmentsI.([]interface{}) 247 248 assert.Equal(t, len(attachments), 2) 249 250 { 251 result, err := session.Advanced().Attachments().GetByID("users/1", "file1") 252 assert.NoError(t, err) 253 r := result.Data 254 file1Bytes, err := ioutil.ReadAll(r) 255 assert.NoError(t, err) 256 257 assert.Equal(t, len(file1Bytes), 3) 258 259 result.Close() 260 } 261 session.Close() 262 } 263 } 264 265 func attachmentsSessionDeleteAttachmentsUsingCommand(t *testing.T, driver *RavenTestDriver) { 266 var err error 267 store := driver.getDocumentStoreMust(t) 268 defer store.Close() 269 270 { 271 session := openSessionMust(t, store) 272 273 user := &User{} 274 user.setName("Fitzchak") 275 err = session.StoreWithID(user, "users/1") 276 assert.NoError(t, err) 277 278 stream1 := bytes.NewBuffer([]byte{1, 2, 3}) 279 stream2 := bytes.NewBuffer([]byte{1, 2, 3, 4, 5, 6}) 280 281 err = session.Advanced().Attachments().Store(user, "file1", stream1, "image/png") 282 assert.NoError(t, err) 283 err = session.Advanced().Attachments().Store(user, "file2", stream2, "image/png") 284 assert.NoError(t, err) 285 286 err = session.SaveChanges() 287 assert.NoError(t, err) 288 289 session.Close() 290 } 291 292 op := ravendb.NewDeleteAttachmentOperation("users/1", "file2", nil) 293 err = store.Operations().Send(op, nil) 294 assert.NoError(t, err) 295 296 { 297 session := openSessionMust(t, store) 298 299 var user *User 300 err = session.Load(&user, "users/1") 301 assert.NoError(t, err) 302 303 metadata, err := session.Advanced().GetMetadataFor(user) 304 assert.NoError(t, err) 305 306 v, ok := metadata.Get(ravendb.MetadataFlags) 307 assert.True(t, ok) 308 assert.Equal(t, v, "HasAttachments") 309 310 attachmentsI, ok := metadata.Get(ravendb.MetadataAttachments) 311 assert.True(t, ok) 312 attachments := attachmentsI.([]interface{}) 313 assert.Equal(t, len(attachments), 1) 314 315 { 316 result, err := session.Advanced().Attachments().GetByID("users/1", "file1") 317 assert.NoError(t, err) 318 r := result.Data 319 file1Bytes, err := ioutil.ReadAll(r) 320 assert.NoError(t, err) 321 assert.Equal(t, len(file1Bytes), 3) 322 323 result.Close() 324 } 325 326 session.Close() 327 } 328 } 329 330 func attachmentsSessionGetAttachmentReleasesResources(t *testing.T, driver *RavenTestDriver) { 331 count := 30 332 var err error 333 store := driver.getDocumentStoreMust(t) 334 defer store.Close() 335 336 { 337 session := openSessionMust(t, store) 338 339 user := &User{} 340 err = session.StoreWithID(user, "users/1") 341 assert.NoError(t, err) 342 err = session.SaveChanges() 343 assert.NoError(t, err) 344 345 session.Close() 346 } 347 348 for i := 0; i < count; i++ { 349 session := openSessionMust(t, store) 350 351 stream1 := bytes.NewBuffer([]byte{1, 2, 3}) 352 err = session.Advanced().Attachments().StoreByID("users/1", "file"+strconv.Itoa(i), stream1, "image/png") 353 assert.NoError(t, err) 354 err = session.SaveChanges() 355 assert.NoError(t, err) 356 357 session.Close() 358 } 359 360 for i := 0; i < count; i++ { 361 session := openSessionMust(t, store) 362 result, err := session.Advanced().Attachments().GetByID("users/1", "file"+strconv.Itoa(i)) 363 assert.NoError(t, err) 364 // don't read data as it marks entity as consumed 365 result.Close() 366 session.Close() 367 } 368 } 369 370 func attachmentsSessionDeleteDocumentAndThanItsAttachmentsThisIsNoOpButShouldBeSupported(t *testing.T, driver *RavenTestDriver) { 371 var err error 372 store := driver.getDocumentStoreMust(t) 373 defer store.Close() 374 375 { 376 session := openSessionMust(t, store) 377 378 user := &User{} 379 user.setName("Fitzchak") 380 err = session.StoreWithID(user, "users/1") 381 assert.NoError(t, err) 382 383 stream := bytes.NewBuffer([]byte{1, 2, 3}) 384 385 err = session.Advanced().Attachments().Store(user, "file", stream, "image/png") 386 assert.NoError(t, err) 387 388 err = session.SaveChanges() 389 assert.NoError(t, err) 390 391 session.Close() 392 } 393 394 { 395 session := openSessionMust(t, store) 396 397 var user *User 398 err = session.Load(&user, "users/1") 399 assert.NoError(t, err) 400 401 err = session.Delete(user) 402 assert.NoError(t, err) 403 err = session.Advanced().Attachments().Delete(user, "file") 404 assert.NoError(t, err) 405 err = session.Advanced().Attachments().Delete(user, "file") // this should be no-op 406 assert.NoError(t, err) 407 408 err = session.SaveChanges() 409 assert.NoError(t, err) 410 411 session.Close() 412 } 413 } 414 415 func attachmentsSessionDeleteDocumentByCommandAndThanItsAttachmentsThisIsNoOpButShouldBeSupported(t *testing.T, driver *RavenTestDriver) { 416 var err error 417 store := driver.getDocumentStoreMust(t) 418 defer store.Close() 419 420 { 421 session := openSessionMust(t, store) 422 user := &User{} 423 user.setName("Fitzchak") 424 err = session.StoreWithID(user, "users/1") 425 assert.NoError(t, err) 426 427 stream := bytes.NewBuffer([]byte{1, 2, 3}) 428 429 err = session.Advanced().Attachments().Store(user, "file", stream, "image/png") 430 assert.NoError(t, err) 431 err = session.SaveChanges() 432 assert.NoError(t, err) 433 434 session.Close() 435 } 436 437 { 438 session := openSessionMust(t, store) 439 440 cd := ravendb.NewDeleteCommandData("users/1", "") 441 session.Advanced().Defer(cd) 442 err = session.Advanced().Attachments().DeleteByID("users/1", "file") 443 assert.NoError(t, err) 444 err = session.Advanced().Attachments().DeleteByID("users/1", "file") 445 assert.NoError(t, err) 446 447 err = session.SaveChanges() 448 assert.NoError(t, err) 449 450 session.Close() 451 } 452 } 453 454 func attachmentsSessionGetAttachmentNames(t *testing.T, driver *RavenTestDriver) { 455 var err error 456 store := driver.getDocumentStoreMust(t) 457 defer store.Close() 458 459 names := []string{"profile.png"} 460 461 { 462 session := openSessionMust(t, store) 463 464 profileStream := bytes.NewBuffer([]byte{1, 2, 3}) 465 466 user := &User{} 467 user.setName("Fitzchak") 468 err = session.StoreWithID(user, "users/1") 469 assert.NoError(t, err) 470 471 err = session.Advanced().Attachments().StoreByID("users/1", names[0], profileStream, "image/png") 472 assert.NoError(t, err) 473 474 err = session.SaveChanges() 475 assert.NoError(t, err) 476 477 session.Close() 478 } 479 480 { 481 session := openSessionMust(t, store) 482 483 var user *User 484 err = session.Load(&user, "users/1") 485 assert.NoError(t, err) 486 487 attachments, err := session.Advanced().Attachments().GetNames(user) 488 assert.NoError(t, err) 489 490 assert.Equal(t, len(attachments), 1) 491 492 attachment := attachments[0] 493 assert.Equal(t, attachment.ContentType, "image/png") 494 assert.Equal(t, attachment.Name, names[0]) 495 assert.Equal(t, attachment.Size, int64(3)) 496 497 session.Close() 498 } 499 500 // go: coverage for DocumentSessionAttachments.Get() 501 { 502 session := openSessionMust(t, store) 503 504 var user *User 505 err = session.Load(&user, "users/1") 506 assert.NoError(t, err) 507 508 attachment, err := session.Advanced().Attachments().Get(user, names[0]) 509 assert.NoError(t, err) 510 assert.Equal(t, attachment.Details.Name, names[0]) 511 512 session.Close() 513 } 514 } 515 516 func attachmentsSessionAttachmentExists(t *testing.T, driver *RavenTestDriver) { 517 var err error 518 store := driver.getDocumentStoreMust(t) 519 defer store.Close() 520 521 { 522 session := openSessionMust(t, store) 523 524 stream := bytes.NewBuffer([]byte{1, 2, 3}) 525 526 user := &User{} 527 user.setName("Fitzchak") 528 529 err = session.StoreWithID(user, "users/1") 530 assert.NoError(t, err) 531 532 err = session.Advanced().Attachments().StoreByID("users/1", "profile", stream, "image/png") 533 assert.NoError(t, err) 534 err = session.SaveChanges() 535 assert.NoError(t, err) 536 537 session.Close() 538 } 539 540 { 541 session := openSessionMust(t, store) 542 543 ok, err := session.Advanced().Attachments().Exists("users/1", "profile") 544 assert.NoError(t, err) 545 assert.True(t, ok) 546 547 ok, err = session.Advanced().Attachments().Exists("users/1", "background-photo") 548 assert.NoError(t, err) 549 assert.False(t, ok) 550 551 ok, err = session.Advanced().Attachments().Exists("users/2", "profile") 552 assert.NoError(t, err) 553 assert.False(t, ok) 554 555 session.Close() 556 } 557 } 558 559 func TestAttachmentsSession(t *testing.T) { 560 driver := createTestDriver(t) 561 destroy := func() { destroyDriver(t, driver) } 562 defer recoverTest(t, destroy) 563 564 // Those are flaky on mac and mac only. I suspect server issue 565 // see https://github.com/altipla-consulting/ravendb-go-client/issues/92 566 if runtime.GOOS == "darwin" && !enableFlakyTests { 567 return 568 } 569 570 // matches order of Java tests 571 attachmentsSessionPutAttachments(t, driver) 572 attachmentsSessionPutDocumentAndAttachmentAndDeleteShouldThrow(t, driver) 573 attachmentsSessionGetAttachmentNames(t, driver) 574 attachmentsSessionDeleteDocumentByCommandAndThanItsAttachmentsThisIsNoOpButShouldBeSupported(t, driver) 575 attachmentsSessionDeleteAttachments(t, driver) 576 attachmentsSessionAttachmentExists(t, driver) 577 attachmentsSessionThrowWhenTwoAttachmentsWithTheSameNameInSession(t, driver) 578 attachmentsSessionDeleteDocumentAndThanItsAttachmentsThisIsNoOpButShouldBeSupported(t, driver) 579 attachmentsSessionThrowIfStreamIsUseTwice(t, driver) 580 attachmentsSessionGetAttachmentReleasesResources(t, driver) 581 attachmentsSessionDeleteAttachmentsUsingCommand(t, driver) 582 }