go.mercari.io/datastore@v1.8.2/testsuite/entity_ops.go (about) 1 package testsuite 2 3 import ( 4 "context" 5 "fmt" 6 "testing" 7 "time" 8 9 "go.mercari.io/datastore" 10 ) 11 12 func putAndGet(ctx context.Context, t *testing.T, client datastore.Client) { 13 defer func() { 14 err := client.Close() 15 if err != nil { 16 t.Fatal(err) 17 } 18 }() 19 20 type TestEntity struct { 21 String string 22 } 23 24 key := client.IncompleteKey("Test", nil) 25 t.Log(key) 26 newKey, err := client.Put(ctx, key, &TestEntity{String: "Test"}) 27 if err != nil { 28 t.Fatal(err) 29 } 30 31 t.Logf("new key: %s", newKey.String()) 32 33 entity := &TestEntity{} 34 err = client.Get(ctx, newKey, entity) 35 if err != nil { 36 t.Fatal(err) 37 } 38 39 if v := entity.String; v != "Test" { 40 t.Errorf("unexpected: %v", v) 41 } 42 } 43 44 func putAndGetTimeTime(ctx context.Context, t *testing.T, client datastore.Client) { 45 defer func() { 46 err := client.Close() 47 if err != nil { 48 t.Fatal(err) 49 } 50 }() 51 52 type Data struct { 53 At time.Time 54 } 55 56 key := client.IncompleteKey("Data", nil) 57 58 l, err := time.LoadLocation("Europe/Berlin") // not UTC, not PST, not Asia/Tokyo(developer's local timezone) 59 if err != nil { 60 t.Fatal(err) 61 } 62 now := time.Date(2017, 12, 5, 10, 11, 22, 33, l) 63 64 newKey, err := client.Put(ctx, key, &Data{At: now}) 65 if err != nil { 66 t.Fatal(err) 67 } 68 69 obj := &Data{} 70 err = client.Get(ctx, newKey, obj) 71 if err != nil { 72 t.Fatal(err) 73 } 74 75 // load by time.UTC 76 if v := obj.At.Location(); v != time.UTC { 77 t.Errorf("unexpected: %v", v) 78 } 79 if v := obj.At.UnixNano(); v != now.Truncate(time.Microsecond).UnixNano() { 80 t.Errorf("unexpected: %v", v) 81 } 82 } 83 84 func putAndDelete(ctx context.Context, t *testing.T, client datastore.Client) { 85 defer func() { 86 err := client.Close() 87 if err != nil { 88 t.Fatal(err) 89 } 90 }() 91 92 type TestEntity struct { 93 String string 94 } 95 96 key := client.IncompleteKey("Test", nil) 97 t.Log(key) 98 newKey, err := client.Put(ctx, key, &TestEntity{String: "Test"}) 99 if err != nil { 100 t.Fatal(err) 101 } 102 103 t.Logf("new key: %s", newKey.String()) 104 105 err = client.Delete(ctx, newKey) 106 if err != nil { 107 t.Fatal(err) 108 } 109 110 entity := &TestEntity{} 111 err = client.Get(ctx, newKey, entity) 112 if err != datastore.ErrNoSuchEntity { 113 t.Fatal(err) 114 } 115 } 116 117 func putAndGetObjectHasObjectSlice(ctx context.Context, t *testing.T, client datastore.Client) { 118 if IsAEDatastoreClient(ctx) { 119 // flatten options must required in ae. 120 t.SkipNow() 121 } 122 123 defer func() { 124 err := client.Close() 125 if err != nil { 126 t.Fatal(err) 127 } 128 }() 129 130 type Inner struct { 131 A string 132 B string 133 } 134 135 type Data struct { 136 Slice []Inner // `datastore:",flatten"` // If flatten removed, aedatastore env will fail. 137 } 138 139 key := client.NameKey("Test", "a", nil) 140 _, err := client.Put(ctx, key, &Data{ 141 Slice: []Inner{ 142 {A: "A1", B: "B1"}, 143 {A: "A2", B: "B2"}, 144 {A: "A3", B: "B3"}, 145 }, 146 }) 147 if err != nil { 148 t.Fatal(err) 149 } 150 151 obj := &Data{} 152 err = client.Get(ctx, key, obj) 153 if err != nil { 154 t.Fatal(err) 155 } 156 157 if v := len(obj.Slice); v != 3 { 158 t.Errorf("unexpected: %v", v) 159 } 160 161 for idx, s := range obj.Slice { 162 if v := s.A; v != fmt.Sprintf("A%d", idx+1) { 163 t.Errorf("unexpected: %v", v) 164 } 165 if v := s.B; v != fmt.Sprintf("B%d", idx+1) { 166 t.Errorf("unexpected: %v", v) 167 } 168 } 169 } 170 171 func putAndGetObjectHasObjectSliceWithFlatten(ctx context.Context, t *testing.T, client datastore.Client) { 172 defer func() { 173 err := client.Close() 174 if err != nil { 175 t.Fatal(err) 176 } 177 }() 178 179 type Inner struct { 180 A string 181 B string 182 } 183 184 type Data struct { 185 Slice []Inner `datastore:",flatten"` 186 } 187 188 key := client.NameKey("Test", "a", nil) 189 _, err := client.Put(ctx, key, &Data{ 190 Slice: []Inner{ 191 {A: "A1", B: "B1"}, 192 {A: "A2", B: "B2"}, 193 {A: "A3", B: "B3"}, 194 }, 195 }) 196 if err != nil { 197 t.Fatal(err) 198 } 199 200 obj := &Data{} 201 err = client.Get(ctx, key, obj) 202 if err != nil { 203 t.Fatal(err) 204 } 205 206 if v := len(obj.Slice); v != 3 { 207 t.Errorf("unexpected: %v", v) 208 } 209 210 for idx, s := range obj.Slice { 211 if v := s.A; v != fmt.Sprintf("A%d", idx+1) { 212 t.Errorf("unexpected: %v", v) 213 } 214 if v := s.B; v != fmt.Sprintf("B%d", idx+1) { 215 t.Errorf("unexpected: %v", v) 216 } 217 } 218 } 219 220 func putEntityType(ctx context.Context, t *testing.T, client datastore.Client) { 221 defer func() { 222 err := client.Close() 223 if err != nil { 224 t.Fatal(err) 225 } 226 }() 227 228 type Inner struct { 229 A string 230 B string 231 } 232 233 type DataA struct { 234 C *Inner 235 } 236 237 type DataB struct { 238 C *Inner `datastore:",flatten"` 239 } 240 241 key := client.IncompleteKey("Test", nil) 242 _, err := client.Put(ctx, key, &DataA{ 243 C: &Inner{ 244 A: "a", 245 B: "b", 246 }, 247 }) 248 if IsAEDatastoreClient(ctx) { 249 if err != datastore.ErrInvalidEntityType { 250 t.Fatal(err) 251 } 252 } else { 253 if err != nil { 254 t.Fatal(err) 255 } 256 } 257 258 _, err = client.Put(ctx, key, &DataB{ 259 C: &Inner{ 260 A: "a", 261 B: "b", 262 }, 263 }) 264 if err != nil { 265 t.Fatal(err) 266 } 267 } 268 269 func putAndGetNilKey(ctx context.Context, t *testing.T, client datastore.Client) { 270 defer func() { 271 err := client.Close() 272 if err != nil { 273 t.Fatal(err) 274 } 275 }() 276 277 type Data struct { 278 KeyA datastore.Key 279 KeyB datastore.Key 280 } 281 282 key := client.IncompleteKey("Test", nil) 283 key, err := client.Put(ctx, key, &Data{ 284 KeyA: client.NameKey("Test", "a", nil), 285 KeyB: nil, 286 }) 287 if err != nil { 288 t.Fatal(err) 289 } 290 291 obj := &Data{} 292 err = client.Get(ctx, key, obj) 293 if err != nil { 294 t.Fatal(err) 295 } 296 297 if v := obj.KeyA; v == nil { 298 t.Errorf("unexpected: %v", v) 299 } 300 if v := obj.KeyB; v != nil { 301 t.Errorf("unexpected: %v", v) 302 } 303 } 304 305 func putAndGetNilKeySlice(ctx context.Context, t *testing.T, client datastore.Client) { 306 defer func() { 307 err := client.Close() 308 if err != nil { 309 t.Fatal(err) 310 } 311 }() 312 313 type Data struct { 314 Keys []datastore.Key 315 } 316 317 key := client.IncompleteKey("Test", nil) 318 key, err := client.Put(ctx, key, &Data{ 319 Keys: []datastore.Key{ 320 client.NameKey("Test", "a", nil), 321 nil, 322 }, 323 }) 324 if err != nil { 325 t.Fatal(err) 326 } 327 328 obj := &Data{} 329 err = client.Get(ctx, key, obj) 330 if err != nil { 331 t.Fatal(err) 332 } 333 334 if v := len(obj.Keys); v != 2 { 335 t.Fatalf("unexpected: %v", v) 336 } 337 if v := obj.Keys[0]; v == nil { 338 t.Errorf("unexpected: %v", v) 339 } 340 if v := obj.Keys[1]; v != nil { 341 t.Errorf("unexpected: %v", v) 342 } 343 } 344 345 type entityInterface interface { 346 Kind() string 347 ID() string 348 } 349 350 type putInterfaceTest struct { 351 kind string 352 id string 353 } 354 355 func (e *putInterfaceTest) Kind() string { 356 return e.kind 357 } 358 func (e *putInterfaceTest) ID() string { 359 return e.id 360 } 361 362 func putInterface(ctx context.Context, t *testing.T, client datastore.Client) { 363 defer func() { 364 err := client.Close() 365 if err != nil { 366 t.Fatal(err) 367 } 368 }() 369 370 var e entityInterface = &putInterfaceTest{} 371 372 key := client.IncompleteKey("Test", nil) 373 _, err := client.Put(ctx, key, e) 374 if err != nil { 375 t.Fatal(err) 376 } 377 } 378 379 func putAndGetPropertyList(ctx context.Context, t *testing.T, client datastore.Client) { 380 defer func() { 381 err := client.Close() 382 if err != nil { 383 t.Fatal(err) 384 } 385 }() 386 387 var ps datastore.PropertyList 388 ps = append(ps, datastore.Property{ 389 Name: "A", 390 Value: "A-Value", 391 }) 392 ps = append(ps, datastore.Property{ 393 Name: "B", 394 Value: true, 395 }) 396 397 key := client.IncompleteKey("Test", nil) 398 var err error 399 400 // passed datastore.PropertyList, would be error. 401 _, err = client.Put(ctx, key, ps) 402 if err != datastore.ErrInvalidEntityType { 403 t.Fatal(err) 404 } 405 406 // ok! 407 key, err = client.Put(ctx, key, &ps) 408 if err != nil { 409 t.Fatal(err) 410 } 411 412 // passed datastore.PropertyList, would be error. 413 ps = datastore.PropertyList{} 414 err = client.Get(ctx, key, ps) 415 if err != datastore.ErrInvalidEntityType { 416 t.Fatal(err) 417 } 418 419 // ok! 420 ps = datastore.PropertyList{} 421 err = client.Get(ctx, key, &ps) 422 if err != nil { 423 t.Fatal(err) 424 } 425 426 if v := len(ps); v != 2 { 427 t.Fatalf("unexpected: %v", v) 428 } 429 } 430 431 func putAndGetMultiPropertyListSlice(ctx context.Context, t *testing.T, client datastore.Client) { 432 defer func() { 433 err := client.Close() 434 if err != nil { 435 t.Fatal(err) 436 } 437 }() 438 439 var pss []datastore.PropertyList 440 var keys []datastore.Key 441 { 442 var ps datastore.PropertyList 443 ps = append(ps, datastore.Property{ 444 Name: "A", 445 Value: "A-Value", 446 }) 447 ps = append(ps, datastore.Property{ 448 Name: "B", 449 Value: true, 450 }) 451 452 key := client.IncompleteKey("Test", nil) 453 454 pss = append(pss, ps) 455 keys = append(keys, key) 456 } 457 458 var err error 459 460 // passed *[]datastore.PropertyList, would be error. 461 _, err = client.PutMulti(ctx, keys, &pss) 462 if err == nil { 463 t.Fatal(err) 464 } 465 466 // ok! []datastore.PropertyList 467 keys, err = client.PutMulti(ctx, keys, pss) 468 if err != nil { 469 t.Fatal(err) 470 } 471 472 // passed *[]datastore.PropertyList, would be error. 473 pss = make([]datastore.PropertyList, len(keys)) 474 err = client.GetMulti(ctx, keys, &pss) 475 if err == nil { 476 t.Fatal(err) 477 } 478 479 // passed []datastore.PropertyList with length 0, would be error. 480 pss = make([]datastore.PropertyList, 0) 481 err = client.GetMulti(ctx, keys, pss) 482 if err == nil { 483 t.Fatal(err) 484 } 485 486 // ok! []datastore.PropertyList with length == len(keys) 487 pss = make([]datastore.PropertyList, len(keys)) 488 err = client.GetMulti(ctx, keys, pss) 489 if err != nil { 490 t.Fatal(err) 491 } 492 493 if v := len(pss); v != 1 { 494 t.Fatalf("unexpected: %v", v) 495 } 496 } 497 498 func putAndGetBareStruct(ctx context.Context, t *testing.T, client datastore.Client) { 499 defer func() { 500 err := client.Close() 501 if err != nil { 502 t.Fatal(err) 503 } 504 }() 505 506 type Data struct { 507 Name string 508 } 509 510 var err error 511 512 key := client.IncompleteKey("Test", nil) 513 // passed Data, would be error. 514 _, err = client.Put(ctx, key, Data{Name: "A"}) 515 if err != datastore.ErrInvalidEntityType { 516 t.Fatal(err) 517 } 518 519 // ok! *Data 520 key, err = client.Put(ctx, key, &Data{Name: "A"}) 521 if err != nil { 522 t.Fatal(err) 523 } 524 525 // ok! but struct are copied. can't watching Get result. 526 obj := Data{} 527 err = client.Get(ctx, key, obj) 528 if err != datastore.ErrInvalidEntityType { 529 t.Fatal(err) 530 } 531 532 if v := obj.Name; v != "" { 533 t.Errorf("unexpected: '%v'", v) 534 } 535 } 536 537 func putAndGetMultiBareStruct(ctx context.Context, t *testing.T, client datastore.Client) { 538 defer func() { 539 err := client.Close() 540 if err != nil { 541 t.Fatal(err) 542 } 543 }() 544 545 type Data struct { 546 Name string 547 } 548 549 var list []Data 550 var keys []datastore.Key 551 { 552 obj := Data{Name: "A"} 553 key := client.IncompleteKey("Test", nil) 554 555 list = append(list, obj) 556 keys = append(keys, key) 557 } 558 559 var err error 560 561 // ok! 562 keys, err = client.PutMulti(ctx, keys, list) 563 if err != nil { 564 t.Fatal(err) 565 } 566 567 // passed []Data with length 0, would be error. 568 list = make([]Data, 0) 569 err = client.GetMulti(ctx, keys, list) 570 if err == nil { 571 t.Fatal(err) 572 } 573 574 // ok! []Data with length == len(keys) 575 list = make([]Data, len(keys)) 576 err = client.GetMulti(ctx, keys, list) 577 if err != nil { 578 t.Fatal(err) 579 } 580 581 if v := len(list); v != 1 { 582 t.Fatalf("unexpected: '%v'", v) 583 } 584 if v := list[0].Name; v != "A" { 585 t.Errorf("unexpected: '%v'", v) 586 } 587 }