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  }