Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Test PR for testing new Dockerized testing #233

Open
wants to merge 52 commits into
base: main
Choose a base branch
from
Open
Changes from 45 commits
Commits
Show all changes
52 commits
Select commit Hold shift + click to select a range
83e104e
Updated tests:e2e script for compatibility with new dockerized testin…
Jurredr Jan 27, 2025
4268066
Modified e2e docker script and added local e2e testing script
Jurredr Jan 27, 2025
9be18d0
Added dockerfile for E2E testing
Jurredr Jan 27, 2025
a8bd82d
Added trace npm scripts for Playwright tracing
Jurredr Jan 27, 2025
e8382d9
Renamed docker image and container names
Jurredr Jan 28, 2025
6738907
Updated node version in Dockerfile
Jurredr Jan 28, 2025
f104dc8
Added separate npm script for building docker image
Jurredr Jan 28, 2025
3a63184
Changed trace mode to upload traces for each failed test
Jurredr Jan 28, 2025
c4aebd8
Added JUnit xml reporter to Playwright
Jurredr Jan 28, 2025
0aae515
Updated Docker run command
Jurredr Jan 28, 2025
8a2b3f1
Added command to inspect Docker E2E test results
Jurredr Jan 28, 2025
1a9bf77
Changed docker inspect target name to "flarechatui-e2e-container"
Jurredr Jan 28, 2025
f04f641
Added docker clean script / step to container runner
Jurredr Jan 28, 2025
a21663d
Removed test results / last run file from default ui-tests dir
Jurredr Jan 28, 2025
0ae6c09
Added JUnit reporter for Playwright
Jurredr Jan 29, 2025
bffafdc
Migrated jest-playwright to playwright/test
Jurredr Jan 29, 2025
438608b
Added test reports to git ignore
Jurredr Jan 30, 2025
b5f193f
Generate all test results in one separate root directory
Jurredr Jan 30, 2025
9ee2bda
Ignore Dockerfile from eslint
Jurredr Jan 30, 2025
ba9a8aa
Merge branch 'main' into jurredr/dockerized-testing
Jurredr Jan 30, 2025
23b144a
Use npm install instead of ci in docker image
Jurredr Jan 30, 2025
a5acfea
Test fixes for playwright library migration
Jurredr Jan 30, 2025
119bb9b
Removed all existing image snapshots
Jurredr Feb 3, 2025
1775fbb
Updated dockerfile to only include relevant files and folders in dock…
Jurredr Feb 3, 2025
0633e6b
Implemented new GitHub CI script for E2E testing through Docker
Jurredr Feb 3, 2025
623fbb4
Ignore e2e-results folder from eslint
Jurredr Feb 3, 2025
af44e63
ci: only send slack message on non-draft prs
Jurredr Feb 4, 2025
5e3675d
Fixed GitHub new_pr workflow, only runs for non-draft PRs properly now
Jurredr Feb 4, 2025
cb221ed
Fixed non-draft PR check in GitHub workflow
Jurredr Feb 4, 2025
be5bae0
Merge branch 'main' into jurredr/dockerized-testing
Jurredr Feb 4, 2025
c5913b9
Merge branch 'main' into jurredr/dockerized-testing
Jurredr Feb 4, 2025
e4d226c
Made all individual E2E tests run on their own
Jurredr Feb 5, 2025
1bca731
Added and tested form tests to work individually with new E2E flow
Jurredr Feb 5, 2025
dcb6ddf
Fully run all tests in parallel
Jurredr Feb 5, 2025
3fad9f3
Fixed all existing test flows to work with new parallel runner
Jurredr Feb 5, 2025
2c5583e
Remove failure check on uploading of artifacts in new_pr test workflow
Jurredr Feb 11, 2025
9eec00e
Extracted e2e testing to separate workflow, added dockerized E2E step…
Jurredr Feb 11, 2025
67bea9b
Temporarily disabled slack messager for new prs while testing e2e wor…
Jurredr Feb 11, 2025
ef60fd0
Attempt at fixing linting errors
Jurredr Feb 11, 2025
069a00b
Added build step before linting
Jurredr Feb 11, 2025
87151df
New lint fix attempt
Jurredr Feb 11, 2025
0e6f7b2
Fixed incorrect npm install command in e2e build step
Jurredr Feb 11, 2025
ad6321a
e2e build fix
Jurredr Feb 11, 2025
361080a
Force Playwright workers to be 6
Jurredr Feb 11, 2025
6b448da
continue e2e workflow on test suite error
Jurredr Feb 11, 2025
26e985c
Merged main into dockerized testing branch
Jurredr Mar 4, 2025
41aa55e
Updated test result reporter type to jest-junit
Jurredr Mar 4, 2025
36e37a0
Removed commented code
Jurredr Mar 4, 2025
e4e600a
Removed console log from e2e test
Jurredr Mar 4, 2025
59373dd
Updated incorrect ui-test result paths
Jurredr Mar 4, 2025
785be97
Specify branch for snapshot replacement commit, change test reporter …
Jurredr Mar 4, 2025
fc46244
Ignore zip and xml files from eslint
Jurredr Mar 4, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .eslintignore
Original file line number Diff line number Diff line change
@@ -18,3 +18,5 @@ out
LICENSE
THIRD-PARTY-LICENSES
NOTICE
Dockerfile
e2e-results
71 changes: 71 additions & 0 deletions .github/workflows/e2e.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
name: Run E2E Tests
on: workflow_call
jobs:
e2e:
# Prevents the workflow running from snapshot updates committed by the bot
if: github.actor != 'github-actions[bot]'
runs-on: ubuntu-latest
steps:
# Checkout the PR branch
- name: Checkout Code
uses: actions/checkout@v4

# Set up Node
- name: Set up Node
uses: actions/setup-node@v4
with:
node-version: '20.x'
registry-url: 'https://registry.npmjs.org'
scope: '@aws'

# Install
- name: Install NPM packages
run: npm ci

# Build
- name: Build
run: npm run build && cd ./ui-tests && npm install && cd ..

# Run the linter
- name: Run linter
run: npm run lint

# Build and run Docker image
- name: Build and run E2E tests Docker Image
run: npm run tests:e2e
continue-on-error: true

# Extract test results from Docker container
- name: Extract test results from Docker container
if: ${{ !failure() }}
run: npm run docker:inspect:override

# Upload an artifact of all the results
- name: Upload E2E results
uses: actions/upload-artifact@v4
with:
name: snapshots
path: ./ui-tests/__test__/__results__
retention-days: 30

# Replace branch content with snapshots produced by Docker
- name: Replace Snapshots in PR Branch
if: ${{ !failure() }}
run: |
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
git add ./ui-tests/__test__/__results__/__snapshots__
git commit -m "[Docker] Update E2E image snapshots"
git push
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

# Report test results using JUnit XML
- name: Publish Test Results
uses: dorny/test-reporter@v1
if: ${{ !cancelled() }}
with:
name: E2E Tests
path: ./ui-tests/__test__/__results__/__reports__/junit.xml
reporter: junit
fail-on-error: false
65 changes: 21 additions & 44 deletions .github/workflows/new_pr.yml
Original file line number Diff line number Diff line change
@@ -1,48 +1,25 @@
name: Check Lint, Tests and Build
name: New PR created
on:
pull_request:
branches: [main, feature/*, fix/*]
branches: [main]
types: [opened, reopened, ready_for_review, synchronize]
jobs:
notify:
if: github.event.pull_request.draft == false
name: Slack notification
runs-on: [ubuntu-latest]
steps:
- name: Post message
uses: slackapi/slack-github-action@v1.25.0
env:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
with:
payload: |
{
"title": ${{ toJson(github.event.pull_request.title) }},
"author": ${{ toJson(github.event.pull_request.user.login) }},
"link": ${{ toJson(github.event.pull_request.html_url) }},
"repository": "FlareChatUI"
}
build:
runs-on: macos-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 20
- uses: actions/setup-node@v4
with:
node-version: '20'
registry-url: 'https://registry.npmjs.org'
scope: '@aws'
- name: Install
run: npm ci
- name: Build
run: npm run build
- name: Run Unit and E2E tests
run: npm run tests:unit && npm run tests:e2e
- name: Run Lint
run: npm run lint
- uses: actions/upload-artifact@v4
if: ${{ !cancelled() }}
with:
name: test-snapshots
path: ./ui-tests/__test__/__image_snapshots__
retention-days: 30
# notify:
# if: github.event.pull_request.draft == false
# name: Slack notification
# runs-on: ubuntu-latest
# steps:
# - name: Post message
# uses: slackapi/slack-github-action@v1.25.0
# env:
# SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
# with:
# payload: |
# {
# "title": ${{ toJson(github.event.pull_request.title) }},
# "author": ${{ toJson(github.event.pull_request.user.login) }},
# "link": ${{ toJson(github.event.pull_request.html_url) }},
# "repository": "FlareChatUI"
# }
e2e:
uses: ./.github/workflows/e2e.yml
16 changes: 7 additions & 9 deletions .github/workflows/publish.yml
Original file line number Diff line number Diff line change
@@ -6,19 +6,17 @@ jobs:
build:
runs-on: macos-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20.x'
registry-url: 'https://registry.npmjs.org'
scope: '@aws'
- run: npm ci
- name: Build mynah-ui
run: npm run build
- name: Run tests
run: npm run tests:unit && npm run tests:e2e
- name: Check lint
run: npm run lint
# Install
- name: Run E2E tests
uses: ./.github/workflows/e2e.yml
- name: Run unit tests
run: npm run tests:unit
- name: Build demo app
run: npm run packdemo
- name: Get release info
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -9,4 +9,6 @@ node_modules
.idea
package-lock.json
.gitcommit
.vscode
.vscode
__reports__/
e2e-results/
33 changes: 33 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# Use a base Node image
FROM node:22

# Set working directory
WORKDIR /app

# Copy the src from the root
COPY ./src /app/src

# Copy config files from root
COPY ./package.json /app
COPY ./package-lock.json /app
COPY ./postinstall.js /app
COPY ./webpack.config.js /app
COPY ./tsconfig.json /app

# Copy required files from ui-tests
COPY ./ui-tests/package.json /app/ui-tests/
COPY ./ui-tests/playwright.config.ts /app/ui-tests/
COPY ./ui-tests/tsconfig.json /app/ui-tests/
COPY ./ui-tests/webpack.config.js /app/ui-tests/

# Copy the __test__ and src directories from ui-tests
COPY ./ui-tests/__test__ /app/ui-tests/__test__
COPY ./ui-tests/src /app/ui-tests/src

# Install dependencies and build MynahUI
RUN npm install
RUN npm run build
RUN cd ./ui-tests && npm install && npm run prepare

# Default command to run the tests
CMD ["npm", "run", "docker:internal"]
9 changes: 8 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -27,8 +27,15 @@
"lint": "npx eslint \"./**\"",
"format:check": "npx prettier --check .",
"format:write": "npx prettier --write .",
"docker:build": "docker build -t flarechatui-e2e-image .",
"docker:run": "npm run docker:clean || true && docker run --name flarechatui-e2e-container flarechatui-e2e-image",
"docker:internal": "cd ./ui-tests && npm run e2e",
"docker:inspect": "docker export $(docker ps -a -q -f name=flarechatui-e2e-container) | tar -xvf - app/ui-tests/__results__ && mv app/ui-tests/__results__ ./e2e-results && rm -rf ./app",
"docker:inspect:override": "rm -rf ./ui-tests/__test__/__results__ && docker export $(docker ps -a -q -f name=flarechatui-e2e-container) | tar -xvf - app/ui-tests/__results__ && mv app/ui-tests/__results__ ./ui-tests/__results__ && rm -rf ./app",
"docker:clean": "docker rm -f flarechatui-e2e-container",
"tests:unit": "jest",
"tests:e2e": "cd ./ui-tests && npm install && npm run prepare && npm run e2e",
"tests:e2e": "npm run docker:build && npm run docker:run",
"tests:e2e:trace": "cd ./ui-tests && npm run trace",
"api-docs": "npx typedoc src/main.ts --out ./api-docs",
"api-doc-deploy": "npx typedoc src/main.ts --out ./example/dist/api-doc",
"postinstall": "node postinstall.js",
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
6 changes: 3 additions & 3 deletions ui-tests/__test__/flows/click-followup.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Page } from 'playwright/test';
import { expect, Page } from 'playwright/test';
import { getSelector, waitForAnimationEnd } from '../helpers';
import testIds from '../../../src/helper/test-ids';

@@ -13,7 +13,7 @@ export const clickToFollowup = async (page: Page, skipScreenshots?: boolean): Pr
await waitForAnimationEnd(page);

if (skipScreenshots !== true) {
const chatItemsContainer = await page.waitForSelector(getSelector(testIds.chat.chatItemsContainer));
expect(await chatItemsContainer.screenshot()).toMatchImageSnapshot();
const chatItemsContainer = await page.waitForSelector(`${getSelector(testIds.chat.chatItemsContainer)}`);
expect(await chatItemsContainer.screenshot()).toMatchSnapshot();
}
};
4 changes: 2 additions & 2 deletions ui-tests/__test__/flows/close-tab.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Page } from 'playwright/test';
import { expect, Page } from 'playwright/test';
import testIds from '../../../src/helper/test-ids';
import { getSelector } from '../helpers';

@@ -15,6 +15,6 @@ export const closeTab = async (page: Page, withDblClick?: boolean, skipScreensho

if (skipScreenshots !== true) {
// No tabs snap
expect(await page.screenshot()).toMatchImageSnapshot();
expect(await page.screenshot()).toMatchSnapshot();
}
};
13 changes: 11 additions & 2 deletions ui-tests/__test__/flows/feedback-form/cancel-feedback-form.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,23 @@
import { Page } from 'playwright/test';
import { expect, Page } from 'playwright/test';
import { getSelector, waitForAnimationEnd } from '../../helpers';
import testIds from '../../../../src/helper/test-ids';
import { renderDownvoteResult } from './render-downvote-result';

export const cancelFeedbackForm = async (page: Page, skipScreenshots?: boolean): Promise<void> => {
await renderDownvoteResult(page, true);
await waitForAnimationEnd(page);

const reportButton = page.locator(getSelector(testIds.chatItem.vote.reportButton));
expect(reportButton).toBeDefined();
await reportButton.click();
await waitForAnimationEnd(page);

const cancelButton = page.locator(getSelector(testIds.feedbackForm.cancelButton));
expect(cancelButton).toBeDefined();
await cancelButton.click();
await waitForAnimationEnd(page);

if (skipScreenshots !== true) {
expect(await page.screenshot()).toMatchImageSnapshot();
expect(await page.screenshot()).toMatchSnapshot();
}
};
21 changes: 4 additions & 17 deletions ui-tests/__test__/flows/feedback-form/render-downvote-result.ts
Original file line number Diff line number Diff line change
@@ -1,23 +1,10 @@
import { Page } from 'playwright/test';
import { expect, Page } from 'playwright/test';
import { getSelector, waitForAnimationEnd } from '../../helpers';
import testIds from '../../../../src/helper/test-ids';
import { renderFeedbackForm } from './render-feedback-form';

export const renderDownvoteResult = async (page: Page, skipScreenshots?: boolean): Promise<void> => {
await page.evaluate((body) => {
const selectedTabId = window.mynahUI.getSelectedTabId();
if (selectedTabId != null) {
window.mynahUI.updateStore(selectedTabId, {
chatItems: [],
});

window.mynahUI.addChatItem(selectedTabId, {
type: 'answer' as any,
snapToTop: true,
body: 'This message is votable.',
canBeVoted: true,
});
}
});
await renderFeedbackForm(page, true);
await waitForAnimationEnd(page);

const thumbsDown = page.locator(getSelector(testIds.chatItem.vote.downvoteLabel));
@@ -26,6 +13,6 @@ export const renderDownvoteResult = async (page: Page, skipScreenshots?: boolean
await waitForAnimationEnd(page);

if (skipScreenshots !== true) {
expect(await page.screenshot()).toMatchImageSnapshot();
expect(await page.screenshot()).toMatchSnapshot();
}
};
42 changes: 21 additions & 21 deletions ui-tests/__test__/flows/feedback-form/render-feedback-form.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Page } from 'playwright/test';
import { expect, Page } from 'playwright/test';
import { getSelector, waitForAnimationEnd } from '../../helpers';
import testIds from '../../../../src/helper/test-ids';

@@ -19,31 +19,31 @@ export const renderFeedbackForm = async (page: Page, skipScreenshots?: boolean):
}
});

const thumbsDown = page.locator(getSelector(testIds.chatItem.vote.downvoteLabel));
expect(thumbsDown).toBeDefined();
await thumbsDown.click();
await waitForAnimationEnd(page);
if (skipScreenshots !== true) {
const thumbsDown = page.locator(getSelector(testIds.chatItem.vote.downvoteLabel));
expect(thumbsDown).toBeDefined();
await thumbsDown.click();
await waitForAnimationEnd(page);

const reportButton = page.locator(getSelector(testIds.chatItem.vote.reportButton));
expect(reportButton).toBeDefined();
await reportButton.click();
await waitForAnimationEnd(page);
const reportButton = page.locator(getSelector(testIds.chatItem.vote.reportButton));
expect(reportButton).toBeDefined();
await reportButton.click();
await waitForAnimationEnd(page);

const commentInput = page.locator(getSelector(testIds.feedbackForm.comment));
expect(commentInput).toBeDefined();
await commentInput.fill('This is some feedback comment');
await waitForAnimationEnd(page);
const commentInput = page.locator(getSelector(testIds.feedbackForm.comment));
expect(commentInput).toBeDefined();
await commentInput.fill('This is some feedback comment');
await waitForAnimationEnd(page);

const descriptionText = page.locator(getSelector(testIds.feedbackForm.description));
expect(descriptionText).toBeDefined();
const descriptionText = page.locator(getSelector(testIds.feedbackForm.description));
expect(descriptionText).toBeDefined();

const submitButton = page.locator(getSelector(testIds.feedbackForm.submitButton));
expect(submitButton).toBeDefined();
const submitButton = page.locator(getSelector(testIds.feedbackForm.submitButton));
expect(submitButton).toBeDefined();

const cancelButton = page.locator(getSelector(testIds.feedbackForm.cancelButton));
expect(cancelButton).toBeDefined();
const cancelButton = page.locator(getSelector(testIds.feedbackForm.cancelButton));
expect(cancelButton).toBeDefined();

if (skipScreenshots !== true) {
expect(await page.screenshot()).toMatchImageSnapshot();
expect(await page.screenshot()).toMatchSnapshot();
}
};
Loading
Oops, something went wrong.
Loading
Oops, something went wrong.