@lovebowls/leagueelements
Version:
League Elements package for LoveBowls
276 lines (235 loc) • 8.38 kB
JavaScript
// leagueResetModal.test.js
import '../leagueResetModal/leagueResetModal.js';
import { jest } from '@jest/globals';
// Mock shared styles to avoid import issues in tests
jest.mock('../shared-styles.js', () => ({
buttonStyles: '',
modalStyles: '',
formStyles: '',
mobileStyles: ''
}));
// Mock the League import
jest.mock('@lovebowls/leaguejs', () => ({
League: jest.fn().mockImplementation((data) => {
const instance = {
_id: data._id,
name: data.name,
settings: data.settings,
teams: data.teams,
matches: data.matches || [],
initialiseFixtures: jest.fn().mockImplementation(() => {
// Generate some mock matches for testing
instance.matches = [
{
_id: 'match1',
homeTeam: data.teams[0],
awayTeam: data.teams[1],
date: new Date().toISOString(),
result: null
},
{
_id: 'match2',
homeTeam: data.teams[2],
awayTeam: data.teams[3],
date: new Date().toISOString(),
result: null
}
];
return true;
})
};
return instance;
})
}));
describe('LeagueResetModal', () => {
let element;
let mockLeague;
beforeEach(() => {
element = document.createElement('league-reset-modal');
document.body.appendChild(element);
// Create a mock League object
mockLeague = {
_id: 'test-league-1',
name: 'Test League',
teams: [
{ _id: 'team1', name: 'Team 1' },
{ _id: 'team2', name: 'Team 2' },
{ _id: 'team3', name: 'Team 3' },
{ _id: 'team4', name: 'Team 4' }
],
settings: {
timesTeamsPlayOther: 2,
pointsForWin: 3,
pointsForDraw: 1,
pointsForLoss: 0
},
matches: []
};
});
afterEach(() => {
document.body.removeChild(element);
});
it('should initialize with default properties', () => {
expect(element.open).toBe(false);
expect(element.isMobile).toBe(false);
expect(element.leagueName).toBe('Unknown League'); // Default when no data
expect(element.teamCount).toBe(0); // Default when no data
});
it('should set properties correctly via data attribute', () => {
element.open = true;
element.isMobile = true;
element.data = mockLeague;
expect(element.open).toBe(true);
expect(element.isMobile).toBe(true);
expect(element.leagueName).toBe('Test League');
expect(element.teamCount).toBe(4);
expect(element.leagueSettings.timesTeamsPlayOther).toBe(2);
});
it('should handle JSON string data', () => {
element.data = JSON.stringify(mockLeague);
expect(element.leagueName).toBe('Test League');
expect(element.teamCount).toBe(4);
expect(element.leagueSettings.timesTeamsPlayOther).toBe(2);
});
it('should calculate estimated matches correctly', () => {
element.data = mockLeague;
// 4 teams: (4 * 3) / 2 * 2 = 12 matches (corrected formula)
const estimatedMatches = element._calculateEstimatedMatches();
expect(estimatedMatches).toBe(12);
});
it('should validate form correctly', () => {
element.data = mockLeague;
// Set up form data with a future date
const futureDate = new Date();
futureDate.setDate(futureDate.getDate() + 7); // 7 days from now
element._formData = {
startDate: futureDate.toISOString().split('T')[0], // Format as YYYY-MM-DD
maxMatchesPerDay: '2',
schedulingPattern: 'interval',
intervalNumber: 1,
intervalUnit: 'weeks',
selectedDays: []
};
const validation = element._validateForm();
expect(validation.isValid).toBe(true);
});
it('should validate start date requirement', () => {
element.data = mockLeague;
element._formData = {
startDate: '',
maxMatchesPerDay: '',
schedulingPattern: 'interval',
intervalNumber: 1,
intervalUnit: 'weeks',
selectedDays: []
};
const validation = element._validateForm();
expect(validation.isValid).toBe(false);
expect(validation.error).toBe('Start date is required.');
});
it('should validate day of week selection', () => {
element.data = mockLeague;
// Use a future date
const futureDate = new Date();
futureDate.setDate(futureDate.getDate() + 7); // 7 days from now
element._formData = {
startDate: futureDate.toISOString().split('T')[0], // Format as YYYY-MM-DD
maxMatchesPerDay: '',
schedulingPattern: 'dayOfWeek',
intervalNumber: 1,
intervalUnit: 'weeks',
selectedDays: []
};
const validation = element._validateForm();
expect(validation.isValid).toBe(false);
expect(validation.error).toBe('At least one day of the week must be selected.');
});
it('should dispatch reset-save event with correct data', () => {
let eventData = null;
element.addEventListener('reset-save', (e) => {
eventData = e.detail;
});
element.data = mockLeague;
// Use a future date
const futureDate = new Date();
futureDate.setDate(futureDate.getDate() + 7); // 7 days from now
element._formData = {
startDate: futureDate.toISOString().split('T')[0], // Format as YYYY-MM-DD
maxMatchesPerDay: '2',
schedulingPattern: 'interval',
intervalNumber: 1,
intervalUnit: 'weeks',
selectedDays: []
};
element._onOk();
expect(eventData).toBeTruthy();
expect(eventData.matches).toBeDefined();
expect(eventData.estimatedMatches).toBeDefined();
expect(eventData.dateRange).toBeDefined();
});
it('should dispatch reset-cancel event', () => {
let eventFired = false;
element.addEventListener('reset-cancel', () => {
eventFired = true;
});
element._onCancel();
expect(eventFired).toBe(true);
});
it('should handle attribute changes', () => {
element.setAttribute('open', 'true');
element.setAttribute('is-mobile', 'true');
element.setAttribute('data', JSON.stringify(mockLeague));
expect(element.open).toBe(true);
expect(element.isMobile).toBe(true);
expect(element.leagueName).toBe('Test League');
expect(element.teamCount).toBe(4);
});
it('should calculate date range correctly for interval scheduling', () => {
element.data = mockLeague;
// Use a future date
const futureDate = new Date();
futureDate.setDate(futureDate.getDate() + 7); // 7 days from now
element._formData = {
startDate: futureDate.toISOString().split('T')[0], // Format as YYYY-MM-DD
maxMatchesPerDay: '2',
schedulingPattern: 'interval',
intervalNumber: 1,
intervalUnit: 'weeks',
selectedDays: []
};
const dateRange = element._calculateDateRange();
expect(dateRange).toBeTruthy();
expect(dateRange.start).toBeTruthy();
expect(dateRange.end).toBeTruthy();
});
it('should generate preview text correctly', () => {
element.data = mockLeague;
// Use a future date
const futureDate = new Date();
futureDate.setDate(futureDate.getDate() + 7); // 7 days from now
element._formData = {
startDate: futureDate.toISOString().split('T')[0], // Format as YYYY-MM-DD
maxMatchesPerDay: '2',
schedulingPattern: 'interval',
intervalNumber: 1,
intervalUnit: 'weeks',
selectedDays: []
};
const previewText = element._getPreviewText();
expect(previewText).toContain('Will schedule 12 matches');
expect(previewText).toContain('from');
expect(previewText).toContain('to approximately');
});
it('should handle null/empty data gracefully', () => {
element.data = null;
expect(element.leagueName).toBe('Unknown League');
expect(element.teamCount).toBe(0);
expect(element.leagueSettings).toEqual({});
});
it('should handle invalid JSON data gracefully', () => {
element.data = 'invalid json';
expect(element.leagueName).toBe('Unknown League');
expect(element.teamCount).toBe(0);
expect(element.leagueSettings).toEqual({});
});
});