mirror of
https://github.com/superseriousbusiness/gotosocial.git
synced 2024-12-23 10:42:12 +00:00
92 lines
1.8 KiB
Go
92 lines
1.8 KiB
Go
|
package gtserror_test
|
||
|
|
||
|
import (
|
||
|
"bytes"
|
||
|
"fmt"
|
||
|
"io"
|
||
|
"net/http"
|
||
|
"net/url"
|
||
|
"strings"
|
||
|
"testing"
|
||
|
|
||
|
"github.com/superseriousbusiness/gotosocial/internal/gtserror"
|
||
|
)
|
||
|
|
||
|
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 request to %s failed: status=\"%s\" body=\"%s\"",
|
||
|
rsp.Request.Method,
|
||
|
rsp.Request.URL.String(),
|
||
|
rsp.Status,
|
||
|
body,
|
||
|
)
|
||
|
err := gtserror.NewResponseError(&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
|
||
|
}
|