Merge remote-tracking branch 'origin/main' into feat/all-mail-cross-account-views

# Conflicts:
#	stores/settings-store.ts
This commit is contained in:
Linus Rath
2026-06-24 16:05:00 +02:00
27 changed files with 251 additions and 39 deletions
@@ -0,0 +1,55 @@
import { describe, it, expect, beforeEach } from 'vitest';
import { useSettingsStore } from '../settings-store';
describe('settings-store per-account allMailFolderIds', () => {
beforeEach(() => {
useSettingsStore.setState({ allMailFolderIds: {} });
});
it('defaults to an empty record (every account "not configured")', () => {
expect(useSettingsStore.getState().allMailFolderIds).toEqual({});
});
it('keeps each account selection independent', () => {
useSettingsStore.setState({
allMailFolderIds: { 'acct-1': ['inbox', 'archive'], 'acct-2': ['sent'] },
});
const map = useSettingsStore.getState().allMailFolderIds;
expect(map['acct-1']).toEqual(['inbox', 'archive']);
expect(map['acct-2']).toEqual(['sent']);
// A third account remains unconfigured (no entry).
expect(map['acct-3']).toBeUndefined();
});
it('distinguishes explicit-empty ([] = no folders) from not-configured (undefined)', () => {
useSettingsStore.setState({ allMailFolderIds: { 'acct-1': [] } });
const map = useSettingsStore.getState().allMailFolderIds;
expect(map['acct-1']).toEqual([]); // explicit "no folders"
expect(map['acct-2']).toBeUndefined(); // never configured
});
describe('importSettings legacy-shape guard', () => {
it('ignores a legacy global array shape', () => {
useSettingsStore.setState({ allMailFolderIds: { 'acct-1': ['inbox'] } });
const ok = useSettingsStore.getState().importSettings(
JSON.stringify({ allMailFolderIds: ['inbox', 'sent'] }),
);
expect(ok).toBe(true);
// unchanged - the array shape was rejected
expect(useSettingsStore.getState().allMailFolderIds).toEqual({ 'acct-1': ['inbox'] });
});
it('ignores a null legacy value', () => {
useSettingsStore.setState({ allMailFolderIds: { 'acct-1': ['inbox'] } });
useSettingsStore.getState().importSettings(JSON.stringify({ allMailFolderIds: null }));
expect(useSettingsStore.getState().allMailFolderIds).toEqual({ 'acct-1': ['inbox'] });
});
it('accepts a proper per-account record', () => {
useSettingsStore.getState().importSettings(
JSON.stringify({ allMailFolderIds: { 'acct-9': ['inbox', 'spam'] } }),
);
expect(useSettingsStore.getState().allMailFolderIds).toEqual({ 'acct-9': ['inbox', 'spam'] });
});
});
});