mirror of
https://github.com/cpvalente/ontime.git
synced 2026-09-13 10:09:35 +00:00
refactor: simplify restore point
This commit is contained in:
committed by
Alex Christoffer Rasmussen
parent
bc1b3800c8
commit
1866e5e78d
@@ -0,0 +1,63 @@
|
||||
import { Playback } from 'ontime-types';
|
||||
|
||||
import { isRestorePoint } from '../restore.parser.js';
|
||||
import { RestorePoint } from '../restore.type.js';
|
||||
|
||||
describe('isRestorePoint()', () => {
|
||||
it('validates a well defined object', () => {
|
||||
let restorePoint: RestorePoint = {
|
||||
playback: Playback.Roll,
|
||||
selectedEventId: '123',
|
||||
startedAt: 1,
|
||||
addedTime: 2,
|
||||
pausedAt: 3,
|
||||
firstStart: 1,
|
||||
};
|
||||
expect(isRestorePoint(restorePoint)).toBe(true);
|
||||
|
||||
restorePoint = {
|
||||
playback: Playback.Roll,
|
||||
selectedEventId: '123',
|
||||
startedAt: null,
|
||||
addedTime: 0,
|
||||
pausedAt: null,
|
||||
firstStart: 1,
|
||||
};
|
||||
expect(isRestorePoint(restorePoint)).toBe(true);
|
||||
});
|
||||
|
||||
describe('rejects a badly formatted file', () => {
|
||||
it('with invalid playback value', () => {
|
||||
const restorePoint = {
|
||||
playback: 'unknown',
|
||||
selectedEventId: '123',
|
||||
startedAt: null,
|
||||
addedTime: 0,
|
||||
pausedAt: null,
|
||||
groupStartAt: 10,
|
||||
};
|
||||
expect(isRestorePoint(restorePoint)).toBe(false);
|
||||
});
|
||||
it('with missing playback value', () => {
|
||||
const restorePoint = {
|
||||
selectedEventId: '123',
|
||||
startedAt: null,
|
||||
addedTime: 0,
|
||||
pausedAt: null,
|
||||
groupStartAt: 10,
|
||||
};
|
||||
expect(isRestorePoint(restorePoint)).toBe(false);
|
||||
});
|
||||
it('with incorrect value', () => {
|
||||
const restorePoint = {
|
||||
playback: Playback.Roll,
|
||||
selectedEventId: '123',
|
||||
startedAt: 'testing',
|
||||
addedTime: 0,
|
||||
pausedAt: null,
|
||||
groupStartAt: 10,
|
||||
};
|
||||
expect(isRestorePoint(restorePoint)).toBe(false);
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,124 @@
|
||||
/* eslint-disable @typescript-eslint/no-explicit-any */
|
||||
import { Playback } from 'ontime-types';
|
||||
|
||||
import { vi } from 'vitest';
|
||||
|
||||
import { RestorePoint } from '../restore.type.js';
|
||||
import { restoreService } from '../restore.service.js';
|
||||
|
||||
describe('restoreService', () => {
|
||||
describe('load()', () => {
|
||||
it('loads working file with times', async () => {
|
||||
const expected: RestorePoint = {
|
||||
playback: Playback.Play,
|
||||
selectedEventId: 'da5b4',
|
||||
startedAt: 1234,
|
||||
addedTime: 5678,
|
||||
pausedAt: 9087,
|
||||
firstStart: 1234,
|
||||
};
|
||||
|
||||
const mockRead = vi.fn().mockResolvedValue(expected);
|
||||
|
||||
const testLoad = await restoreService.load(mockRead);
|
||||
expect(testLoad).toStrictEqual(expected);
|
||||
expect(mockRead).toHaveBeenCalledOnce();
|
||||
});
|
||||
|
||||
it('loads working file without times', async () => {
|
||||
const expected: RestorePoint = {
|
||||
playback: Playback.Stop,
|
||||
selectedEventId: null,
|
||||
startedAt: null,
|
||||
addedTime: 0,
|
||||
pausedAt: null,
|
||||
firstStart: 1234,
|
||||
};
|
||||
|
||||
const mockRead = vi.fn().mockResolvedValue(expected);
|
||||
|
||||
const testLoad = await restoreService.load(mockRead);
|
||||
expect(testLoad).toStrictEqual(expected);
|
||||
expect(mockRead).toHaveBeenCalledOnce();
|
||||
});
|
||||
|
||||
it('does not load wrong play state', async () => {
|
||||
const expected = {
|
||||
// Missing required field 'firstStart' to make validation fail
|
||||
playback: 'does-not-exist',
|
||||
selectedEventId: 'da5b4',
|
||||
startedAt: 1234,
|
||||
addedTime: 1234,
|
||||
pausedAt: 1234,
|
||||
groupStartAt: 10,
|
||||
};
|
||||
|
||||
const mockRead = vi.fn().mockResolvedValue(expected);
|
||||
|
||||
const testLoad = await restoreService.load(mockRead);
|
||||
// Should return null because isRestorePoint validation fails
|
||||
expect(testLoad).toBe(null);
|
||||
expect(mockRead).toHaveBeenCalledOnce();
|
||||
});
|
||||
|
||||
it('returns null when file read fails', async () => {
|
||||
const mockRead = vi.fn().mockRejectedValue(new Error('File not found'));
|
||||
|
||||
const testLoad = await restoreService.load(mockRead);
|
||||
expect(testLoad).toBe(null);
|
||||
expect(mockRead).toHaveBeenCalledOnce();
|
||||
});
|
||||
});
|
||||
|
||||
describe('save()', () => {
|
||||
it('saves data to file', async () => {
|
||||
const testData: RestorePoint = {
|
||||
playback: Playback.Play,
|
||||
selectedEventId: '1234',
|
||||
startedAt: 1234,
|
||||
addedTime: 1234,
|
||||
pausedAt: 1234,
|
||||
firstStart: 1234,
|
||||
};
|
||||
|
||||
const mockWrite = vi.fn().mockResolvedValue(undefined);
|
||||
|
||||
await restoreService.save(testData, mockWrite);
|
||||
expect(mockWrite).toHaveBeenCalledWith(testData);
|
||||
});
|
||||
|
||||
it('handles write failures gracefully', async () => {
|
||||
const testData: RestorePoint = {
|
||||
playback: Playback.Pause,
|
||||
selectedEventId: '5678',
|
||||
startedAt: 5678,
|
||||
addedTime: 5678,
|
||||
pausedAt: 5678,
|
||||
firstStart: 5678,
|
||||
};
|
||||
|
||||
const mockWrite = vi.fn().mockRejectedValue(new Error('Write failed'));
|
||||
|
||||
// Should not throw, and should still call write
|
||||
await expect(restoreService.save(testData, mockWrite)).resolves.toBeUndefined();
|
||||
expect(mockWrite).toHaveBeenCalledWith(testData);
|
||||
});
|
||||
});
|
||||
|
||||
describe('clear()', () => {
|
||||
it('clears the restore file', async () => {
|
||||
const mockWrite = vi.fn().mockResolvedValue(undefined);
|
||||
|
||||
await restoreService.clear(mockWrite);
|
||||
expect(mockWrite).toHaveBeenCalledWith(null);
|
||||
});
|
||||
|
||||
it('handles clear failures gracefully', async () => {
|
||||
const mockWrite = vi.fn().mockRejectedValue(new Error('Clear failed'));
|
||||
|
||||
// Should not throw
|
||||
await expect(restoreService.clear(mockWrite)).resolves.toBeUndefined();
|
||||
expect(mockWrite).toHaveBeenCalledWith(null);
|
||||
});
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user