diff --git a/apps/checker/pkg/assertions/assertions.go b/apps/checker/pkg/assertions/assertions.go index 82d15976..1ce31ef2 100644 --- a/apps/checker/pkg/assertions/assertions.go +++ b/apps/checker/pkg/assertions/assertions.go @@ -73,16 +73,14 @@ func (target HeaderTarget) HeaderEvaluate(s string) bool { return false } - v, found := headers[target.Key] - if !found { - return false + for key, value := range headers { + if strings.EqualFold(key, target.Key) { + t := StringTargetType{Comparator: target.Comparator, Target: target.Target} + return t.StringEvaluate(fmt.Sprintf("%v", value)) + } } - t := StringTargetType{Comparator: target.Comparator, Target: target.Target} - // convert all headers to array - str := fmt.Sprintf("%v", v) - - return t.StringEvaluate(str) + return false } func (target StatusTarget) StatusEvaluate(value int64) bool { diff --git a/apps/checker/pkg/assertions/assertions_test.go b/apps/checker/pkg/assertions/assertions_test.go index a876d07b..f0ec18af 100644 --- a/apps/checker/pkg/assertions/assertions_test.go +++ b/apps/checker/pkg/assertions/assertions_test.go @@ -103,6 +103,10 @@ func TestHeaderTarget_HeaderEvaluate(t *testing.T) { {name: "Header 1", fields: fields{Comparator: request.StringEmpty, Target: "", Key: "headers1"}, args: args{s: `{"Content-Type":"text/plain;charset=UTF-8","Strict-Transport-Security":"max-age=3153600000","Vary":"Accept-Encoding"}`}, want: false}, {name: "Header 2", fields: fields{Comparator: request.StringNotEmpty, Target: "", Key: "headers1"}, args: args{s: `{"Content-Type":"text/plain;charset=UTF-8","Strict-Transport-Security":"max-age=3153600000","headers1":"Accept-Encoding"}`}, want: true}, {name: "it should return false if it can not decode the headers", fields: fields{Comparator: request.StringContains, Target: "Accept-Encoding", Key: "Vary"}, args: args{s: `}`}, want: false}, + {name: "Lowercase assertion key", fields: fields{Comparator: request.StringEquals, Target: "application/json", Key: "content-type"}, args: args{s: `{"Content-Type":"application/json"}`}, want: true}, + {name: "Mixed-case assertion and lowercase header", fields: fields{Comparator: request.StringEquals, Target: "application/json", Key: "CoNtEnT-TyPe"}, args: args{s: `{"content-type":"application/json"}`}, want: true}, + {name: "Case-sensitive header value", fields: fields{Comparator: request.StringEquals, Target: "application/json", Key: "content-type"}, args: args{s: `{"Content-Type":"application/JSON"}`}, want: false}, + {name: "Negative assertion uses actual header value", fields: fields{Comparator: request.StringNotEquals, Target: "application/json", Key: "content-type"}, args: args{s: `{"Content-Type":"application/json"}`}, want: false}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { diff --git a/apps/checker/pkg/job/http_job_test.go b/apps/checker/pkg/job/http_job_test.go index 58fc1155..2bb41ab7 100644 --- a/apps/checker/pkg/job/http_job_test.go +++ b/apps/checker/pkg/job/http_job_test.go @@ -171,7 +171,7 @@ func TestHTTPJob_HeaderAssertions(t *testing.T) { Retry: 1, HeaderAssertions: []*v1.HeaderAssertion{ { - Key: "X-Custom", + Key: "x-custom", Comparator: v1.StringComparator_STRING_COMPARATOR_EQUAL, Target: target, }, diff --git a/packages/assertions/src/v1.ts b/packages/assertions/src/v1.ts index 9b480988..9ac74cc0 100644 --- a/packages/assertions/src/v1.ts +++ b/packages/assertions/src/v1.ts @@ -308,8 +308,14 @@ export class HeaderAssertion implements Assertion { message: "Invalid request type for header assertion", }; } + + const key = this.schema.key.toLowerCase(); + const value = Object.entries(req.header).find( + ([name]) => name.toLowerCase() === key, + )?.[1]; + const { success, message } = evaluateString( - req.header[this.schema.key] ?? "", + value ?? "", this.schema.compare, this.schema.target, );