mirror of
https://github.com/amitwh/markdown-converter.git
synced 2026-08-02 18:10:18 +05:30
- add userBindings map (commandId -> combo string) - setUserBinding / clearUserBinding / getUserBinding actions - persist middleware with partialize: handlers are runtime-only, userBindings are serialized - TDD: 7 persistence tests + existing 10 command-store tests still pass - 162/162 total tests pass
60 lines
2.4 KiB
TypeScript
60 lines
2.4 KiB
TypeScript
import { describe, it, expect, beforeEach, vi } from 'vitest';
|
|
import { useCommandStore } from '@/stores/command-store';
|
|
|
|
describe('useCommandStore — user bindings persistence', () => {
|
|
beforeEach(() => {
|
|
localStorage.clear();
|
|
useCommandStore.setState({
|
|
handlers: {},
|
|
userBindings: {},
|
|
});
|
|
});
|
|
|
|
it('starts with empty userBindings', () => {
|
|
expect(useCommandStore.getState().userBindings).toEqual({});
|
|
});
|
|
|
|
it('setUserBinding stores a combo for a command id', () => {
|
|
useCommandStore.getState().setUserBinding('file.save', 'mod+shift+s');
|
|
expect(useCommandStore.getState().userBindings['file.save']).toBe('mod+shift+s');
|
|
});
|
|
|
|
it('setUserBinding overwrites an existing binding for the same command', () => {
|
|
useCommandStore.getState().setUserBinding('file.save', 'mod+shift+s');
|
|
useCommandStore.getState().setUserBinding('file.save', 'mod+alt+s');
|
|
expect(useCommandStore.getState().userBindings['file.save']).toBe('mod+alt+s');
|
|
});
|
|
|
|
it('clearUserBinding removes a binding', () => {
|
|
useCommandStore.getState().setUserBinding('file.save', 'mod+shift+s');
|
|
useCommandStore.getState().clearUserBinding('file.save');
|
|
expect(useCommandStore.getState().userBindings['file.save']).toBeUndefined();
|
|
});
|
|
|
|
it('clearUserBinding on a missing id is a no-op', () => {
|
|
expect(() => useCommandStore.getState().clearUserBinding('does.not.exist')).not.toThrow();
|
|
});
|
|
|
|
it('getUserBinding returns the combo or undefined', () => {
|
|
useCommandStore.getState().setUserBinding('file.save', 'mod+shift+s');
|
|
expect(useCommandStore.getState().getUserBinding('file.save')).toBe('mod+shift+s');
|
|
expect(useCommandStore.getState().getUserBinding('does.not.exist')).toBeUndefined();
|
|
});
|
|
|
|
it('persists userBindings to localStorage and restores on next mount', async () => {
|
|
useCommandStore.getState().setUserBinding('file.save', 'mod+shift+s');
|
|
useCommandStore.getState().setUserBinding('view.toggleSidebar', 'mod+b');
|
|
|
|
// Force the persist middleware to flush
|
|
await useCommandStore.persist?.flush?.();
|
|
|
|
const stored = JSON.parse(localStorage.getItem('mc-command-store') ?? '{}');
|
|
expect(stored.state.userBindings).toEqual({
|
|
'file.save': 'mod+shift+s',
|
|
'view.toggleSidebar': 'mod+b',
|
|
});
|
|
// Handlers must NOT be persisted (functions aren't serializable)
|
|
expect(stored.state.handlers).toBeUndefined();
|
|
});
|
|
});
|