dcbot/internal/service/group_test.go

128 lines
3.6 KiB
Go

package service_test
import (
"context"
"fmt"
"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"
"github.com/stretchr/testify/require"
)
func TestGroup_Create(t *testing.T) {
t.Parallel()
params, err := domain.NewCreateGroupParams(
"592292203234328587",
"en",
"en113",
"1234",
"1235",
)
require.NoError(t, err)
t.Run("OK", func(t *testing.T) {
t.Parallel()
repo := &mock.FakeGroupRepository{}
repo.CreateCalls(func(_ context.Context, p domain.CreateGroupParams) (domain.Group, error) {
return domain.Group{
ID: uuid.NewString(),
ServerID: p.ServerID(),
ChannelGainedVillages: p.ChannelGainedVillages(),
ChannelLostVillages: p.ChannelLostVillages(),
ServerKey: p.ServerKey(),
VersionCode: p.VersionCode(),
CreatedAt: time.Now(),
}, nil
})
repo.ListReturns(nil, nil)
client := &mock.FakeTWHelpClient{}
client.GetServerCalls(func(_ context.Context, _ string, server string) (twhelp.Server, error) {
return twhelp.Server{
Key: server,
URL: fmt.Sprintf("https://%s.tribalwars.net", server),
Open: true,
}, nil
})
g, err := service.NewGroup(repo, client).Create(context.Background(), params)
assert.NoError(t, err)
assert.NotEmpty(t, g.ID)
assert.Equal(t, params.ServerID(), g.ServerID)
assert.Equal(t, params.ServerKey(), g.ServerKey)
assert.Equal(t, params.VersionCode(), g.VersionCode)
assert.Equal(t, params.ChannelGainedVillages(), g.ChannelGainedVillages)
assert.Equal(t, params.ChannelLostVillages(), g.ChannelLostVillages)
assert.NotEmpty(t, g.CreatedAt)
})
t.Run("ERR: group limit has been reached", func(t *testing.T) {
t.Parallel()
const maxGroupsPerServer = 10
repo := &mock.FakeGroupRepository{}
repo.ListReturns(make([]domain.Group, maxGroupsPerServer), nil)
g, err := service.NewGroup(repo, nil).Create(context.Background(), params)
assert.ErrorIs(t, err, domain.GroupLimitReachedError{
Current: maxGroupsPerServer,
Limit: maxGroupsPerServer,
})
assert.Zero(t, g)
})
t.Run("ERR: server doesn't exist", func(t *testing.T) {
t.Parallel()
repo := &mock.FakeGroupRepository{}
repo.ListReturns(nil, nil)
client := &mock.FakeTWHelpClient{}
client.GetServerCalls(func(_ context.Context, _ string, _ string) (twhelp.Server, error) {
return twhelp.Server{}, twhelp.APIError{
Code: twhelp.ErrorCodeEntityNotFound,
Message: "server not found",
}
})
g, err := service.NewGroup(repo, client).Create(context.Background(), params)
assert.ErrorIs(t, err, domain.ServerDoesNotExistError{
VersionCode: params.VersionCode(),
Key: params.ServerKey(),
})
assert.Zero(t, g)
})
t.Run("ERR: server is closed", func(t *testing.T) {
t.Parallel()
repo := &mock.FakeGroupRepository{}
repo.ListReturns(nil, nil)
client := &mock.FakeTWHelpClient{}
client.GetServerCalls(func(ctx context.Context, _ string, server string) (twhelp.Server, error) {
return twhelp.Server{
Key: server,
URL: fmt.Sprintf("https://%s.tribalwars.net", server),
Open: false,
}, nil
})
g, err := service.NewGroup(repo, client).Create(context.Background(), params)
assert.ErrorIs(t, err, domain.ServerIsClosedError{
VersionCode: params.VersionCode(),
Key: params.ServerKey(),
})
assert.Zero(t, g)
})
}