1package db 2 3import ( 4 "context" 5 6 "github.com/flimzy/diff" 7 8 "github.com/flimzy/kivik" 9 "github.com/go-kivik/kiviktest/kt" 10) 11 12func init() { 13 kt.Register("Get", get) 14} 15 16type testDoc struct { 17 ID string `json:"_id"` 18 Rev string `json:"_rev,omitempty"` 19 Name string `json:"name"` 20 Age int `json:"age"` 21} 22 23func get(ctx *kt.Context) { 24 ctx.RunRW(func(ctx *kt.Context) { 25 dbName := ctx.TestDB() 26 defer ctx.Admin.DestroyDB(context.Background(), dbName, ctx.Options("db")) // nolint: errcheck 27 db, err := ctx.Admin.DB(context.Background(), dbName, ctx.Options("db")) 28 if err != nil { 29 ctx.Fatalf("Failed to connect to test db: %s", err) 30 } 31 32 doc := &testDoc{ 33 ID: "bob", 34 Name: "Robert", 35 Age: 32, 36 } 37 rev, err := db.Put(context.Background(), doc.ID, doc) 38 if err != nil { 39 ctx.Fatalf("Failed to create doc in test db: %s", err) 40 } 41 doc.Rev = rev 42 43 ddoc := &testDoc{ 44 ID: "_design/foo", 45 Name: "Designer", 46 } 47 rev, err = db.Put(context.Background(), ddoc.ID, ddoc) 48 if err != nil { 49 ctx.Fatalf("Failed to create design doc in test db: %s", err) 50 } 51 ddoc.Rev = rev 52 53 local := &testDoc{ 54 ID: "_local/foo", 55 Name: "Designer", 56 } 57 rev, err = db.Put(context.Background(), local.ID, local) 58 if err != nil { 59 ctx.Fatalf("Failed to create local doc in test db: %s", err) 60 } 61 local.Rev = rev 62 63 ctx.Run("group", func(ctx *kt.Context) { 64 ctx.RunAdmin(func(ctx *kt.Context) { 65 ctx.Parallel() 66 db, err := ctx.Admin.DB(context.Background(), dbName, ctx.Options("db")) 67 if !ctx.IsExpectedSuccess(err) { 68 return 69 } 70 testGet(ctx, db, doc) 71 testGet(ctx, db, ddoc) 72 testGet(ctx, db, local) 73 testGet(ctx, db, &testDoc{ID: "bogus"}) 74 }) 75 ctx.RunNoAuth(func(ctx *kt.Context) { 76 ctx.Parallel() 77 db, err := ctx.NoAuth.DB(context.Background(), dbName, ctx.Options("db")) 78 if !ctx.IsExpectedSuccess(err) { 79 return 80 } 81 testGet(ctx, db, doc) 82 testGet(ctx, db, ddoc) 83 testGet(ctx, db, local) 84 testGet(ctx, db, &testDoc{ID: "bogus"}) 85 }) 86 }) 87 }) 88} 89 90func testGet(ctx *kt.Context, db *kivik.DB, expectedDoc *testDoc) { 91 ctx.Run(expectedDoc.ID, func(ctx *kt.Context) { 92 ctx.Parallel() 93 row, err := db.Get(context.Background(), expectedDoc.ID) 94 if !ctx.IsExpectedSuccess(err) { 95 return 96 } 97 doc := &testDoc{} 98 if err = row.ScanDoc(&doc); err != nil { 99 ctx.Fatalf("Failed to scan doc: %s", err) 100 } 101 if d := diff.AsJSON(expectedDoc, doc); d != nil { 102 ctx.Errorf("Fetched document not as expected:\n%s\n", d) 103 } 104 }) 105} 106