| Index: impl/cloud/datastore_test.go
|
| diff --git a/impl/cloud/datastore_test.go b/impl/cloud/datastore_test.go
|
| index e09e89c9b52bc053463a43413b7827f29b90a0c1..dc6b207f1371eaf9324ecb37e7c119310ee81115 100644
|
| --- a/impl/cloud/datastore_test.go
|
| +++ b/impl/cloud/datastore_test.go
|
| @@ -89,31 +89,30 @@ func TestDatastore(t *testing.T) {
|
|
|
| // Clear all used entities from all namespaces.
|
| for _, ns := range namespaces {
|
| - nsCtx := info.Get(c).MustNamespace(ns)
|
| - di := ds.Get(nsCtx)
|
| + nsCtx := info.MustNamespace(c, ns)
|
|
|
| keys := make([]*ds.Key, len(namespaces))
|
| for i := range keys {
|
| - keys[i] = di.MakeKey("Test", i+1)
|
| + keys[i] = ds.MakeKey(nsCtx, "Test", i+1)
|
| }
|
| - So(errors.Filter(di.DeleteMulti(keys), ds.ErrNoSuchEntity), ShouldBeNil)
|
| + So(errors.Filter(ds.Delete(nsCtx, keys), ds.ErrNoSuchEntity), ShouldBeNil)
|
| }
|
|
|
| // Put one entity per namespace.
|
| for i, ns := range namespaces {
|
| - nsCtx := info.Get(c).MustNamespace(ns)
|
| + nsCtx := info.MustNamespace(c, ns)
|
|
|
| pmap := ds.PropertyMap{"$kind": mkp("Test"), "$id": mkp(i + 1), "Value": mkp(i)}
|
| - So(ds.Get(nsCtx).Put(pmap), ShouldBeNil)
|
| + So(ds.Put(nsCtx, pmap), ShouldBeNil)
|
| }
|
|
|
| // Make sure that entity only exists in that namespace.
|
| for _, ns := range namespaces {
|
| - nsCtx := info.Get(c).MustNamespace(ns)
|
| + nsCtx := info.MustNamespace(c, ns)
|
|
|
| for i := range namespaces {
|
| pmap := ds.PropertyMap{"$kind": mkp("Test"), "$id": mkp(i + 1)}
|
| - err := ds.Get(nsCtx).Get(pmap)
|
| + err := ds.Get(nsCtx, pmap)
|
|
|
| if namespaces[i] == ns {
|
| So(err, ShouldBeNil)
|
| @@ -130,28 +129,27 @@ func TestDatastore(t *testing.T) {
|
| if _, err := rand.Read(randNamespace); err != nil {
|
| panic(err)
|
| }
|
| - c = info.Get(c).MustNamespace(fmt.Sprintf("testing-%s", hex.EncodeToString(randNamespace)))
|
| - di := ds.Get(c)
|
| + c = info.MustNamespace(c, fmt.Sprintf("testing-%s", hex.EncodeToString(randNamespace)))
|
|
|
| // Execute a kindless query to clear the namespace.
|
| q := ds.NewQuery("").KeysOnly(true)
|
| var allKeys []*ds.Key
|
| - So(di.GetAll(q, &allKeys), ShouldBeNil)
|
| - So(di.DeleteMulti(allKeys), ShouldBeNil)
|
| + So(ds.GetAll(c, q, &allKeys), ShouldBeNil)
|
| + So(ds.Delete(c, allKeys), ShouldBeNil)
|
|
|
| Convey(`Can allocate an ID range`, func() {
|
| var keys []*ds.Key
|
| - keys = append(keys, di.NewIncompleteKeys(10, "Bar", di.MakeKey("Foo", 12))...)
|
| - keys = append(keys, di.NewIncompleteKeys(10, "Baz", di.MakeKey("Foo", 12))...)
|
| + keys = append(keys, ds.NewIncompleteKeys(c, 10, "Bar", ds.MakeKey(c, "Foo", 12))...)
|
| + keys = append(keys, ds.NewIncompleteKeys(c, 10, "Baz", ds.MakeKey(c, "Foo", 12))...)
|
|
|
| seen := map[string]struct{}{}
|
| - So(di.AllocateIDs(keys), ShouldBeNil)
|
| + So(ds.AllocateIDs(c, keys), ShouldBeNil)
|
| for _, k := range keys {
|
| So(k.IsIncomplete(), ShouldBeFalse)
|
| seen[k.String()] = struct{}{}
|
| }
|
|
|
| - So(di.AllocateIDs(keys), ShouldBeNil)
|
| + So(ds.AllocateIDs(c, keys), ShouldBeNil)
|
| for _, k := range keys {
|
| So(k.IsIncomplete(), ShouldBeFalse)
|
|
|
| @@ -167,13 +165,13 @@ func TestDatastore(t *testing.T) {
|
| {"$kind": mkp("test"), "$id": mkp("bar"), "Value": mkp(42)},
|
| {"$kind": mkp("test"), "$id": mkp("baz"), "Value": mkp(0xd065)},
|
| }
|
| - So(di.PutMulti(put), ShouldBeNil)
|
| + So(ds.Put(c, put), ShouldBeNil)
|
| delete(put[0], "$key")
|
| delete(put[1], "$key")
|
| delete(put[2], "$key")
|
|
|
| // Delete: "bar".
|
| - So(di.Delete(di.MakeKey("test", "bar")), ShouldBeNil)
|
| + So(ds.Delete(c, ds.MakeKey(c, "test", "bar")), ShouldBeNil)
|
|
|
| // Get: "foo", "bar", "baz"
|
| get := []ds.PropertyMap{
|
| @@ -182,7 +180,7 @@ func TestDatastore(t *testing.T) {
|
| {"$kind": mkp("test"), "$id": mkp("baz")},
|
| }
|
|
|
| - err := di.GetMulti(get)
|
| + err := ds.Get(c, get)
|
| So(err, ShouldHaveSameTypeAs, errors.MultiError(nil))
|
|
|
| merr := err.(errors.MultiError)
|
| @@ -206,30 +204,30 @@ func TestDatastore(t *testing.T) {
|
| "Bytes": mkp([]byte("world")),
|
| "Time": mkp(testTime),
|
| "Float": mkpNI(3.14),
|
| - "Key": mkp(di.MakeKey("Parent", "ParentID", "Child", 1337)),
|
| + "Key": mkp(ds.MakeKey(c, "Parent", "ParentID", "Child", 1337)),
|
| "Null": mkp(nil),
|
| "NullSlice": mkp(nil, nil),
|
|
|
| "ComplexSlice": mkp(1337, "string", []byte("bytes"), testTime, float32(3.14),
|
| - float64(2.71), true, nil, di.MakeKey("SomeKey", "SomeID")),
|
| + float64(2.71), true, nil, ds.MakeKey(c, "SomeKey", "SomeID")),
|
|
|
| "Single": mkp("single"),
|
| "SingleSlice": mkProperties(true, true, "single"), // Force a single "multi" value.
|
| "EmptySlice": ds.PropertySlice(nil),
|
| }
|
| - So(di.Put(put), ShouldBeNil)
|
| + So(ds.Put(c, put), ShouldBeNil)
|
| delete(put, "$key")
|
|
|
| get := ds.PropertyMap{
|
| "$id": mkpNI("foo"),
|
| "$kind": mkpNI("FooType"),
|
| }
|
| - So(di.Get(get), ShouldBeNil)
|
| + So(ds.Get(c, get), ShouldBeNil)
|
| So(get, ShouldResemble, put)
|
| })
|
|
|
| Convey(`With several entities installed`, func() {
|
| - So(di.PutMulti([]ds.PropertyMap{
|
| + So(ds.Put(c, []ds.PropertyMap{
|
| {"$kind": mkp("Test"), "$id": mkp("foo"), "FooBar": mkp(true)},
|
| {"$kind": mkp("Test"), "$id": mkp("bar"), "FooBar": mkp(true)},
|
| {"$kind": mkp("Test"), "$id": mkp("baz")},
|
| @@ -241,42 +239,40 @@ func TestDatastore(t *testing.T) {
|
| Convey(`Can query for entities with FooBar == true.`, func() {
|
| var results []ds.PropertyMap
|
| q = q.Eq("FooBar", true)
|
| - So(di.GetAll(q, &results), ShouldBeNil)
|
| + So(ds.GetAll(c, q, &results), ShouldBeNil)
|
|
|
| So(results, ShouldResemble, []ds.PropertyMap{
|
| - {"$key": mkpNI(di.MakeKey("Test", "bar")), "FooBar": mkp(true)},
|
| - {"$key": mkpNI(di.MakeKey("Test", "foo")), "FooBar": mkp(true)},
|
| + {"$key": mkpNI(ds.MakeKey(c, "Test", "bar")), "FooBar": mkp(true)},
|
| + {"$key": mkpNI(ds.MakeKey(c, "Test", "foo")), "FooBar": mkp(true)},
|
| })
|
| })
|
|
|
| Convey(`Can query for entities whose __key__ > "baz".`, func() {
|
| var results []ds.PropertyMap
|
| - q = q.Gt("__key__", di.MakeKey("Test", "baz"))
|
| - So(di.GetAll(q, &results), ShouldBeNil)
|
| + q = q.Gt("__key__", ds.MakeKey(c, "Test", "baz"))
|
| + So(ds.GetAll(c, q, &results), ShouldBeNil)
|
|
|
| So(results, ShouldResemble, []ds.PropertyMap{
|
| - {"$key": mkpNI(di.MakeKey("Test", "foo")), "FooBar": mkp(true)},
|
| - {"$key": mkpNI(di.MakeKey("Test", "qux"))},
|
| + {"$key": mkpNI(ds.MakeKey(c, "Test", "foo")), "FooBar": mkp(true)},
|
| + {"$key": mkpNI(ds.MakeKey(c, "Test", "qux"))},
|
| })
|
| })
|
|
|
| Convey(`Can transactionally get and put.`, func() {
|
| - err := di.RunInTransaction(func(c context.Context) error {
|
| - di := ds.Get(c)
|
| -
|
| + err := ds.RunInTransaction(c, func(c context.Context) error {
|
| pmap := ds.PropertyMap{"$kind": mkp("Test"), "$id": mkp("qux")}
|
| - if err := di.Get(pmap); err != nil {
|
| + if err := ds.Get(c, pmap); err != nil {
|
| return err
|
| }
|
|
|
| pmap["ExtraField"] = mkp("Present!")
|
| - return di.Put(pmap)
|
| + return ds.Put(c, pmap)
|
| }, nil)
|
| So(err, ShouldBeNil)
|
|
|
| pmap := ds.PropertyMap{"$kind": mkp("Test"), "$id": mkp("qux")}
|
| - err = di.RunInTransaction(func(c context.Context) error {
|
| - return ds.Get(c).Get(pmap)
|
| + err = ds.RunInTransaction(c, func(c context.Context) error {
|
| + return ds.Get(c, pmap)
|
| }, nil)
|
| So(err, ShouldBeNil)
|
| So(pmap, ShouldResemble, ds.PropertyMap{"$kind": mkp("Test"), "$id": mkp("qux"), "ExtraField": mkp("Present!")})
|
| @@ -285,20 +281,31 @@ func TestDatastore(t *testing.T) {
|
| Convey(`Can fail in a transaction with no effect.`, func() {
|
| testError := errors.New("test error")
|
|
|
| - err := di.RunInTransaction(func(c context.Context) error {
|
| - di := ds.Get(c)
|
| + noTxnPM := ds.PropertyMap{"$kind": mkp("Test"), "$id": mkp("no txn")}
|
| + err := ds.RunInTransaction(c, func(c context.Context) error {
|
| + So(ds.CurrentTransaction(c), ShouldNotBeNil)
|
|
|
| pmap := ds.PropertyMap{"$kind": mkp("Test"), "$id": mkp("quux")}
|
| - if err := di.Put(pmap); err != nil {
|
| + if err := ds.Put(c, pmap); err != nil {
|
| + return err
|
| + }
|
| +
|
| + // Put an entity outside of the transaction so we can confirm that
|
| + // it was added even when the transaction fails.
|
| + if err := ds.Put(ds.WithoutTransaction(c), noTxnPM); err != nil {
|
| return err
|
| }
|
| return testError
|
| }, nil)
|
| So(err, ShouldEqual, testError)
|
|
|
| + // Confirm that noTxnPM was added.
|
| + So(ds.CurrentTransaction(c), ShouldBeNil)
|
| + So(ds.Get(c, noTxnPM), ShouldBeNil)
|
| +
|
| pmap := ds.PropertyMap{"$kind": mkp("Test"), "$id": mkp("quux")}
|
| - err = di.RunInTransaction(func(c context.Context) error {
|
| - return ds.Get(c).Get(pmap)
|
| + err = ds.RunInTransaction(c, func(c context.Context) error {
|
| + return ds.Get(c, pmap)
|
| }, nil)
|
| So(err, ShouldEqual, ds.ErrNoSuchEntity)
|
| })
|
|
|