github.com/go-kivik/kivik/v4@v4.3.2/couchdb/config_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 package couchdb 14 15 import ( 16 "context" 17 "encoding/json" 18 "errors" 19 "fmt" 20 "io" 21 "net/http" 22 "strings" 23 "testing" 24 25 "gitlab.com/flimzy/testy" 26 27 "github.com/go-kivik/kivik/v4/driver" 28 internal "github.com/go-kivik/kivik/v4/int/errors" 29 ) 30 31 func TestConfig(t *testing.T) { 32 type tst struct { 33 client *client 34 node string 35 expected driver.Config 36 status int 37 err string 38 } 39 tests := testy.NewTable() 40 tests.Add("network error", tst{ 41 client: newTestClient(nil, errors.New("net error")), 42 node: "local", 43 status: http.StatusBadGateway, 44 err: `^Get "?http://example.com/_node/local/_config"?: net error$`, 45 }) 46 tests.Add("Couch 1.x path", tst{ 47 client: newTestClient(nil, errors.New("net error")), 48 node: couch1ConfigNode, 49 status: http.StatusBadGateway, 50 err: `^Get "?http://example.com/_config"?: net error$`, 51 }) 52 tests.Add("success", tst{ 53 client: newTestClient(&http.Response{ 54 StatusCode: http.StatusOK, 55 Body: io.NopCloser(strings.NewReader(`{"foo":{"asd":"baz"}}`)), 56 }, nil), 57 node: "local", 58 expected: driver.Config{ 59 "foo": driver.ConfigSection{"asd": "baz"}, 60 }, 61 }) 62 63 tests.Run(t, func(t *testing.T, test tst) { 64 result, err := test.client.Config(context.Background(), test.node) 65 if d := internal.StatusErrorDiffRE(test.err, test.status, err); d != "" { 66 t.Error(d) 67 } 68 if err != nil { 69 return 70 } 71 if d := testy.DiffInterface(test.expected, result); d != nil { 72 t.Error(d) 73 } 74 }) 75 } 76 77 func TestConfigSection(t *testing.T) { 78 type tst struct { 79 client *client 80 node, section string 81 expected driver.ConfigSection 82 status int 83 err string 84 } 85 tests := testy.NewTable() 86 tests.Add("network error", tst{ 87 client: newTestClient(nil, errors.New("net error")), 88 node: "local", 89 section: "foo", 90 status: http.StatusBadGateway, 91 err: `^Get "?http://example.com/_node/local/_config/foo"?: net error$`, 92 }) 93 tests.Add("Couch 1.x path", tst{ 94 client: newTestClient(nil, errors.New("net error")), 95 node: couch1ConfigNode, 96 section: "foo", 97 status: http.StatusBadGateway, 98 err: `^Get "?http://example.com/_config/foo"?: net error$`, 99 }) 100 tests.Add("success", tst{ 101 client: newTestClient(&http.Response{ 102 StatusCode: http.StatusOK, 103 Body: io.NopCloser(strings.NewReader(`{"fds":"baz"}`)), 104 }, nil), 105 node: "local", 106 section: "foo", 107 expected: driver.ConfigSection{"fds": "baz"}, 108 }) 109 110 tests.Run(t, func(t *testing.T, test tst) { 111 result, err := test.client.ConfigSection(context.Background(), test.node, test.section) 112 if d := internal.StatusErrorDiffRE(test.err, test.status, err); d != "" { 113 t.Error(d) 114 } 115 if err != nil { 116 return 117 } 118 if d := testy.DiffInterface(test.expected, result); d != nil { 119 t.Error(d) 120 } 121 }) 122 } 123 124 func TestConfigValue(t *testing.T) { 125 type tst struct { 126 client *client 127 node, section, key string 128 expected string 129 status int 130 err string 131 } 132 tests := testy.NewTable() 133 tests.Add("network error", tst{ 134 client: newTestClient(nil, errors.New("net error")), 135 node: "local", 136 section: "foo", 137 key: "tre", 138 status: http.StatusBadGateway, 139 err: `Get "?http://example.com/_node/local/_config/foo/tre"?: net error`, 140 }) 141 tests.Add("Couch 1.x path", tst{ 142 client: newTestClient(nil, errors.New("net error")), 143 node: couch1ConfigNode, 144 section: "foo", 145 key: "bar", 146 status: http.StatusBadGateway, 147 err: `Get "?http://example.com/_config/foo/bar"?: net error`, 148 }) 149 tests.Add("success", tst{ 150 client: newTestClient(&http.Response{ 151 StatusCode: http.StatusOK, 152 Body: io.NopCloser(strings.NewReader(`"baz"`)), 153 }, nil), 154 node: "local", 155 section: "foo", 156 key: "bar", 157 expected: "baz", 158 }) 159 160 tests.Run(t, func(t *testing.T, test tst) { 161 result, err := test.client.ConfigValue(context.Background(), test.node, test.section, test.key) 162 if d := internal.StatusErrorDiffRE(test.err, test.status, err); d != "" { 163 t.Error(d) 164 } 165 if d := testy.DiffInterface(test.expected, result); d != nil { 166 t.Error(d) 167 } 168 }) 169 } 170 171 func TestSetConfigValue(t *testing.T) { 172 type tst struct { 173 client *client 174 node, section, key, value string 175 expected string 176 status int 177 err string 178 } 179 tests := testy.NewTable() 180 tests.Add("network error", tst{ 181 client: newTestClient(nil, errors.New("net error")), 182 node: "local", 183 section: "foo", 184 key: "bar", 185 status: http.StatusBadGateway, 186 err: `Put "?http://example.com/_node/local/_config/foo/bar"?: net error`, 187 }) 188 tests.Add("Couch 1.x path", tst{ 189 client: newTestClient(nil, errors.New("net error")), 190 node: couch1ConfigNode, 191 section: "foo", 192 key: "bar", 193 status: http.StatusBadGateway, 194 err: `^Put "?http://example.com/_config/foo/bar"?: net error$`, 195 }) 196 tests.Add("success", tst{ 197 client: newCustomClient(func(r *http.Request) (*http.Response, error) { 198 var val string 199 defer r.Body.Close() // nolint: errcheck 200 if err := json.NewDecoder(r.Body).Decode(&val); err != nil { 201 return nil, err 202 } 203 if val != "baz" { 204 return nil, fmt.Errorf("Unexpected value: %s", val) 205 } 206 207 return &http.Response{ 208 StatusCode: http.StatusOK, 209 Body: io.NopCloser(strings.NewReader(`"old"`)), 210 }, nil 211 }), 212 node: "local", 213 section: "foo", 214 key: "bar", 215 value: "baz", 216 expected: "old", 217 }) 218 219 tests.Run(t, func(t *testing.T, test tst) { 220 result, err := test.client.SetConfigValue(context.Background(), test.node, test.section, test.key, test.value) 221 if d := internal.StatusErrorDiffRE(test.err, test.status, err); d != "" { 222 t.Error(d) 223 } 224 if d := testy.DiffInterface(test.expected, result); d != nil { 225 t.Error(d) 226 } 227 }) 228 } 229 230 func TestDeleteConfigKey(t *testing.T) { 231 type tst struct { 232 client *client 233 node, section, key string 234 expected string 235 status int 236 err string 237 } 238 tests := testy.NewTable() 239 tests.Add("network error", tst{ 240 client: newTestClient(nil, errors.New("net error")), 241 node: "local", 242 section: "foo", 243 key: "bar", 244 status: http.StatusBadGateway, 245 err: `Delete "?http://example.com/_node/local/_config/foo/bar"?: net error`, 246 }) 247 tests.Add("Couch 1.x path", tst{ 248 client: newTestClient(nil, errors.New("net error")), 249 node: couch1ConfigNode, 250 section: "foo", 251 key: "bar", 252 status: http.StatusBadGateway, 253 err: `Delete "?http://example.com/_config/foo/bar"?: net error`, 254 }) 255 tests.Add("success", tst{ 256 client: newTestClient(&http.Response{ 257 StatusCode: http.StatusOK, 258 Body: io.NopCloser(strings.NewReader(`"old"`)), 259 }, nil), 260 node: "local", 261 section: "foo", 262 key: "bar", 263 expected: "old", 264 }) 265 266 tests.Run(t, func(t *testing.T, test tst) { 267 result, err := test.client.DeleteConfigKey(context.Background(), test.node, test.section, test.key) 268 if d := internal.StatusErrorDiffRE(test.err, test.status, err); d != "" { 269 t.Error(d) 270 } 271 if d := testy.DiffInterface(test.expected, result); d != nil { 272 t.Error(d) 273 } 274 }) 275 }