Files
openchamber/packages/ui/src/lib/tabletLayout.test.ts
T

58 lines
2.2 KiB
TypeScript
Raw Normal View History

import { afterEach, describe, expect, test } from 'bun:test';
import { readTabletLayout, type TabletLayout } from './device';
// No module mocking here on purpose: mock.module is process-global and would
// leak into every other test file. Outside a Capacitor shell isIPadApp() is
// already false, so a bare viewport stub isolates the geometry rules.
const originalWindow = globalThis.window;
const setViewport = (width: number, height: number) => {
(globalThis as { window?: unknown }).window = {
innerWidth: width,
innerHeight: height,
// isIPadApp() reaches for the Capacitor markers; a plain web location
// keeps it on its `false` path without mocking the module.
location: { protocol: 'https:', search: '' },
};
};
const withViewport = (width: number, height: number): TabletLayout => {
setViewport(width, height);
return readTabletLayout();
};
afterEach(() => {
(globalThis as { window?: unknown }).window = originalWindow;
});
describe('readTabletLayout', () => {
test('a phone stays a phone in both orientations', () => {
expect(withViewport(390, 844).enabled).toBe(false);
// The long side alone must never qualify — this is the case a plain
// width threshold gets wrong.
expect(withViewport(844, 390).enabled).toBe(false);
});
test('a tablet qualifies in both orientations', () => {
expect(withViewport(834, 1194).enabled).toBe(true);
expect(withViewport(1194, 834).enabled).toBe(true);
});
test('side panels need real width, so a tablet in portrait keeps the drawer', () => {
expect(withViewport(834, 1194).roomyForPanels).toBe(false);
expect(withViewport(1194, 834).roomyForPanels).toBe(true);
});
test('an unfolded foldable is a tablet but never roomy enough for panels', () => {
// Book foldables are near-square: the long side is barely wider than a
// tablet's short one, so both orientations keep the portrait layout.
expect(withViewport(690, 840)).toEqual({ enabled: true, roomyForPanels: false });
expect(withViewport(840, 690)).toEqual({ enabled: true, roomyForPanels: false });
});
test('folding shut drops back to the phone layout', () => {
expect(withViewport(370, 900).enabled).toBe(false);
});
});