From c2f2a777a0b77644de22be6dff0a2826823b1566 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Grzegorz=20Burzy=C5=84ski?= Date: Tue, 25 Jun 2024 08:52:04 +0200 Subject: [PATCH] feat: return APIError from ReloadDeclarativeRawConfig (#452) --- CHANGELOG.md | 8 ++++++++ kong/client.go | 2 +- kong/client_test.go | 18 +++++++++++++++++- 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b753f0e2..011797e5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -67,6 +67,14 @@ - [0.2.0](#020) - [0.1.0](#010) +## [v0.56.0] + +> Release date: 2024/06/25 + +- `ReloadDeclarativeRawConfig` now returns `APIError` when it retrieves a valid + HTTP response, allowing inspection of the response status code. + [#452](https://github.com/Kong/go-kong/pull/452) + ## [v0.55.0] > Release date: 2024/05/14 diff --git a/kong/client.go b/kong/client.go index 55552729..907c6b35 100644 --- a/kong/client.go +++ b/kong/client.go @@ -510,7 +510,7 @@ func (c *Client) ReloadDeclarativeRawConfig( return nil, fmt.Errorf("could not read /config %d status response body: %w", resp.StatusCode, err) } if resp.StatusCode < 200 || resp.StatusCode >= 400 { - return b, fmt.Errorf("failed posting new config to /config: got status code %d", resp.StatusCode) + return b, NewAPIErrorWithRaw(resp.StatusCode, "failed posting new config to /config", b) } return b, nil diff --git a/kong/client_test.go b/kong/client_test.go index 54eb4119..dcbfb632 100644 --- a/kong/client_test.go +++ b/kong/client_test.go @@ -4,6 +4,7 @@ import ( "bytes" "context" "encoding/json" + "errors" "net/http" "os" "testing" @@ -363,7 +364,8 @@ func TestReloadDeclarativeRawConfig(t *testing.T) { body, err := client.ReloadDeclarativeRawConfig(ctx, bytes.NewBuffer(b), true, flattenErrors) if tt.wantErr { - assert.Errorf(t, err, "Client.SendConfig() got unexpected error") + assert.Error(t, err) + require.IsType(t, err, &APIError{}, "expected APIError") } else { assert.NoError(t, err) } @@ -377,6 +379,20 @@ func TestReloadDeclarativeRawConfig(t *testing.T) { } } +func TestReloadDeclarativeRawConfig_NetworkErrorDoesntReturnAPIError(t *testing.T) { + RunWhenDBMode(t, "off") + SkipWhenKongRouterFlavor(t, Expressions) + + // Point to a non-reachable URL so that we get a network error. + client, err := NewClient(String("http://non-reachable.url"), nil) + require.NoError(t, err) + require.NotNil(t, client) + + _, err = client.ReloadDeclarativeRawConfig(context.Background(), bytes.NewReader([]byte("dummy-config")), true, true) + require.Error(t, err) + require.False(t, errors.Is(err, &APIError{}), "expected error to not be an APIError") +} + func assertHeadersExist(t *testing.T, request *http.Request, headers http.Header) { for k, v := range headers { assert.Contains(t, request.Header, k)