134 lines
4.0 KiB
TypeScript
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);
|
|
});
|
|
});
|
|
}); |