From ed7ba2cbf1139fa6a2c7ec2f43920a8018d0242e Mon Sep 17 00:00:00 2001 From: Van-QA Date: Wed, 10 Apr 2024 14:24:55 +0700 Subject: [PATCH 1/5] feat: init element for new thread --- electron/tests/e2e/thread.e2e.spec.ts | 25 +++++++++++++++++++++++++ web/screens/Chat/ChatInput/index.tsx | 2 ++ 2 files changed, 27 insertions(+) create mode 100644 electron/tests/e2e/thread.e2e.spec.ts diff --git a/electron/tests/e2e/thread.e2e.spec.ts b/electron/tests/e2e/thread.e2e.spec.ts new file mode 100644 index 000000000..b03a6c81d --- /dev/null +++ b/electron/tests/e2e/thread.e2e.spec.ts @@ -0,0 +1,25 @@ +import { expect } from '@playwright/test' +import { page, test, TIMEOUT } from '../config/fixtures' + +test('create thread button', async () => { + const settingsBtn = await page + .getByTestId('btn-create-thread') + .click() + await page + .getByTestId('txt-input-chat') + .fill('dummy value') + + await page + .getByTestId('btn-send-chat') + .click() + + expect([settingsBtn].filter((e) => !e).length).toBe(0) + // Chat section should be there + await page.getByTestId('Local API Server').first().click({ + timeout: TIMEOUT, + }) + const localServer = page.getByTestId('local-server-testid').first() + await expect(localServer).toBeVisible({ + timeout: TIMEOUT, + }) +}) diff --git a/web/screens/Chat/ChatInput/index.tsx b/web/screens/Chat/ChatInput/index.tsx index 9c54c8c89..0b13fcd8c 100644 --- a/web/screens/Chat/ChatInput/index.tsx +++ b/web/screens/Chat/ChatInput/index.tsx @@ -148,6 +148,7 @@ const ChatInput: React.FC = () => { 'max-h-[400px] resize-none pr-20', fileUpload.length && 'rounded-t-none' )} + data-testid="txt-input-chat" style={{ height: '40px' }} ref={textareaRef} onKeyDown={onKeyDown} @@ -320,6 +321,7 @@ const ChatInput: React.FC = () => { } themes="primary" className="min-w-[100px]" + data-testid="btn-send-chat" onClick={() => sendChatMessage(currentPrompt)} > Send From cdab762a6acd81230803030e1d6b706eeaa2c3b6 Mon Sep 17 00:00:00 2001 From: Van-QA Date: Wed, 10 Apr 2024 16:27:22 +0700 Subject: [PATCH 2/5] feat: add new test for the Use model button from Hub --- electron/tests/e2e/hub.e2e.spec.ts | 7 +++++- electron/tests/e2e/thread.e2e.spec.ts | 23 +++++++++++-------- electron/tests/pages/basePage.ts | 13 +++++++---- web/screens/Chat/ErrorMessage/index.tsx | 2 +- .../ExploreModelItemHeader/index.tsx | 1 + 5 files changed, 31 insertions(+), 15 deletions(-) diff --git a/electron/tests/e2e/hub.e2e.spec.ts b/electron/tests/e2e/hub.e2e.spec.ts index d968e7641..23d4d0b6d 100644 --- a/electron/tests/e2e/hub.e2e.spec.ts +++ b/electron/tests/e2e/hub.e2e.spec.ts @@ -1,4 +1,4 @@ -import { test, appInfo } from '../config/fixtures' +import { test, appInfo, page, TIMEOUT } from '../config/fixtures' import { expect } from '@playwright/test' test.beforeAll(async () => { @@ -16,4 +16,9 @@ test.beforeAll(async () => { test('explores hub', async ({ hubPage }) => { await hubPage.navigateByMenu() await hubPage.verifyContainerVisible() + const useModelBtn= page.getByTestId(/^use-model-btn-.*/).first() + + await expect(useModelBtn).toBeVisible({ + timeout: TIMEOUT, + }) }) diff --git a/electron/tests/e2e/thread.e2e.spec.ts b/electron/tests/e2e/thread.e2e.spec.ts index b03a6c81d..bc7acf281 100644 --- a/electron/tests/e2e/thread.e2e.spec.ts +++ b/electron/tests/e2e/thread.e2e.spec.ts @@ -1,10 +1,20 @@ import { expect } from '@playwright/test' import { page, test, TIMEOUT } from '../config/fixtures' -test('create thread button', async () => { - const settingsBtn = await page +test('Select GPT model for chat via Use model button from Jan Hub', async ({ hubPage }) => { + await hubPage.navigateByMenu() + await hubPage.verifyContainerVisible() + + // Select the first GPT model + await page + .locator('[data-testid^="use-model-btn"][data-testid*="gpt"]') + .first().click() + + // Attempt to create thread and chat in Thread page + await page .getByTestId('btn-create-thread') .click() + await page .getByTestId('txt-input-chat') .fill('dummy value') @@ -13,13 +23,8 @@ test('create thread button', async () => { .getByTestId('btn-send-chat') .click() - expect([settingsBtn].filter((e) => !e).length).toBe(0) - // Chat section should be there - await page.getByTestId('Local API Server').first().click({ - timeout: TIMEOUT, - }) - const localServer = page.getByTestId('local-server-testid').first() - await expect(localServer).toBeVisible({ + const APIKeyError = page.getByTestId('invalid-API-key-error') + await expect(APIKeyError).toBeVisible({ timeout: TIMEOUT, }) }) diff --git a/electron/tests/pages/basePage.ts b/electron/tests/pages/basePage.ts index 4e16a3c23..1817bc731 100644 --- a/electron/tests/pages/basePage.ts +++ b/electron/tests/pages/basePage.ts @@ -8,8 +8,9 @@ export class BasePage { constructor( protected readonly page: Page, readonly action: CommonActions, - protected containerId: string - ) {} + protected containerId: string, + ) { + } public getValue(key: string) { return this.action.getValue(key) @@ -24,7 +25,11 @@ export class BasePage { } async navigateByMenu() { - await this.page.getByTestId(this.menuId).first().click() + await this.clickFirstElement(this.menuId) + } + + async clickFirstElement(testId: string) { + await this.page.getByTestId(testId).first().click() } async verifyContainerVisible() { @@ -36,7 +41,7 @@ export class BasePage { await this.isElementVisible('img[alt="Jan - Logo"]') } - //wait and find a specific element with it's selector and return Visible + //wait and find a specific element with its selector and return Visible async isElementVisible(selector: any) { let isVisible = true await this.page diff --git a/web/screens/Chat/ErrorMessage/index.tsx b/web/screens/Chat/ErrorMessage/index.tsx index 60f4a9ada..69f822dad 100644 --- a/web/screens/Chat/ErrorMessage/index.tsx +++ b/web/screens/Chat/ErrorMessage/index.tsx @@ -43,7 +43,7 @@ const ErrorMessage = ({ message }: { message: ThreadMessage }) => { case ErrorCode.InvalidApiKey: case ErrorCode.InvalidRequestError: return ( - + Invalid API key. Please check your API key from{' '} From 9abea8067b789bff25f3eb10eebeac4578eb6e0a Mon Sep 17 00:00:00 2001 From: Van-QA Date: Wed, 10 Apr 2024 18:51:08 +0700 Subject: [PATCH 3/5] chore: add wait time for loader --- electron/tests/e2e/thread.e2e.spec.ts | 4 +++- web/containers/Loader/GenerateResponse.tsx | 1 + web/containers/Loader/ModelStart.tsx | 1 + 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/electron/tests/e2e/thread.e2e.spec.ts b/electron/tests/e2e/thread.e2e.spec.ts index bc7acf281..9a69c36a4 100644 --- a/electron/tests/e2e/thread.e2e.spec.ts +++ b/electron/tests/e2e/thread.e2e.spec.ts @@ -1,7 +1,7 @@ import { expect } from '@playwright/test' import { page, test, TIMEOUT } from '../config/fixtures' -test('Select GPT model for chat via Use model button from Jan Hub', async ({ hubPage }) => { +test('Select GPT model from Hub and Chat with Invalid API Key', async ({ hubPage }) => { await hubPage.navigateByMenu() await hubPage.verifyContainerVisible() @@ -23,6 +23,8 @@ test('Select GPT model for chat via Use model button from Jan Hub', async ({ hub .getByTestId('btn-send-chat') .click() + await page.waitForSelector('[data-testid$="-loader"]', { state: 'hidden', timeout: TIMEOUT }); + const APIKeyError = page.getByTestId('invalid-API-key-error') await expect(APIKeyError).toBeVisible({ timeout: TIMEOUT, diff --git a/web/containers/Loader/GenerateResponse.tsx b/web/containers/Loader/GenerateResponse.tsx index 457c44987..844123dd2 100644 --- a/web/containers/Loader/GenerateResponse.tsx +++ b/web/containers/Loader/GenerateResponse.tsx @@ -31,6 +31,7 @@ export default function GenerateResponse() {
Generating response...
diff --git a/web/containers/Loader/ModelStart.tsx b/web/containers/Loader/ModelStart.tsx index f7bc04481..126044e01 100644 --- a/web/containers/Loader/ModelStart.tsx +++ b/web/containers/Loader/ModelStart.tsx @@ -40,6 +40,7 @@ export default function ModelStart() {
{stateModel.state === 'start' ? 'Starting' : 'Stopping'} From 09080a96c111b79b91bb7008e01eb3a1dd4b5578 Mon Sep 17 00:00:00 2001 From: Van-QA Date: Wed, 10 Apr 2024 19:21:10 +0700 Subject: [PATCH 4/5] chore: test wait timeout on linux --- electron/tests/e2e/thread.e2e.spec.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/electron/tests/e2e/thread.e2e.spec.ts b/electron/tests/e2e/thread.e2e.spec.ts index 9a69c36a4..c13e91119 100644 --- a/electron/tests/e2e/thread.e2e.spec.ts +++ b/electron/tests/e2e/thread.e2e.spec.ts @@ -23,7 +23,10 @@ test('Select GPT model from Hub and Chat with Invalid API Key', async ({ hubPage .getByTestId('btn-send-chat') .click() - await page.waitForSelector('[data-testid$="-loader"]', { state: 'hidden', timeout: TIMEOUT }); + await page.waitForFunction(() => { + const loaders = document.querySelectorAll('[data-testid$="loader"]'); + return !loaders.length; + }, { timeout: TIMEOUT }); const APIKeyError = page.getByTestId('invalid-API-key-error') await expect(APIKeyError).toBeVisible({ From 76c05eec9950c46a57b0912d619e0ede241da1c9 Mon Sep 17 00:00:00 2001 From: Van-QA Date: Wed, 10 Apr 2024 21:04:16 +0700 Subject: [PATCH 5/5] chore: workflow dispatch will not trigger antivirus to save resources --- .github/workflows/jan-electron-linter-and-test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/jan-electron-linter-and-test.yml b/.github/workflows/jan-electron-linter-and-test.yml index 14d4f4f4e..a9f934cfd 100644 --- a/.github/workflows/jan-electron-linter-and-test.yml +++ b/.github/workflows/jan-electron-linter-and-test.yml @@ -111,7 +111,7 @@ jobs: CSC_IDENTITY_AUTO_DISCOVERY: "false" test-on-windows: - if: github.event_name == 'push' || github.event_name == 'workflow_dispatch' + if: github.event_name == 'push' strategy: fail-fast: false matrix: