github.com/go-kivik/kivik/v4@v4.3.2/kiviktest/db/put.go (about) 1 // Licensed under the Apache License, Version 2.0 (the "License"); you may not 2 // use this file except in compliance with the License. You may obtain a copy of 3 // the License at 4 // 5 // http://www.apache.org/licenses/LICENSE-2.0 6 // 7 // Unless required by applicable law or agreed to in writing, software 8 // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 9 // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 10 // License for the specific language governing permissions and limitations under 11 // the License. 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 }