updated hws.ThrowError to not return an error and log it to console instead
fixed errors_test fixed tests
This commit is contained in:
@@ -14,22 +14,26 @@ import (
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
type goodPage struct{}
|
||||
type badPage struct{}
|
||||
type (
|
||||
goodPage struct{}
|
||||
badPage struct{}
|
||||
)
|
||||
|
||||
func goodRender(error hws.HWSError) (hws.ErrorPage, error) {
|
||||
return goodPage{}, nil
|
||||
}
|
||||
|
||||
func badRender1(error hws.HWSError) (hws.ErrorPage, error) {
|
||||
return badPage{}, nil
|
||||
}
|
||||
|
||||
func badRender2(error hws.HWSError) (hws.ErrorPage, error) {
|
||||
return nil, errors.New("I'm an error")
|
||||
}
|
||||
|
||||
func (g goodPage) Render(ctx context.Context, w io.Writer) error {
|
||||
w.Write([]byte("Test write to ResponseWriter"))
|
||||
return nil
|
||||
_, err := w.Write([]byte("Test write to ResponseWriter"))
|
||||
return err
|
||||
}
|
||||
|
||||
func (b badPage) Render(ctx context.Context, w io.Writer) error {
|
||||
@@ -85,40 +89,42 @@ func Test_ThrowError(t *testing.T) {
|
||||
req := httptest.NewRequest("GET", "/", nil)
|
||||
|
||||
t.Run("Server not started", func(t *testing.T) {
|
||||
err := server.ThrowError(rr, req, hws.HWSError{
|
||||
buf.Reset()
|
||||
server.ThrowError(rr, req, hws.HWSError{
|
||||
StatusCode: http.StatusInternalServerError,
|
||||
Message: "Error",
|
||||
Error: errors.New("Error"),
|
||||
})
|
||||
assert.Error(t, err)
|
||||
// ThrowError logs errors internally when validation fails
|
||||
output := buf.String()
|
||||
assert.Contains(t, output, "ThrowError called before server started")
|
||||
})
|
||||
|
||||
startTestServer(t, server)
|
||||
defer server.Shutdown(t.Context())
|
||||
|
||||
tests := []struct {
|
||||
name string
|
||||
request *http.Request
|
||||
error hws.HWSError
|
||||
valid bool
|
||||
name string
|
||||
request *http.Request
|
||||
error hws.HWSError
|
||||
expectLogItem string
|
||||
}{
|
||||
{
|
||||
name: "No HWSError.Status code",
|
||||
request: nil,
|
||||
error: hws.HWSError{},
|
||||
valid: false,
|
||||
name: "No HWSError.Status code",
|
||||
request: nil,
|
||||
error: hws.HWSError{},
|
||||
expectLogItem: "HWSError.StatusCode cannot be 0",
|
||||
},
|
||||
{
|
||||
name: "Negative HWSError.Status code",
|
||||
request: nil,
|
||||
error: hws.HWSError{StatusCode: -1},
|
||||
valid: false,
|
||||
name: "Negative HWSError.Status code",
|
||||
request: nil,
|
||||
error: hws.HWSError{StatusCode: -1},
|
||||
expectLogItem: "HWSError.StatusCode cannot be 0",
|
||||
},
|
||||
{
|
||||
name: "No HWSError.Message",
|
||||
request: nil,
|
||||
error: hws.HWSError{StatusCode: http.StatusInternalServerError},
|
||||
valid: false,
|
||||
name: "No HWSError.Message",
|
||||
request: nil,
|
||||
error: hws.HWSError{StatusCode: http.StatusInternalServerError},
|
||||
expectLogItem: "HWSError.Message cannot be empty",
|
||||
},
|
||||
{
|
||||
name: "No HWSError.Error",
|
||||
@@ -127,7 +133,7 @@ func Test_ThrowError(t *testing.T) {
|
||||
StatusCode: http.StatusInternalServerError,
|
||||
Message: "An error occured",
|
||||
},
|
||||
valid: false,
|
||||
expectLogItem: "HWSError.Error cannot be nil",
|
||||
},
|
||||
{
|
||||
name: "No request provided",
|
||||
@@ -137,7 +143,7 @@ func Test_ThrowError(t *testing.T) {
|
||||
Message: "An error occured",
|
||||
Error: errors.New("Error"),
|
||||
},
|
||||
valid: false,
|
||||
expectLogItem: "Request cannot be nil",
|
||||
},
|
||||
{
|
||||
name: "Valid",
|
||||
@@ -147,106 +153,92 @@ func Test_ThrowError(t *testing.T) {
|
||||
Message: "An error occured",
|
||||
Error: errors.New("Error"),
|
||||
},
|
||||
valid: true,
|
||||
expectLogItem: "An error occured",
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
buf.Reset()
|
||||
rr := httptest.NewRecorder()
|
||||
err := server.ThrowError(rr, tt.request, tt.error)
|
||||
if tt.valid {
|
||||
assert.NoError(t, err)
|
||||
} else {
|
||||
t.Log(err)
|
||||
assert.Error(t, err)
|
||||
}
|
||||
server.ThrowError(rr, tt.request, tt.error)
|
||||
// ThrowError no longer returns errors; check logs instead
|
||||
output := buf.String()
|
||||
assert.Contains(t, output, tt.expectLogItem)
|
||||
})
|
||||
}
|
||||
t.Run("Log level set correctly", func(t *testing.T) {
|
||||
buf.Reset()
|
||||
rr := httptest.NewRecorder()
|
||||
req := httptest.NewRequest("GET", "/", nil)
|
||||
err := server.ThrowError(rr, req, hws.HWSError{
|
||||
server.ThrowError(rr, req, hws.HWSError{
|
||||
StatusCode: http.StatusInternalServerError,
|
||||
Message: "An error occured",
|
||||
Error: errors.New("Error"),
|
||||
Level: hws.ErrorWARN,
|
||||
})
|
||||
assert.NoError(t, err)
|
||||
_, err = buf.ReadString([]byte(" ")[0])
|
||||
_, err := buf.ReadString([]byte(" ")[0])
|
||||
require.NoError(t, err)
|
||||
loglvl, err := buf.ReadString([]byte(" ")[0])
|
||||
assert.NoError(t, err)
|
||||
if loglvl != "\x1b[33mWRN\x1b[0m " {
|
||||
err = errors.New("Log level not set correctly")
|
||||
}
|
||||
assert.NoError(t, err)
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, "\x1b[33mWRN\x1b[0m ", loglvl, "Log level should be WRN for ErrorWARN")
|
||||
|
||||
buf.Reset()
|
||||
err = server.ThrowError(rr, req, hws.HWSError{
|
||||
server.ThrowError(rr, req, hws.HWSError{
|
||||
StatusCode: http.StatusInternalServerError,
|
||||
Message: "An error occured",
|
||||
Error: errors.New("Error"),
|
||||
})
|
||||
assert.NoError(t, err)
|
||||
_, err = buf.ReadString([]byte(" ")[0])
|
||||
require.NoError(t, err)
|
||||
loglvl, err = buf.ReadString([]byte(" ")[0])
|
||||
assert.NoError(t, err)
|
||||
if loglvl != "\x1b[31mERR\x1b[0m " {
|
||||
err = errors.New("Log level not set correctly")
|
||||
}
|
||||
assert.NoError(t, err)
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, "\x1b[31mERR\x1b[0m ", loglvl, "Log level should be ERR when no level specified")
|
||||
})
|
||||
|
||||
t.Run("Error page doesnt render if no error page set", func(t *testing.T) {
|
||||
// Must be run before adding the error page to the test server
|
||||
rr := httptest.NewRecorder()
|
||||
req := httptest.NewRequest("GET", "/", nil)
|
||||
err := server.ThrowError(rr, req, hws.HWSError{
|
||||
server.ThrowError(rr, req, hws.HWSError{
|
||||
StatusCode: http.StatusInternalServerError,
|
||||
Message: "An error occured",
|
||||
Error: errors.New("Error"),
|
||||
RenderErrorPage: true,
|
||||
})
|
||||
assert.NoError(t, err)
|
||||
body := rr.Body.String()
|
||||
if body != "" {
|
||||
assert.Error(t, nil)
|
||||
}
|
||||
assert.Empty(t, body, "Error page should not render when no error page is set")
|
||||
})
|
||||
t.Run("Error page renders", func(t *testing.T) {
|
||||
rr := httptest.NewRecorder()
|
||||
req := httptest.NewRequest("GET", "/", nil)
|
||||
// Adding the error page will carry over to all future tests and cant be undone
|
||||
server.AddErrorPage(goodRender)
|
||||
err := server.ThrowError(rr, req, hws.HWSError{
|
||||
err := server.AddErrorPage(goodRender)
|
||||
require.NoError(t, err)
|
||||
server.ThrowError(rr, req, hws.HWSError{
|
||||
StatusCode: http.StatusInternalServerError,
|
||||
Message: "An error occured",
|
||||
Error: errors.New("Error"),
|
||||
RenderErrorPage: true,
|
||||
})
|
||||
assert.NoError(t, err)
|
||||
body := rr.Body.String()
|
||||
if body == "" {
|
||||
assert.Error(t, nil)
|
||||
}
|
||||
assert.NotEmpty(t, body, "Error page should render when RenderErrorPage is true")
|
||||
})
|
||||
t.Run("Error page doesnt render if no told to render", func(t *testing.T) {
|
||||
t.Run("Error page doesnt render if not told to render", func(t *testing.T) {
|
||||
// Error page already added to server
|
||||
rr := httptest.NewRecorder()
|
||||
req := httptest.NewRequest("GET", "/", nil)
|
||||
err := server.ThrowError(rr, req, hws.HWSError{
|
||||
server.ThrowError(rr, req, hws.HWSError{
|
||||
StatusCode: http.StatusInternalServerError,
|
||||
Message: "An error occured",
|
||||
Error: errors.New("Error"),
|
||||
})
|
||||
assert.NoError(t, err)
|
||||
body := rr.Body.String()
|
||||
if body != "" {
|
||||
assert.Error(t, nil)
|
||||
}
|
||||
assert.Empty(t, body, "Error page should not render when RenderErrorPage is false")
|
||||
})
|
||||
server.Shutdown(t.Context())
|
||||
err := server.Shutdown(t.Context())
|
||||
require.NoError(t, err)
|
||||
|
||||
t.Run("Doesn't error if no logger added to server", func(t *testing.T) {
|
||||
t.Run("Doesn't panic if no logger added to server", func(t *testing.T) {
|
||||
server, err := hws.NewServer(&hws.Config{
|
||||
Host: "127.0.0.1",
|
||||
Port: randomPort(),
|
||||
@@ -261,13 +253,18 @@ func Test_ThrowError(t *testing.T) {
|
||||
err = server.Start(t.Context())
|
||||
require.NoError(t, err)
|
||||
<-server.Ready()
|
||||
|
||||
rr := httptest.NewRecorder()
|
||||
req := httptest.NewRequest("GET", "/", nil)
|
||||
err = server.ThrowError(rr, req, hws.HWSError{
|
||||
StatusCode: http.StatusInternalServerError,
|
||||
Message: "An error occured",
|
||||
Error: errors.New("Error"),
|
||||
})
|
||||
assert.NoError(t, err)
|
||||
// Should not panic when no logger is present
|
||||
assert.NotPanics(t, func() {
|
||||
server.ThrowError(rr, req, hws.HWSError{
|
||||
StatusCode: http.StatusInternalServerError,
|
||||
Message: "An error occured",
|
||||
Error: errors.New("Error"),
|
||||
})
|
||||
}, "ThrowError should not panic when no logger is present")
|
||||
err = server.Shutdown(t.Context())
|
||||
require.NoError(t, err)
|
||||
})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user