1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package test
16
17 import (
18 "net/http"
19 "net/http/httptest"
20 "net/url"
21 "testing"
22
23 "github.com/spf13/viper"
24
25 "github.com/go-kivik/kivik/v4"
26 _ "github.com/go-kivik/kivik/v4/couchdb"
27 "github.com/go-kivik/kivik/v4/driver"
28 "github.com/go-kivik/kivik/v4/kiviktest"
29 "github.com/go-kivik/kivik/v4/kiviktest/kt"
30 "github.com/go-kivik/kivik/v4/x/kivikd"
31 "github.com/go-kivik/kivik/v4/x/kivikd/auth"
32 "github.com/go-kivik/kivik/v4/x/kivikd/auth/basic"
33 "github.com/go-kivik/kivik/v4/x/kivikd/auth/cookie"
34 "github.com/go-kivik/kivik/v4/x/kivikd/authdb/confadmin"
35 "github.com/go-kivik/kivik/v4/x/kivikd/conf"
36 _ "github.com/go-kivik/kivik/v4/x/memorydb"
37 "github.com/go-kivik/kivik/v4/x/proxydb"
38 )
39
40
41 func RegisterKivikdSuites() {
42 kiviktest.RegisterSuite(kiviktest.SuiteKivikServer, kt.SuiteConfig{
43 "AllDBs.expected": []string{},
44 "AllDBs/RW.skip": true,
45
46 "CreateDB/RW.skip": true,
47
48
49
50 "DestroyDB.skip": true,
51
52 "AllDocs/Admin.databases": []string{"foo"},
53 "AllDocs/Admin/foo.status": http.StatusNotFound,
54 "AllDocs/RW.skip": true,
55 "AllDocs/NoAuth.databases": []string{"foo"},
56 "AllDocs/NoAuth/foo.status": http.StatusNotFound,
57
58 "DBExists.databases": []string{"chicken"},
59 "DBExists/Admin/chicken.exists": false,
60 "DBExists/RW.skip": true,
61
62 "DBExists/NoAuth.skip": true,
63
64 "Log/Admin/Offset-1000.status": http.StatusBadRequest,
65 "Log/Admin/HTTP/TextBytes.status": http.StatusBadRequest,
66 "Log/Admin/HTTP/NegativeBytes.status": http.StatusBadRequest,
67 "Log/NoAuth/Offset-1000.status": http.StatusBadRequest,
68
69 "Version.version": `^0\.0\.0$`,
70 "Version.vendor": "Kivik",
71 "Version.vendor_version": `^0\.0\.1$`,
72
73 "Get.skip": true,
74
75 "Put.skip": true,
76
77 "Flush.databases": []string{"chicken"},
78 "Flush/Admin/chicken/DoFlush.status": http.StatusNotImplemented,
79 "Flush/NoAuth/chicken/DoFlush.status": http.StatusNotImplemented,
80
81 "Delete.skip": true,
82
83 "Session/Get/Admin.info.authentication_handlers": "default,cookie",
84 "Session/Get/Admin.info.authentication_db": "",
85 "Session/Get/Admin.info.authenticated": "cookie",
86 "Session/Get/Admin.userCtx.roles": "_admin",
87 "Session/Get/Admin.ok": "true",
88 "Session/Get/NoAuth.info.authentication_handlers": "default,cookie",
89 "Session/Get/NoAuth.info.authentication_db": "",
90 "Session/Get/NoAuth.info.authenticated": "",
91 "Session/Get/NoAuth.userCtx.roles": "",
92 "Session/Get/NoAuth.ok": "true",
93
94 "Session/Post/EmptyJSON.status": http.StatusBadRequest,
95 "Session/Post/BogusTypeJSON.status": http.StatusBadRequest,
96 "Session/Post/BogusTypeForm.status": http.StatusBadRequest,
97 "Session/Post/EmptyForm.status": http.StatusBadRequest,
98 "Session/Post/BadJSON.status": http.StatusBadRequest,
99 "Session/Post/BadForm.status": http.StatusBadRequest,
100 "Session/Post/MeaninglessJSON.status": http.StatusBadRequest,
101 "Session/Post/MeaninglessForm.status": http.StatusBadRequest,
102 "Session/Post/GoodJSON.status": http.StatusUnauthorized,
103 "Session/Post/BadQueryParam.status": http.StatusUnauthorized,
104 "Session/Post/BadCredsJSON.status": http.StatusUnauthorized,
105 "Session/Post/BadCredsForm.status": http.StatusUnauthorized,
106 "Session/Post/GoodCredsJSONRemoteRedirAbsolute.status": http.StatusBadRequest,
107 "Session/Post/GoodCredsJSONRedirRelativeNoSlash.status": http.StatusBadRequest,
108 "Session/Post/GoodCredsJSONRemoteRedirHeaderInjection.status": http.StatusBadRequest,
109 "Session/Post/GoodCredsJSONRemoteRedirInvalidURL.status": http.StatusBadRequest,
110 "Session/Post/GoodCredsJSONRedirEmpty.status": http.StatusBadRequest,
111 "Session/Post/GoodCredsJSONRedirSchemaless.status": http.StatusBadRequest,
112
113 "DBsStats.skip": true,
114 "AllDBsStats.skip": true,
115 "Stats.skip": true,
116 "CreateDoc.skip": true,
117 "Compact.skip": true,
118 "ViewCleanup.skip": true,
119 "Security.skip": true,
120 "SetSecurity.skip": true,
121 "GetRev.skip": true,
122 "DBUpdates.skip": true,
123 "Changes.skip": true,
124 "Copy.skip": true,
125 "BulkDocs.skip": true,
126 "GetAttachment.skip": true,
127 "GetAttachmentMeta.skip": true,
128 "PutAttachment.skip": true,
129 "DeleteAttachment.skip": true,
130 "Query.skip": true,
131 "Find.skip": true,
132 "Explain.skip": true,
133 "CreateIndex.skip": true,
134 "GetIndexes.skip": true,
135 "DeleteIndex.skip": true,
136 "GetReplications.skip": true,
137 "Replicate.skip": true,
138 })
139 }
140
141 type customDriver struct {
142 driver.Client
143 }
144
145 func (cd customDriver) NewClient(string, driver.Options) (driver.Client, error) {
146 return cd, nil
147 }
148
149
150 func ServerTest(t *testing.T) {
151 t.Helper()
152 memClient, err := kivik.New("memory", "")
153 if err != nil {
154 t.Fatalf("Failed to connect to memory driver: %s", err)
155 }
156 kivik.Register("custom", customDriver{proxydb.NewClient(memClient)})
157 backend, err := kivik.New("custom", "")
158 if err != nil {
159 t.Fatalf("Failed to connect to custom driver: %s", err)
160 }
161 c := &conf.Conf{Viper: viper.New()}
162
163 c.Set("admins.admin", "-pbkdf2-792221164f257de22ad72a8e94760388233e5714,7897f3451f59da741c87ec5f10fe7abe,10")
164 service := kivikd.Service{}
165 service.Config = c
166 service.Client = backend
167 service.UserStore = confadmin.New(c)
168 service.AuthHandlers = []auth.Handler{
169 &basic.HTTPBasicAuth{},
170 &cookie.Auth{},
171 }
172 handler, err := service.Init()
173 if err != nil {
174 t.Fatalf("Failed to initialize server: %s\n", err)
175 }
176 server := httptest.NewServer(handler)
177 defer server.Close()
178
179 dsn, _ := url.Parse(server.URL)
180 dsn.User = url.UserPassword("admin", "abc123")
181 clients, err := kiviktest.ConnectClients(t, "couch", dsn.String(), nil)
182 if err != nil {
183 t.Fatalf("Failed to initialize client: %s", err)
184 }
185 clients.RW = true
186 kiviktest.RunTestsInternal(clients, kiviktest.SuiteKivikServer)
187 }
188
View as plain text