195 lines
5.2 KiB
Go
Raw Normal View History

2023-07-18 19:48:38 +00:00
package server_test
2023-07-18 16:02:57 +00:00
import (
"errors"
2023-07-22 10:32:52 +00:00
"fmt"
2023-07-18 16:02:57 +00:00
"io"
2024-03-12 21:31:45 +00:00
"net"
2023-07-18 16:02:57 +00:00
"net/http"
"net/http/httptest"
2023-07-19 11:01:51 +00:00
"strings"
2024-03-12 21:31:45 +00:00
"syscall"
2023-07-18 16:02:57 +00:00
"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
)
2023-07-19 10:31:33 +00:00
func TestRouter(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-22 09:48:35 +00:00
s.Get("/string", func(ctx server.Context) error {
return ctx.String("Hello")
2023-07-18 16:02:57 +00:00
})
2024-03-13 21:49:57 +00:00
s.Get("/write", func(ctx server.Context) error {
2024-03-14 11:52:03 +00:00
_, err := ctx.Write([]byte("Hello"))
return err
})
s.Get("/writestring", func(ctx server.Context) error {
2024-03-13 21:49:57 +00:00
_, err := io.WriteString(ctx, "Hello")
return err
})
2023-07-18 19:48:38 +00:00
s.Get("/error", func(ctx server.Context) error {
2024-03-13 15:57:36 +00:00
return ctx.Status(http.StatusUnauthorized).Error("Not logged in")
2023-07-21 21:23:49 +00:00
})
s.Get("/error2", func(ctx server.Context) error {
2024-03-13 15:57:36 +00:00
return ctx.Status(http.StatusUnauthorized).Error("Not logged in", errors.New("Missing auth token"))
2023-07-18 16:02:57 +00:00
})
2023-07-19 11:01:51 +00:00
s.Get("/reader", func(ctx server.Context) error {
return ctx.Reader(strings.NewReader("Hello"))
})
2023-07-22 10:32:52 +00:00
s.Get("/request/data", func(ctx server.Context) error {
2024-03-13 19:18:01 +00:00
method := ctx.Method()
protocol := ctx.Protocol()
host := ctx.Host()
path := ctx.Path()
2023-07-22 10:32:52 +00:00
return ctx.String(fmt.Sprintf("%s %s %s %s", method, protocol, host, path))
})
s.Get("/request/header", func(ctx server.Context) error {
2024-03-13 19:18:01 +00:00
acceptEncoding := ctx.RequestHeader("Accept-Encoding")
2023-07-22 10:32:52 +00:00
return ctx.String(acceptEncoding)
})
s.Get("/response/header", func(ctx server.Context) error {
2024-03-13 19:18:01 +00:00
ctx.Header("Content-Type", "text/plain")
contentType := ctx.ResponseHeader("Content-Type")
2023-07-22 10:32:52 +00:00
return ctx.String(contentType)
})
2023-07-22 09:48:35 +00:00
s.Get("/blog/:article", func(ctx server.Context) error {
article := ctx.Get("article")
return ctx.String(article)
})
s.Get("/missing-parameter", func(ctx server.Context) error {
missing := ctx.Get("missing")
return ctx.String(missing)
2023-07-19 11:01:51 +00:00
})
2024-03-14 11:52:03 +00:00
s.Get("/scheme", func(ctx server.Context) error {
return ctx.String(ctx.Scheme())
})
2023-07-22 09:36:28 +00:00
s.Post("/", func(ctx server.Context) error {
return ctx.String("Post")
})
s.Delete("/", func(ctx server.Context) error {
return ctx.String("Delete")
})
s.Put("/", func(ctx server.Context) error {
return ctx.String("Put")
})
2023-07-18 16:02:57 +00:00
tests := []struct {
2023-07-22 09:36:28 +00:00
Method string
2023-07-18 16:02:57 +00:00
URL string
Status int
Body string
}{
2023-07-22 09:36:28 +00:00
{Method: "GET", URL: "/", Status: http.StatusOK, Body: "Hello"},
{Method: "GET", URL: "/error", Status: http.StatusUnauthorized, Body: "Not logged in"},
{Method: "GET", URL: "/error2", Status: http.StatusUnauthorized, Body: "Not logged in\nMissing auth token"},
{Method: "GET", URL: "/not-found", Status: http.StatusNotFound, Body: http.StatusText(http.StatusNotFound)},
2023-07-22 10:32:52 +00:00
{Method: "GET", URL: "/request/data", Status: http.StatusOK, Body: "GET HTTP/1.1 example.com /request/data"},
{Method: "GET", URL: "/request/header", Status: http.StatusOK, Body: ""},
{Method: "GET", URL: "/response/header", Status: http.StatusOK, Body: "text/plain"},
2023-07-22 09:36:28 +00:00
{Method: "GET", URL: "/reader", Status: http.StatusOK, Body: "Hello"},
{Method: "GET", URL: "/string", Status: http.StatusOK, Body: "Hello"},
2024-03-14 11:52:03 +00:00
{Method: "GET", URL: "/scheme", Status: http.StatusOK, Body: "http"},
2024-03-13 21:49:57 +00:00
{Method: "GET", URL: "/write", Status: http.StatusOK, Body: "Hello"},
2024-03-14 11:52:03 +00:00
{Method: "GET", URL: "/writestring", Status: http.StatusOK, Body: "Hello"},
2023-07-22 09:48:35 +00:00
{Method: "GET", URL: "/blog/testing-my-router", Status: http.StatusOK, Body: "testing-my-router"},
{Method: "GET", URL: "/missing-parameter", Status: http.StatusOK, Body: ""},
2023-07-22 09:36:28 +00:00
{Method: "POST", URL: "/", Status: http.StatusOK, Body: "Post"},
{Method: "DELETE", URL: "/", Status: http.StatusOK, Body: "Delete"},
{Method: "PUT", URL: "/", Status: http.StatusOK, Body: "Put"},
2023-07-18 16:02:57 +00:00
}
for _, test := range tests {
t.Run("example.com"+test.URL, func(t *testing.T) {
2024-03-14 11:52:03 +00:00
request := httptest.NewRequest(test.Method, "http://example.com"+test.URL, nil)
2023-07-18 16:02:57 +00:00
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)
})
}
}
2023-07-19 10:31:33 +00:00
2024-03-13 19:18:01 +00:00
func TestMiddleware(t *testing.T) {
s := server.New()
s.Use(func(ctx server.Context) error {
ctx.Header("Middleware", "true")
return ctx.Next()
})
request := httptest.NewRequest(http.MethodGet, "/", nil)
response := httptest.NewRecorder()
s.ServeHTTP(response, request)
assert.Equal(t, response.Header().Get("Middleware"), "true")
}
2023-07-19 10:31:33 +00:00
func TestPanic(t *testing.T) {
s := server.New()
2024-03-14 11:52:03 +00:00
s.Router().Add(http.MethodGet, "/panic", func(ctx server.Context) error {
2023-07-19 10:31:33 +00:00
panic("Something unbelievable happened")
})
t.Run("example.com/panic", func(t *testing.T) {
defer func() {
r := recover()
if r == nil {
t.Error("Didn't panic")
}
}()
request := httptest.NewRequest(http.MethodGet, "/panic", nil)
response := httptest.NewRecorder()
s.ServeHTTP(response, request)
})
}
2024-03-12 21:31:45 +00:00
func TestRun(t *testing.T) {
s := server.New()
go func() {
_, err := http.Get("http://127.0.0.1:8080/")
assert.Nil(t, err)
err = syscall.Kill(syscall.Getpid(), syscall.SIGTERM)
assert.Nil(t, err)
}()
s.Run(":8080")
}
func TestUnavailablePort(t *testing.T) {
listener, err := net.Listen("tcp", ":8080")
assert.Nil(t, err)
defer listener.Close()
s := server.New()
s.Run(":8080")
}