1
2
3
4
5
6
7
8
9
10
11
12
13 package db
14
15 import (
16 "context"
17
18 "github.com/go-kivik/kivik/v4"
19 "github.com/go-kivik/kivik/v4/kiviktest/kt"
20 )
21
22 func init() {
23 kt.Register("Copy", _copy)
24 }
25
26 func _copy(ctx *kt.Context) {
27 ctx.RunRW(func(ctx *kt.Context) {
28 dbname := ctx.TestDB()
29 db := ctx.Admin.DB(dbname, ctx.Options("db"))
30 if err := db.Err(); err != nil {
31 ctx.Fatalf("Failed to open db: %s", err)
32 }
33
34 doc := map[string]string{
35 "_id": "foo",
36 "name": "Robert",
37 }
38 rev, err := db.Put(context.Background(), doc["_id"], doc)
39 if err != nil {
40 ctx.Fatalf("Failed to create source doc: %s", err)
41 }
42 doc["_rev"] = rev
43
44 ddoc := map[string]string{
45 "_id": "_design/foo",
46 "name": "Robert",
47 }
48 rev, err = db.Put(context.Background(), ddoc["_id"], ddoc)
49 if err != nil {
50 ctx.Fatalf("Failed to create source design doc: %s", err)
51 }
52 ddoc["_rev"] = rev
53
54 local := map[string]string{
55 "_id": "_local/foo",
56 "name": "Robert",
57 }
58 rev, err = db.Put(context.Background(), local["_id"], local)
59 if err != nil {
60 ctx.Fatalf("Failed to create source design doc: %s", err)
61 }
62 local["_rev"] = rev
63
64 ctx.Run("group", func(ctx *kt.Context) {
65 ctx.RunAdmin(func(ctx *kt.Context) {
66 copyTest(ctx, ctx.Admin, dbname, doc)
67 copyTest(ctx, ctx.Admin, dbname, ddoc)
68 copyTest(ctx, ctx.Admin, dbname, local)
69 })
70 ctx.RunNoAuth(func(ctx *kt.Context) {
71 copyTest(ctx, ctx.NoAuth, dbname, doc)
72 copyTest(ctx, ctx.NoAuth, dbname, ddoc)
73 copyTest(ctx, ctx.NoAuth, dbname, local)
74 })
75 })
76 })
77 }
78
79 func copyTest(ctx *kt.Context, client *kivik.Client, dbname string, source map[string]string) {
80 ctx.Run(source["_id"], func(ctx *kt.Context) {
81 ctx.Parallel()
82 db := client.DB(dbname, ctx.Options("db"))
83 if err := db.Err(); err != nil {
84 ctx.Fatalf("Failed to open db: %s", err)
85 }
86 targetID := ctx.TestDBName()
87 rev, err := db.Copy(context.Background(), targetID, source["_id"])
88 if !ctx.IsExpectedSuccess(err) {
89 return
90 }
91 ctx.Run("RevCopy", func(ctx *kt.Context) {
92 cp := map[string]string{
93 "_id": targetID,
94 "name": "Bob",
95 "_rev": rev,
96 }
97 if _, e := db.Put(context.Background(), targetID, cp); e != nil {
98 ctx.Fatalf("Failed to update copy: %s", e)
99 }
100 targetID2 := ctx.TestDBName()
101 if _, e := db.Copy(context.Background(), targetID2, targetID, kivik.Rev(rev)); e != nil {
102 ctx.Fatalf("Failed to copy doc with rev option: %s", e)
103 }
104 var readCopy map[string]string
105 if err = db.Get(context.Background(), targetID2).ScanDoc(&readCopy); err != nil {
106 ctx.Fatalf("Failed to scan copy: %s", err)
107 }
108 if readCopy["name"] != "Robert" {
109 ctx.Errorf("Copy-with-rev failed. Name = %s, expected %s", readCopy["name"], "Robert")
110 }
111 })
112 })
113 }
114
View as plain text