This repository has been archived on 2024-04-06. You can view files and clone it, but cannot push or open issues or pull requests.
core-old/internal/bundb/ennoblement_test.go
Dawid Wysokiński 0aed6f8fed
All checks were successful
continuous-integration/drone/push Build is passing
refactor: base models (#106)
Reviewed-on: twhelp/core#106
2022-10-20 04:16:37 +00:00

419 lines
10 KiB
Go

package bundb_test
import (
"context"
"testing"
"time"
"gitea.dwysokinski.me/twhelp/core/internal/bundb/internal/model"
"github.com/stretchr/testify/require"
"github.com/uptrace/bun/dbfixture"
"github.com/google/go-cmp/cmp/cmpopts"
"github.com/google/go-cmp/cmp"
"gitea.dwysokinski.me/twhelp/core/internal/domain"
"gitea.dwysokinski.me/twhelp/core/internal/bundb"
"github.com/stretchr/testify/assert"
)
func TestEnnoblement_Create(t *testing.T) {
t.Parallel()
db := newDB(t)
fixture := loadFixtures(t, db)
repo := bundb.NewEnnoblement(db)
t.Run("OK", func(t *testing.T) {
t.Parallel()
server := getServerFromFixture(t, fixture, "it70")
playerSquirtle := getPlayerFromFixture(t, fixture, "it70-squirtle")
playerTomasKH96 := getPlayerFromFixture(t, fixture, "it70-tomaskh-96")
village1 := getVillageFromFixture(t, fixture, "it70-village-1")
village2 := getVillageFromFixture(t, fixture, "it70-village-2")
params := []domain.CreateEnnoblementParams{
{
VillageID: village1.ID,
NewOwnerID: playerSquirtle.ID,
NewTribeID: playerSquirtle.TribeID,
OldOwnerID: 0,
OldTribeID: 0,
Points: village1.Points,
CreatedAt: time.Now().Add(-20 * time.Minute),
ServerKey: server.Key,
},
{
VillageID: village2.ID,
NewOwnerID: playerSquirtle.ID,
NewTribeID: playerSquirtle.TribeID,
OldOwnerID: 0,
OldTribeID: 0,
Points: village2.Points,
CreatedAt: time.Now().Add(-20 * time.Minute),
ServerKey: server.Key,
},
{
VillageID: village1.ID,
NewOwnerID: playerTomasKH96.ID,
NewTribeID: playerTomasKH96.TribeID,
OldOwnerID: playerSquirtle.ID,
OldTribeID: playerSquirtle.TribeID,
Points: village1.Points,
CreatedAt: time.Now().Add(-5 * time.Minute),
ServerKey: server.Key,
},
{
VillageID: village2.ID,
NewOwnerID: playerTomasKH96.ID,
NewTribeID: playerTomasKH96.TribeID,
OldOwnerID: playerSquirtle.ID,
OldTribeID: playerSquirtle.TribeID,
Points: village2.Points,
CreatedAt: time.Now(),
ServerKey: server.Key,
},
}
assert.NoError(t, repo.Create(context.Background(), params...))
ennoblements, _, err := repo.List(context.Background(), domain.ListEnnoblementsParams{
ServerKeys: []string{server.Key},
})
assert.NoError(t, err)
for _, p := range params {
var found bool
for _, e := range ennoblements {
p2 := domain.CreateEnnoblementParams{
VillageID: e.VillageID,
NewOwnerID: e.NewOwnerID,
NewTribeID: e.NewTribeID,
OldOwnerID: e.OldOwnerID,
OldTribeID: e.OldTribeID,
Points: e.Points,
CreatedAt: e.CreatedAt,
ServerKey: e.ServerKey,
}
if cmp.Equal(p, p2, cmpopts.EquateApproxTime(1*time.Second)) {
found = true
break
}
}
assert.True(t, found)
}
})
t.Run("OK: len(params) == 0", func(t *testing.T) {
t.Parallel()
assert.NoError(t, repo.Create(context.Background()))
})
t.Run("OK: skip ennoblements that already exist", func(t *testing.T) {
t.Parallel()
_, totalBeforeCreate, err := repo.List(context.Background(), domain.ListEnnoblementsParams{
Count: true,
})
assert.NoError(t, err)
ennoblement := getEnnoblementFromFixture(t, fixture, "pl169-village-2-1")
err = repo.Create(context.Background(), domain.CreateEnnoblementParams{
VillageID: ennoblement.VillageID,
NewOwnerID: ennoblement.NewOwnerID,
NewTribeID: ennoblement.NewTribeID,
OldOwnerID: ennoblement.OldOwnerID,
OldTribeID: ennoblement.OldTribeID,
Points: ennoblement.Points,
CreatedAt: ennoblement.CreatedAt,
ServerKey: ennoblement.ServerKey,
})
assert.NoError(t, err)
_, totalAfterCreate, err := repo.List(context.Background(), domain.ListEnnoblementsParams{
Count: true,
})
assert.NoError(t, err)
assert.Equal(t, totalBeforeCreate, totalAfterCreate)
})
}
func TestEnnoblement_List(t *testing.T) {
t.Parallel()
db := newDB(t)
fixture := loadFixtures(t, db)
repo := bundb.NewEnnoblement(db)
ennoblements := getAllEnnoblementsFromFixture(t, fixture)
type expectedEnnoblement struct {
id int64
serverKey string
villageID int64
newOwnerID int64
newTribeID int64
oldOwnerID int64
oldTribeID int64
}
allEnnoblements := make([]expectedEnnoblement, 0, len(ennoblements))
for _, ennoblement := range ennoblements {
allEnnoblements = append(allEnnoblements, expectedEnnoblement{
id: ennoblement.ID,
serverKey: ennoblement.ServerKey,
})
}
tests := []struct {
name string
params domain.ListEnnoblementsParams
expectedEnnoblements []expectedEnnoblement
expectedCount int64
expectedErr error
}{
{
name: "Count=true",
params: domain.ListEnnoblementsParams{Count: true},
expectedEnnoblements: allEnnoblements,
expectedCount: int64(len(allEnnoblements)),
},
{
name: "Count=false",
params: domain.ListEnnoblementsParams{Count: false},
expectedEnnoblements: allEnnoblements,
expectedCount: 0,
},
{
name: "ServerKeys=[pl169],Count=true",
params: domain.ListEnnoblementsParams{
Count: true,
ServerKeys: []string{"pl169"},
},
expectedEnnoblements: []expectedEnnoblement{
{
id: 1,
serverKey: "pl169",
},
{
id: 2,
serverKey: "pl169",
},
},
expectedCount: 2,
},
{
name: "ServerKeys=[pl169],Sort=[{By=CreatedAt,Direction=DESC}],Limit=1,Count=true",
params: domain.ListEnnoblementsParams{
Count: true,
Pagination: domain.Pagination{
Limit: 1,
},
ServerKeys: []string{"pl169"},
Sort: []domain.EnnoblementSort{
{By: domain.EnnoblementSortByCreatedAt, Direction: domain.SortDirectionDESC},
},
},
expectedEnnoblements: []expectedEnnoblement{
{
id: 2,
serverKey: "pl169",
},
},
expectedCount: 2,
},
{
name: "ServerKeys=[it70],Sort=[{By=ID,Direction=DESC}],Limit=1,Offset=1,Count=true",
params: domain.ListEnnoblementsParams{
Count: true,
Pagination: domain.Pagination{
Limit: 1,
Offset: 1,
},
ServerKeys: []string{"it70"},
Sort: []domain.EnnoblementSort{
{By: domain.EnnoblementSortByID, Direction: domain.SortDirectionDESC},
},
},
expectedEnnoblements: []expectedEnnoblement{
{
id: 3,
serverKey: "it70",
},
},
expectedCount: 2,
},
{
name: "ServerKeys=[it70],IncludeVillage=true,IncludeNewOwner=true,IncludeNewTribe=true,IncludeOldOwner=true,IncludeOldTribe=true,Count=true",
params: domain.ListEnnoblementsParams{
Count: true,
ServerKeys: []string{"it70"},
IncludeVillage: true,
IncludeNewOwner: true,
IncludeNewTribe: true,
IncludeOldOwner: true,
IncludeOldTribe: true,
},
expectedEnnoblements: []expectedEnnoblement{
{
id: 3,
serverKey: "it70",
villageID: 10023,
newOwnerID: 848881282,
newTribeID: 31,
oldOwnerID: 0,
oldTribeID: 0,
},
{
id: 4,
serverKey: "it70",
villageID: 10023,
newOwnerID: 578014,
newTribeID: 1,
oldOwnerID: 848881282,
oldTribeID: 31,
},
},
expectedCount: 2,
},
{
name: "CreatedAtLTE=2021-12-31T23:59:59Z,CreatedAtGTE=2021-01-01T00:00:00Z,Count=true",
params: domain.ListEnnoblementsParams{
Count: true,
CreatedAtLTE: domain.NullTime{
Time: time.Date(2021, time.December, 31, 23, 59, 59, 0, time.UTC),
Valid: true,
},
CreatedAtGTE: domain.NullTime{
Time: time.Date(2021, time.January, 1, 0, 0, 0, 0, time.UTC),
Valid: true,
},
},
expectedEnnoblements: []expectedEnnoblement{
{
id: 1,
serverKey: "pl169",
},
{
id: 2,
serverKey: "pl169",
},
},
expectedCount: 2,
},
{
name: "ERR: unsupported sort by",
params: domain.ListEnnoblementsParams{
Sort: []domain.EnnoblementSort{
{By: 100, Direction: domain.SortDirectionDESC},
},
},
expectedEnnoblements: nil,
expectedCount: 0,
expectedErr: domain.ErrUnsupportedSortBy,
},
{
name: "ERR: unsupported sort direction",
params: domain.ListEnnoblementsParams{
Sort: []domain.EnnoblementSort{
{By: domain.EnnoblementSortByCreatedAt, Direction: 100},
},
},
expectedEnnoblements: nil,
expectedCount: 0,
expectedErr: domain.ErrUnsupportedSortDirection,
},
}
for _, tt := range tests {
tt := tt
t.Run(tt.name, func(t *testing.T) {
t.Parallel()
res, count, err := repo.List(context.Background(), tt.params)
assert.ErrorIs(t, err, tt.expectedErr)
assert.Equal(t, tt.expectedCount, count)
assert.Len(t, res, len(tt.expectedEnnoblements))
for _, expEnnoblement := range tt.expectedEnnoblements {
found := false
for _, ennoblement := range res {
if ennoblement.ID != expEnnoblement.id {
continue
}
if ennoblement.ServerKey != expEnnoblement.serverKey {
continue
}
if ennoblement.Village.Village.ID != expEnnoblement.villageID {
continue
}
if ennoblement.NewOwner.Player.ID != expEnnoblement.newOwnerID {
continue
}
if ennoblement.NewTribe.Tribe.ID != expEnnoblement.newTribeID {
continue
}
if ennoblement.OldOwner.Player.ID != expEnnoblement.oldOwnerID {
continue
}
if ennoblement.OldTribe.Tribe.ID != expEnnoblement.oldTribeID {
continue
}
found = true
break
}
assert.True(
t,
found,
"ennoblement (id=%d,villageID=%d,newOwnerID=%d,newTribeID=%d,oldOwnerID=%d,oldTribeID=%d,serverkey=%s) not found",
expEnnoblement.id,
expEnnoblement.villageID,
expEnnoblement.newOwnerID,
expEnnoblement.newTribeID,
expEnnoblement.oldOwnerID,
expEnnoblement.oldTribeID,
expEnnoblement.serverKey,
)
}
})
}
}
func getAllEnnoblementsFromFixture(tb testing.TB, fixture *dbfixture.Fixture) []model.Ennoblement {
tb.Helper()
//nolint:lll
ids := []string{"pl169-village-2-1", "pl169-village-2-2", "it70-village-2-1", "it70-village-2-2"}
ennoblements := make([]model.Ennoblement, 0, len(ids))
for _, id := range ids {
ennoblements = append(ennoblements, getEnnoblementFromFixture(tb, fixture, id))
}
return ennoblements
}
func getEnnoblementFromFixture(tb testing.TB, fixture *dbfixture.Fixture, id string) model.Ennoblement {
tb.Helper()
row, err := fixture.Row("Ennoblement." + id)
require.NoError(tb, err)
e, ok := row.(*model.Ennoblement)
require.True(tb, ok)
return *e
}