Merge pull request 'feat: add Playwright testing framework configuration and tests' (#71) from feature/add-playwright into main
All checks were successful
Playwright Tests / test (push) Successful in 2m7s
All checks were successful
Playwright Tests / test (push) Successful in 2m7s
Reviewed-on: #71
This commit is contained in:
commit
11da909e3f
17 changed files with 503 additions and 10 deletions
71
.github/workflows/playwright.yml
vendored
Normal file
71
.github/workflows/playwright.yml
vendored
Normal file
|
@ -0,0 +1,71 @@
|
||||||
|
name: Playwright Tests
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ main, master ]
|
||||||
|
pull_request:
|
||||||
|
branches: [ main, master ]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
test:
|
||||||
|
timeout-minutes: 60
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
services:
|
||||||
|
postgres-employee:
|
||||||
|
image: postgres:13.3
|
||||||
|
env:
|
||||||
|
POSTGRES_DB: employee_db
|
||||||
|
POSTGRES_USER: employee
|
||||||
|
POSTGRES_PASSWORD: secret
|
||||||
|
|
||||||
|
employee:
|
||||||
|
image: berndheidemann/employee-management-service:1.1.3
|
||||||
|
# image: berndheidemann/employee-management-service_without_keycloak:1.1
|
||||||
|
env:
|
||||||
|
spring.datasource.url: jdbc:postgresql://postgres-employee:5432/employee_db
|
||||||
|
spring.datasource.username: employee
|
||||||
|
spring.datasource.password: secret
|
||||||
|
|
||||||
|
|
||||||
|
steps:
|
||||||
|
# Checkout the repository
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
# Set up Node.js
|
||||||
|
- uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version: lts/*
|
||||||
|
|
||||||
|
# Install project dependencies
|
||||||
|
- name: Install dependencies
|
||||||
|
run: npm ci
|
||||||
|
|
||||||
|
# Build the Angular project
|
||||||
|
- name: Build Angular Project
|
||||||
|
run: |
|
||||||
|
npm install -g @angular/cli
|
||||||
|
ng build --configuration=pipeline
|
||||||
|
|
||||||
|
# Start Angular development server
|
||||||
|
- name: Start Angular Development Server in Background
|
||||||
|
run: ng serve --configuration=pipeline > angular.log 2>&1 &
|
||||||
|
env:
|
||||||
|
PORT: 4200 # Ensure the server runs on a predictable port
|
||||||
|
|
||||||
|
# Install Playwright and dependencies
|
||||||
|
- name: Install Playwright Browsers
|
||||||
|
run: npx playwright install --with-deps
|
||||||
|
|
||||||
|
# Run Playwright tests
|
||||||
|
- name: Run Playwright Tests
|
||||||
|
run: npx playwright test
|
||||||
|
env:
|
||||||
|
CI: true # Ensures Playwright runs in CI mode
|
||||||
|
|
||||||
|
# Upload Playwright report
|
||||||
|
- uses: actions/upload-artifact@v3
|
||||||
|
if: ${{ !cancelled() }}
|
||||||
|
with:
|
||||||
|
name: playwright-report
|
||||||
|
path: playwright-report/
|
||||||
|
retention-days: 30
|
5
.gitignore
vendored
5
.gitignore
vendored
|
@ -40,3 +40,8 @@ testem.log
|
||||||
# System files
|
# System files
|
||||||
.DS_Store
|
.DS_Store
|
||||||
Thumbs.db
|
Thumbs.db
|
||||||
|
node_modules/
|
||||||
|
/test-results/
|
||||||
|
/playwright-report/
|
||||||
|
/blob-report/
|
||||||
|
/playwright/.cache/
|
||||||
|
|
11
angular.json
11
angular.json
|
@ -52,6 +52,14 @@
|
||||||
"optimization": false,
|
"optimization": false,
|
||||||
"extractLicenses": false,
|
"extractLicenses": false,
|
||||||
"sourceMap": true
|
"sourceMap": true
|
||||||
|
},
|
||||||
|
"pipeline": {
|
||||||
|
"fileReplacements": [
|
||||||
|
{
|
||||||
|
"replace": "src/app/environments/environment.ts",
|
||||||
|
"with": "src/app/environments/environment.ci.ts"
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"defaultConfiguration": "production"
|
"defaultConfiguration": "production"
|
||||||
|
@ -64,6 +72,9 @@
|
||||||
},
|
},
|
||||||
"development": {
|
"development": {
|
||||||
"buildTarget": "employeeService:build:development"
|
"buildTarget": "employeeService:build:development"
|
||||||
|
},
|
||||||
|
"pipeline": {
|
||||||
|
"buildTarget": "employeeService:build:pipeline"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"defaultConfiguration": "development"
|
"defaultConfiguration": "development"
|
||||||
|
|
|
@ -6,14 +6,10 @@ services:
|
||||||
postgres-employee:
|
postgres-employee:
|
||||||
container_name: postgres_employee
|
container_name: postgres_employee
|
||||||
image: postgres:13.3
|
image: postgres:13.3
|
||||||
volumes:
|
|
||||||
- employee_postgres_data:/var/lib/postgresql/data
|
|
||||||
environment:
|
environment:
|
||||||
POSTGRES_DB: employee_db
|
POSTGRES_DB: employee_db
|
||||||
POSTGRES_USER: employee
|
POSTGRES_USER: employee
|
||||||
POSTGRES_PASSWORD: secret
|
POSTGRES_PASSWORD: secret
|
||||||
ports:
|
|
||||||
- "5432:5432"
|
|
||||||
|
|
||||||
employee:
|
employee:
|
||||||
container_name: employee
|
container_name: employee
|
||||||
|
|
68
package-lock.json
generated
68
package-lock.json
generated
|
@ -26,7 +26,9 @@
|
||||||
"@angular-devkit/build-angular": "^18.2.0",
|
"@angular-devkit/build-angular": "^18.2.0",
|
||||||
"@angular/cli": "^18.2.0",
|
"@angular/cli": "^18.2.0",
|
||||||
"@angular/compiler-cli": "^18.2.0",
|
"@angular/compiler-cli": "^18.2.0",
|
||||||
|
"@playwright/test": "^1.49.1",
|
||||||
"@types/jasmine": "~5.1.0",
|
"@types/jasmine": "~5.1.0",
|
||||||
|
"@types/node": "^22.10.7",
|
||||||
"jasmine-core": "~5.2.0",
|
"jasmine-core": "~5.2.0",
|
||||||
"karma": "~6.4.0",
|
"karma": "~6.4.0",
|
||||||
"karma-chrome-launcher": "~3.2.0",
|
"karma-chrome-launcher": "~3.2.0",
|
||||||
|
@ -3896,6 +3898,21 @@
|
||||||
"node": ">=14"
|
"node": ">=14"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@playwright/test": {
|
||||||
|
"version": "1.49.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.49.1.tgz",
|
||||||
|
"integrity": "sha512-Ky+BVzPz8pL6PQxHqNRW1k3mIyv933LML7HktS8uik0bUXNCdPhoS/kLihiO1tMf/egaJb4IutXd7UywvXEW+g==",
|
||||||
|
"dev": true,
|
||||||
|
"dependencies": {
|
||||||
|
"playwright": "1.49.1"
|
||||||
|
},
|
||||||
|
"bin": {
|
||||||
|
"playwright": "cli.js"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=18"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@popperjs/core": {
|
"node_modules/@popperjs/core": {
|
||||||
"version": "2.11.8",
|
"version": "2.11.8",
|
||||||
"resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz",
|
"resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz",
|
||||||
|
@ -4452,11 +4469,10 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@types/node": {
|
"node_modules/@types/node": {
|
||||||
"version": "22.10.5",
|
"version": "22.10.7",
|
||||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.5.tgz",
|
"resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.7.tgz",
|
||||||
"integrity": "sha512-F8Q+SeGimwOo86fiovQh8qiXfFEh2/ocYv7tU5pJ3EXMSSxk1Joj5wefpFK2fHTf/N6HKGSxIDBT9f3gCxXPkQ==",
|
"integrity": "sha512-V09KvXxFiutGp6B7XkpaDXlNadZxrzajcY50EuoLIpQ6WWYCSvf19lVIazzfIzQvhUN2HjX12spLojTnhuKlGg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"undici-types": "~6.20.0"
|
"undici-types": "~6.20.0"
|
||||||
}
|
}
|
||||||
|
@ -10819,6 +10835,50 @@
|
||||||
"url": "https://github.com/sponsors/sindresorhus"
|
"url": "https://github.com/sponsors/sindresorhus"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/playwright": {
|
||||||
|
"version": "1.49.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/playwright/-/playwright-1.49.1.tgz",
|
||||||
|
"integrity": "sha512-VYL8zLoNTBxVOrJBbDuRgDWa3i+mfQgDTrL8Ah9QXZ7ax4Dsj0MSq5bYgytRnDVVe+njoKnfsYkH3HzqVj5UZA==",
|
||||||
|
"dev": true,
|
||||||
|
"dependencies": {
|
||||||
|
"playwright-core": "1.49.1"
|
||||||
|
},
|
||||||
|
"bin": {
|
||||||
|
"playwright": "cli.js"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=18"
|
||||||
|
},
|
||||||
|
"optionalDependencies": {
|
||||||
|
"fsevents": "2.3.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/playwright-core": {
|
||||||
|
"version": "1.49.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.49.1.tgz",
|
||||||
|
"integrity": "sha512-BzmpVcs4kE2CH15rWfzpjzVGhWERJfmnXmniSyKeRZUs9Ws65m+RGIi7mjJK/euCegfn3i7jvqWeWyHe9y3Vgg==",
|
||||||
|
"dev": true,
|
||||||
|
"bin": {
|
||||||
|
"playwright-core": "cli.js"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=18"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/playwright/node_modules/fsevents": {
|
||||||
|
"version": "2.3.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
|
||||||
|
"integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
|
||||||
|
"dev": true,
|
||||||
|
"hasInstallScript": true,
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"darwin"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": "^8.16.0 || ^10.6.0 || >=11.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/postcss": {
|
"node_modules/postcss": {
|
||||||
"version": "8.4.41",
|
"version": "8.4.41",
|
||||||
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz",
|
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz",
|
||||||
|
|
|
@ -28,7 +28,9 @@
|
||||||
"@angular-devkit/build-angular": "^18.2.0",
|
"@angular-devkit/build-angular": "^18.2.0",
|
||||||
"@angular/cli": "^18.2.0",
|
"@angular/cli": "^18.2.0",
|
||||||
"@angular/compiler-cli": "^18.2.0",
|
"@angular/compiler-cli": "^18.2.0",
|
||||||
|
"@playwright/test": "^1.49.1",
|
||||||
"@types/jasmine": "~5.1.0",
|
"@types/jasmine": "~5.1.0",
|
||||||
|
"@types/node": "^22.10.7",
|
||||||
"jasmine-core": "~5.2.0",
|
"jasmine-core": "~5.2.0",
|
||||||
"karma": "~6.4.0",
|
"karma": "~6.4.0",
|
||||||
"karma-chrome-launcher": "~3.2.0",
|
"karma-chrome-launcher": "~3.2.0",
|
||||||
|
|
69
playwright.config.ts
Normal file
69
playwright.config.ts
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
import { defineConfig, devices } from '@playwright/test';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read environment variables from file.
|
||||||
|
* https://github.com/motdotla/dotenv
|
||||||
|
*/
|
||||||
|
// import dotenv from 'dotenv';
|
||||||
|
// import path from 'path';
|
||||||
|
// dotenv.config({ path: path.resolve(__dirname, '.env') });
|
||||||
|
|
||||||
|
/**
|
||||||
|
* See https://playwright.dev/docs/test-configuration.
|
||||||
|
*/
|
||||||
|
export default defineConfig({
|
||||||
|
testDir: './tests',
|
||||||
|
/* Run tests in files in parallel */
|
||||||
|
fullyParallel: true,
|
||||||
|
/* Fail the build on CI if you accidentally left test.only in the source code. */
|
||||||
|
forbidOnly: !!process.env.CI,
|
||||||
|
/* Retry on CI only */
|
||||||
|
retries: process.env.CI ? 2 : 0,
|
||||||
|
/* Opt out of parallel tests on CI. */
|
||||||
|
workers: process.env.CI ? 8 : undefined,
|
||||||
|
/* Reporter to use. See https://playwright.dev/docs/test-reporters */
|
||||||
|
reporter: 'html',
|
||||||
|
/* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */
|
||||||
|
use: {
|
||||||
|
/* Base URL to use in actions like `await page.goto('/')`. */
|
||||||
|
// baseURL: 'http://127.0.0.1:3000',
|
||||||
|
|
||||||
|
/* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */
|
||||||
|
trace: 'on-first-retry',
|
||||||
|
},
|
||||||
|
|
||||||
|
/* Configure projects for major browsers */
|
||||||
|
projects: [
|
||||||
|
{
|
||||||
|
name: 'chromium',
|
||||||
|
use: { ...devices['Desktop Chrome'] },
|
||||||
|
},
|
||||||
|
|
||||||
|
/* Test against mobile viewports. */
|
||||||
|
// {
|
||||||
|
// name: 'Mobile Chrome',
|
||||||
|
// use: { ...devices['Pixel 5'] },
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// name: 'Mobile Safari',
|
||||||
|
// use: { ...devices['iPhone 12'] },
|
||||||
|
// },
|
||||||
|
|
||||||
|
/* Test against branded browsers. */
|
||||||
|
// {
|
||||||
|
// name: 'Microsoft Edge',
|
||||||
|
// use: { ...devices['Desktop Edge'], channel: 'msedge' },
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// name: 'Google Chrome',
|
||||||
|
// use: { ...devices['Desktop Chrome'], channel: 'chrome' },
|
||||||
|
// },
|
||||||
|
],
|
||||||
|
|
||||||
|
/* Run your local dev server before starting the tests */
|
||||||
|
// webServer: {
|
||||||
|
// command: 'npm run start',
|
||||||
|
// url: 'http://127.0.0.1:3000',
|
||||||
|
// reuseExistingServer: !process.env.CI,
|
||||||
|
// },
|
||||||
|
});
|
|
@ -3,6 +3,6 @@
|
||||||
<img src="img.png" alt="Logout Icon" class="logo-image" />
|
<img src="img.png" alt="Logout Icon" class="logo-image" />
|
||||||
|
|
||||||
<form>
|
<form>
|
||||||
<button (click)="login()" type="submit">Mit KeyCLoak anmelden</button>
|
<button (click)="login()" type="submit">Login with Keycloak</button>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
|
4
src/app/environments/environment.ci.ts
Normal file
4
src/app/environments/environment.ci.ts
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
|
||||||
|
export class Environment {
|
||||||
|
public static readonly BASE_URL = "http://employee:8089";
|
||||||
|
}
|
4
src/app/environments/environment.ts
Normal file
4
src/app/environments/environment.ts
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
|
||||||
|
export class Environment {
|
||||||
|
public static readonly BASE_URL = "http://127.0.0.1:8089";
|
||||||
|
}
|
|
@ -4,6 +4,7 @@ import { EmployeesForAQualificationDTO, QualificationGetDTO, QualificationPostDT
|
||||||
import { Observable } from "rxjs";
|
import { Observable } from "rxjs";
|
||||||
import { EmployeeNameDataDTO } from "../models/mitarbeiter";
|
import { EmployeeNameDataDTO } from "../models/mitarbeiter";
|
||||||
import { EmployeeService } from "./employee.service";
|
import { EmployeeService } from "./employee.service";
|
||||||
|
import { Environment } from "../environments/environment";
|
||||||
|
|
||||||
@Injectable({
|
@Injectable({
|
||||||
providedIn: 'root'
|
providedIn: 'root'
|
||||||
|
@ -19,7 +20,7 @@ export class SkillService {
|
||||||
this.http.delete(`${SkillService.BASE_URL}/qualifications/${id}`).subscribe();
|
this.http.delete(`${SkillService.BASE_URL}/qualifications/${id}`).subscribe();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static readonly BASE_URL = "http://localhost:8089";
|
public static readonly BASE_URL = Environment.BASE_URL;
|
||||||
|
|
||||||
getToPutDto(skill: QualificationGetDTO): QualificationPostDTO {
|
getToPutDto(skill: QualificationGetDTO): QualificationPostDTO {
|
||||||
return {
|
return {
|
||||||
|
|
46
tests/login.spec.ts
Normal file
46
tests/login.spec.ts
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
import { test, expect } from '@playwright/test';
|
||||||
|
import { async } from 'rxjs';
|
||||||
|
|
||||||
|
test('LoginPageShouldRender', async ({ page }) => {
|
||||||
|
await page.goto('http://localhost:4200');
|
||||||
|
|
||||||
|
// Expect a title "to contain" a substring.
|
||||||
|
await expect(page).toHaveTitle(/EmployeeService/);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('LoginPageShouldHaveCorrectHeading', async ({ page }) => {
|
||||||
|
await page.goto('http://localhost:4200');
|
||||||
|
|
||||||
|
const heading = page.getByRole('heading');
|
||||||
|
await expect(heading).toHaveText('Hi-Tec GmbH');
|
||||||
|
});
|
||||||
|
|
||||||
|
test('LoginPageShouldHaveLoginButton', async ({ page }) => {
|
||||||
|
await page.goto('http://localhost:4200');
|
||||||
|
|
||||||
|
const button = page.getByRole('button');
|
||||||
|
await expect(button).toHaveText('Login with Keycloak');
|
||||||
|
});
|
||||||
|
|
||||||
|
test('LoginPageButtonShouldRedirectToKeycloak', async ({ page }) => {
|
||||||
|
await page.goto('http://localhost:4200');
|
||||||
|
|
||||||
|
const button = page.getByText("Login with Keycloak");
|
||||||
|
await button.click();
|
||||||
|
await page.waitForFunction(() => window.location.href.includes('keycloak'));
|
||||||
|
expect(page.url()).toContain("keycloak.szut.dev");
|
||||||
|
});
|
||||||
|
|
||||||
|
test('AfterLoginUserShouldBeRedirectedToEmployees', async ({ page }) => {
|
||||||
|
await page.goto('http://localhost:4200');
|
||||||
|
|
||||||
|
await page.getByRole('button').click();
|
||||||
|
await page.waitForFunction(() => window.location.href.includes('keycloak'));
|
||||||
|
await page.getByLabel('Username or email').fill('user');
|
||||||
|
await page.getByLabel('Password').fill('test');
|
||||||
|
await page.click('#kc-login');
|
||||||
|
|
||||||
|
expect(page.url()).toContain('localhost');
|
||||||
|
expect(page.url()).toContain('mitarbeiter');
|
||||||
|
});
|
||||||
|
|
58
tests/mitarbeiter.spec.ts
Normal file
58
tests/mitarbeiter.spec.ts
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
import { test, expect } from "@playwright/test";
|
||||||
|
|
||||||
|
test.describe('mitarbeiter', () => {
|
||||||
|
test.beforeEach(async ({ page }) => {
|
||||||
|
await page.goto('http://localhost:4200');
|
||||||
|
|
||||||
|
await page.getByRole('button').click();
|
||||||
|
await page.waitForFunction(() => window.location.href.includes('keycloak'));
|
||||||
|
await page.getByLabel('Username or email').fill('user');
|
||||||
|
await page.getByLabel('Password').fill('test');
|
||||||
|
await page.click('#kc-login');
|
||||||
|
|
||||||
|
await page.goto('http://localhost:4200/mitarbeiter');
|
||||||
|
});
|
||||||
|
|
||||||
|
test('ShouldLoad', async ({ page }) => {
|
||||||
|
await expect(page.getByRole('heading')).toHaveText("Employees");
|
||||||
|
});
|
||||||
|
|
||||||
|
test('ShouldLoadEmployees', async ({ page }) => {
|
||||||
|
expect(page.getByText('Max')).toBeTruthy();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('AddEmployeeShouldRedirect', async ({ page }) => {
|
||||||
|
await page.getByText('Add employee').click();
|
||||||
|
|
||||||
|
expect(page.url()).toContain('mitarbeitererstellen');
|
||||||
|
});
|
||||||
|
|
||||||
|
test('EditShouldRedirectToCorrespondingPage', async ({ page }) => {
|
||||||
|
const button = page.getByText('Edit').first();
|
||||||
|
await button.click();
|
||||||
|
|
||||||
|
expect(page.url()).toContain('mitarbeiterbearbeiten');
|
||||||
|
expect(page.url()).toContain('1');
|
||||||
|
});
|
||||||
|
|
||||||
|
test('DeleteShouldBeThere', async ({ page }) => {
|
||||||
|
const button = page.getByText('Delete').first();
|
||||||
|
|
||||||
|
const users = page.getByText('Delete');
|
||||||
|
await users.first().waitFor({ state: "visible" });
|
||||||
|
expect(await users.count()).toBeGreaterThan(1);
|
||||||
|
expect(button).toBeTruthy();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('SearchShouldWork', async ({ page }) => {
|
||||||
|
const searchField = page.getByRole('textbox');
|
||||||
|
const searchButton = page.getByText('Search').first();
|
||||||
|
|
||||||
|
await searchField.fill('Max');
|
||||||
|
await searchButton.click();
|
||||||
|
|
||||||
|
const hiddenItem = page.getByText('MusterFrau');
|
||||||
|
await expect(hiddenItem).toHaveCount(0);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
61
tests/mitarbeiterErstellen.spec.ts
Normal file
61
tests/mitarbeiterErstellen.spec.ts
Normal file
|
@ -0,0 +1,61 @@
|
||||||
|
import { test, expect } from "@playwright/test";
|
||||||
|
|
||||||
|
test.describe('mitarbeiter', () => {
|
||||||
|
test.beforeEach(async ({ page }) => {
|
||||||
|
await page.goto('http://localhost:4200');
|
||||||
|
|
||||||
|
await page.getByRole('button').click();
|
||||||
|
await page.waitForFunction(() => window.location.href.includes('keycloak'));
|
||||||
|
await page.getByLabel('Username or email').fill('user');
|
||||||
|
await page.getByLabel('Password').fill('test');
|
||||||
|
await page.click('#kc-login');
|
||||||
|
|
||||||
|
await page.goto('http://localhost:4200/mitarbeitererstellen');
|
||||||
|
});
|
||||||
|
|
||||||
|
test('pageShouldLoad', async ({ page }) => {
|
||||||
|
await expect(page.getByText('Save')).toHaveCount(1);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('backButtonShouldGoBack', async ({ page }) => {
|
||||||
|
await page.getByText('Back').click();
|
||||||
|
|
||||||
|
expect(page.url().includes('erstellen')).toBeFalsy();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('EveryFieldShouldValidateEmptiness', async ({ page }) => {
|
||||||
|
await page.getByText('Save').click();
|
||||||
|
|
||||||
|
const errors = page.getByText('This field is required');
|
||||||
|
|
||||||
|
await expect(errors).toHaveCount(6);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('PhoneNumberShouldBeValidated', async ({ page }) => {
|
||||||
|
await page.getByLabel('Phone').fill("asd");
|
||||||
|
await page.getByText('Save').click();
|
||||||
|
|
||||||
|
const error = page.getByText('This field must be a valid phone number');
|
||||||
|
|
||||||
|
await expect(error).toHaveCount(1);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('PostCodeShouldValidateTooShort', async ({ page }) => {
|
||||||
|
await page.getByLabel('Postcode').fill("1");
|
||||||
|
await page.getByText('Save').click();
|
||||||
|
|
||||||
|
const error = page.getByText('The value is too short');
|
||||||
|
|
||||||
|
await expect(error).toHaveCount(1);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('PostCodeShouldValidateTooLong', async ({ page }) => {
|
||||||
|
await page.getByLabel('Postcode').fill("123456");
|
||||||
|
await page.getByText('Save').click();
|
||||||
|
|
||||||
|
const error = page.getByText('The value is too long');
|
||||||
|
|
||||||
|
await expect(error).toHaveCount(1);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
24
tests/mitarbeiterbearbeiten.spec.ts
Normal file
24
tests/mitarbeiterbearbeiten.spec.ts
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
import { test, expect } from "@playwright/test";
|
||||||
|
|
||||||
|
test.describe('mitarbeiterbearbeiten', () => {
|
||||||
|
test.beforeEach(async ({ page }) => {
|
||||||
|
await page.goto('http://localhost:4200');
|
||||||
|
|
||||||
|
await page.getByRole('button').click();
|
||||||
|
await page.waitForFunction(() => window.location.href.includes('keycloak'));
|
||||||
|
await page.getByLabel('Username or email').fill('user');
|
||||||
|
await page.getByLabel('Password').fill('test');
|
||||||
|
await page.click('#kc-login');
|
||||||
|
|
||||||
|
await page.goto('http://localhost:4200/mitarbeiterbearbeiten/1');
|
||||||
|
});
|
||||||
|
|
||||||
|
test('ShouldLoad', async ({ page }) => {
|
||||||
|
expect(page.getByText("Save")).toBeTruthy();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('FieldsShouldHaveValues', async ({page}) => {
|
||||||
|
await expect(page.getByLabel('First Name')).toHaveValue('Max');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
23
tests/qualifikationbearbeiten.spec.ts
Normal file
23
tests/qualifikationbearbeiten.spec.ts
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
import { test, expect } from "@playwright/test";
|
||||||
|
|
||||||
|
test.describe('qualifikationbearbeiten', () => {
|
||||||
|
test.beforeEach(async ({ page }) => {
|
||||||
|
await page.goto('http://localhost:4200');
|
||||||
|
|
||||||
|
await page.getByRole('button').click();
|
||||||
|
await page.waitForFunction(() => window.location.href.includes('keycloak'));
|
||||||
|
await page.getByLabel('Username or email').fill('user');
|
||||||
|
await page.getByLabel('Password').fill('test');
|
||||||
|
await page.click('#kc-login');
|
||||||
|
|
||||||
|
await page.goto('http://localhost:4200/qualifikationbearbeiten/1');
|
||||||
|
});
|
||||||
|
|
||||||
|
test('ShouldLoad', async ({ page }) => {
|
||||||
|
expect(page.getByText("Save")).toBeTruthy();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('FieldsShouldHaveValues', async ({page}) => {
|
||||||
|
await expect(page.getByLabel('Name')).toHaveValue('Java');
|
||||||
|
});
|
||||||
|
});
|
58
tests/qualifikationsverwaltung.spec.ts
Normal file
58
tests/qualifikationsverwaltung.spec.ts
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
import { test, expect } from "@playwright/test";
|
||||||
|
|
||||||
|
test.describe('qualifikationen', () => {
|
||||||
|
test.beforeEach(async ({ page }) => {
|
||||||
|
await page.goto('http://localhost:4200');
|
||||||
|
|
||||||
|
await page.getByRole('button').click();
|
||||||
|
await page.waitForFunction(() => window.location.href.includes('keycloak'));
|
||||||
|
await page.getByLabel('Username or email').fill('user');
|
||||||
|
await page.getByLabel('Password').fill('test');
|
||||||
|
await page.click('#kc-login');
|
||||||
|
|
||||||
|
await page.goto('http://localhost:4200/qualifikationsverwaltung');
|
||||||
|
});
|
||||||
|
|
||||||
|
test('ShouldLoad', async ({ page }) => {
|
||||||
|
await expect(page.getByRole('heading')).toHaveText("Qualifications");
|
||||||
|
});
|
||||||
|
|
||||||
|
test('ShouldLoadQualifications', async ({ page }) => {
|
||||||
|
expect(page.getByText('Java')).toBeTruthy();
|
||||||
|
});
|
||||||
|
|
||||||
|
// TODO
|
||||||
|
// test('AddQualificationShouldRedirect', async ({ page }) => {
|
||||||
|
// await page.getByText('Add qualification').click();
|
||||||
|
|
||||||
|
// expect(page.url()).toContain('mitarbeitererstellen');
|
||||||
|
// });
|
||||||
|
|
||||||
|
test('EditShouldRedirectToCorrespondingPage', async ({ page }) => {
|
||||||
|
const button = page.getByText('Edit').first();
|
||||||
|
await button.click();
|
||||||
|
|
||||||
|
expect(page.url()).toContain('qualifikationbearbeiten');
|
||||||
|
expect(page.url()).toContain('1');
|
||||||
|
});
|
||||||
|
|
||||||
|
test('DeleteShouldBeThere', async ({ page }) => {
|
||||||
|
const button = page.getByText('Delete').first();
|
||||||
|
|
||||||
|
const users = page.getByText('Delete');
|
||||||
|
await users.first().waitFor({ state: "visible" });
|
||||||
|
expect(await users.count()).toBe(2);
|
||||||
|
expect(button).toBeTruthy();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('SearchShouldWork', async ({ page }) => {
|
||||||
|
const searchField = page.getByRole('textbox');
|
||||||
|
const searchButton = page.getByText('Search').first();
|
||||||
|
|
||||||
|
await searchField.fill('Java');
|
||||||
|
await searchButton.click();
|
||||||
|
|
||||||
|
const hiddenItem = page.getByText('Angular');
|
||||||
|
await expect(hiddenItem).toHaveCount(0);
|
||||||
|
});
|
||||||
|
});
|
Loading…
Add table
Reference in a new issue