core/internal/port/handler_http_api_test.go

67 lines
1.7 KiB
Go

package port_test
import (
"context"
"encoding/json"
"io"
"net/http"
"net/http/httptest"
"os"
"testing"
"gitea.dwysokinski.me/twhelp/corev3/internal/adapter"
"gitea.dwysokinski.me/twhelp/corev3/internal/app"
"gitea.dwysokinski.me/twhelp/corev3/internal/bun/buntest"
"gitea.dwysokinski.me/twhelp/corev3/internal/port"
"github.com/stretchr/testify/require"
)
type apiHTTPHandlerConfig struct {
options []port.APIHTTPHandlerOption
}
func newAPIHTTPHandler(tb testing.TB, opts ...func(cfg *apiHTTPHandlerConfig)) http.Handler {
tb.Helper()
cfg := &apiHTTPHandlerConfig{}
for _, opt := range opts {
opt(cfg)
}
bunDB := buntest.NewSQLiteDB(tb)
buntest.NewFixture(bunDB).Load(tb, context.Background(), os.DirFS("testdata/api"), "fixture.yml")
versionRepo := adapter.NewVersionBunRepository(bunDB)
serverRepo := adapter.NewServerBunRepository(bunDB)
tribeRepo := adapter.NewTribeBunRepository(bunDB)
playerRepo := adapter.NewPlayerBunRepository(bunDB)
villageRepo := adapter.NewVillageBunRepository(bunDB)
return port.NewAPIHTTPHandler(
app.NewVersionService(versionRepo),
app.NewServerService(serverRepo, nil, nil),
app.NewTribeService(tribeRepo, nil, nil),
app.NewPlayerService(playerRepo, nil, nil, nil),
app.NewVillageService(villageRepo, nil, nil),
cfg.options...,
)
}
func doRequest(h http.Handler, method, target string, body io.Reader) *http.Response {
return doCustomRequest(h, httptest.NewRequest(method, target, body))
}
func doCustomRequest(h http.Handler, r *http.Request) *http.Response {
rr := httptest.NewRecorder()
h.ServeHTTP(rr, r)
return rr.Result()
}
func decodeJSON[T any](tb testing.TB, r io.Reader) T {
tb.Helper()
var res T
require.NoError(tb, json.NewDecoder(r).Decode(&res))
return res
}