feat(hooks): useThemePreference 扩展 compact 状态与同步
This commit is contained in:
@@ -1,12 +1,15 @@
|
||||
import { describe, expect, test } from "bun:test";
|
||||
|
||||
import {
|
||||
COMPACT_STORAGE_KEY,
|
||||
getSystemPrefersDark,
|
||||
parseThemePreference,
|
||||
readCompactPreference,
|
||||
readThemePreference,
|
||||
resolveEffectiveTheme,
|
||||
THEME_MEDIA_QUERY,
|
||||
THEME_PREFERENCE_STORAGE_KEY,
|
||||
writeCompactPreference,
|
||||
writeThemePreference,
|
||||
} from "../../../src/web/shared/hooks/use-theme-preference";
|
||||
|
||||
@@ -75,3 +78,60 @@ describe("theme preference 纯逻辑", () => {
|
||||
expect(resolveEffectiveTheme("system", false)).toBe("light");
|
||||
});
|
||||
});
|
||||
|
||||
function createCompactStorage(initial?: string): Storage {
|
||||
const values = new Map<string, string>();
|
||||
if (initial !== undefined) values.set(COMPACT_STORAGE_KEY, initial);
|
||||
return {
|
||||
clear: () => values.clear(),
|
||||
getItem: (key) => values.get(key) ?? null,
|
||||
key: (index) => Array.from(values.keys())[index] ?? null,
|
||||
get length() {
|
||||
return values.size;
|
||||
},
|
||||
removeItem: (key) => values.delete(key),
|
||||
setItem: (key, value) => values.set(key, value),
|
||||
};
|
||||
}
|
||||
|
||||
describe("compact preference 纯逻辑", () => {
|
||||
test("读取 compact 默认值 false", () => {
|
||||
const storage = createCompactStorage();
|
||||
expect(readCompactPreference(storage)).toBe(false);
|
||||
});
|
||||
|
||||
test("读取 compact=true", () => {
|
||||
const storage = createCompactStorage("true");
|
||||
expect(readCompactPreference(storage)).toBe(true);
|
||||
});
|
||||
|
||||
test("读取 compact=false", () => {
|
||||
const storage = createCompactStorage("false");
|
||||
expect(readCompactPreference(storage)).toBe(false);
|
||||
});
|
||||
|
||||
test("读取 compact 非法值回退 false", () => {
|
||||
const storage = createCompactStorage("yes");
|
||||
expect(readCompactPreference(storage)).toBe(false);
|
||||
});
|
||||
|
||||
test("写入 compact 值", () => {
|
||||
const storage = createCompactStorage();
|
||||
writeCompactPreference(true, storage);
|
||||
expect(storage.getItem(COMPACT_STORAGE_KEY)).toBe("true");
|
||||
});
|
||||
|
||||
test("storage 异常时不抛错", () => {
|
||||
const brokenStorage = {
|
||||
getItem: () => {
|
||||
throw new Error("blocked");
|
||||
},
|
||||
setItem: () => {
|
||||
throw new Error("blocked");
|
||||
},
|
||||
} as unknown as Storage;
|
||||
|
||||
expect(readCompactPreference(brokenStorage)).toBe(false);
|
||||
expect(() => writeCompactPreference(true, brokenStorage)).not.toThrow();
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user