Files
gridpilot.gg/apps/website/lib/view-models/TeamJoinRequestViewModel.test.ts
Marc Mintel 6c07abe5e7
Some checks failed
Contract Testing / contract-snapshot (pull_request) Has been cancelled
Contract Testing / contract-tests (pull_request) Has been cancelled
view data fixes
2026-01-25 00:12:30 +01:00

88 lines
2.5 KiB
TypeScript

import type { TeamJoinRequestDTO } from '../types/generated/TeamJoinRequestDTO';
import { describe, expect, it } from 'vitest';
import { TeamJoinRequestViewModel } from './TeamJoinRequestViewModel';
const createTeamJoinRequestDto = (overrides: Partial<TeamJoinRequestDTO> = {}): TeamJoinRequestDTO => ({
requestId: 'request-1',
teamId: 'team-1',
driverId: 'driver-1',
driverName: 'Driver One',
status: 'pending',
requestedAt: '2024-01-01T12:00:00Z',
avatarUrl: 'https://example.com/avatar.jpg',
...overrides,
});
describe('TeamJoinRequestViewModel', () => {
it('maps fields from DTO', () => {
const dto = createTeamJoinRequestDto({ requestId: 'req-123', driverId: 'driver-123' });
const vm = new TeamJoinRequestViewModel({
...dto,
currentUserId: 'current-user',
isOwner: true,
});
expect(vm.id).toBe('req-123');
expect(vm.teamId).toBe('team-1');
expect(vm.driverId).toBe('driver-123');
expect(vm.requestedAt).toBe('2024-01-01T12:00:00Z');
});
it('allows approval only for owners', () => {
const dto = createTeamJoinRequestDto();
const ownerVm = new TeamJoinRequestViewModel({
...dto,
currentUserId: 'owner-user',
isOwner: true,
});
const nonOwnerVm = new TeamJoinRequestViewModel({
...dto,
currentUserId: 'regular-user',
isOwner: false,
});
expect(ownerVm.canApprove).toBe(true);
expect(nonOwnerVm.canApprove).toBe(false);
});
it('exposes a pending status with yellow color', () => {
const dto = createTeamJoinRequestDto({ status: 'pending' });
const vm = new TeamJoinRequestViewModel({
...dto,
currentUserId: 'owner-user',
isOwner: true,
});
expect(vm.status).toBe('Pending');
expect(vm.statusColor).toBe('yellow');
});
it('provides approve and reject button labels', () => {
const dto = createTeamJoinRequestDto();
const vm = new TeamJoinRequestViewModel({
...dto,
currentUserId: 'owner-user',
isOwner: true,
});
expect(vm.approveButtonText).toBe('Approve');
expect(vm.rejectButtonText).toBe('Reject');
});
it('formats requestedAt as localized date-time', () => {
const dto = createTeamJoinRequestDto({ requestedAt: '2024-01-01T12:00:00Z' });
const vm = new TeamJoinRequestViewModel({
...dto,
currentUserId: 'owner-user',
isOwner: true,
});
const formatted = vm.formattedRequestedAt;
expect(typeof formatted).toBe('string');
expect(formatted.length).toBeGreaterThan(0);
});
});