From 1682d1f2f099eaf0b04f604ed427e876a40040b0 Mon Sep 17 00:00:00 2001 From: Alexey Zinoviev Date: Mon, 14 Jul 2025 13:23:30 +0700 Subject: [PATCH] UBERF-12227: Stabilize UI tests (#9521) Signed-off-by: Alexey Zinoviev --- .../chat-message/ChatMessagePresenter.svelte | 4 ++-- .../src/components/Form.svelte | 15 ++++++++++++--- tests/sanity/tests/chat/chat.spec.ts | 1 + tests/sanity/tests/model/channel-page.ts | 19 ++++++++++++------- 4 files changed, 27 insertions(+), 12 deletions(-) diff --git a/plugins/chunter-resources/src/components/chat-message/ChatMessagePresenter.svelte b/plugins/chunter-resources/src/components/chat-message/ChatMessagePresenter.svelte index 70db49fca9..7f9c9e9b9c 100644 --- a/plugins/chunter-resources/src/components/chat-message/ChatMessagePresenter.svelte +++ b/plugins/chunter-resources/src/components/chat-message/ChatMessagePresenter.svelte @@ -270,7 +270,7 @@ {#if !isEditing} {#if withShowMore} -
+
{#if (value.attachments ?? 0) > 0}
@@ -279,7 +279,7 @@
{:else} -
+
{#if (value.attachments ?? 0) > 0}
diff --git a/plugins/login-resources/src/components/Form.svelte b/plugins/login-resources/src/components/Form.svelte index d1ffd41098..eff31c5e73 100644 --- a/plugins/login-resources/src/components/Form.svelte +++ b/plugins/login-resources/src/components/Form.svelte @@ -48,6 +48,7 @@ const validate = makeSequential(async function validateAsync (language: string): Promise { if (ignoreInitialValidation) return true + for (const field of fields) { const v = object[field.name] const f = field @@ -97,6 +98,8 @@ let inAction = false function performAction (action: Action): void { + if (inAction) return + for (const field of fields) { trim(field.name) } @@ -126,7 +129,7 @@ evt.stopPropagation() if (!inAction) { void validate($themeStore.language).then((res) => { - if (res != null) { + if (res) { performAction(action) } }) @@ -154,7 +157,7 @@ label={field.i18n} name={field.id} password={field.password} - disabled={field.disabled} + disabled={inAction || field.disabled} bind:value={object[field.name]} on:input={() => validate($themeStore.language)} on:blur={() => { @@ -179,7 +182,13 @@ disabled={status.severity !== Severity.OK && status.severity !== Severity.ERROR} on:click={(e) => { e.preventDefault() - performAction(action) + if (!inAction) { + void validate($themeStore.language).then((res) => { + if (res) { + performAction(action) + } + }) + } }} />
diff --git a/tests/sanity/tests/chat/chat.spec.ts b/tests/sanity/tests/chat/chat.spec.ts index 9b7fc95bce..b44c024093 100644 --- a/tests/sanity/tests/chat/chat.spec.ts +++ b/tests/sanity/tests/chat/chat.spec.ts @@ -431,6 +431,7 @@ test.describe('Channel tests', () => { await channelPage.clickChooseChannel(data.channelName) await channelPage.sendMessage('Test message') + await channelPage.checkMessageExist('Test message', true, 'Test message') }) await test.step('Leave channel #1', async () => { diff --git a/tests/sanity/tests/model/channel-page.ts b/tests/sanity/tests/model/channel-page.ts index 7f2ab6019d..0eec4778d6 100644 --- a/tests/sanity/tests/model/channel-page.ts +++ b/tests/sanity/tests/model/channel-page.ts @@ -12,11 +12,15 @@ export class ChannelPage extends CommonPage { readonly inputMessage = (): Locator => this.page.locator('div[class~="text-editor-view"]') readonly buttonSendMessage = (): Locator => this.page.locator('g#Send') - readonly textMessage = (messageText: string): Locator => - this.page.locator('.hulyComponent .activityMessage', { hasText: messageText }) + readonly textMessage = (messageText: string, strict = false): Locator => + strict + ? this.page.locator('.hulyComponent .activityMessage div[data-delivered]', { hasText: messageText }) + : this.page.locator('.hulyComponent .activityMessage', { hasText: messageText }) - readonly textMessageInSidebar = (messageText: string): Locator => - this.page.locator('#sidebar .activityMessage', { hasText: messageText }) + readonly textMessageInSidebar = (messageText: string, strict = false): Locator => + strict + ? this.page.locator('#sidebar .activityMessage div[data-delivered]', { hasText: messageText }) + : this.page.locator('#sidebar .activityMessage', { hasText: messageText }) readonly channelName = (channel: string): Locator => this.page.getByText('general random').getByText(channel) readonly channelTab = (): Locator => this.page.getByRole('link', { name: 'Channels' }).getByRole('button') @@ -197,7 +201,8 @@ export class ChannelPage extends CommonPage { } async clickChooseChannel (channel: string): Promise { - await this.chooseChannel(channel).click({ force: true }) + await expect(this.chooseChannel(channel)).toBeVisible() + await this.chooseChannel(channel).click() } async addEmoji (textMessage: string, emoji: string): Promise { @@ -292,7 +297,7 @@ export class ChannelPage extends CommonPage { async checkMessageExist (message: string, messageExists: boolean, messageText: string): Promise { if (messageExists) { - await expect(this.textMessage(messageText)).toBeVisible() + await expect(this.textMessage(messageText, true)).toBeVisible() } else { await expect(this.textMessage(messageText)).toBeHidden() } @@ -300,7 +305,7 @@ export class ChannelPage extends CommonPage { async checkIfMessageExistInSidebar (messageExists: boolean, messageText: string): Promise { if (messageExists) { - await expect(this.textMessageInSidebar(messageText)).toBeVisible() + await expect(this.textMessageInSidebar(messageText, true)).toBeVisible() } else { await expect(this.textMessageInSidebar(messageText)).toBeHidden() }