This commit is contained in:
1 parent
b0ba4227ac
commit
b76e311576
1 file changed
+106
@@ -62,6 +62,7 @@ describe('Application Settings', () => {
|
|||||||
afterEach(() => {
|
afterEach(() => {
|
||||||
fixture?.destroy();
|
fixture?.destroy();
|
||||||
vi.restoreAllMocks();
|
vi.restoreAllMocks();
|
||||||
|
vi.useRealTimers();
|
||||||
localStorage.clear();
|
localStorage.clear();
|
||||||
document.body.classList.remove('light-mode', 'dark-mode');
|
document.body.classList.remove('light-mode', 'dark-mode');
|
||||||
});
|
});
|
||||||
@@ -105,6 +106,111 @@ describe('Application Settings', () => {
|
|||||||
await createApp();
|
await createApp();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
it('keeps random starting balances unsaved through calculation and restores the first edited list', async () => {
|
||||||
|
vi.useFakeTimers({ toFake: ['Date'] });
|
||||||
|
vi.setSystemTime(new Date(2026, 9, 4, 12));
|
||||||
|
const random = vi
|
||||||
|
.spyOn(Math, 'random')
|
||||||
|
.mockReturnValueOnce(0)
|
||||||
|
.mockReturnValueOnce(0.5)
|
||||||
|
.mockReturnValue(1 - Number.EPSILON);
|
||||||
|
localStorage.removeItem('leaveBalances');
|
||||||
|
await revisitApp(true);
|
||||||
|
|
||||||
|
const root = fixture.nativeElement as HTMLElement;
|
||||||
|
expect(
|
||||||
|
Array.from(root.querySelectorAll<HTMLInputElement>('app-day-input input')).map(
|
||||||
|
(input) => input.value,
|
||||||
|
),
|
||||||
|
).toEqual([
|
||||||
|
'10',
|
||||||
|
'04/10/2026',
|
||||||
|
'04/10/2027',
|
||||||
|
'15',
|
||||||
|
'04/10/2026',
|
||||||
|
'04/10/2027',
|
||||||
|
'20',
|
||||||
|
'04/10/2026',
|
||||||
|
'04/10/2027',
|
||||||
|
]);
|
||||||
|
const types = await loader.getAllHarnesses(
|
||||||
|
MatSelectHarness.with({ selector: 'app-day-input mat-select' }),
|
||||||
|
);
|
||||||
|
expect(await Promise.all(types.map((type) => type.getValueText()))).toEqual([
|
||||||
|
'Paid Leave',
|
||||||
|
'RTT',
|
||||||
|
'Other',
|
||||||
|
]);
|
||||||
|
expect(calculate).toHaveBeenCalledOnce();
|
||||||
|
const initialRequest = calculate.mock.calls[0][0];
|
||||||
|
expect(initialRequest.balances.map((balance) => balance.quantity)).toEqual([10, 15, 20]);
|
||||||
|
expect(calculatePlanningInternal(initialRequest).kind).toBe('Plan');
|
||||||
|
await expect.poll(() => root.querySelector('.planning-status')).not.toBeNull();
|
||||||
|
expect(localStorage.getItem('leaveBalances')).toBeNull();
|
||||||
|
|
||||||
|
root.querySelector<HTMLButtonElement>('.calculate-button')!.click();
|
||||||
|
await fixture.whenStable();
|
||||||
|
expect(calculate).toHaveBeenCalledTimes(2);
|
||||||
|
expect(calculate.mock.calls[1][0].balances).toEqual(initialRequest.balances);
|
||||||
|
await expect.poll(() => root.querySelector('.planning-status')).not.toBeNull();
|
||||||
|
expect(localStorage.getItem('leaveBalances')).toBeNull();
|
||||||
|
|
||||||
|
const quantity = root.querySelector<HTMLInputElement>(
|
||||||
|
'app-day-input input[type="number"]',
|
||||||
|
)!;
|
||||||
|
quantity.value = '7';
|
||||||
|
quantity.dispatchEvent(new Event('input'));
|
||||||
|
await fixture.whenStable();
|
||||||
|
const saved = localStorage.getItem('leaveBalances');
|
||||||
|
expect(JSON.parse(saved!)).toMatchObject([
|
||||||
|
{ type: 'cp', numberOfDays: 7, availableDate: '2026-10-04', expiryDate: '2027-10-04' },
|
||||||
|
{
|
||||||
|
type: 'rtt',
|
||||||
|
numberOfDays: 15,
|
||||||
|
availableDate: '2026-10-04',
|
||||||
|
expiryDate: '2027-10-04',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'other',
|
||||||
|
numberOfDays: 20,
|
||||||
|
availableDate: '2026-10-04',
|
||||||
|
expiryDate: '2027-10-04',
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
|
||||||
|
random.mockReturnValue(0);
|
||||||
|
await revisitApp(true);
|
||||||
|
expect(
|
||||||
|
Array.from(
|
||||||
|
fixture.nativeElement.querySelectorAll('app-day-input input[type="number"]'),
|
||||||
|
(input) => (input as HTMLInputElement).value,
|
||||||
|
),
|
||||||
|
).toEqual(['7', '15', '20']);
|
||||||
|
expect(calculate).toHaveBeenCalledOnce();
|
||||||
|
expect(calculate.mock.calls[0][0].balances).toEqual(
|
||||||
|
initialRequest.balances.map((balance, index) =>
|
||||||
|
index === 0 ? { ...balance, quantity: 7 } : balance,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
expect(localStorage.getItem('leaveBalances')).toBe(saved);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('calculates with a saved empty balance list without generating replacement rows', async () => {
|
||||||
|
localStorage.setItem('leaveBalances', '[]');
|
||||||
|
const random = vi.spyOn(Math, 'random');
|
||||||
|
await revisitApp(true);
|
||||||
|
|
||||||
|
expect(fixture.nativeElement.querySelector('app-day-input')).toBeNull();
|
||||||
|
expect(calculate).toHaveBeenCalledOnce();
|
||||||
|
expect(calculate.mock.calls[0][0].balances).toEqual([]);
|
||||||
|
expect(calculatePlanningInternal(calculate.mock.calls[0][0]).kind).toBe('Plan');
|
||||||
|
await expect
|
||||||
|
.poll(() => fixture.nativeElement.querySelector('.planning-status'))
|
||||||
|
.not.toBeNull();
|
||||||
|
expect(random).not.toHaveBeenCalled();
|
||||||
|
expect(localStorage.getItem('leaveBalances')).toBe('[]');
|
||||||
|
});
|
||||||
|
|
||||||
it('passes restored expired balances to the initial calculation without rewriting storage', () => {
|
it('passes restored expired balances to the initial calculation without rewriting storage', () => {
|
||||||
const root = fixture.nativeElement as HTMLElement;
|
const root = fixture.nativeElement as HTMLElement;
|
||||||
expect(
|
expect(
|
||||||
|
|||||||
Reference in new issue
Block a user