waffensachkunde
Waffensachkunde – Lernsoftware für die Sachkundeprüfung nach § 7 WaffG. Barrierefrei, offline, EUPL-1.2.
| 1 | /** |
| 2 | * Die Erststart-Frage nach dem abwählbaren Kapitel – im echten Fenster. |
| 3 | * |
| 4 | * Eigene Datei mit eigener Anwendung, weil `appStarten` die Frage für alle |
| 5 | * übrigen Prüfungen beantwortet. Hier soll sie stehenbleiben. |
| 6 | */ |
| 7 | |
| 8 | import { type ElectronApplication, type Page } from '@playwright/test'; |
| 9 | |
| 10 | import { appStartenOhneZuschnitt } from './electron-hilfe'; |
| 11 | import { expect, test } from './konsolenwache'; |
| 12 | |
| 13 | let app: ElectronApplication; |
| 14 | let fenster: Page; |
| 15 | |
| 16 | test.beforeEach(async () => { |
| 17 | ({ app, fenster } = await appStartenOhneZuschnitt()); |
| 18 | }); |
| 19 | |
| 20 | test.afterEach(async () => { |
| 21 | await app.close(); |
| 22 | }); |
| 23 | |
| 24 | test('steht beim allerersten Start vor dem Startbildschirm', async () => { |
| 25 | /* 89 von 575 Fragen hängen daran. Der Schalter lag bisher unter „Ihr |
| 26 | Lernplan“ – wer nie hinunterscrollte, sah ihn nie. */ |
| 27 | await expect(fenster.getByRole('heading', { name: /Lernen Sie .* mit\?/u })).toBeVisible(); |
| 28 | await expect(fenster.getByRole('heading', { name: 'Heute lernen' })).toHaveCount(0); |
| 29 | }); |
| 30 | |
| 31 | test('hat „mitlernen“ vorausgewählt und nennt die Zahlen', async () => { |
| 32 | await expect(fenster.getByRole('radio', { name: /Ja, mitlernen/u })).toBeChecked(); |
| 33 | /* Die Zahlen kommen aus dem Katalog, nicht aus dem Text – sonst liefen sie |
| 34 | bei der nächsten Katalogfassung auseinander. */ |
| 35 | await expect(fenster.getByText(/89 der 575 Fragen/u)).toBeVisible(); |
| 36 | }); |
| 37 | |
| 38 | test('führt mit „Weiter“ zum Startbildschirm und lässt den Katalog vollständig', async () => { |
| 39 | await fenster.getByRole('button', { name: 'Weiter', exact: true }).click(); |
| 40 | |
| 41 | await expect(fenster.getByRole('heading', { name: 'Heute lernen' })).toBeVisible(); |
| 42 | /* Der Schalter unter „Ihr Lernplan“ steht danach auf „mitlernen“. */ |
| 43 | await expect( |
| 44 | fenster.getByRole('checkbox', { name: /Kapitel IV – Not- und Seenotsignalmittel/u }), |
| 45 | ).toBeChecked(); |
| 46 | }); |
| 47 | |
| 48 | test('wählt bei „weglassen“ das Kapitel dauerhaft ab', async () => { |
| 49 | await fenster.getByRole('radio', { name: /Nein, weglassen/u }).check(); |
| 50 | await fenster.getByRole('button', { name: 'Weiter', exact: true }).click(); |
| 51 | |
| 52 | await expect(fenster.getByRole('heading', { name: 'Heute lernen' })).toBeVisible(); |
| 53 | await expect( |
| 54 | fenster.getByRole('checkbox', { name: /Kapitel IV – Not- und Seenotsignalmittel/u }), |
| 55 | ).not.toBeChecked(); |
| 56 | /* Und die Zahlen rechnen ohne das Kapitel: 486 statt 575. */ |
| 57 | await expect(fenster.getByText(/von 486 Fragen/u).first()).toBeVisible(); |
| 58 | }); |
| 59 | |
| 60 | test('kommt beim zweiten Start nicht wieder', async () => { |
| 61 | await fenster.getByRole('button', { name: 'Weiter', exact: true }).click(); |
| 62 | await expect(fenster.getByRole('heading', { name: 'Heute lernen' })).toBeVisible(); |
| 63 | |
| 64 | /* Neu laden ist der schärfere Fall als ein Neustart: Dasselbe Fenster, |
| 65 | derselbe Zustand auf der Platte – hinge die Antwort im Arbeitsspeicher, |
| 66 | käme die Frage hier wieder. */ |
| 67 | await fenster.reload(); |
| 68 | await fenster.waitForSelector('h1', { state: 'visible' }); |
| 69 | |
| 70 | await expect(fenster.getByRole('heading', { name: 'Heute lernen' })).toBeVisible(); |
| 71 | await expect(fenster.getByRole('heading', { name: /Lernen Sie .* mit\?/u })).toHaveCount(0); |
| 72 | }); |