diff --git a/checks/http_test.go b/checks/http_test.go index b9af6af..02436ec 100644 --- a/checks/http_test.go +++ b/checks/http_test.go @@ -5,6 +5,7 @@ import ( "io" "net/http" "net/http/httptest" + "slices" "strings" "testing" @@ -47,14 +48,9 @@ func TestInterpolateVariables(t *testing.T) { func TestInterpolationNames(t *testing.T) { got := InterpolationNames("${baseURL}/users/${id}/${id}") want := []string{"baseURL", "id", "id"} - if len(got) != len(want) { + if !slices.Equal(got, want) { t.Fatalf("InterpolationNames() = %#v, want %#v", got, want) } - for i := range want { - if got[i] != want[i] { - t.Fatalf("InterpolationNames() = %#v, want %#v", got, want) - } - } } func TestRunHTTPRequestInterpolatesRequestAndCapturesResponseVariables(t *testing.T) { diff --git a/checks/local.go b/checks/local.go index 48606ce..e814743 100644 --- a/checks/local.go +++ b/checks/local.go @@ -197,7 +197,7 @@ func evaluateHeaderEquals(headers map[string]string, test api.HTTPRequestTestHea if !ok { return fmt.Errorf("expected %s %q to exist", label, key) } - if !strings.EqualFold(got, want) { + if got != want { return fmt.Errorf("expected %s %q to equal %q, got %q", label, key, want, got) } diff --git a/checks/local_test.go b/checks/local_test.go index a377a7e..9dd50cc 100644 --- a/checks/local_test.go +++ b/checks/local_test.go @@ -4,6 +4,7 @@ import ( "testing" api "github.com/bootdotdev/bootdev/client" + "github.com/goccy/go-json" ) func TestLocalSubmissionEventPassesCLIAndHTTPResults(t *testing.T) { @@ -107,6 +108,68 @@ func TestEvaluateStdoutJq(t *testing.T) { } } +func TestEvaluateHTTPRequestTestsHeaderAndTrailerEquality(t *testing.T) { + tests := []struct { + name string + test api.HTTPRequestTest + result api.HTTPRequestResult + wantFailure bool + }{ + { + name: "header name is case insensitive", + test: api.HTTPRequestTest{HeadersEqual: &api.HTTPRequestTestHeader{ + Key: "X-Request-ID", + Value: "abc123", + }}, + result: api.HTTPRequestResult{ + ResponseHeaders: map[string]string{"x-request-id": "abc123"}, + }, + }, + { + name: "header value is case sensitive", + test: api.HTTPRequestTest{HeadersEqual: &api.HTTPRequestTestHeader{ + Key: "X-Request-ID", + Value: "abc123", + }}, + result: api.HTTPRequestResult{ + ResponseHeaders: map[string]string{"X-Request-ID": "ABC123"}, + }, + wantFailure: true, + }, + { + name: "trailer name is case insensitive", + test: api.HTTPRequestTest{TrailersEqual: &api.HTTPRequestTestHeader{ + Key: "X-Checksum", + Value: "sha256:abc", + }}, + result: api.HTTPRequestResult{ + ResponseTrailers: map[string]string{"x-checksum": "sha256:abc"}, + }, + }, + { + name: "trailer value is case sensitive", + test: api.HTTPRequestTest{TrailersEqual: &api.HTTPRequestTestHeader{ + Key: "X-Checksum", + Value: "sha256:abc", + }}, + result: api.HTTPRequestResult{ + ResponseTrailers: map[string]string{"X-Checksum": "SHA256:ABC"}, + }, + wantFailure: true, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + request := api.CLIStepHTTPRequest{Tests: []api.HTTPRequestTest{tt.test}} + failure := evaluateHTTPRequestTests(0, request, tt.result) + if (failure != nil) != tt.wantFailure { + t.Fatalf("failure = %#v, wantFailure = %t", failure, tt.wantFailure) + } + }) + } +} + func TestLocalSubmissionEventRejectsMissingHTTPResponseCaptures(t *testing.T) { tests := []struct { name string @@ -194,7 +257,7 @@ func TestValuesEqualPreservesTypes(t *testing.T) { {name: "string and bool", got: "true", want: true, ok: false}, {name: "same bools", got: true, want: true, ok: true}, {name: "numeric int and float", got: 1, want: 1.0, ok: true}, - {name: "numeric json number and int", got: testJSONNumber("1"), want: 1, ok: true}, + {name: "numeric json number and int", got: json.Number("1"), want: 1, ok: true}, {name: "nil and string", got: nil, want: "", ok: false}, } @@ -207,12 +270,6 @@ func TestValuesEqualPreservesTypes(t *testing.T) { } } -type testJSONNumber string - -func (n testJSONNumber) String() string { - return string(n) -} - func intPtr(v int) *int { return &v } diff --git a/checks/runner_test.go b/checks/runner_test.go index f866e79..2dff631 100644 --- a/checks/runner_test.go +++ b/checks/runner_test.go @@ -146,7 +146,9 @@ func TestApplySubmissionResultsMarksAllStepsAndTestsPassedWhenNoFailure(t *testi messages.ResolveTestMsg{StepIndex: 1, TestIndex: 0, Passed: boolPtr(true)}, } - assertMessages(t, got, want) + if !reflect.DeepEqual(got, want) { + t.Fatalf("messages = %#v, want %#v", got, want) + } } func TestApplySubmissionResultsStopsAfterFailedCLITest(t *testing.T) { @@ -166,7 +168,9 @@ func TestApplySubmissionResultsStopsAfterFailedCLITest(t *testing.T) { messages.ResolveTestMsg{StepIndex: 1, TestIndex: 1, Passed: boolPtr(false)}, } - assertMessages(t, got, want) + if !reflect.DeepEqual(got, want) { + t.Fatalf("messages = %#v, want %#v", got, want) + } } func applySubmissionResultsMessages(cliData api.CLIData, failure *api.StructuredErrCLI) []tea.Msg { @@ -177,14 +181,6 @@ func applySubmissionResultsMessages(cliData api.CLIData, failure *api.Structured return msgs } -func assertMessages(t *testing.T, got []tea.Msg, want []tea.Msg) { - t.Helper() - - if !reflect.DeepEqual(got, want) { - t.Fatalf("messages = %#v, want %#v", got, want) - } -} - func boolPtr(v bool) *bool { return &v } diff --git a/cmd/login_test.go b/cmd/login_test.go index 2c06016..b93b875 100644 --- a/cmd/login_test.go +++ b/cmd/login_test.go @@ -59,6 +59,11 @@ func TestLoginHTTPHandlerRejectsMissingOrigin(t *testing.T) { if response.Code != http.StatusForbidden { t.Fatalf("status = %d, want %d", response.Code, http.StatusForbidden) } + select { + case code := <-inputChan: + t.Fatalf("unexpected login code accepted: %q", code) + default: + } } func TestLoginHTTPHandlerLimitsCodeSize(t *testing.T) {