Story 3.2 done

This commit is contained in:
2026-05-23 18:23:48 +02:00
parent d175f92806
commit a1e8886fce
66 changed files with 18258 additions and 1650 deletions
+160 -3
View File
@@ -29,6 +29,7 @@ describe('DirectorsBoard', () => {
let stateStore;
let controller;
let adapter;
let scenePresetManager;
let board;
beforeEach(() => {
@@ -39,8 +40,18 @@ describe('DirectorsBoard', () => {
get: vi.fn(() => ({ name: 'Alice', avatar: null })),
all: vi.fn(() => [{ id: 'u1' }]),
},
scenes: {
current: vi.fn(() => null),
},
};
board = new DirectorsBoard(stateStore, controller, adapter);
scenePresetManager = {
list: vi.fn(() => []),
save: vi.fn(),
load: vi.fn(),
_getSceneFlagData: vi.fn(() => null),
_getAutoApplyConfig: vi.fn(() => ({ enabled: false, presetName: null, preDelay: 0 })),
};
board = new DirectorsBoard(stateStore, controller, adapter, scenePresetManager);
});
describe('constructor', () => {
@@ -52,10 +63,16 @@ describe('DirectorsBoard', () => {
expect(board._hookId).toBeNull();
});
it('stores stateStore, controller, adapter references', () => {
it('stores stateStore, controller, adapter, scenePresetManager references', () => {
expect(board._stateStore).toBe(stateStore);
expect(board._controller).toBe(controller);
expect(board._adapter).toBe(adapter);
expect(board._scenePresetManager).toBe(scenePresetManager);
});
it('initializes _saveDialog and _loadDialog to null', () => {
expect(board._saveDialog).toBeNull();
expect(board._loadDialog).toBeNull();
});
});
@@ -362,8 +379,10 @@ describe('DirectorsBoard spotlight', () => {
};
adapter = {
users: { all: vi.fn(() => [{ id: 'u1' }, { id: 'u2' }, { id: 'u3' }]) },
scenes: { current: vi.fn(() => null) },
i18n: { localize: vi.fn((key) => key) },
};
board = new DirectorsBoard(stateStore, controller, adapter);
board = new DirectorsBoard(stateStore, controller, adapter, null);
board.rendered = false;
board.render = vi.fn();
});
@@ -448,4 +467,142 @@ describe('DirectorsBoard spotlight', () => {
expect(spy).toHaveBeenCalledWith('u2');
});
});
// --------------------------------------------------------------------------
// Preset Save/Load Tests
// --------------------------------------------------------------------------
describe('_prepareContext() with presets', () => {
it('should include presetCount in context', async () => {
// Create a board with a scenePresetManager that has presets
const presetManagerWithPresets = {
list: vi.fn().mockReturnValue([
{ name: 'Preset 1' },
{ name: 'Preset 2' },
]),
save: vi.fn(),
load: vi.fn(),
};
const boardWithPresets = new DirectorsBoard(stateStore, controller, adapter, presetManagerWithPresets);
const context = await boardWithPresets._prepareContext();
expect(context.presetCount).toBe(2);
expect(context.hasPresets).toBe(true);
});
it('should include hasPresets false when no presets', async () => {
// Create a board with a scenePresetManager that has no presets
const presetManagerNoPresets = {
list: vi.fn().mockReturnValue([]),
save: vi.fn(),
load: vi.fn(),
};
const boardNoPresets = new DirectorsBoard(stateStore, controller, adapter, presetManagerNoPresets);
const context = await boardNoPresets._prepareContext();
expect(context.presetCount).toBe(0);
expect(context.hasPresets).toBe(false);
});
it('should handle missing scenePresetManager gracefully', async () => {
const boardWithoutManager = new DirectorsBoard(stateStore, controller, adapter, null);
const context = await boardWithoutManager._prepareContext();
expect(context.presetCount).toBe(0);
expect(context.hasPresets).toBe(false);
});
});
describe('_onSavePreset()', () => {
it('should have _onSavePreset method defined', () => {
expect(board._onSavePreset).toBeDefined();
expect(typeof board._onSavePreset).toBe('function');
});
it('should have _onLoadPreset method defined', () => {
expect(board._onLoadPreset).toBeDefined();
expect(typeof board._onLoadPreset).toBe('function');
});
it('should have _closePresetDialogs method defined', () => {
expect(board._closePresetDialogs).toBeDefined();
expect(typeof board._closePresetDialogs).toBe('function');
});
});
describe('click handler with preset actions', () => {
it('should have click handler that processes save-preset action', () => {
// The click handler is created in _onRender, so we need to set up the element first
const mockElement = {
querySelectorAll: vi.fn().mockReturnValue([]),
querySelector: vi.fn(() => null),
addEventListener: vi.fn(),
removeEventListener: vi.fn(),
prepend: vi.fn(),
after: vi.fn(),
};
board.element = mockElement;
board.rendered = true;
board._onRender(mockElement);
const clickHandler = board._clickHandler;
expect(clickHandler).toBeDefined();
// Verify the handler processes the action by checking it doesn't throw
expect(typeof clickHandler).toBe('function');
});
it('should have _onSavePreset method', () => {
expect(board._onSavePreset).toBeDefined();
expect(typeof board._onSavePreset).toBe('function');
});
it('should have _onLoadPreset method', () => {
expect(board._onLoadPreset).toBeDefined();
expect(typeof board._onLoadPreset).toBe('function');
});
});
describe('cleanup on close', () => {
it('should call _closePresetDialogs on _onClose', async () => {
// Spy on the method
const closeSpy = vi.spyOn(board, '_closePresetDialogs');
// Call _onClose
await board._onClose({});
// _closePresetDialogs should be called
expect(closeSpy).toHaveBeenCalled();
closeSpy.mockRestore();
});
it('should close save dialog on _closePresetDialogs', () => {
// Use the board created in beforeEach
const saveDialog = { close: vi.fn().mockResolvedValue({}) };
board._saveDialog = saveDialog;
board._loadDialog = null;
board._closePresetDialogs();
expect(saveDialog.close).toHaveBeenCalled();
expect(board._saveDialog).toBeNull();
});
it('should close load dialog on _closePresetDialogs', () => {
// Use the board created in beforeEach
const loadDialog = { close: vi.fn().mockResolvedValue({}) };
board._saveDialog = null;
board._loadDialog = loadDialog;
board._closePresetDialogs();
expect(loadDialog.close).toHaveBeenCalled();
expect(board._loadDialog).toBeNull();
});
});
});