website refactor

This commit is contained in:
2026-01-17 22:55:03 +01:00
parent 64d9e7fd16
commit 69d4cce7f1
64 changed files with 1146 additions and 1014 deletions

View File

@@ -1,4 +1,4 @@
import { describe, it, expect, vi } from 'vitest';
import { describe, it, expect, vi, beforeEach } from 'vitest';
import { TeamJoinService } from './TeamJoinService';
import type { TeamsApiClient } from '@/lib/api/teams/TeamsApiClient';
@@ -44,10 +44,12 @@ describe('TeamJoinService', () => {
const result = await service.getJoinRequests('team-1', 'user-1', true);
expect(mockApiClient.getJoinRequests).toHaveBeenCalledWith('team-1');
expect(result).toHaveLength(2);
expect(result.isOk()).toBe(true);
const viewModels = result.unwrap();
expect(viewModels).toHaveLength(2);
const first = result[0];
const second = result[1];
const first = viewModels[0];
const second = viewModels[1];
expect(first).toBeDefined();
expect(second).toBeDefined();
@@ -77,20 +79,26 @@ describe('TeamJoinService', () => {
const result = await service.getJoinRequests('team-1', 'user-1', false);
expect(result[0]).toBeDefined();
expect(result[0]!.canApprove).toBe(false);
expect(result.isOk()).toBe(true);
const viewModels = result.unwrap();
expect(viewModels[0]).toBeDefined();
expect(viewModels[0]!.canApprove).toBe(false);
});
});
describe('approveJoinRequest', () => {
it('should throw not implemented error', async () => {
await expect(service.approveJoinRequest()).rejects.toThrow('Not implemented: API endpoint for approving join requests');
const result = await service.approveJoinRequest();
expect(result.isErr()).toBe(true);
expect(result.getError().message).toBe('Not implemented: API endpoint for approving join requests');
});
});
describe('rejectJoinRequest', () => {
it('should throw not implemented error', async () => {
await expect(service.rejectJoinRequest()).rejects.toThrow('Not implemented: API endpoint for rejecting join requests');
const result = await service.rejectJoinRequest();
expect(result.isErr()).toBe(true);
expect(result.getError().message).toBe('Not implemented: API endpoint for rejecting join requests');
});
});
});

View File

@@ -46,18 +46,21 @@ describe('TeamService', () => {
const result = await service.getAllTeams();
expect(mockApiClient.getAll).toHaveBeenCalled();
expect(result).toHaveLength(1);
expect(result[0]).toBeInstanceOf(TeamSummaryViewModel);
expect(result[0].id).toBe('team-1');
expect(result[0].name).toBe('Test Team');
expect(result[0].tag).toBe('TT');
expect(result.isOk()).toBe(true);
const teams = result.unwrap();
expect(teams).toHaveLength(1);
expect(teams[0].id).toBe('team-1');
expect(teams[0].name).toBe('Test Team');
expect(teams[0].tag).toBe('TT');
});
it('should throw error when apiClient.getAll fails', async () => {
const error = new Error('API call failed');
mockApiClient.getAll.mockRejectedValue(error);
await expect(service.getAllTeams()).rejects.toThrow('API call failed');
const result = await service.getAllTeams();
expect(result.isErr()).toBe(true);
expect(result.getError().message).toBe('API call failed');
});
});
@@ -89,26 +92,30 @@ describe('TeamService', () => {
const result = await service.getTeamDetails('team-1', 'user-1');
expect(mockApiClient.getDetails).toHaveBeenCalledWith('team-1');
expect(result).toBeInstanceOf(TeamDetailsViewModel);
expect(result?.id).toBe('team-1');
expect(result?.name).toBe('Test Team');
expect(result?.tag).toBe('TT');
expect(result.isOk()).toBe(true);
const details = result.unwrap();
expect(details.team.id).toBe('team-1');
expect(details.team.name).toBe('Test Team');
expect(details.team.tag).toBe('TT');
});
it('should return null when apiClient.getDetails returns null', async () => {
mockApiClient.getDetails.mockResolvedValue(null);
mockApiClient.getDetails.mockResolvedValue(null as any);
const result = await service.getTeamDetails('team-1', 'user-1');
expect(mockApiClient.getDetails).toHaveBeenCalledWith('team-1');
expect(result).toBeNull();
expect(result.isErr()).toBe(true);
expect(result.getError().type).toBe('notFound');
});
it('should throw error when apiClient.getDetails fails', async () => {
const error = new Error('API call failed');
mockApiClient.getDetails.mockRejectedValue(error);
await expect(service.getTeamDetails('team-1', 'user-1')).rejects.toThrow('API call failed');
const result = await service.getTeamDetails('team-1', 'user-1');
expect(result.isErr()).toBe(true);
expect(result.getError().message).toBe('API call failed');
});
});
@@ -136,17 +143,21 @@ describe('TeamService', () => {
const result = await service.getTeamMembers('team-1', 'user-1', 'owner-1');
expect(mockApiClient.getMembers).toHaveBeenCalledWith('team-1');
expect(result).toHaveLength(1);
expect(result[0]).toBeInstanceOf(TeamMemberViewModel);
expect(result[0].driverId).toBe('driver-1');
expect(result[0].role).toBe('member');
expect(result.isOk()).toBe(true);
const members = result.unwrap();
expect(members).toHaveLength(1);
expect(members[0]).toBeInstanceOf(TeamMemberViewModel);
expect(members[0].driverId).toBe('driver-1');
expect(members[0].role).toBe('member');
});
it('should throw error when apiClient.getMembers fails', async () => {
const error = new Error('API call failed');
mockApiClient.getMembers.mockRejectedValue(error);
await expect(service.getTeamMembers('team-1', 'user-1', 'owner-1')).rejects.toThrow('API call failed');
const result = await service.getTeamMembers('team-1', 'user-1', 'owner-1');
expect(result.isErr()).toBe(true);
expect(result.getError().message).toBe('API call failed');
});
});
@@ -161,7 +172,8 @@ describe('TeamService', () => {
const result = await service.createTeam(input);
expect(mockApiClient.create).toHaveBeenCalledWith(input);
expect(result).toEqual(mockOutput);
expect(result.isOk()).toBe(true);
expect(result.unwrap()).toEqual(mockOutput);
});
it('should throw error when apiClient.create fails', async () => {
@@ -170,7 +182,9 @@ describe('TeamService', () => {
const error = new Error('API call failed');
mockApiClient.create.mockRejectedValue(error);
await expect(service.createTeam(input)).rejects.toThrow('API call failed');
const result = await service.createTeam(input);
expect(result.isErr()).toBe(true);
expect(result.getError().message).toBe('API call failed');
});
});
@@ -185,7 +199,8 @@ describe('TeamService', () => {
const result = await service.updateTeam('team-1', input);
expect(mockApiClient.update).toHaveBeenCalledWith('team-1', input);
expect(result).toEqual(mockOutput);
expect(result.isOk()).toBe(true);
expect(result.unwrap()).toEqual(mockOutput);
});
it('should throw error when apiClient.update fails', async () => {
@@ -194,7 +209,9 @@ describe('TeamService', () => {
const error = new Error('API call failed');
mockApiClient.update.mockRejectedValue(error);
await expect(service.updateTeam('team-1', input)).rejects.toThrow('API call failed');
const result = await service.updateTeam('team-1', input);
expect(result.isErr()).toBe(true);
expect(result.getError().message).toBe('API call failed');
});
});
@@ -226,9 +243,11 @@ describe('TeamService', () => {
const result = await service.getDriverTeam('driver-1');
expect(mockApiClient.getDriverTeam).toHaveBeenCalledWith('driver-1');
expect(result?.teamId).toBe('team-1');
expect(result?.teamName).toBe('Test Team');
expect(result?.role).toBe('member');
expect(result.isOk()).toBe(true);
const data = result.unwrap();
expect(data?.teamId).toBe('team-1');
expect(data?.teamName).toBe('Test Team');
expect(data?.role).toBe('member');
});
it('should return null when apiClient.getDriverTeam returns null', async () => {
@@ -237,14 +256,17 @@ describe('TeamService', () => {
const result = await service.getDriverTeam('driver-1');
expect(mockApiClient.getDriverTeam).toHaveBeenCalledWith('driver-1');
expect(result).toBeNull();
expect(result.isOk()).toBe(true);
expect(result.unwrap()).toBeNull();
});
it('should throw error when apiClient.getDriverTeam fails', async () => {
const error = new Error('API call failed');
mockApiClient.getDriverTeam.mockRejectedValue(error);
await expect(service.getDriverTeam('driver-1')).rejects.toThrow('API call failed');
const result = await service.getDriverTeam('driver-1');
expect(result.isErr()).toBe(true);
expect(result.getError().message).toBe('API call failed');
});
});
});