github.com/go-kivik/kivik/v4@v4.3.2/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 kivik 14 15 import ( 16 "context" 17 "errors" 18 "fmt" 19 "net/http" 20 "testing" 21 22 "gitlab.com/flimzy/testy" 23 24 "github.com/go-kivik/kivik/v4/driver" 25 internal "github.com/go-kivik/kivik/v4/int/errors" 26 "github.com/go-kivik/kivik/v4/int/mock" 27 ) 28 29 func TestConfig(t *testing.T) { 30 type tst struct { 31 client *Client 32 node string 33 expected Config 34 status int 35 err string 36 } 37 tests := testy.NewTable() 38 tests.Add("non-configer", tst{ 39 client: &Client{driverClient: &mock.Client{}}, 40 status: http.StatusNotImplemented, 41 err: "kivik: driver does not support Config interface", 42 }) 43 tests.Add("error", tst{ 44 client: &Client{driverClient: &mock.Configer{ 45 ConfigFunc: func(context.Context, string) (driver.Config, error) { 46 return nil, errors.New("conf error") 47 }, 48 }}, 49 status: http.StatusInternalServerError, 50 err: "conf error", 51 }) 52 tests.Add("success", tst{ 53 client: &Client{driverClient: &mock.Configer{ 54 ConfigFunc: func(_ context.Context, node string) (driver.Config, error) { 55 if node != "foo" { 56 return nil, fmt.Errorf("Unexpected node: %s", node) 57 } 58 return driver.Config{ 59 "foo": driver.ConfigSection{"asd": "rew"}, 60 }, nil 61 }, 62 }}, 63 node: "foo", 64 expected: Config{ 65 "foo": ConfigSection{"asd": "rew"}, 66 }, 67 }) 68 tests.Add("closed", tst{ 69 client: &Client{ 70 closed: true, 71 }, 72 status: http.StatusServiceUnavailable, 73 err: "kivik: client closed", 74 }) 75 76 tests.Run(t, func(t *testing.T, test tst) { 77 result, err := test.client.Config(context.Background(), test.node) 78 if d := internal.StatusErrorDiff(test.err, test.status, err); d != "" { 79 t.Error(d) 80 } 81 if d := testy.DiffInterface(test.expected, result); d != nil { 82 t.Error(d) 83 } 84 }) 85 } 86 87 func TestConfigSection(t *testing.T) { 88 type tst struct { 89 client *Client 90 node, section string 91 expected ConfigSection 92 status int 93 err string 94 } 95 tests := testy.NewTable() 96 tests.Add("non-configer", tst{ 97 client: &Client{driverClient: &mock.Client{}}, 98 status: http.StatusNotImplemented, 99 err: "kivik: driver does not support Config interface", 100 }) 101 tests.Add("error", tst{ 102 client: &Client{driverClient: &mock.Configer{ 103 ConfigSectionFunc: func(context.Context, string, string) (driver.ConfigSection, error) { 104 return nil, errors.New("conf error") 105 }, 106 }}, 107 status: http.StatusInternalServerError, 108 err: "conf error", 109 }) 110 tests.Add("success", tst{ 111 client: &Client{driverClient: &mock.Configer{ 112 ConfigSectionFunc: func(_ context.Context, node, section string) (driver.ConfigSection, error) { 113 if node != "foo" { 114 return nil, fmt.Errorf("Unexpected node: %s", node) 115 } 116 if section != "foo" { 117 return nil, fmt.Errorf("Unexpected section: %s", section) 118 } 119 return driver.ConfigSection{"lkj": "ghj"}, nil 120 }, 121 }}, 122 node: "foo", 123 section: "foo", 124 expected: ConfigSection{"lkj": "ghj"}, 125 }) 126 tests.Add("closed", tst{ 127 client: &Client{ 128 closed: true, 129 }, 130 status: http.StatusServiceUnavailable, 131 err: "kivik: client closed", 132 }) 133 134 tests.Run(t, func(t *testing.T, test tst) { 135 result, err := test.client.ConfigSection(context.Background(), test.node, test.section) 136 if d := internal.StatusErrorDiff(test.err, test.status, err); d != "" { 137 t.Error(d) 138 } 139 if d := testy.DiffInterface(test.expected, result); d != nil { 140 t.Error(d) 141 } 142 }) 143 } 144 145 func TestConfigValue(t *testing.T) { 146 type tst struct { 147 client *Client 148 node, section, key string 149 expected string 150 status int 151 err string 152 } 153 tests := testy.NewTable() 154 tests.Add("non-configer", tst{ 155 client: &Client{driverClient: &mock.Client{}}, 156 status: http.StatusNotImplemented, 157 err: "kivik: driver does not support Config interface", 158 }) 159 tests.Add("error", tst{ 160 client: &Client{driverClient: &mock.Configer{ 161 ConfigValueFunc: func(context.Context, string, string, string) (string, error) { 162 return "", errors.New("conf error") 163 }, 164 }}, 165 status: http.StatusInternalServerError, 166 err: "conf error", 167 }) 168 tests.Add("success", tst{ 169 client: &Client{driverClient: &mock.Configer{ 170 ConfigValueFunc: func(_ context.Context, node, section, key string) (string, error) { 171 if node != "foo" { 172 return "", fmt.Errorf("Unexpected node: %s", node) 173 } 174 if section != "foo" { 175 return "", fmt.Errorf("Unexpected section: %s", section) 176 } 177 if key != "asd" { 178 return "", fmt.Errorf("Unexpected key: %s", key) 179 } 180 return "jkl", nil 181 }, 182 }}, 183 node: "foo", 184 section: "foo", 185 key: "asd", 186 expected: "jkl", 187 }) 188 tests.Add("closed", tst{ 189 client: &Client{ 190 closed: true, 191 }, 192 status: http.StatusServiceUnavailable, 193 err: "kivik: client closed", 194 }) 195 196 tests.Run(t, func(t *testing.T, test tst) { 197 result, err := test.client.ConfigValue(context.Background(), test.node, test.section, test.key) 198 if d := internal.StatusErrorDiff(test.err, test.status, err); d != "" { 199 t.Error(d) 200 } 201 if d := testy.DiffInterface(test.expected, result); d != nil { 202 t.Error(d) 203 } 204 }) 205 } 206 207 func TestSetConfigValue(t *testing.T) { 208 type tst struct { 209 client *Client 210 node, section, key, value string 211 expected string 212 status int 213 err string 214 } 215 tests := testy.NewTable() 216 tests.Add("non-configer", tst{ 217 client: &Client{driverClient: &mock.Client{}}, 218 status: http.StatusNotImplemented, 219 err: "kivik: driver does not support Config interface", 220 }) 221 tests.Add("error", tst{ 222 client: &Client{driverClient: &mock.Configer{ 223 SetConfigValueFunc: func(context.Context, string, string, string, string) (string, error) { 224 return "", errors.New("conf error") 225 }, 226 }}, 227 status: http.StatusInternalServerError, 228 err: "conf error", 229 }) 230 tests.Add("success", tst{ 231 client: &Client{driverClient: &mock.Configer{ 232 SetConfigValueFunc: func(_ context.Context, node, section, key, value string) (string, error) { 233 if node != "foo" { 234 return "", fmt.Errorf("Unexpected node: %s", node) 235 } 236 if section != "foo" { 237 return "", fmt.Errorf("Unexpected section: %s", section) 238 } 239 if key != "vbn" { 240 return "", fmt.Errorf("Unexpected key: %s", key) 241 } 242 if value != "baz" { 243 return "", fmt.Errorf("Unexpected value: %s", value) 244 } 245 return "old", nil 246 }, 247 }}, 248 node: "foo", 249 section: "foo", 250 key: "vbn", 251 value: "baz", 252 expected: "old", 253 }) 254 tests.Add("closed", tst{ 255 client: &Client{ 256 closed: true, 257 }, 258 status: http.StatusServiceUnavailable, 259 err: "kivik: client closed", 260 }) 261 262 tests.Run(t, func(t *testing.T, test tst) { 263 result, err := test.client.SetConfigValue(context.Background(), test.node, test.section, test.key, test.value) 264 if d := internal.StatusErrorDiff(test.err, test.status, err); d != "" { 265 t.Error(d) 266 } 267 if d := testy.DiffInterface(test.expected, result); d != nil { 268 t.Error(d) 269 } 270 }) 271 } 272 273 func TestDeleteConfigKey(t *testing.T) { 274 type tst struct { 275 client *Client 276 node, section, key string 277 expected string 278 status int 279 err string 280 } 281 tests := testy.NewTable() 282 tests.Add("non-configer", tst{ 283 client: &Client{driverClient: &mock.Client{}}, 284 status: http.StatusNotImplemented, 285 err: "kivik: driver does not support Config interface", 286 }) 287 tests.Add("error", tst{ 288 client: &Client{driverClient: &mock.Configer{ 289 DeleteConfigKeyFunc: func(context.Context, string, string, string) (string, error) { 290 return "", errors.New("conf error") 291 }, 292 }}, 293 status: http.StatusInternalServerError, 294 err: "conf error", 295 }) 296 tests.Add("success", tst{ 297 client: &Client{driverClient: &mock.Configer{ 298 DeleteConfigKeyFunc: func(_ context.Context, node, section, key string) (string, error) { 299 if node != "foo" { 300 return "", fmt.Errorf("Unexpected node: %s", node) 301 } 302 if section != "foo" { 303 return "", fmt.Errorf("Unexpected section: %s", section) 304 } 305 if key != "baz" { 306 return "", fmt.Errorf("Unexpected key: %s", key) 307 } 308 return "old", nil 309 }, 310 }}, 311 node: "foo", 312 section: "foo", 313 key: "baz", 314 expected: "old", 315 }) 316 tests.Add("closed", tst{ 317 client: &Client{ 318 closed: true, 319 }, 320 status: http.StatusServiceUnavailable, 321 err: "kivik: client closed", 322 }) 323 324 tests.Run(t, func(t *testing.T, test tst) { 325 result, err := test.client.DeleteConfigKey(context.Background(), test.node, test.section, test.key) 326 if d := internal.StatusErrorDiff(test.err, test.status, err); d != "" { 327 t.Error(d) 328 } 329 if d := testy.DiffInterface(test.expected, result); d != nil { 330 t.Error(d) 331 } 332 }) 333 }