1
0
Fork 0
mirror of https://github.com/s-frick/effigenix.git synced 2026-03-28 08:29:36 +01:00
This commit is contained in:
Janosch 2026-03-27 11:13:16 +01:00
parent 6a672705c2
commit e897f41a32
12 changed files with 129 additions and 31 deletions

19
backend/Dockerfile Normal file
View file

@ -0,0 +1,19 @@
# Multi-stage Build für das Effigenix-Backend.
# Genutzt vom E2E-Test-Stack (test-automation/docker-compose.e2e.yml).
FROM maven:3.9-eclipse-temurin-21-alpine AS build
WORKDIR /app
# Dependency-Layer cachen
COPY pom.xml .
RUN mvn dependency:go-offline -q
# Source kompilieren und paketieren (Tests überspringen)
COPY src ./src
RUN mvn package -DskipTests -q
# Schlankes Runtime-Image
FROM eclipse-temurin:21-jre-alpine
WORKDIR /app
COPY --from=build /app/target/*.jar app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]

View file

@ -0,0 +1,15 @@
# Spring-Profil für E2E-Tests gegen echte PostgreSQL-Datenbank.
# Aktiviert via SPRING_PROFILES_ACTIVE=e2e (docker-compose.e2e.yml).
# Liquibase-Kontext "e2e" aktiviert Changeset 039-seed-e2e-testusers.
spring:
liquibase:
contexts: e2e
sentry:
dsn: ""
logging:
level:
root: WARN
de.effigenix: INFO

View file

@ -0,0 +1,46 @@
-- E2E-Testbenutzer für automatisierte Tests.
-- Wird nur mit Liquibase-Kontext "e2e" eingespielt (039-seed-e2e-testusers.xml).
--
-- Benutzer:
-- admin / admin123 → ADMIN-Rolle (darf alles)
-- viewer / test1234 → SALES_STAFF-Rolle (nur MASTERDATA_READ, kein WRITE)
-- admin (Passwort: admin123)
INSERT INTO users (id, username, email, password_hash, branch_id, status, created_at, last_login)
VALUES (
'00000000-0000-0000-0000-000000000001',
'admin',
'admin@effigenix.com',
'$2a$12$SJmX80hUZoA66W77CX7cHeRw1TPscXD6S8HYEZfhJ5PxTfkbwbLdi',
NULL,
'ACTIVE',
CURRENT_TIMESTAMP,
NULL
)
ON CONFLICT (id) DO NOTHING;
INSERT INTO user_roles (user_id, role_id)
SELECT '00000000-0000-0000-0000-000000000001', id
FROM roles
WHERE name = 'ADMIN'
ON CONFLICT DO NOTHING;
-- viewer (Passwort: test1234) → SALES_STAFF = nur MASTERDATA_READ
INSERT INTO users (id, username, email, password_hash, branch_id, status, created_at, last_login)
VALUES (
'00000000-0000-0000-0000-000000000002',
'viewer',
'viewer@effigenix.com',
'$2a$12$LJ3m4ys3uz2YPMRvKbmrZOZHAMSKL4FBy.XLR3WnCKsMbVDfGKJVa',
NULL,
'ACTIVE',
CURRENT_TIMESTAMP,
NULL
)
ON CONFLICT (id) DO NOTHING;
INSERT INTO user_roles (user_id, role_id)
SELECT '00000000-0000-0000-0000-000000000002', id
FROM roles
WHERE name = 'SALES_STAFF'
ON CONFLICT DO NOTHING;

View file

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-latest.xsd">
<changeSet id="039-seed-e2e-testusers" author="effigenix" context="e2e">
<sqlFile path="db/changelog/changes/039-seed-e2e-testusers.sql"
splitStatements="true"
stripComments="true"/>
</changeSet>
</databaseChangeLog>

View file

@ -44,5 +44,6 @@
<include file="db/changelog/changes/036-add-inventory-counts-composite-index.xml"/>
<include file="db/changelog/changes/037-add-completed-by-to-inventory-counts.xml"/>
<include file="db/changelog/changes/038-add-cancellation-reason-to-inventory-counts.xml"/>
<include file="db/changelog/changes/039-seed-e2e-testusers.xml"/>
</databaseChangeLog>

View file

@ -50,6 +50,10 @@ test-frontend:
test-backend:
cd backend && mvn test
# E2E-Tests (Playwright API-Tests via Docker-Stack)
test-e2e:
docker compose -f test-automation/docker-compose.e2e.yml up --build --abort-on-container-exit --exit-code-from e2e-runner
# ─── Code Generation ─────────────────────────────────────
# OpenAPI Spec + TypeScript Types generieren

View file

@ -25,18 +25,19 @@ Konzept: [`docs/ui-testing-automation.md`](./docs/ui-testing-automation.md)
> Playwright-Setup in `test-automation/web-ui/`. API-Tests ohne Browser.
- [ ] `web-ui/package.json` finalisieren (Abhängigkeiten prüfen, ggf. pnpm workspace eintragen)
- [ ] `web-ui/playwright.config.ts` validieren und anpassen
- [ ] `web-ui/fixtures/auth.fixture.ts` implementieren und testen
- [ ] `web-ui/fixtures/seed.fixture.ts` implementieren (DB-Reset-Strategie klären)
- [ ] `web-ui/helpers/api-client.ts` typisiert implementieren
- [ ] Backend `Dockerfile` erstellen (test-Profil, mit Seed-Daten)
- [ ] `docker-compose.e2e.yml` validieren (DB → Backend → e2e-runner Healthchecks)
- [ ] `web-ui/Dockerfile` validieren
- [ ] Erste Spec: `tests/api/masterdata/categories.spec.ts` (TC-CAT, Issue #62)
- [ ] Erste Spec: `tests/api/masterdata/suppliers.spec.ts` (TC-SUP, Issue #63)
- [x] `web-ui/package.json` finalisieren (standalone, kein Workspace-Eintrag nötig)
- [x] `web-ui/playwright.config.ts` validieren und anpassen
- [x] `web-ui/fixtures/auth.fixture.ts` implementieren (viewer-Passwort: test1234)
- [x] `web-ui/fixtures/seed.fixture.ts` implementieren (Strategie: Option B UUID-Suffixe)
- [x] `web-ui/helpers/api-client.ts` typisiert implementieren
- [x] Backend `Dockerfile` erstellen (Multi-stage Maven + JRE, Profil via SPRING_PROFILES_ACTIVE)
- [x] `docker-compose.e2e.yml` validieren (Profil auf `e2e` korrigiert, Viewer-Passwort angepasst)
- [x] `web-ui/Dockerfile` korrigiert (standalone pnpm install, kein Workspace)
- [x] `application-e2e.yml` + Liquibase-Changeset 039 (admin + viewer e2e-Benutzer)
- [x] Erste Spec: `tests/api/masterdata/categories.spec.ts` (TC-CAT, Issue #62)
- [x] Erste Spec: `tests/api/masterdata/suppliers.spec.ts` (TC-SUP-01 ACTIVE korrigiert, Issue #63)
- [ ] End-to-end-Run lokal erfolgreich: `docker compose -f test-automation/docker-compose.e2e.yml up`
- [ ] `just test-e2e` Recipe im `justfile` ergänzen
- [x] `just test-e2e` Recipe im `justfile` ergänzt
---

View file

@ -21,7 +21,7 @@ services:
context: ../backend
dockerfile: Dockerfile
environment:
SPRING_PROFILES_ACTIVE: test
SPRING_PROFILES_ACTIVE: e2e
SPRING_DATASOURCE_URL: jdbc:postgresql://db:5432/effigenix
SPRING_DATASOURCE_USERNAME: effigenix
SPRING_DATASOURCE_PASSWORD: effigenix
@ -45,7 +45,7 @@ services:
TEST_USER_ADMIN: admin
TEST_USER_ADMIN_PASS: admin123
TEST_USER_VIEWER: viewer
TEST_USER_VIEWER_PASS: viewer123
TEST_USER_VIEWER_PASS: test1234
depends_on:
backend:
condition: service_healthy

View file

@ -1,20 +1,18 @@
# E2E-Test-Runner (Playwright API-Tests, kein Browser)
# Build-Context: Repo-Root (..)
# Standalone benötigt keine pnpm-Workspace-Konfiguration.
FROM mcr.microsoft.com/playwright:v1.51.0-noble
WORKDIR /app
# pnpm installieren
RUN npm install -g pnpm@9
# Workspace-Root und e2e-Package-Manifest kopieren
COPY frontend/package.json frontend/pnpm-workspace.yaml ./
COPY test-automation/web-ui/package.json ./test-automation/web-ui/
# pnpm Install (nur Prod + Dev-Deps des e2e-Pakets)
RUN pnpm install --frozen-lockfile
# Test-Code und Konfiguration kopieren
COPY test-automation/web-ui/ ./test-automation/web-ui/
WORKDIR /app/test-automation/web-ui
ENTRYPOINT ["pnpm", "exec", "playwright", "test"]
# Nur package.json zuerst für Layer-Caching
COPY test-automation/web-ui/package.json ./
RUN pnpm install --no-frozen-lockfile
# Test-Code kopieren
COPY test-automation/web-ui/ ./
ENTRYPOINT ["pnpm", "exec", "playwright", "test", "--project=api"]

View file

@ -22,7 +22,7 @@ export const test = base.extend<AuthFixtures>({
const res = await request.post('/api/auth/login', {
data: {
username: process.env.TEST_USER_VIEWER ?? 'viewer',
password: process.env.TEST_USER_VIEWER_PASS ?? 'viewer123',
password: process.env.TEST_USER_VIEWER_PASS ?? 'test1234',
},
});
expect(res.status()).toBe(200);

View file

@ -12,7 +12,7 @@ test.describe('TC-SUP: Lieferanten', () => {
});
expect(res.status()).toBe(201);
const body = await res.json();
expect(body.status).toBe('AKTIV');
expect(body.status).toBe('ACTIVE');
});
test('TC-SUP-02: Lieferant erscheint in Liste nach Erstellung', async ({ request, adminToken }) => {

View file

@ -1,8 +1,8 @@
{
"compilerOptions": {
"target": "ES2022",
"module": "ESNext",
"moduleResolution": "bundler",
"module": "CommonJS",
"moduleResolution": "node16",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,