1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
|
// Copyright 2017 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package firestore
import (
"context"
"testing"
pb "google.golang.org/genproto/googleapis/firestore/v1"
)
func TestWriteBatch(t *testing.T) {
c, srv, cleanup := newMock(t)
defer cleanup()
docPrefix := c.Collection("C").Path + "/"
srv.addRPC(
&pb.CommitRequest{
Database: c.path(),
Writes: []*pb.Write{
{ // Create
Operation: &pb.Write_Update{
Update: &pb.Document{
Name: docPrefix + "a",
Fields: testFields,
},
},
CurrentDocument: &pb.Precondition{
ConditionType: &pb.Precondition_Exists{false},
},
},
{ // Set
Operation: &pb.Write_Update{
Update: &pb.Document{
Name: docPrefix + "b",
Fields: testFields,
},
},
},
{ // Delete
Operation: &pb.Write_Delete{
Delete: docPrefix + "c",
},
},
{ // Update
Operation: &pb.Write_Update{
Update: &pb.Document{
Name: docPrefix + "f",
Fields: map[string]*pb.Value{"*": intval(3)},
},
},
UpdateMask: &pb.DocumentMask{FieldPaths: []string{"`*`"}},
CurrentDocument: &pb.Precondition{
ConditionType: &pb.Precondition_Exists{true},
},
},
},
},
&pb.CommitResponse{
WriteResults: []*pb.WriteResult{
{UpdateTime: aTimestamp},
{UpdateTime: aTimestamp2},
{UpdateTime: aTimestamp3},
},
},
)
gotWRs, err := c.Batch().
Create(c.Doc("C/a"), testData).
Set(c.Doc("C/b"), testData).
Delete(c.Doc("C/c")).
Update(c.Doc("C/f"), []Update{{FieldPath: []string{"*"}, Value: 3}}).
Commit(context.Background())
if err != nil {
t.Fatal(err)
}
wantWRs := []*WriteResult{{aTime}, {aTime2}, {aTime3}}
if !testEqual(gotWRs, wantWRs) {
t.Errorf("got %+v\nwant %+v", gotWRs, wantWRs)
}
}
func TestWriteBatchErrors(t *testing.T) {
ctx := context.Background()
c, _, cleanup := newMock(t)
defer cleanup()
for _, test := range []struct {
desc string
batch *WriteBatch
}{
{
"empty batch",
c.Batch(),
},
{
"bad doc reference",
c.Batch().Create(c.Doc("a"), testData),
},
{
"bad data",
c.Batch().Create(c.Doc("a/b"), 3),
},
} {
t.Run(test.desc, func(t *testing.T) {
if _, err := test.batch.Commit(ctx); err == nil {
t.Fatal("got nil, want error")
}
})
}
}
|