mirror of
https://github.com/bretzel-app/crumbs.git
synced 2026-10-12 12:06:57 +02:00
Implement 4 user preferences (default note mode, default note color, hide footer, sidebar default state) with offline-first localStorage backed by server-side key-value storage. - Add user_preferences table (EAV pattern with unique user_id+key index) - Create server service with get/upsert operations - Add GET/PUT /api/preferences endpoints - Build Svelte 5 runes-based client store (.svelte.ts) - Wire preferences into app layout (footer toggle, sidebar state) - Wire default note mode/color into NoteEditor for new notes - Add Preferences tab as first item in Settings navigation - Add 7 unit tests and 4 E2E tests Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
63 lines
1.9 KiB
TypeScript
63 lines
1.9 KiB
TypeScript
import { describe, it, expect, beforeEach } from 'vitest';
|
|
import { createTestDb } from './db/test-helpers.js';
|
|
import type { Db } from './db/index.js';
|
|
import { getPreferences, upsertPreferences } from './preferences.js';
|
|
|
|
let db: Db;
|
|
const USER_ID = 1;
|
|
|
|
beforeEach(() => {
|
|
const testDb = createTestDb({ seedUser: true });
|
|
db = testDb.db;
|
|
});
|
|
|
|
describe('getPreferences', () => {
|
|
it('should return empty object for user with no preferences', () => {
|
|
const prefs = getPreferences(db, USER_ID);
|
|
expect(prefs).toEqual({});
|
|
});
|
|
});
|
|
|
|
describe('upsertPreferences', () => {
|
|
it('should insert new preferences', () => {
|
|
const result = upsertPreferences(db, USER_ID, {
|
|
defaultNoteMode: 'markdown',
|
|
hideFooter: 'true'
|
|
});
|
|
expect(result).toEqual({
|
|
defaultNoteMode: 'markdown',
|
|
hideFooter: 'true'
|
|
});
|
|
});
|
|
|
|
it('should update existing preferences', () => {
|
|
upsertPreferences(db, USER_ID, { defaultNoteMode: 'markdown' });
|
|
const result = upsertPreferences(db, USER_ID, { defaultNoteMode: 'richtext' });
|
|
expect(result.defaultNoteMode).toBe('richtext');
|
|
});
|
|
|
|
it('should handle partial updates without affecting other keys', () => {
|
|
upsertPreferences(db, USER_ID, {
|
|
defaultNoteMode: 'markdown',
|
|
hideFooter: 'true'
|
|
});
|
|
const result = upsertPreferences(db, USER_ID, { hideFooter: 'false' });
|
|
expect(result).toEqual({
|
|
defaultNoteMode: 'markdown',
|
|
hideFooter: 'false'
|
|
});
|
|
});
|
|
|
|
it('should keep preferences isolated between users', () => {
|
|
// Create a second user
|
|
db.run(
|
|
/* sql */ `INSERT INTO users (email, display_name, role, auth_provider, created_at) VALUES ('user2@test.com', 'User 2', 'user', 'password', ${Date.now()})`
|
|
);
|
|
upsertPreferences(db, USER_ID, { defaultNoteMode: 'markdown' });
|
|
upsertPreferences(db, 2, { defaultNoteMode: 'richtext' });
|
|
|
|
expect(getPreferences(db, USER_ID).defaultNoteMode).toBe('markdown');
|
|
expect(getPreferences(db, 2).defaultNoteMode).toBe('richtext');
|
|
});
|
|
});
|