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("Put", put)
24 }
25
26 func put(ctx *kt.Context) {
27 ctx.RunRW(func(ctx *kt.Context) {
28 ctx.RunAdmin(func(ctx *kt.Context) {
29 testPut(ctx, ctx.Admin)
30 })
31 ctx.RunNoAuth(func(ctx *kt.Context) {
32 testPut(ctx, ctx.NoAuth)
33 })
34 })
35 }
36
37 func testPut(ctx *kt.Context, client *kivik.Client) {
38 ctx.Parallel()
39 dbName := ctx.TestDB()
40 db := client.DB(dbName, ctx.Options("db"))
41 if err := db.Err(); !ctx.IsExpectedSuccess(err) {
42 return
43 }
44 ctx.Run("group", func(ctx *kt.Context) {
45 ctx.Run("Create", func(ctx *kt.Context) {
46 const age = 32
47 ctx.Parallel()
48
49 doc := &testDoc{
50 ID: ctx.TestDBName(),
51 Name: "Alberto",
52 Age: age,
53 }
54 var rev string
55 err := kt.Retry(func() error {
56 var e error
57 rev, e = db.Put(context.Background(), doc.ID, doc)
58 return e
59 })
60 if !ctx.IsExpectedSuccess(err) {
61 return
62 }
63 doc.Rev = rev
64 doc.Age = 40
65 ctx.Run("Update", func(ctx *kt.Context) {
66 err := kt.Retry(func() error {
67 _, e := db.Put(context.Background(), doc.ID, doc)
68 return e
69 })
70 ctx.CheckError(err)
71 })
72 })
73 ctx.Run("DesignDoc", func(ctx *kt.Context) {
74 ctx.Parallel()
75 doc := map[string]interface{}{
76 "_id": "_design/testddoc",
77 "language": "javascript",
78 "views": map[string]interface{}{
79 "testview": map[string]interface{}{
80 "map": `function(doc) {
81 if (doc.include) {
82 emit(doc._id, doc.index);
83 }
84 }`,
85 },
86 },
87 }
88 err := kt.Retry(func() error {
89 _, err := db.Put(context.Background(), doc["_id"].(string), doc)
90 return err
91 })
92 ctx.CheckError(err)
93 })
94 ctx.Run("Local", func(ctx *kt.Context) {
95 ctx.Parallel()
96 doc := map[string]interface{}{
97 "_id": "_local/foo",
98 "name": "Bob",
99 }
100 err := kt.Retry(func() error {
101 _, err := db.Put(context.Background(), doc["_id"].(string), doc)
102 return err
103 })
104 ctx.CheckError(err)
105 })
106 ctx.Run("LeadingUnderscoreInID", func(ctx *kt.Context) {
107 ctx.Parallel()
108 doc := map[string]interface{}{
109 "_id": "_badid",
110 "name": "Bob",
111 }
112 err := kt.Retry(func() error {
113 _, err := db.Put(context.Background(), doc["_id"].(string), doc)
114 return err
115 })
116 ctx.CheckError(err)
117 })
118 ctx.Run("HeavilyEscapedID", func(ctx *kt.Context) {
119 ctx.Parallel()
120 doc := map[string]interface{}{
121 "_id": "foo+bar & spáces ?!*,",
122 "name": "Bob",
123 }
124 err := kt.Retry(func() error {
125 _, err := db.Put(context.Background(), doc["_id"].(string), doc)
126 return err
127 })
128 ctx.CheckError(err)
129 })
130 ctx.Run("SlashInID", func(ctx *kt.Context) {
131 ctx.Parallel()
132 doc := map[string]interface{}{
133 "_id": "foo/bar",
134 "name": "Bob",
135 }
136 err := kt.Retry(func() error {
137 _, err := db.Put(context.Background(), doc["_id"].(string), doc)
138 return err
139 })
140 ctx.CheckError(err)
141 })
142 ctx.Run("Conflict", func(ctx *kt.Context) {
143 ctx.Parallel()
144 doc := map[string]interface{}{
145 "_id": "duplicate",
146 "name": "Bob",
147 }
148 err := kt.Retry(func() error {
149 _, err := ctx.Admin.DB(dbName).Put(context.Background(), doc["_id"].(string), doc)
150 return err
151 })
152 if err != nil {
153 ctx.Fatalf("Failed to create document for duplicate test: %s", err)
154 }
155 err = kt.Retry(func() error {
156 _, err = db.Put(context.Background(), doc["_id"].(string), doc)
157 return err
158 })
159 ctx.CheckError(err)
160 })
161 })
162 }
163
View as plain text