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