1
2
3
4
5
6
7
8
9
10
11
12
13 package main
14
15 import (
16 "context"
17 "reflect"
18 "testing"
19
20 "gitlab.com/flimzy/testy"
21
22 kivik "github.com/go-kivik/kivik/v4"
23 "github.com/go-kivik/kivik/v4/driver"
24 )
25
26 type testDriver interface {
27 WithCtx(context.Context) error
28 NoCtx(string) error
29 WithOptions(string, driver.Options)
30 }
31
32 type testClient struct{}
33
34 func (c *testClient) WithCtx(context.Context) error { return nil }
35 func (c *testClient) NoCtx(string) error { return nil }
36 func (c *testClient) WithOptions(string, ...kivik.Option) {}
37
38 func TestMethods(t *testing.T) {
39 type tst struct {
40 input interface{}
41 isClient bool
42 expected []*method
43 err string
44 }
45 tests := testy.NewTable()
46 tests.Add("non-struct", tst{
47 input: 123,
48 err: "input must be struct",
49 })
50 tests.Add("wrong field name", tst{
51 input: struct{ Y int }{},
52 err: "wrapper struct must have a single field: X",
53 })
54 tests.Add("non-interface", tst{
55 input: struct{ X int }{},
56 err: "field X must be of type interface",
57 })
58 tests.Add("testDriver", tst{
59 input: struct{ X testDriver }{},
60 expected: []*method{
61 {
62 Name: "NoCtx",
63 ReturnsError: true,
64 Accepts: []reflect.Type{typeString},
65 },
66 {
67 Name: "WithCtx",
68 AcceptsContext: true,
69 ReturnsError: true,
70 },
71 {
72 Name: "WithOptions",
73 AcceptsOptions: true,
74 Accepts: []reflect.Type{typeString},
75 },
76 },
77 })
78 tests.Add("invalid client", tst{
79 input: struct{ X int }{},
80 isClient: true,
81 err: "field X must be of type pointer to struct",
82 })
83 tests.Add("testClient", tst{
84 input: struct{ X testClient }{},
85 isClient: true,
86 err: "field X must be of type pointer to struct",
87 })
88 tests.Add("*testClient", tst{
89 input: struct{ X *testClient }{},
90 isClient: true,
91 expected: []*method{
92 {
93 Name: "NoCtx",
94 ReturnsError: true,
95 Accepts: []reflect.Type{typeString},
96 },
97 {
98 Name: "WithCtx",
99 AcceptsContext: true,
100 ReturnsError: true,
101 },
102 {
103 Name: "WithOptions",
104 AcceptsOptions: true,
105 Accepts: []reflect.Type{typeString},
106 },
107 },
108 })
109
110 tests.Run(t, func(t *testing.T, test tst) {
111 result, err := parseMethods(test.input, test.isClient, nil)
112 if !testy.ErrorMatches(test.err, err) {
113 t.Errorf("Unexpected error: %s", err)
114 }
115 if d := testy.DiffInterface(test.expected, result); d != nil {
116 t.Error(d)
117 }
118 })
119 }
120
View as plain text