go.mercari.io/datastore@v1.8.2/boom/transaction_test.go (about) 1 package boom 2 3 import ( 4 "testing" 5 6 "go.mercari.io/datastore/internal/testutils" 7 ) 8 9 func TestBoom_NewTransaction(t *testing.T) { 10 ctx, client, cleanUp := testutils.SetupCloudDatastore(t) 11 defer cleanUp() 12 13 type Data struct { 14 ID int64 `datastore:"-" boom:"id"` 15 Str string 16 } 17 18 bm := FromClient(ctx, client) 19 20 key, err := bm.Put(&Data{Str: "Str1"}) 21 if err != nil { 22 t.Fatal(err) 23 } 24 25 tx, err := bm.NewTransaction() 26 if err != nil { 27 t.Fatal(err) 28 } 29 30 obj := &Data{ID: key.ID()} 31 err = tx.Get(obj) 32 if err != nil { 33 t.Fatal(err) 34 } 35 if v := obj.Str; v != "Str1" { 36 t.Errorf("unexpected: %v", v) 37 } 38 39 obj = &Data{Str: "Str2"} 40 _, err = tx.Put(obj) 41 if err != nil { 42 t.Fatal(err) 43 } 44 // Key is PendingKey state still... 45 if v := obj.ID; v != 0 { 46 t.Errorf("unexpected: %v", v) 47 } 48 49 err = tx.Delete(key) 50 if err != nil { 51 t.Fatal(err) 52 } 53 54 _, err = tx.Commit() 55 if err != nil { 56 t.Fatal(err) 57 } 58 if v := obj.ID; v == 0 { 59 t.Errorf("unexpected: %v", v) 60 } 61 } 62 63 func TestBoom_RunInTransaction(t *testing.T) { 64 ctx, client, cleanUp := testutils.SetupCloudDatastore(t) 65 defer cleanUp() 66 67 type Data struct { 68 ID int64 `datastore:"-" boom:"id"` 69 Str string 70 } 71 72 bm := FromClient(ctx, client) 73 74 key, err := bm.Put(&Data{Str: "Str1"}) 75 if err != nil { 76 t.Fatal(err) 77 } 78 79 var pObj *Data 80 _, err = bm.RunInTransaction(func(tx *Transaction) error { 81 obj := &Data{ID: key.ID()} 82 err = tx.Get(obj) 83 if err != nil { 84 t.Fatal(err) 85 } 86 if v := obj.Str; v != "Str1" { 87 t.Errorf("unexpected: %v", v) 88 } 89 90 pObj = &Data{Str: "Str2"} 91 _, err = tx.Put(pObj) 92 if err != nil { 93 t.Fatal(err) 94 } 95 // Key is PendingKey state still... 96 if v := pObj.ID; v != 0 { 97 t.Errorf("unexpected: %v", v) 98 } 99 100 err = tx.Delete(key) 101 if err != nil { 102 t.Fatal(err) 103 } 104 105 return nil 106 }) 107 if err != nil { 108 t.Fatal(err) 109 } 110 111 if v := pObj.ID; v == 0 { 112 t.Errorf("unexpected: %v", v) 113 } 114 } 115 116 func TestBoom_TxRollback(t *testing.T) { 117 ctx, client, cleanUp := testutils.SetupCloudDatastore(t) 118 defer cleanUp() 119 120 type Data struct { 121 ID int64 `datastore:"-" boom:"id"` 122 Str string 123 } 124 125 bm := FromClient(ctx, client) 126 127 tx, err := bm.NewTransaction() 128 if err != nil { 129 t.Fatal(err) 130 } 131 132 _, err = tx.Put(&Data{Str: "Str1"}) 133 if err != nil { 134 t.Fatal(err) 135 } 136 137 err = tx.Rollback() 138 if err != nil { 139 t.Fatal(err) 140 } 141 } 142 143 func TestBoom_TxWithCompleteKey(t *testing.T) { 144 ctx, client, cleanUp := testutils.SetupCloudDatastore(t) 145 defer cleanUp() 146 147 bm := FromClient(ctx, client) 148 149 type Data struct { 150 ID string `boom:"id" datastore:"-"` 151 } 152 153 tx, err := bm.NewTransaction() 154 if err != nil { 155 t.Fatal(err) 156 } 157 158 _, err = tx.PutMulti([]*Data{{ID: "hoge"}}) 159 if err != nil { 160 t.Fatal(err) 161 } 162 _, err = tx.Commit() 163 if err != nil { 164 t.Fatal(err) 165 } 166 }