2022-10-23 06:20:48 +00:00
|
|
|
package service_test
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
2022-10-27 09:56:40 +00:00
|
|
|
"errors"
|
2022-10-23 06:20:48 +00:00
|
|
|
"testing"
|
|
|
|
"time"
|
|
|
|
|
|
|
|
"gitea.dwysokinski.me/twhelp/dcbot/internal/domain"
|
|
|
|
"gitea.dwysokinski.me/twhelp/dcbot/internal/service"
|
|
|
|
"gitea.dwysokinski.me/twhelp/dcbot/internal/service/internal/mock"
|
|
|
|
"gitea.dwysokinski.me/twhelp/dcbot/internal/twhelp"
|
|
|
|
"github.com/google/uuid"
|
|
|
|
"github.com/stretchr/testify/assert"
|
2022-10-29 10:44:11 +00:00
|
|
|
"go.uber.org/zap"
|
2022-10-23 06:20:48 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
func TestMonitor_Create(t *testing.T) {
|
|
|
|
t.Parallel()
|
|
|
|
|
|
|
|
t.Run("OK", func(t *testing.T) {
|
|
|
|
t.Parallel()
|
|
|
|
|
|
|
|
repo := &mock.FakeMonitorRepository{}
|
|
|
|
repo.ListReturns(nil, nil)
|
|
|
|
repo.CreateCalls(func(ctx context.Context, params domain.CreateMonitorParams) (domain.Monitor, error) {
|
|
|
|
return domain.Monitor{
|
|
|
|
ID: uuid.NewString(),
|
|
|
|
TribeID: params.TribeID(),
|
|
|
|
GroupID: params.GroupID(),
|
|
|
|
CreatedAt: time.Now(),
|
|
|
|
}, nil
|
|
|
|
})
|
|
|
|
|
2022-10-27 09:56:40 +00:00
|
|
|
groupSvc := &mock.FakeGroupReader{}
|
2022-10-23 06:20:48 +00:00
|
|
|
groupSvc.GetCalls(func(ctx context.Context, groupID, serverID string) (domain.Group, error) {
|
|
|
|
return domain.Group{
|
|
|
|
ID: groupID,
|
|
|
|
ServerID: serverID,
|
|
|
|
ChannelGains: "",
|
|
|
|
ChannelLosses: "",
|
|
|
|
ServerKey: "pl151",
|
|
|
|
VersionCode: "pl",
|
|
|
|
CreatedAt: time.Now(),
|
|
|
|
}, nil
|
|
|
|
})
|
|
|
|
|
|
|
|
client := &mock.FakeTWHelpClient{}
|
|
|
|
tribe := twhelp.Tribe{
|
|
|
|
ID: 150,
|
|
|
|
Tag: "*TAG*",
|
|
|
|
Name: uuid.NewString(),
|
|
|
|
ProfileURL: "https://pl151.plemiona.pl/game.php?screen=info_player&id=150",
|
|
|
|
DeletedAt: time.Time{},
|
|
|
|
}
|
2022-11-10 11:13:16 +00:00
|
|
|
client.ListTribesReturns([]twhelp.Tribe{tribe}, nil)
|
2022-10-23 06:20:48 +00:00
|
|
|
|
|
|
|
groupID := uuid.NewString()
|
|
|
|
|
2022-10-29 10:44:11 +00:00
|
|
|
monitor, err := service.NewMonitor(repo, groupSvc, client, zap.NewNop(), 10).
|
2022-10-23 06:20:48 +00:00
|
|
|
Create(context.Background(), groupID, uuid.NewString(), tribe.Tag)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
assert.NotEmpty(t, monitor.ID)
|
|
|
|
assert.Equal(t, groupID, monitor.GroupID)
|
|
|
|
assert.Equal(t, tribe.ID, monitor.TribeID)
|
|
|
|
assert.NotEmpty(t, monitor.CreatedAt)
|
|
|
|
})
|
|
|
|
|
|
|
|
t.Run("ERR: group doesn't exist", func(t *testing.T) {
|
|
|
|
t.Parallel()
|
|
|
|
|
|
|
|
groupID := uuid.NewString()
|
2022-10-27 09:56:40 +00:00
|
|
|
groupSvc := &mock.FakeGroupReader{}
|
2022-10-23 06:20:48 +00:00
|
|
|
groupSvc.GetReturns(domain.Group{}, domain.GroupNotFoundError{ID: groupID})
|
|
|
|
|
2022-10-29 10:44:11 +00:00
|
|
|
monitor, err := service.NewMonitor(nil, groupSvc, nil, zap.NewNop(), 10).
|
2022-10-23 06:20:48 +00:00
|
|
|
Create(context.Background(), groupID, uuid.NewString(), "tag")
|
|
|
|
assert.ErrorIs(t, err, domain.GroupDoesNotExistError{
|
|
|
|
ID: groupID,
|
|
|
|
})
|
|
|
|
assert.Zero(t, monitor)
|
|
|
|
})
|
|
|
|
|
|
|
|
t.Run("ERR: monitor limit has been reached", func(t *testing.T) {
|
|
|
|
t.Parallel()
|
|
|
|
|
|
|
|
const maxMonitorsPerGroup = 10
|
|
|
|
|
|
|
|
repo := &mock.FakeMonitorRepository{}
|
|
|
|
repo.ListReturns(make([]domain.Monitor, maxMonitorsPerGroup), nil)
|
|
|
|
|
2022-10-27 09:56:40 +00:00
|
|
|
groupSvc := &mock.FakeGroupReader{}
|
2022-10-23 06:20:48 +00:00
|
|
|
groupSvc.GetCalls(func(ctx context.Context, groupID, serverID string) (domain.Group, error) {
|
|
|
|
return domain.Group{
|
|
|
|
ID: groupID,
|
|
|
|
ServerID: serverID,
|
|
|
|
ChannelGains: "",
|
|
|
|
ChannelLosses: "",
|
|
|
|
ServerKey: "pl151",
|
|
|
|
VersionCode: "pl",
|
|
|
|
CreatedAt: time.Now(),
|
|
|
|
}, nil
|
|
|
|
})
|
|
|
|
|
2022-10-29 10:44:11 +00:00
|
|
|
monitor, err := service.NewMonitor(repo, groupSvc, nil, zap.NewNop(), maxMonitorsPerGroup).
|
2022-10-23 06:20:48 +00:00
|
|
|
Create(context.Background(), uuid.NewString(), uuid.NewString(), "TAG")
|
|
|
|
assert.ErrorIs(t, err, domain.MonitorLimitReachedError{
|
|
|
|
Current: maxMonitorsPerGroup,
|
|
|
|
Limit: maxMonitorsPerGroup,
|
|
|
|
})
|
|
|
|
assert.Zero(t, monitor)
|
|
|
|
})
|
|
|
|
|
|
|
|
t.Run("ERR: tribe doesn't exist", func(t *testing.T) {
|
|
|
|
t.Parallel()
|
|
|
|
|
2022-11-10 11:13:16 +00:00
|
|
|
tests := []struct {
|
|
|
|
name string
|
|
|
|
err error
|
|
|
|
}{
|
|
|
|
{
|
|
|
|
name: "err=null",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "err!=null",
|
|
|
|
err: twhelp.APIError{
|
|
|
|
Code: twhelp.ErrorCodeInternalServerError,
|
|
|
|
Message: "internal server error",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}
|
2022-10-23 06:20:48 +00:00
|
|
|
|
2022-11-10 11:13:16 +00:00
|
|
|
for _, tt := range tests {
|
|
|
|
tt := tt
|
|
|
|
|
|
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
|
|
t.Parallel()
|
|
|
|
|
|
|
|
repo := &mock.FakeMonitorRepository{}
|
|
|
|
repo.ListReturns(nil, nil)
|
|
|
|
repo.CreateCalls(func(ctx context.Context, params domain.CreateMonitorParams) (domain.Monitor, error) {
|
|
|
|
return domain.Monitor{
|
|
|
|
ID: uuid.NewString(),
|
|
|
|
TribeID: params.TribeID(),
|
|
|
|
GroupID: params.GroupID(),
|
|
|
|
CreatedAt: time.Now(),
|
|
|
|
}, nil
|
|
|
|
})
|
|
|
|
|
|
|
|
groupSvc := &mock.FakeGroupReader{}
|
|
|
|
groupSvc.GetCalls(func(ctx context.Context, groupID, serverID string) (domain.Group, error) {
|
|
|
|
return domain.Group{
|
|
|
|
ID: groupID,
|
|
|
|
ServerID: serverID,
|
|
|
|
ChannelGains: "",
|
|
|
|
ChannelLosses: "",
|
|
|
|
ServerKey: "pl151",
|
|
|
|
VersionCode: "pl",
|
|
|
|
CreatedAt: time.Now(),
|
|
|
|
}, nil
|
|
|
|
})
|
|
|
|
|
|
|
|
client := &mock.FakeTWHelpClient{}
|
|
|
|
client.ListTribesReturns(nil, tt.err)
|
|
|
|
|
|
|
|
tag := "TAG"
|
|
|
|
|
|
|
|
monitor, err := service.NewMonitor(repo, groupSvc, client, zap.NewNop(), 10).
|
|
|
|
Create(context.Background(), uuid.NewString(), uuid.NewString(), tag)
|
|
|
|
assert.ErrorIs(t, err, domain.TribeDoesNotExistError{
|
|
|
|
Tag: tag,
|
|
|
|
})
|
|
|
|
assert.Zero(t, monitor)
|
2022-10-23 06:20:48 +00:00
|
|
|
})
|
2022-11-10 11:13:16 +00:00
|
|
|
}
|
2022-10-23 06:20:48 +00:00
|
|
|
})
|
|
|
|
}
|
2022-10-27 09:56:40 +00:00
|
|
|
|
2022-10-27 13:18:58 +00:00
|
|
|
func TestMonitor_List(t *testing.T) {
|
|
|
|
t.Parallel()
|
|
|
|
|
|
|
|
t.Run("OK", func(t *testing.T) {
|
|
|
|
t.Parallel()
|
|
|
|
|
|
|
|
groupID := uuid.NewString()
|
|
|
|
groupSvc := &mock.FakeGroupReader{}
|
|
|
|
groupSvc.GetCalls(func(ctx context.Context, groupID, serverID string) (domain.Group, error) {
|
|
|
|
return domain.Group{
|
|
|
|
ID: groupID,
|
|
|
|
ServerID: serverID,
|
|
|
|
ChannelGains: "",
|
|
|
|
ChannelLosses: "",
|
|
|
|
ServerKey: "pl151",
|
|
|
|
VersionCode: "pl",
|
|
|
|
CreatedAt: time.Now(),
|
|
|
|
}, nil
|
|
|
|
})
|
|
|
|
|
|
|
|
repo := &mock.FakeMonitorRepository{}
|
|
|
|
monitors := []domain.Monitor{
|
|
|
|
{
|
|
|
|
ID: uuid.NewString(),
|
|
|
|
TribeID: 124,
|
|
|
|
GroupID: groupID,
|
|
|
|
CreatedAt: time.Now(),
|
|
|
|
},
|
|
|
|
{
|
|
|
|
ID: uuid.NewString(),
|
|
|
|
TribeID: 125,
|
|
|
|
GroupID: groupID,
|
|
|
|
CreatedAt: time.Now(),
|
|
|
|
},
|
|
|
|
}
|
|
|
|
repo.ListReturns(monitors, nil)
|
|
|
|
|
|
|
|
client := &mock.FakeTWHelpClient{}
|
|
|
|
client.GetTribeByIDCalls(func(ctx context.Context, _ string, _ string, id int64) (twhelp.Tribe, error) {
|
|
|
|
return twhelp.Tribe{
|
|
|
|
ID: id,
|
|
|
|
Tag: uuid.NewString(),
|
|
|
|
Name: uuid.NewString(),
|
|
|
|
ProfileURL: uuid.NewString(),
|
|
|
|
DeletedAt: time.Time{},
|
|
|
|
}, nil
|
|
|
|
})
|
|
|
|
|
2022-10-29 10:44:11 +00:00
|
|
|
res, err := service.NewMonitor(repo, groupSvc, client, zap.NewNop(), 10).
|
2022-10-27 13:18:58 +00:00
|
|
|
List(context.Background(), groupID, uuid.NewString())
|
|
|
|
assert.NoError(t, err)
|
|
|
|
assert.Len(t, res, len(monitors))
|
2022-10-29 09:47:28 +00:00
|
|
|
for i, m := range monitors {
|
|
|
|
assert.Equal(t, m, res[i].Monitor)
|
|
|
|
assert.Equal(t, m.TribeID, res[i].Tribe.ID)
|
2022-10-27 13:18:58 +00:00
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
2022-10-27 09:56:40 +00:00
|
|
|
func TestMonitor_Execute(t *testing.T) {
|
|
|
|
t.Parallel()
|
|
|
|
|
|
|
|
t.Run("OK", func(t *testing.T) {
|
|
|
|
t.Parallel()
|
|
|
|
|
|
|
|
client := &mock.FakeTWHelpClient{}
|
|
|
|
villages := map[string][]twhelp.VillageMeta{
|
|
|
|
"pl:pl181": {
|
|
|
|
{
|
|
|
|
ID: 1,
|
|
|
|
FullName: uuid.NewString(),
|
|
|
|
ProfileURL: uuid.NewString(),
|
|
|
|
},
|
|
|
|
{
|
|
|
|
ID: 2,
|
|
|
|
FullName: uuid.NewString(),
|
|
|
|
ProfileURL: uuid.NewString(),
|
|
|
|
},
|
|
|
|
{
|
|
|
|
ID: 3,
|
|
|
|
FullName: uuid.NewString(),
|
|
|
|
ProfileURL: uuid.NewString(),
|
|
|
|
},
|
|
|
|
{
|
|
|
|
ID: 4,
|
|
|
|
FullName: uuid.NewString(),
|
|
|
|
ProfileURL: uuid.NewString(),
|
|
|
|
},
|
|
|
|
},
|
|
|
|
"en:en130": {
|
|
|
|
{
|
|
|
|
ID: 100,
|
|
|
|
FullName: uuid.NewString(),
|
|
|
|
ProfileURL: uuid.NewString(),
|
|
|
|
},
|
|
|
|
{
|
|
|
|
ID: 101,
|
|
|
|
FullName: uuid.NewString(),
|
|
|
|
ProfileURL: uuid.NewString(),
|
|
|
|
},
|
|
|
|
},
|
|
|
|
"pl:pl180": {
|
|
|
|
{
|
|
|
|
ID: 200,
|
|
|
|
FullName: uuid.NewString(),
|
|
|
|
ProfileURL: uuid.NewString(),
|
|
|
|
},
|
|
|
|
},
|
2022-10-28 11:59:20 +00:00
|
|
|
"de:de200": {
|
|
|
|
{
|
|
|
|
ID: 300,
|
|
|
|
FullName: uuid.NewString(),
|
|
|
|
ProfileURL: uuid.NewString(),
|
|
|
|
},
|
|
|
|
{
|
|
|
|
ID: 301,
|
|
|
|
FullName: uuid.NewString(),
|
|
|
|
ProfileURL: uuid.NewString(),
|
|
|
|
},
|
|
|
|
{
|
|
|
|
ID: 302,
|
|
|
|
FullName: uuid.NewString(),
|
|
|
|
ProfileURL: uuid.NewString(),
|
|
|
|
},
|
|
|
|
},
|
2022-10-27 09:56:40 +00:00
|
|
|
}
|
|
|
|
tribes := map[string][]twhelp.TribeMeta{
|
|
|
|
"pl:pl181": {
|
|
|
|
{
|
|
|
|
ID: 1,
|
|
|
|
Name: uuid.NewString(),
|
|
|
|
Tag: uuid.NewString(),
|
|
|
|
ProfileURL: uuid.NewString(),
|
|
|
|
},
|
|
|
|
{
|
|
|
|
ID: 2,
|
|
|
|
Name: uuid.NewString(),
|
|
|
|
Tag: uuid.NewString(),
|
|
|
|
ProfileURL: uuid.NewString(),
|
|
|
|
},
|
|
|
|
{
|
|
|
|
ID: 3,
|
|
|
|
Name: uuid.NewString(),
|
|
|
|
Tag: uuid.NewString(),
|
|
|
|
ProfileURL: uuid.NewString(),
|
|
|
|
},
|
|
|
|
},
|
|
|
|
"en:en130": {
|
|
|
|
{
|
|
|
|
ID: 100,
|
|
|
|
Name: uuid.NewString(),
|
|
|
|
Tag: uuid.NewString(),
|
|
|
|
ProfileURL: uuid.NewString(),
|
|
|
|
},
|
|
|
|
{
|
|
|
|
ID: 101,
|
|
|
|
Name: uuid.NewString(),
|
|
|
|
Tag: uuid.NewString(),
|
|
|
|
ProfileURL: uuid.NewString(),
|
|
|
|
},
|
|
|
|
},
|
|
|
|
"pl:pl180": {
|
|
|
|
{
|
|
|
|
ID: 200,
|
|
|
|
Name: uuid.NewString(),
|
|
|
|
Tag: uuid.NewString(),
|
|
|
|
ProfileURL: uuid.NewString(),
|
|
|
|
},
|
|
|
|
},
|
2022-10-28 11:59:20 +00:00
|
|
|
"de:de200": {
|
|
|
|
{
|
|
|
|
ID: 300,
|
|
|
|
Name: uuid.NewString(),
|
|
|
|
Tag: uuid.NewString(),
|
|
|
|
ProfileURL: uuid.NewString(),
|
|
|
|
},
|
|
|
|
{
|
|
|
|
ID: 301,
|
|
|
|
Name: uuid.NewString(),
|
|
|
|
Tag: uuid.NewString(),
|
|
|
|
ProfileURL: uuid.NewString(),
|
|
|
|
},
|
|
|
|
},
|
2022-10-27 09:56:40 +00:00
|
|
|
}
|
|
|
|
players := map[string][]twhelp.PlayerMeta{
|
|
|
|
"pl:pl181": {
|
|
|
|
{
|
|
|
|
ID: 1,
|
|
|
|
Name: uuid.NewString(),
|
|
|
|
ProfileURL: uuid.NewString(),
|
|
|
|
Tribe: twhelp.NullTribeMeta{
|
|
|
|
Tribe: tribes["pl:pl181"][0],
|
|
|
|
Valid: true,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
ID: 2,
|
|
|
|
Name: uuid.NewString(),
|
|
|
|
ProfileURL: uuid.NewString(),
|
|
|
|
Tribe: twhelp.NullTribeMeta{
|
|
|
|
Tribe: tribes["pl:pl181"][1],
|
|
|
|
Valid: true,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
ID: 3,
|
|
|
|
Name: uuid.NewString(),
|
|
|
|
ProfileURL: uuid.NewString(),
|
|
|
|
Tribe: twhelp.NullTribeMeta{
|
|
|
|
Tribe: tribes["pl:pl181"][2],
|
|
|
|
Valid: true,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
ID: 4,
|
|
|
|
Name: uuid.NewString(),
|
|
|
|
ProfileURL: uuid.NewString(),
|
|
|
|
Tribe: twhelp.NullTribeMeta{},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
"en:en130": {
|
|
|
|
{
|
|
|
|
ID: 100,
|
|
|
|
Name: uuid.NewString(),
|
|
|
|
ProfileURL: uuid.NewString(),
|
|
|
|
Tribe: twhelp.NullTribeMeta{
|
|
|
|
Tribe: tribes["en:en130"][0],
|
|
|
|
Valid: true,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
ID: 101,
|
|
|
|
Name: uuid.NewString(),
|
|
|
|
ProfileURL: uuid.NewString(),
|
|
|
|
Tribe: twhelp.NullTribeMeta{
|
|
|
|
Tribe: tribes["en:en130"][1],
|
|
|
|
Valid: true,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
ID: 102,
|
|
|
|
Name: uuid.NewString(),
|
|
|
|
ProfileURL: uuid.NewString(),
|
|
|
|
Tribe: twhelp.NullTribeMeta{},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
"pl:pl180": {
|
|
|
|
{
|
|
|
|
ID: 200,
|
|
|
|
Name: uuid.NewString(),
|
|
|
|
ProfileURL: uuid.NewString(),
|
|
|
|
Tribe: twhelp.NullTribeMeta{
|
|
|
|
Tribe: tribes["pl:pl180"][0],
|
|
|
|
Valid: true,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
2022-10-28 11:59:20 +00:00
|
|
|
"de:de200": {
|
|
|
|
{
|
|
|
|
ID: 300,
|
|
|
|
Name: uuid.NewString(),
|
|
|
|
ProfileURL: uuid.NewString(),
|
|
|
|
Tribe: twhelp.NullTribeMeta{
|
|
|
|
Tribe: tribes["de:de200"][0],
|
|
|
|
Valid: true,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
ID: 301,
|
|
|
|
Name: uuid.NewString(),
|
|
|
|
ProfileURL: uuid.NewString(),
|
|
|
|
Tribe: twhelp.NullTribeMeta{
|
|
|
|
Tribe: tribes["de:de200"][0],
|
|
|
|
Valid: true,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
ID: 302,
|
|
|
|
Name: uuid.NewString(),
|
|
|
|
ProfileURL: uuid.NewString(),
|
|
|
|
Tribe: twhelp.NullTribeMeta{
|
|
|
|
Tribe: tribes["de:de200"][1],
|
|
|
|
Valid: true,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
2022-10-27 09:56:40 +00:00
|
|
|
}
|
|
|
|
ennoblements := map[string][]twhelp.Ennoblement{
|
|
|
|
"pl:pl181": {
|
|
|
|
{
|
|
|
|
ID: 1,
|
|
|
|
Village: villages["pl:pl181"][0],
|
|
|
|
NewOwner: twhelp.NullPlayerMeta{
|
|
|
|
Player: players["pl:pl181"][0],
|
|
|
|
Valid: true,
|
|
|
|
},
|
|
|
|
OldOwner: twhelp.NullPlayerMeta{
|
|
|
|
Player: players["pl:pl181"][1],
|
|
|
|
Valid: true,
|
|
|
|
},
|
|
|
|
CreatedAt: time.Now().Add(-5 * time.Minute),
|
|
|
|
},
|
|
|
|
{
|
|
|
|
ID: 2, // self conquer, should be skipped
|
|
|
|
Village: villages["pl:pl181"][0],
|
|
|
|
NewOwner: twhelp.NullPlayerMeta{
|
|
|
|
Player: players["pl:pl181"][0],
|
|
|
|
Valid: true,
|
|
|
|
},
|
|
|
|
OldOwner: twhelp.NullPlayerMeta{
|
|
|
|
Player: players["pl:pl181"][0],
|
|
|
|
Valid: true,
|
|
|
|
},
|
|
|
|
CreatedAt: time.Now().Add(-4 * time.Minute),
|
|
|
|
},
|
|
|
|
{
|
2022-10-28 11:59:20 +00:00
|
|
|
ID: 3, // internal, should be skipped (internals disabled)
|
2022-10-27 09:56:40 +00:00
|
|
|
Village: villages["pl:pl181"][1],
|
|
|
|
NewOwner: twhelp.NullPlayerMeta{
|
|
|
|
Player: players["pl:pl181"][0],
|
|
|
|
Valid: true,
|
|
|
|
},
|
|
|
|
OldOwner: twhelp.NullPlayerMeta{
|
|
|
|
Player: players["pl:pl181"][2],
|
|
|
|
Valid: true,
|
|
|
|
},
|
|
|
|
CreatedAt: time.Now().Add(-3 * time.Minute),
|
|
|
|
},
|
|
|
|
{
|
2022-10-28 11:59:20 +00:00
|
|
|
ID: 4, // barbarian, shouldn't be skipped (barbarians enabled)
|
2022-10-27 09:56:40 +00:00
|
|
|
Village: villages["pl:pl181"][2],
|
|
|
|
NewOwner: twhelp.NullPlayerMeta{
|
|
|
|
Player: players["pl:pl181"][0],
|
|
|
|
Valid: true,
|
|
|
|
},
|
|
|
|
OldOwner: twhelp.NullPlayerMeta{},
|
|
|
|
CreatedAt: time.Now().Add(-5 * time.Minute),
|
|
|
|
},
|
|
|
|
{
|
|
|
|
ID: 5, // disabled notifications about gains, should be skipped
|
|
|
|
Village: villages["pl:pl181"][3],
|
|
|
|
NewOwner: twhelp.NullPlayerMeta{
|
|
|
|
Player: players["pl:pl181"][1],
|
|
|
|
Valid: true,
|
|
|
|
},
|
|
|
|
OldOwner: twhelp.NullPlayerMeta{},
|
|
|
|
CreatedAt: time.Now().Add(-5 * time.Minute),
|
|
|
|
},
|
|
|
|
{
|
|
|
|
ID: 6, // disabled notifications about losses, should be skipped
|
|
|
|
Village: villages["pl:pl181"][3],
|
|
|
|
NewOwner: twhelp.NullPlayerMeta{
|
|
|
|
Player: players["pl:pl181"][3],
|
|
|
|
Valid: true,
|
|
|
|
},
|
|
|
|
OldOwner: twhelp.NullPlayerMeta{
|
|
|
|
Player: players["pl:pl181"][0],
|
|
|
|
Valid: true,
|
|
|
|
},
|
|
|
|
CreatedAt: time.Now().Add(-5 * time.Minute),
|
|
|
|
},
|
|
|
|
},
|
|
|
|
"en:en130": {
|
|
|
|
{
|
|
|
|
ID: 100, // no monitor for these tribes, should be skipped
|
|
|
|
Village: villages["en:en130"][0],
|
|
|
|
NewOwner: twhelp.NullPlayerMeta{
|
|
|
|
Player: players["en:en130"][0],
|
|
|
|
Valid: true,
|
|
|
|
},
|
|
|
|
OldOwner: twhelp.NullPlayerMeta{},
|
|
|
|
CreatedAt: time.Now().Add(-5 * time.Minute),
|
|
|
|
},
|
|
|
|
{
|
|
|
|
ID: 101, // no monitor for these tribes, should be skipped
|
|
|
|
Village: villages["en:en130"][0],
|
|
|
|
NewOwner: twhelp.NullPlayerMeta{
|
|
|
|
Player: players["en:en130"][2],
|
|
|
|
Valid: true,
|
|
|
|
},
|
|
|
|
OldOwner: twhelp.NullPlayerMeta{
|
|
|
|
Player: players["en:en130"][0],
|
|
|
|
Valid: true,
|
|
|
|
},
|
|
|
|
CreatedAt: time.Now().Add(-5 * time.Minute),
|
|
|
|
},
|
|
|
|
{
|
|
|
|
ID: 102,
|
|
|
|
Village: villages["en:en130"][1],
|
|
|
|
NewOwner: twhelp.NullPlayerMeta{
|
|
|
|
Player: players["en:en130"][1],
|
|
|
|
Valid: true,
|
|
|
|
},
|
|
|
|
OldOwner: twhelp.NullPlayerMeta{
|
|
|
|
Player: players["en:en130"][2],
|
|
|
|
Valid: true,
|
|
|
|
},
|
|
|
|
CreatedAt: time.Now().Add(-5 * time.Minute),
|
|
|
|
},
|
|
|
|
},
|
|
|
|
"pl:pl180": {
|
|
|
|
{
|
|
|
|
ID: 200, // api error, should be skipped
|
|
|
|
Village: villages["pl:pl180"][0],
|
|
|
|
NewOwner: twhelp.NullPlayerMeta{
|
|
|
|
Player: players["pl:pl180"][0],
|
|
|
|
Valid: true,
|
|
|
|
},
|
|
|
|
OldOwner: twhelp.NullPlayerMeta{},
|
|
|
|
CreatedAt: time.Now().Add(-5 * time.Minute),
|
|
|
|
},
|
|
|
|
},
|
2022-10-28 11:59:20 +00:00
|
|
|
"de:de200": {
|
|
|
|
{
|
|
|
|
ID: 300, // barbarian, should be skipped (barbarians disabled)
|
|
|
|
Village: villages["de:de200"][0],
|
|
|
|
NewOwner: twhelp.NullPlayerMeta{
|
|
|
|
Player: players["de:de200"][0],
|
|
|
|
Valid: true,
|
|
|
|
},
|
|
|
|
OldOwner: twhelp.NullPlayerMeta{},
|
|
|
|
CreatedAt: time.Now().Add(-5 * time.Minute),
|
|
|
|
},
|
|
|
|
{
|
|
|
|
ID: 301, // internal, shouldn't be skipped (internals enabled)
|
|
|
|
Village: villages["de:de200"][1],
|
|
|
|
NewOwner: twhelp.NullPlayerMeta{
|
|
|
|
Player: players["de:de200"][0],
|
|
|
|
Valid: true,
|
|
|
|
},
|
|
|
|
OldOwner: twhelp.NullPlayerMeta{
|
|
|
|
Player: players["de:de200"][1],
|
|
|
|
Valid: true,
|
|
|
|
},
|
|
|
|
CreatedAt: time.Now().Add(-5 * time.Minute),
|
|
|
|
},
|
|
|
|
{
|
|
|
|
ID: 302, // internal, shouldn't be skipped (internals enabled)
|
|
|
|
Village: villages["de:de200"][2],
|
|
|
|
NewOwner: twhelp.NullPlayerMeta{
|
|
|
|
Player: players["de:de200"][0],
|
|
|
|
Valid: true,
|
|
|
|
},
|
|
|
|
OldOwner: twhelp.NullPlayerMeta{
|
|
|
|
Player: players["de:de200"][2],
|
|
|
|
Valid: true,
|
|
|
|
},
|
|
|
|
CreatedAt: time.Now().Add(-5 * time.Minute),
|
|
|
|
},
|
|
|
|
},
|
2022-10-27 09:56:40 +00:00
|
|
|
}
|
|
|
|
client.ListEnnoblementsCalls(
|
|
|
|
func(
|
|
|
|
ctx context.Context,
|
|
|
|
version string,
|
|
|
|
server string,
|
|
|
|
_ twhelp.ListEnnoblementsQueryParams,
|
|
|
|
) ([]twhelp.Ennoblement, error) {
|
|
|
|
if version == "pl" && server == "pl180" {
|
|
|
|
return nil, errors.New("random error")
|
|
|
|
}
|
|
|
|
return ennoblements[version+":"+server], nil
|
|
|
|
},
|
|
|
|
)
|
|
|
|
|
|
|
|
groupSvc := &mock.FakeGroupReader{}
|
|
|
|
groups := []domain.Group{
|
|
|
|
{
|
|
|
|
ID: uuid.NewString(),
|
|
|
|
ServerID: uuid.NewString(),
|
|
|
|
ChannelGains: uuid.NewString(),
|
|
|
|
ChannelLosses: "",
|
2022-10-28 11:59:20 +00:00
|
|
|
Barbarians: true,
|
2022-10-27 09:56:40 +00:00
|
|
|
ServerKey: "pl181",
|
|
|
|
VersionCode: "pl",
|
|
|
|
CreatedAt: time.Now(),
|
|
|
|
},
|
|
|
|
{
|
|
|
|
ID: uuid.NewString(),
|
|
|
|
ServerID: uuid.NewString(),
|
|
|
|
ChannelGains: "",
|
|
|
|
ChannelLosses: uuid.NewString(),
|
|
|
|
ServerKey: "pl181",
|
|
|
|
VersionCode: "pl",
|
|
|
|
CreatedAt: time.Now(),
|
|
|
|
},
|
|
|
|
{
|
|
|
|
ID: uuid.NewString(),
|
|
|
|
ServerID: uuid.NewString(),
|
|
|
|
ChannelGains: uuid.NewString(),
|
|
|
|
ChannelLosses: uuid.NewString(),
|
|
|
|
ServerKey: "en130",
|
|
|
|
VersionCode: "en",
|
|
|
|
CreatedAt: time.Now(),
|
|
|
|
},
|
|
|
|
{
|
|
|
|
ID: uuid.NewString(),
|
|
|
|
ServerID: uuid.NewString(),
|
|
|
|
ChannelGains: uuid.NewString(),
|
|
|
|
ChannelLosses: uuid.NewString(),
|
2022-10-28 11:59:20 +00:00
|
|
|
Barbarians: true,
|
2022-10-27 09:56:40 +00:00
|
|
|
ServerKey: "pl180",
|
|
|
|
VersionCode: "pl",
|
|
|
|
CreatedAt: time.Now(),
|
|
|
|
},
|
2022-10-28 11:59:20 +00:00
|
|
|
{
|
|
|
|
ID: uuid.NewString(),
|
|
|
|
ServerID: uuid.NewString(),
|
|
|
|
ChannelGains: uuid.NewString(),
|
|
|
|
ChannelLosses: uuid.NewString(),
|
|
|
|
Barbarians: false,
|
|
|
|
Internals: true,
|
|
|
|
ServerKey: "de200",
|
|
|
|
VersionCode: "de",
|
|
|
|
CreatedAt: time.Now(),
|
|
|
|
},
|
2022-10-27 09:56:40 +00:00
|
|
|
}
|
|
|
|
groupSvc.ListReturns(groups, nil)
|
|
|
|
|
|
|
|
repo := &mock.FakeMonitorRepository{}
|
|
|
|
monitors := map[string][]domain.Monitor{
|
2022-10-29 05:24:52 +00:00
|
|
|
groups[0].ID: {
|
2022-10-27 09:56:40 +00:00
|
|
|
{
|
|
|
|
ID: uuid.NewString(),
|
|
|
|
TribeID: tribes["pl:pl181"][0].ID,
|
2022-10-29 05:24:52 +00:00
|
|
|
GroupID: groups[0].ID,
|
2022-10-27 09:56:40 +00:00
|
|
|
CreatedAt: time.Now(),
|
|
|
|
},
|
|
|
|
{
|
|
|
|
ID: uuid.NewString(),
|
|
|
|
TribeID: tribes["pl:pl181"][2].ID,
|
2022-10-29 05:24:52 +00:00
|
|
|
GroupID: groups[0].ID,
|
2022-10-27 09:56:40 +00:00
|
|
|
CreatedAt: time.Now(),
|
|
|
|
},
|
|
|
|
},
|
2022-10-29 05:24:52 +00:00
|
|
|
groups[1].ID: {
|
2022-10-27 09:56:40 +00:00
|
|
|
{
|
|
|
|
ID: uuid.NewString(),
|
|
|
|
TribeID: tribes["pl:pl181"][1].ID,
|
2022-10-29 05:24:52 +00:00
|
|
|
GroupID: groups[1].ID,
|
2022-10-27 09:56:40 +00:00
|
|
|
CreatedAt: time.Now(),
|
|
|
|
},
|
|
|
|
},
|
2022-10-29 05:24:52 +00:00
|
|
|
groups[2].ID: {
|
2022-10-27 09:56:40 +00:00
|
|
|
{
|
|
|
|
ID: uuid.NewString(),
|
|
|
|
TribeID: tribes["en:en130"][1].ID,
|
2022-10-29 05:24:52 +00:00
|
|
|
GroupID: groups[2].ID,
|
2022-10-27 09:56:40 +00:00
|
|
|
CreatedAt: time.Now(),
|
|
|
|
},
|
|
|
|
},
|
2022-10-29 05:24:52 +00:00
|
|
|
groups[3].ID: {
|
2022-10-27 09:56:40 +00:00
|
|
|
{
|
|
|
|
ID: uuid.NewString(),
|
|
|
|
TribeID: tribes["pl:pl180"][0].ID,
|
2022-10-29 05:24:52 +00:00
|
|
|
GroupID: groups[3].ID,
|
2022-10-27 09:56:40 +00:00
|
|
|
CreatedAt: time.Now(),
|
|
|
|
},
|
|
|
|
},
|
2022-10-29 05:24:52 +00:00
|
|
|
groups[4].ID: {
|
2022-10-28 11:59:20 +00:00
|
|
|
{
|
|
|
|
ID: uuid.NewString(),
|
|
|
|
TribeID: tribes["de:de200"][0].ID,
|
2022-10-29 05:24:52 +00:00
|
|
|
GroupID: groups[4].ID,
|
2022-10-28 11:59:20 +00:00
|
|
|
CreatedAt: time.Now(),
|
|
|
|
},
|
|
|
|
{
|
|
|
|
ID: uuid.NewString(),
|
|
|
|
TribeID: tribes["de:de200"][1].ID,
|
2022-10-29 05:24:52 +00:00
|
|
|
GroupID: groups[4].ID,
|
2022-10-28 11:59:20 +00:00
|
|
|
CreatedAt: time.Now(),
|
|
|
|
},
|
|
|
|
},
|
2022-10-27 09:56:40 +00:00
|
|
|
}
|
|
|
|
repo.ListCalls(func(ctx context.Context, groupID string) ([]domain.Monitor, error) {
|
|
|
|
return monitors[groupID], nil
|
|
|
|
})
|
|
|
|
|
2022-10-29 10:44:11 +00:00
|
|
|
notifications, err := service.NewMonitor(repo, groupSvc, client, zap.NewNop(), 10).
|
2022-10-27 09:56:40 +00:00
|
|
|
Execute(context.Background())
|
|
|
|
assert.NoError(t, err)
|
|
|
|
expectedNotifications := []domain.EnnoblementNotification{
|
|
|
|
{
|
|
|
|
Type: domain.EnnoblementNotificationTypeGain,
|
2022-10-29 05:24:52 +00:00
|
|
|
ServerID: groups[0].ServerID,
|
|
|
|
ChannelID: groups[0].ChannelGains,
|
2022-10-27 09:56:40 +00:00
|
|
|
Ennoblement: ennoblementToDomainModel(ennoblements["pl:pl181"][0]),
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Type: domain.EnnoblementNotificationTypeGain,
|
2022-10-29 05:24:52 +00:00
|
|
|
ServerID: groups[0].ServerID,
|
|
|
|
ChannelID: groups[0].ChannelGains,
|
2022-10-27 09:56:40 +00:00
|
|
|
Ennoblement: ennoblementToDomainModel(ennoblements["pl:pl181"][3]),
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Type: domain.EnnoblementNotificationTypeLoss,
|
2022-10-29 05:24:52 +00:00
|
|
|
ServerID: groups[1].ServerID,
|
|
|
|
ChannelID: groups[1].ChannelLosses,
|
2022-10-27 09:56:40 +00:00
|
|
|
Ennoblement: ennoblementToDomainModel(ennoblements["pl:pl181"][0]),
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Type: domain.EnnoblementNotificationTypeGain,
|
2022-10-29 05:24:52 +00:00
|
|
|
ServerID: groups[2].ServerID,
|
|
|
|
ChannelID: groups[2].ChannelGains,
|
2022-10-27 09:56:40 +00:00
|
|
|
Ennoblement: ennoblementToDomainModel(ennoblements["en:en130"][2]),
|
|
|
|
},
|
2022-10-28 11:59:20 +00:00
|
|
|
{
|
|
|
|
Type: domain.EnnoblementNotificationTypeGain,
|
2022-10-29 05:24:52 +00:00
|
|
|
ServerID: groups[4].ServerID,
|
|
|
|
ChannelID: groups[4].ChannelGains,
|
2022-10-28 11:59:20 +00:00
|
|
|
Ennoblement: ennoblementToDomainModel(ennoblements["de:de200"][1]),
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Type: domain.EnnoblementNotificationTypeGain,
|
2022-10-29 05:24:52 +00:00
|
|
|
ServerID: groups[4].ServerID,
|
|
|
|
ChannelID: groups[4].ChannelGains,
|
2022-10-28 11:59:20 +00:00
|
|
|
Ennoblement: ennoblementToDomainModel(ennoblements["de:de200"][2]),
|
|
|
|
},
|
2022-10-27 09:56:40 +00:00
|
|
|
}
|
|
|
|
assert.Len(t, notifications, len(expectedNotifications))
|
|
|
|
for _, n := range expectedNotifications {
|
|
|
|
assert.Contains(t, notifications, n)
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
func ennoblementToDomainModel(e twhelp.Ennoblement) domain.Ennoblement {
|
|
|
|
return domain.Ennoblement{
|
|
|
|
ID: e.ID,
|
|
|
|
Village: domain.VillageMeta(e.Village),
|
|
|
|
NewOwner: domain.NullPlayerMeta{
|
|
|
|
Player: domain.PlayerMeta{
|
|
|
|
ID: e.NewOwner.Player.ID,
|
|
|
|
Name: e.NewOwner.Player.Name,
|
|
|
|
ProfileURL: e.NewOwner.Player.ProfileURL,
|
|
|
|
Tribe: domain.NullTribeMeta{
|
|
|
|
Tribe: domain.TribeMeta(e.NewOwner.Player.Tribe.Tribe),
|
|
|
|
Valid: e.NewOwner.Player.Tribe.Valid,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
Valid: e.NewOwner.Valid,
|
|
|
|
},
|
|
|
|
OldOwner: domain.NullPlayerMeta{
|
|
|
|
Player: domain.PlayerMeta{
|
|
|
|
ID: e.OldOwner.Player.ID,
|
|
|
|
Name: e.OldOwner.Player.Name,
|
|
|
|
ProfileURL: e.OldOwner.Player.ProfileURL,
|
|
|
|
Tribe: domain.NullTribeMeta{
|
|
|
|
Tribe: domain.TribeMeta(e.OldOwner.Player.Tribe.Tribe),
|
|
|
|
Valid: e.OldOwner.Player.Tribe.Valid,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
Valid: e.OldOwner.Valid,
|
|
|
|
},
|
|
|
|
CreatedAt: e.CreatedAt,
|
|
|
|
}
|
|
|
|
}
|