go.mercari.io/datastore@v1.8.2/boom/batch_test.go (about) 1 package boom 2 3 import ( 4 "strings" 5 "testing" 6 7 "go.mercari.io/datastore" 8 "go.mercari.io/datastore/internal/testutils" 9 ) 10 11 func TestBoom_BatchGet(t *testing.T) { 12 ctx, client, cleanUp := testutils.SetupCloudDatastore(t) 13 defer cleanUp() 14 15 type Data struct { 16 ID int64 `datastore:"-" boom:"id"` 17 } 18 19 const size = 100 20 21 bm := FromClient(ctx, client) 22 23 var list []*Data 24 for i := 0; i < size; i++ { 25 list = append(list, &Data{}) 26 } 27 keys, err := bm.PutMulti(list) 28 if err != nil { 29 t.Fatal(err) 30 } 31 32 list = nil 33 b := bm.Batch() 34 for _, key := range keys { 35 obj := &Data{ID: key.ID()} 36 b.Get(obj, nil) 37 list = append(list, obj) 38 } 39 40 err = b.Exec() 41 if err != nil { 42 t.Fatal(err) 43 } 44 45 if v := len(list); v != size { 46 t.Errorf("unexpected: %v", v) 47 } 48 for _, obj := range list { 49 if v := obj.ID; v == 0 { 50 t.Errorf("unexpected: %v", v) 51 } 52 } 53 } 54 55 func TestBoom_BatchPutSingle(t *testing.T) { 56 ctx, client, cleanUp := testutils.SetupCloudDatastore(t) 57 defer cleanUp() 58 59 type Data struct { 60 ID int64 `datastore:"-" boom:"id"` 61 } 62 63 bm := FromClient(ctx, client) 64 65 b := bm.Batch() 66 b.Put(&Data{}, nil) 67 68 err := b.Exec() 69 if err != nil { 70 t.Fatal(err) 71 } 72 } 73 74 func TestBoom_BatchPut(t *testing.T) { 75 ctx, client, cleanUp := testutils.SetupCloudDatastore(t) 76 defer cleanUp() 77 78 type Data struct { 79 ID int64 `datastore:"-" boom:"id"` 80 } 81 82 const size = 100 83 84 bm := FromClient(ctx, client) 85 86 var list []*Data 87 b := bm.Batch() 88 for i := 0; i < size; i++ { 89 obj := &Data{} 90 b.Put(obj, nil) 91 list = append(list, obj) 92 } 93 94 err := b.Exec() 95 if err != nil { 96 t.Fatal(err) 97 } 98 99 if v := len(list); v != size { 100 t.Errorf("unexpected: %v", v) 101 } 102 for _, obj := range list { 103 if v := obj.ID; v == 0 { 104 t.Errorf("unexpected: %v", v) 105 } 106 } 107 } 108 109 func TestBoom_BatchDelete(t *testing.T) { 110 ctx, client, cleanUp := testutils.SetupCloudDatastore(t) 111 defer cleanUp() 112 113 type Data struct { 114 ID int64 `datastore:"-" boom:"id"` 115 } 116 117 const size = 100 118 119 bm := FromClient(ctx, client) 120 121 var list []*Data 122 for i := 0; i < size; i++ { 123 list = append(list, &Data{}) 124 } 125 keys, err := bm.PutMulti(list) 126 if err != nil { 127 t.Fatal(err) 128 } 129 130 b := bm.Batch() 131 for _, key := range keys { 132 obj := &Data{ID: key.ID()} 133 b.Delete(obj, nil) 134 } 135 136 err = b.Exec() 137 if err != nil { 138 t.Fatal(err) 139 } 140 141 err = bm.GetMulti(list) 142 merr, ok := err.(datastore.MultiError) 143 if !ok { 144 t.Fatalf("unexpected: %v, %s", ok, err.Error()) 145 } 146 147 for _, err := range merr { 148 if v := err; err != datastore.ErrNoSuchEntity { 149 t.Errorf("unexpected: %v", v) 150 } 151 } 152 } 153 154 func TestBoom_BatchEarlyError(t *testing.T) { 155 ctx, client, cleanUp := testutils.SetupCloudDatastore(t) 156 defer cleanUp() 157 158 bm := FromClient(ctx, client) 159 160 b := bm.Batch() 161 // invalid src 162 b.Put(1, nil) 163 164 err := b.Exec() 165 if merr, ok := err.(datastore.MultiError); ok { 166 if v := len(merr); v != 1 { 167 t.Fatalf("unexpected: %v", v) 168 } 169 if v := merr[0].Error(); !strings.HasPrefix(v, "boom:") { 170 t.Errorf("unexpected: %v", v) 171 } 172 } else { 173 t.Fatalf("unexpected: %v", ok) 174 } 175 }