|
6 | 6 | "sort"
|
7 | 7 | "testing"
|
8 | 8 |
|
| 9 | + "github.com/stretchr/testify/assert" |
9 | 10 | "github.com/stretchr/testify/require"
|
10 | 11 |
|
11 | 12 | "github.com/getkin/kin-openapi/openapi3"
|
@@ -249,7 +250,16 @@ func TestServerPath(t *testing.T) {
|
249 | 250 | "http://example.com:{port}/path",
|
250 | 251 | map[string]string{
|
251 | 252 | "port": "8088",
|
252 |
| - })}, |
| 253 | + }), |
| 254 | + newServerWithVariables( |
| 255 | + "{server}", |
| 256 | + map[string]string{ |
| 257 | + "server": "/", |
| 258 | + }), |
| 259 | + newServerWithVariables( |
| 260 | + "/", |
| 261 | + nil, |
| 262 | + )}, |
253 | 263 | })
|
254 | 264 | require.NoError(t, err)
|
255 | 265 | }
|
@@ -325,6 +335,157 @@ func TestRelativeURL(t *testing.T) {
|
325 | 335 | require.Equal(t, "/hello", route.Path)
|
326 | 336 | }
|
327 | 337 |
|
| 338 | +func Test_makeServers(t *testing.T) { |
| 339 | + type testStruct struct { |
| 340 | + name string |
| 341 | + servers openapi3.Servers |
| 342 | + want []srv |
| 343 | + wantErr bool |
| 344 | + initFn func(tt *testStruct) |
| 345 | + } |
| 346 | + tests := []testStruct{ |
| 347 | + { |
| 348 | + name: "server is root path", |
| 349 | + servers: openapi3.Servers{ |
| 350 | + newServerWithVariables("/", nil), |
| 351 | + }, |
| 352 | + want: []srv{{ |
| 353 | + schemes: nil, |
| 354 | + host: "", |
| 355 | + base: "", |
| 356 | + server: nil, |
| 357 | + varsUpdater: nil, |
| 358 | + }}, |
| 359 | + wantErr: false, |
| 360 | + initFn: func(tt *testStruct) { |
| 361 | + for i, server := range tt.servers { |
| 362 | + tt.want[i].server = server |
| 363 | + } |
| 364 | + }, |
| 365 | + }, |
| 366 | + { |
| 367 | + name: "server with single variable that evaluates to root path", |
| 368 | + servers: openapi3.Servers{ |
| 369 | + newServerWithVariables("{server}", map[string]string{"server": "/"}), |
| 370 | + }, |
| 371 | + want: []srv{{ |
| 372 | + schemes: nil, |
| 373 | + host: "", |
| 374 | + base: "", |
| 375 | + server: nil, |
| 376 | + varsUpdater: nil, |
| 377 | + }}, |
| 378 | + wantErr: false, |
| 379 | + initFn: func(tt *testStruct) { |
| 380 | + for i, server := range tt.servers { |
| 381 | + tt.want[i].server = server |
| 382 | + } |
| 383 | + }, |
| 384 | + }, |
| 385 | + { |
| 386 | + name: "server is http://localhost:28002", |
| 387 | + servers: openapi3.Servers{ |
| 388 | + newServerWithVariables("http://localhost:28002", nil), |
| 389 | + }, |
| 390 | + want: []srv{{ |
| 391 | + schemes: []string{"http"}, |
| 392 | + host: "localhost:28002", |
| 393 | + base: "", |
| 394 | + server: nil, |
| 395 | + varsUpdater: nil, |
| 396 | + }}, |
| 397 | + wantErr: false, |
| 398 | + initFn: func(tt *testStruct) { |
| 399 | + for i, server := range tt.servers { |
| 400 | + tt.want[i].server = server |
| 401 | + } |
| 402 | + }, |
| 403 | + }, |
| 404 | + { |
| 405 | + name: "server with single variable that evaluates to http://localhost:28002", |
| 406 | + servers: openapi3.Servers{ |
| 407 | + newServerWithVariables("{server}", map[string]string{"server": "http://localhost:28002"}), |
| 408 | + }, |
| 409 | + want: []srv{{ |
| 410 | + schemes: []string{"http"}, |
| 411 | + host: "localhost:28002", |
| 412 | + base: "", |
| 413 | + server: nil, |
| 414 | + varsUpdater: nil, |
| 415 | + }}, |
| 416 | + wantErr: false, |
| 417 | + initFn: func(tt *testStruct) { |
| 418 | + for i, server := range tt.servers { |
| 419 | + tt.want[i].server = server |
| 420 | + } |
| 421 | + }, |
| 422 | + }, |
| 423 | + { |
| 424 | + name: "server with multiple variables that evaluates to http://localhost:28002", |
| 425 | + servers: openapi3.Servers{ |
| 426 | + newServerWithVariables("{scheme}://{host}:{port}", map[string]string{"scheme": "http", "host": "localhost", "port": "28002"}), |
| 427 | + }, |
| 428 | + want: []srv{{ |
| 429 | + schemes: []string{"http"}, |
| 430 | + host: "{host}:28002", |
| 431 | + base: "", |
| 432 | + server: nil, |
| 433 | + varsUpdater: func(vars map[string]string) { vars["port"] = "28002" }, |
| 434 | + }}, |
| 435 | + wantErr: false, |
| 436 | + initFn: func(tt *testStruct) { |
| 437 | + for i, server := range tt.servers { |
| 438 | + tt.want[i].server = server |
| 439 | + } |
| 440 | + }, |
| 441 | + }, |
| 442 | + { |
| 443 | + name: "server with unparsable URL fails", |
| 444 | + servers: openapi3.Servers{ |
| 445 | + newServerWithVariables("exam^ple.com:443", nil), |
| 446 | + }, |
| 447 | + want: nil, |
| 448 | + wantErr: true, |
| 449 | + initFn: nil, |
| 450 | + }, |
| 451 | + { |
| 452 | + name: "server with single variable that evaluates to unparsable URL fails", |
| 453 | + servers: openapi3.Servers{ |
| 454 | + newServerWithVariables("{server}", map[string]string{"server": "exam^ple.com:443"}), |
| 455 | + }, |
| 456 | + want: nil, |
| 457 | + wantErr: true, |
| 458 | + initFn: nil, |
| 459 | + }, |
| 460 | + } |
| 461 | + for _, tt := range tests { |
| 462 | + t.Run(tt.name, func(t *testing.T) { |
| 463 | + if tt.initFn != nil { |
| 464 | + tt.initFn(&tt) |
| 465 | + } |
| 466 | + got, err := makeServers(tt.servers) |
| 467 | + if (err != nil) != tt.wantErr { |
| 468 | + t.Errorf("makeServers() error = %v, wantErr %v", err, tt.wantErr) |
| 469 | + return |
| 470 | + } |
| 471 | + assert.Equal(t, len(tt.want), len(got), "expected and actual servers lengths are not equal") |
| 472 | + for i := 0; i < len(tt.want); i++ { |
| 473 | + // Unfortunately using assert.Equals or reflect.DeepEquals isn't |
| 474 | + // an option because function pointers cannot be compared |
| 475 | + assert.Equal(t, tt.want[i].schemes, got[i].schemes) |
| 476 | + assert.Equal(t, tt.want[i].host, got[i].host) |
| 477 | + assert.Equal(t, tt.want[i].host, got[i].host) |
| 478 | + assert.Equal(t, tt.want[i].server, got[i].server) |
| 479 | + if tt.want[i].varsUpdater == nil { |
| 480 | + assert.Nil(t, got[i].varsUpdater, "expected and actual varsUpdater should point to same function") |
| 481 | + } else { |
| 482 | + assert.NotNil(t, got[i].varsUpdater, "expected and actual varsUpdater should point to same function") |
| 483 | + } |
| 484 | + } |
| 485 | + }) |
| 486 | + } |
| 487 | +} |
| 488 | + |
328 | 489 | func newServerWithVariables(url string, variables map[string]string) *openapi3.Server {
|
329 | 490 | var serverVariables = map[string]*openapi3.ServerVariable{}
|
330 | 491 |
|
|
0 commit comments