From 2d92c214901c0b167308c7447ef0cf78a30ef5a5 Mon Sep 17 00:00:00 2001 From: Coracle-Bot Date: Tue, 8 Sep 2026 18:17:30 +0000 Subject: [PATCH] Wait on the composer rather than the send button in e2e specs (#434) --- e2e/specs/composer.spec.ts | 11 ++++++++--- e2e/specs/delivery.spec.ts | 16 +++++++++++----- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/e2e/specs/composer.spec.ts b/e2e/specs/composer.spec.ts index 6fa13f38..e4901a1b 100644 --- a/e2e/specs/composer.spec.ts +++ b/e2e/specs/composer.spec.ts @@ -95,6 +95,11 @@ const composer = (page: Page) => page.locator(".chat-editor [contenteditable=tru // The send button carries the shortcut it advertises, which differs by platform. const sendButton = (page: Page) => page.locator("button[data-tip$='enter to send']") +// The editor is where the composer says whether it is ready. The send button is not there to +// ask while the composer is empty, since a dictation button stands in its place. +const composerEnabled = (page: Page) => + expect(page.locator(".room__compose .chat-editor")).toHaveAttribute("aria-disabled", "false") + const suggestions = (page: Page) => page.locator(".tiptap-suggestions__item") const timeline = (page: Page) => page.locator(".room__content") @@ -316,11 +321,11 @@ test("US-057 attach and send an image", async ({seed, as}) => { await expect(composer(alice).locator(".tiptap-uploading")).toHaveCount(0) // The same thing in a conversation. Its composer stays disabled until the recipient's messaging - // relays have been read, which is what waiting on the send button waits out. + // relays have been read, which is what waiting on the composer waits out. await alice.goto(chatPath(users.bob.pubkey)) await bob.goto(chatPath(users.alice.pubkey)) - await expect(sendButton(alice)).toBeEnabled() + await composerEnabled(alice) await chooseFile(alice, chatUploadButton(alice), gifFile("selfie.gif")) @@ -379,7 +384,7 @@ test("US-058 drafts survive navigating away", async ({seed, as}) => { const editor = composer(page) const rooms = page.locator(".secondary-nav") - await expect(sendButton(page)).toBeEnabled() + await composerEnabled(page) await editor.click() await editor.pressSequentially("still thinking about this") diff --git a/e2e/specs/delivery.spec.ts b/e2e/specs/delivery.spec.ts index 1f8b83bc..8570b408 100644 --- a/e2e/specs/delivery.spec.ts +++ b/e2e/specs/delivery.spec.ts @@ -48,6 +48,12 @@ const composer = (page: Page) => page.locator(".chat-editor [contenteditable=tru // The send button carries the shortcut it advertises, which differs by platform. const sendButton = (page: Page) => page.locator("button[data-tip$='enter to send']") +// The editor is where the composer says whether it is ready. The send button is not there to +// ask while the composer is empty, since a dictation button stands in its place. Only the +// conversation composer has a disabled state; a room's is usable as soon as it renders. +const composerEnabled = (page: Page) => + expect(page.locator(".room__compose .chat-editor")).toHaveAttribute("aria-disabled", "false") + const timeline = (page: Page) => page.locator(".room__content") const message = (page: Page, text: string) => page.locator(".room__item").filter({hasText: text}) @@ -76,10 +82,10 @@ const modal = (page: Page, title: string) => const editorOf = (scope: Locator) => scope.locator(".note-editor [contenteditable=true]") -// The composer stays disabled until every recipient's messaging relays have been read, so waiting -// on the send button is part of sending rather than a wait for a wait's sake. +// Every caller of this sends to a room, whose composer gates on nothing, so the wait is for the +// room to have rendered one. const send = async (page: Page, content: string) => { - await expect(sendButton(page)).toBeEnabled() + await expect(composer(page)).toBeVisible() await composer(page).click() await composer(page).pressSequentially(content) await composer(page).press("Enter") @@ -561,7 +567,7 @@ test("US-073 a multi-part message reports one status", async ({seed, as}) => { await mockBlossom(alice.context(), {server: BLOSSOM_ORIGIN}) await mockBlossom(bob.context(), {server: BLOSSOM_ORIGIN}) - await expect(sendButton(alice)).toBeEnabled() + await composerEnabled(alice) await composer(alice).click() await composer(alice).pressSequentially("here is the harbour") @@ -590,7 +596,7 @@ test("US-073 a multi-part message reports one status", async ({seed, as}) => { // The same message to someone one of whose relays refuses it: each part says so for itself. await alice.goto(chatPath(users.carol.pubkey)) - await expect(sendButton(alice)).toBeEnabled() + await composerEnabled(alice) await composer(alice).click() await composer(alice).pressSequentially("and one for you")