...

Source file src/github.com/go-kivik/kivik/v4/x/kivikd/test/test.go

Documentation: github.com/go-kivik/kivik/v4/x/kivikd/test

     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  }
   188  

View as plain text