e8530b8d95
fix: E2E pipeline — vite preview instead of nginx, ts build fixes
...
CI / Lint, type check, unit tests, coverage (push) Successful in 11m12s
CI / E2E browser tests (push) Failing after 8m0s
Three problems caused E2E browser tests to fail in Forgejo CI:
1. TypeScript build errors in (frontend.e2e.Dockerfile):
- used parameter property which violates
. Replaced with explicit property declaration.
- included in type-checking, causing
mock Response type mismatches. Added .
- mock Order was missing field.
2. Nginx SSL crash:
- copied production
which references SSL certs that don't exist in the e2e image.
- Replaced nginx entirely with (simpler, no SSL needed).
- Added to so routes to backend.
3. Docker context hygiene:
- excludes so test files don't
bloat the build context or trigger type errors in the container.
All other files untouched.
2026-05-19 18:53:52 +02:00
e654d42a4f
chore: add vitest coverage enforcement to frontend
...
- Install @vitest/coverage-v8 as devDependency (13 packages)
- Add coverage block to vite.config.ts test config:
- provider: 'v8' (Node.js native coverage, faster than istanbul)
- reporters: text, html, lcov, json
- thresholds: 70% lines, 60% branches, 70% functions, 70% statements
- exclude: test files and e2e directory
- Add "test:coverage": "vitest run --coverage" script to package.json
- Coverage report output: frontend/coverage/index.html
JSON output: frontend/coverage/coverage-final.json
- Thresholds are enforced by vitest itself — build exits non-zero
if any threshold is not met
2026-05-15 12:15:55 +02:00
491dc99c55
feat: add login page with Playwright E2E tests
...
Add the frontend login page (LoginPage.vue) with email and password
fields, Swedish UI strings, and integration with the backend login
endpoint. Also sets up Playwright as the E2E testing framework with
browser tests for both login and registration flows.
Frontend login implementation:
- Add LoginPage.vue with form validation, error handling, and link to
registration page
- Add login() API function in auth.ts
- Add loginUser() method to authStore that stores JWT token
- Add /logga-in route to Vue Router
- Add 'Logga in' nav link to AppHeader alongside existing 'Registrera'
- Add 10 unit tests for LoginPage component
- Add 4 unit tests for loginUser auth store method
- Add 1 route resolution test and 1 AppHeader link test
Playwright E2E setup and tests:
- Install @playwright/test and configure playwright.config.ts
- Add npm scripts: test:e2e (local) and test:e2e:ci (Docker CI)
- Exclude e2e/ directory from Vitest to prevent test runner conflicts
- Add .gitignore entries for test-results/ and playwright-report/
- Add 5 E2E tests for login (navigation, invalid credentials, success
redirect, navigation to register, input types)
- Add 6 E2E tests for register (navigation, success redirect, validation
errors for invalid email/short password/mismatched passwords,
navigation to login)
2026-05-13 19:17:29 +02:00
8e495672d3
feat: add user registration flow (backend + frontend)
...
Implement end-to-end registration: POST /api/auth/register creates a
user, returns a JWT, and the frontend RegisterPage stores the token
and redirects to home.
Backend:
- Add AuthController with POST /api/auth/register endpoint
- Add RegisterRequest record (@Email, @NotBlank, @Size(min=8))
- Add AuthResponse and ErrorResponse DTOs
- Add GlobalExceptionHandler (@RestControllerAdvice with logging)
- EmailAlreadyExistsException -> 409 (Swedish message)
- MethodArgumentNotValidException -> 400 (field errors)
- Generic Exception -> 500 (Swedish message + server-side log)
Frontend:
- Add api/client.ts: centralized fetch wrapper with Bearer token
interceptor, ApiError class, JSON error parsing
- Add api/auth.ts: register() function
- Add stores/authStore.ts: Pinia store with token persistence via
localStorage, registerUser/logout/isAuthenticated
- Add pages/RegisterPage.vue: email + password + confirm password
form with client-side validation, submit handler, error display,
redirect to home on success
- Add route /registrera pointing to RegisterPage
- Add 'Registrera' link to AppHeader navigation
Infrastructure:
- Add __tests__/setup.ts: localStorage polyfill for jsdom 29
(jsdom 29 lacks standard Storage method implementations)
- Register polyfill via vitest config setupFiles
Tests (17 new, 2 extended):
- AuthControllerTest (@SpringBootTest + @AutoConfigureMockMvc):
5 backend tests (success 201, duplicate 409, invalid email 400,
short password 400, missing email 400)
- authStore.spec.ts: 5 tests (unauthenticated start, localStorage
restore, register success, register failure, logout)
- RegisterPage.spec.ts: 12 tests (render, validation, submit,
redirect, error display, login link)
- AppHeader.spec.ts: added 'Registrera' link test
- Router.spec.ts: added /registrera route resolution test
Build: 95 tests pass (57 frontend + 38 backend), lint clean.
2026-05-01 19:37:39 +02:00
4d449d54d0
feat: add Docker Compose setup with dev and prod configurations
...
- docker-compose.yml (dev): 3 services — postgres:16, backend (gradle
bootRun with JDK 21, spring-boot-devtools), frontend (Vite HMR on
node:24-alpine). Source volume mounts for live editing, Gradle cache
volume for fast rebuilds, pg_isready healthcheck on postgres.
- docker-compose.prod.yml (prod): same 3 services but with multi-stage
Dockerfiles. Backend: Gradle bootJar → JRE Alpine, non-root user.
Frontend: npm ci + vite build → nginx:alpine serving static dist/.
SSL termination via self-signed cert (auto-generated in entrypoint).
No source mounts, restart: unless-stopped, separate volumes.
- application-docker.yml: Spring profile overriding H2 with PostgreSQL
via env vars. Hostname "postgres" resolved by Docker Compose DNS.
- Vite proxy /api → backend:8080 for dev. nginx nginx.conf handles
/api proxy + SPA fallback + gzip + SSL in prod.
- AGENTS.md, README.md: architecture diagram, dev vs prod comparison
table, Spring profiles docs, file reference updates.
2026-05-01 01:45:07 +02:00
9931061cb6
feat: scaffold Vue 3 + Vite frontend with TypeScript, Router, Pinia, Vitest, ESLint, Prettier
...
- Scaffold via npm create vite@latest --template vue-ts (create-vue interactive
prompts require manual selection; create-vite supports non-interactive flags)
- Dependencies: vue-router (SPA routing, createWebHistory for clean URLs),
pinia (centralised state management), vitest + @vue/test-utils + jsdom
(unit testing with browser DOM simulation)
- Dev tooling: eslint (v10 flat config) + eslint-plugin-vue + @vue/eslint-config-typescript
+ @vue/eslint-config-prettier (ESLint-Prettier integration via vueTsConfigs),
prettier (semi: false, singleQuote, trailingComma: all), jiti (bridges ESLint
with TypeScript config files)
- vite.config.ts: dev server on port 3000, @ alias resolving to src/, vitest
with jsdom environment
- eslint.config.ts: defineConfigWithVueTs wraps tseslint.config with Vue SFC
support (vue-eslint-parser, <script setup lang="ts">), vue/multi-word off
- tsconfig.app.json: path alias @/* -> src/* for TypeScript module resolution
- src/router/index.ts: single route mapping / to HomePage
- src/pages/HomePage.vue: minimal <script setup lang="ts"> placeholder
- src/main.ts: bootstraps app with Pinia plugin + Vue Router
- src/App.vue: delegates rendering to <RouterView />
- src/__tests__/HomePage.spec.ts: smoke test verifying component mounts
- Directory structure: src/stores/, src/api/, src/composables/ with .gitkeep
placeholders matching AGENTS.md convention (PascalCase pages, camelCase stores/composables)
- index.html: lang="sv", title BilHälsning (Swedish UI convention)
- Cleaned up: HelloWorld.vue, style.css, template boilerplate SVGs/PNGs
- Update AGENTS.md + CODING_GUIDELINES.md: .js extensions → .ts across all
file naming examples (useXxx.ts, authStore.ts, orders.ts, client.ts)
- Verification: npm run dev serves blank page on http://localhost:3000 ,
npm run lint passes (0 errors, 0 warnings), npm test passes (1 test, 1 file)
2026-05-01 00:52:38 +02:00