76 lines
1.7 KiB
Go
76 lines
1.7 KiB
Go
package playwright
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"regexp"
|
|
"strings"
|
|
)
|
|
|
|
type apiResponseAssertionsImpl struct {
|
|
actual APIResponse
|
|
isNot bool
|
|
}
|
|
|
|
func newAPIResponseAssertions(actual APIResponse, isNot bool) *apiResponseAssertionsImpl {
|
|
return &apiResponseAssertionsImpl{
|
|
actual: actual,
|
|
isNot: isNot,
|
|
}
|
|
}
|
|
|
|
func (ar *apiResponseAssertionsImpl) Not() APIResponseAssertions {
|
|
return newAPIResponseAssertions(ar.actual, true)
|
|
}
|
|
|
|
func (ar *apiResponseAssertionsImpl) ToBeOK() error {
|
|
if ar.isNot != ar.actual.Ok() {
|
|
return nil
|
|
}
|
|
message := fmt.Sprintf(`Response status expected to be within [200..299] range, was %v`, ar.actual.Status())
|
|
if ar.isNot {
|
|
message = strings.ReplaceAll(message, "expected to", "expected not to")
|
|
}
|
|
logList, err := ar.actual.(*apiResponseImpl).fetchLog()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
log := strings.Join(logList, "\n")
|
|
if log != "" {
|
|
message += "\nCall log:\n" + log
|
|
}
|
|
|
|
isTextEncoding := false
|
|
contentType, ok := ar.actual.Headers()["content-type"]
|
|
if ok {
|
|
isTextEncoding = isTexualMimeType(contentType)
|
|
}
|
|
if isTextEncoding {
|
|
text, err := ar.actual.Text()
|
|
if err == nil {
|
|
message += fmt.Sprintf(`\n Response Text:\n %s`, subString(text, 0, 1000))
|
|
}
|
|
}
|
|
return errors.New(message)
|
|
}
|
|
|
|
func isTexualMimeType(mimeType string) bool {
|
|
re := regexp.MustCompile(`^(text\/.*?|application\/(json|(x-)?javascript|xml.*?|ecmascript|graphql|x-www-form-urlencoded)|image\/svg(\+xml)?|application\/.*?(\+json|\+xml))(;\s*charset=.*)?$`)
|
|
return re.MatchString(mimeType)
|
|
}
|
|
|
|
func subString(s string, start, length int) string {
|
|
if start < 0 {
|
|
start = 0
|
|
}
|
|
if length < 0 {
|
|
length = 0
|
|
}
|
|
rs := []rune(s)
|
|
end := start + length
|
|
if end > len(rs) {
|
|
end = len(rs)
|
|
}
|
|
return string(rs[start:end])
|
|
}
|