Files
gridpilot.gg/apps/api/src/domain/race/presenters/AllRacesPageDataPresenter.test.ts
2026-01-16 21:44:26 +01:00

134 lines
4.0 KiB
TypeScript

import type { GetAllRacesPageDataResult } from '@core/racing/application/use-cases/GetAllRacesPageDataUseCase';
import { AllRacesPageDataPresenter } from './AllRacesPageDataPresenter';
describe('AllRacesPageDataPresenter', () => {
let presenter: AllRacesPageDataPresenter;
beforeEach(() => {
presenter = new AllRacesPageDataPresenter();
});
describe('present', () => {
it('should map result to response model', () => {
const result: GetAllRacesPageDataResult = {
races: [
{
id: 'race-1',
track: 'Track A',
car: 'Car A',
scheduledAt: '2024-01-01T10:00:00Z',
status: 'scheduled',
leagueId: 'league-1',
leagueName: 'League A',
strengthOfField: 1500,
},
{
id: 'race-2',
track: 'Track B',
car: 'Car B',
scheduledAt: '2024-01-02T10:00:00Z',
status: 'completed',
leagueId: 'league-2',
leagueName: 'League B',
strengthOfField: null,
},
],
filters: {
statuses: [
{ value: 'all', label: 'All Statuses' },
{ value: 'scheduled', label: 'Scheduled' },
],
leagues: [
{ id: 'league-1', name: 'League A' },
{ id: 'league-2', name: 'League B' },
],
},
};
presenter.present(result);
expect(presenter.responseModel).toEqual({
races: [
{
id: 'race-1',
track: 'Track A',
car: 'Car A',
scheduledAt: '2024-01-01T10:00:00Z',
status: 'scheduled',
leagueId: 'league-1',
leagueName: 'League A',
strengthOfField: 1500,
},
{
id: 'race-2',
track: 'Track B',
car: 'Car B',
scheduledAt: '2024-01-02T10:00:00Z',
status: 'completed',
leagueId: 'league-2',
leagueName: 'League B',
strengthOfField: null,
},
],
filters: {
statuses: [
{ value: 'all', label: 'All Statuses' },
{ value: 'scheduled', label: 'Scheduled' },
],
leagues: [
{ id: 'league-1', name: 'League A' },
{ id: 'league-2', name: 'League B' },
],
},
});
});
it('should handle empty races', () => {
const result: GetAllRacesPageDataResult = {
races: [],
filters: {
statuses: [{ value: 'all', label: 'All Statuses' }],
leagues: [],
},
};
presenter.present(result);
expect(presenter.responseModel.races).toEqual([]);
expect(presenter.responseModel.filters.leagues).toEqual([]);
});
});
describe('reset', () => {
it('should clear the model', () => {
const result: GetAllRacesPageDataResult = {
races: [{ id: 'race-1', track: 'Track A', car: 'Car A', scheduledAt: '2024-01-01', status: 'scheduled', leagueId: 'league-1', leagueName: 'League A', strengthOfField: null }],
filters: { statuses: [], leagues: [] },
};
presenter.present(result);
expect(presenter.responseModel).toBeDefined();
presenter.reset();
expect(() => presenter.responseModel).toThrow('Presenter not presented');
});
});
describe('responseModel', () => {
it('should throw error when accessed before present()', () => {
expect(() => presenter.responseModel).toThrow('Presenter not presented');
});
});
describe('viewModel', () => {
it('should return same as responseModel', () => {
const result: GetAllRacesPageDataResult = {
races: [{ id: 'race-1', track: 'Track A', car: 'Car A', scheduledAt: '2024-01-01', status: 'scheduled', leagueId: 'league-1', leagueName: 'League A', strengthOfField: null }],
filters: { statuses: [], leagues: [] },
};
presenter.present(result);
expect(presenter.viewModel).toEqual(presenter.responseModel);
});
});
});