2023-07-18 19:48:38 +00:00
|
|
|
package server_test
|
2023-07-18 16:02:57 +00:00
|
|
|
|
|
|
|
import (
|
|
|
|
"errors"
|
|
|
|
"io"
|
|
|
|
"net/http"
|
|
|
|
"net/http/httptest"
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
"git.akyoto.dev/go/assert"
|
2023-07-18 19:48:38 +00:00
|
|
|
"git.akyoto.dev/go/server"
|
2023-07-18 16:02:57 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
func TestServer(t *testing.T) {
|
2023-07-18 19:48:38 +00:00
|
|
|
s := server.New()
|
2023-07-18 16:02:57 +00:00
|
|
|
|
2023-07-18 19:48:38 +00:00
|
|
|
s.Get("/", func(ctx server.Context) error {
|
2023-07-18 16:02:57 +00:00
|
|
|
return ctx.Bytes([]byte("Hello"))
|
|
|
|
})
|
|
|
|
|
2023-07-18 19:48:38 +00:00
|
|
|
s.Get("/blog/:post", func(ctx server.Context) error {
|
2023-07-18 16:02:57 +00:00
|
|
|
return ctx.Bytes([]byte("Hello"))
|
|
|
|
})
|
|
|
|
|
2023-07-18 19:48:38 +00:00
|
|
|
s.Get("/error", func(ctx server.Context) error {
|
2023-07-18 16:02:57 +00:00
|
|
|
return ctx.Error(http.StatusUnauthorized, errors.New("Not logged in"))
|
|
|
|
})
|
|
|
|
|
|
|
|
tests := []struct {
|
|
|
|
URL string
|
|
|
|
Status int
|
|
|
|
Body string
|
|
|
|
}{
|
|
|
|
{URL: "/", Status: http.StatusOK, Body: "Hello"},
|
|
|
|
{URL: "/blog/post", Status: http.StatusOK, Body: "Hello"},
|
|
|
|
{URL: "/error", Status: http.StatusUnauthorized, Body: "Not logged in"},
|
|
|
|
{URL: "/not-found", Status: http.StatusNotFound, Body: http.StatusText(http.StatusNotFound)},
|
|
|
|
}
|
|
|
|
|
|
|
|
for _, test := range tests {
|
|
|
|
t.Run("example.com"+test.URL, func(t *testing.T) {
|
|
|
|
request := httptest.NewRequest(http.MethodGet, test.URL, nil)
|
|
|
|
response := httptest.NewRecorder()
|
2023-07-18 19:48:38 +00:00
|
|
|
s.ServeHTTP(response, request)
|
2023-07-18 16:02:57 +00:00
|
|
|
|
|
|
|
result := response.Result()
|
|
|
|
assert.Equal(t, result.StatusCode, test.Status)
|
|
|
|
|
|
|
|
body, err := io.ReadAll(result.Body)
|
|
|
|
assert.Nil(t, err)
|
|
|
|
assert.DeepEqual(t, string(body), test.Body)
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|