1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
|
package proton_test
import (
"context"
"encoding/json"
"errors"
"net"
"net/http"
"net/http/httptest"
"net/url"
"testing"
"github.com/henrybear327/go-proton-api"
"github.com/henrybear327/go-proton-api/server"
"github.com/stretchr/testify/require"
)
func TestNetError_DropOnWrite(t *testing.T) {
l, err := net.Listen("tcp", ":0")
require.NoError(t, err)
dropListener := proton.NewListener(l, proton.NewDropConn)
// Use a custom listener that drops all writes.
dropListener.SetCanWrite(false)
// Simulate a server that refuses to write.
s := server.New(server.WithListener(dropListener))
defer s.Close()
m := proton.New(proton.WithHostURL(s.GetHostURL()))
defer m.Close()
// This should fail with a URL error.
pingErr := m.Ping(context.Background())
if urlErr := new(url.Error); !errors.As(pingErr, &urlErr) {
t.Fatalf("expected a url.Error, got %T: %v", pingErr, pingErr)
}
}
func TestAPIError_DeserializeWithoutDetails(t *testing.T) {
errJson := `
{
"Status": 400,
"Code": 1000,
"Error": "Foo Bar"
}
`
var err proton.APIError
require.NoError(t, json.Unmarshal([]byte(errJson), &err))
require.Nil(t, err.Details)
}
func TestAPIError_DeserializeWithoutDetailsValue(t *testing.T) {
errJson := `
{
"Status": 400,
"Code": 1000,
"Error": "Foo Bar",
"Details": 20
}
`
var err proton.APIError
require.NoError(t, json.Unmarshal([]byte(errJson), &err))
require.NotNil(t, err.Details)
require.Equal(t, `20`, err.DetailsToString())
}
func TestAPIError_DeserializeWithDetailsObject(t *testing.T) {
errJson := `
{
"Status": 400,
"Code": 1000,
"Error": "Foo Bar",
"Details": {
"object2": {
"v": 20
},
"foo": "bar"
}
}
`
var err proton.APIError
require.NoError(t, json.Unmarshal([]byte(errJson), &err))
require.NotNil(t, err.Details)
require.Equal(t, `{"foo":"bar","object2":{"v":20}}`, err.DetailsToString())
}
func TestAPIError_DeserializeWithDetailsArray(t *testing.T) {
errJson := `
{
"Status": 400,
"Code": 1000,
"Error": "Foo Bar",
"Details": [
{
"object2": {
"v": 20
},
"foo": "bar"
},
499,
"hello"
]
}
`
var err proton.APIError
require.NoError(t, json.Unmarshal([]byte(errJson), &err))
require.NotNil(t, err.Details)
require.Equal(t, `[{"foo":"bar","object2":{"v":20}},499,"hello"]`, err.DetailsToString())
}
func TestNetError_RouteInErrorMessage(t *testing.T) {
s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusBadRequest)
}))
defer s.Close()
m := proton.New(proton.WithHostURL(s.URL))
defer m.Close()
pingErr := m.Quark(context.Background(), "test/ping")
require.Error(t, pingErr)
require.Contains(t, pingErr.Error(), "GET")
require.Contains(t, pingErr.Error(), "/test/ping")
}
|