fix(prøver): markør-prøverne venter på editoren, før de taster

Runde 3 og 4 af de røde End-to-end var samme årsag. Det faste ophold, jeg
fjernede i forrige commit, skjulte den bag en anden påstand.

`page.keyboard.type` kørte, før editoren var tegnet. `click()` på "Ny note"
vender tilbage, så snart klikket er sendt, mens noten først skal oprettes
på serveren og tegnes bagefter. Så gik det tastede ind i den FORRIGE note
eller ingen steder, og noten blev liggende tom:

* runde 3 fejlede på, at noten ikke fandtes efter genindlæsningen
* runde 4 fejlede på, at der ikke kom nogen PATCH at vente på

To forskellige påstande, én årsag.

Og svaret stod skrevet over `nyNote` i samme fil, før prøverne blev
skrevet:

    Et klik på "Ny note" efterfulgt af tastetryk med det samme skriver
    derfor i den forrige note — teksten havner det forkerte sted, og den
    nye note bliver liggende tom. Efter en genindlæsning findes den titel,
    prøven leder efter, slet ikke.

Det er runde 3's fejl ord for ord. Men `nyNote` KLIKKER i feltet, og det er
netop det, markør-prøverne ikke må: de måler, at markøren står der, uden at
nogen har sat den. Derfor `nyTomNote` — samme ventetid, uden klikket.

Ankret på <h1> frem for blot et tomt felt: <h1> skrives af samme effekt,
der sætter markøren, så når den er der, er markøren sat. Et tomt felt kan
være et felt, effekten ikke har rørt endnu.

Kontrolleret i begge retninger med 1500 ms plantet på POST /notes: det rå
klik fejler med runde 4's ordlyd, `nyTomNote` består.

E2E: 131 bestod, 0 netafbrydelser.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
kristianwind
2026-10-08 20:29:59 +02:00
co-authored by Claude Opus 5
parent 5764271579
commit 9155e799b1
+28 -3
View File
@@ -86,6 +86,31 @@ async function nyNote(side) {
return felt;
}
/**
* Som `nyNote`, men UDEN klikket i feltet.
*
* Klikket er netop det, markør-prøverne ikke må gøre: de måler, at markøren
* står i overskriften, uden at nogen har sat den. Ventetiden skal de til
* gengæld have, og manglen på den kostede to røde CI-kørsler.
*
* `click()` på "Ny note" vender tilbage, så snart klikket er sendt, mens noten
* først skal oprettes på serveren og tegnes bagefter. Uden ventetiden går det,
* der tastes, ind i den FORRIGE note eller ingen steder — og så er der heller
* ingen gemning at vente på, så en `waitForResponse` løber tørt i stedet. Det
* er to forskellige påstande, der fejler, med én årsag. Se kommentaren over
* `nyNote`: faren var skrevet ned, med sin løsning, før prøverne blev skrevet.
*
* Overskriften er værnet frem for bare det tomme felt: <h1> skrives af samme
* effekt, der sætter markøren, så når den er der, er markøren sat.
*/
async function nyTomNote(side) {
await side.getByRole('button', { name: 'Ny note' }).click();
const felt = side.getByRole('textbox', { name: 'Notens tekst' });
await expect(felt).toHaveText('');
await expect(side.locator('.editor h1')).toHaveCount(1);
return felt;
}
/**
* Kommendes liste kan se længere frem end en uge.
*
@@ -5721,7 +5746,7 @@ async function caretBlock(page) {
test('en ny note åbner med markøren i overskriften', async ({ page }) => {
const trouble = watchForTrouble(page);
await page.goto('/noter');
await page.getByRole('button', { name: 'Ny note' }).click();
await nyTomNote(page);
// `expect.poll` og ikke én læsning: `click()` vender tilbage, så snart klikket er
// sendt, mens markøren sættes efter en netværksrundtur OG en gentegning. Lokalt
@@ -5752,7 +5777,7 @@ test('en note med indhold stjæler ikke markøren', async ({ page }) => {
// overskriften og skubbe det, man var i gang med.
const trouble = watchForTrouble(page);
await page.goto('/noter');
await page.getByRole('button', { name: 'Ny note' }).click();
await nyTomNote(page);
// Lyt FØR der skrives. Her stod `waitForTimeout(1200)`, og kommentaren over
// `gemt` i toppen af filen nævner præcis det tal: et fast ophold er et gæt om,
@@ -5780,7 +5805,7 @@ test('urd-døren opfører sig ens: ny note, markør i overskriften', async ({ pa
const trouble = watchForTrouble(page);
await page.goto('/urd');
await expect(page).toHaveURL(/\/noter$/);
await page.getByRole('button', { name: 'Ny note' }).click();
await nyTomNote(page);
await expect
.poll(() => caretBlock(page), { message: 'markøren skal stå i h1 også i urd' })