dcbot/internal/service/village_test.go

191 lines
4.2 KiB
Go

package service_test
import (
"context"
"strconv"
"strings"
"testing"
"gitea.dwysokinski.me/twhelp/dcbot/internal/domain"
"gitea.dwysokinski.me/twhelp/dcbot/internal/service"
"gitea.dwysokinski.me/twhelp/dcbot/internal/service/internal/mock"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestVillage_TranslateCoords(t *testing.T) {
t.Parallel()
t.Run("OK", func(t *testing.T) {
t.Parallel()
villages := []domain.Village{
{
X: 123,
Y: 123,
},
{
X: 897,
Y: 123,
},
{
X: 778,
Y: 689,
},
}
notFound := []string{
"789|123",
"678|123",
}
var builderCoordsStr strings.Builder
for _, v := range villages {
builderCoordsStr.WriteString(v.Coords() + " ")
}
for _, coords := range notFound {
builderCoordsStr.WriteString(coords + " ")
}
params, err := domain.NewTranslateVillageCoordsParams("pl", "pl181", builderCoordsStr.String(), 2)
require.NoError(t, err)
tests := []struct {
page int32
hasNext bool
hasPrev bool
villages []domain.Village
notFound []string
}{
{
page: 1,
hasNext: true,
hasPrev: false,
villages: []domain.Village{
villages[0],
villages[1],
},
},
{
page: 2,
hasNext: true,
hasPrev: true,
villages: []domain.Village{
villages[2],
},
notFound: []string{
notFound[0],
},
},
{
page: 3,
hasNext: false,
hasPrev: true,
notFound: []string{
notFound[1],
},
},
}
for i := range tests {
tt := tests[i]
t.Run(strconv.Itoa(i), func(t *testing.T) {
t.Parallel()
twhelpSvc := &mock.FakeTWHelpService{}
twhelpSvc.ListVillagesByCoordsCalls(func(
ctx context.Context,
versionCode string,
serverKey string,
coords []string,
offset int32,
perPage int32,
) ([]domain.Village, error) {
if versionCode != params.VersionCode() || serverKey != params.ServerKey() {
return nil, nil
}
res := make([]domain.Village, 0, len(coords))
for _, c := range coords {
for _, v := range villages {
if v.Coords() == c {
res = append(res, v)
break
}
}
}
return res, nil
})
res, err := service.NewVillage(&mock.FakeVillageRepository{}, twhelpSvc).
TranslateCoords(context.Background(), params, tt.page)
assert.NoError(t, err)
assert.Len(t, res.Villages, len(tt.villages))
for _, v := range tt.villages {
assert.Contains(t, res.Villages, v)
}
assert.Len(t, res.NotFound, len(tt.notFound))
for _, coords := range tt.notFound {
assert.Contains(t, res.NotFound, coords)
}
assert.Equal(t, tt.hasPrev, res.HasPrev)
assert.Equal(t, tt.hasNext, res.HasNext)
assert.Equal(t, tt.page, res.Page)
assert.Equal(t, params.MaxPage(), res.MaxPage)
assert.Equal(t, params.SHA256(), res.ParamsSHA256)
})
}
})
t.Run("ERR: page < 1", func(t *testing.T) {
t.Parallel()
res, err := service.NewVillage(nil, nil).
TranslateCoords(context.Background(), domain.TranslateVillageCoordsParams{}, 0)
assert.ErrorIs(t, err, domain.GreaterEqualThanError{
Field: "page",
Threshold: 1,
})
assert.Zero(t, res)
})
t.Run("ERR: page > max page", func(t *testing.T) {
t.Parallel()
res, err := service.NewVillage(nil, nil).
TranslateCoords(context.Background(), domain.TranslateVillageCoordsParams{}, 1)
assert.ErrorIs(t, err, domain.LessEqualThanError{
Field: "page",
Threshold: 0,
})
assert.Zero(t, res)
})
}
func TestVillage_TranslateCoordsFromHash(t *testing.T) {
t.Parallel()
params, err := domain.NewTranslateVillageCoordsParams("pl", "pl181", "123|123 897|123 778|689 789|123 678|123", 2)
require.NoError(t, err)
repo := &mock.FakeVillageRepository{}
repo.GetTranslateCoordsParamsCalls(func(ctx context.Context, hash string) (domain.TranslateVillageCoordsParams, error) {
if hash != params.SHA256() {
return domain.TranslateVillageCoordsParams{}, domain.TranslateVillageCoordsParamsNotFoundError{
SHA256: hash,
}
}
return params, nil
})
res, err := service.NewVillage(repo, &mock.FakeTWHelpService{}).
TranslateCoordsFromHash(context.Background(), params.SHA256(), 1)
assert.NoError(t, err)
assert.NotZero(t, res)
}