github.com/go-kivik/kivik/v4@v4.3.2/x/kivikd/test/test.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 //go:build !js 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" // CouchDB driver 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" // Memory driver 37 "github.com/go-kivik/kivik/v4/x/proxydb" 38 ) 39 40 // RegisterKivikdSuites registers the Kivikd related integration test suites. 41 func RegisterKivikdSuites() { 42 kiviktest.RegisterSuite(kiviktest.SuiteKivikServer, kt.SuiteConfig{ 43 "AllDBs.expected": []string{}, 44 "AllDBs/RW.skip": true, // FIXME: Enable this when it's possible to delete DB from the server 45 46 "CreateDB/RW.skip": true, // FIXME: Update when the server can destroy databases 47 // "CreateDB/NoAuth.status": http.StatusUnauthorized, 48 // "CreateDB/Admin/Recreate.status": http.StatusPreconditionFailed, 49 50 "DestroyDB.skip": true, // FIXME: Update when the server can destroy databases 51 52 "AllDocs/Admin.databases": []string{"foo"}, 53 "AllDocs/Admin/foo.status": http.StatusNotFound, 54 "AllDocs/RW.skip": true, // FIXME: Update when the server can destroy databases 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, // FIXME: Update when the server can destroy databases 61 // "DBExists/RW/Admin.exists": true, 62 "DBExists/NoAuth.skip": true, // TODO 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, // FIXME: Fix this when we can delete database 74 75 "Put.skip": true, // FIXME: Fix this when we can write docs 76 77 "Flush.databases": []string{"chicken"}, 78 "Flush/Admin/chicken/DoFlush.status": http.StatusNotImplemented, // FIXME: Update when implemented 79 "Flush/NoAuth/chicken/DoFlush.status": http.StatusNotImplemented, // FIXME: Update when implemented 80 81 "Delete.skip": true, // FIXME: Fix this when we can delete docs. 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, // FIXME: Unimplemented 114 "AllDBsStats.skip": true, // FIXME: Unimplemented 115 "Stats.skip": true, // FIXME: Unimplemented 116 "CreateDoc.skip": true, // FIXME: Unimplemented 117 "Compact.skip": true, // FIXME: Unimplemented 118 "ViewCleanup.skip": true, // FIXME: Unimplemented 119 "Security.skip": true, // FIXME: Unimplemented 120 "SetSecurity.skip": true, // FIXME: Unimplemented 121 "GetRev.skip": true, // FIXME: When Get works 122 "DBUpdates.skip": true, // FIXME: Unimplemented 123 "Changes.skip": true, // FIXME: Unimplemented 124 "Copy.skip": true, // FIXME: Unimplemented, depends on Get/Put or Copy 125 "BulkDocs.skip": true, // FIXME: Unimplemented 126 "GetAttachment.skip": true, // FIXME: Unimplemented 127 "GetAttachmentMeta.skip": true, // FIXME: Unimplemented 128 "PutAttachment.skip": true, // FIXME: Unimplemented 129 "DeleteAttachment.skip": true, // FIXME: Unimplemented 130 "Query.skip": true, // FIXME: Unimplemented 131 "Find.skip": true, // FIXME: Unimplemented 132 "Explain.skip": true, // FIXME: Unimplemented 133 "CreateIndex.skip": true, // FIXME: Unimplemented 134 "GetIndexes.skip": true, // FIXME: Unimplemented 135 "DeleteIndex.skip": true, // FIXME: Unimplemented 136 "GetReplications.skip": true, // FIXME: Unimplemented 137 "Replicate.skip": true, // FIXME: Unimplemented 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 // ServerTest tests the kivikd server 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 // Set admin/abc123 credentials 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 }