Files
uptimemonitor/pkg/testutil/assertable_response.go
2025-08-01 18:01:55 +02:00

156 lines
3.5 KiB
Go

package testutil
import (
"net/http"
"strings"
"testing"
"github.com/PuerkitoBio/goquery"
)
type AssertableResponse struct {
T *testing.T
Response *http.Response
Document *goquery.Document
}
func NewAssertableResponse(t *testing.T, res *http.Response) *AssertableResponse {
doc, _ := goquery.NewDocumentFromReader(res.Body)
return &AssertableResponse{
T: t,
Response: res,
Document: doc,
}
}
func (ar *AssertableResponse) AssertStatusCode(expected int) *AssertableResponse {
ar.T.Helper()
if ar.Response.StatusCode != expected {
ar.T.Fatalf("expected status code %d, got %d", expected, ar.Response.StatusCode)
}
return ar
}
func (ar *AssertableResponse) AssertRedirect(statusCode int, expected string) *AssertableResponse {
ar.T.Helper()
if ar.Response.Request.Response == nil {
ar.T.Fatalf("no redirect has been made")
}
if ar.Response.Request.Response.StatusCode != statusCode {
ar.T.Fatalf("expected status code %d, got %d", statusCode, ar.Response.Request.Response.StatusCode)
}
if actual := ar.Response.Request.Response.Header.Get("Location"); actual != expected {
ar.T.Fatalf("expected redirect to %s, got %s", expected, actual)
}
return ar
}
func (ar *AssertableResponse) AssertNoRedirect() *AssertableResponse {
ar.T.Helper()
if ar.Response.Request.Response != nil {
ar.T.Fatalf("unexpected redirect: %v", ar.Response.Request.URL)
}
return ar
}
func (ar *AssertableResponse) AssertElementVisible(selector string) *AssertableResponse {
ar.T.Helper()
if ar.Document == nil {
ar.T.Fatalf("no document available for assertion")
}
if ar.Document.Find(selector).Length() == 0 {
html, _ := ar.Document.Html()
ar.T.Fatalf(
"expected element with selector '%s' to be visible but it was not found in the output: %v",
selector,
html,
)
}
return ar
}
func (ar *AssertableResponse) AssertSeeText(text string) *AssertableResponse {
ar.T.Helper()
if ar.Document == nil {
ar.T.Fatalf("no document available for assertion")
}
html, _ := ar.Document.Html()
if !strings.Contains(html, text) {
ar.T.Fatalf("expected to see text '%s' but it was not found in the output: %v", text, html)
}
return ar
}
func (ar *AssertableResponse) AssertHeader(header string, expected string) *AssertableResponse {
ar.T.Helper()
if value := ar.Response.Header.Get(header); value == "" {
ar.T.Fatalf(`no header "%s" found`, header)
}
if value := ar.Response.Header.Get(header); value != expected {
ar.T.Fatalf("expected header '%s' to have value of '%s' but got '%s' instead", header, expected, value)
}
return ar
}
func (ar *AssertableResponse) AssertCookieSet(name string) *AssertableResponse {
ar.T.Helper()
for _, c := range ar.Response.Cookies() {
if c.Name == name {
return ar
}
}
if ar.Response.Request != nil && ar.Response.Request.Response != nil {
for _, c := range ar.Response.Request.Response.Cookies() {
if c.Name == name {
return ar
}
}
}
ar.T.Fatalf("expected to find cookie with a name '%s', but none has been found", name)
return ar
}
func (ar *AssertableResponse) AssertCookieMissing(name string) *AssertableResponse {
ar.T.Helper()
for _, c := range ar.Response.Cookies() {
if c.Name == name {
ar.T.Fatalf("expected not to find cookie with a name '%s'", name)
return ar
}
}
if ar.Response.Request != nil && ar.Response.Request.Response != nil {
for _, c := range ar.Response.Request.Response.Cookies() {
if c.Name == name {
ar.T.Fatalf("expected not to find cookie with a name '%s'", name)
return ar
}
}
}
return ar
}