gotosocial/internal/gtserror/new_test.go

99 lines
1.9 KiB
Go

package gtserror_test
import (
"bytes"
"fmt"
"io"
"net/http"
"net/url"
"strings"
"testing"
"github.com/superseriousbusiness/gotosocial/internal/gtserror"
"github.com/superseriousbusiness/gotosocial/internal/log"
)
func TestResponseError(t *testing.T) {
testResponseError(t, http.Response{
Body: toBody(`{"error": "user not found"}`),
Request: &http.Request{
Method: "GET",
URL: toURL("https://google.com/users/sundar"),
},
Status: "404 Not Found",
})
testResponseError(t, http.Response{
Body: toBody("Unauthorized"),
Request: &http.Request{
Method: "POST",
URL: toURL("https://google.com/inbox"),
},
Status: "401 Unauthorized",
})
testResponseError(t, http.Response{
Body: toBody(""),
Request: &http.Request{
Method: "GET",
URL: toURL("https://google.com/users/sundar"),
},
Status: "404 Not Found",
})
}
func testResponseError(t *testing.T, rsp http.Response) {
var body string
if rsp.Body == http.NoBody {
body = "<empty>"
} else {
var b []byte
rsp.Body, b = copyBody(rsp.Body)
trunc := len(b)
if trunc > 256 {
trunc = 256
}
body = string(b[:trunc])
}
expect := fmt.Sprintf(
"%s%s request to %s failed: status=\"%s\" body=\"%s\"",
func() string {
if gtserror.Caller {
return strings.Split(log.Caller(3), ".")[1] + ": "
}
return ""
}(),
rsp.Request.Method,
rsp.Request.URL.String(),
rsp.Status,
body,
)
err := gtserror.NewFromResponse(&rsp)
if str := err.Error(); str != expect {
t.Errorf("unexpected error string: recv=%q expct=%q", str, expect)
}
}
func toURL(u string) *url.URL {
url, err := url.Parse(u)
if err != nil {
panic(err)
}
return url
}
func toBody(s string) io.ReadCloser {
if s == "" {
return http.NoBody
}
r := strings.NewReader(s)
return io.NopCloser(r)
}
func copyBody(rc io.ReadCloser) (io.ReadCloser, []byte) {
b, err := io.ReadAll(rc)
if err != nil {
panic(err)
}
r := bytes.NewReader(b)
return io.NopCloser(r), b
}