483 lines
13 KiB
Go
483 lines
13 KiB
Go
package bundb_test
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/google/go-cmp/cmp/cmpopts"
|
|
|
|
"github.com/google/go-cmp/cmp"
|
|
|
|
"gitea.dwysokinski.me/twhelp/core/internal/bundb/bundbtest"
|
|
"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()
|
|
|
|
if testing.Short() {
|
|
t.Skip("skipping long-running test")
|
|
}
|
|
|
|
db := bundbtest.NewDB(t)
|
|
fixture := loadFixtures(t, db)
|
|
repo := bundb.NewEnnoblement(db)
|
|
|
|
t.Run("OK", func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
server := fixture.Server(t, "it70")
|
|
playerSquirtle := fixture.Player(t, "it70-squirtle")
|
|
playerTomasKH96 := fixture.Player(t, "it70-tomaskh-96")
|
|
village1 := fixture.Village(t, "it70-village-1")
|
|
village2 := fixture.Village(t, "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 {
|
|
if cmp.Equal(p, 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,
|
|
}, 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()
|
|
|
|
ennoblement := fixture.Ennoblement(t, "pl169-village-2-1")
|
|
|
|
_, totalBeforeCreate, err := repo.ListCountWithRelations(context.Background(), domain.ListEnnoblementsParams{
|
|
ServerKeys: []string{ennoblement.ServerKey},
|
|
})
|
|
assert.NoError(t, err)
|
|
|
|
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.ListCountWithRelations(context.Background(), domain.ListEnnoblementsParams{
|
|
ServerKeys: []string{ennoblement.ServerKey},
|
|
})
|
|
assert.NoError(t, err)
|
|
|
|
assert.Equal(t, totalBeforeCreate, totalAfterCreate)
|
|
})
|
|
}
|
|
|
|
func TestEnnoblement_List(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
if testing.Short() {
|
|
t.Skip("skipping long-running test")
|
|
}
|
|
|
|
db := bundbtest.NewDB(t)
|
|
fixture := loadFixtures(t, db)
|
|
repo := bundb.NewEnnoblement(db)
|
|
ennoblements := fixture.Ennoblements(t)
|
|
|
|
type expectedEnnoblement struct {
|
|
id int64
|
|
serverKey string
|
|
}
|
|
|
|
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: "Sort=[{By=CreatedAt,Direction=ASC}]",
|
|
params: domain.ListEnnoblementsParams{
|
|
Sort: []domain.EnnoblementSort{
|
|
{By: domain.EnnoblementSortByCreatedAt, Direction: domain.SortDirectionASC},
|
|
},
|
|
},
|
|
expectedEnnoblements: allEnnoblements,
|
|
expectedCount: int64(len(allEnnoblements)),
|
|
},
|
|
{
|
|
name: "ServerKeys=[pl169],Sort=[{By=CreatedAt,Direction=ASC}]",
|
|
params: domain.ListEnnoblementsParams{
|
|
ServerKeys: []string{"pl169"},
|
|
Sort: []domain.EnnoblementSort{
|
|
{By: domain.EnnoblementSortByCreatedAt, Direction: domain.SortDirectionASC},
|
|
},
|
|
},
|
|
expectedEnnoblements: []expectedEnnoblement{
|
|
{
|
|
id: 10000,
|
|
serverKey: "pl169",
|
|
},
|
|
{
|
|
id: 10001,
|
|
serverKey: "pl169",
|
|
},
|
|
},
|
|
expectedCount: 2,
|
|
},
|
|
{
|
|
name: "ServerKeys=[pl169],Sort=[{By=CreatedAt,Direction=DESC}],Limit=1",
|
|
params: domain.ListEnnoblementsParams{
|
|
Pagination: domain.Pagination{
|
|
Limit: 1,
|
|
},
|
|
ServerKeys: []string{"pl169"},
|
|
Sort: []domain.EnnoblementSort{
|
|
{By: domain.EnnoblementSortByCreatedAt, Direction: domain.SortDirectionDESC},
|
|
},
|
|
},
|
|
expectedEnnoblements: []expectedEnnoblement{
|
|
{
|
|
id: 10001,
|
|
serverKey: "pl169",
|
|
},
|
|
},
|
|
expectedCount: 2,
|
|
},
|
|
{
|
|
name: "ServerKeys=[it70],Sort=[{By=CreatedAt,Direction=DESC}],Limit=1,Offset=1",
|
|
params: domain.ListEnnoblementsParams{
|
|
Pagination: domain.Pagination{
|
|
Limit: 1,
|
|
Offset: 1,
|
|
},
|
|
ServerKeys: []string{"it70"},
|
|
Sort: []domain.EnnoblementSort{
|
|
{By: domain.EnnoblementSortByCreatedAt, Direction: domain.SortDirectionDESC},
|
|
},
|
|
},
|
|
expectedEnnoblements: []expectedEnnoblement{
|
|
{
|
|
id: 20000,
|
|
serverKey: "it70",
|
|
},
|
|
},
|
|
expectedCount: 2,
|
|
},
|
|
{
|
|
name: "CreatedAtLTE=2021-12-31T23:59:59Z,CreatedAtGTE=2021-01-01T00:00:00Z",
|
|
params: domain.ListEnnoblementsParams{
|
|
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: 10000,
|
|
serverKey: "pl169",
|
|
},
|
|
{
|
|
id: 10001,
|
|
serverKey: "pl169",
|
|
},
|
|
},
|
|
expectedCount: 2,
|
|
},
|
|
{
|
|
name: "ServerKeys=[pl169],PlayerID=699513260,Sort=[{By=CreatedAt,Direction=ASC}]",
|
|
params: domain.ListEnnoblementsParams{
|
|
ServerKeys: []string{"pl169"},
|
|
PlayerID: 699513260,
|
|
Sort: []domain.EnnoblementSort{
|
|
{By: domain.EnnoblementSortByCreatedAt, Direction: domain.SortDirectionASC},
|
|
},
|
|
},
|
|
expectedEnnoblements: []expectedEnnoblement{
|
|
{
|
|
id: 10000,
|
|
serverKey: "pl169",
|
|
},
|
|
{
|
|
id: 10001,
|
|
serverKey: "pl169",
|
|
},
|
|
},
|
|
expectedCount: 2,
|
|
},
|
|
{
|
|
name: "ServerKeys=[it70],PlayerID=578014,Sort=[{By=CreatedAt,Direction=ASC}]",
|
|
params: domain.ListEnnoblementsParams{
|
|
ServerKeys: []string{"it70"},
|
|
PlayerID: 578014,
|
|
Sort: []domain.EnnoblementSort{
|
|
{By: domain.EnnoblementSortByCreatedAt, Direction: domain.SortDirectionASC},
|
|
},
|
|
},
|
|
expectedEnnoblements: []expectedEnnoblement{
|
|
{
|
|
id: 20001,
|
|
serverKey: "it70",
|
|
},
|
|
},
|
|
expectedCount: 1,
|
|
},
|
|
{
|
|
name: "ServerKeys=[it70],TribeID=31,Sort=[{By=CreatedAt,Direction=ASC}]",
|
|
params: domain.ListEnnoblementsParams{
|
|
ServerKeys: []string{"it70"},
|
|
TribeID: 31,
|
|
Sort: []domain.EnnoblementSort{
|
|
{By: domain.EnnoblementSortByCreatedAt, Direction: domain.SortDirectionASC},
|
|
},
|
|
},
|
|
expectedEnnoblements: []expectedEnnoblement{
|
|
{
|
|
id: 20000,
|
|
serverKey: "it70",
|
|
},
|
|
{
|
|
id: 20001,
|
|
serverKey: "it70",
|
|
},
|
|
},
|
|
expectedCount: 2,
|
|
},
|
|
{
|
|
name: "ServerKeys=[pl169],TribeID=28,Sort=[{By=CreatedAt,Direction=ASC}]",
|
|
params: domain.ListEnnoblementsParams{
|
|
ServerKeys: []string{"pl169"},
|
|
TribeID: 28,
|
|
Sort: []domain.EnnoblementSort{
|
|
{By: domain.EnnoblementSortByCreatedAt, Direction: domain.SortDirectionASC},
|
|
},
|
|
},
|
|
expectedEnnoblements: []expectedEnnoblement{
|
|
{
|
|
id: 10001,
|
|
serverKey: "pl169",
|
|
},
|
|
},
|
|
expectedCount: 1,
|
|
},
|
|
{
|
|
name: "VillageID=1112,Sort=[{By=CreatedAt,Direction=ASC}]",
|
|
params: domain.ListEnnoblementsParams{
|
|
VillageID: 1112,
|
|
Sort: []domain.EnnoblementSort{
|
|
{By: domain.EnnoblementSortByCreatedAt, Direction: domain.SortDirectionASC},
|
|
},
|
|
},
|
|
expectedEnnoblements: []expectedEnnoblement{
|
|
{
|
|
id: 10000,
|
|
serverKey: "pl169",
|
|
},
|
|
{
|
|
id: 10001,
|
|
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()
|
|
|
|
resListCountWithRelations, count, err := repo.ListCountWithRelations(context.Background(), tt.params)
|
|
assert.ErrorIs(t, err, tt.expectedErr)
|
|
assert.Equal(t, tt.expectedCount, count)
|
|
assert.Len(t, resListCountWithRelations, len(tt.expectedEnnoblements))
|
|
for _, expEnnoblement := range tt.expectedEnnoblements {
|
|
found := false
|
|
|
|
for _, ennoblement := range resListCountWithRelations {
|
|
if ennoblement.ID != expEnnoblement.id || ennoblement.ServerKey != expEnnoblement.serverKey {
|
|
continue
|
|
}
|
|
|
|
if ennoblement.VillageID == 0 {
|
|
continue
|
|
}
|
|
|
|
if ennoblement.NewOwnerID != 0 && (!ennoblement.NewOwner.Valid || ennoblement.NewOwner.Player.ID != ennoblement.NewOwnerID) {
|
|
continue
|
|
}
|
|
|
|
if ennoblement.NewOwnerID == 0 && ennoblement.NewOwner.Valid {
|
|
continue
|
|
}
|
|
|
|
if ennoblement.NewTribeID != 0 && (!ennoblement.NewTribe.Valid || ennoblement.NewTribe.Tribe.ID != ennoblement.NewTribeID) {
|
|
continue
|
|
}
|
|
|
|
if ennoblement.NewTribeID == 0 && ennoblement.NewTribe.Valid {
|
|
continue
|
|
}
|
|
|
|
if ennoblement.OldOwnerID != 0 && (!ennoblement.OldOwner.Valid || ennoblement.OldOwner.Player.ID != ennoblement.OldOwnerID) {
|
|
continue
|
|
}
|
|
|
|
if ennoblement.OldOwnerID == 0 && ennoblement.OldOwner.Valid {
|
|
continue
|
|
}
|
|
|
|
if ennoblement.OldTribeID != 0 && (!ennoblement.OldTribe.Valid || ennoblement.OldTribe.Tribe.ID != ennoblement.OldTribeID) {
|
|
continue
|
|
}
|
|
|
|
if ennoblement.OldTribeID == 0 && ennoblement.OldTribe.Valid {
|
|
continue
|
|
}
|
|
|
|
found = true
|
|
break
|
|
}
|
|
|
|
assert.True(t, found, "ennoblement (id=%d,serverkey=%s) not found", expEnnoblement.id, expEnnoblement.serverKey)
|
|
}
|
|
|
|
resList, err := repo.List(context.Background(), tt.params)
|
|
assert.ErrorIs(t, err, tt.expectedErr)
|
|
assert.Len(t, resList, len(resListCountWithRelations))
|
|
for i, ennoblement := range resList {
|
|
assert.Equal(t, resListCountWithRelations[i].Ennoblement, ennoblement)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestEnnoblement_Delete(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
if testing.Short() {
|
|
t.Skip("skipping long-running test")
|
|
}
|
|
|
|
db := bundbtest.NewDB(t)
|
|
fixture := loadFixtures(t, db)
|
|
repo := bundb.NewEnnoblement(db)
|
|
|
|
ennoblementsBeforeDelete, err := repo.List(context.Background(), domain.ListEnnoblementsParams{})
|
|
assert.NoError(t, err)
|
|
assert.Greater(t, len(ennoblementsBeforeDelete), 0)
|
|
|
|
assert.NoError(t, repo.Delete(context.Background(), fixture.Server(t, "pl169").Key, time.Date(2021, time.September, 30, 23, 0, 0, 0, time.UTC)))
|
|
|
|
ennoblementsAfterDelete, err := repo.List(context.Background(), domain.ListEnnoblementsParams{})
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, len(ennoblementsBeforeDelete)-1, len(ennoblementsAfterDelete))
|
|
}
|