Dawid Wysokiński
3b4f42e344
All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: twhelp/core#186
487 lines
12 KiB
Go
487 lines
12 KiB
Go
package bundb_test
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
|
|
"gitea.dwysokinski.me/twhelp/core/internal/bundb"
|
|
"gitea.dwysokinski.me/twhelp/core/internal/bundb/bundbtest"
|
|
"gitea.dwysokinski.me/twhelp/core/internal/domain"
|
|
"github.com/google/go-cmp/cmp"
|
|
"github.com/jackc/pgerrcode"
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/uptrace/bun/driver/pgdriver"
|
|
)
|
|
|
|
func TestTribeChange_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.NewTribeChange(db)
|
|
|
|
t.Run("OK", func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
playerGSus := fixture.Player(t, "de188-g-sus")
|
|
playerRIP := fixture.Player(t, "de188-rest-in-peace")
|
|
tribeClap := fixture.Tribe(t, "de188-clap")
|
|
|
|
params := []domain.CreateTribeChangeParams{
|
|
{
|
|
PlayerID: playerGSus.ID,
|
|
OldTribeID: 0,
|
|
NewTribeID: tribeClap.ID,
|
|
ServerKey: playerGSus.ServerKey,
|
|
},
|
|
{
|
|
PlayerID: playerGSus.ID,
|
|
OldTribeID: tribeClap.ID,
|
|
NewTribeID: 0,
|
|
ServerKey: playerGSus.ServerKey,
|
|
},
|
|
{
|
|
PlayerID: playerGSus.ID,
|
|
OldTribeID: tribeClap.ID,
|
|
NewTribeID: playerGSus.TribeID,
|
|
ServerKey: playerGSus.ServerKey,
|
|
},
|
|
{
|
|
PlayerID: playerRIP.ID,
|
|
OldTribeID: 0,
|
|
NewTribeID: playerRIP.TribeID,
|
|
ServerKey: playerRIP.ServerKey,
|
|
},
|
|
}
|
|
|
|
assert.NoError(t, repo.Create(context.Background(), params...))
|
|
|
|
tcs, err := repo.List(context.Background(), domain.ListTribeChangesParams{
|
|
ServerKeys: []string{playerGSus.ServerKey},
|
|
})
|
|
assert.NoError(t, err)
|
|
for _, p := range params {
|
|
var found bool
|
|
for _, tc := range tcs {
|
|
if cmp.Equal(p, domain.CreateTribeChangeParams{
|
|
PlayerID: tc.PlayerID,
|
|
NewTribeID: tc.NewTribeID,
|
|
OldTribeID: tc.OldTribeID,
|
|
ServerKey: tc.ServerKey,
|
|
}) {
|
|
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("ERR: server must exist", func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
serverKey := "random"
|
|
playerRiou89 := fixture.Player(t, "de188-riou89")
|
|
|
|
params := []domain.CreateTribeChangeParams{
|
|
{
|
|
PlayerID: playerRiou89.ID,
|
|
OldTribeID: 0,
|
|
NewTribeID: playerRiou89.TribeID,
|
|
ServerKey: serverKey,
|
|
},
|
|
}
|
|
|
|
err := repo.Create(context.Background(), params...)
|
|
var pgErr pgdriver.Error
|
|
assert.ErrorAs(t, err, &pgErr)
|
|
assert.Equal(t, pgerrcode.ForeignKeyViolation, pgErr.Field('C'))
|
|
assert.Equal(t, "tribe_changes_server_key_fkey", pgErr.Field('n'))
|
|
})
|
|
|
|
t.Run("ERR: player must exist", func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
playerRiou89 := fixture.Player(t, "de188-riou89")
|
|
|
|
params := []domain.CreateTribeChangeParams{
|
|
{
|
|
PlayerID: playerRiou89.ID + 1234441,
|
|
OldTribeID: 0,
|
|
NewTribeID: playerRiou89.TribeID,
|
|
ServerKey: playerRiou89.ServerKey,
|
|
},
|
|
}
|
|
|
|
err := repo.Create(context.Background(), params...)
|
|
var pgErr pgdriver.Error
|
|
assert.ErrorAs(t, err, &pgErr)
|
|
assert.Equal(t, pgerrcode.ForeignKeyViolation, pgErr.Field('C'))
|
|
assert.Equal(t, "tribe_changes_player_id_server_key_fkey", pgErr.Field('n'))
|
|
})
|
|
|
|
t.Run("ERR: only one tribe change with the same values can be created per hour", func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
playerRiou89 := fixture.Player(t, "de188-riou89")
|
|
|
|
params := []domain.CreateTribeChangeParams{
|
|
{
|
|
PlayerID: playerRiou89.ID,
|
|
OldTribeID: 0,
|
|
NewTribeID: playerRiou89.TribeID,
|
|
ServerKey: playerRiou89.ServerKey,
|
|
},
|
|
{
|
|
PlayerID: playerRiou89.ID,
|
|
OldTribeID: 0,
|
|
NewTribeID: playerRiou89.TribeID,
|
|
ServerKey: playerRiou89.ServerKey,
|
|
},
|
|
}
|
|
|
|
err := repo.Create(context.Background(), params...)
|
|
var pgErr pgdriver.Error
|
|
assert.ErrorAs(t, err, &pgErr)
|
|
assert.Equal(t, pgerrcode.UniqueViolation, pgErr.Field('C'))
|
|
assert.Equal(t, "tribe_changes_hash_key", pgErr.Field('n'))
|
|
})
|
|
}
|
|
|
|
func TestTribeChange_List_ListCountWithRelations(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
if testing.Short() {
|
|
t.Skip("skipping long-running test")
|
|
}
|
|
|
|
db := bundbtest.NewDB(t)
|
|
fixture := loadFixtures(t, db)
|
|
repo := bundb.NewTribeChange(db)
|
|
tcs := fixture.TribeChanges(t)
|
|
|
|
type expectedTribeChange struct {
|
|
id int64
|
|
serverKey string
|
|
}
|
|
|
|
allTCs := make([]expectedTribeChange, 0, len(tcs))
|
|
for _, tc := range tcs {
|
|
allTCs = append(allTCs, expectedTribeChange{
|
|
id: tc.ID,
|
|
serverKey: tc.ServerKey,
|
|
})
|
|
}
|
|
|
|
//nolint:prealloc
|
|
var tcsPL169 []expectedTribeChange
|
|
for _, tc := range tcs {
|
|
if tc.ServerKey != "pl169" {
|
|
continue
|
|
}
|
|
|
|
tcsPL169 = append(tcsPL169, expectedTribeChange{
|
|
id: tc.ID,
|
|
serverKey: tc.ServerKey,
|
|
})
|
|
}
|
|
|
|
tests := []struct {
|
|
name string
|
|
params domain.ListTribeChangesParams
|
|
expectedTribeChanges []expectedTribeChange
|
|
expectedCount int64
|
|
expectedErr error
|
|
}{
|
|
{
|
|
name: "Sort=[{By=CreatedAt,Direction=ASC},{By=ID,Direction=ASC}]",
|
|
params: domain.ListTribeChangesParams{
|
|
Sort: []domain.TribeChangeSort{
|
|
{
|
|
By: domain.TribeChangeSortByCreatedAt,
|
|
Direction: domain.SortDirectionASC,
|
|
},
|
|
{
|
|
By: domain.TribeChangeSortByID,
|
|
Direction: domain.SortDirectionASC,
|
|
},
|
|
},
|
|
},
|
|
expectedTribeChanges: allTCs,
|
|
expectedCount: int64(len(allTCs)),
|
|
},
|
|
{
|
|
name: "ServerKey=[pl169],Sort=[{By=CreatedAt,Direction=ASC},{By=ID,Direction=ASC}]",
|
|
params: domain.ListTribeChangesParams{
|
|
ServerKeys: []string{"pl169"},
|
|
Sort: []domain.TribeChangeSort{
|
|
{
|
|
By: domain.TribeChangeSortByCreatedAt,
|
|
Direction: domain.SortDirectionASC,
|
|
},
|
|
{
|
|
By: domain.TribeChangeSortByID,
|
|
Direction: domain.SortDirectionASC,
|
|
},
|
|
},
|
|
},
|
|
expectedTribeChanges: tcsPL169,
|
|
expectedCount: int64(len(tcsPL169)),
|
|
},
|
|
{
|
|
name: "ServerKey=[de188],Sort=[{By=CreatedAt,Direction=ASC},{By=ID,Direction=ASC}],Limit=2",
|
|
params: domain.ListTribeChangesParams{
|
|
ServerKeys: []string{"de188"},
|
|
Pagination: domain.Pagination{
|
|
Limit: 2,
|
|
},
|
|
Sort: []domain.TribeChangeSort{
|
|
{
|
|
By: domain.TribeChangeSortByCreatedAt,
|
|
Direction: domain.SortDirectionASC,
|
|
},
|
|
{
|
|
By: domain.TribeChangeSortByID,
|
|
Direction: domain.SortDirectionASC,
|
|
},
|
|
},
|
|
},
|
|
expectedTribeChanges: []expectedTribeChange{
|
|
{
|
|
id: 10000,
|
|
serverKey: "de188",
|
|
},
|
|
{
|
|
id: 10010,
|
|
serverKey: "de188",
|
|
},
|
|
},
|
|
expectedCount: 4,
|
|
},
|
|
{
|
|
name: "ServerKey=[de188],Sort=[{By=CreatedAt,Direction=ASC},{By=ID,Direction=ASC}],Offset=1",
|
|
params: domain.ListTribeChangesParams{
|
|
ServerKeys: []string{"de188"},
|
|
Pagination: domain.Pagination{
|
|
Offset: 1,
|
|
},
|
|
Sort: []domain.TribeChangeSort{
|
|
{
|
|
By: domain.TribeChangeSortByCreatedAt,
|
|
Direction: domain.SortDirectionASC,
|
|
},
|
|
{
|
|
By: domain.TribeChangeSortByID,
|
|
Direction: domain.SortDirectionASC,
|
|
},
|
|
},
|
|
},
|
|
expectedTribeChanges: []expectedTribeChange{
|
|
{
|
|
id: 10000,
|
|
serverKey: "de188",
|
|
},
|
|
{
|
|
id: 10001,
|
|
serverKey: "de188",
|
|
},
|
|
{
|
|
id: 10002,
|
|
serverKey: "de188",
|
|
},
|
|
},
|
|
expectedCount: 4,
|
|
},
|
|
{
|
|
name: "ServerKey=[de188],Sort=[{By=CreatedAt,Direction=DESC},{By=ID,Direction=ASC}],Offset=2,Limit=1",
|
|
params: domain.ListTribeChangesParams{
|
|
ServerKeys: []string{"de188"},
|
|
Pagination: domain.Pagination{
|
|
Limit: 1,
|
|
Offset: 2,
|
|
},
|
|
Sort: []domain.TribeChangeSort{
|
|
{
|
|
By: domain.TribeChangeSortByCreatedAt,
|
|
Direction: domain.SortDirectionDESC,
|
|
},
|
|
{
|
|
By: domain.TribeChangeSortByID,
|
|
Direction: domain.SortDirectionASC,
|
|
},
|
|
},
|
|
},
|
|
expectedTribeChanges: []expectedTribeChange{
|
|
{
|
|
id: 10000,
|
|
serverKey: "de188",
|
|
},
|
|
},
|
|
expectedCount: 4,
|
|
},
|
|
{
|
|
name: "ServerKey=[de188],PlayerIDs=[2572835],Sort=[{By=ID,Direction=DESC}],Limit=1",
|
|
params: domain.ListTribeChangesParams{
|
|
ServerKeys: []string{"de188"},
|
|
PlayerIDs: []int64{2572835},
|
|
Pagination: domain.Pagination{
|
|
Limit: 1,
|
|
},
|
|
Sort: []domain.TribeChangeSort{
|
|
{
|
|
By: domain.TribeChangeSortByID,
|
|
Direction: domain.SortDirectionDESC,
|
|
},
|
|
},
|
|
},
|
|
expectedTribeChanges: []expectedTribeChange{
|
|
{
|
|
id: 10010,
|
|
serverKey: "de188",
|
|
},
|
|
},
|
|
expectedCount: 1,
|
|
},
|
|
{
|
|
name: "ServerKey=[de188],TribeIDs=[772],Sort=[{By=ID,Direction=DESC}]",
|
|
params: domain.ListTribeChangesParams{
|
|
ServerKeys: []string{"de188"},
|
|
TribeIDs: []int64{772},
|
|
Sort: []domain.TribeChangeSort{
|
|
{
|
|
By: domain.TribeChangeSortByID,
|
|
Direction: domain.SortDirectionDESC,
|
|
},
|
|
},
|
|
},
|
|
expectedTribeChanges: []expectedTribeChange{
|
|
{
|
|
id: 10000,
|
|
serverKey: "de188",
|
|
},
|
|
{
|
|
id: 10001,
|
|
serverKey: "de188",
|
|
},
|
|
{
|
|
id: 10002,
|
|
serverKey: "de188",
|
|
},
|
|
{
|
|
id: 10010,
|
|
serverKey: "de188",
|
|
},
|
|
},
|
|
expectedCount: 4,
|
|
},
|
|
{
|
|
name: "ServerKey=[pl169],TribeIDs=[27],Sort=[{By=ID,Direction=DESC}]",
|
|
params: domain.ListTribeChangesParams{
|
|
ServerKeys: []string{"pl169"},
|
|
TribeIDs: []int64{27},
|
|
Sort: []domain.TribeChangeSort{
|
|
{
|
|
By: domain.TribeChangeSortByID,
|
|
Direction: domain.SortDirectionDESC,
|
|
},
|
|
},
|
|
},
|
|
expectedTribeChanges: []expectedTribeChange{
|
|
{
|
|
id: 10100,
|
|
serverKey: "pl169",
|
|
},
|
|
},
|
|
expectedCount: 1,
|
|
},
|
|
{
|
|
name: "ERR: unsupported sort by",
|
|
params: domain.ListTribeChangesParams{
|
|
Sort: []domain.TribeChangeSort{
|
|
{By: 100, Direction: domain.SortDirectionDESC},
|
|
},
|
|
},
|
|
expectedTribeChanges: nil,
|
|
expectedCount: 0,
|
|
expectedErr: domain.ErrUnsupportedSortBy,
|
|
},
|
|
{
|
|
name: "ERR: unsupported sort direction",
|
|
params: domain.ListTribeChangesParams{
|
|
Sort: []domain.TribeChangeSort{
|
|
{By: domain.TribeChangeSortByCreatedAt, Direction: 100},
|
|
},
|
|
},
|
|
expectedTribeChanges: 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.expectedTribeChanges))
|
|
for _, expTC := range tt.expectedTribeChanges {
|
|
found := false
|
|
for _, tc := range resListCountWithRelations {
|
|
if tc.ID != expTC.id {
|
|
continue
|
|
}
|
|
|
|
if tc.ServerKey != expTC.serverKey {
|
|
continue
|
|
}
|
|
|
|
if tc.Player.ID != tc.PlayerID {
|
|
continue
|
|
}
|
|
|
|
if tc.NewTribeID != 0 && (!tc.NewTribe.Valid || tc.NewTribe.Tribe.ID != tc.NewTribeID) {
|
|
continue
|
|
}
|
|
|
|
if tc.NewTribeID == 0 && tc.NewTribe.Valid {
|
|
continue
|
|
}
|
|
|
|
if tc.OldTribeID != 0 && (!tc.OldTribe.Valid || tc.OldTribe.Tribe.ID != tc.OldTribeID) {
|
|
continue
|
|
}
|
|
|
|
if tc.OldTribeID == 0 && tc.OldTribe.Valid {
|
|
continue
|
|
}
|
|
|
|
found = true
|
|
break
|
|
}
|
|
assert.True(t, found, "tribe change (id=%d,serverkey=%s) not found", expTC.id, expTC.serverKey)
|
|
}
|
|
|
|
resList, err := repo.List(context.Background(), tt.params)
|
|
assert.ErrorIs(t, err, tt.expectedErr)
|
|
assert.Len(t, resList, len(resListCountWithRelations))
|
|
for i, tc := range resList {
|
|
assert.Equal(t, resListCountWithRelations[i].TribeChange, tc)
|
|
}
|
|
})
|
|
}
|
|
}
|