diff --git a/myteamwallet_backend/src/teams/teams.service.spec.ts b/myteamwallet_backend/src/teams/teams.service.spec.ts index 4c1e63d..26786fc 100644 --- a/myteamwallet_backend/src/teams/teams.service.spec.ts +++ b/myteamwallet_backend/src/teams/teams.service.spec.ts @@ -29,6 +29,7 @@ describe('TeamsService#getOverviewStats theoretical balance', () => { {} as any, { info: jest.fn(), debug: jest.fn(), warn: jest.fn() } as any, access as any, + {} as any, ); }); @@ -286,6 +287,7 @@ describe('TeamsService#getTeamTransactionsJournal', () => { {} as any, { info: jest.fn(), debug: jest.fn(), warn: jest.fn() } as any, access as any, + {} as any, ); }); @@ -362,3 +364,59 @@ describe('TeamsService#getTeamTransactionsJournal', () => { expect(repository.findOneOrFail).not.toHaveBeenCalled(); }); }); + +describe('TeamsService#createNewTeam', () => { + const repository = { create: jest.fn(), save: jest.fn() }; + const playerRepository = { create: jest.fn(), save: jest.fn() }; + const rolesRepository = { findOneBy: jest.fn() }; + const settingsRepository = { create: jest.fn(), save: jest.fn() }; + const usersRepository = { findOneBy: jest.fn() }; + const logger = { info: jest.fn(), debug: jest.fn(), warn: jest.fn() }; + let service: TeamsService; + + beforeEach(() => { + jest.resetAllMocks(); + service = new TeamsService( + repository as any, + playerRepository as any, + {} as any, + rolesRepository as any, + settingsRepository as any, + {} as any, + logger as any, + {} as any, + usersRepository as any, + ); + }); + + it('creates the team, its default settings, and a captain membership for the creator', async () => { + const savedTeam = { id: 7, name: '1. Herren' }; + repository.create.mockReturnValue({ name: '1. Herren' }); + repository.save.mockResolvedValue(savedTeam); + settingsRepository.create.mockImplementation((s: unknown) => s); + settingsRepository.save.mockResolvedValue([]); + usersRepository.findOneBy.mockResolvedValue({ + id: 42, + firstName: 'Alex', + lastName: 'Muster', + }); + rolesRepository.findOneBy.mockResolvedValue({ id: 3, name: 'captain' }); + playerRepository.create.mockImplementation((p: unknown) => p); + playerRepository.save.mockResolvedValue({}); + + const result = await service.createNewTeam({ name: '1. Herren' } as any, '42'); + + expect(result).toBe(savedTeam); + expect(rolesRepository.findOneBy).toHaveBeenCalledWith({ id: 3 }); + expect(usersRepository.findOneBy).toHaveBeenCalledWith({ id: 42 }); + expect(playerRepository.create).toHaveBeenCalledWith( + expect.objectContaining({ + firstName: 'Alex', + lastName: 'Muster', + team: savedTeam, + teamRole: { id: 3, name: 'captain' }, + }), + ); + expect(playerRepository.save).toHaveBeenCalled(); + }); +}); diff --git a/myteamwallet_backend/src/teams/teams.service.ts b/myteamwallet_backend/src/teams/teams.service.ts index 327192e..6e8f88c 100644 --- a/myteamwallet_backend/src/teams/teams.service.ts +++ b/myteamwallet_backend/src/teams/teams.service.ts @@ -8,6 +8,8 @@ import { TeamSetting } from 'src/team-settings/entities/team-setting.entity'; import { TEAM_SETTING_DEFAULTS } from 'src/team-settings/team-setting-defaults'; import { TeamWalletTransaction } from 'src/team-wallet-transactions/entities/team-wallet-transaction.entity'; import { Transaction } from 'src/transactions/entitites/transaction.entity'; +import { TeamRolesEnum } from 'src/team-roles/team-roles.enum'; +import { User } from 'src/users/entities/user.entity'; import { Repository } from 'typeorm'; import { TransactionsQueryDto, @@ -46,6 +48,8 @@ export class TeamsService { private teamWalletTransactionRepository: Repository, private logger: LoggingService, private access: TeamAccessService, + @InjectRepository(User) + private usersRepository: Repository, ) {} async getOverview(teamId: string, actorUserId: string) { @@ -168,6 +172,7 @@ export class TeamsService { const team = await this.repository.save(createTeam); await this.generateBasicTeamSettings(team); + await this.addCreatorAsCaptain(team, userId); await this.logger.info({ event: 'team_create', @@ -177,6 +182,23 @@ export class TeamsService { return team; } + private async addCreatorAsCaptain(team: Team, userId: string): Promise { + const [user, captainRole] = await Promise.all([ + this.usersRepository.findOneBy({ id: Number(userId) }), + this.rolesRepository.findOneBy({ id: TeamRolesEnum.captain }), + ]); + + const player = this.playerRepository.create({ + firstName: user?.firstName ?? '', + lastName: user?.lastName ?? '', + team, + teamRole: captainRole, + user: user ?? undefined, + }); + + await this.playerRepository.save(player); + } + private async generateBasicTeamSettings(team: Team): Promise { const settings: CreateTeamSettingDTO[] = Object.entries( TEAM_SETTING_DEFAULTS,