80 lines
2.3 KiB
Go
80 lines
2.3 KiB
Go
package port_test
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"io"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"os"
|
|
"testing"
|
|
|
|
"gitea.dwysokinski.me/twhelp/core/internal/adapter"
|
|
"gitea.dwysokinski.me/twhelp/core/internal/app"
|
|
"gitea.dwysokinski.me/twhelp/core/internal/bun/buntest"
|
|
"gitea.dwysokinski.me/twhelp/core/internal/port"
|
|
"github.com/brianvoe/gofakeit/v7"
|
|
"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)
|
|
ennoblementRepo := adapter.NewEnnoblementBunRepository(bunDB)
|
|
tribeChangeRepo := adapter.NewTribeChangeBunRepository(bunDB)
|
|
tribeSnapshotRepo := adapter.NewTribeSnapshotBunRepository(bunDB)
|
|
playerSnapshotRepo := adapter.NewPlayerSnapshotBunRepository(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),
|
|
app.NewEnnoblementService(ennoblementRepo, nil, nil),
|
|
app.NewTribeChangeService(tribeChangeRepo),
|
|
app.NewTribeSnapshotService(tribeSnapshotRepo, nil, nil),
|
|
app.NewPlayerSnapshotService(playerSnapshotRepo, 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
|
|
}
|
|
|
|
func randSliceElement[S ~[]E, E any](s S) E {
|
|
return s[gofakeit.IntRange(0, len(s)-1)]
|
|
}
|