238 lines
9.3 KiB
TypeScript
238 lines
9.3 KiB
TypeScript
import { vi, describe, it, expect, beforeEach } from 'vitest';
|
|
import { InMemoryTeamMembershipRepository } from './InMemoryTeamMembershipRepository';
|
|
import type { TeamMembership, TeamJoinRequest } from '@core/racing/domain/types/TeamMembership';
|
|
import type { Logger } from '@core/shared/application';
|
|
|
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
|
|
describe('InMemoryTeamMembershipRepository', () => {
|
|
let repository: InMemoryTeamMembershipRepository;
|
|
let mockLogger: Logger;
|
|
|
|
beforeEach(() => {
|
|
mockLogger = {
|
|
debug: vi.fn(),
|
|
info: vi.fn(),
|
|
warn: vi.fn(),
|
|
error: vi.fn(),
|
|
};
|
|
repository = new InMemoryTeamMembershipRepository(mockLogger);
|
|
});
|
|
|
|
const createTestMembership = (
|
|
teamId: string,
|
|
driverId: string,
|
|
role: 'owner' | 'manager' | 'driver' = 'driver',
|
|
status: 'active' | 'pending' | 'none' = 'active',
|
|
joinedAt: Date = new Date()
|
|
): TeamMembership => ({
|
|
teamId,
|
|
driverId,
|
|
role,
|
|
status,
|
|
joinedAt,
|
|
});
|
|
|
|
const createTestJoinRequest = (
|
|
id: string,
|
|
teamId: string,
|
|
driverId: string,
|
|
requestedAt: Date = new Date(),
|
|
message?: string
|
|
): TeamJoinRequest => ({
|
|
id,
|
|
teamId,
|
|
driverId,
|
|
requestedAt,
|
|
...(message !== undefined ? { message } : {}),
|
|
});
|
|
|
|
describe('constructor', () => {
|
|
it('should initialize with logger', () => {
|
|
expect(repository).toBeDefined();
|
|
expect(mockLogger.info).toHaveBeenCalledWith('InMemoryTeamMembershipRepository initialized.');
|
|
});
|
|
});
|
|
|
|
describe('getMembership', () => {
|
|
it('should return membership if found', async () => {
|
|
const membership = createTestMembership('team1', 'driver1');
|
|
await repository.saveMembership(membership);
|
|
|
|
const result = await repository.getMembership('team1', 'driver1');
|
|
expect(result).toEqual(membership);
|
|
});
|
|
|
|
it('should return null if membership not found', async () => {
|
|
const result = await repository.getMembership('team1', 'driver1');
|
|
expect(result).toBeNull();
|
|
});
|
|
|
|
it('should return null if team has no memberships', async () => {
|
|
const result = await repository.getMembership('nonexistent', 'driver1');
|
|
expect(result).toBeNull();
|
|
});
|
|
});
|
|
|
|
describe('getActiveMembershipForDriver', () => {
|
|
it('should return active membership for driver', async () => {
|
|
const activeMembership = createTestMembership('team1', 'driver1', 'driver', 'active');
|
|
const pendingMembership = createTestMembership('team2', 'driver1', 'driver', 'pending');
|
|
await repository.saveMembership(activeMembership);
|
|
await repository.saveMembership(pendingMembership);
|
|
|
|
const result = await repository.getActiveMembershipForDriver('driver1');
|
|
expect(result).toEqual(activeMembership);
|
|
});
|
|
|
|
it('should return null if no active membership', async () => {
|
|
const pendingMembership = createTestMembership('team1', 'driver1', 'driver', 'pending');
|
|
await repository.saveMembership(pendingMembership);
|
|
|
|
const result = await repository.getActiveMembershipForDriver('driver1');
|
|
expect(result).toBeNull();
|
|
});
|
|
|
|
it('should return null if driver has no memberships', async () => {
|
|
const result = await repository.getActiveMembershipForDriver('driver1');
|
|
expect(result).toBeNull();
|
|
});
|
|
});
|
|
|
|
describe('getTeamMembers', () => {
|
|
it('should return all members for team', async () => {
|
|
const member1 = createTestMembership('team1', 'driver1');
|
|
const member2 = createTestMembership('team1', 'driver2');
|
|
const member3 = createTestMembership('team2', 'driver3');
|
|
await repository.saveMembership(member1);
|
|
await repository.saveMembership(member2);
|
|
await repository.saveMembership(member3);
|
|
|
|
const result = await repository.getTeamMembers('team1');
|
|
expect(result).toHaveLength(2);
|
|
expect(result).toContain(member1);
|
|
expect(result).toContain(member2);
|
|
});
|
|
|
|
it('should return empty array if team has no members', async () => {
|
|
const result = await repository.getTeamMembers('team1');
|
|
expect(result).toEqual([]);
|
|
});
|
|
});
|
|
|
|
describe('countByTeamId', () => {
|
|
it('should count active members for team', async () => {
|
|
const active1 = createTestMembership('team1', 'driver1', 'driver', 'active');
|
|
const active2 = createTestMembership('team1', 'driver2', 'driver', 'active');
|
|
const pending = createTestMembership('team1', 'driver3', 'driver', 'pending');
|
|
await repository.saveMembership(active1);
|
|
await repository.saveMembership(active2);
|
|
await repository.saveMembership(pending);
|
|
|
|
const result = await repository.countByTeamId('team1');
|
|
expect(result).toBe(2);
|
|
});
|
|
|
|
it('should return 0 if team has no active members', async () => {
|
|
const pending = createTestMembership('team1', 'driver1', 'driver', 'pending');
|
|
await repository.saveMembership(pending);
|
|
|
|
const result = await repository.countByTeamId('team1');
|
|
expect(result).toBe(0);
|
|
});
|
|
|
|
it('should return 0 if team has no members', async () => {
|
|
const result = await repository.countByTeamId('team1');
|
|
expect(result).toBe(0);
|
|
});
|
|
});
|
|
|
|
describe('saveMembership', () => {
|
|
it('should save new membership', async () => {
|
|
const membership = createTestMembership('team1', 'driver1');
|
|
const result = await repository.saveMembership(membership);
|
|
expect(result).toEqual(membership);
|
|
expect(mockLogger.info).toHaveBeenCalledWith('[saveMembership] Success - created new membership for team: team1, driver: driver1.');
|
|
});
|
|
|
|
it('should update existing membership', async () => {
|
|
const membership = createTestMembership('team1', 'driver1', 'driver', 'active');
|
|
await repository.saveMembership(membership);
|
|
const updated = createTestMembership('team1', 'driver1', 'manager', 'active');
|
|
const result = await repository.saveMembership(updated);
|
|
expect(result).toEqual(updated);
|
|
expect(mockLogger.info).toHaveBeenCalledWith('[saveMembership] Success - updated existing membership for team: team1, driver: driver1.');
|
|
});
|
|
});
|
|
|
|
describe('removeMembership', () => {
|
|
it('should remove existing membership', async () => {
|
|
const membership = createTestMembership('team1', 'driver1');
|
|
await repository.saveMembership(membership);
|
|
await repository.removeMembership('team1', 'driver1');
|
|
const found = await repository.getMembership('team1', 'driver1');
|
|
expect(found).toBeNull();
|
|
expect(mockLogger.info).toHaveBeenCalledWith('[removeMembership] Success - removed membership for team: team1, driver: driver1.');
|
|
});
|
|
|
|
it('should log warning if membership not found', async () => {
|
|
await repository.removeMembership('team1', 'driver1');
|
|
expect(mockLogger.warn).toHaveBeenCalledWith('[removeMembership] No membership list found for team: team1. Cannot remove.');
|
|
});
|
|
});
|
|
|
|
describe('getJoinRequests', () => {
|
|
it('should return join requests for team', async () => {
|
|
const request1 = createTestJoinRequest('req1', 'team1', 'driver1');
|
|
const request2 = createTestJoinRequest('req2', 'team1', 'driver2');
|
|
const request3 = createTestJoinRequest('req3', 'team2', 'driver3');
|
|
await repository.saveJoinRequest(request1);
|
|
await repository.saveJoinRequest(request2);
|
|
await repository.saveJoinRequest(request3);
|
|
|
|
const result = await repository.getJoinRequests('team1');
|
|
expect(result).toHaveLength(2);
|
|
expect(result).toContain(request1);
|
|
expect(result).toContain(request2);
|
|
});
|
|
|
|
it('should return empty array if team has no requests', async () => {
|
|
const result = await repository.getJoinRequests('team1');
|
|
expect(result).toEqual([]);
|
|
});
|
|
});
|
|
|
|
describe('saveJoinRequest', () => {
|
|
it('should save new join request', async () => {
|
|
const request = createTestJoinRequest('req1', 'team1', 'driver1');
|
|
const result = await repository.saveJoinRequest(request);
|
|
expect(result).toEqual(request);
|
|
expect(mockLogger.info).toHaveBeenCalledWith('[saveJoinRequest] Success - created new join request: req1.');
|
|
});
|
|
|
|
it('should update existing join request', async () => {
|
|
const request = createTestJoinRequest('req1', 'team1', 'driver1');
|
|
await repository.saveJoinRequest(request);
|
|
const updated = createTestJoinRequest('req1', 'team1', 'driver1', new Date(), 'updated message');
|
|
const result = await repository.saveJoinRequest(updated);
|
|
expect(result).toEqual(updated);
|
|
expect(mockLogger.info).toHaveBeenCalledWith('[saveJoinRequest] Success - updated existing join request: req1.');
|
|
});
|
|
});
|
|
|
|
describe('removeJoinRequest', () => {
|
|
it('should remove join request by id', async () => {
|
|
const request = createTestJoinRequest('req1', 'team1', 'driver1');
|
|
await repository.saveJoinRequest(request);
|
|
await repository.removeJoinRequest('req1');
|
|
const requests = await repository.getJoinRequests('team1');
|
|
expect(requests).toHaveLength(0);
|
|
expect(mockLogger.info).toHaveBeenCalledWith('[removeJoinRequest] Success - removed join request req1 from team team1.');
|
|
});
|
|
|
|
it('should log warning if request not found', async () => {
|
|
await repository.removeJoinRequest('req1');
|
|
expect(mockLogger.warn).toHaveBeenCalledWith('[removeJoinRequest] Not found - join request with ID req1 not found for removal.');
|
|
});
|
|
});
|
|
}); |