mirror of
https://github.com/mattermost/mattermost.git
synced 2025-02-25 18:55:24 -06:00
add README, fix pipeline
This commit is contained in:
2
.github/workflows/e2e-fulltests-ci.yml
vendored
2
.github/workflows/e2e-fulltests-ci.yml
vendored
@@ -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 }}"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
214
e2e-tests/playwright/lib/README.md
Normal file
214
e2e-tests/playwright/lib/README.md
Normal 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.
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -13,10 +13,7 @@
|
||||
"strictNullChecks": true,
|
||||
"skipLibCheck": true,
|
||||
"noEmit": true,
|
||||
"baseUrl": ".",
|
||||
"paths": {
|
||||
"@/fixture": ["fixture.ts"]
|
||||
}
|
||||
"baseUrl": "."
|
||||
},
|
||||
"include": ["./**/*"],
|
||||
"exclude": ["node_modules", "playwright-report"]
|
||||
|
||||
Reference in New Issue
Block a user