diff --git a/internal/service/group_test.go b/internal/service/group_test.go index 12977d0..dc72194 100644 --- a/internal/service/group_test.go +++ b/internal/service/group_test.go @@ -136,162 +136,158 @@ func TestGroup_Create(t *testing.T) { func TestGroup_CleanUp(t *testing.T) { t.Parallel() - t.Run("OK", func(t *testing.T) { - t.Parallel() + repo := &mock.FakeGroupRepository{} + groupsWithDisabledNotifications := []domain.Group{ + { + ID: uuid.NewString(), + ServerID: uuid.NewString(), + ChannelGains: "", + ChannelLosses: "", + Internals: true, + Barbarians: true, + ServerKey: "pl181", + VersionCode: "pl", + CreatedAt: time.Now().Add(-48 * time.Hour), + }, + { + ID: uuid.NewString(), + ServerID: uuid.NewString(), + ChannelGains: "", + ChannelLosses: "", + Internals: true, + Barbarians: true, + ServerKey: "pl181", + VersionCode: "pl", + CreatedAt: time.Now().Add(-45 * time.Hour), + }, + } + repo.ListReturnsOnCall(0, groupsWithDisabledNotifications, nil) + groupsPL := []domain.Group{ + { + ID: uuid.NewString(), + ServerID: uuid.NewString(), + ChannelGains: uuid.NewString(), + ChannelLosses: "", + Internals: true, + Barbarians: true, + ServerKey: "pl181", + VersionCode: "pl", + CreatedAt: time.Now().Add(-120 * time.Hour), + }, + { + ID: uuid.NewString(), + ServerID: uuid.NewString(), + ChannelGains: uuid.NewString(), + ChannelLosses: uuid.NewString(), + Internals: true, + Barbarians: true, + ServerKey: "pl181", + VersionCode: "pl", + CreatedAt: time.Now().Add(-11 * time.Hour), + }, + } + repo.ListReturnsOnCall(1, groupsPL, nil) + groupsUK := []domain.Group{ + { + ID: uuid.NewString(), + ServerID: uuid.NewString(), + ChannelGains: uuid.NewString(), + ChannelLosses: uuid.NewString(), + Internals: true, + Barbarians: true, + ServerKey: "uk51", + VersionCode: "uk", + CreatedAt: time.Now().Add(-150 * time.Hour), + }, + { + ID: uuid.NewString(), + ServerID: uuid.NewString(), + ChannelGains: uuid.NewString(), + ChannelLosses: uuid.NewString(), + Internals: true, + Barbarians: true, + ServerKey: "uk52", + VersionCode: "uk", + CreatedAt: time.Now().Add(-200 * time.Hour), + }, + } + repo.ListReturnsOnCall(2, groupsUK, nil) + repo.DeleteManyReturns(nil) - repo := &mock.FakeGroupRepository{} - groupsWithDisabledNotifications := []domain.Group{ - { - ID: uuid.NewString(), - ServerID: uuid.NewString(), - ChannelGains: "", - ChannelLosses: "", - Internals: true, - Barbarians: true, - ServerKey: "pl181", - VersionCode: "pl", - CreatedAt: time.Now().Add(-48 * time.Hour), - }, - { - ID: uuid.NewString(), - ServerID: uuid.NewString(), - ChannelGains: "", - ChannelLosses: "", - Internals: true, - Barbarians: true, - ServerKey: "pl181", - VersionCode: "pl", - CreatedAt: time.Now().Add(-45 * time.Hour), - }, - } - repo.ListReturnsOnCall(0, groupsWithDisabledNotifications, nil) - groupsPL := []domain.Group{ - { - ID: uuid.NewString(), - ServerID: uuid.NewString(), - ChannelGains: uuid.NewString(), - ChannelLosses: "", - Internals: true, - Barbarians: true, - ServerKey: "pl181", - VersionCode: "pl", - CreatedAt: time.Now().Add(-120 * time.Hour), - }, - { - ID: uuid.NewString(), - ServerID: uuid.NewString(), - ChannelGains: uuid.NewString(), - ChannelLosses: uuid.NewString(), - Internals: true, - Barbarians: true, - ServerKey: "pl181", - VersionCode: "pl", - CreatedAt: time.Now().Add(-11 * time.Hour), - }, - } - repo.ListReturnsOnCall(1, groupsPL, nil) - groupsUK := []domain.Group{ - { - ID: uuid.NewString(), - ServerID: uuid.NewString(), - ChannelGains: uuid.NewString(), - ChannelLosses: uuid.NewString(), - Internals: true, - Barbarians: true, - ServerKey: "uk51", - VersionCode: "uk", - CreatedAt: time.Now().Add(-150 * time.Hour), - }, - { - ID: uuid.NewString(), - ServerID: uuid.NewString(), - ChannelGains: uuid.NewString(), - ChannelLosses: uuid.NewString(), - Internals: true, - Barbarians: true, - ServerKey: "uk52", - VersionCode: "uk", - CreatedAt: time.Now().Add(-200 * time.Hour), - }, - } - repo.ListReturnsOnCall(2, groupsUK, nil) - repo.DeleteManyReturns(nil) + client := &mock.FakeTWHelpClient{} + versions := []twhelp.Version{ + { + Code: "pl", + Host: "www.plemiona.pl", + Name: "Poland", + Timezone: "Europe/Warsaw", + }, + { + Code: "uk", + Host: "www.tribalwars.co.uk", + Name: "United Kingdom", + Timezone: "Europe/London", + }, + { + Code: "tr", + Host: "www.klanlar.org", + Name: "Turkey", + Timezone: "Europe/Istanbul", + }, + } + client.ListVersionsReturns(versions, nil) + serversPL := []twhelp.Server{ + { + Key: "pl181", + URL: "https://pl181.plemiona.pl", + Open: false, + }, + } + client.ListServersReturnsOnCall(0, serversPL, nil) + serversUK := []twhelp.Server{ + { + Key: "uk51", + URL: "https://uk51.tribalwars.co.uk", + Open: false, + }, + { + Key: "uk52", + URL: "https://uk52.tribalwars.co.uk", + Open: false, + }, + } + client.ListServersReturnsOnCall(1, serversUK, nil) + client.ListServersReturnsOnCall(1, serversUK, nil) + client.ListServersReturnsOnCall(2, nil, nil) // Turkey - client := &mock.FakeTWHelpClient{} - versions := []twhelp.Version{ - { - Code: "pl", - Host: "www.plemiona.pl", - Name: "Poland", - Timezone: "Europe/Warsaw", - }, - { - Code: "uk", - Host: "www.tribalwars.co.uk", - Name: "United Kingdom", - Timezone: "Europe/London", - }, - { - Code: "tr", - Host: "www.klanlar.org", - Name: "Turkey", - Timezone: "Europe/Istanbul", - }, - } - client.ListVersionsReturns(versions, nil) - serversPL := []twhelp.Server{ - { - Key: "pl181", - URL: "https://pl181.plemiona.pl", - Open: false, - }, - } - client.ListServersReturnsOnCall(0, serversPL, nil) - serversUK := []twhelp.Server{ - { - Key: "uk51", - URL: "https://uk51.tribalwars.co.uk", - Open: false, - }, - { - Key: "uk52", - URL: "https://uk52.tribalwars.co.uk", - Open: false, - }, - } - client.ListServersReturnsOnCall(1, serversUK, nil) - client.ListServersReturnsOnCall(1, serversUK, nil) - client.ListServersReturnsOnCall(2, nil, nil) // Turkey + assert.NoError(t, service.NewGroup(repo, client, zap.NewNop(), 1).CleanUp(context.Background())) - assert.NoError(t, service.NewGroup(repo, client, zap.NewNop(), 1).CleanUp(context.Background())) - - require.Equal(t, 3, repo.ListCallCount()) - require.Equal(t, 3, repo.DeleteManyCallCount()) - for _, tt := range []struct { - i int - groups []domain.Group - }{ - { - i: 0, - groups: groupsWithDisabledNotifications, - }, - { - i: 1, - groups: groupsPL, - }, - { - i: 2, - groups: groupsUK, - }, - } { - _, ids := repo.DeleteManyArgsForCall(tt.i) - assert.Len(t, ids, len(tt.groups)) - for i, id := range ids { - assert.Equal(t, tt.groups[i].ID, id) - } + require.Equal(t, 3, repo.ListCallCount()) + require.Equal(t, 3, repo.DeleteManyCallCount()) + for _, tt := range []struct { + i int + groups []domain.Group + }{ + { + i: 0, + groups: groupsWithDisabledNotifications, + }, + { + i: 1, + groups: groupsPL, + }, + { + i: 2, + groups: groupsUK, + }, + } { + _, ids := repo.DeleteManyArgsForCall(tt.i) + assert.Len(t, ids, len(tt.groups)) + for i, id := range ids { + assert.Equal(t, tt.groups[i].ID, id) } + } - require.Equal(t, 1, client.ListVersionsCallCount()) - require.Equal(t, 3, client.ListServersCallCount()) - }) + require.Equal(t, 1, client.ListVersionsCallCount()) + require.Equal(t, 3, client.ListServersCallCount()) } diff --git a/internal/service/monitor_test.go b/internal/service/monitor_test.go index 0351632..30bbbd0 100644 --- a/internal/service/monitor_test.go +++ b/internal/service/monitor_test.go @@ -179,630 +179,622 @@ func TestMonitor_Create(t *testing.T) { 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 - }) - - res, err := service.NewMonitor(repo, groupSvc, client, zap.NewNop(), 10). - List(context.Background(), groupID, uuid.NewString()) - assert.NoError(t, err) - assert.Len(t, res, len(monitors)) - for i, m := range monitors { - assert.Equal(t, m, res[i].Monitor) - assert.Equal(t, m.TribeID, res[i].Tribe.ID) - } + 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 + }) + + res, err := service.NewMonitor(repo, groupSvc, client, zap.NewNop(), 10). + List(context.Background(), groupID, uuid.NewString()) + assert.NoError(t, err) + assert.Len(t, res, len(monitors)) + for i, m := range monitors { + assert.Equal(t, m, res[i].Monitor) + assert.Equal(t, m.TribeID, res[i].Tribe.ID) + } } 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(), + }, + }, + "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(), + }, + }, + } + 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(), + }, + }, + "de:de200": { + { + ID: 300, + Name: uuid.NewString(), + Tag: uuid.NewString(), + ProfileURL: uuid.NewString(), + }, + { + ID: 301, + Name: uuid.NewString(), + Tag: uuid.NewString(), + ProfileURL: uuid.NewString(), + }, + }, + } + 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, + }, + }, + }, + "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, + }, + }, + }, + } + 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), + }, + { + ID: 3, // internal, should be skipped (internals disabled) + 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), + }, + { + ID: 4, // barbarian, shouldn't be skipped (barbarians enabled) + 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), + }, + }, + "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), + }, + }, + } + 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 + }, + ) - 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(), - }, - }, - "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(), - }, - }, - } - 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(), - }, - }, - "de:de200": { - { - ID: 300, - Name: uuid.NewString(), - Tag: uuid.NewString(), - ProfileURL: uuid.NewString(), - }, - { - ID: 301, - Name: uuid.NewString(), - Tag: uuid.NewString(), - ProfileURL: uuid.NewString(), - }, - }, - } - 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, - }, - }, - }, - "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, - }, - }, - }, - } - 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), - }, - { - ID: 3, // internal, should be skipped (internals disabled) - 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), - }, - { - ID: 4, // barbarian, shouldn't be skipped (barbarians enabled) - 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), - }, - }, - "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), - }, - }, - } - 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: "", + Barbarians: true, + 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(), + Barbarians: true, + ServerKey: "pl180", + VersionCode: "pl", + CreatedAt: time.Now(), + }, + { + ID: uuid.NewString(), + ServerID: uuid.NewString(), + ChannelGains: uuid.NewString(), + ChannelLosses: uuid.NewString(), + Barbarians: false, + Internals: true, + ServerKey: "de200", + VersionCode: "de", + CreatedAt: time.Now(), + }, + } + groupSvc.ListReturns(groups, nil) - groupSvc := &mock.FakeGroupReader{} - groups := []domain.Group{ + repo := &mock.FakeMonitorRepository{} + monitors := map[string][]domain.Monitor{ + groups[0].ID: { { - ID: uuid.NewString(), - ServerID: uuid.NewString(), - ChannelGains: uuid.NewString(), - ChannelLosses: "", - Barbarians: true, - ServerKey: "pl181", - VersionCode: "pl", - CreatedAt: time.Now(), + ID: uuid.NewString(), + TribeID: tribes["pl:pl181"][0].ID, + GroupID: groups[0].ID, + CreatedAt: time.Now(), }, { - ID: uuid.NewString(), - ServerID: uuid.NewString(), - ChannelGains: "", - ChannelLosses: uuid.NewString(), - ServerKey: "pl181", - VersionCode: "pl", - CreatedAt: time.Now(), + ID: uuid.NewString(), + TribeID: tribes["pl:pl181"][2].ID, + GroupID: groups[0].ID, + CreatedAt: time.Now(), + }, + }, + groups[1].ID: { + { + ID: uuid.NewString(), + TribeID: tribes["pl:pl181"][1].ID, + GroupID: groups[1].ID, + CreatedAt: time.Now(), + }, + }, + groups[2].ID: { + { + ID: uuid.NewString(), + TribeID: tribes["en:en130"][1].ID, + GroupID: groups[2].ID, + CreatedAt: time.Now(), + }, + }, + groups[3].ID: { + { + ID: uuid.NewString(), + TribeID: tribes["pl:pl180"][0].ID, + GroupID: groups[3].ID, + CreatedAt: time.Now(), + }, + }, + groups[4].ID: { + { + ID: uuid.NewString(), + TribeID: tribes["de:de200"][0].ID, + GroupID: groups[4].ID, + 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(), + TribeID: tribes["de:de200"][1].ID, + GroupID: groups[4].ID, + CreatedAt: time.Now(), }, - { - ID: uuid.NewString(), - ServerID: uuid.NewString(), - ChannelGains: uuid.NewString(), - ChannelLosses: uuid.NewString(), - Barbarians: true, - ServerKey: "pl180", - VersionCode: "pl", - CreatedAt: time.Now(), - }, - { - ID: uuid.NewString(), - ServerID: uuid.NewString(), - ChannelGains: uuid.NewString(), - ChannelLosses: uuid.NewString(), - Barbarians: false, - Internals: true, - ServerKey: "de200", - VersionCode: "de", - CreatedAt: time.Now(), - }, - } - groupSvc.ListReturns(groups, nil) - - repo := &mock.FakeMonitorRepository{} - monitors := map[string][]domain.Monitor{ - groups[0].ID: { - { - ID: uuid.NewString(), - TribeID: tribes["pl:pl181"][0].ID, - GroupID: groups[0].ID, - CreatedAt: time.Now(), - }, - { - ID: uuid.NewString(), - TribeID: tribes["pl:pl181"][2].ID, - GroupID: groups[0].ID, - CreatedAt: time.Now(), - }, - }, - groups[1].ID: { - { - ID: uuid.NewString(), - TribeID: tribes["pl:pl181"][1].ID, - GroupID: groups[1].ID, - CreatedAt: time.Now(), - }, - }, - groups[2].ID: { - { - ID: uuid.NewString(), - TribeID: tribes["en:en130"][1].ID, - GroupID: groups[2].ID, - CreatedAt: time.Now(), - }, - }, - groups[3].ID: { - { - ID: uuid.NewString(), - TribeID: tribes["pl:pl180"][0].ID, - GroupID: groups[3].ID, - CreatedAt: time.Now(), - }, - }, - groups[4].ID: { - { - ID: uuid.NewString(), - TribeID: tribes["de:de200"][0].ID, - GroupID: groups[4].ID, - CreatedAt: time.Now(), - }, - { - ID: uuid.NewString(), - TribeID: tribes["de:de200"][1].ID, - GroupID: groups[4].ID, - CreatedAt: time.Now(), - }, - }, - } - repo.ListCalls(func(ctx context.Context, groupID string) ([]domain.Monitor, error) { - return monitors[groupID], nil - }) - - notifications, err := service.NewMonitor(repo, groupSvc, client, zap.NewNop(), 10). - Execute(context.Background()) - assert.NoError(t, err) - expectedNotifications := []domain.EnnoblementNotification{ - { - Type: domain.EnnoblementNotificationTypeGain, - ServerID: groups[0].ServerID, - ChannelID: groups[0].ChannelGains, - Ennoblement: ennoblementToDomainModel(ennoblements["pl:pl181"][0]), - }, - { - Type: domain.EnnoblementNotificationTypeGain, - ServerID: groups[0].ServerID, - ChannelID: groups[0].ChannelGains, - Ennoblement: ennoblementToDomainModel(ennoblements["pl:pl181"][3]), - }, - { - Type: domain.EnnoblementNotificationTypeLoss, - ServerID: groups[1].ServerID, - ChannelID: groups[1].ChannelLosses, - Ennoblement: ennoblementToDomainModel(ennoblements["pl:pl181"][0]), - }, - { - Type: domain.EnnoblementNotificationTypeGain, - ServerID: groups[2].ServerID, - ChannelID: groups[2].ChannelGains, - Ennoblement: ennoblementToDomainModel(ennoblements["en:en130"][2]), - }, - { - Type: domain.EnnoblementNotificationTypeGain, - ServerID: groups[4].ServerID, - ChannelID: groups[4].ChannelGains, - Ennoblement: ennoblementToDomainModel(ennoblements["de:de200"][1]), - }, - { - Type: domain.EnnoblementNotificationTypeGain, - ServerID: groups[4].ServerID, - ChannelID: groups[4].ChannelGains, - Ennoblement: ennoblementToDomainModel(ennoblements["de:de200"][2]), - }, - } - assert.Len(t, notifications, len(expectedNotifications)) - for _, n := range expectedNotifications { - assert.Contains(t, notifications, n) - } + }, + } + repo.ListCalls(func(ctx context.Context, groupID string) ([]domain.Monitor, error) { + return monitors[groupID], nil }) + + notifications, err := service.NewMonitor(repo, groupSvc, client, zap.NewNop(), 10). + Execute(context.Background()) + assert.NoError(t, err) + expectedNotifications := []domain.EnnoblementNotification{ + { + Type: domain.EnnoblementNotificationTypeGain, + ServerID: groups[0].ServerID, + ChannelID: groups[0].ChannelGains, + Ennoblement: newEnnoblement(ennoblements["pl:pl181"][0]), + }, + { + Type: domain.EnnoblementNotificationTypeGain, + ServerID: groups[0].ServerID, + ChannelID: groups[0].ChannelGains, + Ennoblement: newEnnoblement(ennoblements["pl:pl181"][3]), + }, + { + Type: domain.EnnoblementNotificationTypeLoss, + ServerID: groups[1].ServerID, + ChannelID: groups[1].ChannelLosses, + Ennoblement: newEnnoblement(ennoblements["pl:pl181"][0]), + }, + { + Type: domain.EnnoblementNotificationTypeGain, + ServerID: groups[2].ServerID, + ChannelID: groups[2].ChannelGains, + Ennoblement: newEnnoblement(ennoblements["en:en130"][2]), + }, + { + Type: domain.EnnoblementNotificationTypeGain, + ServerID: groups[4].ServerID, + ChannelID: groups[4].ChannelGains, + Ennoblement: newEnnoblement(ennoblements["de:de200"][1]), + }, + { + Type: domain.EnnoblementNotificationTypeGain, + ServerID: groups[4].ServerID, + ChannelID: groups[4].ChannelGains, + Ennoblement: newEnnoblement(ennoblements["de:de200"][2]), + }, + } + assert.Len(t, notifications, len(expectedNotifications)) + for _, n := range expectedNotifications { + assert.Contains(t, notifications, n) + } } -func ennoblementToDomainModel(e twhelp.Ennoblement) domain.Ennoblement { +func newEnnoblement(e twhelp.Ennoblement) domain.Ennoblement { return domain.Ennoblement{ ID: e.ID, Village: domain.VillageMeta(e.Village),