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  }