import type { MenuItemConstructorOptions } from 'electron' import { describe, expect, it, vi } from 'vitest' import { localizeNativeMenu, resolveNativeMenuLocale } from './native-menu-locale' describe('native menu language', () => { it('translates nested labels without changing actions, roles or keyboard ownership', () => { const openFolder = vi.fn() const zoom = vi.fn() const template: MenuItemConstructorOptions[] = [ { label: 'File', submenu: [{ label: 'Open Folder…', click: openFolder }, { type: 'separator' }, { role: 'quit' }] }, { label: 'View', submenu: [{ label: 'Zoom In', accelerator: 'CommandOrControl+Plus', click: zoom }, { role: 'togglefullscreen' }] }, { label: 'My custom action', enabled: false } ] const translated = localizeNativeMenu(template, 'tr', 'AITURK IDE') const file = translated[0].submenu as MenuItemConstructorOptions[] const view = translated[1].submenu as MenuItemConstructorOptions[] expect(translated[0].label).toBe('Dosya') expect(file[0]).toEqual({ label: 'Klasör aç…', click: openFolder }) expect(file[1]).toEqual({ type: 'separator' }) expect(file[2]).toEqual({ role: 'quit', label: 'AITURK IDE uygulamasından çık' }) expect(view[0]).toEqual({ label: 'Yakınlaştır', accelerator: 'CommandOrControl+Plus', click: zoom }) expect(view[1].role).toBe('togglefullscreen') expect(translated[2]).toEqual(template[2]) expect(localizeNativeMenu(template, 'en', 'AITURK IDE')).toBe(template) expect((template[0].submenu as MenuItemConstructorOptions[])[0].label).toBe('Open Folder…') expect(openFolder).not.toHaveBeenCalled() expect(zoom).not.toHaveBeenCalled() }) it('accepts only supported language messages from the primary renderer', () => { expect(resolveNativeMenuLocale('tr', 42, 42)).toBe('tr') expect(resolveNativeMenuLocale('en', 42, 42)).toBe('en') expect(resolveNativeMenuLocale('ja', 42, 42)).toBe('en') for (const locale of ['tr', 'en']) { expect(resolveNativeMenuLocale(locale, 43, 42)).toBeNull() expect(resolveNativeMenuLocale(locale, 42, undefined)).toBeNull() } for (const value of [null, {}, ['tr'], 'unsupported', '__proto__']) { expect(resolveNativeMenuLocale(value, 42, 42)).toBeNull() } }) })