gotosocial/internal/gtserror/new_test.go
kim 2063d01cdb
[bugfix] Add back removed ValidateRequest() before backoff-retry loop (#1805)
* add back removed ValidateRequest() before backoff-retry loop

Signed-off-by: kim <grufwub@gmail.com>

* include response body in error response log

Signed-off-by: kim <grufwub@gmail.com>

* improved error response body draining

Signed-off-by: kim <grufwub@gmail.com>

* add more code commenting

Signed-off-by: kim <grufwub@gmail.com>

* move new error response logic to gtserror, handle instead in transport.Transport{} impl

Signed-off-by: kim <grufwub@gmail.com>

* appease ye oh mighty linter

Signed-off-by: kim <grufwub@gmail.com>

* fix mockhttpclient not setting request in http response

Signed-off-by: kim <grufwub@gmail.com>

---------

Signed-off-by: kim <grufwub@gmail.com>
2023-05-21 18:59:14 +02:00

91 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
}