From 1fc6befe358edaba201299de99979c620cdd2162 Mon Sep 17 00:00:00 2001 From: Steven Masley Date: Tue, 7 Jun 2022 09:34:26 -0500 Subject: [PATCH 1/2] test: Pagination api query param parsing --- coderd/pagination_internal_test.go | 122 +++++++++++++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 coderd/pagination_internal_test.go diff --git a/coderd/pagination_internal_test.go b/coderd/pagination_internal_test.go new file mode 100644 index 0000000000000..b40482ebe13c3 --- /dev/null +++ b/coderd/pagination_internal_test.go @@ -0,0 +1,122 @@ +package coderd + +import ( + "encoding/json" + "net/http" + "net/http/httptest" + "testing" + + "github.com/google/uuid" + + "github.com/coder/coder/codersdk" + + "github.com/stretchr/testify/require" +) + +func TestPagination(t *testing.T) { + t.Parallel() + testCases := []struct { + Name string + + AfterID string + Limit string + Offset string + + ExpectedError string + ExpectedParams codersdk.Pagination + }{ + { + Name: "BadAfterID", + AfterID: "bogus", + ExpectedError: "Query param 'after_id' must be a valid UUID", + }, + { + Name: "ShortAfterID", + AfterID: "ff22a7b-bb6f-43d8-83e1-eefe0a1f5197", + ExpectedError: "Query param 'after_id' must be a valid UUID", + }, + { + Name: "LongAfterID", + AfterID: "cff22a7b-bb6f-43d8-83e1-eefe0a1f51972", + ExpectedError: "Query param 'after_id' must be a valid UUID", + }, + { + Name: "BadLimit", + Limit: "bogus", + ExpectedError: "Query param 'limit' must be a valid integer", + }, + { + Name: "BadOffset", + Offset: "bogus", + ExpectedError: "Query param 'offset' must be a valid integer", + }, + + // Valid values + { + Name: "ValidAllParams", + AfterID: "d6c1c331-bfc8-44ef-a0d2-d2294be6195a", + Offset: "100", + Limit: "50", + ExpectedParams: codersdk.Pagination{ + AfterID: uuid.MustParse("d6c1c331-bfc8-44ef-a0d2-d2294be6195a"), + Limit: 50, + Offset: 100, + }, + }, + { + Name: "ValidLimit", + Limit: "50", + ExpectedParams: codersdk.Pagination{ + AfterID: uuid.Nil, + Limit: 50, + }, + }, + { + Name: "ValidOffset", + Offset: "150", + ExpectedParams: codersdk.Pagination{ + AfterID: uuid.Nil, + Offset: 150, + Limit: -1, + }, + }, + { + Name: "ValidAfterID", + AfterID: "5f2005fc-acc4-4e5e-a7fa-be017359c60b", + ExpectedParams: codersdk.Pagination{ + AfterID: uuid.MustParse("5f2005fc-acc4-4e5e-a7fa-be017359c60b"), + Limit: -1, + }, + }, + } + + for _, c := range testCases { + c := c + t.Run(c.Name, func(t *testing.T) { + t.Parallel() + rw := httptest.NewRecorder() + r, err := http.NewRequest("GET", "https://example.com", nil) + require.NoError(t, err, "new request") + + // Set query params + query := r.URL.Query() + query.Set("after_id", c.AfterID) + query.Set("limit", c.Limit) + query.Set("offset", c.Offset) + r.URL.RawQuery = query.Encode() + + params, ok := parsePagination(rw, r) + if c.ExpectedError == "" { + require.True(t, ok, "expect ok") + require.Equal(t, c.ExpectedParams, params, "expected params") + } else { + require.False(t, ok, "expect !ok") + require.Equal(t, http.StatusBadRequest, rw.Code, "bad request status code") + var apiError codersdk.Error + err := json.NewDecoder(rw.Body).Decode(&apiError) + require.NoError(t, err, "decode response") + require.Contains(t, apiError.Message, c.ExpectedError, "expected error") + } + }) + } +} From 69ee10bab12ffbe04ff3744139b1c22ac2ffde9b Mon Sep 17 00:00:00 2001 From: Steven Masley Date: Tue, 7 Jun 2022 09:44:46 -0500 Subject: [PATCH 2/2] Import order --- coderd/pagination_internal_test.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/coderd/pagination_internal_test.go b/coderd/pagination_internal_test.go index b40482ebe13c3..97eba7275ea6f 100644 --- a/coderd/pagination_internal_test.go +++ b/coderd/pagination_internal_test.go @@ -7,10 +7,9 @@ import ( "testing" "github.com/google/uuid" + "github.com/stretchr/testify/require" "github.com/coder/coder/codersdk" - - "github.com/stretchr/testify/require" ) func TestPagination(t *testing.T) {