github.com/hamba/avro/v2@v2.22.1-0.20240518180522-aff3955acf7d/registry/client_test.go (about) 1 package registry_test 2 3 import ( 4 "context" 5 "encoding/json" 6 "io" 7 "net/http" 8 "net/http/httptest" 9 "testing" 10 11 "github.com/hamba/avro/v2/registry" 12 "github.com/stretchr/testify/assert" 13 "github.com/stretchr/testify/require" 14 ) 15 16 func TestNewClient(t *testing.T) { 17 client, err := registry.NewClient("http://example.com") 18 19 require.NoError(t, err) 20 assert.Implements(t, (*registry.Registry)(nil), client) 21 } 22 23 func TestNewClient_UrlError(t *testing.T) { 24 _, err := registry.NewClient("://") 25 26 assert.Error(t, err) 27 } 28 29 func TestClient_PopulatesError(t *testing.T) { 30 s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 31 w.Header().Add("Content-Type", "application/vnd.schemaregistry.v1+json") 32 w.WriteHeader(422) 33 _, _ = w.Write([]byte(`{"error_code": 42202, "message": "schema may not be empty"}"`)) 34 })) 35 t.Cleanup(s.Close) 36 client, _ := registry.NewClient(s.URL) 37 38 _, _, err := client.CreateSchema(context.Background(), "test", "") 39 40 assert.Error(t, err) 41 assert.IsType(t, registry.Error{}, err) 42 assert.Equal(t, "schema may not be empty", err.Error()) 43 regError := err.(registry.Error) 44 assert.Equal(t, 422, regError.StatusCode) 45 assert.Equal(t, 42202, regError.Code) 46 assert.Equal(t, "schema may not be empty", regError.Message) 47 } 48 49 func TestNewClient_BasicAuth(t *testing.T) { 50 s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 51 username, password, ok := r.BasicAuth() 52 assert.True(t, ok) 53 assert.Equal(t, "username", username) 54 assert.Equal(t, "password", password) 55 56 _, _ = w.Write([]byte(`[]`)) 57 })) 58 t.Cleanup(s.Close) 59 client, _ := registry.NewClient(s.URL, registry.WithBasicAuth("username", "password")) 60 61 _, err := client.GetSubjects(context.Background()) 62 63 assert.NoError(t, err) 64 } 65 66 func TestClient_GetSchema(t *testing.T) { 67 s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 68 assert.Equal(t, "GET", r.Method) 69 assert.Equal(t, "/schemas/ids/5", r.URL.Path) 70 71 _, _ = w.Write([]byte(`{"schema":"[\"null\",\"string\",\"int\"]"}`)) 72 })) 73 t.Cleanup(s.Close) 74 client, _ := registry.NewClient(s.URL) 75 76 schema, err := client.GetSchema(context.Background(), 5) 77 78 require.NoError(t, err) 79 assert.Equal(t, `["null","string","int"]`, schema.String()) 80 } 81 82 func TestClient_GetSchemaCachesSchema(t *testing.T) { 83 count := 0 84 s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 85 count++ 86 _, _ = w.Write([]byte(`{"schema":"[\"null\",\"string\",\"int\"]"}`)) 87 })) 88 t.Cleanup(s.Close) 89 client, _ := registry.NewClient(s.URL) 90 91 _, _ = client.GetSchema(context.Background(), 5) 92 93 _, _ = client.GetSchema(context.Background(), 5) 94 95 assert.Equal(t, 1, count) 96 } 97 98 func TestClient_GetSchemaRequestError(t *testing.T) { 99 s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 100 w.WriteHeader(500) 101 })) 102 t.Cleanup(s.Close) 103 client, _ := registry.NewClient(s.URL) 104 105 _, err := client.GetSchema(context.Background(), 5) 106 107 assert.Error(t, err) 108 } 109 110 func TestClient_GetSchemaJsonError(t *testing.T) { 111 s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 112 _, _ = w.Write([]byte(`{"schema":"[\"null\",\"string\",\"int\"]"`)) 113 })) 114 t.Cleanup(s.Close) 115 client, _ := registry.NewClient(s.URL) 116 117 _, err := client.GetSchema(context.Background(), 5) 118 119 assert.Error(t, err) 120 } 121 122 func TestClient_GetSchemaSchemaError(t *testing.T) { 123 s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 124 _, _ = w.Write([]byte(`{"schema":""}`)) 125 })) 126 t.Cleanup(s.Close) 127 client, _ := registry.NewClient(s.URL) 128 129 _, err := client.GetSchema(context.Background(), 5) 130 131 assert.Error(t, err) 132 } 133 134 func TestClient_GetSubjects(t *testing.T) { 135 s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 136 assert.Equal(t, "GET", r.Method) 137 assert.Equal(t, "/subjects", r.URL.Path) 138 139 _, _ = w.Write([]byte(`["foobar"]`)) 140 })) 141 t.Cleanup(s.Close) 142 client, _ := registry.NewClient(s.URL) 143 144 subs, err := client.GetSubjects(context.Background()) 145 146 require.NoError(t, err) 147 require.Len(t, subs, 1) 148 assert.Equal(t, "foobar", subs[0]) 149 } 150 151 func TestClient_DeleteSubject(t *testing.T) { 152 s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 153 assert.Equal(t, http.MethodDelete, r.Method) 154 assert.Equal(t, "/subjects/foobar", r.URL.Path) 155 156 _, _ = w.Write([]byte(`[1]`)) 157 })) 158 t.Cleanup(s.Close) 159 client, _ := registry.NewClient(s.URL) 160 161 versions, err := client.DeleteSubject(context.Background(), "foobar") 162 163 require.NoError(t, err) 164 require.Len(t, versions, 1) 165 assert.Equal(t, 1, versions[0]) 166 } 167 168 func TestClient_DeleteSubjectRequestError(t *testing.T) { 169 s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 170 w.WriteHeader(500) 171 })) 172 t.Cleanup(s.Close) 173 client, _ := registry.NewClient(s.URL) 174 175 _, err := client.DeleteSubject(context.Background(), "foobar") 176 177 assert.Error(t, err) 178 } 179 180 func TestClient_GetSubjectsRequestError(t *testing.T) { 181 s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 182 w.WriteHeader(500) 183 })) 184 t.Cleanup(s.Close) 185 client, _ := registry.NewClient(s.URL) 186 187 _, err := client.GetSubjects(context.Background()) 188 189 assert.Error(t, err) 190 } 191 192 func TestClient_GetSubjectsJSONError(t *testing.T) { 193 s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 194 _, _ = w.Write([]byte(`["foobar"`)) 195 })) 196 t.Cleanup(s.Close) 197 client, _ := registry.NewClient(s.URL) 198 199 _, err := client.GetSubjects(context.Background()) 200 201 assert.Error(t, err) 202 } 203 204 func TestClient_GetVersions(t *testing.T) { 205 s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 206 assert.Equal(t, "GET", r.Method) 207 assert.Equal(t, "/subjects/foobar/versions", r.URL.Path) 208 209 _, _ = w.Write([]byte(`[10]`)) 210 })) 211 t.Cleanup(s.Close) 212 client, _ := registry.NewClient(s.URL) 213 214 vers, err := client.GetVersions(context.Background(), "foobar") 215 216 require.NoError(t, err) 217 require.Len(t, vers, 1) 218 assert.Equal(t, 10, vers[0]) 219 } 220 221 func TestClient_GetVersionsRequestError(t *testing.T) { 222 s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 223 w.WriteHeader(500) 224 })) 225 t.Cleanup(s.Close) 226 client, _ := registry.NewClient(s.URL) 227 228 _, err := client.GetVersions(context.Background(), "foobar") 229 230 assert.Error(t, err) 231 } 232 233 func TestClient_GetVersionsJSONError(t *testing.T) { 234 s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 235 _, _ = w.Write([]byte(`[10`)) 236 })) 237 t.Cleanup(s.Close) 238 client, _ := registry.NewClient(s.URL) 239 240 _, err := client.GetVersions(context.Background(), "foobar") 241 242 assert.Error(t, err) 243 } 244 245 func TestClient_GetSchemaByVersion(t *testing.T) { 246 s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 247 assert.Equal(t, "GET", r.Method) 248 assert.Equal(t, "/subjects/foobar/versions/5", r.URL.Path) 249 250 _, _ = w.Write([]byte(`{"schema":"[\"null\",\"string\",\"int\"]"}`)) 251 })) 252 t.Cleanup(s.Close) 253 client, _ := registry.NewClient(s.URL) 254 255 schema, err := client.GetSchemaByVersion(context.Background(), "foobar", 5) 256 257 require.NoError(t, err) 258 assert.Equal(t, `["null","string","int"]`, schema.String()) 259 } 260 261 func TestClient_GetSchemaByVersionRequestError(t *testing.T) { 262 s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 263 w.WriteHeader(500) 264 })) 265 t.Cleanup(s.Close) 266 client, _ := registry.NewClient(s.URL) 267 268 _, err := client.GetSchemaByVersion(context.Background(), "foobar", 5) 269 270 assert.Error(t, err) 271 } 272 273 func TestClient_GetSchemaByVersionJsonError(t *testing.T) { 274 s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 275 _, _ = w.Write([]byte(`{"schema":"[\"null\",\"string\",\"int\"]"`)) 276 })) 277 t.Cleanup(s.Close) 278 client, _ := registry.NewClient(s.URL) 279 280 _, err := client.GetSchemaByVersion(context.Background(), "foobar", 5) 281 282 assert.Error(t, err) 283 } 284 285 func TestClient_GetSchemaByVersionSchemaError(t *testing.T) { 286 s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 287 _, _ = w.Write([]byte(`{"schema":""}`)) 288 })) 289 t.Cleanup(s.Close) 290 client, _ := registry.NewClient(s.URL) 291 292 _, err := client.GetSchemaByVersion(context.Background(), "foobar", 5) 293 294 assert.Error(t, err) 295 } 296 297 func TestClient_GetLatestSchema(t *testing.T) { 298 s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 299 assert.Equal(t, "GET", r.Method) 300 assert.Equal(t, "/subjects/foobar/versions/latest", r.URL.Path) 301 302 _, _ = w.Write([]byte(`{"schema":"[\"null\",\"string\",\"int\"]"}`)) 303 })) 304 t.Cleanup(s.Close) 305 client, _ := registry.NewClient(s.URL) 306 307 schema, err := client.GetLatestSchema(context.Background(), "foobar") 308 309 require.NoError(t, err) 310 assert.Equal(t, `["null","string","int"]`, schema.String()) 311 } 312 313 func TestClient_GetLatestSchemaRequestError(t *testing.T) { 314 s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 315 w.WriteHeader(500) 316 })) 317 t.Cleanup(s.Close) 318 client, _ := registry.NewClient(s.URL) 319 320 _, err := client.GetLatestSchema(context.Background(), "foobar") 321 322 assert.Error(t, err) 323 } 324 325 func TestClient_GetLatestSchemaJsonError(t *testing.T) { 326 s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 327 _, _ = w.Write([]byte(`{"schema":"[\"null\",\"string\",\"int\"]"`)) 328 })) 329 t.Cleanup(s.Close) 330 client, _ := registry.NewClient(s.URL) 331 332 _, err := client.GetLatestSchema(context.Background(), "foobar") 333 334 assert.Error(t, err) 335 } 336 337 func TestClient_GetLatestSchemaSchemaError(t *testing.T) { 338 s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 339 _, _ = w.Write([]byte(`{"schema":""}`)) 340 })) 341 t.Cleanup(s.Close) 342 client, _ := registry.NewClient(s.URL) 343 344 _, err := client.GetLatestSchema(context.Background(), "foobar") 345 346 assert.Error(t, err) 347 } 348 349 func TestClient_GetSchemaInfo(t *testing.T) { 350 s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 351 assert.Equal(t, "GET", r.Method) 352 assert.Equal(t, "/subjects/foobar/versions/1", r.URL.Path) 353 354 _, _ = w.Write([]byte(`{"subject": "foobar", "version": 1, "id": 2, "schema":"[\"null\",\"string\",\"int\"]"}`)) 355 })) 356 t.Cleanup(s.Close) 357 client, _ := registry.NewClient(s.URL) 358 359 schemaInfo, err := client.GetSchemaInfo(context.Background(), "foobar", 1) 360 361 require.NoError(t, err) 362 assert.Equal(t, `["null","string","int"]`, schemaInfo.Schema.String()) 363 assert.Equal(t, 2, schemaInfo.ID) 364 assert.Equal(t, 1, schemaInfo.Version) 365 } 366 367 func TestClient_GetSchemaInfoRequestError(t *testing.T) { 368 s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 369 w.WriteHeader(500) 370 })) 371 t.Cleanup(s.Close) 372 client, _ := registry.NewClient(s.URL) 373 374 _, err := client.GetSchemaInfo(context.Background(), "foobar", 1) 375 376 assert.Error(t, err) 377 } 378 379 func TestClient_GetSchemaInfoJsonError(t *testing.T) { 380 s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 381 _, _ = w.Write([]byte(`{"subject": "foobar", "version": 1, "id": 2, "schema":"[\"null\",\"string\",\"int\"]"`)) 382 })) 383 t.Cleanup(s.Close) 384 client, _ := registry.NewClient(s.URL) 385 386 _, err := client.GetSchemaInfo(context.Background(), "foobar", 1) 387 388 assert.Error(t, err) 389 } 390 391 func TestClient_GetSchemaInfoSchemaError(t *testing.T) { 392 s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 393 _, _ = w.Write([]byte(`{"schema":""}`)) 394 })) 395 t.Cleanup(s.Close) 396 client, _ := registry.NewClient(s.URL) 397 398 _, err := client.GetSchemaInfo(context.Background(), "foobar", 1) 399 400 assert.Error(t, err) 401 } 402 403 func TestClient_GetLatestSchemaInfo(t *testing.T) { 404 s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 405 assert.Equal(t, "GET", r.Method) 406 assert.Equal(t, "/subjects/foobar/versions/latest", r.URL.Path) 407 408 _, _ = w.Write([]byte(`{"subject": "foobar", "version": 1, "id": 2, "schema":"[\"null\",\"string\",\"int\"]"}`)) 409 })) 410 t.Cleanup(s.Close) 411 client, _ := registry.NewClient(s.URL) 412 413 schemaInfo, err := client.GetLatestSchemaInfo(context.Background(), "foobar") 414 415 require.NoError(t, err) 416 assert.Equal(t, `["null","string","int"]`, schemaInfo.Schema.String()) 417 assert.Equal(t, 2, schemaInfo.ID) 418 assert.Equal(t, 1, schemaInfo.Version) 419 } 420 421 func TestClient_GetLatestSchemaInfoRequestError(t *testing.T) { 422 s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 423 w.WriteHeader(500) 424 })) 425 t.Cleanup(s.Close) 426 client, _ := registry.NewClient(s.URL) 427 428 _, err := client.GetLatestSchemaInfo(context.Background(), "foobar") 429 430 assert.Error(t, err) 431 } 432 433 func TestClient_GetLatestSchemaInfoJsonError(t *testing.T) { 434 s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 435 _, _ = w.Write([]byte(`{"subject": "foobar", "version": 1, "id": 2, "schema":"[\"null\",\"string\",\"int\"]"`)) 436 })) 437 t.Cleanup(s.Close) 438 client, _ := registry.NewClient(s.URL) 439 440 _, err := client.GetLatestSchemaInfo(context.Background(), "foobar") 441 442 assert.Error(t, err) 443 } 444 445 func TestClient_GetLatestSchemaInfoSchemaError(t *testing.T) { 446 s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 447 _, _ = w.Write([]byte(`{"schema":""}`)) 448 })) 449 t.Cleanup(s.Close) 450 client, _ := registry.NewClient(s.URL) 451 452 _, err := client.GetLatestSchemaInfo(context.Background(), "foobar") 453 454 assert.Error(t, err) 455 } 456 457 func TestClient_CreateSchema(t *testing.T) { 458 s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 459 assert.Equal(t, "POST", r.Method) 460 assert.Equal(t, "/subjects/foobar/versions", r.URL.Path) 461 462 _, _ = w.Write([]byte(`{"id":10}`)) 463 })) 464 t.Cleanup(s.Close) 465 client, _ := registry.NewClient(s.URL) 466 467 id, schema, err := client.CreateSchema(context.Background(), "foobar", "[\"null\",\"string\",\"int\"]") 468 469 require.NoError(t, err) 470 assert.Equal(t, 10, id) 471 assert.Equal(t, `["null","string","int"]`, schema.String()) 472 } 473 474 func TestClient_CreateSchemaRequestError(t *testing.T) { 475 s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 476 w.WriteHeader(500) 477 })) 478 t.Cleanup(s.Close) 479 client, _ := registry.NewClient(s.URL) 480 481 _, _, err := client.CreateSchema(context.Background(), "foobar", "[\"null\",\"string\",\"int\"]") 482 483 assert.Error(t, err) 484 } 485 486 func TestClient_CreateSchemaJsonError(t *testing.T) { 487 s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 488 _, _ = w.Write([]byte(`{"id":10`)) 489 })) 490 t.Cleanup(s.Close) 491 client, _ := registry.NewClient(s.URL) 492 493 _, _, err := client.CreateSchema(context.Background(), "foobar", "[\"null\",\"string\",\"int\"]") 494 495 assert.Error(t, err) 496 } 497 498 func TestClient_CreateSchemaSchemaError(t *testing.T) { 499 s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 500 _, _ = w.Write([]byte(`{"id":10}`)) 501 })) 502 t.Cleanup(s.Close) 503 client, _ := registry.NewClient(s.URL) 504 505 _, _, err := client.CreateSchema(context.Background(), "foobar", "[\"null\",\"string\",\"int\"") 506 507 assert.Error(t, err) 508 } 509 510 func TestClient_IsRegistered(t *testing.T) { 511 s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 512 assert.Equal(t, "POST", r.Method) 513 assert.Equal(t, "/subjects/test", r.URL.Path) 514 515 _, _ = w.Write([]byte(`{"id":10}`)) 516 })) 517 t.Cleanup(s.Close) 518 client, _ := registry.NewClient(s.URL) 519 520 id, schema, err := client.IsRegistered(context.Background(), "test", "[\"null\",\"string\",\"int\"]") 521 522 require.NoError(t, err) 523 assert.Equal(t, 10, id) 524 assert.Equal(t, `["null","string","int"]`, schema.String()) 525 } 526 527 func TestClient_IsRegisteredWithRefs(t *testing.T) { 528 s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 529 assert.Equal(t, "POST", r.Method) 530 assert.Equal(t, "/subjects/test", r.URL.Path) 531 532 body, err := io.ReadAll(r.Body) 533 require.NoError(t, err) 534 var decoded map[string]any 535 err = json.Unmarshal(body, &decoded) 536 require.NoError(t, err) 537 538 assert.Contains(t, decoded, "references") 539 refs, ok := decoded["references"].([]any) 540 require.True(t, ok) 541 require.Len(t, refs, 1) 542 ref, ok := refs[0].(map[string]any) 543 require.True(t, ok) 544 545 assert.Equal(t, "some_schema", ref["name"].(string)) 546 assert.Equal(t, "some_subject", ref["subject"].(string)) 547 assert.Equal(t, float64(3), ref["version"].(float64)) 548 549 _, _ = w.Write([]byte(`{"id":10}`)) 550 })) 551 t.Cleanup(s.Close) 552 client, _ := registry.NewClient(s.URL) 553 554 id, schema, err := client.IsRegisteredWithRefs( 555 context.Background(), 556 "test", 557 "[\"null\",\"string\",\"int\"]", 558 registry.SchemaReference{ 559 Name: "some_schema", 560 Subject: "some_subject", 561 Version: 3, 562 }, 563 ) 564 565 require.NoError(t, err) 566 assert.Equal(t, 10, id) 567 assert.Equal(t, `["null","string","int"]`, schema.String()) 568 } 569 570 func TestClient_IsRegisteredRequestError(t *testing.T) { 571 s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 572 w.WriteHeader(500) 573 })) 574 t.Cleanup(s.Close) 575 client, _ := registry.NewClient(s.URL) 576 577 _, _, err := client.IsRegistered(context.Background(), "test", "[\"null\",\"string\",\"int\"]") 578 579 assert.Error(t, err) 580 } 581 582 func TestClient_IsRegisteredJsonError(t *testing.T) { 583 s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 584 _, _ = w.Write([]byte(`{"id":10`)) 585 })) 586 t.Cleanup(s.Close) 587 client, _ := registry.NewClient(s.URL) 588 589 _, _, err := client.IsRegistered(context.Background(), "test", "[\"null\",\"string\",\"int\"]") 590 591 assert.Error(t, err) 592 } 593 594 func TestClient_IsRegisteredSchemaError(t *testing.T) { 595 s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 596 _, _ = w.Write([]byte(`{"id":10}`)) 597 })) 598 t.Cleanup(s.Close) 599 client, _ := registry.NewClient(s.URL) 600 601 _, _, err := client.IsRegistered(context.Background(), "test", "[\"null\",\"string\",\"int\"") 602 603 assert.Error(t, err) 604 } 605 606 func TestClient_GetGlobalCompatibilityLevel(t *testing.T) { 607 s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 608 assert.Equal(t, "GET", r.Method) 609 assert.Equal(t, "/config", r.URL.Path) 610 611 _, _ = w.Write([]byte(`{ 612 "compatibility": "FULL" 613 }`)) 614 })) 615 t.Cleanup(s.Close) 616 client, _ := registry.NewClient(s.URL) 617 618 compatibilityLevel, err := client.GetGlobalCompatibilityLevel(context.Background()) 619 620 require.NoError(t, err) 621 assert.Equal(t, registry.FullCL, compatibilityLevel) 622 } 623 624 func TestClient_GetGlobalCompatibilityLevelError(t *testing.T) { 625 s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 626 w.WriteHeader(500) 627 })) 628 t.Cleanup(s.Close) 629 client, _ := registry.NewClient(s.URL) 630 631 _, err := client.GetGlobalCompatibilityLevel(context.Background()) 632 633 assert.Error(t, err) 634 } 635 636 func TestClient_GetCompatibilityLevel(t *testing.T) { 637 subject := "boh_subj" 638 s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 639 assert.Equal(t, "GET", r.Method) 640 assert.Equal(t, "/config/"+subject, r.URL.Path) 641 642 _, _ = w.Write([]byte(`{"compatibility":"FULL"}`)) 643 })) 644 t.Cleanup(s.Close) 645 client, _ := registry.NewClient(s.URL) 646 647 compatibilityLevel, err := client.GetCompatibilityLevel(context.Background(), subject) 648 649 require.NoError(t, err) 650 assert.Equal(t, registry.FullCL, compatibilityLevel) 651 } 652 653 func TestClient_GetCompatibilityLevelError(t *testing.T) { 654 s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 655 w.WriteHeader(500) 656 })) 657 t.Cleanup(s.Close) 658 client, _ := registry.NewClient(s.URL) 659 660 _, err := client.GetCompatibilityLevel(context.Background(), "boh") 661 662 assert.Error(t, err) 663 } 664 665 func TestClient_SetGlobalCompatibilityLevel(t *testing.T) { 666 s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 667 assert.Equal(t, "PUT", r.Method) 668 assert.Equal(t, "/config", r.URL.Path) 669 670 _, _ = w.Write([]byte("{\"compatibility\":\"BACKWARD\"}")) 671 })) 672 t.Cleanup(s.Close) 673 client, _ := registry.NewClient(s.URL) 674 675 err := client.SetGlobalCompatibilityLevel(context.Background(), registry.BackwardCL) 676 677 require.NoError(t, err) 678 } 679 680 func TestClient_SetGlobalCompatibilityLevelError(t *testing.T) { 681 s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 682 w.WriteHeader(500) 683 })) 684 t.Cleanup(s.Close) 685 client, _ := registry.NewClient(s.URL) 686 687 err := client.SetGlobalCompatibilityLevel(context.Background(), registry.BackwardCL) 688 689 assert.Error(t, err) 690 } 691 692 func TestClient_SetGlobalCompatibilityLevelHandlesInvalidLevel(t *testing.T) { 693 s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 694 require.FailNow(t, "unexpected call") 695 })) 696 t.Cleanup(s.Close) 697 client, _ := registry.NewClient(s.URL) 698 699 err := client.SetGlobalCompatibilityLevel(context.Background(), "INVALID_STUFF") 700 701 assert.Error(t, err) 702 } 703 704 func TestClient_SetCompatibilityLevel(t *testing.T) { 705 subject := "boh_subj" 706 s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 707 assert.Equal(t, http.MethodPut, r.Method) 708 assert.Equal(t, "/config/"+subject, r.URL.Path) 709 710 _, _ = w.Write([]byte("{\"compatibility\":\"BACKWARD\"}")) 711 })) 712 t.Cleanup(s.Close) 713 client, _ := registry.NewClient(s.URL) 714 715 err := client.SetCompatibilityLevel(context.Background(), subject, registry.BackwardCL) 716 717 require.NoError(t, err) 718 } 719 720 func TestClient_SetCompatibilityLevelError(t *testing.T) { 721 s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 722 w.WriteHeader(500) 723 })) 724 t.Cleanup(s.Close) 725 client, _ := registry.NewClient(s.URL) 726 727 err := client.SetCompatibilityLevel(context.Background(), "boh", registry.BackwardCL) 728 729 assert.Error(t, err) 730 } 731 732 func TestClient_SetCompatibilityLevelHandlesInvalidLevel(t *testing.T) { 733 s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 734 require.FailNow(t, "unexpected call") 735 })) 736 t.Cleanup(s.Close) 737 client, _ := registry.NewClient(s.URL) 738 739 err := client.SetCompatibilityLevel(context.Background(), "boh", "INVALID_STUFF") 740 741 assert.Error(t, err) 742 } 743 744 func TestClient_HandlesServerError(t *testing.T) { 745 s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {})) 746 s.Close() 747 client, _ := registry.NewClient(s.URL) 748 749 _, err := client.GetSchema(context.Background(), 5) 750 751 assert.Error(t, err) 752 } 753 754 func TestError_Error(t *testing.T) { 755 err := registry.Error{ 756 StatusCode: 404, 757 Code: 40403, 758 Message: "Schema not found", 759 } 760 761 str := err.Error() 762 763 assert.Equal(t, "Schema not found", str) 764 } 765 766 func TestError_ErrorEmptyMessage(t *testing.T) { 767 err := registry.Error{ 768 StatusCode: 404, 769 } 770 771 str := err.Error() 772 773 assert.Equal(t, "registry error: 404", str) 774 }