import { afterEach, beforeEach, describe, expect, it } from 'vitest'
import { cleanup, fireEvent, render, waitFor } from '@testing-library/react'
import { APP_ZOOM_STORAGE_KEY } from '../lib/appZoom'
import { useSettingsStore } from '../stores/settingsStore'
import { useKeyboardShortcuts } from './useKeyboardShortcuts'
function ShortcutHost() {
useKeyboardShortcuts()
return null
}
function setNavigatorPlatform(platform: string) {
Object.defineProperty(window.navigator, 'platform', {
configurable: true,
value: platform,
})
}
describe('useKeyboardShortcuts app zoom', () => {
beforeEach(() => {
window.localStorage.clear()
document.documentElement.removeAttribute('data-app-zoom-mode')
document.documentElement.removeAttribute('data-app-zoom-percent')
document.documentElement.style.removeProperty('--app-zoom')
document.body.style.removeProperty('zoom')
useSettingsStore.setState({ uiZoom: 1 })
setNavigatorPlatform('Win32')
})
afterEach(() => {
cleanup()
})
it('handles Ctrl zoom shortcuts on Windows and Linux style platforms', async () => {
render()
fireEvent.keyDown(document, {
code: 'Equal',
ctrlKey: true,
key: '=',
})
await waitFor(() => {
expect(window.localStorage.getItem(APP_ZOOM_STORAGE_KEY)).toBe('1.1')
})
expect(useSettingsStore.getState().uiZoom).toBe(1.1)
expect(document.documentElement.getAttribute('data-app-zoom-percent')).toBe('110')
fireEvent.keyDown(document, {
code: 'Minus',
ctrlKey: true,
key: '-',
})
await waitFor(() => {
expect(window.localStorage.getItem(APP_ZOOM_STORAGE_KEY)).toBe('1')
})
expect(useSettingsStore.getState().uiZoom).toBe(1)
fireEvent.keyDown(document, {
code: 'NumpadAdd',
ctrlKey: true,
key: '+',
})
await waitFor(() => {
expect(window.localStorage.getItem(APP_ZOOM_STORAGE_KEY)).toBe('1.1')
})
fireEvent.keyDown(document, {
code: 'Digit0',
ctrlKey: true,
key: '0',
})
await waitFor(() => {
expect(window.localStorage.getItem(APP_ZOOM_STORAGE_KEY)).toBe('1')
})
})
it('uses Cmd zoom shortcuts on macOS', async () => {
setNavigatorPlatform('MacIntel')
render()
fireEvent.keyDown(document, {
code: 'Minus',
key: '-',
metaKey: true,
})
await waitFor(() => {
expect(window.localStorage.getItem(APP_ZOOM_STORAGE_KEY)).toBe('0.9')
})
fireEvent.keyDown(document, {
code: 'Equal',
ctrlKey: true,
key: '=',
})
await new Promise((resolve) => setTimeout(resolve, 0))
expect(window.localStorage.getItem(APP_ZOOM_STORAGE_KEY)).toBe('0.9')
})
})