lsa-planer
LSA-Planer Professional – Planungssoftware für Lichtsignalanlagen nach RiLSA 2015 und § 45 StVO. EUPL-1.2.
/ tests electron ueberMenue.test.ts
| 1 | import { describe, expect, it, vi } from 'vitest'; |
| 2 | import type { MenuItemConstructorOptions } from 'electron'; |
| 3 | import type { MenuCommand } from '../../shared/ipc'; |
| 4 | import { VERWEISADRESSEN } from '../../shared/verweise'; |
| 5 | |
| 6 | /** |
| 7 | * Fassung 5.14.0 - der Menueweg zum "Über"-Fenster. |
| 8 | * |
| 9 | * Bis 5.14.0 oeffnete der Eintrag `Über LSA-Planer Professional 5.14.0` |
| 10 | * die Internetseite des Herstellers - dieselbe Wirkung wie der Eintrag |
| 11 | * "Internetseite des Herstellers" unmittelbar darueber. Es gab kein |
| 12 | * Fenster dahinter, und auf die Frage, wo sich die Lizenzen im Programm |
| 13 | * ansehen lassen, gab es keine Antwort. |
| 14 | * |
| 15 | * Wie in tests/electron/ansichtsmenue.test.ts wird die reine Vorlage |
| 16 | * geprueft: Sie braucht kein Fenster. |
| 17 | */ |
| 18 | vi.mock('electron', () => ({ |
| 19 | Menu: { buildFromTemplate: (vorlage: unknown) => vorlage }, |
| 20 | app: { getVersion: () => '5.14.0' }, |
| 21 | shell: { openExternal: () => undefined }, |
| 22 | })); |
| 23 | |
| 24 | const { menuevorlage } = await import('../../electron/menu'); |
| 25 | |
| 26 | interface Aufzeichnung { |
| 27 | befehle: MenuCommand[]; |
| 28 | seiten: string[]; |
| 29 | } |
| 30 | |
| 31 | function hilfemenue(): { eintraege: MenuItemConstructorOptions[]; auf: Aufzeichnung } { |
| 32 | const auf: Aufzeichnung = { befehle: [], seiten: [] }; |
| 33 | const menue = menuevorlage( |
| 34 | (befehl) => auf.befehle.push(befehl), |
| 35 | false, |
| 36 | { aktuell: () => 100, setze: () => undefined, schritt: () => undefined }, |
| 37 | '5.14.0', |
| 38 | (url) => auf.seiten.push(url), |
| 39 | () => undefined, |
| 40 | ); |
| 41 | const hilfe = menue.find((e) => e.label === '&Hilfe')?.submenu; |
| 42 | expect(Array.isArray(hilfe), 'Das Hilfemenü fehlt').toBe(true); |
| 43 | return { eintraege: hilfe as MenuItemConstructorOptions[], auf }; |
| 44 | } |
| 45 | |
| 46 | function eintrag( |
| 47 | eintraege: MenuItemConstructorOptions[], |
| 48 | beschriftung: string, |
| 49 | ): MenuItemConstructorOptions { |
| 50 | const gefunden = eintraege.find((e) => e.label === beschriftung); |
| 51 | expect(gefunden, `Menüeintrag "${beschriftung}" fehlt`).toBeDefined(); |
| 52 | return gefunden as MenuItemConstructorOptions; |
| 53 | } |
| 54 | |
| 55 | describe('Hilfemenü: Über LSA-Planer Professional', () => { |
| 56 | it('schickt den Befehl "ueber" an den Renderer', () => { |
| 57 | const { eintraege, auf } = hilfemenue(); |
| 58 | eintrag(eintraege, 'Über LSA-Planer Professional 5.14.0').click?.( |
| 59 | undefined as never, |
| 60 | undefined, |
| 61 | undefined as never, |
| 62 | ); |
| 63 | |
| 64 | expect(auf.befehle).toEqual(['ueber']); |
| 65 | }); |
| 66 | |
| 67 | it('öffnet dabei keine Internetseite mehr', () => { |
| 68 | const { eintraege, auf } = hilfemenue(); |
| 69 | eintrag(eintraege, 'Über LSA-Planer Professional 5.14.0').click?.( |
| 70 | undefined as never, |
| 71 | undefined, |
| 72 | undefined as never, |
| 73 | ); |
| 74 | |
| 75 | expect(auf.seiten, 'Der Eintrag ruft weiterhin die Internetseite').toEqual([]); |
| 76 | }); |
| 77 | |
| 78 | it('lässt der Internetseite ihren eigenen Eintrag', () => { |
| 79 | // Grenzwache: Der Weg nach draussen bleibt, er hat nur nicht mehr zwei |
| 80 | // Eintraege. |
| 81 | const { eintraege, auf } = hilfemenue(); |
| 82 | eintrag(eintraege, 'Internetseite des Herstellers').click?.( |
| 83 | undefined as never, |
| 84 | undefined, |
| 85 | undefined as never, |
| 86 | ); |
| 87 | |
| 88 | // Seit 5.43.1 die Akte des Programms, aus derselben Tafel wie die |
| 89 | // Verweise des "Über"-Fensters - der Menueeintrag fuehrt keine eigene. |
| 90 | expect(auf.seiten).toEqual([VERWEISADRESSEN.internetseite]); |
| 91 | expect(auf.befehle).toEqual([]); |
| 92 | }); |
| 93 | }); |