2022-10-03 05:19:33 +00:00
|
|
|
package bundb_test
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
"testing"
|
|
|
|
"time"
|
|
|
|
|
|
|
|
"gitea.dwysokinski.me/twhelp/dcbot/internal/bundb"
|
|
|
|
"gitea.dwysokinski.me/twhelp/dcbot/internal/domain"
|
|
|
|
"github.com/google/uuid"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
)
|
|
|
|
|
|
|
|
func TestGroup_Create(t *testing.T) {
|
|
|
|
t.Parallel()
|
|
|
|
|
|
|
|
repo := bundb.NewGroup(newDB(t))
|
|
|
|
|
|
|
|
t.Run("OK", func(t *testing.T) {
|
|
|
|
t.Parallel()
|
|
|
|
|
2022-10-09 06:31:38 +00:00
|
|
|
params, err := domain.NewCreateGroupParams(
|
|
|
|
"592292203234328587",
|
|
|
|
"en",
|
|
|
|
"en113",
|
|
|
|
"1234",
|
|
|
|
"1235",
|
2022-10-28 11:59:20 +00:00
|
|
|
true,
|
|
|
|
true,
|
2022-10-09 06:31:38 +00:00
|
|
|
)
|
2022-10-03 05:19:33 +00:00
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
group, err := repo.Create(context.Background(), params)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
_, err = uuid.Parse(group.ID)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
assert.Equal(t, params.ServerID(), group.ServerID)
|
2022-10-09 06:31:38 +00:00
|
|
|
assert.Equal(t, params.ServerKey(), group.ServerKey)
|
|
|
|
assert.Equal(t, params.VersionCode(), group.VersionCode)
|
2022-10-11 05:05:35 +00:00
|
|
|
assert.Equal(t, params.ChannelGains(), group.ChannelGains)
|
|
|
|
assert.Equal(t, params.ChannelLosses(), group.ChannelLosses)
|
2022-10-28 11:59:20 +00:00
|
|
|
assert.Equal(t, params.Barbarians(), group.Barbarians)
|
|
|
|
assert.Equal(t, params.Internals(), group.Internals)
|
2022-10-03 05:19:33 +00:00
|
|
|
assert.WithinDuration(t, time.Now(), group.CreatedAt, 1*time.Second)
|
|
|
|
})
|
|
|
|
}
|
2022-10-09 08:19:31 +00:00
|
|
|
|
2022-10-12 04:45:16 +00:00
|
|
|
func TestGroup_Update(t *testing.T) {
|
2022-10-10 05:16:40 +00:00
|
|
|
t.Parallel()
|
|
|
|
|
|
|
|
db := newDB(t)
|
|
|
|
fixture := loadFixtures(t, db)
|
|
|
|
repo := bundb.NewGroup(db)
|
2022-12-25 11:00:43 +00:00
|
|
|
group := fixture.group(t, "group-1-server-1")
|
2022-10-10 05:16:40 +00:00
|
|
|
|
|
|
|
t.Run("OK", func(t *testing.T) {
|
|
|
|
t.Parallel()
|
|
|
|
|
|
|
|
params := domain.UpdateGroupParams{
|
2022-10-11 05:05:35 +00:00
|
|
|
ChannelGains: domain.NullString{
|
|
|
|
String: group.ChannelGains + "update",
|
2022-10-10 05:16:40 +00:00
|
|
|
Valid: true,
|
|
|
|
},
|
2022-10-11 05:05:35 +00:00
|
|
|
ChannelLosses: domain.NullString{
|
|
|
|
String: group.ChannelLosses + "update",
|
2022-10-10 05:16:40 +00:00
|
|
|
Valid: true,
|
|
|
|
},
|
2022-10-28 11:59:20 +00:00
|
|
|
Barbarians: domain.NullBool{
|
|
|
|
Bool: !group.Barbarians,
|
|
|
|
Valid: true,
|
|
|
|
},
|
|
|
|
Internals: domain.NullBool{
|
|
|
|
Bool: !group.Internals,
|
|
|
|
Valid: true,
|
|
|
|
},
|
2022-10-10 05:16:40 +00:00
|
|
|
}
|
|
|
|
|
2022-12-25 11:00:43 +00:00
|
|
|
updatedGroup, err := repo.Update(context.Background(), group.ID, group.ServerID, params)
|
2022-10-10 05:16:40 +00:00
|
|
|
assert.NoError(t, err)
|
2022-10-11 05:05:35 +00:00
|
|
|
assert.Equal(t, params.ChannelGains.String, updatedGroup.ChannelGains)
|
|
|
|
assert.Equal(t, params.ChannelLosses.String, updatedGroup.ChannelLosses)
|
2022-10-28 11:59:20 +00:00
|
|
|
assert.Equal(t, params.Barbarians.Bool, updatedGroup.Barbarians)
|
|
|
|
assert.Equal(t, params.Internals.Bool, updatedGroup.Internals)
|
2022-10-10 05:16:40 +00:00
|
|
|
})
|
|
|
|
|
|
|
|
t.Run("ERR: nothing to update", func(t *testing.T) {
|
|
|
|
t.Parallel()
|
|
|
|
|
2022-10-12 04:45:16 +00:00
|
|
|
updatedGroup, err := repo.Update(context.Background(), "", "", domain.UpdateGroupParams{})
|
2022-10-10 05:16:40 +00:00
|
|
|
assert.ErrorIs(t, err, domain.ErrNothingToUpdate)
|
|
|
|
assert.Zero(t, updatedGroup)
|
|
|
|
})
|
|
|
|
|
2022-10-23 06:20:48 +00:00
|
|
|
t.Run("ERR: group not found", func(t *testing.T) {
|
2022-10-10 05:16:40 +00:00
|
|
|
t.Parallel()
|
|
|
|
|
2022-10-23 06:20:48 +00:00
|
|
|
tests := []struct {
|
|
|
|
name string
|
|
|
|
id string
|
|
|
|
serverID string
|
|
|
|
}{
|
|
|
|
{
|
|
|
|
name: "ID - not UUID",
|
|
|
|
id: "test",
|
|
|
|
serverID: group.ServerID,
|
2022-10-10 05:16:40 +00:00
|
|
|
},
|
2022-10-23 06:20:48 +00:00
|
|
|
{
|
|
|
|
name: "ID - random UUID",
|
|
|
|
id: uuid.NewString(),
|
|
|
|
serverID: group.ServerID,
|
2022-10-10 05:16:40 +00:00
|
|
|
},
|
2022-10-23 06:20:48 +00:00
|
|
|
{
|
|
|
|
name: "ServerID - random UUID",
|
2022-12-25 11:00:43 +00:00
|
|
|
id: group.ID,
|
2022-10-23 06:20:48 +00:00
|
|
|
serverID: uuid.NewString(),
|
2022-10-12 04:45:16 +00:00
|
|
|
},
|
2022-10-23 06:20:48 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
for _, tt := range tests {
|
|
|
|
tt := tt
|
|
|
|
|
|
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
|
|
t.Parallel()
|
|
|
|
|
|
|
|
updatedGroup, err := repo.Update(context.Background(), tt.id, tt.serverID, domain.UpdateGroupParams{
|
|
|
|
ChannelGains: domain.NullString{
|
|
|
|
String: "update",
|
|
|
|
Valid: true,
|
|
|
|
},
|
|
|
|
})
|
|
|
|
assert.ErrorIs(t, err, domain.GroupNotFoundError{ID: tt.id})
|
|
|
|
assert.Zero(t, updatedGroup)
|
|
|
|
})
|
|
|
|
}
|
2022-10-12 04:45:16 +00:00
|
|
|
})
|
2022-10-10 05:16:40 +00:00
|
|
|
}
|
|
|
|
|
2022-10-09 08:19:31 +00:00
|
|
|
func TestGroup_List(t *testing.T) {
|
|
|
|
t.Parallel()
|
|
|
|
|
|
|
|
db := newDB(t)
|
|
|
|
fixture := loadFixtures(t, db)
|
|
|
|
repo := bundb.NewGroup(db)
|
2022-12-25 11:00:43 +00:00
|
|
|
groups := fixture.groups(t)
|
2022-10-09 08:19:31 +00:00
|
|
|
|
|
|
|
allGroups := make([]string, 0, len(groups))
|
|
|
|
for _, g := range groups {
|
2022-12-25 11:00:43 +00:00
|
|
|
allGroups = append(allGroups, g.ID)
|
2022-10-09 08:19:31 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
tests := []struct {
|
|
|
|
name string
|
|
|
|
params domain.ListGroupsParams
|
|
|
|
expectedGroups []string
|
|
|
|
}{
|
|
|
|
{
|
|
|
|
name: "no params",
|
|
|
|
params: domain.ListGroupsParams{},
|
|
|
|
expectedGroups: allGroups,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "ServerIDs=[server-1]",
|
|
|
|
params: domain.ListGroupsParams{
|
|
|
|
ServerIDs: []string{"server-1"},
|
|
|
|
},
|
|
|
|
expectedGroups: []string{
|
|
|
|
"d56ad37f-2637-48ea-98f8-79627f3fcc96",
|
|
|
|
"429b790e-7186-4106-b531-4cc4931ce2ba",
|
|
|
|
},
|
|
|
|
},
|
2022-10-29 05:24:52 +00:00
|
|
|
{
|
|
|
|
name: "ServerIDs=[server-1],EnabledNotifications=true",
|
|
|
|
params: domain.ListGroupsParams{
|
|
|
|
ServerIDs: []string{"server-1"},
|
|
|
|
EnabledNotifications: domain.NullBool{
|
|
|
|
Bool: true,
|
|
|
|
Valid: true,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
expectedGroups: []string{
|
|
|
|
"d56ad37f-2637-48ea-98f8-79627f3fcc96",
|
|
|
|
"429b790e-7186-4106-b531-4cc4931ce2ba",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "ServerIDs=[server-2],EnabledNotifications=true",
|
|
|
|
params: domain.ListGroupsParams{
|
|
|
|
ServerIDs: []string{"server-2"},
|
|
|
|
EnabledNotifications: domain.NullBool{
|
|
|
|
Bool: true,
|
|
|
|
Valid: true,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
expectedGroups: []string{
|
|
|
|
"0be82203-4ca3-4b4c-a0c8-3a70099d88f7",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "ServerIDs=[server-2],EnabledNotifications=false",
|
|
|
|
params: domain.ListGroupsParams{
|
|
|
|
ServerIDs: []string{"server-2"},
|
|
|
|
EnabledNotifications: domain.NullBool{
|
|
|
|
Bool: false,
|
|
|
|
Valid: true,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
expectedGroups: []string{
|
|
|
|
"abeb6c8e-70b6-445c-989f-890cd2a1f87a",
|
|
|
|
},
|
|
|
|
},
|
2022-10-31 05:52:20 +00:00
|
|
|
{
|
|
|
|
name: "VersionCode=pl",
|
|
|
|
params: domain.ListGroupsParams{
|
|
|
|
VersionCode: domain.NullString{
|
|
|
|
String: "pl",
|
|
|
|
Valid: true,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
expectedGroups: []string{
|
|
|
|
"d56ad37f-2637-48ea-98f8-79627f3fcc96",
|
|
|
|
"429b790e-7186-4106-b531-4cc4931ce2ba",
|
|
|
|
"abeb6c8e-70b6-445c-989f-890cd2a1f87a",
|
|
|
|
"0be82203-4ca3-4b4c-a0c8-3a70099d88f7",
|
|
|
|
"982a9765-471c-43e8-9abb-1e4ee4f03738",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "VersionCode=pl,ServerKeys=[pl180]",
|
|
|
|
params: domain.ListGroupsParams{
|
|
|
|
VersionCode: domain.NullString{
|
|
|
|
String: "pl",
|
|
|
|
Valid: true,
|
|
|
|
},
|
|
|
|
ServerKeys: []string{"pl180"},
|
|
|
|
},
|
|
|
|
expectedGroups: []string{
|
|
|
|
"982a9765-471c-43e8-9abb-1e4ee4f03738",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "CreatedAtLTE=2022-03-15T15:00:10.000Z",
|
|
|
|
params: domain.ListGroupsParams{
|
|
|
|
CreatedAtLTE: time.Date(2022, time.March, 15, 15, 00, 10, 0, time.UTC),
|
|
|
|
},
|
|
|
|
expectedGroups: []string{
|
|
|
|
"d56ad37f-2637-48ea-98f8-79627f3fcc96",
|
|
|
|
},
|
|
|
|
},
|
2022-10-09 08:19:31 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
for _, tt := range tests {
|
|
|
|
tt := tt
|
|
|
|
|
|
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
|
|
t.Parallel()
|
|
|
|
|
|
|
|
res, err := repo.List(context.Background(), tt.params)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
assert.Len(t, res, len(tt.expectedGroups))
|
|
|
|
for _, id := range tt.expectedGroups {
|
|
|
|
found := false
|
|
|
|
for _, grp := range res {
|
|
|
|
if grp.ID == id {
|
|
|
|
found = true
|
|
|
|
break
|
|
|
|
}
|
|
|
|
}
|
|
|
|
assert.True(t, found, "group (id=%s) not found", id)
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-10-23 06:20:48 +00:00
|
|
|
func TestGroup_Get(t *testing.T) {
|
|
|
|
t.Parallel()
|
|
|
|
|
|
|
|
db := newDB(t)
|
|
|
|
fixture := loadFixtures(t, db)
|
|
|
|
repo := bundb.NewGroup(db)
|
2022-12-25 11:00:43 +00:00
|
|
|
group := fixture.group(t, "group-1-server-1")
|
2022-10-23 06:20:48 +00:00
|
|
|
|
|
|
|
t.Run("OK", func(t *testing.T) {
|
|
|
|
t.Parallel()
|
|
|
|
|
2022-12-25 11:00:43 +00:00
|
|
|
g, err := repo.Get(context.Background(), group.ID, group.ServerID)
|
2022-10-23 07:44:20 +00:00
|
|
|
assert.NoError(t, err)
|
2022-12-25 11:00:43 +00:00
|
|
|
assert.Equal(t, group, g)
|
2022-10-23 06:20:48 +00:00
|
|
|
})
|
|
|
|
|
|
|
|
t.Run("ERR: group not found (unknown ID)", func(t *testing.T) {
|
|
|
|
t.Parallel()
|
|
|
|
|
|
|
|
tests := []struct {
|
|
|
|
name string
|
|
|
|
id string
|
|
|
|
serverID string
|
|
|
|
}{
|
|
|
|
{
|
|
|
|
name: "ID - not UUID",
|
|
|
|
id: "test",
|
|
|
|
serverID: group.ServerID,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "ID - random UUID",
|
|
|
|
id: uuid.NewString(),
|
|
|
|
serverID: group.ServerID,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "ServerID - random UUID",
|
2022-12-25 11:00:43 +00:00
|
|
|
id: group.ID,
|
2022-10-23 06:20:48 +00:00
|
|
|
serverID: uuid.NewString(),
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
for _, tt := range tests {
|
|
|
|
tt := tt
|
|
|
|
|
|
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
|
|
t.Parallel()
|
|
|
|
|
|
|
|
g, err := repo.Get(context.Background(), tt.id, tt.serverID)
|
|
|
|
assert.ErrorIs(t, err, domain.GroupNotFoundError{ID: tt.id})
|
|
|
|
assert.Zero(t, g)
|
|
|
|
})
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
2022-10-12 05:19:07 +00:00
|
|
|
func TestGroup_Delete(t *testing.T) {
|
|
|
|
t.Parallel()
|
|
|
|
|
|
|
|
db := newDB(t)
|
|
|
|
fixture := loadFixtures(t, db)
|
2022-10-23 07:44:20 +00:00
|
|
|
groupRepo := bundb.NewGroup(db)
|
|
|
|
monitorRepo := bundb.NewMonitor(db)
|
2022-12-25 11:00:43 +00:00
|
|
|
group := fixture.group(t, "group-1-server-1")
|
2022-10-12 05:19:07 +00:00
|
|
|
|
|
|
|
t.Run("OK", func(t *testing.T) {
|
|
|
|
t.Parallel()
|
|
|
|
|
2022-10-23 07:44:20 +00:00
|
|
|
beforeDelete, err := groupRepo.List(context.Background(), domain.ListGroupsParams{
|
|
|
|
ServerIDs: []string{group.ServerID},
|
|
|
|
})
|
|
|
|
assert.NoError(t, err)
|
2022-10-12 05:19:07 +00:00
|
|
|
|
2022-12-25 11:00:43 +00:00
|
|
|
assert.NoError(t, groupRepo.Delete(context.Background(), group.ID, group.ServerID))
|
2022-10-23 07:44:20 +00:00
|
|
|
|
|
|
|
afterDelete, err := groupRepo.List(context.Background(), domain.ListGroupsParams{
|
|
|
|
ServerIDs: []string{group.ServerID},
|
2022-10-12 05:19:07 +00:00
|
|
|
})
|
|
|
|
assert.NoError(t, err)
|
2022-10-23 07:44:20 +00:00
|
|
|
assert.Len(t, afterDelete, len(beforeDelete)-1)
|
|
|
|
|
|
|
|
// monitors should also be deleted
|
2022-12-25 11:00:43 +00:00
|
|
|
monitors, err := monitorRepo.List(context.Background(), group.ID)
|
2022-10-23 07:44:20 +00:00
|
|
|
assert.NoError(t, err)
|
|
|
|
assert.Len(t, monitors, 0)
|
2022-10-12 05:19:07 +00:00
|
|
|
})
|
|
|
|
|
2022-10-23 06:20:48 +00:00
|
|
|
t.Run("ERR: group not found", func(t *testing.T) {
|
2022-10-12 05:19:07 +00:00
|
|
|
t.Parallel()
|
|
|
|
|
2022-10-23 06:20:48 +00:00
|
|
|
tests := []struct {
|
|
|
|
name string
|
|
|
|
id string
|
|
|
|
serverID string
|
|
|
|
}{
|
|
|
|
{
|
|
|
|
name: "ID - not UUID",
|
|
|
|
id: "test",
|
|
|
|
serverID: group.ServerID,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "ID - random UUID",
|
|
|
|
id: uuid.NewString(),
|
|
|
|
serverID: group.ServerID,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "ServerID - random UUID",
|
2022-12-25 11:00:43 +00:00
|
|
|
id: group.ID,
|
2022-10-23 06:20:48 +00:00
|
|
|
serverID: uuid.NewString(),
|
|
|
|
},
|
|
|
|
}
|
2022-10-12 05:19:07 +00:00
|
|
|
|
2022-10-23 06:20:48 +00:00
|
|
|
for _, tt := range tests {
|
|
|
|
tt := tt
|
2022-10-12 05:19:07 +00:00
|
|
|
|
2022-10-23 06:20:48 +00:00
|
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
|
|
t.Parallel()
|
2022-10-12 05:19:07 +00:00
|
|
|
|
2022-10-23 06:20:48 +00:00
|
|
|
assert.ErrorIs(
|
|
|
|
t,
|
2022-10-23 07:44:20 +00:00
|
|
|
groupRepo.Delete(context.Background(), tt.id, tt.serverID),
|
2022-10-23 06:20:48 +00:00
|
|
|
domain.GroupNotFoundError{ID: tt.id},
|
|
|
|
)
|
|
|
|
})
|
|
|
|
}
|
2022-10-12 05:19:07 +00:00
|
|
|
})
|
|
|
|
}
|
|
|
|
|
2022-10-31 05:52:20 +00:00
|
|
|
func TestGroup_DeleteMany(t *testing.T) {
|
|
|
|
t.Parallel()
|
|
|
|
|
|
|
|
db := newDB(t)
|
|
|
|
fixture := loadFixtures(t, db)
|
|
|
|
groupRepo := bundb.NewGroup(db)
|
|
|
|
monitorRepo := bundb.NewMonitor(db)
|
2022-12-25 11:00:43 +00:00
|
|
|
group1 := fixture.group(t, "group-1-server-1")
|
|
|
|
group2 := fixture.group(t, "group-2-server-1")
|
|
|
|
ids := []string{group1.ID, group2.ID}
|
2022-10-31 05:52:20 +00:00
|
|
|
serverIDs := []string{group1.ServerID}
|
|
|
|
|
|
|
|
t.Run("OK", func(t *testing.T) {
|
|
|
|
t.Parallel()
|
|
|
|
|
|
|
|
beforeDelete, err := groupRepo.List(context.Background(), domain.ListGroupsParams{
|
|
|
|
ServerIDs: serverIDs,
|
|
|
|
})
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
|
|
|
assert.NoError(t, groupRepo.DeleteMany(context.Background(), ids...))
|
|
|
|
|
|
|
|
afterDelete, err := groupRepo.List(context.Background(), domain.ListGroupsParams{
|
|
|
|
ServerIDs: serverIDs,
|
|
|
|
})
|
|
|
|
assert.NoError(t, err)
|
|
|
|
assert.Len(t, afterDelete, len(beforeDelete)-len(ids))
|
|
|
|
|
|
|
|
// monitors should also be deleted
|
|
|
|
for _, id := range ids {
|
|
|
|
monitors, err := monitorRepo.List(context.Background(), id)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
assert.Len(t, monitors, 0)
|
|
|
|
}
|
|
|
|
})
|
|
|
|
|
|
|
|
t.Run("OK: 0 ids", func(t *testing.T) {
|
|
|
|
t.Parallel()
|
|
|
|
assert.NoError(t, groupRepo.DeleteMany(context.Background()))
|
|
|
|
})
|
|
|
|
}
|