diff --git a/.github/workflows/playwright.yml b/.github/workflows/playwright.yml deleted file mode 100644 index 8752aa7..0000000 --- a/.github/workflows/playwright.yml +++ /dev/null @@ -1,71 +0,0 @@ -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 diff --git a/.gitignore b/.gitignore index f0960ba..cc7b141 100644 --- a/.gitignore +++ b/.gitignore @@ -40,8 +40,3 @@ testem.log # System files .DS_Store Thumbs.db -node_modules/ -/test-results/ -/playwright-report/ -/blob-report/ -/playwright/.cache/ diff --git a/angular.json b/angular.json index 58aa354..2cbf973 100644 --- a/angular.json +++ b/angular.json @@ -52,14 +52,6 @@ "optimization": false, "extractLicenses": false, "sourceMap": true - }, - "pipeline": { - "fileReplacements": [ - { - "replace": "src/app/environments/environment.ts", - "with": "src/app/environments/environment.ci.ts" - } - ] } }, "defaultConfiguration": "production" @@ -72,9 +64,6 @@ }, "development": { "buildTarget": "employeeService:build:development" - }, - "pipeline": { - "buildTarget": "employeeService:build:pipeline" } }, "defaultConfiguration": "development" diff --git a/bun.lockb b/bun.lockb index a9456a4..d459e54 100755 Binary files a/bun.lockb and b/bun.lockb differ diff --git a/compose.yml b/compose.yml index aee66ea..9a4847c 100644 --- a/compose.yml +++ b/compose.yml @@ -6,10 +6,14 @@ services: postgres-employee: container_name: postgres_employee image: postgres:13.3 + volumes: + - employee_postgres_data:/var/lib/postgresql/data environment: POSTGRES_DB: employee_db POSTGRES_USER: employee POSTGRES_PASSWORD: secret + ports: + - "5432:5432" employee: container_name: employee diff --git a/package-lock.json b/package-lock.json index 9d30a42..4bfaa2f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26,9 +26,7 @@ "@angular-devkit/build-angular": "^18.2.0", "@angular/cli": "^18.2.0", "@angular/compiler-cli": "^18.2.0", - "@playwright/test": "^1.49.1", "@types/jasmine": "~5.1.0", - "@types/node": "^22.10.7", "jasmine-core": "~5.2.0", "karma": "~6.4.0", "karma-chrome-launcher": "~3.2.0", @@ -3898,21 +3896,6 @@ "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": { "version": "2.11.8", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", @@ -4469,10 +4452,11 @@ } }, "node_modules/@types/node": { - "version": "22.10.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.7.tgz", - "integrity": "sha512-V09KvXxFiutGp6B7XkpaDXlNadZxrzajcY50EuoLIpQ6WWYCSvf19lVIazzfIzQvhUN2HjX12spLojTnhuKlGg==", + "version": "22.10.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.5.tgz", + "integrity": "sha512-F8Q+SeGimwOo86fiovQh8qiXfFEh2/ocYv7tU5pJ3EXMSSxk1Joj5wefpFK2fHTf/N6HKGSxIDBT9f3gCxXPkQ==", "dev": true, + "license": "MIT", "dependencies": { "undici-types": "~6.20.0" } @@ -10835,50 +10819,6 @@ "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": { "version": "8.4.41", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz", diff --git a/package.json b/package.json index 083fa6d..c62d2a6 100644 --- a/package.json +++ b/package.json @@ -28,9 +28,7 @@ "@angular-devkit/build-angular": "^18.2.0", "@angular/cli": "^18.2.0", "@angular/compiler-cli": "^18.2.0", - "@playwright/test": "^1.49.1", "@types/jasmine": "~5.1.0", - "@types/node": "^22.10.7", "jasmine-core": "~5.5.0", "karma": "~6.4.0", "karma-chrome-launcher": "~3.2.0", diff --git a/playwright.config.ts b/playwright.config.ts deleted file mode 100644 index a02bfb4..0000000 --- a/playwright.config.ts +++ /dev/null @@ -1,69 +0,0 @@ -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, - // }, -}); diff --git a/src/app/components/login-view/login-view.component.html b/src/app/components/login-view/login-view.component.html index 961ccfd..c1234f8 100644 --- a/src/app/components/login-view/login-view.component.html +++ b/src/app/components/login-view/login-view.component.html @@ -3,6 +3,6 @@ Logout Icon
- +
diff --git a/src/app/environments/environment.ci.ts b/src/app/environments/environment.ci.ts deleted file mode 100644 index 1fc27ab..0000000 --- a/src/app/environments/environment.ci.ts +++ /dev/null @@ -1,4 +0,0 @@ - -export class Environment { - public static readonly BASE_URL = "http://employee:8089"; -} diff --git a/src/app/environments/environment.ts b/src/app/environments/environment.ts deleted file mode 100644 index e27af26..0000000 --- a/src/app/environments/environment.ts +++ /dev/null @@ -1,4 +0,0 @@ - -export class Environment { - public static readonly BASE_URL = "http://127.0.0.1:8089"; -} diff --git a/src/app/service/skill.service.ts b/src/app/service/skill.service.ts index 9e7f833..b9ac3a6 100644 --- a/src/app/service/skill.service.ts +++ b/src/app/service/skill.service.ts @@ -4,7 +4,6 @@ import { EmployeesForAQualificationDTO, QualificationGetDTO, QualificationPostDT import { Observable } from "rxjs"; import { EmployeeNameDataDTO } from "../models/mitarbeiter"; import { EmployeeService } from "./employee.service"; -import { Environment } from "../environments/environment"; @Injectable({ providedIn: 'root' @@ -20,7 +19,7 @@ export class SkillService { this.http.delete(`${SkillService.BASE_URL}/qualifications/${id}`).subscribe(); } - public static readonly BASE_URL = Environment.BASE_URL; + public static readonly BASE_URL = "http://localhost:8089"; getToPutDto(skill: QualificationGetDTO): QualificationPostDTO { return { diff --git a/tests/login.spec.ts b/tests/login.spec.ts deleted file mode 100644 index 06a5865..0000000 --- a/tests/login.spec.ts +++ /dev/null @@ -1,46 +0,0 @@ -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'); -}); - diff --git a/tests/mitarbeiter.spec.ts b/tests/mitarbeiter.spec.ts deleted file mode 100644 index 4977ba2..0000000 --- a/tests/mitarbeiter.spec.ts +++ /dev/null @@ -1,58 +0,0 @@ -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); - }); -}); - diff --git a/tests/mitarbeiterErstellen.spec.ts b/tests/mitarbeiterErstellen.spec.ts deleted file mode 100644 index 9b0d7dd..0000000 --- a/tests/mitarbeiterErstellen.spec.ts +++ /dev/null @@ -1,61 +0,0 @@ -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); - }); -}); - diff --git a/tests/mitarbeiterbearbeiten.spec.ts b/tests/mitarbeiterbearbeiten.spec.ts deleted file mode 100644 index aaa8e7d..0000000 --- a/tests/mitarbeiterbearbeiten.spec.ts +++ /dev/null @@ -1,24 +0,0 @@ -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'); - }); -}); - diff --git a/tests/qualifikationbearbeiten.spec.ts b/tests/qualifikationbearbeiten.spec.ts deleted file mode 100644 index b9cecd9..0000000 --- a/tests/qualifikationbearbeiten.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -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'); - }); -}); diff --git a/tests/qualifikationsverwaltung.spec.ts b/tests/qualifikationsverwaltung.spec.ts deleted file mode 100644 index 42cfd46..0000000 --- a/tests/qualifikationsverwaltung.spec.ts +++ /dev/null @@ -1,58 +0,0 @@ -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); - }); -});