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  }