Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1690)

Unified Diff: service/datastore/datastore_test.go

Issue 2007123002: datastore: Update AllocateIDs to take keys. (Closed) Base URL: https://chromium.googlesource.com/external/github.com/luci/gae@master
Patch Set: Add empty arg/key short-circuits for other varidic methods. Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: service/datastore/datastore_test.go
diff --git a/service/datastore/datastore_test.go b/service/datastore/datastore_test.go
index 09fa63515e1fbae50678fe7fe59c0eb9c70356f9..3625961293f6e39de0a54a756c1c1313cc4d511a 100644
--- a/service/datastore/datastore_test.go
+++ b/service/datastore/datastore_test.go
@@ -31,6 +31,11 @@ func fakeDatastoreFactory(c context.Context, wantTxn bool) RawInterface {
return &fds
}
+var (
+ errFail = errors.New("Individual element fail")
+ errFailAll = errors.New("Operation fail")
+)
+
type fakeDatastore struct {
RawInterface
aid string
@@ -41,6 +46,24 @@ func (f *fakeDatastore) mkKey(elems ...interface{}) *Key {
return MakeKey(f.aid, f.ns, elems...)
}
+func (f *fakeDatastore) newKey(kind, stringID string, intID int64, parent *Key) *Key {
+ return NewKey(f.aid, f.ns, kind, stringID, intID, parent)
+}
+
+func (f *fakeDatastore) AllocateIDs(keys []*Key, cb PutMultiCB) error {
+ if keys[0].Kind() == "FailAll" {
+ return errFailAll
+ }
+ for i, k := range keys {
+ if k.Kind() == "Fail" {
+ cb(nil, errFail)
+ } else {
+ cb(f.newKey(k.Kind(), "", int64(i+1), k.Parent()), nil)
+ }
+ }
+ return nil
+}
+
func (f *fakeDatastore) Run(fq *FinalizedQuery, cb RawRunCB) error {
lim, _ := fq.Limit()
@@ -70,11 +93,6 @@ func (f *fakeDatastore) Run(fq *FinalizedQuery, cb RawRunCB) error {
return nil
}
-var (
- errFail = errors.New("Individual element fail")
- errFailAll = errors.New("Operation fail")
-)
-
func (f *fakeDatastore) PutMulti(keys []*Key, vals []PropertyMap, cb PutMultiCB) error {
if keys[0].Kind() == "FailAll" {
return errFailAll
@@ -395,14 +413,14 @@ func TestPopulateKey(t *testing.T) {
Convey("Can set the key of a common struct.", func() {
var cs CommonStruct
- PopulateKey(&cs, k)
+ So(PopulateKey(&cs, k), ShouldBeTrue)
So(cs.ID, ShouldEqual, 1337)
})
Convey("Will not set the value of a singleton struct.", func() {
var ss SingletonStruct
- PopulateKey(&ss, k)
+ So(PopulateKey(&ss, k), ShouldBeFalse)
So(ss.id, ShouldEqual, 0)
})
@@ -420,6 +438,84 @@ func TestPopulateKey(t *testing.T) {
})
}
+func TestAllocateIDs(t *testing.T) {
+ t.Parallel()
+
+ Convey("A testing environment", t, func() {
+ c := info.Set(context.Background(), fakeInfo{})
+ c = SetRawFactory(c, fakeDatastoreFactory)
+ ds := Get(c)
+
+ Convey("Testing AllocateIDs", func() {
+ Convey("Will return nil if no entities are supplied.", func() {
+ So(ds.AllocateIDs(), ShouldBeNil)
+ })
+
+ Convey("single struct", func() {
+ cs := CommonStruct{Value: 1}
+ So(ds.AllocateIDs(&cs), ShouldBeNil)
+ So(cs.ID, ShouldEqual, 1)
+ })
+
+ Convey("struct slice", func() {
+ csSlice := []*CommonStruct{{Value: 1}, {Value: 2}}
+ So(ds.AllocateIDs(csSlice), ShouldBeNil)
+ So(csSlice, ShouldResemble, []*CommonStruct{{ID: 1, Value: 1}, {ID: 2, Value: 2}})
+ })
+
+ Convey("single key", func() {
+ singleKey := ds.MakeKey("FooParent", "BarParent", "Foo", "Bar")
+ So(ds.AllocateIDs(singleKey), ShouldBeNil)
+ So(singleKey.Equal(ds.MakeKey("FooParent", "BarParent", "Foo", 1)), ShouldBeTrue)
+ })
+
+ Convey("key slice", func() {
+ keySlice := []*Key{ds.MakeKey("Foo", "Bar"), ds.MakeKey("Baz", "Qux")}
+ So(ds.AllocateIDs(keySlice), ShouldBeNil)
+ So(keySlice[0].Equal(ds.MakeKey("Foo", 1)), ShouldBeTrue)
+ So(keySlice[1].Equal(ds.MakeKey("Baz", 2)), ShouldBeTrue)
+ })
+
+ Convey("fail all key slice", func() {
+ keySlice := []*Key{ds.MakeKey("FailAll", "oops"), ds.MakeKey("Baz", "Qux")}
+ So(ds.AllocateIDs(keySlice), ShouldEqual, errFailAll)
+ So(keySlice[0].StringID(), ShouldEqual, "oops")
+ So(keySlice[1].StringID(), ShouldEqual, "Qux")
+ })
+
+ Convey("fail key slice", func() {
+ keySlice := []*Key{ds.MakeKey("Fail", "oops"), ds.MakeKey("Baz", "Qux")}
+ So(ds.AllocateIDs(keySlice), ShouldResemble, errors.MultiError{errFail, nil})
+ So(keySlice[0].StringID(), ShouldEqual, "oops")
+ So(keySlice[1].IntID(), ShouldEqual, 2)
+ })
+
+ Convey("vararg with errors", func() {
+ successSlice := []CommonStruct{{Value: 0}, {Value: 1}}
+ failSlice := []FakePLS{{Kind: "Fail"}, {Value: 3}}
+ emptySlice := []CommonStruct(nil)
+ cs0 := CommonStruct{Value: 4}
+ cs1 := FakePLS{Kind: "Fail", Value: 5}
+ singleKey := ds.MakeKey("FooParent", "BarParent", "Foo", "Bar")
+ keySlice := []*Key{ds.MakeKey("Foo", "Bar"), ds.MakeKey("Baz", "Qux")}
+ fpls := FakePLS{StringID: "ohai", Value: 6}
+
+ err := ds.AllocateIDs(successSlice, failSlice, emptySlice, &cs0, &cs1, singleKey, keySlice, &fpls)
+ So(err, ShouldResemble, errors.MultiError{
+ nil, errors.MultiError{errFail, nil}, nil, nil, errFail, nil, nil, nil})
+ So(successSlice[0].ID, ShouldEqual, 1)
+ So(successSlice[1].ID, ShouldEqual, 2)
+ So(failSlice[1].IntID, ShouldEqual, 4)
+ So(cs0.ID, ShouldEqual, 5)
+ So(singleKey.Equal(ds.MakeKey("FooParent", "BarParent", "Foo", 7)), ShouldBeTrue)
+ So(keySlice[0].Equal(ds.MakeKey("Foo", 8)), ShouldBeTrue)
+ So(keySlice[1].Equal(ds.MakeKey("Baz", 9)), ShouldBeTrue)
+ So(fpls.IntID, ShouldEqual, 10)
+ })
+ })
+ })
+}
+
func TestPut(t *testing.T) {
t.Parallel()

Powered by Google App Engine
This is Rietveld 408576698