add README, fix pipeline

This commit is contained in:
Saturnino Abril
2025-02-13 05:03:09 +08:00
parent cb8263ac5a
commit 5b35ebf3f8
8 changed files with 230 additions and 17 deletions

View File

@@ -70,7 +70,7 @@ jobs:
SERVER: "${{ steps.generate.outputs.SERVER }}"
ENABLED_DOCKER_SERVICES: "${{ steps.generate.outputs.ENABLED_DOCKER_SERVICES }}"
TEST_FILTER_CYPRESS: "${{ steps.generate.outputs.TEST_FILTER_CYPRESS }}"
TEST_FILTER_PLAYWRIGHT: "--project=chrome" # Note: Run on chrome but eventually will enable to all projects which include firefox and ipad.
TEST_FILTER_PLAYWRIGHT: "tests"
BUILD_ID: "${{ steps.generate.outputs.BUILD_ID }}"
TM4J_ENABLE: "${{ steps.generate.outputs.TM4J_ENABLE }}"
REPORT_TYPE: "${{ steps.generate.outputs.REPORT_TYPE }}"

View File

@@ -98,7 +98,7 @@ case "${TEST:-$TEST_DEFAULT}" in
cypress )
export TEST_FILTER_DEFAULT='--stage=@prod --group=@smoke' ;;
playwright )
export TEST_FILTER_DEFAULT='-- -- functional/system_console/system_users/actions.spec.ts --project=chrome' ;;
export TEST_FILTER_DEFAULT='functional/system_console/system_users/actions.spec.ts' ;;
* )
export TEST_FILTER_DEFAULT='' ;;
esac

View File

@@ -5,7 +5,7 @@ cd "$(dirname "$0")"
mme2e_log "Prepare Playwright: clean and initialize report and logs directory"
${MME2E_DC_SERVER} exec -T -u "$MME2E_UID" -- playwright bash <<EOF
cd e2e-tests/playwright/test
cd e2e-tests/playwright
rm -rf logs results storage_state
mkdir -p logs results
touch logs/mattermost.log
@@ -35,20 +35,19 @@ EOF
# Run Playwright test
# NB: do not exit the script if some testcases fail
${MME2E_DC_SERVER} exec -i -u "$MME2E_UID" -- playwright bash -c "cd e2e-tests/playwright && npm run test ${TEST_FILTER}" | tee ../playwright/test/logs/playwright.log || true
${MME2E_DC_SERVER} exec -i -u "$MME2E_UID" -- playwright bash -c "cd e2e-tests/playwright && npm run test:ci -- ${TEST_FILTER}" | tee ../playwright/logs/playwright.log || true
# Collect run results
# Documentation on the results.json file: https://playwright.dev/docs/api/class-testcase#test-case-expected-status
# NB: the following line is needed only for compatibility reasons, to support RollingRelease tests for versions prior to v10.1.0
# It can be removed once 9.11 (ESR) is no longer supported
mv -v ../playwright/playwright-report/results.json ../playwright/test/results/reporter/results.json 2>/dev/null || true
# It can be removed after releases <=v10.0.x are phased out
mv -v ../playwright/playwright-report/results.json ../playwright/results/reporter/results.json 2>/dev/null || true
# NB: the following line is needed only for compatibility reasons, to support RollingRelease tests for versions prior to v10.6.0
# It can be removed once 10.5 (ESR) is no longer supported
mv -v ../playwright/results/reporter/results.json ../playwright/test/results/reporter/results.json 2>/dev/null || true
mv -v ../playwright/test/results/ ../playwright/ 2>/dev/null || true
jq -f /dev/stdin ../playwright/test/results/reporter/results.json > ../playwright/test/results/summary.json <<EOF
jq -f /dev/stdin ../playwright/results/reporter/results.json > ../playwright/results/summary.json <<EOF
{
passed: .stats.expected,
failed: .stats.unexpected,
@@ -57,4 +56,4 @@ jq -f /dev/stdin ../playwright/test/results/reporter/results.json > ../playwrigh
EOF
# Collect server logs
${MME2E_DC_SERVER} logs --no-log-prefix -- server >../playwright/test/logs/mattermost.log 2>&1
${MME2E_DC_SERVER} logs --no-log-prefix -- server >../playwright/logs/mattermost.log 2>&1

View File

@@ -0,0 +1,214 @@
# @mattermost/playwright-lib
A comprehensive end-to-end testing library for Mattermost web, desktop and plugin applications using Playwright.
## Overview
This library provides:
- Pre-built page objects and components for common Mattermost UI elements
- Server configuration and initialization utilities
- Test fixtures and helpers
- Visual testing support with Percy integration
- Accessibility testing support with [axe-core](https://github.com/dequelabs/axe-core)
- Browser notification mocking
- File handling utilities
- Common test actions and assertions
## Installation
```bash
npm install @mattermost/playwright-lib
```
## Usage
Basic example of logging in and posting a message:
```typescript
import {test, expect} from '@mattermost/playwright-lib';
test('user can post message', async ({pw}) => {
// # Create and login a new user
const {user} = await pw.initSetup();
const {channelsPage} = await pw.testBrowser.login(user);
// # Navigate and post a message
await channelsPage.goto();
const message = 'Hello World!';
await channelsPage.postMessage(message);
// * Verify message appears
const lastPost = await channelsPage.getLastPost();
await expect(lastPost).toHaveText(message);
});
```
## Key Components
### Page Objects
Ready-to-use page objects for common Mattermost pages:
- Login
- Signup
- Channels
- System Console
- And more...
### UI Components
Reusable component objects for UI elements:
- Headers
- Posts
- Menus
- Modals
- And more...
### Test Utilities
Helper functions for common testing needs:
- Server setup and configuration
- User/team creation
- File handling
- Visual testing
- And more...
## Configuration
The library can be configured via optional environment variables:
### Environment Variables
All environment variables are optional with sensible defaults.
#### Server Configuration
| Variable | Description | Default |
| ----------------------------- | ------------------------------------------ | -------------------------------- |
| `PW_BASE_URL` | Server URL | `http://localhost:8065` |
| `PW_ADMIN_USERNAME` | Admin username | `sysadmin` |
| `PW_ADMIN_PASSWORD` | Admin password | `Sys@dmin-sample1` |
| `PW_ADMIN_EMAIL` | Admin email | `sysadmin@sample.mattermost.com` |
| `PW_ENSURE_PLUGINS_INSTALLED` | Comma-separated list of plugins to install | `[]` |
| `PW_RESET_BEFORE_TEST` | Reset server before test | `false` |
#### High Availability Cluster Settings
| Variable | Description | Default |
| -------------------------- | ----------------------- | ---------------- |
| `PW_HA_CLUSTER_ENABLED` | Enable HA cluster | `false` |
| `PW_HA_CLUSTER_NODE_COUNT` | Number of cluster nodes | `2` |
| `PW_HA_CLUSTER_NAME` | Cluster name | `mm_dev_cluster` |
#### Push Notifications
| Variable | Description | Default |
| ----------------------------- | ---------------------------- | ---------------------------------- |
| `PW_PUSH_NOTIFICATION_SERVER` | Push notification server URL | `https://push-test.mattermost.com` |
#### Playwright Settings
| Variable | Description | Default |
| ------------- | ------------------------------- | ------- |
| `PW_HEADLESS` | Run tests headless | `true` |
| `PW_SLOWMO` | Add delay between actions in ms | `0` |
| `PW_WORKERS` | Number of parallel workers | `1` |
#### Visual Testing
| Variable | Description | Default |
| -------------------- | --------------------------- | ------- |
| `PW_SNAPSHOT_ENABLE` | Enable snapshot testing | `false` |
| `PW_PERCY_ENABLE` | Enable Percy visual testing | `false` |
#### CI Settings
| Variable | Description | Default |
| -------- | ------------------------------------ | ------- |
| `CI` | Set automatically in CI environments | N/A |
## Accessibility Testing
The library includes built-in accessibility testing using [axe-core](https://github.com/dequelabs/axe-core):
```typescript
import {test, expect} from '@mattermost/playwright-lib';
test('verify login page accessibility', async ({page, axe}) => {
// # Navigate to login page
await page.goto('/login');
// # Run accessibility scan
const results = await axe.builder(page).analyze();
// * Verify no accessibility violations
expect(results.violations).toHaveLength(0);
});
```
The axe-core integration:
- Runs WCAG 2.0 Level A & AA rules by default
- Provides detailed violation reports
- Supports rule customization
- Can be configured per-test or globally
## Visual Testing
The library supports visual testing through [Playwright's built-in visual comparisons](https://playwright.dev/docs/test-snapshots) and [Percy](https://www.browserstack.com/percy) integration:
```typescript
import {test, expect} from '@mattermost/playwright-lib';
test('verify channel header appearance', async ({pw, browserName, viewport}, testInfo) => {
// # Setup and login
const {user} = await pw.initSetup();
const {page, channelsPage} = await pw.testBrowser.login(user);
// # Navigate and prepare page
await channelsPage.goto();
await expect(channelsPage.appBar.playbooksIcon).toBeVisible();
await pw.hideDynamicChannelsContent(page);
// * Take and verify snapshot
await pw.matchSnapshot(testInfo, {page, browserName, viewport});
});
```
## Browser Notifications
Mock and verify browser notifications:
```typescript
import {test, expect} from '@mattermost/playwright-lib';
test('verify notification on mention', async ({pw}) => {
// # Setup users and team
const {team, adminUser, user} = await pw.initSetup();
// # Setup admin browser with notifications
const {page: adminPage, channelsPage: adminChannelsPage} = await pw.testBrowser.login(adminUser);
await adminChannelsPage.goto(team.name, 'town-square');
await pw.stubNotification(adminPage, 'granted');
// # Setup user browser and post mention
const {channelsPage: userChannelsPage} = await pw.testBrowser.login(user);
await userChannelsPage.goto(team.name, 'off-topic');
await userChannelsPage.postMessage(`@ALL good morning, ${team.name}!`);
// * Verify notification received
const notifications = await pw.waitForNotification(adminPage);
expect(notifications.length).toBe(1);
});
```
## Contributing
See [CONTRIBUTING.md](../../../CONTRIBUTING.md) for development setup and guidelines.
## License
See [LICENSE.txt](../../../LICENSE.txt) for license information.

View File

@@ -10,7 +10,8 @@
"build-tsc": "tsc --build --verbose",
"build-tsc:watch": "tsc --watch --preserveWatchOutput",
"clean": "rm -rf dist node_modules *.tsbuildinfo",
"tsc": "tsc -b"
"tsc": "tsc -b",
"publish": "npm publish --access=public"
},
"files": [
"dist"

View File

@@ -9,13 +9,14 @@
"postinstall": "npm run build",
"build": "npm run build --workspaces --if-present",
"build:watch": "npm run build:watch --workspaces --if-present",
"clean": "rm -rf node_modules && npm run clean --workspaces --if-present",
"clean": "rm -rf node_modules logs results test-results && npm run clean --workspaces --if-present",
"tsc": "npm run tsc --workspaces --if-present",
"lint": "eslint .",
"prettier": "prettier . --check",
"prettier:fix": "prettier --write .",
"check": "npm run lint && npm run prettier && npm run tsc",
"test": "npm run test --workspace=test"
"test": "npm run test --workspace=test",
"test:ci": "npm run test:ci --workspace=test"
},
"dependencies": {
"@playwright/test": "1.50.1"

View File

@@ -3,6 +3,7 @@
"version": "0.0.1",
"scripts": {
"test": "cross-env PW_SNAPSHOT_ENABLE=true playwright test",
"test:ci": "cross-env PW_SNAPSHOT_ENABLE=true playwright test --project=chrome",
"test:update-snapshots": "cross-env PW_SNAPSHOT_ENABLE=true playwright test --update-snapshots",
"percy": "cross-env PERCY_TOKEN=$PERCY_TOKEN PW_PERCY_ENABLE=true percy exec -- playwright test --project=chrome --project=ipad",
"tsc": "tsc -b",

View File

@@ -13,10 +13,7 @@
"strictNullChecks": true,
"skipLibCheck": true,
"noEmit": true,
"baseUrl": ".",
"paths": {
"@/fixture": ["fixture.ts"]
}
"baseUrl": "."
},
"include": ["./**/*"],
"exclude": ["node_modules", "playwright-report"]