Fix Story 1.3: StateStore spec compliance and minor cleanup
Critical Fix: - StateStore now uses global Hooks.callAll directly (per spec) - Removed hooks parameter from StateStore constructor - Updated module.js to pass only adapter.settings - Updated tests to stub globalThis.Hooks Minor Cleanup: - Fixed misleading warning in SocketHandler.registerPendingOp - Added clarifying comment for setMatrix _revision behavior Generated by Mistral Vibe. Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
This commit is contained in:
Vendored
+94
@@ -0,0 +1,94 @@
|
||||
/**
|
||||
* tests/fixtures/foundry-adapter.js
|
||||
*
|
||||
* GAME_STUB — frozen minimal game object for FoundryAdapter constructor tests.
|
||||
*
|
||||
* Mirrors the six game sub-objects that FoundryAdapter surfaces delegate to:
|
||||
* game.settings, game.socket, game.users, game.user, game.scenes
|
||||
*
|
||||
* `Hooks` is a standalone global — not part of game — and is stubbed
|
||||
* via `vi.stubGlobal('Hooks', HOOKS_STUB)` in individual test files.
|
||||
* `ui.notifications` is similarly a standalone global.
|
||||
*/
|
||||
|
||||
import { vi } from 'vitest';
|
||||
|
||||
/** Minimal game.settings stub. All methods are vi.fn(). */
|
||||
const SETTINGS_STUB = {
|
||||
register: vi.fn(),
|
||||
get: vi.fn().mockReturnValue(null),
|
||||
set: vi.fn().mockResolvedValue(undefined),
|
||||
};
|
||||
|
||||
/** Minimal game.socket stub. */
|
||||
const SOCKET_STUB = {
|
||||
emit: vi.fn(),
|
||||
on: vi.fn(),
|
||||
off: vi.fn(),
|
||||
};
|
||||
|
||||
/** A representative user object. */
|
||||
const GM_USER = Object.freeze({ id: 'gm-user-1', name: 'GM', isGM: true });
|
||||
const PLAYER_USER = Object.freeze({ id: 'player-user-1', name: 'Player', isGM: false });
|
||||
|
||||
/** Minimal game.users map-like stub. */
|
||||
const USERS_STUB = {
|
||||
get: vi.fn((id) => {
|
||||
if (id === GM_USER.id) return GM_USER;
|
||||
if (id === PLAYER_USER.id) return PLAYER_USER;
|
||||
return null;
|
||||
}),
|
||||
[Symbol.iterator]: vi.fn(function* () {
|
||||
yield GM_USER;
|
||||
yield PLAYER_USER;
|
||||
}),
|
||||
};
|
||||
|
||||
/** Minimal game.user (current user) stub. */
|
||||
const USER_STUB = Object.freeze({ id: GM_USER.id, name: GM_USER.name, isGM: true });
|
||||
|
||||
/** A representative scene object. */
|
||||
const ACTIVE_SCENE = Object.freeze({ id: 'scene-1', name: 'Test Scene' });
|
||||
|
||||
/** Minimal game.scenes stub. */
|
||||
const SCENES_STUB = {
|
||||
active: ACTIVE_SCENE,
|
||||
get: vi.fn((id) => (id === ACTIVE_SCENE.id ? ACTIVE_SCENE : null)),
|
||||
};
|
||||
|
||||
/**
|
||||
* Frozen minimal game object for FoundryAdapter constructor tests.
|
||||
* Reset individual stubs between tests with `vi.clearAllMocks()` or per-spy.
|
||||
*/
|
||||
export const GAME_STUB = Object.freeze({
|
||||
settings: SETTINGS_STUB,
|
||||
socket: SOCKET_STUB,
|
||||
users: USERS_STUB,
|
||||
user: USER_STUB,
|
||||
scenes: SCENES_STUB,
|
||||
});
|
||||
|
||||
/** Exported stubs for targeted assertions in tests. */
|
||||
export { SETTINGS_STUB, SOCKET_STUB, USERS_STUB, USER_STUB, SCENES_STUB, GM_USER, PLAYER_USER, ACTIVE_SCENE };
|
||||
|
||||
/**
|
||||
* Minimal Hooks stub for vi.stubGlobal('Hooks', HOOKS_STUB).
|
||||
* Each method is a vi.fn().
|
||||
*/
|
||||
export const HOOKS_STUB = {
|
||||
on: vi.fn(),
|
||||
once: vi.fn(),
|
||||
off: vi.fn(),
|
||||
callAll: vi.fn(),
|
||||
};
|
||||
|
||||
/**
|
||||
* Minimal ui.notifications stub for vi.stubGlobal('ui', UI_STUB).
|
||||
*/
|
||||
export const UI_STUB = Object.freeze({
|
||||
notifications: {
|
||||
info: vi.fn(),
|
||||
warn: vi.fn(),
|
||||
error: vi.fn(),
|
||||
},
|
||||
});
|
||||
Reference in New Issue
Block a user