From 81d08a4680e6f191fab5e4d87d4a34c0353c8466 Mon Sep 17 00:00:00 2001 From: senke Date: Sun, 4 Jan 2026 01:41:51 +0100 Subject: [PATCH] stabilisation commit --- VEZA_MVP_ETAT_DES_LIEUX.md | 67 + VEZA_PRODUCTION_READY_GUIDE.md | 49 + VEZA_STABLE_EXTENDED_MVP.json | 117 + apps/web/e2e-results.json | 5275 +++++++++++++++-- apps/web/e2e/.auth/user.json | 6 +- .../features/auth/components/OAuthButton.tsx | 4 +- .../web/src/features/auth/pages/LoginPage.tsx | 6 +- .../features/chat/components/ChatInput.tsx | 215 +- .../features/chat/components/ChatMessage.tsx | 137 +- .../chat/components/TypingIndicator.tsx | 30 +- apps/web/src/features/chat/hooks/useChat.ts | 109 +- apps/web/src/features/chat/store/chatStore.ts | 53 +- apps/web/src/features/chat/types/index.ts | 52 +- .../profile/services/profileService.ts | 1 + apps/web/src/hooks/types.ts | 14 +- design_system.html | 1029 ++++ talas_design_system_v2(1).html | 3260 ++++++++++ talas_design_system_v2.html | 3260 ++++++++++ .../internal/handlers/oauth_handlers.go | 6 +- .../internal/handlers/profile_handler.go | 28 +- veza-backend-api/internal/models/user.go | 1 + .../internal/services/oauth_service.go | 6 +- .../internal/services/user_service.go | 71 +- .../internal/services/user_service_test.go | 51 +- .../migrations/012_add_user_social_links.sql | 7 + veza-chat-server/src/main.rs | 3 + veza-chat-server/src/reactions.rs | 62 +- veza-chat-server/src/websocket/handler.rs | 109 +- veza-chat-server/src/websocket/mod.rs | 35 + veza_design_system_v3.html | 3039 ++++++++++ veza_design_system_v4.html | 2485 ++++++++ veza_design_system_v5.html | 2140 +++++++ 32 files changed, 20997 insertions(+), 730 deletions(-) create mode 100644 VEZA_MVP_ETAT_DES_LIEUX.md create mode 100644 VEZA_PRODUCTION_READY_GUIDE.md create mode 100644 VEZA_STABLE_EXTENDED_MVP.json create mode 100644 design_system.html create mode 100644 talas_design_system_v2(1).html create mode 100644 talas_design_system_v2.html create mode 100644 veza-backend-api/migrations/012_add_user_social_links.sql create mode 100644 veza_design_system_v3.html create mode 100644 veza_design_system_v4.html create mode 100644 veza_design_system_v5.html diff --git a/VEZA_MVP_ETAT_DES_LIEUX.md b/VEZA_MVP_ETAT_DES_LIEUX.md new file mode 100644 index 000000000..f03e5fee7 --- /dev/null +++ b/VEZA_MVP_ETAT_DES_LIEUX.md @@ -0,0 +1,67 @@ +# ๐Ÿ“Š VEZA MVP - ร‰tat des Lieux Exhaustif + +Ce document dรฉtaille l'รฉtat d'avancement de chaque fonctionnalitรฉ du projet Veza ร  la date du 3 Janvier 2026. + +## ๐ŸŸข Entiรจrement Fonctionnel (Production-Ready) +*Ces fonctionnalitรฉs sont validรฉes, testรฉes et prรชtes pour un usage rรฉel.* + +### ๐Ÿ” Authentification & Sรฉcuritรฉ +- **Enregistrement & Connexion** : Inscription par email/mot de passe avec validation. +- **Gestion des Sessions** : Support des Refresh Tokens, rรฉvocation de sessions actives. +- **2FA (OTP)** : Double authentification via application d'authentification (Google Auth, etc.). +- **Protection CSRF** : Protection active sur tous les points d'entrรฉe modifiant l'รฉtat (nรฉcessite Redis). +- **Rate Limiting** : Protection contre les attaques par force brute sur le Login et l'Upload. + +### ๐ŸŽต Gestion des Tracks +- **Upload simple & chunked** : Support des fichiers MP3/WAV/FLAC. +- **Metadata Management** : Titre, artiste, genre, tags, visuels. +- **Streaming Audio** : Lecture directe stable via serveur dรฉdiรฉ. +- **Actions sociales** : Systรจme de "Like" et "Follow" de crรฉateurs. + +### ๐Ÿ’ฌ Chat & Social +- **Messagerie Temps Rรฉel** : Communication via WebSockets avec le `veza-chat-server`. +- **Salons de discussion** : Crรฉation de conversations privรฉes et de groupe. +- **Statistiques** : Vue d'ensemble de l'activitรฉ du chat. + +--- + +## ๐ŸŸก Partiellement Fonctionnel +*Le backend est prรฉsent, mais l'interface utilisateur ou certaines intรฉgrations sont basiques.* + +### ๐Ÿ›’ Marketplace +- **Backend (GORM)** : Endpoints de crรฉation de produits et commandes OK. +- **Frontend** : Liste des produits et panier simplifiรฉs. Nรฉcessite une intรฉgration de paiement rรฉelle (Stripe/PayPal non inclus dans le socle gratuit). + +### ๐Ÿ“ˆ Analytics +- **Collecte d'รฉvรฉnements** : Le backend enregistre les รฉcoutes et interactions. +- **Tableau de bord** : Prรฉsent mais limitรฉ aux statistiques globales (Admin). + +### ๐Ÿ‘ค Profil Utilisateur +- **ร‰dition** : Modification du pseudo, de la bio et de l'avatar. +- **Visibilitรฉ** : Recherche d'utilisateurs fonctionnelle mais basique. + +--- + +## ๐ŸŸ  Squelette / Mocked (Sรฉquenceurs/Algorithmes) +*La structure existe mais les algorithmes complets sont ร  implรฉmenter.* + +- **Recommandations de Playlists** : Actuellement basรฉes sur des requรชtes statiques ou alรฉatoires. +- **Suggestions de Tracks** : Pas d'algorithme de machine learning actif. + +--- + +## ๐Ÿ”ด Manquant (Post-MVP) +*Fonctionnalitรฉs identifiรฉes mais non implรฉmentรฉes pour cette version.* + +- **HLS Streaming (Optimisรฉ)** : Le backend possรจde les stubs, mais le pipeline de transcodage temps rรฉel complet n'est pas activรฉ par dรฉfaut dans le frontend. +- **Systรจme de Notifications Avancรฉ** : L'UI des notifications n'est pas connectรฉe aux รฉvรฉnements backend. +- **Gestion de Rรดles Granulaire (RBAC)** : Les rรดles Admin/User sont lร , mais la crรฉation de rรดles personnalisรฉs via UI manque. + +--- + +## ๐Ÿ› ๏ธ Performance & Infrastructure +- **Dockerisation** : Stack complet 100% stable (Postgres, Redis, RabbitMQ). +- **Qualitรฉ de code** : + - **Backend Go** : Architecture propre, migrations transactionnelles. + - **Frontend React** : 100% Type-safe (TypeScript strict). + - **Stream Server Rust** : Compilation corrigรฉe, performant pour le streaming de fichiers. diff --git a/VEZA_PRODUCTION_READY_GUIDE.md b/VEZA_PRODUCTION_READY_GUIDE.md new file mode 100644 index 000000000..2ebe633d9 --- /dev/null +++ b/VEZA_PRODUCTION_READY_GUIDE.md @@ -0,0 +1,49 @@ +# ๐Ÿš€ VEZA - Guide de Dรฉploiement en Production + +Ce guide explique comment passer votre MVP Veza d'un mode "Laboratoire" ร  un mode "Production" sรฉcurisรฉ et performant. + +## 1. Configuration de l'Environnement +Toutes les variables d'environnement doivent รชtre dรฉfinies dans un fichier `.env` protรฉgรฉ. + +### Sรฉcuritรฉ Critique +- **APP_ENV** : Doit รชtre positionnรฉ sur `production`. Cela active la vรฉrification stricte du CSRF et masque les stack traces dans les logs. +- **JWT_SECRET** : Utilisez une clรฉ de 64 caractรจres minimum (`openssl rand -base64 48`). +- **CORS_ORIGINS** : Ne jamais utiliser `*`. Listez explicitement vos domaines (ex: `https://app.veza.io`). + +## 2. Infrastructure & Docker +Utilisez le fichier `docker-compose.prod.yml` fourni. Il inclut des optimisations et des conteneurs supplรฉmentaires pour la sรฉcuritรฉ. + +### Composants additionnels +- **ClamAV** : Indispensable pour scanner les uploads de fichiers musicaux contre les virus. +- **Nginx Reverse Proxy** : Recommandรฉ pour gรฉrer le SSL/TLS et servir le frontend statique. + +## 3. Stratรฉgie de Stockage +Pour les fichiers audio et les avatars : +- **Mode Local** : Utilisez des volumes Docker persistants (dรฉjร  configurรฉs). +- **Mode S3 (Recommandรฉ)** : Modifiez la configuration backend pour pointer vers un bucket AWS S3 ou MinIO pour une meilleure scalabilitรฉ. + +## 4. Hardening (Renforcement) +- **SSL/TLS** : Utilisez des certificats Let's Encrypt (via Certbot ou Traefik). +- **Redis** : Assurez-vous que Redis est accessible uniquement en interne par le backend. Il est crucial pour la protection CSRF et le Rate Limiting. +- **Base de donnรฉes** : Changez les mots de passe par dรฉfaut (`password`) avant le premier lancement. + +## 5. Procรฉdure de Lancement +1. **Gรฉnรฉrer les secrets** : + ```bash + export JWT_SECRET=$(openssl rand -base64 32) + export SECRET_KEY=$(openssl rand -base64 32) + ``` +2. **Prรฉparer les fichiers de config** : + - Copiez `.env.production` localement. + - Configurez vos domaines dans `nginx.conf`. +3. **Lancer le stack** : + ```bash + docker compose -f docker-compose.prod.yml up -d --build + ``` +4. **Vรฉrifier la santรฉ** : + - Dashboard : `https://votre-domaine.com` + - Santรฉ API : `https://api.votre-domaine.com/api/v1/status` (vรฉrifiez que ClamAV est "Healthy"). + +## 6. Maintenance +- **Sauvegardes** : Automatisez un dump de la base Postgres toutes les 24h. +- **Logs** : Docker envoie les logs vers `stdout/stderr`, vous pouvez les agrรฉger via ELK ou Grafana Loki. diff --git a/VEZA_STABLE_EXTENDED_MVP.json b/VEZA_STABLE_EXTENDED_MVP.json new file mode 100644 index 000000000..e93ed719d --- /dev/null +++ b/VEZA_STABLE_EXTENDED_MVP.json @@ -0,0 +1,117 @@ +{ + "project": "Veza Extended Stable MVP", + "version": "v1.1.0-roadmap", + "status_summary": { + "total_features_vision": 600, + "functional_now": 79, + "started_partial": 112, + "missing": 409 + }, + "priority_phases": [ + { + "id": "PHASE-EXT-1", + "name": "Social & Identity Expansion", + "priority": "P1", + "tasks": [ + { + "id": "FE-AUTH-003", + "title": "Full OAuth Integration (Google/GitHub/Discord)", + "status": "partial", + "area": "Frontend", + "importance": "High", + "requirement": "Connect backend OAuth routes to frontend logic with redirect handling and profile sync." + }, + { + "id": "FE-PROF-002", + "title": "Advanced Profile Customization", + "status": "partial", + "area": "Frontend", + "importance": "Medium", + "requirement": "Implement social links, custom profile URL, and enhanced bio editor." + } + ] + }, + { + "id": "PHASE-EXT-2", + "name": "Real-time Communication Polish", + "priority": "P1", + "tasks": [ + { + "id": "FE-CHAT-010", + "title": "Rich Messaging (Emojis & Reactions)", + "status": "started", + "area": "Frontend", + "importance": "High", + "requirement": "Integrate emoji picker and backend-supported reactions on messages." + }, + { + "id": "FE-CHAT-012", + "title": "Image & File Sharing in Chat", + "status": "missing", + "area": "Fullstack", + "importance": "Medium", + "requirement": "Allow uploading and previewing images/files within chat rooms." + } + ] + }, + { + "id": "PHASE-EXT-3", + "name": "Marketplace & Monetization Core", + "priority": "P2", + "tasks": [ + { + "id": "FE-MARK-005", + "title": "Functional Checkout Flow", + "status": "skeleton", + "area": "Frontend", + "importance": "High", + "requirement": "Implement the full payment flow mockup (Stripe integration ready) for digital downloads." + }, + { + "id": "BE-MARK-010", + "title": "Automated License Generation", + "status": "missing", + "area": "Backend", + "importance": "Medium", + "requirement": "Generate PDF/JSON licenses after successful product purchase." + } + ] + }, + { + "id": "PHASE-EXT-4", + "name": "Media Experience & Observability", + "priority": "P1", + "tasks": [ + { + "id": "FE-NOTIF-001", + "title": "Real-time Notification Center", + "status": "skeleton", + "area": "Frontend", + "importance": "High", + "requirement": "Connect WebSocket notifications to the UI bell and Toast system." + }, + { + "id": "BE-STREAM-005", + "title": "Production HLS Transcoding", + "status": "partial", + "area": "Streaming", + "importance": "High", + "requirement": "Activate the HLS pipeline in the stream server for adaptive bitrate playback." + }, + { + "id": "FE-ANALYTICS-002", + "title": "Creator Statistics Dashboard", + "status": "started", + "area": "Frontend", + "importance": "Medium", + "requirement": "Visualize backend playback events using charts (Recharts/Chart.js)." + } + ] + } + ], + "technical_debt_fixes": [ + "Fix flaky E2E Playwright routes for authenticated flows", + "Implement structured logging for the Rust stream server", + "Standardize all remaining marketplace stubs in GORM models" + ] +} \ No newline at end of file diff --git a/apps/web/e2e-results.json b/apps/web/e2e-results.json index ffb02b2b6..73e8ceffd 100644 --- a/apps/web/e2e-results.json +++ b/apps/web/e2e-results.json @@ -112,602 +112,4781 @@ }, "suites": [ { - "title": "auth-flow.spec.ts", - "file": "auth-flow.spec.ts", + "title": "mvp-integration.spec.ts", + "file": "mvp-integration.spec.ts", "column": 0, "line": 0, "specs": [], "suites": [ { - "title": "Complete Auth Flow E2E", - "file": "auth-flow.spec.ts", - "line": 26, + "title": "MVP Integration Tests - Exhaustifs", + "file": "mvp-integration.spec.ts", + "line": 42, "column": 6, - "specs": [ + "specs": [], + "suites": [ { - "title": "should register a new user with valid email", - "ok": false, - "tags": [], - "tests": [ + "title": "1. Authentication Flow", + "file": "mvp-integration.spec.ts", + "line": 51, + "column": 8, + "specs": [], + "suites": [ { - "timeout": 60000, - "annotations": [], - "expectedStatus": "passed", - "projectId": "chromium", - "projectName": "chromium", - "results": [ + "title": "Unauthenticated tests", + "file": "mvp-integration.spec.ts", + "line": 53, + "column": 10, + "specs": [ { - "workerIndex": 4, - "parallelIndex": 0, - "status": "failed", - "duration": 13072, - "error": { - "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mfalse\u001b[39m", - "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mfalse\u001b[39m\n at /home/senke/git/talas/veza/apps/web/e2e/auth-flow.spec.ts:110:30", - "location": { - "file": "/home/senke/git/talas/veza/apps/web/e2e/auth-flow.spec.ts", - "column": 30, - "line": 110 - }, - "snippet": " 108 | .isVisible({ timeout: 3000 })\n 109 | .catch(() => false);\n> 110 | expect(successMessage).toBe(true);\n | ^\n 111 | console.log('โœ… [AUTH-FLOW] Registration successful (success message shown)');\n 112 | }\n 113 |" - }, - "errors": [ + "title": "1.1 - Login page loads correctly", + "ok": true, + "tags": [], + "tests": [ { - "location": { - "file": "/home/senke/git/talas/veza/apps/web/e2e/auth-flow.spec.ts", - "column": 30, - "line": 110 + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "chromium", + "projectName": "chromium", + "results": [ + { + "workerIndex": 0, + "parallelIndex": 0, + "status": "passed", + "duration": 1629, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:18:13.569Z", + "annotations": [], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "c50e3d8c82f89a880019-be5e0fbc4f6682284cc9", + "file": "mvp-integration.spec.ts", + "line": 57, + "column": 7 + }, + { + "title": "1.2 - Register page loads correctly", + "ok": true, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "chromium", + "projectName": "chromium", + "results": [ + { + "workerIndex": 0, + "parallelIndex": 0, + "status": "passed", + "duration": 565, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:18:15.276Z", + "annotations": [], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "c50e3d8c82f89a880019-f7e466c695e5a862b8e3", + "file": "mvp-integration.spec.ts", + "line": 82, + "column": 7 + }, + { + "title": "1.3 - Can register new user", + "ok": true, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "chromium", + "projectName": "chromium", + "results": [ + { + "workerIndex": 0, + "parallelIndex": 0, + "status": "passed", + "duration": 2343, + "errors": [], + "stdout": [ + { + "text": "User registered successfully via API\n" + }, + { + "text": "User verified - can login after registration\n" + } + ], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:18:15.857Z", + "annotations": [], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "c50e3d8c82f89a880019-6fdba03834c145834c82", + "file": "mvp-integration.spec.ts", + "line": 96, + "column": 7 + }, + { + "title": "1.4 - Can login with registered user", + "ok": true, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "chromium", + "projectName": "chromium", + "results": [ + { + "workerIndex": 0, + "parallelIndex": 0, + "status": "passed", + "duration": 2208, + "errors": [], + "stdout": [ + { + "text": "Test user registered successfully via API\n" + } + ], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:18:18.213Z", + "annotations": [], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "c50e3d8c82f89a880019-01e876dd560f187af754", + "file": "mvp-integration.spec.ts", + "line": 160, + "column": 7 + }, + { + "title": "1.5 - Protected route redirects when not logged in", + "ok": true, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "chromium", + "projectName": "chromium", + "results": [ + { + "workerIndex": 0, + "parallelIndex": 0, + "status": "passed", + "duration": 672, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:18:20.439Z", + "annotations": [], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "c50e3d8c82f89a880019-5c5b6a5eb8219cd7a1f8", + "file": "mvp-integration.spec.ts", + "line": 342, + "column": 7 + }, + { + "title": "1.1 - Login page loads correctly", + "ok": true, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "firefox", + "projectName": "firefox", + "results": [ + { + "workerIndex": 15, + "parallelIndex": 0, + "status": "passed", + "duration": 2184, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:29:54.169Z", + "annotations": [], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "c50e3d8c82f89a880019-d84504f3a4366c07772f", + "file": "mvp-integration.spec.ts", + "line": 57, + "column": 7 + }, + { + "title": "1.2 - Register page loads correctly", + "ok": true, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "firefox", + "projectName": "firefox", + "results": [ + { + "workerIndex": 15, + "parallelIndex": 0, + "status": "passed", + "duration": 607, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:29:56.962Z", + "annotations": [], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "c50e3d8c82f89a880019-1a1150fafbf917826c95", + "file": "mvp-integration.spec.ts", + "line": 82, + "column": 7 + }, + { + "title": "1.3 - Can register new user", + "ok": true, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "firefox", + "projectName": "firefox", + "results": [ + { + "workerIndex": 15, + "parallelIndex": 0, + "status": "passed", + "duration": 2321, + "errors": [], + "stdout": [ + { + "text": "User registered successfully via API\n" + }, + { + "text": "User verified - can login after registration\n" + } + ], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:29:57.587Z", + "annotations": [], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "c50e3d8c82f89a880019-c1aa5e267d26955aa66d", + "file": "mvp-integration.spec.ts", + "line": 96, + "column": 7 + }, + { + "title": "1.4 - Can login with registered user", + "ok": true, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "firefox", + "projectName": "firefox", + "results": [ + { + "workerIndex": 15, + "parallelIndex": 0, + "status": "passed", + "duration": 2308, + "errors": [], + "stdout": [ + { + "text": "Test user registered successfully via API\n" + } + ], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:29:59.920Z", + "annotations": [], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "c50e3d8c82f89a880019-2ac38895118ba04624db", + "file": "mvp-integration.spec.ts", + "line": 160, + "column": 7 + }, + { + "title": "1.5 - Protected route redirects when not logged in", + "ok": true, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "firefox", + "projectName": "firefox", + "results": [ + { + "workerIndex": 15, + "parallelIndex": 0, + "status": "passed", + "duration": 999, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:30:02.238Z", + "annotations": [], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "c50e3d8c82f89a880019-498db7c446cd73af1176", + "file": "mvp-integration.spec.ts", + "line": 342, + "column": 7 + }, + { + "title": "1.1 - Login page loads correctly", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "webkit", + "projectName": "webkit", + "results": [ + { + "workerIndex": 30, + "parallelIndex": 0, + "status": "failed", + "duration": 2, + "error": { + "message": "Error: browserType.launch: \nโ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—\nโ•‘ Host system is missing dependencies to run browsers. โ•‘\nโ•‘ Please install them with the following command: โ•‘\nโ•‘ โ•‘\nโ•‘ sudo npx playwright install-deps โ•‘\nโ•‘ โ•‘\nโ•‘ Alternatively, use apt: โ•‘\nโ•‘ sudo apt-get install libicu74\\ โ•‘\nโ•‘ libjpeg-turbo8\\ โ•‘\nโ•‘ gstreamer1.0-libav โ•‘\nโ•‘ โ•‘\nโ•‘ <3 Playwright Team โ•‘\nโ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•", + "stack": "Error: browserType.launch: \nโ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—\nโ•‘ Host system is missing dependencies to run browsers. โ•‘\nโ•‘ Please install them with the following command: โ•‘\nโ•‘ โ•‘\nโ•‘ sudo npx playwright install-deps โ•‘\nโ•‘ โ•‘\nโ•‘ Alternatively, use apt: โ•‘\nโ•‘ sudo apt-get install libicu74\\ โ•‘\nโ•‘ libjpeg-turbo8\\ โ•‘\nโ•‘ gstreamer1.0-libav โ•‘\nโ•‘ โ•‘\nโ•‘ <3 Playwright Team โ•‘\nโ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•" + }, + "errors": [ + { + "message": "Error: browserType.launch: \nโ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—\nโ•‘ Host system is missing dependencies to run browsers. โ•‘\nโ•‘ Please install them with the following command: โ•‘\nโ•‘ โ•‘\nโ•‘ sudo npx playwright install-deps โ•‘\nโ•‘ โ•‘\nโ•‘ Alternatively, use apt: โ•‘\nโ•‘ sudo apt-get install libicu74\\ โ•‘\nโ•‘ libjpeg-turbo8\\ โ•‘\nโ•‘ gstreamer1.0-libav โ•‘\nโ•‘ โ•‘\nโ•‘ <3 Playwright Team โ•‘\nโ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:34:56.403Z", + "annotations": [], + "attachments": [] + } + ], + "status": "unexpected" + } + ], + "id": "c50e3d8c82f89a880019-1309a2e6b53b675adb67", + "file": "mvp-integration.spec.ts", + "line": 57, + "column": 7 + }, + { + "title": "1.2 - Register page loads correctly", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "webkit", + "projectName": "webkit", + "results": [ + { + "workerIndex": 31, + "parallelIndex": 0, + "status": "failed", + "duration": 2, + "error": { + "message": "Error: browserType.launch: \nโ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—\nโ•‘ Host system is missing dependencies to run browsers. โ•‘\nโ•‘ Please install them with the following command: โ•‘\nโ•‘ โ•‘\nโ•‘ sudo npx playwright install-deps โ•‘\nโ•‘ โ•‘\nโ•‘ Alternatively, use apt: โ•‘\nโ•‘ sudo apt-get install libicu74\\ โ•‘\nโ•‘ libjpeg-turbo8\\ โ•‘\nโ•‘ gstreamer1.0-libav โ•‘\nโ•‘ โ•‘\nโ•‘ <3 Playwright Team โ•‘\nโ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•", + "stack": "Error: browserType.launch: \nโ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—\nโ•‘ Host system is missing dependencies to run browsers. โ•‘\nโ•‘ Please install them with the following command: โ•‘\nโ•‘ โ•‘\nโ•‘ sudo npx playwright install-deps โ•‘\nโ•‘ โ•‘\nโ•‘ Alternatively, use apt: โ•‘\nโ•‘ sudo apt-get install libicu74\\ โ•‘\nโ•‘ libjpeg-turbo8\\ โ•‘\nโ•‘ gstreamer1.0-libav โ•‘\nโ•‘ โ•‘\nโ•‘ <3 Playwright Team โ•‘\nโ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•" + }, + "errors": [ + { + "message": "Error: browserType.launch: \nโ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—\nโ•‘ Host system is missing dependencies to run browsers. โ•‘\nโ•‘ Please install them with the following command: โ•‘\nโ•‘ โ•‘\nโ•‘ sudo npx playwright install-deps โ•‘\nโ•‘ โ•‘\nโ•‘ Alternatively, use apt: โ•‘\nโ•‘ sudo apt-get install libicu74\\ โ•‘\nโ•‘ libjpeg-turbo8\\ โ•‘\nโ•‘ gstreamer1.0-libav โ•‘\nโ•‘ โ•‘\nโ•‘ <3 Playwright Team โ•‘\nโ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:34:57.115Z", + "annotations": [], + "attachments": [] + } + ], + "status": "unexpected" + } + ], + "id": "c50e3d8c82f89a880019-a43ca92baab99d59897b", + "file": "mvp-integration.spec.ts", + "line": 82, + "column": 7 + }, + { + "title": "1.3 - Can register new user", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "webkit", + "projectName": "webkit", + "results": [ + { + "workerIndex": 32, + "parallelIndex": 0, + "status": "failed", + "duration": 3, + "error": { + "message": "Error: browserType.launch: \nโ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—\nโ•‘ Host system is missing dependencies to run browsers. โ•‘\nโ•‘ Please install them with the following command: โ•‘\nโ•‘ โ•‘\nโ•‘ sudo npx playwright install-deps โ•‘\nโ•‘ โ•‘\nโ•‘ Alternatively, use apt: โ•‘\nโ•‘ sudo apt-get install libicu74\\ โ•‘\nโ•‘ libjpeg-turbo8\\ โ•‘\nโ•‘ gstreamer1.0-libav โ•‘\nโ•‘ โ•‘\nโ•‘ <3 Playwright Team โ•‘\nโ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•", + "stack": "Error: browserType.launch: \nโ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—\nโ•‘ Host system is missing dependencies to run browsers. โ•‘\nโ•‘ Please install them with the following command: โ•‘\nโ•‘ โ•‘\nโ•‘ sudo npx playwright install-deps โ•‘\nโ•‘ โ•‘\nโ•‘ Alternatively, use apt: โ•‘\nโ•‘ sudo apt-get install libicu74\\ โ•‘\nโ•‘ libjpeg-turbo8\\ โ•‘\nโ•‘ gstreamer1.0-libav โ•‘\nโ•‘ โ•‘\nโ•‘ <3 Playwright Team โ•‘\nโ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•" + }, + "errors": [ + { + "message": "Error: browserType.launch: \nโ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—\nโ•‘ Host system is missing dependencies to run browsers. โ•‘\nโ•‘ Please install them with the following command: โ•‘\nโ•‘ โ•‘\nโ•‘ sudo npx playwright install-deps โ•‘\nโ•‘ โ•‘\nโ•‘ Alternatively, use apt: โ•‘\nโ•‘ sudo apt-get install libicu74\\ โ•‘\nโ•‘ libjpeg-turbo8\\ โ•‘\nโ•‘ gstreamer1.0-libav โ•‘\nโ•‘ โ•‘\nโ•‘ <3 Playwright Team โ•‘\nโ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:34:57.887Z", + "annotations": [], + "attachments": [] + } + ], + "status": "unexpected" + } + ], + "id": "c50e3d8c82f89a880019-9450b3c875e31885ff89", + "file": "mvp-integration.spec.ts", + "line": 96, + "column": 7 + }, + { + "title": "1.4 - Can login with registered user", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "webkit", + "projectName": "webkit", + "results": [ + { + "workerIndex": 33, + "parallelIndex": 0, + "status": "failed", + "duration": 2, + "error": { + "message": "Error: browserType.launch: \nโ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—\nโ•‘ Host system is missing dependencies to run browsers. โ•‘\nโ•‘ Please install them with the following command: โ•‘\nโ•‘ โ•‘\nโ•‘ sudo npx playwright install-deps โ•‘\nโ•‘ โ•‘\nโ•‘ Alternatively, use apt: โ•‘\nโ•‘ sudo apt-get install libicu74\\ โ•‘\nโ•‘ libjpeg-turbo8\\ โ•‘\nโ•‘ gstreamer1.0-libav โ•‘\nโ•‘ โ•‘\nโ•‘ <3 Playwright Team โ•‘\nโ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•", + "stack": "Error: browserType.launch: \nโ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—\nโ•‘ Host system is missing dependencies to run browsers. โ•‘\nโ•‘ Please install them with the following command: โ•‘\nโ•‘ โ•‘\nโ•‘ sudo npx playwright install-deps โ•‘\nโ•‘ โ•‘\nโ•‘ Alternatively, use apt: โ•‘\nโ•‘ sudo apt-get install libicu74\\ โ•‘\nโ•‘ libjpeg-turbo8\\ โ•‘\nโ•‘ gstreamer1.0-libav โ•‘\nโ•‘ โ•‘\nโ•‘ <3 Playwright Team โ•‘\nโ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•" + }, + "errors": [ + { + "message": "Error: browserType.launch: \nโ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—\nโ•‘ Host system is missing dependencies to run browsers. โ•‘\nโ•‘ Please install them with the following command: โ•‘\nโ•‘ โ•‘\nโ•‘ sudo npx playwright install-deps โ•‘\nโ•‘ โ•‘\nโ•‘ Alternatively, use apt: โ•‘\nโ•‘ sudo apt-get install libicu74\\ โ•‘\nโ•‘ libjpeg-turbo8\\ โ•‘\nโ•‘ gstreamer1.0-libav โ•‘\nโ•‘ โ•‘\nโ•‘ <3 Playwright Team โ•‘\nโ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:34:58.643Z", + "annotations": [], + "attachments": [] + } + ], + "status": "unexpected" + } + ], + "id": "c50e3d8c82f89a880019-66c09b63579b0e8784ad", + "file": "mvp-integration.spec.ts", + "line": 160, + "column": 7 + }, + { + "title": "1.5 - Protected route redirects when not logged in", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "webkit", + "projectName": "webkit", + "results": [ + { + "workerIndex": 34, + "parallelIndex": 0, + "status": "failed", + "duration": 4, + "error": { + "message": "Error: browserType.launch: \nโ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—\nโ•‘ Host system is missing dependencies to run browsers. โ•‘\nโ•‘ Please install them with the following command: โ•‘\nโ•‘ โ•‘\nโ•‘ sudo npx playwright install-deps โ•‘\nโ•‘ โ•‘\nโ•‘ Alternatively, use apt: โ•‘\nโ•‘ sudo apt-get install libicu74\\ โ•‘\nโ•‘ libjpeg-turbo8\\ โ•‘\nโ•‘ gstreamer1.0-libav โ•‘\nโ•‘ โ•‘\nโ•‘ <3 Playwright Team โ•‘\nโ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•", + "stack": "Error: browserType.launch: \nโ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—\nโ•‘ Host system is missing dependencies to run browsers. โ•‘\nโ•‘ Please install them with the following command: โ•‘\nโ•‘ โ•‘\nโ•‘ sudo npx playwright install-deps โ•‘\nโ•‘ โ•‘\nโ•‘ Alternatively, use apt: โ•‘\nโ•‘ sudo apt-get install libicu74\\ โ•‘\nโ•‘ libjpeg-turbo8\\ โ•‘\nโ•‘ gstreamer1.0-libav โ•‘\nโ•‘ โ•‘\nโ•‘ <3 Playwright Team โ•‘\nโ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•" + }, + "errors": [ + { + "message": "Error: browserType.launch: \nโ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—\nโ•‘ Host system is missing dependencies to run browsers. โ•‘\nโ•‘ Please install them with the following command: โ•‘\nโ•‘ โ•‘\nโ•‘ sudo npx playwright install-deps โ•‘\nโ•‘ โ•‘\nโ•‘ Alternatively, use apt: โ•‘\nโ•‘ sudo apt-get install libicu74\\ โ•‘\nโ•‘ libjpeg-turbo8\\ โ•‘\nโ•‘ gstreamer1.0-libav โ•‘\nโ•‘ โ•‘\nโ•‘ <3 Playwright Team โ•‘\nโ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:34:59.328Z", + "annotations": [], + "attachments": [] + } + ], + "status": "unexpected" + } + ], + "id": "c50e3d8c82f89a880019-9ce59b4d17a7daac26e3", + "file": "mvp-integration.spec.ts", + "line": 342, + "column": 7 + }, + { + "title": "1.1 - Login page loads correctly", + "ok": true, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "msedge", + "projectName": "msedge", + "results": [ + { + "workerIndex": 52, + "parallelIndex": 0, + "status": "passed", + "duration": 1533, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:35:12.324Z", + "annotations": [], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "c50e3d8c82f89a880019-4c89419d9a5663a04004", + "file": "mvp-integration.spec.ts", + "line": 57, + "column": 7 + }, + { + "title": "1.2 - Register page loads correctly", + "ok": true, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "msedge", + "projectName": "msedge", + "results": [ + { + "workerIndex": 52, + "parallelIndex": 0, + "status": "passed", + "duration": 541, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:35:13.918Z", + "annotations": [], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "c50e3d8c82f89a880019-3dc2b04c106b962cca98", + "file": "mvp-integration.spec.ts", + "line": 82, + "column": 7 + }, + { + "title": "1.3 - Can register new user", + "ok": true, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "msedge", + "projectName": "msedge", + "results": [ + { + "workerIndex": 52, + "parallelIndex": 0, + "status": "passed", + "duration": 2394, + "errors": [], + "stdout": [ + { + "text": "User registered successfully via API\n" + }, + { + "text": "User verified - can login after registration\n" + } + ], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:35:14.474Z", + "annotations": [], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "c50e3d8c82f89a880019-fe88f3ab59bfdf2feda6", + "file": "mvp-integration.spec.ts", + "line": 96, + "column": 7 + }, + { + "title": "1.4 - Can login with registered user", + "ok": true, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "msedge", + "projectName": "msedge", + "results": [ + { + "workerIndex": 52, + "parallelIndex": 0, + "status": "passed", + "duration": 2238, + "errors": [], + "stdout": [ + { + "text": "Test user registered successfully via API\n" + } + ], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:35:16.885Z", + "annotations": [], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "c50e3d8c82f89a880019-edc953ebc3457cfb8a18", + "file": "mvp-integration.spec.ts", + "line": 160, + "column": 7 + }, + { + "title": "1.5 - Protected route redirects when not logged in", + "ok": true, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "msedge", + "projectName": "msedge", + "results": [ + { + "workerIndex": 52, + "parallelIndex": 0, + "status": "passed", + "duration": 742, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:35:19.144Z", + "annotations": [], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "c50e3d8c82f89a880019-6c0f9af1b6cd7aa9542e", + "file": "mvp-integration.spec.ts", + "line": 342, + "column": 7 + } + ] + }, + { + "title": "Authenticated tests", + "file": "mvp-integration.spec.ts", + "line": 361, + "column": 10, + "specs": [ + { + "title": "1.6 - Can logout", + "ok": true, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "chromium", + "projectName": "chromium", + "results": [ + { + "workerIndex": 0, + "parallelIndex": 0, + "status": "passed", + "duration": 486, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:18:21.123Z", + "annotations": [], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "c50e3d8c82f89a880019-3d23f0ac29f971b28f92", + "file": "mvp-integration.spec.ts", + "line": 362, + "column": 7 + }, + { + "title": "1.6 - Can logout", + "ok": true, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "firefox", + "projectName": "firefox", + "results": [ + { + "workerIndex": 15, + "parallelIndex": 0, + "status": "passed", + "duration": 625, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:30:03.250Z", + "annotations": [], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "c50e3d8c82f89a880019-c07d74ef82df045fed61", + "file": "mvp-integration.spec.ts", + "line": 362, + "column": 7 + }, + { + "title": "1.6 - Can logout", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "webkit", + "projectName": "webkit", + "results": [ + { + "workerIndex": 35, + "parallelIndex": 0, + "status": "failed", + "duration": 3, + "error": { + "message": "Error: browserType.launch: \nโ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—\nโ•‘ Host system is missing dependencies to run browsers. โ•‘\nโ•‘ Please install them with the following command: โ•‘\nโ•‘ โ•‘\nโ•‘ sudo npx playwright install-deps โ•‘\nโ•‘ โ•‘\nโ•‘ Alternatively, use apt: โ•‘\nโ•‘ sudo apt-get install libicu74\\ โ•‘\nโ•‘ libjpeg-turbo8\\ โ•‘\nโ•‘ gstreamer1.0-libav โ•‘\nโ•‘ โ•‘\nโ•‘ <3 Playwright Team โ•‘\nโ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•", + "stack": "Error: browserType.launch: \nโ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—\nโ•‘ Host system is missing dependencies to run browsers. โ•‘\nโ•‘ Please install them with the following command: โ•‘\nโ•‘ โ•‘\nโ•‘ sudo npx playwright install-deps โ•‘\nโ•‘ โ•‘\nโ•‘ Alternatively, use apt: โ•‘\nโ•‘ sudo apt-get install libicu74\\ โ•‘\nโ•‘ libjpeg-turbo8\\ โ•‘\nโ•‘ gstreamer1.0-libav โ•‘\nโ•‘ โ•‘\nโ•‘ <3 Playwright Team โ•‘\nโ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•" + }, + "errors": [ + { + "message": "Error: browserType.launch: \nโ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—\nโ•‘ Host system is missing dependencies to run browsers. โ•‘\nโ•‘ Please install them with the following command: โ•‘\nโ•‘ โ•‘\nโ•‘ sudo npx playwright install-deps โ•‘\nโ•‘ โ•‘\nโ•‘ Alternatively, use apt: โ•‘\nโ•‘ sudo apt-get install libicu74\\ โ•‘\nโ•‘ libjpeg-turbo8\\ โ•‘\nโ•‘ gstreamer1.0-libav โ•‘\nโ•‘ โ•‘\nโ•‘ <3 Playwright Team โ•‘\nโ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:35:00.079Z", + "annotations": [], + "attachments": [] + } + ], + "status": "unexpected" + } + ], + "id": "c50e3d8c82f89a880019-d6b9f7864b4599f74ea1", + "file": "mvp-integration.spec.ts", + "line": 362, + "column": 7 + }, + { + "title": "1.6 - Can logout", + "ok": true, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "msedge", + "projectName": "msedge", + "results": [ + { + "workerIndex": 52, + "parallelIndex": 0, + "status": "passed", + "duration": 422, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:35:19.902Z", + "annotations": [], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "c50e3d8c82f89a880019-4ede48d85d6ca3e23ab3", + "file": "mvp-integration.spec.ts", + "line": 362, + "column": 7 + } + ] + } + ] + }, + { + "title": "2. Dashboard & Navigation", + "file": "mvp-integration.spec.ts", + "line": 390, + "column": 8, + "specs": [ + { + "title": "2.1 - Dashboard loads without errors", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "chromium", + "projectName": "chromium", + "results": [ + { + "workerIndex": 0, + "parallelIndex": 0, + "status": "timedOut", + "duration": 61950, + "error": { + "message": "\u001b[31mTest timeout of 60000ms exceeded while running \"beforeEach\" hook.\u001b[39m", + "stack": "\u001b[31mTest timeout of 60000ms exceeded while running \"beforeEach\" hook.\u001b[39m\n at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:392:10", + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 10, + "line": 392 + }, + "snippet": "\u001b[0m \u001b[90m 390 |\u001b[39m test\u001b[33m.\u001b[39mdescribe(\u001b[32m'2. Dashboard & Navigation'\u001b[39m\u001b[33m,\u001b[39m () \u001b[33m=>\u001b[39m {\n \u001b[90m 391 |\u001b[39m \n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 392 |\u001b[39m test\u001b[33m.\u001b[39mbeforeEach(\u001b[36masync\u001b[39m ({ page }) \u001b[33m=>\u001b[39m {\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 393 |\u001b[39m \u001b[90m// Login before each test\u001b[39m\n \u001b[90m 394 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mgoto(\u001b[32m`${TEST_CONFIG.FRONTEND_URL}/login`\u001b[39m)\u001b[33m;\u001b[39m\n \u001b[90m 395 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"email\"], input[name=\"email\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39memail)\u001b[33m;\u001b[39m\u001b[0m" }, - "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32mtrue\u001b[39m\nReceived: \u001b[31mfalse\u001b[39m\n\n 108 | .isVisible({ timeout: 3000 })\n 109 | .catch(() => false);\n> 110 | expect(successMessage).toBe(true);\n | ^\n 111 | console.log('โœ… [AUTH-FLOW] Registration successful (success message shown)');\n 112 | }\n 113 |\n at /home/senke/git/talas/veza/apps/web/e2e/auth-flow.spec.ts:110:30" + "errors": [ + { + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 10, + "line": 392 + }, + "message": "\u001b[31mTest timeout of 60000ms exceeded while running \"beforeEach\" hook.\u001b[39m\n\n\u001b[0m \u001b[90m 390 |\u001b[39m test\u001b[33m.\u001b[39mdescribe(\u001b[32m'2. Dashboard & Navigation'\u001b[39m\u001b[33m,\u001b[39m () \u001b[33m=>\u001b[39m {\n \u001b[90m 391 |\u001b[39m \n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 392 |\u001b[39m test\u001b[33m.\u001b[39mbeforeEach(\u001b[36masync\u001b[39m ({ page }) \u001b[33m=>\u001b[39m {\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 393 |\u001b[39m \u001b[90m// Login before each test\u001b[39m\n \u001b[90m 394 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mgoto(\u001b[32m`${TEST_CONFIG.FRONTEND_URL}/login`\u001b[39m)\u001b[33m;\u001b[39m\n \u001b[90m 395 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"email\"], input[name=\"email\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39memail)\u001b[33m;\u001b[39m\u001b[0m\n\u001b[2m at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:392:10\u001b[22m" + }, + { + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 18, + "line": 395 + }, + "message": "Error: page.fill: Test timeout of 60000ms exceeded.\nCall log:\n\u001b[2m - waiting for locator('input[type=\"email\"], input[name=\"email\"]')\u001b[22m\n\n\n\u001b[0m \u001b[90m 393 |\u001b[39m \u001b[90m// Login before each test\u001b[39m\n \u001b[90m 394 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mgoto(\u001b[32m`${TEST_CONFIG.FRONTEND_URL}/login`\u001b[39m)\u001b[33m;\u001b[39m\n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 395 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"email\"], input[name=\"email\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39memail)\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 396 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"password\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39mpassword)\u001b[33m;\u001b[39m\n \u001b[90m 397 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mclick(\u001b[32m'button[type=\"submit\"]'\u001b[39m)\u001b[33m;\u001b[39m\n \u001b[90m 398 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mwaitForURL(\u001b[35m/\\/(dashboard|home|app)/\u001b[39m\u001b[33m,\u001b[39m { timeout\u001b[33m:\u001b[39m \u001b[35m15000\u001b[39m })\u001b[33m;\u001b[39m\u001b[0m\n\u001b[2m at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:395:18\u001b[22m" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:18:21.625Z", + "annotations": [], + "attachments": [ + { + "name": "screenshot", + "contentType": "image/png", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-d0e5b-hboard-loads-without-errors-chromium/test-failed-1.png" + }, + { + "name": "video", + "contentType": "video/webm", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-d0e5b-hboard-loads-without-errors-chromium/video.webm" + }, + { + "name": "error-context", + "contentType": "text/markdown", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-d0e5b-hboard-loads-without-errors-chromium/error-context.md" + } + ], + "errorLocation": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 10, + "line": 392 + } } ], - "stdout": [ - { - "text": "๐Ÿงช [AUTH-FLOW] Step 1: Register with valid email\n" - }, - { - "text": "โœ๏ธ [FILL] Filling field input[name=\"email\"], input#email with value: test-flow-1766857215859@example.com\n" - }, - { - "text": "โœ… [FILL] Field input[name=\"email\"], input#email filled successfully\n" - }, - { - "text": "โœ๏ธ [FILL] Filling field input[name=\"username\"], input#username with value: testuser1766857215859\n" - }, - { - "text": "โœ… [FILL] Field input[name=\"username\"], input#username filled successfully\n" - }, - { - "text": "โœ๏ธ [FILL] Filling field input[name=\"password\"], input#password with value: Test123456789!\n" - }, - { - "text": "โœ… [FILL] Field input[name=\"password\"], input#password filled successfully\n" - }, - { - "text": "โœ๏ธ [FILL] Filling field input[name=\"passwordConfirm\"], input[name=\"password_confirm\"], input[name=\"confirmPassword\"], input#passwordConfirm with value: Test123456789!\n" - }, - { - "text": "โœ… [FILL] Field input[name=\"passwordConfirm\"], input[name=\"password_confirm\"], input[name=\"confirmPassword\"], input#passwordConfirm filled successfully\n" - }, - { - "text": "โšก [FORM SUBMIT] Forcing submission of form: form\n" - }, - { - "text": "๐Ÿ” [FORM SUBMIT] Waiting for form selector: form\n" - }, - { - "text": "โณ [FORM SUBMIT] Waiting for React to update state...\n" - }, - { - "text": "๐Ÿš€ [FORM SUBMIT] Submitting form...\n" - }, - { - "text": "โœ… [FORM SUBMIT] Form form submitted successfully\n" - }, - { - "text": "๐Ÿ”ด [NETWORK ERROR] POST http://127.0.0.1:8080/api/v1/auth/register: 500\n" - }, - { - "text": "๐Ÿ”ด [CONSOLE ERROR] Failed to load resource: the server responded with a status of 500 (Internal Server Error)\n" - }, - { - "text": "๐Ÿ”ด [NETWORK ERROR] POST http://127.0.0.1:8080/api/v1/auth/register: 500\n" - }, - { - "text": "๐Ÿ”ด [CONSOLE ERROR] Failed to load resource: the server responded with a status of 500 (Internal Server Error)\n" - }, - { - "text": "๐Ÿ”ด [NETWORK ERROR] POST http://127.0.0.1:8080/api/v1/auth/register: 500\n" - }, - { - "text": "๐Ÿ”ด [CONSOLE ERROR] Failed to load resource: the server responded with a status of 500 (Internal Server Error)\n" - }, - { - "text": "๐Ÿ”ด [NETWORK ERROR] POST http://127.0.0.1:8080/api/v1/auth/register: 500\n" - }, - { - "text": "๐Ÿ”ด [CONSOLE ERROR] Failed to load resource: the server responded with a status of 500 (Internal Server Error)\n" - }, - { - "text": "๐Ÿ”ด [CONSOLE ERROR] [API Error] HTTP 500 error after 3 retries - Request ID: 4ce083f7-2265-437b-9c9a-d9ffb4723cd1 {code: 9000, message: Failed to create user, request_id: 4ce083f7-2265-437b-9c9a-d9ffb4723cd1, timestamp: 2025-12-27T17:40:25Z, url: /auth/register}\n" - }, - { - "text": "๐Ÿ”ด [CONSOLE ERROR] Register error: {code: 9000, message: Failed to create user, details: undefined, request_id: 4ce083f7-2265-437b-9c9a-d9ffb4723cd1, timestamp: 2025-12-27T17:40:25Z}\n" - }, - { - "text": "\n๐Ÿ“Š [AUTH-FLOW] === Final Verifications ===\n" - }, - { - "text": "๐Ÿ”ด [AUTH-FLOW] Console errors (6):\n" - }, - { - "text": " - Failed to load resource: the server responded with a status of 500 (Internal Server Error)\n" - }, - { - "text": " - Failed to load resource: the server responded with a status of 500 (Internal Server Error)\n" - }, - { - "text": " - Failed to load resource: the server responded with a status of 500 (Internal Server Error)\n" - }, - { - "text": " - Failed to load resource: the server responded with a status of 500 (Internal Server Error)\n" - }, - { - "text": " - [API Error] HTTP 500 error after 3 retries - Request ID: 4ce083f7-2265-437b-9c9a-d9ffb4723cd1 {code: 9000, message: Failed to create user, request_id: 4ce083f7-2265-437b-9c9a-d9ffb4723cd1, timestamp: 2025-12-27T17:40:25Z, url: /auth/register}\n" - }, - { - "text": " - Register error: {code: 9000, message: Failed to create user, details: undefined, request_id: 4ce083f7-2265-437b-9c9a-d9ffb4723cd1, timestamp: 2025-12-27T17:40:25Z}\n" - }, - { - "text": "๐Ÿ”ด [AUTH-FLOW] Network errors (4):\n" - }, - { - "text": " - POST http://127.0.0.1:8080/api/v1/auth/register: 500\n" - }, - { - "text": " - POST http://127.0.0.1:8080/api/v1/auth/register: 500\n" - }, - { - "text": " - POST http://127.0.0.1:8080/api/v1/auth/register: 500\n" - }, - { - "text": " - POST http://127.0.0.1:8080/api/v1/auth/register: 500\n" - } - ], - "stderr": [], - "retry": 0, - "startTime": "2025-12-27T17:40:14.712Z", - "annotations": [], - "attachments": [ - { - "name": "screenshot", - "contentType": "image/png", - "path": "/home/senke/git/talas/veza/apps/web/test-results/auth-flow-Complete-Auth-Fl-97b92-a-new-user-with-valid-email-chromium/test-failed-1.png" - }, - { - "name": "video", - "contentType": "video/webm", - "path": "/home/senke/git/talas/veza/apps/web/test-results/auth-flow-Complete-Auth-Fl-97b92-a-new-user-with-valid-email-chromium/video.webm" - }, - { - "name": "error-context", - "contentType": "text/markdown", - "path": "/home/senke/git/talas/veza/apps/web/test-results/auth-flow-Complete-Auth-Fl-97b92-a-new-user-with-valid-email-chromium/error-context.md" - }, - { - "name": "trace", - "contentType": "application/zip", - "path": "/home/senke/git/talas/veza/apps/web/test-results/auth-flow-Complete-Auth-Fl-97b92-a-new-user-with-valid-email-chromium/trace.zip" - } - ], - "errorLocation": { - "file": "/home/senke/git/talas/veza/apps/web/e2e/auth-flow.spec.ts", - "column": 30, - "line": 110 - } + "status": "unexpected" } ], - "status": "unexpected" - } - ], - "id": "df6b40174562c70df515-dd266bf5fb98d1b15910", - "file": "auth-flow.spec.ts", - "line": 43, - "column": 3 - }, - { - "title": "should verify email after registration", - "ok": false, - "tags": [], - "tests": [ + "id": "c50e3d8c82f89a880019-b6aee5a4b63aa68dbb7b", + "file": "mvp-integration.spec.ts", + "line": 401, + "column": 5 + }, { - "timeout": 60000, - "annotations": [], - "expectedStatus": "passed", - "projectId": "chromium", - "projectName": "chromium", - "results": [ + "title": "2.2 - Navigation works", + "ok": false, + "tags": [], + "tests": [ { - "workerIndex": 5, - "parallelIndex": 0, - "status": "failed", - "duration": 225, - "error": { - "message": "Error: page.evaluate: SecurityError: Failed to read the 'sessionStorage' property from 'Window': Access is denied for this document.\n at UtilityScript.evaluate (:292:16)\n at UtilityScript. (:1:44)", - "stack": "Error: page.evaluate: SecurityError: Failed to read the 'sessionStorage' property from 'Window': Access is denied for this document.\n at UtilityScript.evaluate (:292:16)\n at UtilityScript. (:1:44)\n at UtilityScript.evaluate (:292:16)\n at UtilityScript. (:1:44)\n at /home/senke/git/talas/veza/apps/web/e2e/auth-flow.spec.ts:141:36", - "location": { - "file": "", - "column": 16, - "line": 292 - } - }, - "errors": [ + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "chromium", + "projectName": "chromium", + "results": [ { - "location": { - "file": "", - "column": 16, - "line": 292 + "workerIndex": 1, + "parallelIndex": 0, + "status": "timedOut", + "duration": 60396, + "error": { + "message": "\u001b[31mTest timeout of 60000ms exceeded while running \"beforeEach\" hook.\u001b[39m", + "stack": "\u001b[31mTest timeout of 60000ms exceeded while running \"beforeEach\" hook.\u001b[39m\n at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:392:10", + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 10, + "line": 392 + }, + "snippet": "\u001b[0m \u001b[90m 390 |\u001b[39m test\u001b[33m.\u001b[39mdescribe(\u001b[32m'2. Dashboard & Navigation'\u001b[39m\u001b[33m,\u001b[39m () \u001b[33m=>\u001b[39m {\n \u001b[90m 391 |\u001b[39m \n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 392 |\u001b[39m test\u001b[33m.\u001b[39mbeforeEach(\u001b[36masync\u001b[39m ({ page }) \u001b[33m=>\u001b[39m {\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 393 |\u001b[39m \u001b[90m// Login before each test\u001b[39m\n \u001b[90m 394 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mgoto(\u001b[32m`${TEST_CONFIG.FRONTEND_URL}/login`\u001b[39m)\u001b[33m;\u001b[39m\n \u001b[90m 395 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"email\"], input[name=\"email\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39memail)\u001b[33m;\u001b[39m\u001b[0m" }, - "message": "Error: page.evaluate: SecurityError: Failed to read the 'sessionStorage' property from 'Window': Access is denied for this document.\n at UtilityScript.evaluate (:292:16)\n at UtilityScript. (:1:44)\n at UtilityScript.evaluate (:292:16)\n at UtilityScript. (:1:44)\n at /home/senke/git/talas/veza/apps/web/e2e/auth-flow.spec.ts:141:36" + "errors": [ + { + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 10, + "line": 392 + }, + "message": "\u001b[31mTest timeout of 60000ms exceeded while running \"beforeEach\" hook.\u001b[39m\n\n\u001b[0m \u001b[90m 390 |\u001b[39m test\u001b[33m.\u001b[39mdescribe(\u001b[32m'2. Dashboard & Navigation'\u001b[39m\u001b[33m,\u001b[39m () \u001b[33m=>\u001b[39m {\n \u001b[90m 391 |\u001b[39m \n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 392 |\u001b[39m test\u001b[33m.\u001b[39mbeforeEach(\u001b[36masync\u001b[39m ({ page }) \u001b[33m=>\u001b[39m {\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 393 |\u001b[39m \u001b[90m// Login before each test\u001b[39m\n \u001b[90m 394 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mgoto(\u001b[32m`${TEST_CONFIG.FRONTEND_URL}/login`\u001b[39m)\u001b[33m;\u001b[39m\n \u001b[90m 395 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"email\"], input[name=\"email\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39memail)\u001b[33m;\u001b[39m\u001b[0m\n\u001b[2m at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:392:10\u001b[22m" + }, + { + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 18, + "line": 395 + }, + "message": "Error: page.fill: Test timeout of 60000ms exceeded.\nCall log:\n\u001b[2m - waiting for locator('input[type=\"email\"], input[name=\"email\"]')\u001b[22m\n\n\n\u001b[0m \u001b[90m 393 |\u001b[39m \u001b[90m// Login before each test\u001b[39m\n \u001b[90m 394 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mgoto(\u001b[32m`${TEST_CONFIG.FRONTEND_URL}/login`\u001b[39m)\u001b[33m;\u001b[39m\n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 395 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"email\"], input[name=\"email\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39memail)\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 396 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"password\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39mpassword)\u001b[33m;\u001b[39m\n \u001b[90m 397 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mclick(\u001b[32m'button[type=\"submit\"]'\u001b[39m)\u001b[33m;\u001b[39m\n \u001b[90m 398 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mwaitForURL(\u001b[35m/\\/(dashboard|home|app)/\u001b[39m\u001b[33m,\u001b[39m { timeout\u001b[33m:\u001b[39m \u001b[35m15000\u001b[39m })\u001b[33m;\u001b[39m\u001b[0m\n\u001b[2m at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:395:18\u001b[22m" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:19:24.180Z", + "annotations": [], + "attachments": [ + { + "name": "screenshot", + "contentType": "image/png", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-b9835-tion-2-2---Navigation-works-chromium/test-failed-1.png" + }, + { + "name": "video", + "contentType": "video/webm", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-b9835-tion-2-2---Navigation-works-chromium/video.webm" + }, + { + "name": "error-context", + "contentType": "text/markdown", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-b9835-tion-2-2---Navigation-works-chromium/error-context.md" + } + ], + "errorLocation": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 10, + "line": 392 + } } ], - "stdout": [ - { - "text": "๐Ÿงช [AUTH-FLOW] Step 2: Verify email\n" - }, - { - "text": "\n๐Ÿ“Š [AUTH-FLOW] === Final Verifications ===\n" - }, - { - "text": "โœ… [AUTH-FLOW] No console errors\n" - }, - { - "text": "โœ… [AUTH-FLOW] No network errors\n" - } - ], - "stderr": [], - "retry": 0, - "startTime": "2025-12-27T17:40:28.839Z", - "annotations": [], - "attachments": [ - { - "name": "screenshot", - "contentType": "image/png", - "path": "/home/senke/git/talas/veza/apps/web/test-results/auth-flow-Complete-Auth-Fl-8d1d9-fy-email-after-registration-chromium/test-failed-1.png" - }, - { - "name": "video", - "contentType": "video/webm", - "path": "/home/senke/git/talas/veza/apps/web/test-results/auth-flow-Complete-Auth-Fl-8d1d9-fy-email-after-registration-chromium/video.webm" - }, - { - "name": "trace", - "contentType": "application/zip", - "path": "/home/senke/git/talas/veza/apps/web/test-results/auth-flow-Complete-Auth-Fl-8d1d9-fy-email-after-registration-chromium/trace.zip" - } - ], - "errorLocation": { - "file": "", - "column": 16, - "line": 292 - } + "status": "unexpected" } ], - "status": "unexpected" - } - ], - "id": "df6b40174562c70df515-52f4b8a229ce3eb1d2fd", - "file": "auth-flow.spec.ts", - "line": 137, - "column": 3 - }, - { - "title": "should login successfully and verify token is stored", - "ok": false, - "tags": [], - "tests": [ + "id": "c50e3d8c82f89a880019-3197e58de4c0ce61d7e9", + "file": "mvp-integration.spec.ts", + "line": 419, + "column": 5 + }, { - "timeout": 60000, - "annotations": [], - "expectedStatus": "passed", - "projectId": "chromium", - "projectName": "chromium", - "results": [ + "title": "2.1 - Dashboard loads without errors", + "ok": false, + "tags": [], + "tests": [ { - "workerIndex": 6, - "parallelIndex": 0, - "status": "failed", - "duration": 222, - "error": { - "message": "Error: page.evaluate: SecurityError: Failed to read the 'sessionStorage' property from 'Window': Access is denied for this document.\n at UtilityScript.evaluate (:292:16)\n at UtilityScript. (:1:44)", - "stack": "Error: page.evaluate: SecurityError: Failed to read the 'sessionStorage' property from 'Window': Access is denied for this document.\n at UtilityScript.evaluate (:292:16)\n at UtilityScript. (:1:44)\n at UtilityScript.evaluate (:292:16)\n at UtilityScript. (:1:44)\n at /home/senke/git/talas/veza/apps/web/e2e/auth-flow.spec.ts:201:36", - "location": { - "file": "", - "column": 16, - "line": 292 - } - }, - "errors": [ + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "firefox", + "projectName": "firefox", + "results": [ { - "location": { - "file": "", - "column": 16, - "line": 292 + "workerIndex": 15, + "parallelIndex": 0, + "status": "timedOut", + "duration": 60090, + "error": { + "message": "\u001b[31mTest timeout of 60000ms exceeded while running \"beforeEach\" hook.\u001b[39m", + "stack": "\u001b[31mTest timeout of 60000ms exceeded while running \"beforeEach\" hook.\u001b[39m\n at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:392:10", + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 10, + "line": 392 + }, + "snippet": "\u001b[0m \u001b[90m 390 |\u001b[39m test\u001b[33m.\u001b[39mdescribe(\u001b[32m'2. Dashboard & Navigation'\u001b[39m\u001b[33m,\u001b[39m () \u001b[33m=>\u001b[39m {\n \u001b[90m 391 |\u001b[39m \n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 392 |\u001b[39m test\u001b[33m.\u001b[39mbeforeEach(\u001b[36masync\u001b[39m ({ page }) \u001b[33m=>\u001b[39m {\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 393 |\u001b[39m \u001b[90m// Login before each test\u001b[39m\n \u001b[90m 394 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mgoto(\u001b[32m`${TEST_CONFIG.FRONTEND_URL}/login`\u001b[39m)\u001b[33m;\u001b[39m\n \u001b[90m 395 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"email\"], input[name=\"email\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39memail)\u001b[33m;\u001b[39m\u001b[0m" }, - "message": "Error: page.evaluate: SecurityError: Failed to read the 'sessionStorage' property from 'Window': Access is denied for this document.\n at UtilityScript.evaluate (:292:16)\n at UtilityScript. (:1:44)\n at UtilityScript.evaluate (:292:16)\n at UtilityScript. (:1:44)\n at /home/senke/git/talas/veza/apps/web/e2e/auth-flow.spec.ts:201:36" + "errors": [ + { + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 10, + "line": 392 + }, + "message": "\u001b[31mTest timeout of 60000ms exceeded while running \"beforeEach\" hook.\u001b[39m\n\n\u001b[0m \u001b[90m 390 |\u001b[39m test\u001b[33m.\u001b[39mdescribe(\u001b[32m'2. Dashboard & Navigation'\u001b[39m\u001b[33m,\u001b[39m () \u001b[33m=>\u001b[39m {\n \u001b[90m 391 |\u001b[39m \n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 392 |\u001b[39m test\u001b[33m.\u001b[39mbeforeEach(\u001b[36masync\u001b[39m ({ page }) \u001b[33m=>\u001b[39m {\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 393 |\u001b[39m \u001b[90m// Login before each test\u001b[39m\n \u001b[90m 394 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mgoto(\u001b[32m`${TEST_CONFIG.FRONTEND_URL}/login`\u001b[39m)\u001b[33m;\u001b[39m\n \u001b[90m 395 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"email\"], input[name=\"email\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39memail)\u001b[33m;\u001b[39m\u001b[0m\n\u001b[2m at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:392:10\u001b[22m" + }, + { + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 18, + "line": 395 + }, + "message": "Error: page.fill: Test timeout of 60000ms exceeded.\nCall log:\n\u001b[2m - waiting for locator('input[type=\"email\"], input[name=\"email\"]')\u001b[22m\n\n\n\u001b[0m \u001b[90m 393 |\u001b[39m \u001b[90m// Login before each test\u001b[39m\n \u001b[90m 394 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mgoto(\u001b[32m`${TEST_CONFIG.FRONTEND_URL}/login`\u001b[39m)\u001b[33m;\u001b[39m\n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 395 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"email\"], input[name=\"email\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39memail)\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 396 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"password\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39mpassword)\u001b[33m;\u001b[39m\n \u001b[90m 397 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mclick(\u001b[32m'button[type=\"submit\"]'\u001b[39m)\u001b[33m;\u001b[39m\n \u001b[90m 398 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mwaitForURL(\u001b[35m/\\/(dashboard|home|app)/\u001b[39m\u001b[33m,\u001b[39m { timeout\u001b[33m:\u001b[39m \u001b[35m15000\u001b[39m })\u001b[33m;\u001b[39m\u001b[0m\n\u001b[2m at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:395:18\u001b[22m" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:30:03.891Z", + "annotations": [], + "attachments": [ + { + "name": "screenshot", + "contentType": "image/png", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-d0e5b-hboard-loads-without-errors-firefox/test-failed-1.png" + }, + { + "name": "video", + "contentType": "video/webm", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-d0e5b-hboard-loads-without-errors-firefox/video.webm" + }, + { + "name": "error-context", + "contentType": "text/markdown", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-d0e5b-hboard-loads-without-errors-firefox/error-context.md" + } + ], + "errorLocation": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 10, + "line": 392 + } } ], - "stdout": [ - { - "text": "๐Ÿงช [AUTH-FLOW] Step 3: Login and verify token\n" - }, - { - "text": "\n๐Ÿ“Š [AUTH-FLOW] === Final Verifications ===\n" - }, - { - "text": "โœ… [AUTH-FLOW] No console errors\n" - }, - { - "text": "โœ… [AUTH-FLOW] No network errors\n" - } - ], - "stderr": [], - "retry": 0, - "startTime": "2025-12-27T17:40:29.822Z", - "annotations": [], - "attachments": [ - { - "name": "screenshot", - "contentType": "image/png", - "path": "/home/senke/git/talas/veza/apps/web/test-results/auth-flow-Complete-Auth-Fl-8c50e--and-verify-token-is-stored-chromium/test-failed-1.png" - }, - { - "name": "video", - "contentType": "video/webm", - "path": "/home/senke/git/talas/veza/apps/web/test-results/auth-flow-Complete-Auth-Fl-8c50e--and-verify-token-is-stored-chromium/video.webm" - }, - { - "name": "trace", - "contentType": "application/zip", - "path": "/home/senke/git/talas/veza/apps/web/test-results/auth-flow-Complete-Auth-Fl-8c50e--and-verify-token-is-stored-chromium/trace.zip" - } - ], - "errorLocation": { - "file": "", - "column": 16, - "line": 292 - } + "status": "unexpected" } ], - "status": "unexpected" + "id": "c50e3d8c82f89a880019-0cb9bb559cd6fd8674ad", + "file": "mvp-integration.spec.ts", + "line": 401, + "column": 5 + }, + { + "title": "2.2 - Navigation works", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "firefox", + "projectName": "firefox", + "results": [ + { + "workerIndex": 16, + "parallelIndex": 0, + "status": "timedOut", + "duration": 60097, + "error": { + "message": "\u001b[31mTest timeout of 60000ms exceeded while running \"beforeEach\" hook.\u001b[39m", + "stack": "\u001b[31mTest timeout of 60000ms exceeded while running \"beforeEach\" hook.\u001b[39m\n at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:392:10", + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 10, + "line": 392 + }, + "snippet": "\u001b[0m \u001b[90m 390 |\u001b[39m test\u001b[33m.\u001b[39mdescribe(\u001b[32m'2. Dashboard & Navigation'\u001b[39m\u001b[33m,\u001b[39m () \u001b[33m=>\u001b[39m {\n \u001b[90m 391 |\u001b[39m \n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 392 |\u001b[39m test\u001b[33m.\u001b[39mbeforeEach(\u001b[36masync\u001b[39m ({ page }) \u001b[33m=>\u001b[39m {\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 393 |\u001b[39m \u001b[90m// Login before each test\u001b[39m\n \u001b[90m 394 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mgoto(\u001b[32m`${TEST_CONFIG.FRONTEND_URL}/login`\u001b[39m)\u001b[33m;\u001b[39m\n \u001b[90m 395 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"email\"], input[name=\"email\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39memail)\u001b[33m;\u001b[39m\u001b[0m" + }, + "errors": [ + { + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 10, + "line": 392 + }, + "message": "\u001b[31mTest timeout of 60000ms exceeded while running \"beforeEach\" hook.\u001b[39m\n\n\u001b[0m \u001b[90m 390 |\u001b[39m test\u001b[33m.\u001b[39mdescribe(\u001b[32m'2. Dashboard & Navigation'\u001b[39m\u001b[33m,\u001b[39m () \u001b[33m=>\u001b[39m {\n \u001b[90m 391 |\u001b[39m \n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 392 |\u001b[39m test\u001b[33m.\u001b[39mbeforeEach(\u001b[36masync\u001b[39m ({ page }) \u001b[33m=>\u001b[39m {\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 393 |\u001b[39m \u001b[90m// Login before each test\u001b[39m\n \u001b[90m 394 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mgoto(\u001b[32m`${TEST_CONFIG.FRONTEND_URL}/login`\u001b[39m)\u001b[33m;\u001b[39m\n \u001b[90m 395 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"email\"], input[name=\"email\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39memail)\u001b[33m;\u001b[39m\u001b[0m\n\u001b[2m at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:392:10\u001b[22m" + }, + { + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 18, + "line": 395 + }, + "message": "Error: page.fill: Test timeout of 60000ms exceeded.\nCall log:\n\u001b[2m - waiting for locator('input[type=\"email\"], input[name=\"email\"]')\u001b[22m\n\n\n\u001b[0m \u001b[90m 393 |\u001b[39m \u001b[90m// Login before each test\u001b[39m\n \u001b[90m 394 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mgoto(\u001b[32m`${TEST_CONFIG.FRONTEND_URL}/login`\u001b[39m)\u001b[33m;\u001b[39m\n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 395 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"email\"], input[name=\"email\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39memail)\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 396 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"password\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39mpassword)\u001b[33m;\u001b[39m\n \u001b[90m 397 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mclick(\u001b[32m'button[type=\"submit\"]'\u001b[39m)\u001b[33m;\u001b[39m\n \u001b[90m 398 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mwaitForURL(\u001b[35m/\\/(dashboard|home|app)/\u001b[39m\u001b[33m,\u001b[39m { timeout\u001b[33m:\u001b[39m \u001b[35m15000\u001b[39m })\u001b[33m;\u001b[39m\u001b[0m\n\u001b[2m at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:395:18\u001b[22m" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:31:04.949Z", + "annotations": [], + "attachments": [ + { + "name": "screenshot", + "contentType": "image/png", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-b9835-tion-2-2---Navigation-works-firefox/test-failed-1.png" + }, + { + "name": "video", + "contentType": "video/webm", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-b9835-tion-2-2---Navigation-works-firefox/video.webm" + }, + { + "name": "error-context", + "contentType": "text/markdown", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-b9835-tion-2-2---Navigation-works-firefox/error-context.md" + } + ], + "errorLocation": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 10, + "line": 392 + } + } + ], + "status": "unexpected" + } + ], + "id": "c50e3d8c82f89a880019-e5169f0f7891f1ee5a3e", + "file": "mvp-integration.spec.ts", + "line": 419, + "column": 5 + }, + { + "title": "2.1 - Dashboard loads without errors", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "webkit", + "projectName": "webkit", + "results": [ + { + "workerIndex": 36, + "parallelIndex": 0, + "status": "failed", + "duration": 3, + "error": { + "message": "Error: browserType.launch: \nโ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—\nโ•‘ Host system is missing dependencies to run browsers. โ•‘\nโ•‘ Please install them with the following command: โ•‘\nโ•‘ โ•‘\nโ•‘ sudo npx playwright install-deps โ•‘\nโ•‘ โ•‘\nโ•‘ Alternatively, use apt: โ•‘\nโ•‘ sudo apt-get install libicu74\\ โ•‘\nโ•‘ libjpeg-turbo8\\ โ•‘\nโ•‘ gstreamer1.0-libav โ•‘\nโ•‘ โ•‘\nโ•‘ <3 Playwright Team โ•‘\nโ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•", + "stack": "Error: browserType.launch: \nโ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—\nโ•‘ Host system is missing dependencies to run browsers. โ•‘\nโ•‘ Please install them with the following command: โ•‘\nโ•‘ โ•‘\nโ•‘ sudo npx playwright install-deps โ•‘\nโ•‘ โ•‘\nโ•‘ Alternatively, use apt: โ•‘\nโ•‘ sudo apt-get install libicu74\\ โ•‘\nโ•‘ libjpeg-turbo8\\ โ•‘\nโ•‘ gstreamer1.0-libav โ•‘\nโ•‘ โ•‘\nโ•‘ <3 Playwright Team โ•‘\nโ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•" + }, + "errors": [ + { + "message": "Error: browserType.launch: \nโ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—\nโ•‘ Host system is missing dependencies to run browsers. โ•‘\nโ•‘ Please install them with the following command: โ•‘\nโ•‘ โ•‘\nโ•‘ sudo npx playwright install-deps โ•‘\nโ•‘ โ•‘\nโ•‘ Alternatively, use apt: โ•‘\nโ•‘ sudo apt-get install libicu74\\ โ•‘\nโ•‘ libjpeg-turbo8\\ โ•‘\nโ•‘ gstreamer1.0-libav โ•‘\nโ•‘ โ•‘\nโ•‘ <3 Playwright Team โ•‘\nโ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:35:00.848Z", + "annotations": [], + "attachments": [] + } + ], + "status": "unexpected" + } + ], + "id": "c50e3d8c82f89a880019-eea86925fa2f7868b05b", + "file": "mvp-integration.spec.ts", + "line": 401, + "column": 5 + }, + { + "title": "2.2 - Navigation works", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "webkit", + "projectName": "webkit", + "results": [ + { + "workerIndex": 37, + "parallelIndex": 0, + "status": "failed", + "duration": 2, + "error": { + "message": "Error: browserType.launch: \nโ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—\nโ•‘ Host system is missing dependencies to run browsers. โ•‘\nโ•‘ Please install them with the following command: โ•‘\nโ•‘ โ•‘\nโ•‘ sudo npx playwright install-deps โ•‘\nโ•‘ โ•‘\nโ•‘ Alternatively, use apt: โ•‘\nโ•‘ sudo apt-get install libicu74\\ โ•‘\nโ•‘ libjpeg-turbo8\\ โ•‘\nโ•‘ gstreamer1.0-libav โ•‘\nโ•‘ โ•‘\nโ•‘ <3 Playwright Team โ•‘\nโ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•", + "stack": "Error: browserType.launch: \nโ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—\nโ•‘ Host system is missing dependencies to run browsers. โ•‘\nโ•‘ Please install them with the following command: โ•‘\nโ•‘ โ•‘\nโ•‘ sudo npx playwright install-deps โ•‘\nโ•‘ โ•‘\nโ•‘ Alternatively, use apt: โ•‘\nโ•‘ sudo apt-get install libicu74\\ โ•‘\nโ•‘ libjpeg-turbo8\\ โ•‘\nโ•‘ gstreamer1.0-libav โ•‘\nโ•‘ โ•‘\nโ•‘ <3 Playwright Team โ•‘\nโ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•" + }, + "errors": [ + { + "message": "Error: browserType.launch: \nโ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—\nโ•‘ Host system is missing dependencies to run browsers. โ•‘\nโ•‘ Please install them with the following command: โ•‘\nโ•‘ โ•‘\nโ•‘ sudo npx playwright install-deps โ•‘\nโ•‘ โ•‘\nโ•‘ Alternatively, use apt: โ•‘\nโ•‘ sudo apt-get install libicu74\\ โ•‘\nโ•‘ libjpeg-turbo8\\ โ•‘\nโ•‘ gstreamer1.0-libav โ•‘\nโ•‘ โ•‘\nโ•‘ <3 Playwright Team โ•‘\nโ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:35:01.554Z", + "annotations": [], + "attachments": [] + } + ], + "status": "unexpected" + } + ], + "id": "c50e3d8c82f89a880019-2afd333767aded58edf1", + "file": "mvp-integration.spec.ts", + "line": 419, + "column": 5 + }, + { + "title": "2.1 - Dashboard loads without errors", + "ok": true, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "msedge", + "projectName": "msedge", + "results": [ + { + "workerIndex": 52, + "parallelIndex": 0, + "status": "passed", + "duration": 1575, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:35:20.335Z", + "annotations": [], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "c50e3d8c82f89a880019-0afd2f9bfc66628e2259", + "file": "mvp-integration.spec.ts", + "line": 401, + "column": 5 + }, + { + "title": "2.2 - Navigation works", + "ok": true, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "msedge", + "projectName": "msedge", + "results": [ + { + "workerIndex": 52, + "parallelIndex": 0, + "status": "passed", + "duration": 885, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:35:21.922Z", + "annotations": [], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "c50e3d8c82f89a880019-e90783a79eeb61be1249", + "file": "mvp-integration.spec.ts", + "line": 419, + "column": 5 } - ], - "id": "df6b40174562c70df515-9813cb501eb633e27752", - "file": "auth-flow.spec.ts", - "line": 195, - "column": 3 + ] }, { - "title": "should automatically refresh token when expiring soon", - "ok": true, - "tags": [], - "tests": [ + "title": "3. Tracks Management", + "file": "mvp-integration.spec.ts", + "line": 437, + "column": 8, + "specs": [ { - "timeout": 60000, - "annotations": [], - "expectedStatus": "passed", - "projectId": "chromium", - "projectName": "chromium", - "results": [ + "title": "3.1 - Tracks page loads", + "ok": false, + "tags": [], + "tests": [ { - "workerIndex": 7, - "parallelIndex": 0, - "status": "passed", - "duration": 12464, - "errors": [], - "stdout": [ - { - "text": "๐Ÿงช [AUTH-FLOW] Step 4: Test automatic token refresh\n" - }, - { - "text": "๐Ÿ” [LOGIN] Attempting authentication as e2e@test.com...\n" - }, - { - "text": "โณ [LOGIN] Waiting 500ms before login (1766857231030ms since last login)...\n" - }, - { - "text": "โœ๏ธ [LOGIN] User not authenticated, proceeding with login form...\n" - }, - { - "text": "โšก [FORM SUBMIT] Forcing submission of form: form\n" - }, - { - "text": "๐Ÿ” [FORM SUBMIT] Waiting for form selector: form\n" - }, - { - "text": "โณ [FORM SUBMIT] Waiting for React to update state...\n" - }, - { - "text": "๐Ÿš€ [FORM SUBMIT] Submitting form...\n" - }, - { - "text": "โœ… [FORM SUBMIT] Form form submitted successfully\n" - }, - { - "text": "โณ [LOGIN] Waiting for networkidle after navigation...\n" - }, - { - "text": "โณ [LOGIN] Waiting for auth state to be persisted...\n" - }, - { - "text": "๐Ÿ” [LOGIN] Verifying authentication state...\n" - }, - { - "text": " โœ… TOKEN FOUND: eyJhbGciOiJIUzI1NiIsInR5cCI6Ik... (source: storage)\n" - }, - { - "text": "โœ… [LOGIN] Successfully authenticated as e2e@test.com (token: eyJhbGciOiJIUzI1NiIs...)\n" - }, - { - "text": " โœ… TOKEN FOUND: eyJhbGciOiJIUzI1NiIsInR5cCI6Ik... (source: storage)\n" - }, - { - "text": " โœ… TOKEN FOUND: eyJhbGciOiJIUzI1NiIsInR5cCI6Ik... (source: storage)\n" - }, - { - "text": "โš ๏ธ [AUTH-FLOW] Token refresh not triggered (may not be expiring soon)\n" - }, - { - "text": "\n๐Ÿ“Š [AUTH-FLOW] === Final Verifications ===\n" - }, - { - "text": "โœ… [AUTH-FLOW] No console errors\n" - }, - { - "text": "โœ… [AUTH-FLOW] No network errors\n" - } - ], - "stderr": [ - { - "text": "โš ๏ธ [LOGIN] Form not visible and not on dashboard. Proceeding (might fail)...\n" - } - ], - "retry": 0, - "startTime": "2025-12-27T17:40:30.880Z", + "timeout": 60000, "annotations": [], - "attachments": [ + "expectedStatus": "passed", + "projectId": "chromium", + "projectName": "chromium", + "results": [ { - "name": "trace", - "contentType": "application/zip", - "path": "/home/senke/git/talas/veza/apps/web/test-results/auth-flow-Complete-Auth-Fl-349ea-sh-token-when-expiring-soon-chromium/trace.zip" + "workerIndex": 2, + "parallelIndex": 0, + "status": "timedOut", + "duration": 61808, + "error": { + "message": "\u001b[31mTest timeout of 60000ms exceeded while running \"beforeEach\" hook.\u001b[39m", + "stack": "\u001b[31mTest timeout of 60000ms exceeded while running \"beforeEach\" hook.\u001b[39m\n at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:439:10", + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 10, + "line": 439 + }, + "snippet": "\u001b[0m \u001b[90m 437 |\u001b[39m test\u001b[33m.\u001b[39mdescribe(\u001b[32m'3. Tracks Management'\u001b[39m\u001b[33m,\u001b[39m () \u001b[33m=>\u001b[39m {\n \u001b[90m 438 |\u001b[39m \n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 439 |\u001b[39m test\u001b[33m.\u001b[39mbeforeEach(\u001b[36masync\u001b[39m ({ page }) \u001b[33m=>\u001b[39m {\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 440 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mgoto(\u001b[32m`${TEST_CONFIG.FRONTEND_URL}/login`\u001b[39m)\u001b[33m;\u001b[39m\n \u001b[90m 441 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"email\"], input[name=\"email\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39memail)\u001b[33m;\u001b[39m\n \u001b[90m 442 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"password\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39mpassword)\u001b[33m;\u001b[39m\u001b[0m" + }, + "errors": [ + { + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 10, + "line": 439 + }, + "message": "\u001b[31mTest timeout of 60000ms exceeded while running \"beforeEach\" hook.\u001b[39m\n\n\u001b[0m \u001b[90m 437 |\u001b[39m test\u001b[33m.\u001b[39mdescribe(\u001b[32m'3. Tracks Management'\u001b[39m\u001b[33m,\u001b[39m () \u001b[33m=>\u001b[39m {\n \u001b[90m 438 |\u001b[39m \n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 439 |\u001b[39m test\u001b[33m.\u001b[39mbeforeEach(\u001b[36masync\u001b[39m ({ page }) \u001b[33m=>\u001b[39m {\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 440 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mgoto(\u001b[32m`${TEST_CONFIG.FRONTEND_URL}/login`\u001b[39m)\u001b[33m;\u001b[39m\n \u001b[90m 441 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"email\"], input[name=\"email\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39memail)\u001b[33m;\u001b[39m\n \u001b[90m 442 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"password\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39mpassword)\u001b[33m;\u001b[39m\u001b[0m\n\u001b[2m at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:439:10\u001b[22m" + }, + { + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 18, + "line": 441 + }, + "message": "Error: page.fill: Test timeout of 60000ms exceeded.\nCall log:\n\u001b[2m - waiting for locator('input[type=\"email\"], input[name=\"email\"]')\u001b[22m\n\n\n\u001b[0m \u001b[90m 439 |\u001b[39m test\u001b[33m.\u001b[39mbeforeEach(\u001b[36masync\u001b[39m ({ page }) \u001b[33m=>\u001b[39m {\n \u001b[90m 440 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mgoto(\u001b[32m`${TEST_CONFIG.FRONTEND_URL}/login`\u001b[39m)\u001b[33m;\u001b[39m\n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 441 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"email\"], input[name=\"email\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39memail)\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 442 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"password\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39mpassword)\u001b[33m;\u001b[39m\n \u001b[90m 443 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mclick(\u001b[32m'button[type=\"submit\"]'\u001b[39m)\u001b[33m;\u001b[39m\n \u001b[90m 444 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mwaitForURL(\u001b[35m/\\/(dashboard|home|app)/\u001b[39m\u001b[33m,\u001b[39m { timeout\u001b[33m:\u001b[39m \u001b[35m15000\u001b[39m })\u001b[33m;\u001b[39m\u001b[0m\n\u001b[2m at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:441:18\u001b[22m" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:20:25.924Z", + "annotations": [], + "attachments": [ + { + "name": "screenshot", + "contentType": "image/png", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-e5cde-ent-3-1---Tracks-page-loads-chromium/test-failed-1.png" + }, + { + "name": "video", + "contentType": "video/webm", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-e5cde-ent-3-1---Tracks-page-loads-chromium/video.webm" + }, + { + "name": "error-context", + "contentType": "text/markdown", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-e5cde-ent-3-1---Tracks-page-loads-chromium/error-context.md" + } + ], + "errorLocation": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 10, + "line": 439 + } } - ] + ], + "status": "unexpected" } ], - "status": "expected" + "id": "c50e3d8c82f89a880019-cf119e5245e80b82032c", + "file": "mvp-integration.spec.ts", + "line": 447, + "column": 5 + }, + { + "title": "3.2 - Upload track button exists", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "chromium", + "projectName": "chromium", + "results": [ + { + "workerIndex": 3, + "parallelIndex": 0, + "status": "timedOut", + "duration": 61642, + "error": { + "message": "\u001b[31mTest timeout of 60000ms exceeded while running \"beforeEach\" hook.\u001b[39m", + "stack": "\u001b[31mTest timeout of 60000ms exceeded while running \"beforeEach\" hook.\u001b[39m\n at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:439:10", + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 10, + "line": 439 + }, + "snippet": "\u001b[0m \u001b[90m 437 |\u001b[39m test\u001b[33m.\u001b[39mdescribe(\u001b[32m'3. Tracks Management'\u001b[39m\u001b[33m,\u001b[39m () \u001b[33m=>\u001b[39m {\n \u001b[90m 438 |\u001b[39m \n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 439 |\u001b[39m test\u001b[33m.\u001b[39mbeforeEach(\u001b[36masync\u001b[39m ({ page }) \u001b[33m=>\u001b[39m {\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 440 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mgoto(\u001b[32m`${TEST_CONFIG.FRONTEND_URL}/login`\u001b[39m)\u001b[33m;\u001b[39m\n \u001b[90m 441 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"email\"], input[name=\"email\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39memail)\u001b[33m;\u001b[39m\n \u001b[90m 442 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"password\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39mpassword)\u001b[33m;\u001b[39m\u001b[0m" + }, + "errors": [ + { + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 10, + "line": 439 + }, + "message": "\u001b[31mTest timeout of 60000ms exceeded while running \"beforeEach\" hook.\u001b[39m\n\n\u001b[0m \u001b[90m 437 |\u001b[39m test\u001b[33m.\u001b[39mdescribe(\u001b[32m'3. Tracks Management'\u001b[39m\u001b[33m,\u001b[39m () \u001b[33m=>\u001b[39m {\n \u001b[90m 438 |\u001b[39m \n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 439 |\u001b[39m test\u001b[33m.\u001b[39mbeforeEach(\u001b[36masync\u001b[39m ({ page }) \u001b[33m=>\u001b[39m {\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 440 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mgoto(\u001b[32m`${TEST_CONFIG.FRONTEND_URL}/login`\u001b[39m)\u001b[33m;\u001b[39m\n \u001b[90m 441 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"email\"], input[name=\"email\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39memail)\u001b[33m;\u001b[39m\n \u001b[90m 442 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"password\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39mpassword)\u001b[33m;\u001b[39m\u001b[0m\n\u001b[2m at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:439:10\u001b[22m" + }, + { + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 18, + "line": 441 + }, + "message": "Error: page.fill: Test timeout of 60000ms exceeded.\nCall log:\n\u001b[2m - waiting for locator('input[type=\"email\"], input[name=\"email\"]')\u001b[22m\n\n\n\u001b[0m \u001b[90m 439 |\u001b[39m test\u001b[33m.\u001b[39mbeforeEach(\u001b[36masync\u001b[39m ({ page }) \u001b[33m=>\u001b[39m {\n \u001b[90m 440 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mgoto(\u001b[32m`${TEST_CONFIG.FRONTEND_URL}/login`\u001b[39m)\u001b[33m;\u001b[39m\n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 441 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"email\"], input[name=\"email\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39memail)\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 442 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"password\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39mpassword)\u001b[33m;\u001b[39m\n \u001b[90m 443 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mclick(\u001b[32m'button[type=\"submit\"]'\u001b[39m)\u001b[33m;\u001b[39m\n \u001b[90m 444 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mwaitForURL(\u001b[35m/\\/(dashboard|home|app)/\u001b[39m\u001b[33m,\u001b[39m { timeout\u001b[33m:\u001b[39m \u001b[35m15000\u001b[39m })\u001b[33m;\u001b[39m\u001b[0m\n\u001b[2m at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:441:18\u001b[22m" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:21:28.519Z", + "annotations": [], + "attachments": [ + { + "name": "screenshot", + "contentType": "image/png", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-4a867--Upload-track-button-exists-chromium/test-failed-1.png" + }, + { + "name": "video", + "contentType": "video/webm", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-4a867--Upload-track-button-exists-chromium/video.webm" + }, + { + "name": "error-context", + "contentType": "text/markdown", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-4a867--Upload-track-button-exists-chromium/error-context.md" + } + ], + "errorLocation": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 10, + "line": 439 + } + } + ], + "status": "unexpected" + } + ], + "id": "c50e3d8c82f89a880019-79a9764b76ef6081d40e", + "file": "mvp-integration.spec.ts", + "line": 456, + "column": 5 + }, + { + "title": "3.1 - Tracks page loads", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "firefox", + "projectName": "firefox", + "results": [ + { + "workerIndex": 17, + "parallelIndex": 0, + "status": "timedOut", + "duration": 60092, + "error": { + "message": "\u001b[31mTest timeout of 60000ms exceeded while running \"beforeEach\" hook.\u001b[39m", + "stack": "\u001b[31mTest timeout of 60000ms exceeded while running \"beforeEach\" hook.\u001b[39m\n at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:439:10", + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 10, + "line": 439 + }, + "snippet": "\u001b[0m \u001b[90m 437 |\u001b[39m test\u001b[33m.\u001b[39mdescribe(\u001b[32m'3. Tracks Management'\u001b[39m\u001b[33m,\u001b[39m () \u001b[33m=>\u001b[39m {\n \u001b[90m 438 |\u001b[39m \n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 439 |\u001b[39m test\u001b[33m.\u001b[39mbeforeEach(\u001b[36masync\u001b[39m ({ page }) \u001b[33m=>\u001b[39m {\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 440 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mgoto(\u001b[32m`${TEST_CONFIG.FRONTEND_URL}/login`\u001b[39m)\u001b[33m;\u001b[39m\n \u001b[90m 441 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"email\"], input[name=\"email\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39memail)\u001b[33m;\u001b[39m\n \u001b[90m 442 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"password\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39mpassword)\u001b[33m;\u001b[39m\u001b[0m" + }, + "errors": [ + { + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 10, + "line": 439 + }, + "message": "\u001b[31mTest timeout of 60000ms exceeded while running \"beforeEach\" hook.\u001b[39m\n\n\u001b[0m \u001b[90m 437 |\u001b[39m test\u001b[33m.\u001b[39mdescribe(\u001b[32m'3. Tracks Management'\u001b[39m\u001b[33m,\u001b[39m () \u001b[33m=>\u001b[39m {\n \u001b[90m 438 |\u001b[39m \n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 439 |\u001b[39m test\u001b[33m.\u001b[39mbeforeEach(\u001b[36masync\u001b[39m ({ page }) \u001b[33m=>\u001b[39m {\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 440 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mgoto(\u001b[32m`${TEST_CONFIG.FRONTEND_URL}/login`\u001b[39m)\u001b[33m;\u001b[39m\n \u001b[90m 441 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"email\"], input[name=\"email\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39memail)\u001b[33m;\u001b[39m\n \u001b[90m 442 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"password\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39mpassword)\u001b[33m;\u001b[39m\u001b[0m\n\u001b[2m at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:439:10\u001b[22m" + }, + { + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 18, + "line": 441 + }, + "message": "Error: page.fill: Test timeout of 60000ms exceeded.\nCall log:\n\u001b[2m - waiting for locator('input[type=\"email\"], input[name=\"email\"]')\u001b[22m\n\n\n\u001b[0m \u001b[90m 439 |\u001b[39m test\u001b[33m.\u001b[39mbeforeEach(\u001b[36masync\u001b[39m ({ page }) \u001b[33m=>\u001b[39m {\n \u001b[90m 440 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mgoto(\u001b[32m`${TEST_CONFIG.FRONTEND_URL}/login`\u001b[39m)\u001b[33m;\u001b[39m\n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 441 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"email\"], input[name=\"email\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39memail)\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 442 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"password\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39mpassword)\u001b[33m;\u001b[39m\n \u001b[90m 443 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mclick(\u001b[32m'button[type=\"submit\"]'\u001b[39m)\u001b[33m;\u001b[39m\n \u001b[90m 444 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mwaitForURL(\u001b[35m/\\/(dashboard|home|app)/\u001b[39m\u001b[33m,\u001b[39m { timeout\u001b[33m:\u001b[39m \u001b[35m15000\u001b[39m })\u001b[33m;\u001b[39m\u001b[0m\n\u001b[2m at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:441:18\u001b[22m" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:32:06.330Z", + "annotations": [], + "attachments": [ + { + "name": "screenshot", + "contentType": "image/png", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-e5cde-ent-3-1---Tracks-page-loads-firefox/test-failed-1.png" + }, + { + "name": "video", + "contentType": "video/webm", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-e5cde-ent-3-1---Tracks-page-loads-firefox/video.webm" + }, + { + "name": "error-context", + "contentType": "text/markdown", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-e5cde-ent-3-1---Tracks-page-loads-firefox/error-context.md" + } + ], + "errorLocation": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 10, + "line": 439 + } + } + ], + "status": "unexpected" + } + ], + "id": "c50e3d8c82f89a880019-4729c0ac91d3d0730bdc", + "file": "mvp-integration.spec.ts", + "line": 447, + "column": 5 + }, + { + "title": "3.2 - Upload track button exists", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "firefox", + "projectName": "firefox", + "results": [ + { + "workerIndex": 18, + "parallelIndex": 0, + "status": "failed", + "duration": 3468, + "error": { + "message": "Error: page.waitForURL: NS_ERROR_FAILURE\n=========================== logs ===========================\nwaiting for navigation until \"load\"\n============================================================", + "stack": "Error: page.waitForURL: NS_ERROR_FAILURE\n=========================== logs ===========================\nwaiting for navigation until \"load\"\n============================================================\n at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:444:18", + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 18, + "line": 444 + }, + "snippet": "\u001b[0m \u001b[90m 442 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"password\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39mpassword)\u001b[33m;\u001b[39m\n \u001b[90m 443 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mclick(\u001b[32m'button[type=\"submit\"]'\u001b[39m)\u001b[33m;\u001b[39m\n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 444 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mwaitForURL(\u001b[35m/\\/(dashboard|home|app)/\u001b[39m\u001b[33m,\u001b[39m { timeout\u001b[33m:\u001b[39m \u001b[35m15000\u001b[39m })\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 445 |\u001b[39m })\u001b[33m;\u001b[39m\n \u001b[90m 446 |\u001b[39m\n \u001b[90m 447 |\u001b[39m test(\u001b[32m'3.1 - Tracks page loads'\u001b[39m\u001b[33m,\u001b[39m \u001b[36masync\u001b[39m ({ page }) \u001b[33m=>\u001b[39m {\u001b[0m" + }, + "errors": [ + { + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 18, + "line": 444 + }, + "message": "Error: page.waitForURL: NS_ERROR_FAILURE\n=========================== logs ===========================\nwaiting for navigation until \"load\"\n============================================================\n\n\u001b[0m \u001b[90m 442 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"password\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39mpassword)\u001b[33m;\u001b[39m\n \u001b[90m 443 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mclick(\u001b[32m'button[type=\"submit\"]'\u001b[39m)\u001b[33m;\u001b[39m\n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 444 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mwaitForURL(\u001b[35m/\\/(dashboard|home|app)/\u001b[39m\u001b[33m,\u001b[39m { timeout\u001b[33m:\u001b[39m \u001b[35m15000\u001b[39m })\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 445 |\u001b[39m })\u001b[33m;\u001b[39m\n \u001b[90m 446 |\u001b[39m\n \u001b[90m 447 |\u001b[39m test(\u001b[32m'3.1 - Tracks page loads'\u001b[39m\u001b[33m,\u001b[39m \u001b[36masync\u001b[39m ({ page }) \u001b[33m=>\u001b[39m {\u001b[0m\n\u001b[2m at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:444:18\u001b[22m" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:33:07.711Z", + "annotations": [], + "attachments": [ + { + "name": "screenshot", + "contentType": "image/png", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-4a867--Upload-track-button-exists-firefox/test-failed-1.png" + }, + { + "name": "video", + "contentType": "video/webm", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-4a867--Upload-track-button-exists-firefox/video.webm" + }, + { + "name": "error-context", + "contentType": "text/markdown", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-4a867--Upload-track-button-exists-firefox/error-context.md" + } + ], + "errorLocation": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 18, + "line": 444 + } + } + ], + "status": "unexpected" + } + ], + "id": "c50e3d8c82f89a880019-2d872de8ba5405d124f2", + "file": "mvp-integration.spec.ts", + "line": 456, + "column": 5 + }, + { + "title": "3.1 - Tracks page loads", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "webkit", + "projectName": "webkit", + "results": [ + { + "workerIndex": 38, + "parallelIndex": 0, + "status": "failed", + "duration": 2, + "error": { + "message": "Error: browserType.launch: \nโ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—\nโ•‘ Host system is missing dependencies to run browsers. โ•‘\nโ•‘ Please install them with the following command: โ•‘\nโ•‘ โ•‘\nโ•‘ sudo npx playwright install-deps โ•‘\nโ•‘ โ•‘\nโ•‘ Alternatively, use apt: โ•‘\nโ•‘ sudo apt-get install libicu74\\ โ•‘\nโ•‘ libjpeg-turbo8\\ โ•‘\nโ•‘ gstreamer1.0-libav โ•‘\nโ•‘ โ•‘\nโ•‘ <3 Playwright Team โ•‘\nโ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•", + "stack": "Error: browserType.launch: \nโ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—\nโ•‘ Host system is missing dependencies to run browsers. โ•‘\nโ•‘ Please install them with the following command: โ•‘\nโ•‘ โ•‘\nโ•‘ sudo npx playwright install-deps โ•‘\nโ•‘ โ•‘\nโ•‘ Alternatively, use apt: โ•‘\nโ•‘ sudo apt-get install libicu74\\ โ•‘\nโ•‘ libjpeg-turbo8\\ โ•‘\nโ•‘ gstreamer1.0-libav โ•‘\nโ•‘ โ•‘\nโ•‘ <3 Playwright Team โ•‘\nโ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•" + }, + "errors": [ + { + "message": "Error: browserType.launch: \nโ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—\nโ•‘ Host system is missing dependencies to run browsers. โ•‘\nโ•‘ Please install them with the following command: โ•‘\nโ•‘ โ•‘\nโ•‘ sudo npx playwright install-deps โ•‘\nโ•‘ โ•‘\nโ•‘ Alternatively, use apt: โ•‘\nโ•‘ sudo apt-get install libicu74\\ โ•‘\nโ•‘ libjpeg-turbo8\\ โ•‘\nโ•‘ gstreamer1.0-libav โ•‘\nโ•‘ โ•‘\nโ•‘ <3 Playwright Team โ•‘\nโ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:35:02.271Z", + "annotations": [], + "attachments": [] + } + ], + "status": "unexpected" + } + ], + "id": "c50e3d8c82f89a880019-8064dca9c6f4a1c37a7e", + "file": "mvp-integration.spec.ts", + "line": 447, + "column": 5 + }, + { + "title": "3.2 - Upload track button exists", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "webkit", + "projectName": "webkit", + "results": [ + { + "workerIndex": 39, + "parallelIndex": 0, + "status": "failed", + "duration": 3, + "error": { + "message": "Error: browserType.launch: \nโ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—\nโ•‘ Host system is missing dependencies to run browsers. โ•‘\nโ•‘ Please install them with the following command: โ•‘\nโ•‘ โ•‘\nโ•‘ sudo npx playwright install-deps โ•‘\nโ•‘ โ•‘\nโ•‘ Alternatively, use apt: โ•‘\nโ•‘ sudo apt-get install libicu74\\ โ•‘\nโ•‘ libjpeg-turbo8\\ โ•‘\nโ•‘ gstreamer1.0-libav โ•‘\nโ•‘ โ•‘\nโ•‘ <3 Playwright Team โ•‘\nโ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•", + "stack": "Error: browserType.launch: \nโ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—\nโ•‘ Host system is missing dependencies to run browsers. โ•‘\nโ•‘ Please install them with the following command: โ•‘\nโ•‘ โ•‘\nโ•‘ sudo npx playwright install-deps โ•‘\nโ•‘ โ•‘\nโ•‘ Alternatively, use apt: โ•‘\nโ•‘ sudo apt-get install libicu74\\ โ•‘\nโ•‘ libjpeg-turbo8\\ โ•‘\nโ•‘ gstreamer1.0-libav โ•‘\nโ•‘ โ•‘\nโ•‘ <3 Playwright Team โ•‘\nโ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•" + }, + "errors": [ + { + "message": "Error: browserType.launch: \nโ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—\nโ•‘ Host system is missing dependencies to run browsers. โ•‘\nโ•‘ Please install them with the following command: โ•‘\nโ•‘ โ•‘\nโ•‘ sudo npx playwright install-deps โ•‘\nโ•‘ โ•‘\nโ•‘ Alternatively, use apt: โ•‘\nโ•‘ sudo apt-get install libicu74\\ โ•‘\nโ•‘ libjpeg-turbo8\\ โ•‘\nโ•‘ gstreamer1.0-libav โ•‘\nโ•‘ โ•‘\nโ•‘ <3 Playwright Team โ•‘\nโ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:35:02.989Z", + "annotations": [], + "attachments": [] + } + ], + "status": "unexpected" + } + ], + "id": "c50e3d8c82f89a880019-7c650d1363e839d59f49", + "file": "mvp-integration.spec.ts", + "line": 456, + "column": 5 + }, + { + "title": "3.1 - Tracks page loads", + "ok": true, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "msedge", + "projectName": "msedge", + "results": [ + { + "workerIndex": 52, + "parallelIndex": 0, + "status": "passed", + "duration": 1788, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:35:22.825Z", + "annotations": [], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "c50e3d8c82f89a880019-8fe529064069235e399b", + "file": "mvp-integration.spec.ts", + "line": 447, + "column": 5 + }, + { + "title": "3.2 - Upload track button exists", + "ok": true, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "msedge", + "projectName": "msedge", + "results": [ + { + "workerIndex": 52, + "parallelIndex": 0, + "status": "passed", + "duration": 1136, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:35:24.625Z", + "annotations": [], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "c50e3d8c82f89a880019-f4ae9be6e62f6d783905", + "file": "mvp-integration.spec.ts", + "line": 456, + "column": 5 } - ], - "id": "df6b40174562c70df515-6d199b26807fa07b89e0", - "file": "auth-flow.spec.ts", - "line": 273, - "column": 3 + ] }, { - "title": "should logout successfully and redirect to login", - "ok": true, - "tags": [], - "tests": [ + "title": "4. Playlists Management", + "file": "mvp-integration.spec.ts", + "line": 464, + "column": 8, + "specs": [ { - "timeout": 60000, - "annotations": [], - "expectedStatus": "passed", - "projectId": "chromium", - "projectName": "chromium", - "results": [ + "title": "4.1 - Playlists page loads", + "ok": false, + "tags": [], + "tests": [ { - "workerIndex": 7, - "parallelIndex": 0, - "status": "passed", - "duration": 7890, - "errors": [], - "stdout": [ - { - "text": "๐Ÿงช [AUTH-FLOW] Step 5: Logout and redirect\n" - }, - { - "text": "๐Ÿ” [LOGIN] Attempting authentication as e2e@test.com...\n" - }, - { - "text": "โณ [LOGIN] Waiting 500ms before login (12185ms since last login)...\n" - }, - { - "text": "โœ๏ธ [LOGIN] User not authenticated, proceeding with login form...\n" - }, - { - "text": "โšก [FORM SUBMIT] Forcing submission of form: form\n" - }, - { - "text": "๐Ÿ” [FORM SUBMIT] Waiting for form selector: form\n" - }, - { - "text": "โณ [FORM SUBMIT] Waiting for React to update state...\n" - }, - { - "text": "๐Ÿš€ [FORM SUBMIT] Submitting form...\n" - }, - { - "text": "โœ… [FORM SUBMIT] Form form submitted successfully\n" - }, - { - "text": "โณ [LOGIN] Waiting for networkidle after navigation...\n" - }, - { - "text": "โณ [LOGIN] Waiting for auth state to be persisted...\n" - }, - { - "text": "๐Ÿ” [LOGIN] Verifying authentication state...\n" - }, - { - "text": " โœ… TOKEN FOUND: eyJhbGciOiJIUzI1NiIsInR5cCI6Ik... (source: storage)\n" - }, - { - "text": "โœ… [LOGIN] Successfully authenticated as e2e@test.com (token: eyJhbGciOiJIUzI1NiIs...)\n" - }, - { - "text": " โœ… TOKEN FOUND: eyJhbGciOiJIUzI1NiIsInR5cCI6Ik... (source: storage)\n" - }, - { - "text": "๐Ÿ”ด [NETWORK ERROR] POST http://127.0.0.1:8080/api/v1/auth/logout: 400\n" - }, - { - "text": "๐Ÿ”ด [CONSOLE ERROR] Failed to load resource: the server responded with a status of 400 (Bad Request)\n" - }, - { - "text": "โœ… [AUTH-FLOW] Logout successful, redirected to login\n" - }, - { - "text": "\n๐Ÿ“Š [AUTH-FLOW] === Final Verifications ===\n" - }, - { - "text": "๐Ÿ”ด [AUTH-FLOW] Console errors (1):\n" - }, - { - "text": " - Failed to load resource: the server responded with a status of 400 (Bad Request)\n" - }, - { - "text": "๐Ÿ”ด [AUTH-FLOW] Network errors (1):\n" - }, - { - "text": " - POST http://127.0.0.1:8080/api/v1/auth/logout: 400\n" - } - ], - "stderr": [ - { - "text": "โš ๏ธ [LOGIN] Form not visible and not on dashboard. Proceeding (might fail)...\n" - }, - { - "text": "โš ๏ธ [AUTH-FLOW] Test passed but had console errors\n" - } - ], - "retry": 0, - "startTime": "2025-12-27T17:40:43.681Z", + "timeout": 60000, "annotations": [], - "attachments": [ + "expectedStatus": "passed", + "projectId": "chromium", + "projectName": "chromium", + "results": [ { - "name": "trace", - "contentType": "application/zip", - "path": "/home/senke/git/talas/veza/apps/web/test-results/auth-flow-Complete-Auth-Fl-14a19-fully-and-redirect-to-login-chromium/trace.zip" + "workerIndex": 4, + "parallelIndex": 0, + "status": "timedOut", + "duration": 61861, + "error": { + "message": "\u001b[31mTest timeout of 60000ms exceeded while running \"beforeEach\" hook.\u001b[39m", + "stack": "\u001b[31mTest timeout of 60000ms exceeded while running \"beforeEach\" hook.\u001b[39m\n at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:466:10", + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 10, + "line": 466 + }, + "snippet": "\u001b[0m \u001b[90m 464 |\u001b[39m test\u001b[33m.\u001b[39mdescribe(\u001b[32m'4. Playlists Management'\u001b[39m\u001b[33m,\u001b[39m () \u001b[33m=>\u001b[39m {\n \u001b[90m 465 |\u001b[39m \n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 466 |\u001b[39m test\u001b[33m.\u001b[39mbeforeEach(\u001b[36masync\u001b[39m ({ page }) \u001b[33m=>\u001b[39m {\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 467 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mgoto(\u001b[32m`${TEST_CONFIG.FRONTEND_URL}/login`\u001b[39m)\u001b[33m;\u001b[39m\n \u001b[90m 468 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"email\"], input[name=\"email\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39memail)\u001b[33m;\u001b[39m\n \u001b[90m 469 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"password\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39mpassword)\u001b[33m;\u001b[39m\u001b[0m" + }, + "errors": [ + { + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 10, + "line": 466 + }, + "message": "\u001b[31mTest timeout of 60000ms exceeded while running \"beforeEach\" hook.\u001b[39m\n\n\u001b[0m \u001b[90m 464 |\u001b[39m test\u001b[33m.\u001b[39mdescribe(\u001b[32m'4. Playlists Management'\u001b[39m\u001b[33m,\u001b[39m () \u001b[33m=>\u001b[39m {\n \u001b[90m 465 |\u001b[39m \n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 466 |\u001b[39m test\u001b[33m.\u001b[39mbeforeEach(\u001b[36masync\u001b[39m ({ page }) \u001b[33m=>\u001b[39m {\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 467 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mgoto(\u001b[32m`${TEST_CONFIG.FRONTEND_URL}/login`\u001b[39m)\u001b[33m;\u001b[39m\n \u001b[90m 468 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"email\"], input[name=\"email\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39memail)\u001b[33m;\u001b[39m\n \u001b[90m 469 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"password\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39mpassword)\u001b[33m;\u001b[39m\u001b[0m\n\u001b[2m at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:466:10\u001b[22m" + }, + { + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 18, + "line": 468 + }, + "message": "Error: page.fill: Test timeout of 60000ms exceeded.\nCall log:\n\u001b[2m - waiting for locator('input[type=\"email\"], input[name=\"email\"]')\u001b[22m\n\n\n\u001b[0m \u001b[90m 466 |\u001b[39m test\u001b[33m.\u001b[39mbeforeEach(\u001b[36masync\u001b[39m ({ page }) \u001b[33m=>\u001b[39m {\n \u001b[90m 467 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mgoto(\u001b[32m`${TEST_CONFIG.FRONTEND_URL}/login`\u001b[39m)\u001b[33m;\u001b[39m\n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 468 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"email\"], input[name=\"email\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39memail)\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 469 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"password\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39mpassword)\u001b[33m;\u001b[39m\n \u001b[90m 470 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mclick(\u001b[32m'button[type=\"submit\"]'\u001b[39m)\u001b[33m;\u001b[39m\n \u001b[90m 471 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mwaitForURL(\u001b[35m/\\/(dashboard|home|app)/\u001b[39m\u001b[33m,\u001b[39m { timeout\u001b[33m:\u001b[39m \u001b[35m15000\u001b[39m })\u001b[33m;\u001b[39m\u001b[0m\n\u001b[2m at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:468:18\u001b[22m" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:22:30.887Z", + "annotations": [], + "attachments": [ + { + "name": "screenshot", + "contentType": "image/png", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-9c1ae--4-1---Playlists-page-loads-chromium/test-failed-1.png" + }, + { + "name": "video", + "contentType": "video/webm", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-9c1ae--4-1---Playlists-page-loads-chromium/video.webm" + }, + { + "name": "error-context", + "contentType": "text/markdown", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-9c1ae--4-1---Playlists-page-loads-chromium/error-context.md" + } + ], + "errorLocation": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 10, + "line": 466 + } } - ] + ], + "status": "unexpected" } ], - "status": "expected" + "id": "c50e3d8c82f89a880019-bae20f1fec0663fb4e90", + "file": "mvp-integration.spec.ts", + "line": 474, + "column": 5 + }, + { + "title": "4.2 - Can create playlist", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "chromium", + "projectName": "chromium", + "results": [ + { + "workerIndex": 5, + "parallelIndex": 0, + "status": "timedOut", + "duration": 61675, + "error": { + "message": "\u001b[31mTest timeout of 60000ms exceeded while running \"beforeEach\" hook.\u001b[39m", + "stack": "\u001b[31mTest timeout of 60000ms exceeded while running \"beforeEach\" hook.\u001b[39m\n at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:466:10", + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 10, + "line": 466 + }, + "snippet": "\u001b[0m \u001b[90m 464 |\u001b[39m test\u001b[33m.\u001b[39mdescribe(\u001b[32m'4. Playlists Management'\u001b[39m\u001b[33m,\u001b[39m () \u001b[33m=>\u001b[39m {\n \u001b[90m 465 |\u001b[39m \n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 466 |\u001b[39m test\u001b[33m.\u001b[39mbeforeEach(\u001b[36masync\u001b[39m ({ page }) \u001b[33m=>\u001b[39m {\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 467 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mgoto(\u001b[32m`${TEST_CONFIG.FRONTEND_URL}/login`\u001b[39m)\u001b[33m;\u001b[39m\n \u001b[90m 468 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"email\"], input[name=\"email\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39memail)\u001b[33m;\u001b[39m\n \u001b[90m 469 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"password\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39mpassword)\u001b[33m;\u001b[39m\u001b[0m" + }, + "errors": [ + { + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 10, + "line": 466 + }, + "message": "\u001b[31mTest timeout of 60000ms exceeded while running \"beforeEach\" hook.\u001b[39m\n\n\u001b[0m \u001b[90m 464 |\u001b[39m test\u001b[33m.\u001b[39mdescribe(\u001b[32m'4. Playlists Management'\u001b[39m\u001b[33m,\u001b[39m () \u001b[33m=>\u001b[39m {\n \u001b[90m 465 |\u001b[39m \n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 466 |\u001b[39m test\u001b[33m.\u001b[39mbeforeEach(\u001b[36masync\u001b[39m ({ page }) \u001b[33m=>\u001b[39m {\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 467 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mgoto(\u001b[32m`${TEST_CONFIG.FRONTEND_URL}/login`\u001b[39m)\u001b[33m;\u001b[39m\n \u001b[90m 468 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"email\"], input[name=\"email\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39memail)\u001b[33m;\u001b[39m\n \u001b[90m 469 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"password\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39mpassword)\u001b[33m;\u001b[39m\u001b[0m\n\u001b[2m at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:466:10\u001b[22m" + }, + { + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 18, + "line": 468 + }, + "message": "Error: page.fill: Test timeout of 60000ms exceeded.\nCall log:\n\u001b[2m - waiting for locator('input[type=\"email\"], input[name=\"email\"]')\u001b[22m\n\n\n\u001b[0m \u001b[90m 466 |\u001b[39m test\u001b[33m.\u001b[39mbeforeEach(\u001b[36masync\u001b[39m ({ page }) \u001b[33m=>\u001b[39m {\n \u001b[90m 467 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mgoto(\u001b[32m`${TEST_CONFIG.FRONTEND_URL}/login`\u001b[39m)\u001b[33m;\u001b[39m\n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 468 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"email\"], input[name=\"email\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39memail)\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 469 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"password\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39mpassword)\u001b[33m;\u001b[39m\n \u001b[90m 470 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mclick(\u001b[32m'button[type=\"submit\"]'\u001b[39m)\u001b[33m;\u001b[39m\n \u001b[90m 471 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mwaitForURL(\u001b[35m/\\/(dashboard|home|app)/\u001b[39m\u001b[33m,\u001b[39m { timeout\u001b[33m:\u001b[39m \u001b[35m15000\u001b[39m })\u001b[33m;\u001b[39m\u001b[0m\n\u001b[2m at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:468:18\u001b[22m" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:23:33.399Z", + "annotations": [], + "attachments": [ + { + "name": "screenshot", + "contentType": "image/png", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-78e7e-t-4-2---Can-create-playlist-chromium/test-failed-1.png" + }, + { + "name": "video", + "contentType": "video/webm", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-78e7e-t-4-2---Can-create-playlist-chromium/video.webm" + }, + { + "name": "error-context", + "contentType": "text/markdown", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-78e7e-t-4-2---Can-create-playlist-chromium/error-context.md" + } + ], + "errorLocation": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 10, + "line": 466 + } + } + ], + "status": "unexpected" + } + ], + "id": "c50e3d8c82f89a880019-2591999106c62064a288", + "file": "mvp-integration.spec.ts", + "line": 479, + "column": 5 + }, + { + "title": "4.1 - Playlists page loads", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "firefox", + "projectName": "firefox", + "results": [ + { + "workerIndex": 19, + "parallelIndex": 0, + "status": "failed", + "duration": 16628, + "error": { + "message": "TimeoutError: page.waitForURL: Timeout 15000ms exceeded.\n=========================== logs ===========================\nwaiting for navigation until \"load\"\n navigated to \"http://localhost:5173/login\"\n navigated to \"http://localhost:5173/login\"\n============================================================", + "stack": "TimeoutError: page.waitForURL: Timeout 15000ms exceeded.\n=========================== logs ===========================\nwaiting for navigation until \"load\"\n navigated to \"http://localhost:5173/login\"\n navigated to \"http://localhost:5173/login\"\n============================================================\n at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:471:18", + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 18, + "line": 471 + }, + "snippet": "\u001b[0m \u001b[90m 469 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"password\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39mpassword)\u001b[33m;\u001b[39m\n \u001b[90m 470 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mclick(\u001b[32m'button[type=\"submit\"]'\u001b[39m)\u001b[33m;\u001b[39m\n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 471 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mwaitForURL(\u001b[35m/\\/(dashboard|home|app)/\u001b[39m\u001b[33m,\u001b[39m { timeout\u001b[33m:\u001b[39m \u001b[35m15000\u001b[39m })\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 472 |\u001b[39m })\u001b[33m;\u001b[39m\n \u001b[90m 473 |\u001b[39m\n \u001b[90m 474 |\u001b[39m test(\u001b[32m'4.1 - Playlists page loads'\u001b[39m\u001b[33m,\u001b[39m \u001b[36masync\u001b[39m ({ page }) \u001b[33m=>\u001b[39m {\u001b[0m" + }, + "errors": [ + { + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 18, + "line": 471 + }, + "message": "TimeoutError: page.waitForURL: Timeout 15000ms exceeded.\n=========================== logs ===========================\nwaiting for navigation until \"load\"\n navigated to \"http://localhost:5173/login\"\n navigated to \"http://localhost:5173/login\"\n============================================================\n\n\u001b[0m \u001b[90m 469 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"password\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39mpassword)\u001b[33m;\u001b[39m\n \u001b[90m 470 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mclick(\u001b[32m'button[type=\"submit\"]'\u001b[39m)\u001b[33m;\u001b[39m\n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 471 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mwaitForURL(\u001b[35m/\\/(dashboard|home|app)/\u001b[39m\u001b[33m,\u001b[39m { timeout\u001b[33m:\u001b[39m \u001b[35m15000\u001b[39m })\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 472 |\u001b[39m })\u001b[33m;\u001b[39m\n \u001b[90m 473 |\u001b[39m\n \u001b[90m 474 |\u001b[39m test(\u001b[32m'4.1 - Playlists page loads'\u001b[39m\u001b[33m,\u001b[39m \u001b[36masync\u001b[39m ({ page }) \u001b[33m=>\u001b[39m {\u001b[0m\n\u001b[2m at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:471:18\u001b[22m" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:33:12.459Z", + "annotations": [], + "attachments": [ + { + "name": "screenshot", + "contentType": "image/png", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-9c1ae--4-1---Playlists-page-loads-firefox/test-failed-1.png" + }, + { + "name": "video", + "contentType": "video/webm", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-9c1ae--4-1---Playlists-page-loads-firefox/video.webm" + }, + { + "name": "error-context", + "contentType": "text/markdown", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-9c1ae--4-1---Playlists-page-loads-firefox/error-context.md" + } + ], + "errorLocation": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 18, + "line": 471 + } + } + ], + "status": "unexpected" + } + ], + "id": "c50e3d8c82f89a880019-0aa518fc93e3e3eee8d0", + "file": "mvp-integration.spec.ts", + "line": 474, + "column": 5 + }, + { + "title": "4.2 - Can create playlist", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "firefox", + "projectName": "firefox", + "results": [ + { + "workerIndex": 20, + "parallelIndex": 0, + "status": "failed", + "duration": 16737, + "error": { + "message": "TimeoutError: page.waitForURL: Timeout 15000ms exceeded.\n=========================== logs ===========================\nwaiting for navigation until \"load\"\n navigated to \"http://localhost:5173/login\"\n navigated to \"http://localhost:5173/login\"\n============================================================", + "stack": "TimeoutError: page.waitForURL: Timeout 15000ms exceeded.\n=========================== logs ===========================\nwaiting for navigation until \"load\"\n navigated to \"http://localhost:5173/login\"\n navigated to \"http://localhost:5173/login\"\n============================================================\n at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:471:18", + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 18, + "line": 471 + }, + "snippet": "\u001b[0m \u001b[90m 469 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"password\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39mpassword)\u001b[33m;\u001b[39m\n \u001b[90m 470 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mclick(\u001b[32m'button[type=\"submit\"]'\u001b[39m)\u001b[33m;\u001b[39m\n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 471 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mwaitForURL(\u001b[35m/\\/(dashboard|home|app)/\u001b[39m\u001b[33m,\u001b[39m { timeout\u001b[33m:\u001b[39m \u001b[35m15000\u001b[39m })\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 472 |\u001b[39m })\u001b[33m;\u001b[39m\n \u001b[90m 473 |\u001b[39m\n \u001b[90m 474 |\u001b[39m test(\u001b[32m'4.1 - Playlists page loads'\u001b[39m\u001b[33m,\u001b[39m \u001b[36masync\u001b[39m ({ page }) \u001b[33m=>\u001b[39m {\u001b[0m" + }, + "errors": [ + { + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 18, + "line": 471 + }, + "message": "TimeoutError: page.waitForURL: Timeout 15000ms exceeded.\n=========================== logs ===========================\nwaiting for navigation until \"load\"\n navigated to \"http://localhost:5173/login\"\n navigated to \"http://localhost:5173/login\"\n============================================================\n\n\u001b[0m \u001b[90m 469 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"password\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39mpassword)\u001b[33m;\u001b[39m\n \u001b[90m 470 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mclick(\u001b[32m'button[type=\"submit\"]'\u001b[39m)\u001b[33m;\u001b[39m\n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 471 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mwaitForURL(\u001b[35m/\\/(dashboard|home|app)/\u001b[39m\u001b[33m,\u001b[39m { timeout\u001b[33m:\u001b[39m \u001b[35m15000\u001b[39m })\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 472 |\u001b[39m })\u001b[33m;\u001b[39m\n \u001b[90m 473 |\u001b[39m\n \u001b[90m 474 |\u001b[39m test(\u001b[32m'4.1 - Playlists page loads'\u001b[39m\u001b[33m,\u001b[39m \u001b[36masync\u001b[39m ({ page }) \u001b[33m=>\u001b[39m {\u001b[0m\n\u001b[2m at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:471:18\u001b[22m" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:33:30.333Z", + "annotations": [], + "attachments": [ + { + "name": "screenshot", + "contentType": "image/png", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-78e7e-t-4-2---Can-create-playlist-firefox/test-failed-1.png" + }, + { + "name": "video", + "contentType": "video/webm", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-78e7e-t-4-2---Can-create-playlist-firefox/video.webm" + }, + { + "name": "error-context", + "contentType": "text/markdown", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-78e7e-t-4-2---Can-create-playlist-firefox/error-context.md" + } + ], + "errorLocation": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 18, + "line": 471 + } + } + ], + "status": "unexpected" + } + ], + "id": "c50e3d8c82f89a880019-342ad3c14e1a09752050", + "file": "mvp-integration.spec.ts", + "line": 479, + "column": 5 + }, + { + "title": "4.1 - Playlists page loads", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "webkit", + "projectName": "webkit", + "results": [ + { + "workerIndex": 40, + "parallelIndex": 0, + "status": "failed", + "duration": 3, + "error": { + "message": "Error: browserType.launch: \nโ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—\nโ•‘ Host system is missing dependencies to run browsers. โ•‘\nโ•‘ Please install them with the following command: โ•‘\nโ•‘ โ•‘\nโ•‘ sudo npx playwright install-deps โ•‘\nโ•‘ โ•‘\nโ•‘ Alternatively, use apt: โ•‘\nโ•‘ sudo apt-get install libicu74\\ โ•‘\nโ•‘ libjpeg-turbo8\\ โ•‘\nโ•‘ gstreamer1.0-libav โ•‘\nโ•‘ โ•‘\nโ•‘ <3 Playwright Team โ•‘\nโ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•", + "stack": "Error: browserType.launch: \nโ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—\nโ•‘ Host system is missing dependencies to run browsers. โ•‘\nโ•‘ Please install them with the following command: โ•‘\nโ•‘ โ•‘\nโ•‘ sudo npx playwright install-deps โ•‘\nโ•‘ โ•‘\nโ•‘ Alternatively, use apt: โ•‘\nโ•‘ sudo apt-get install libicu74\\ โ•‘\nโ•‘ libjpeg-turbo8\\ โ•‘\nโ•‘ gstreamer1.0-libav โ•‘\nโ•‘ โ•‘\nโ•‘ <3 Playwright Team โ•‘\nโ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•" + }, + "errors": [ + { + "message": "Error: browserType.launch: \nโ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—\nโ•‘ Host system is missing dependencies to run browsers. โ•‘\nโ•‘ Please install them with the following command: โ•‘\nโ•‘ โ•‘\nโ•‘ sudo npx playwright install-deps โ•‘\nโ•‘ โ•‘\nโ•‘ Alternatively, use apt: โ•‘\nโ•‘ sudo apt-get install libicu74\\ โ•‘\nโ•‘ libjpeg-turbo8\\ โ•‘\nโ•‘ gstreamer1.0-libav โ•‘\nโ•‘ โ•‘\nโ•‘ <3 Playwright Team โ•‘\nโ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:35:03.794Z", + "annotations": [], + "attachments": [] + } + ], + "status": "unexpected" + } + ], + "id": "c50e3d8c82f89a880019-84b2f6fd39d550eb18c7", + "file": "mvp-integration.spec.ts", + "line": 474, + "column": 5 + }, + { + "title": "4.2 - Can create playlist", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "webkit", + "projectName": "webkit", + "results": [ + { + "workerIndex": 41, + "parallelIndex": 0, + "status": "failed", + "duration": 2, + "error": { + "message": "Error: browserType.launch: \nโ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—\nโ•‘ Host system is missing dependencies to run browsers. โ•‘\nโ•‘ Please install them with the following command: โ•‘\nโ•‘ โ•‘\nโ•‘ sudo npx playwright install-deps โ•‘\nโ•‘ โ•‘\nโ•‘ Alternatively, use apt: โ•‘\nโ•‘ sudo apt-get install libicu74\\ โ•‘\nโ•‘ libjpeg-turbo8\\ โ•‘\nโ•‘ gstreamer1.0-libav โ•‘\nโ•‘ โ•‘\nโ•‘ <3 Playwright Team โ•‘\nโ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•", + "stack": "Error: browserType.launch: \nโ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—\nโ•‘ Host system is missing dependencies to run browsers. โ•‘\nโ•‘ Please install them with the following command: โ•‘\nโ•‘ โ•‘\nโ•‘ sudo npx playwright install-deps โ•‘\nโ•‘ โ•‘\nโ•‘ Alternatively, use apt: โ•‘\nโ•‘ sudo apt-get install libicu74\\ โ•‘\nโ•‘ libjpeg-turbo8\\ โ•‘\nโ•‘ gstreamer1.0-libav โ•‘\nโ•‘ โ•‘\nโ•‘ <3 Playwright Team โ•‘\nโ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•" + }, + "errors": [ + { + "message": "Error: browserType.launch: \nโ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—\nโ•‘ Host system is missing dependencies to run browsers. โ•‘\nโ•‘ Please install them with the following command: โ•‘\nโ•‘ โ•‘\nโ•‘ sudo npx playwright install-deps โ•‘\nโ•‘ โ•‘\nโ•‘ Alternatively, use apt: โ•‘\nโ•‘ sudo apt-get install libicu74\\ โ•‘\nโ•‘ libjpeg-turbo8\\ โ•‘\nโ•‘ gstreamer1.0-libav โ•‘\nโ•‘ โ•‘\nโ•‘ <3 Playwright Team โ•‘\nโ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:35:04.546Z", + "annotations": [], + "attachments": [] + } + ], + "status": "unexpected" + } + ], + "id": "c50e3d8c82f89a880019-713f5ee13a35f9d28602", + "file": "mvp-integration.spec.ts", + "line": 479, + "column": 5 + }, + { + "title": "4.1 - Playlists page loads", + "ok": true, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "msedge", + "projectName": "msedge", + "results": [ + { + "workerIndex": 52, + "parallelIndex": 0, + "status": "passed", + "duration": 2351, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:35:25.771Z", + "annotations": [], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "c50e3d8c82f89a880019-ea58089a8320675da581", + "file": "mvp-integration.spec.ts", + "line": 474, + "column": 5 + }, + { + "title": "4.2 - Can create playlist", + "ok": true, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "msedge", + "projectName": "msedge", + "results": [ + { + "workerIndex": 52, + "parallelIndex": 0, + "status": "passed", + "duration": 1144, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:35:28.132Z", + "annotations": [], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "c50e3d8c82f89a880019-79c0173f3375b73e9b30", + "file": "mvp-integration.spec.ts", + "line": 479, + "column": 5 } - ], - "id": "df6b40174562c70df515-4ca1ce2371dbebeae00d", - "file": "auth-flow.spec.ts", - "line": 333, - "column": 3 + ] + }, + { + "title": "5. Profile Management", + "file": "mvp-integration.spec.ts", + "line": 499, + "column": 8, + "specs": [ + { + "title": "5.1 - Profile page loads", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "chromium", + "projectName": "chromium", + "results": [ + { + "workerIndex": 6, + "parallelIndex": 0, + "status": "timedOut", + "duration": 61962, + "error": { + "message": "\u001b[31mTest timeout of 60000ms exceeded while running \"beforeEach\" hook.\u001b[39m", + "stack": "\u001b[31mTest timeout of 60000ms exceeded while running \"beforeEach\" hook.\u001b[39m\n at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:501:10", + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 10, + "line": 501 + }, + "snippet": "\u001b[0m \u001b[90m 499 |\u001b[39m test\u001b[33m.\u001b[39mdescribe(\u001b[32m'5. Profile Management'\u001b[39m\u001b[33m,\u001b[39m () \u001b[33m=>\u001b[39m {\n \u001b[90m 500 |\u001b[39m \n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 501 |\u001b[39m test\u001b[33m.\u001b[39mbeforeEach(\u001b[36masync\u001b[39m ({ page }) \u001b[33m=>\u001b[39m {\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 502 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mgoto(\u001b[32m`${TEST_CONFIG.FRONTEND_URL}/login`\u001b[39m)\u001b[33m;\u001b[39m\n \u001b[90m 503 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"email\"], input[name=\"email\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39memail)\u001b[33m;\u001b[39m\n \u001b[90m 504 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"password\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39mpassword)\u001b[33m;\u001b[39m\u001b[0m" + }, + "errors": [ + { + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 10, + "line": 501 + }, + "message": "\u001b[31mTest timeout of 60000ms exceeded while running \"beforeEach\" hook.\u001b[39m\n\n\u001b[0m \u001b[90m 499 |\u001b[39m test\u001b[33m.\u001b[39mdescribe(\u001b[32m'5. Profile Management'\u001b[39m\u001b[33m,\u001b[39m () \u001b[33m=>\u001b[39m {\n \u001b[90m 500 |\u001b[39m \n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 501 |\u001b[39m test\u001b[33m.\u001b[39mbeforeEach(\u001b[36masync\u001b[39m ({ page }) \u001b[33m=>\u001b[39m {\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 502 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mgoto(\u001b[32m`${TEST_CONFIG.FRONTEND_URL}/login`\u001b[39m)\u001b[33m;\u001b[39m\n \u001b[90m 503 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"email\"], input[name=\"email\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39memail)\u001b[33m;\u001b[39m\n \u001b[90m 504 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"password\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39mpassword)\u001b[33m;\u001b[39m\u001b[0m\n\u001b[2m at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:501:10\u001b[22m" + }, + { + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 18, + "line": 503 + }, + "message": "Error: page.fill: Test timeout of 60000ms exceeded.\nCall log:\n\u001b[2m - waiting for locator('input[type=\"email\"], input[name=\"email\"]')\u001b[22m\n\n\n\u001b[0m \u001b[90m 501 |\u001b[39m test\u001b[33m.\u001b[39mbeforeEach(\u001b[36masync\u001b[39m ({ page }) \u001b[33m=>\u001b[39m {\n \u001b[90m 502 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mgoto(\u001b[32m`${TEST_CONFIG.FRONTEND_URL}/login`\u001b[39m)\u001b[33m;\u001b[39m\n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 503 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"email\"], input[name=\"email\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39memail)\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 504 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"password\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39mpassword)\u001b[33m;\u001b[39m\n \u001b[90m 505 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mclick(\u001b[32m'button[type=\"submit\"]'\u001b[39m)\u001b[33m;\u001b[39m\n \u001b[90m 506 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mwaitForURL(\u001b[35m/\\/(dashboard|home|app)/\u001b[39m\u001b[33m,\u001b[39m { timeout\u001b[33m:\u001b[39m \u001b[35m15000\u001b[39m })\u001b[33m;\u001b[39m\u001b[0m\n\u001b[2m at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:503:18\u001b[22m" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:24:35.769Z", + "annotations": [], + "attachments": [ + { + "name": "screenshot", + "contentType": "image/png", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-20809-nt-5-1---Profile-page-loads-chromium/test-failed-1.png" + }, + { + "name": "video", + "contentType": "video/webm", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-20809-nt-5-1---Profile-page-loads-chromium/video.webm" + }, + { + "name": "error-context", + "contentType": "text/markdown", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-20809-nt-5-1---Profile-page-loads-chromium/error-context.md" + } + ], + "errorLocation": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 10, + "line": 501 + } + } + ], + "status": "unexpected" + } + ], + "id": "c50e3d8c82f89a880019-9bf2a323230b3a6e2fc6", + "file": "mvp-integration.spec.ts", + "line": 509, + "column": 5 + }, + { + "title": "5.2 - Can update profile", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "chromium", + "projectName": "chromium", + "results": [ + { + "workerIndex": 7, + "parallelIndex": 0, + "status": "timedOut", + "duration": 61667, + "error": { + "message": "\u001b[31mTest timeout of 60000ms exceeded while running \"beforeEach\" hook.\u001b[39m", + "stack": "\u001b[31mTest timeout of 60000ms exceeded while running \"beforeEach\" hook.\u001b[39m\n at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:501:10", + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 10, + "line": 501 + }, + "snippet": "\u001b[0m \u001b[90m 499 |\u001b[39m test\u001b[33m.\u001b[39mdescribe(\u001b[32m'5. Profile Management'\u001b[39m\u001b[33m,\u001b[39m () \u001b[33m=>\u001b[39m {\n \u001b[90m 500 |\u001b[39m \n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 501 |\u001b[39m test\u001b[33m.\u001b[39mbeforeEach(\u001b[36masync\u001b[39m ({ page }) \u001b[33m=>\u001b[39m {\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 502 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mgoto(\u001b[32m`${TEST_CONFIG.FRONTEND_URL}/login`\u001b[39m)\u001b[33m;\u001b[39m\n \u001b[90m 503 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"email\"], input[name=\"email\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39memail)\u001b[33m;\u001b[39m\n \u001b[90m 504 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"password\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39mpassword)\u001b[33m;\u001b[39m\u001b[0m" + }, + "errors": [ + { + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 10, + "line": 501 + }, + "message": "\u001b[31mTest timeout of 60000ms exceeded while running \"beforeEach\" hook.\u001b[39m\n\n\u001b[0m \u001b[90m 499 |\u001b[39m test\u001b[33m.\u001b[39mdescribe(\u001b[32m'5. Profile Management'\u001b[39m\u001b[33m,\u001b[39m () \u001b[33m=>\u001b[39m {\n \u001b[90m 500 |\u001b[39m \n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 501 |\u001b[39m test\u001b[33m.\u001b[39mbeforeEach(\u001b[36masync\u001b[39m ({ page }) \u001b[33m=>\u001b[39m {\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 502 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mgoto(\u001b[32m`${TEST_CONFIG.FRONTEND_URL}/login`\u001b[39m)\u001b[33m;\u001b[39m\n \u001b[90m 503 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"email\"], input[name=\"email\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39memail)\u001b[33m;\u001b[39m\n \u001b[90m 504 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"password\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39mpassword)\u001b[33m;\u001b[39m\u001b[0m\n\u001b[2m at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:501:10\u001b[22m" + }, + { + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 18, + "line": 503 + }, + "message": "Error: page.fill: Test timeout of 60000ms exceeded.\nCall log:\n\u001b[2m - waiting for locator('input[type=\"email\"], input[name=\"email\"]')\u001b[22m\n\n\n\u001b[0m \u001b[90m 501 |\u001b[39m test\u001b[33m.\u001b[39mbeforeEach(\u001b[36masync\u001b[39m ({ page }) \u001b[33m=>\u001b[39m {\n \u001b[90m 502 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mgoto(\u001b[32m`${TEST_CONFIG.FRONTEND_URL}/login`\u001b[39m)\u001b[33m;\u001b[39m\n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 503 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"email\"], input[name=\"email\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39memail)\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 504 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"password\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39mpassword)\u001b[33m;\u001b[39m\n \u001b[90m 505 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mclick(\u001b[32m'button[type=\"submit\"]'\u001b[39m)\u001b[33m;\u001b[39m\n \u001b[90m 506 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mwaitForURL(\u001b[35m/\\/(dashboard|home|app)/\u001b[39m\u001b[33m,\u001b[39m { timeout\u001b[33m:\u001b[39m \u001b[35m15000\u001b[39m })\u001b[33m;\u001b[39m\u001b[0m\n\u001b[2m at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:503:18\u001b[22m" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:25:38.363Z", + "annotations": [], + "attachments": [ + { + "name": "screenshot", + "contentType": "image/png", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-eefd2-nt-5-2---Can-update-profile-chromium/test-failed-1.png" + }, + { + "name": "video", + "contentType": "video/webm", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-eefd2-nt-5-2---Can-update-profile-chromium/video.webm" + }, + { + "name": "error-context", + "contentType": "text/markdown", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-eefd2-nt-5-2---Can-update-profile-chromium/error-context.md" + } + ], + "errorLocation": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 10, + "line": 501 + } + } + ], + "status": "unexpected" + } + ], + "id": "c50e3d8c82f89a880019-9c5007796de46c186182", + "file": "mvp-integration.spec.ts", + "line": 517, + "column": 5 + }, + { + "title": "5.1 - Profile page loads", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "firefox", + "projectName": "firefox", + "results": [ + { + "workerIndex": 21, + "parallelIndex": 0, + "status": "failed", + "duration": 16680, + "error": { + "message": "TimeoutError: page.waitForURL: Timeout 15000ms exceeded.\n=========================== logs ===========================\nwaiting for navigation until \"load\"\n navigated to \"http://localhost:5173/login\"\n navigated to \"http://localhost:5173/login\"\n============================================================", + "stack": "TimeoutError: page.waitForURL: Timeout 15000ms exceeded.\n=========================== logs ===========================\nwaiting for navigation until \"load\"\n navigated to \"http://localhost:5173/login\"\n navigated to \"http://localhost:5173/login\"\n============================================================\n at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:506:18", + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 18, + "line": 506 + }, + "snippet": "\u001b[0m \u001b[90m 504 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"password\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39mpassword)\u001b[33m;\u001b[39m\n \u001b[90m 505 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mclick(\u001b[32m'button[type=\"submit\"]'\u001b[39m)\u001b[33m;\u001b[39m\n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 506 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mwaitForURL(\u001b[35m/\\/(dashboard|home|app)/\u001b[39m\u001b[33m,\u001b[39m { timeout\u001b[33m:\u001b[39m \u001b[35m15000\u001b[39m })\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 507 |\u001b[39m })\u001b[33m;\u001b[39m\n \u001b[90m 508 |\u001b[39m\n \u001b[90m 509 |\u001b[39m test(\u001b[32m'5.1 - Profile page loads'\u001b[39m\u001b[33m,\u001b[39m \u001b[36masync\u001b[39m ({ page }) \u001b[33m=>\u001b[39m {\u001b[0m" + }, + "errors": [ + { + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 18, + "line": 506 + }, + "message": "TimeoutError: page.waitForURL: Timeout 15000ms exceeded.\n=========================== logs ===========================\nwaiting for navigation until \"load\"\n navigated to \"http://localhost:5173/login\"\n navigated to \"http://localhost:5173/login\"\n============================================================\n\n\u001b[0m \u001b[90m 504 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"password\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39mpassword)\u001b[33m;\u001b[39m\n \u001b[90m 505 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mclick(\u001b[32m'button[type=\"submit\"]'\u001b[39m)\u001b[33m;\u001b[39m\n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 506 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mwaitForURL(\u001b[35m/\\/(dashboard|home|app)/\u001b[39m\u001b[33m,\u001b[39m { timeout\u001b[33m:\u001b[39m \u001b[35m15000\u001b[39m })\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 507 |\u001b[39m })\u001b[33m;\u001b[39m\n \u001b[90m 508 |\u001b[39m\n \u001b[90m 509 |\u001b[39m test(\u001b[32m'5.1 - Profile page loads'\u001b[39m\u001b[33m,\u001b[39m \u001b[36masync\u001b[39m ({ page }) \u001b[33m=>\u001b[39m {\u001b[0m\n\u001b[2m at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:506:18\u001b[22m" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:33:48.406Z", + "annotations": [], + "attachments": [ + { + "name": "screenshot", + "contentType": "image/png", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-20809-nt-5-1---Profile-page-loads-firefox/test-failed-1.png" + }, + { + "name": "video", + "contentType": "video/webm", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-20809-nt-5-1---Profile-page-loads-firefox/video.webm" + }, + { + "name": "error-context", + "contentType": "text/markdown", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-20809-nt-5-1---Profile-page-loads-firefox/error-context.md" + } + ], + "errorLocation": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 18, + "line": 506 + } + } + ], + "status": "unexpected" + } + ], + "id": "c50e3d8c82f89a880019-837e6ba405cefaa95159", + "file": "mvp-integration.spec.ts", + "line": 509, + "column": 5 + }, + { + "title": "5.2 - Can update profile", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "firefox", + "projectName": "firefox", + "results": [ + { + "workerIndex": 22, + "parallelIndex": 0, + "status": "failed", + "duration": 1922, + "error": { + "message": "Error: page.waitForURL: NS_BINDING_ABORTED\n=========================== logs ===========================\nwaiting for navigation until \"load\"\n============================================================", + "stack": "Error: page.waitForURL: NS_BINDING_ABORTED\n=========================== logs ===========================\nwaiting for navigation until \"load\"\n============================================================\n at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:506:18", + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 18, + "line": 506 + }, + "snippet": "\u001b[0m \u001b[90m 504 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"password\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39mpassword)\u001b[33m;\u001b[39m\n \u001b[90m 505 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mclick(\u001b[32m'button[type=\"submit\"]'\u001b[39m)\u001b[33m;\u001b[39m\n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 506 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mwaitForURL(\u001b[35m/\\/(dashboard|home|app)/\u001b[39m\u001b[33m,\u001b[39m { timeout\u001b[33m:\u001b[39m \u001b[35m15000\u001b[39m })\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 507 |\u001b[39m })\u001b[33m;\u001b[39m\n \u001b[90m 508 |\u001b[39m\n \u001b[90m 509 |\u001b[39m test(\u001b[32m'5.1 - Profile page loads'\u001b[39m\u001b[33m,\u001b[39m \u001b[36masync\u001b[39m ({ page }) \u001b[33m=>\u001b[39m {\u001b[0m" + }, + "errors": [ + { + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 18, + "line": 506 + }, + "message": "Error: page.waitForURL: NS_BINDING_ABORTED\n=========================== logs ===========================\nwaiting for navigation until \"load\"\n============================================================\n\n\u001b[0m \u001b[90m 504 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"password\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39mpassword)\u001b[33m;\u001b[39m\n \u001b[90m 505 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mclick(\u001b[32m'button[type=\"submit\"]'\u001b[39m)\u001b[33m;\u001b[39m\n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 506 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mwaitForURL(\u001b[35m/\\/(dashboard|home|app)/\u001b[39m\u001b[33m,\u001b[39m { timeout\u001b[33m:\u001b[39m \u001b[35m15000\u001b[39m })\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 507 |\u001b[39m })\u001b[33m;\u001b[39m\n \u001b[90m 508 |\u001b[39m\n \u001b[90m 509 |\u001b[39m test(\u001b[32m'5.1 - Profile page loads'\u001b[39m\u001b[33m,\u001b[39m \u001b[36masync\u001b[39m ({ page }) \u001b[33m=>\u001b[39m {\u001b[0m\n\u001b[2m at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:506:18\u001b[22m" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:34:06.401Z", + "annotations": [], + "attachments": [ + { + "name": "screenshot", + "contentType": "image/png", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-eefd2-nt-5-2---Can-update-profile-firefox/test-failed-1.png" + }, + { + "name": "video", + "contentType": "video/webm", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-eefd2-nt-5-2---Can-update-profile-firefox/video.webm" + } + ], + "errorLocation": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 18, + "line": 506 + } + } + ], + "status": "unexpected" + } + ], + "id": "c50e3d8c82f89a880019-70b1981976dfed45a9c7", + "file": "mvp-integration.spec.ts", + "line": 517, + "column": 5 + }, + { + "title": "5.1 - Profile page loads", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "webkit", + "projectName": "webkit", + "results": [ + { + "workerIndex": 42, + "parallelIndex": 0, + "status": "failed", + "duration": 3, + "error": { + "message": "Error: browserType.launch: \nโ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—\nโ•‘ Host system is missing dependencies to run browsers. โ•‘\nโ•‘ Please install them with the following command: โ•‘\nโ•‘ โ•‘\nโ•‘ sudo npx playwright install-deps โ•‘\nโ•‘ โ•‘\nโ•‘ Alternatively, use apt: โ•‘\nโ•‘ sudo apt-get install libicu74\\ โ•‘\nโ•‘ libjpeg-turbo8\\ โ•‘\nโ•‘ gstreamer1.0-libav โ•‘\nโ•‘ โ•‘\nโ•‘ <3 Playwright Team โ•‘\nโ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•", + "stack": "Error: browserType.launch: \nโ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—\nโ•‘ Host system is missing dependencies to run browsers. โ•‘\nโ•‘ Please install them with the following command: โ•‘\nโ•‘ โ•‘\nโ•‘ sudo npx playwright install-deps โ•‘\nโ•‘ โ•‘\nโ•‘ Alternatively, use apt: โ•‘\nโ•‘ sudo apt-get install libicu74\\ โ•‘\nโ•‘ libjpeg-turbo8\\ โ•‘\nโ•‘ gstreamer1.0-libav โ•‘\nโ•‘ โ•‘\nโ•‘ <3 Playwright Team โ•‘\nโ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•" + }, + "errors": [ + { + "message": "Error: browserType.launch: \nโ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—\nโ•‘ Host system is missing dependencies to run browsers. โ•‘\nโ•‘ Please install them with the following command: โ•‘\nโ•‘ โ•‘\nโ•‘ sudo npx playwright install-deps โ•‘\nโ•‘ โ•‘\nโ•‘ Alternatively, use apt: โ•‘\nโ•‘ sudo apt-get install libicu74\\ โ•‘\nโ•‘ libjpeg-turbo8\\ โ•‘\nโ•‘ gstreamer1.0-libav โ•‘\nโ•‘ โ•‘\nโ•‘ <3 Playwright Team โ•‘\nโ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:35:05.227Z", + "annotations": [], + "attachments": [] + } + ], + "status": "unexpected" + } + ], + "id": "c50e3d8c82f89a880019-1cb3a98219e6d9b3a2c9", + "file": "mvp-integration.spec.ts", + "line": 509, + "column": 5 + }, + { + "title": "5.2 - Can update profile", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "webkit", + "projectName": "webkit", + "results": [ + { + "workerIndex": 43, + "parallelIndex": 0, + "status": "failed", + "duration": 2, + "error": { + "message": "Error: browserType.launch: \nโ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—\nโ•‘ Host system is missing dependencies to run browsers. โ•‘\nโ•‘ Please install them with the following command: โ•‘\nโ•‘ โ•‘\nโ•‘ sudo npx playwright install-deps โ•‘\nโ•‘ โ•‘\nโ•‘ Alternatively, use apt: โ•‘\nโ•‘ sudo apt-get install libicu74\\ โ•‘\nโ•‘ libjpeg-turbo8\\ โ•‘\nโ•‘ gstreamer1.0-libav โ•‘\nโ•‘ โ•‘\nโ•‘ <3 Playwright Team โ•‘\nโ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•", + "stack": "Error: browserType.launch: \nโ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—\nโ•‘ Host system is missing dependencies to run browsers. โ•‘\nโ•‘ Please install them with the following command: โ•‘\nโ•‘ โ•‘\nโ•‘ sudo npx playwright install-deps โ•‘\nโ•‘ โ•‘\nโ•‘ Alternatively, use apt: โ•‘\nโ•‘ sudo apt-get install libicu74\\ โ•‘\nโ•‘ libjpeg-turbo8\\ โ•‘\nโ•‘ gstreamer1.0-libav โ•‘\nโ•‘ โ•‘\nโ•‘ <3 Playwright Team โ•‘\nโ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•" + }, + "errors": [ + { + "message": "Error: browserType.launch: \nโ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—\nโ•‘ Host system is missing dependencies to run browsers. โ•‘\nโ•‘ Please install them with the following command: โ•‘\nโ•‘ โ•‘\nโ•‘ sudo npx playwright install-deps โ•‘\nโ•‘ โ•‘\nโ•‘ Alternatively, use apt: โ•‘\nโ•‘ sudo apt-get install libicu74\\ โ•‘\nโ•‘ libjpeg-turbo8\\ โ•‘\nโ•‘ gstreamer1.0-libav โ•‘\nโ•‘ โ•‘\nโ•‘ <3 Playwright Team โ•‘\nโ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:35:05.962Z", + "annotations": [], + "attachments": [] + } + ], + "status": "unexpected" + } + ], + "id": "c50e3d8c82f89a880019-e4441cfa59fb20c5e076", + "file": "mvp-integration.spec.ts", + "line": 517, + "column": 5 + }, + { + "title": "5.1 - Profile page loads", + "ok": true, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "msedge", + "projectName": "msedge", + "results": [ + { + "workerIndex": 52, + "parallelIndex": 0, + "status": "passed", + "duration": 1951, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:35:29.285Z", + "annotations": [], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "c50e3d8c82f89a880019-8f1a87683a57701cdbe1", + "file": "mvp-integration.spec.ts", + "line": 509, + "column": 5 + }, + { + "title": "5.2 - Can update profile", + "ok": true, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "msedge", + "projectName": "msedge", + "results": [ + { + "workerIndex": 52, + "parallelIndex": 0, + "status": "passed", + "duration": 1816, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:35:31.248Z", + "annotations": [], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "c50e3d8c82f89a880019-5829d6f28352d2bd637f", + "file": "mvp-integration.spec.ts", + "line": 517, + "column": 5 + } + ] + }, + { + "title": "6. API Response Validation", + "file": "mvp-integration.spec.ts", + "line": 538, + "column": 8, + "specs": [ + { + "title": "6.1 - API returns correct response format", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "chromium", + "projectName": "chromium", + "results": [ + { + "workerIndex": 8, + "parallelIndex": 0, + "status": "failed", + "duration": 25, + "error": { + "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeTruthy\u001b[2m()\u001b[22m\n\nReceived: \u001b[31mfalse\u001b[39m", + "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeTruthy\u001b[2m()\u001b[22m\n\nReceived: \u001b[31mfalse\u001b[39m\n at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:549:34", + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 34, + "line": 549 + }, + "snippet": "\u001b[0m \u001b[90m 547 |\u001b[39m })\u001b[33m;\u001b[39m\n \u001b[90m 548 |\u001b[39m \n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 549 |\u001b[39m expect(loginResponse\u001b[33m.\u001b[39mok())\u001b[33m.\u001b[39mtoBeTruthy()\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 550 |\u001b[39m \n \u001b[90m 551 |\u001b[39m \u001b[36mconst\u001b[39m data \u001b[33m=\u001b[39m \u001b[36mawait\u001b[39m loginResponse\u001b[33m.\u001b[39mjson()\u001b[33m;\u001b[39m\n \u001b[90m 552 |\u001b[39m \u001b[0m" + }, + "errors": [ + { + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 34, + "line": 549 + }, + "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeTruthy\u001b[2m()\u001b[22m\n\nReceived: \u001b[31mfalse\u001b[39m\n\n\u001b[0m \u001b[90m 547 |\u001b[39m })\u001b[33m;\u001b[39m\n \u001b[90m 548 |\u001b[39m \n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 549 |\u001b[39m expect(loginResponse\u001b[33m.\u001b[39mok())\u001b[33m.\u001b[39mtoBeTruthy()\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 550 |\u001b[39m \n \u001b[90m 551 |\u001b[39m \u001b[36mconst\u001b[39m data \u001b[33m=\u001b[39m \u001b[36mawait\u001b[39m loginResponse\u001b[33m.\u001b[39mjson()\u001b[33m;\u001b[39m\n \u001b[90m 552 |\u001b[39m \u001b[0m\n\u001b[2m at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:549:34\u001b[22m" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:26:40.734Z", + "annotations": [], + "attachments": [], + "errorLocation": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 34, + "line": 549 + } + } + ], + "status": "unexpected" + } + ], + "id": "c50e3d8c82f89a880019-cd23adfa00876e39f36d", + "file": "mvp-integration.spec.ts", + "line": 540, + "column": 5 + }, + { + "title": "6.2 - User ID is string UUID", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "chromium", + "projectName": "chromium", + "results": [ + { + "workerIndex": 9, + "parallelIndex": 0, + "status": "failed", + "duration": 23, + "error": { + "message": "SyntaxError: Unexpected non-whitespace character after JSON at position 4 (line 1 column 5)", + "stack": "SyntaxError: Unexpected non-whitespace character after JSON at position 4 (line 1 column 5)\n at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:571:22", + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 22, + "line": 571 + }, + "snippet": "\u001b[0m \u001b[90m 569 |\u001b[39m }\n \u001b[90m 570 |\u001b[39m })\u001b[33m;\u001b[39m\n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 571 |\u001b[39m \u001b[36mconst\u001b[39m data \u001b[33m=\u001b[39m \u001b[36mawait\u001b[39m loginResponse\u001b[33m.\u001b[39mjson()\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 572 |\u001b[39m accessToken \u001b[33m=\u001b[39m data\u001b[33m.\u001b[39mdata\u001b[33m?\u001b[39m\u001b[33m.\u001b[39maccess_token \u001b[33m||\u001b[39m data\u001b[33m.\u001b[39maccess_token \u001b[33m||\u001b[39m data\u001b[33m.\u001b[39mdata\u001b[33m?\u001b[39m\u001b[33m.\u001b[39mtoken\u001b[33m?\u001b[39m\u001b[33m.\u001b[39maccess_token\u001b[33m;\u001b[39m\n \u001b[90m 573 |\u001b[39m }\n \u001b[90m 574 |\u001b[39m \u001b[0m" + }, + "errors": [ + { + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 22, + "line": 571 + }, + "message": "SyntaxError: Unexpected non-whitespace character after JSON at position 4 (line 1 column 5)\n\n\u001b[0m \u001b[90m 569 |\u001b[39m }\n \u001b[90m 570 |\u001b[39m })\u001b[33m;\u001b[39m\n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 571 |\u001b[39m \u001b[36mconst\u001b[39m data \u001b[33m=\u001b[39m \u001b[36mawait\u001b[39m loginResponse\u001b[33m.\u001b[39mjson()\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 572 |\u001b[39m accessToken \u001b[33m=\u001b[39m data\u001b[33m.\u001b[39mdata\u001b[33m?\u001b[39m\u001b[33m.\u001b[39maccess_token \u001b[33m||\u001b[39m data\u001b[33m.\u001b[39maccess_token \u001b[33m||\u001b[39m data\u001b[33m.\u001b[39mdata\u001b[33m?\u001b[39m\u001b[33m.\u001b[39mtoken\u001b[33m?\u001b[39m\u001b[33m.\u001b[39maccess_token\u001b[33m;\u001b[39m\n \u001b[90m 573 |\u001b[39m }\n \u001b[90m 574 |\u001b[39m \u001b[0m\n\u001b[2m at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:571:22\u001b[22m" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:26:41.404Z", + "annotations": [], + "attachments": [], + "errorLocation": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 22, + "line": 571 + } + } + ], + "status": "unexpected" + } + ], + "id": "c50e3d8c82f89a880019-d5c61504b74ec6dd9796", + "file": "mvp-integration.spec.ts", + "line": 562, + "column": 5 + }, + { + "title": "6.3 - Error responses have correct format", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "chromium", + "projectName": "chromium", + "results": [ + { + "workerIndex": 10, + "parallelIndex": 0, + "status": "failed", + "duration": 25, + "error": { + "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m401\u001b[39m\nReceived: \u001b[31m404\u001b[39m", + "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m401\u001b[39m\nReceived: \u001b[31m404\u001b[39m\n at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:599:33", + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 33, + "line": 599 + }, + "snippet": "\u001b[0m \u001b[90m 597 |\u001b[39m })\u001b[33m;\u001b[39m\n \u001b[90m 598 |\u001b[39m \n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 599 |\u001b[39m expect(response\u001b[33m.\u001b[39mstatus())\u001b[33m.\u001b[39mtoBe(\u001b[35m401\u001b[39m)\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 600 |\u001b[39m \n \u001b[90m 601 |\u001b[39m \u001b[36mconst\u001b[39m data \u001b[33m=\u001b[39m \u001b[36mawait\u001b[39m response\u001b[33m.\u001b[39mjson()\u001b[33m;\u001b[39m\n \u001b[90m 602 |\u001b[39m \u001b[90m// Should have error info\u001b[39m\u001b[0m" + }, + "errors": [ + { + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 33, + "line": 599 + }, + "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m401\u001b[39m\nReceived: \u001b[31m404\u001b[39m\n\n\u001b[0m \u001b[90m 597 |\u001b[39m })\u001b[33m;\u001b[39m\n \u001b[90m 598 |\u001b[39m \n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 599 |\u001b[39m expect(response\u001b[33m.\u001b[39mstatus())\u001b[33m.\u001b[39mtoBe(\u001b[35m401\u001b[39m)\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 600 |\u001b[39m \n \u001b[90m 601 |\u001b[39m \u001b[36mconst\u001b[39m data \u001b[33m=\u001b[39m \u001b[36mawait\u001b[39m response\u001b[33m.\u001b[39mjson()\u001b[33m;\u001b[39m\n \u001b[90m 602 |\u001b[39m \u001b[90m// Should have error info\u001b[39m\u001b[0m\n\u001b[2m at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:599:33\u001b[22m" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:26:42.076Z", + "annotations": [], + "attachments": [], + "errorLocation": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 33, + "line": 599 + } + } + ], + "status": "unexpected" + } + ], + "id": "c50e3d8c82f89a880019-3a4c5be74ddda3fc7fc5", + "file": "mvp-integration.spec.ts", + "line": 591, + "column": 5 + }, + { + "title": "6.1 - API returns correct response format", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "firefox", + "projectName": "firefox", + "results": [ + { + "workerIndex": 23, + "parallelIndex": 0, + "status": "failed", + "duration": 26, + "error": { + "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeTruthy\u001b[2m()\u001b[22m\n\nReceived: \u001b[31mfalse\u001b[39m", + "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeTruthy\u001b[2m()\u001b[22m\n\nReceived: \u001b[31mfalse\u001b[39m\n at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:549:34", + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 34, + "line": 549 + }, + "snippet": "\u001b[0m \u001b[90m 547 |\u001b[39m })\u001b[33m;\u001b[39m\n \u001b[90m 548 |\u001b[39m \n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 549 |\u001b[39m expect(loginResponse\u001b[33m.\u001b[39mok())\u001b[33m.\u001b[39mtoBeTruthy()\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 550 |\u001b[39m \n \u001b[90m 551 |\u001b[39m \u001b[36mconst\u001b[39m data \u001b[33m=\u001b[39m \u001b[36mawait\u001b[39m loginResponse\u001b[33m.\u001b[39mjson()\u001b[33m;\u001b[39m\n \u001b[90m 552 |\u001b[39m \u001b[0m" + }, + "errors": [ + { + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 34, + "line": 549 + }, + "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeTruthy\u001b[2m()\u001b[22m\n\nReceived: \u001b[31mfalse\u001b[39m\n\n\u001b[0m \u001b[90m 547 |\u001b[39m })\u001b[33m;\u001b[39m\n \u001b[90m 548 |\u001b[39m \n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 549 |\u001b[39m expect(loginResponse\u001b[33m.\u001b[39mok())\u001b[33m.\u001b[39mtoBeTruthy()\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 550 |\u001b[39m \n \u001b[90m 551 |\u001b[39m \u001b[36mconst\u001b[39m data \u001b[33m=\u001b[39m \u001b[36mawait\u001b[39m loginResponse\u001b[33m.\u001b[39mjson()\u001b[33m;\u001b[39m\n \u001b[90m 552 |\u001b[39m \u001b[0m\n\u001b[2m at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:549:34\u001b[22m" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:34:09.751Z", + "annotations": [], + "attachments": [], + "errorLocation": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 34, + "line": 549 + } + } + ], + "status": "unexpected" + } + ], + "id": "c50e3d8c82f89a880019-b0f097169841dd60f6b6", + "file": "mvp-integration.spec.ts", + "line": 540, + "column": 5 + }, + { + "title": "6.2 - User ID is string UUID", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "firefox", + "projectName": "firefox", + "results": [ + { + "workerIndex": 24, + "parallelIndex": 0, + "status": "failed", + "duration": 27, + "error": { + "message": "SyntaxError: Unexpected non-whitespace character after JSON at position 4 (line 1 column 5)", + "stack": "SyntaxError: Unexpected non-whitespace character after JSON at position 4 (line 1 column 5)\n at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:571:22", + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 22, + "line": 571 + }, + "snippet": "\u001b[0m \u001b[90m 569 |\u001b[39m }\n \u001b[90m 570 |\u001b[39m })\u001b[33m;\u001b[39m\n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 571 |\u001b[39m \u001b[36mconst\u001b[39m data \u001b[33m=\u001b[39m \u001b[36mawait\u001b[39m loginResponse\u001b[33m.\u001b[39mjson()\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 572 |\u001b[39m accessToken \u001b[33m=\u001b[39m data\u001b[33m.\u001b[39mdata\u001b[33m?\u001b[39m\u001b[33m.\u001b[39maccess_token \u001b[33m||\u001b[39m data\u001b[33m.\u001b[39maccess_token \u001b[33m||\u001b[39m data\u001b[33m.\u001b[39mdata\u001b[33m?\u001b[39m\u001b[33m.\u001b[39mtoken\u001b[33m?\u001b[39m\u001b[33m.\u001b[39maccess_token\u001b[33m;\u001b[39m\n \u001b[90m 573 |\u001b[39m }\n \u001b[90m 574 |\u001b[39m \u001b[0m" + }, + "errors": [ + { + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 22, + "line": 571 + }, + "message": "SyntaxError: Unexpected non-whitespace character after JSON at position 4 (line 1 column 5)\n\n\u001b[0m \u001b[90m 569 |\u001b[39m }\n \u001b[90m 570 |\u001b[39m })\u001b[33m;\u001b[39m\n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 571 |\u001b[39m \u001b[36mconst\u001b[39m data \u001b[33m=\u001b[39m \u001b[36mawait\u001b[39m loginResponse\u001b[33m.\u001b[39mjson()\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 572 |\u001b[39m accessToken \u001b[33m=\u001b[39m data\u001b[33m.\u001b[39mdata\u001b[33m?\u001b[39m\u001b[33m.\u001b[39maccess_token \u001b[33m||\u001b[39m data\u001b[33m.\u001b[39maccess_token \u001b[33m||\u001b[39m data\u001b[33m.\u001b[39mdata\u001b[33m?\u001b[39m\u001b[33m.\u001b[39mtoken\u001b[33m?\u001b[39m\u001b[33m.\u001b[39maccess_token\u001b[33m;\u001b[39m\n \u001b[90m 573 |\u001b[39m }\n \u001b[90m 574 |\u001b[39m \u001b[0m\n\u001b[2m at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:571:22\u001b[22m" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:34:10.381Z", + "annotations": [], + "attachments": [], + "errorLocation": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 22, + "line": 571 + } + } + ], + "status": "unexpected" + } + ], + "id": "c50e3d8c82f89a880019-b445ff2f921f5b9b0794", + "file": "mvp-integration.spec.ts", + "line": 562, + "column": 5 + }, + { + "title": "6.3 - Error responses have correct format", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "firefox", + "projectName": "firefox", + "results": [ + { + "workerIndex": 25, + "parallelIndex": 0, + "status": "failed", + "duration": 25, + "error": { + "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m401\u001b[39m\nReceived: \u001b[31m404\u001b[39m", + "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m401\u001b[39m\nReceived: \u001b[31m404\u001b[39m\n at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:599:33", + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 33, + "line": 599 + }, + "snippet": "\u001b[0m \u001b[90m 597 |\u001b[39m })\u001b[33m;\u001b[39m\n \u001b[90m 598 |\u001b[39m \n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 599 |\u001b[39m expect(response\u001b[33m.\u001b[39mstatus())\u001b[33m.\u001b[39mtoBe(\u001b[35m401\u001b[39m)\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 600 |\u001b[39m \n \u001b[90m 601 |\u001b[39m \u001b[36mconst\u001b[39m data \u001b[33m=\u001b[39m \u001b[36mawait\u001b[39m response\u001b[33m.\u001b[39mjson()\u001b[33m;\u001b[39m\n \u001b[90m 602 |\u001b[39m \u001b[90m// Should have error info\u001b[39m\u001b[0m" + }, + "errors": [ + { + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 33, + "line": 599 + }, + "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m401\u001b[39m\nReceived: \u001b[31m404\u001b[39m\n\n\u001b[0m \u001b[90m 597 |\u001b[39m })\u001b[33m;\u001b[39m\n \u001b[90m 598 |\u001b[39m \n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 599 |\u001b[39m expect(response\u001b[33m.\u001b[39mstatus())\u001b[33m.\u001b[39mtoBe(\u001b[35m401\u001b[39m)\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 600 |\u001b[39m \n \u001b[90m 601 |\u001b[39m \u001b[36mconst\u001b[39m data \u001b[33m=\u001b[39m \u001b[36mawait\u001b[39m response\u001b[33m.\u001b[39mjson()\u001b[33m;\u001b[39m\n \u001b[90m 602 |\u001b[39m \u001b[90m// Should have error info\u001b[39m\u001b[0m\n\u001b[2m at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:599:33\u001b[22m" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:34:11.056Z", + "annotations": [], + "attachments": [], + "errorLocation": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 33, + "line": 599 + } + } + ], + "status": "unexpected" + } + ], + "id": "c50e3d8c82f89a880019-3d53b42e62a93169460a", + "file": "mvp-integration.spec.ts", + "line": 591, + "column": 5 + }, + { + "title": "6.1 - API returns correct response format", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "webkit", + "projectName": "webkit", + "results": [ + { + "workerIndex": 44, + "parallelIndex": 0, + "status": "failed", + "duration": 24, + "error": { + "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeTruthy\u001b[2m()\u001b[22m\n\nReceived: \u001b[31mfalse\u001b[39m", + "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeTruthy\u001b[2m()\u001b[22m\n\nReceived: \u001b[31mfalse\u001b[39m\n at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:549:34", + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 34, + "line": 549 + }, + "snippet": "\u001b[0m \u001b[90m 547 |\u001b[39m })\u001b[33m;\u001b[39m\n \u001b[90m 548 |\u001b[39m \n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 549 |\u001b[39m expect(loginResponse\u001b[33m.\u001b[39mok())\u001b[33m.\u001b[39mtoBeTruthy()\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 550 |\u001b[39m \n \u001b[90m 551 |\u001b[39m \u001b[36mconst\u001b[39m data \u001b[33m=\u001b[39m \u001b[36mawait\u001b[39m loginResponse\u001b[33m.\u001b[39mjson()\u001b[33m;\u001b[39m\n \u001b[90m 552 |\u001b[39m \u001b[0m" + }, + "errors": [ + { + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 34, + "line": 549 + }, + "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeTruthy\u001b[2m()\u001b[22m\n\nReceived: \u001b[31mfalse\u001b[39m\n\n\u001b[0m \u001b[90m 547 |\u001b[39m })\u001b[33m;\u001b[39m\n \u001b[90m 548 |\u001b[39m \n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 549 |\u001b[39m expect(loginResponse\u001b[33m.\u001b[39mok())\u001b[33m.\u001b[39mtoBeTruthy()\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 550 |\u001b[39m \n \u001b[90m 551 |\u001b[39m \u001b[36mconst\u001b[39m data \u001b[33m=\u001b[39m \u001b[36mawait\u001b[39m loginResponse\u001b[33m.\u001b[39mjson()\u001b[33m;\u001b[39m\n \u001b[90m 552 |\u001b[39m \u001b[0m\n\u001b[2m at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:549:34\u001b[22m" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:35:06.710Z", + "annotations": [], + "attachments": [], + "errorLocation": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 34, + "line": 549 + } + } + ], + "status": "unexpected" + } + ], + "id": "c50e3d8c82f89a880019-03ecbbf81429fa1b3914", + "file": "mvp-integration.spec.ts", + "line": 540, + "column": 5 + }, + { + "title": "6.2 - User ID is string UUID", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "webkit", + "projectName": "webkit", + "results": [ + { + "workerIndex": 45, + "parallelIndex": 0, + "status": "failed", + "duration": 24, + "error": { + "message": "SyntaxError: Unexpected non-whitespace character after JSON at position 4 (line 1 column 5)", + "stack": "SyntaxError: Unexpected non-whitespace character after JSON at position 4 (line 1 column 5)\n at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:571:22", + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 22, + "line": 571 + }, + "snippet": "\u001b[0m \u001b[90m 569 |\u001b[39m }\n \u001b[90m 570 |\u001b[39m })\u001b[33m;\u001b[39m\n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 571 |\u001b[39m \u001b[36mconst\u001b[39m data \u001b[33m=\u001b[39m \u001b[36mawait\u001b[39m loginResponse\u001b[33m.\u001b[39mjson()\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 572 |\u001b[39m accessToken \u001b[33m=\u001b[39m data\u001b[33m.\u001b[39mdata\u001b[33m?\u001b[39m\u001b[33m.\u001b[39maccess_token \u001b[33m||\u001b[39m data\u001b[33m.\u001b[39maccess_token \u001b[33m||\u001b[39m data\u001b[33m.\u001b[39mdata\u001b[33m?\u001b[39m\u001b[33m.\u001b[39mtoken\u001b[33m?\u001b[39m\u001b[33m.\u001b[39maccess_token\u001b[33m;\u001b[39m\n \u001b[90m 573 |\u001b[39m }\n \u001b[90m 574 |\u001b[39m \u001b[0m" + }, + "errors": [ + { + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 22, + "line": 571 + }, + "message": "SyntaxError: Unexpected non-whitespace character after JSON at position 4 (line 1 column 5)\n\n\u001b[0m \u001b[90m 569 |\u001b[39m }\n \u001b[90m 570 |\u001b[39m })\u001b[33m;\u001b[39m\n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 571 |\u001b[39m \u001b[36mconst\u001b[39m data \u001b[33m=\u001b[39m \u001b[36mawait\u001b[39m loginResponse\u001b[33m.\u001b[39mjson()\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 572 |\u001b[39m accessToken \u001b[33m=\u001b[39m data\u001b[33m.\u001b[39mdata\u001b[33m?\u001b[39m\u001b[33m.\u001b[39maccess_token \u001b[33m||\u001b[39m data\u001b[33m.\u001b[39maccess_token \u001b[33m||\u001b[39m data\u001b[33m.\u001b[39mdata\u001b[33m?\u001b[39m\u001b[33m.\u001b[39mtoken\u001b[33m?\u001b[39m\u001b[33m.\u001b[39maccess_token\u001b[33m;\u001b[39m\n \u001b[90m 573 |\u001b[39m }\n \u001b[90m 574 |\u001b[39m \u001b[0m\n\u001b[2m at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:571:22\u001b[22m" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:35:07.339Z", + "annotations": [], + "attachments": [], + "errorLocation": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 22, + "line": 571 + } + } + ], + "status": "unexpected" + } + ], + "id": "c50e3d8c82f89a880019-94bf6e1ea25cc0e63d93", + "file": "mvp-integration.spec.ts", + "line": 562, + "column": 5 + }, + { + "title": "6.3 - Error responses have correct format", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "webkit", + "projectName": "webkit", + "results": [ + { + "workerIndex": 46, + "parallelIndex": 0, + "status": "failed", + "duration": 24, + "error": { + "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m401\u001b[39m\nReceived: \u001b[31m404\u001b[39m", + "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m401\u001b[39m\nReceived: \u001b[31m404\u001b[39m\n at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:599:33", + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 33, + "line": 599 + }, + "snippet": "\u001b[0m \u001b[90m 597 |\u001b[39m })\u001b[33m;\u001b[39m\n \u001b[90m 598 |\u001b[39m \n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 599 |\u001b[39m expect(response\u001b[33m.\u001b[39mstatus())\u001b[33m.\u001b[39mtoBe(\u001b[35m401\u001b[39m)\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 600 |\u001b[39m \n \u001b[90m 601 |\u001b[39m \u001b[36mconst\u001b[39m data \u001b[33m=\u001b[39m \u001b[36mawait\u001b[39m response\u001b[33m.\u001b[39mjson()\u001b[33m;\u001b[39m\n \u001b[90m 602 |\u001b[39m \u001b[90m// Should have error info\u001b[39m\u001b[0m" + }, + "errors": [ + { + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 33, + "line": 599 + }, + "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m401\u001b[39m\nReceived: \u001b[31m404\u001b[39m\n\n\u001b[0m \u001b[90m 597 |\u001b[39m })\u001b[33m;\u001b[39m\n \u001b[90m 598 |\u001b[39m \n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 599 |\u001b[39m expect(response\u001b[33m.\u001b[39mstatus())\u001b[33m.\u001b[39mtoBe(\u001b[35m401\u001b[39m)\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 600 |\u001b[39m \n \u001b[90m 601 |\u001b[39m \u001b[36mconst\u001b[39m data \u001b[33m=\u001b[39m \u001b[36mawait\u001b[39m response\u001b[33m.\u001b[39mjson()\u001b[33m;\u001b[39m\n \u001b[90m 602 |\u001b[39m \u001b[90m// Should have error info\u001b[39m\u001b[0m\n\u001b[2m at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:599:33\u001b[22m" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:35:08.078Z", + "annotations": [], + "attachments": [], + "errorLocation": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 33, + "line": 599 + } + } + ], + "status": "unexpected" + } + ], + "id": "c50e3d8c82f89a880019-cd73ea20e7f1c0fb2d7c", + "file": "mvp-integration.spec.ts", + "line": 591, + "column": 5 + }, + { + "title": "6.1 - API returns correct response format", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "msedge", + "projectName": "msedge", + "results": [ + { + "workerIndex": 52, + "parallelIndex": 0, + "status": "failed", + "duration": 8, + "error": { + "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeTruthy\u001b[2m()\u001b[22m\n\nReceived: \u001b[31mfalse\u001b[39m", + "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeTruthy\u001b[2m()\u001b[22m\n\nReceived: \u001b[31mfalse\u001b[39m\n at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:549:34", + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 34, + "line": 549 + }, + "snippet": "\u001b[0m \u001b[90m 547 |\u001b[39m })\u001b[33m;\u001b[39m\n \u001b[90m 548 |\u001b[39m \n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 549 |\u001b[39m expect(loginResponse\u001b[33m.\u001b[39mok())\u001b[33m.\u001b[39mtoBeTruthy()\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 550 |\u001b[39m \n \u001b[90m 551 |\u001b[39m \u001b[36mconst\u001b[39m data \u001b[33m=\u001b[39m \u001b[36mawait\u001b[39m loginResponse\u001b[33m.\u001b[39mjson()\u001b[33m;\u001b[39m\n \u001b[90m 552 |\u001b[39m \u001b[0m" + }, + "errors": [ + { + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 34, + "line": 549 + }, + "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeTruthy\u001b[2m()\u001b[22m\n\nReceived: \u001b[31mfalse\u001b[39m\n\n\u001b[0m \u001b[90m 547 |\u001b[39m })\u001b[33m;\u001b[39m\n \u001b[90m 548 |\u001b[39m \n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 549 |\u001b[39m expect(loginResponse\u001b[33m.\u001b[39mok())\u001b[33m.\u001b[39mtoBeTruthy()\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 550 |\u001b[39m \n \u001b[90m 551 |\u001b[39m \u001b[36mconst\u001b[39m data \u001b[33m=\u001b[39m \u001b[36mawait\u001b[39m loginResponse\u001b[33m.\u001b[39mjson()\u001b[33m;\u001b[39m\n \u001b[90m 552 |\u001b[39m \u001b[0m\n\u001b[2m at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:549:34\u001b[22m" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:35:33.075Z", + "annotations": [], + "attachments": [], + "errorLocation": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 34, + "line": 549 + } + } + ], + "status": "unexpected" + } + ], + "id": "c50e3d8c82f89a880019-65bbfc663ee4fe7b5854", + "file": "mvp-integration.spec.ts", + "line": 540, + "column": 5 + }, + { + "title": "6.2 - User ID is string UUID", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "msedge", + "projectName": "msedge", + "results": [ + { + "workerIndex": 53, + "parallelIndex": 0, + "status": "failed", + "duration": 24, + "error": { + "message": "SyntaxError: Unexpected non-whitespace character after JSON at position 4 (line 1 column 5)", + "stack": "SyntaxError: Unexpected non-whitespace character after JSON at position 4 (line 1 column 5)\n at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:571:22", + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 22, + "line": 571 + }, + "snippet": "\u001b[0m \u001b[90m 569 |\u001b[39m }\n \u001b[90m 570 |\u001b[39m })\u001b[33m;\u001b[39m\n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 571 |\u001b[39m \u001b[36mconst\u001b[39m data \u001b[33m=\u001b[39m \u001b[36mawait\u001b[39m loginResponse\u001b[33m.\u001b[39mjson()\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 572 |\u001b[39m accessToken \u001b[33m=\u001b[39m data\u001b[33m.\u001b[39mdata\u001b[33m?\u001b[39m\u001b[33m.\u001b[39maccess_token \u001b[33m||\u001b[39m data\u001b[33m.\u001b[39maccess_token \u001b[33m||\u001b[39m data\u001b[33m.\u001b[39mdata\u001b[33m?\u001b[39m\u001b[33m.\u001b[39mtoken\u001b[33m?\u001b[39m\u001b[33m.\u001b[39maccess_token\u001b[33m;\u001b[39m\n \u001b[90m 573 |\u001b[39m }\n \u001b[90m 574 |\u001b[39m \u001b[0m" + }, + "errors": [ + { + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 22, + "line": 571 + }, + "message": "SyntaxError: Unexpected non-whitespace character after JSON at position 4 (line 1 column 5)\n\n\u001b[0m \u001b[90m 569 |\u001b[39m }\n \u001b[90m 570 |\u001b[39m })\u001b[33m;\u001b[39m\n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 571 |\u001b[39m \u001b[36mconst\u001b[39m data \u001b[33m=\u001b[39m \u001b[36mawait\u001b[39m loginResponse\u001b[33m.\u001b[39mjson()\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 572 |\u001b[39m accessToken \u001b[33m=\u001b[39m data\u001b[33m.\u001b[39mdata\u001b[33m?\u001b[39m\u001b[33m.\u001b[39maccess_token \u001b[33m||\u001b[39m data\u001b[33m.\u001b[39maccess_token \u001b[33m||\u001b[39m data\u001b[33m.\u001b[39mdata\u001b[33m?\u001b[39m\u001b[33m.\u001b[39mtoken\u001b[33m?\u001b[39m\u001b[33m.\u001b[39maccess_token\u001b[33m;\u001b[39m\n \u001b[90m 573 |\u001b[39m }\n \u001b[90m 574 |\u001b[39m \u001b[0m\n\u001b[2m at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:571:22\u001b[22m" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:35:33.803Z", + "annotations": [], + "attachments": [], + "errorLocation": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 22, + "line": 571 + } + } + ], + "status": "unexpected" + } + ], + "id": "c50e3d8c82f89a880019-2c4c47e0e20bbcd8246f", + "file": "mvp-integration.spec.ts", + "line": 562, + "column": 5 + }, + { + "title": "6.3 - Error responses have correct format", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "msedge", + "projectName": "msedge", + "results": [ + { + "workerIndex": 54, + "parallelIndex": 0, + "status": "failed", + "duration": 66, + "error": { + "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m401\u001b[39m\nReceived: \u001b[31m404\u001b[39m", + "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m401\u001b[39m\nReceived: \u001b[31m404\u001b[39m\n at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:599:33", + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 33, + "line": 599 + }, + "snippet": "\u001b[0m \u001b[90m 597 |\u001b[39m })\u001b[33m;\u001b[39m\n \u001b[90m 598 |\u001b[39m \n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 599 |\u001b[39m expect(response\u001b[33m.\u001b[39mstatus())\u001b[33m.\u001b[39mtoBe(\u001b[35m401\u001b[39m)\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 600 |\u001b[39m \n \u001b[90m 601 |\u001b[39m \u001b[36mconst\u001b[39m data \u001b[33m=\u001b[39m \u001b[36mawait\u001b[39m response\u001b[33m.\u001b[39mjson()\u001b[33m;\u001b[39m\n \u001b[90m 602 |\u001b[39m \u001b[90m// Should have error info\u001b[39m\u001b[0m" + }, + "errors": [ + { + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 33, + "line": 599 + }, + "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBe\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m) // Object.is equality\u001b[22m\n\nExpected: \u001b[32m401\u001b[39m\nReceived: \u001b[31m404\u001b[39m\n\n\u001b[0m \u001b[90m 597 |\u001b[39m })\u001b[33m;\u001b[39m\n \u001b[90m 598 |\u001b[39m \n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 599 |\u001b[39m expect(response\u001b[33m.\u001b[39mstatus())\u001b[33m.\u001b[39mtoBe(\u001b[35m401\u001b[39m)\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 600 |\u001b[39m \n \u001b[90m 601 |\u001b[39m \u001b[36mconst\u001b[39m data \u001b[33m=\u001b[39m \u001b[36mawait\u001b[39m response\u001b[33m.\u001b[39mjson()\u001b[33m;\u001b[39m\n \u001b[90m 602 |\u001b[39m \u001b[90m// Should have error info\u001b[39m\u001b[0m\n\u001b[2m at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:599:33\u001b[22m" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:35:34.478Z", + "annotations": [], + "attachments": [], + "errorLocation": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 33, + "line": 599 + } + } + ], + "status": "unexpected" + } + ], + "id": "c50e3d8c82f89a880019-2a700d9ac42504d3f915", + "file": "mvp-integration.spec.ts", + "line": 591, + "column": 5 + } + ] + }, + { + "title": "7. Error Handling", + "file": "mvp-integration.spec.ts", + "line": 607, + "column": 8, + "specs": [ + { + "title": "7.1 - 404 page exists", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "chromium", + "projectName": "chromium", + "results": [ + { + "workerIndex": 11, + "parallelIndex": 0, + "status": "failed", + "duration": 526, + "error": { + "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeTruthy\u001b[2m()\u001b[22m\n\nReceived: \u001b[31mfalse\u001b[39m", + "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeTruthy\u001b[2m()\u001b[22m\n\nReceived: \u001b[31mfalse\u001b[39m\n at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:616:37", + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 37, + "line": 616 + }, + "snippet": "\u001b[0m \u001b[90m 614 |\u001b[39m \u001b[36mconst\u001b[39m isRedirected \u001b[33m=\u001b[39m page\u001b[33m.\u001b[39murl()\u001b[33m.\u001b[39mincludes(\u001b[32m'login'\u001b[39m) \u001b[33m||\u001b[39m page\u001b[33m.\u001b[39murl() \u001b[33m===\u001b[39m \u001b[32m`${TEST_CONFIG.FRONTEND_URL}/`\u001b[39m\u001b[33m;\u001b[39m\n \u001b[90m 615 |\u001b[39m \n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 616 |\u001b[39m expect(is404 \u001b[33m||\u001b[39m isRedirected)\u001b[33m.\u001b[39mtoBeTruthy()\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 617 |\u001b[39m })\u001b[33m;\u001b[39m\n \u001b[90m 618 |\u001b[39m\n \u001b[90m 619 |\u001b[39m test(\u001b[32m'7.2 - Network error handling'\u001b[39m\u001b[33m,\u001b[39m \u001b[36masync\u001b[39m ({ page }) \u001b[33m=>\u001b[39m {\u001b[0m" + }, + "errors": [ + { + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 37, + "line": 616 + }, + "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeTruthy\u001b[2m()\u001b[22m\n\nReceived: \u001b[31mfalse\u001b[39m\n\n\u001b[0m \u001b[90m 614 |\u001b[39m \u001b[36mconst\u001b[39m isRedirected \u001b[33m=\u001b[39m page\u001b[33m.\u001b[39murl()\u001b[33m.\u001b[39mincludes(\u001b[32m'login'\u001b[39m) \u001b[33m||\u001b[39m page\u001b[33m.\u001b[39murl() \u001b[33m===\u001b[39m \u001b[32m`${TEST_CONFIG.FRONTEND_URL}/`\u001b[39m\u001b[33m;\u001b[39m\n \u001b[90m 615 |\u001b[39m \n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 616 |\u001b[39m expect(is404 \u001b[33m||\u001b[39m isRedirected)\u001b[33m.\u001b[39mtoBeTruthy()\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 617 |\u001b[39m })\u001b[33m;\u001b[39m\n \u001b[90m 618 |\u001b[39m\n \u001b[90m 619 |\u001b[39m test(\u001b[32m'7.2 - Network error handling'\u001b[39m\u001b[33m,\u001b[39m \u001b[36masync\u001b[39m ({ page }) \u001b[33m=>\u001b[39m {\u001b[0m\n\u001b[2m at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:616:37\u001b[22m" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:26:43.071Z", + "annotations": [], + "attachments": [ + { + "name": "screenshot", + "contentType": "image/png", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-8e28a-dling-7-1---404-page-exists-chromium/test-failed-1.png" + }, + { + "name": "video", + "contentType": "video/webm", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-8e28a-dling-7-1---404-page-exists-chromium/video.webm" + }, + { + "name": "error-context", + "contentType": "text/markdown", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-8e28a-dling-7-1---404-page-exists-chromium/error-context.md" + } + ], + "errorLocation": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 37, + "line": 616 + } + } + ], + "status": "unexpected" + } + ], + "id": "c50e3d8c82f89a880019-b38b0d7e6bbd78b18482", + "file": "mvp-integration.spec.ts", + "line": 609, + "column": 5 + }, + { + "title": "7.2 - Network error handling", + "ok": true, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "chromium", + "projectName": "chromium", + "results": [ + { + "workerIndex": 12, + "parallelIndex": 0, + "status": "passed", + "duration": 2845, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:26:44.288Z", + "annotations": [], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "c50e3d8c82f89a880019-23d6e366982fc1962abf", + "file": "mvp-integration.spec.ts", + "line": 619, + "column": 5 + }, + { + "title": "7.1 - 404 page exists", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "firefox", + "projectName": "firefox", + "results": [ + { + "workerIndex": 26, + "parallelIndex": 0, + "status": "failed", + "duration": 1371, + "error": { + "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeTruthy\u001b[2m()\u001b[22m\n\nReceived: \u001b[31mfalse\u001b[39m", + "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeTruthy\u001b[2m()\u001b[22m\n\nReceived: \u001b[31mfalse\u001b[39m\n at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:616:37", + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 37, + "line": 616 + }, + "snippet": "\u001b[0m \u001b[90m 614 |\u001b[39m \u001b[36mconst\u001b[39m isRedirected \u001b[33m=\u001b[39m page\u001b[33m.\u001b[39murl()\u001b[33m.\u001b[39mincludes(\u001b[32m'login'\u001b[39m) \u001b[33m||\u001b[39m page\u001b[33m.\u001b[39murl() \u001b[33m===\u001b[39m \u001b[32m`${TEST_CONFIG.FRONTEND_URL}/`\u001b[39m\u001b[33m;\u001b[39m\n \u001b[90m 615 |\u001b[39m \n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 616 |\u001b[39m expect(is404 \u001b[33m||\u001b[39m isRedirected)\u001b[33m.\u001b[39mtoBeTruthy()\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 617 |\u001b[39m })\u001b[33m;\u001b[39m\n \u001b[90m 618 |\u001b[39m\n \u001b[90m 619 |\u001b[39m test(\u001b[32m'7.2 - Network error handling'\u001b[39m\u001b[33m,\u001b[39m \u001b[36masync\u001b[39m ({ page }) \u001b[33m=>\u001b[39m {\u001b[0m" + }, + "errors": [ + { + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 37, + "line": 616 + }, + "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeTruthy\u001b[2m()\u001b[22m\n\nReceived: \u001b[31mfalse\u001b[39m\n\n\u001b[0m \u001b[90m 614 |\u001b[39m \u001b[36mconst\u001b[39m isRedirected \u001b[33m=\u001b[39m page\u001b[33m.\u001b[39murl()\u001b[33m.\u001b[39mincludes(\u001b[32m'login'\u001b[39m) \u001b[33m||\u001b[39m page\u001b[33m.\u001b[39murl() \u001b[33m===\u001b[39m \u001b[32m`${TEST_CONFIG.FRONTEND_URL}/`\u001b[39m\u001b[33m;\u001b[39m\n \u001b[90m 615 |\u001b[39m \n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 616 |\u001b[39m expect(is404 \u001b[33m||\u001b[39m isRedirected)\u001b[33m.\u001b[39mtoBeTruthy()\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 617 |\u001b[39m })\u001b[33m;\u001b[39m\n \u001b[90m 618 |\u001b[39m\n \u001b[90m 619 |\u001b[39m test(\u001b[32m'7.2 - Network error handling'\u001b[39m\u001b[33m,\u001b[39m \u001b[36masync\u001b[39m ({ page }) \u001b[33m=>\u001b[39m {\u001b[0m\n\u001b[2m at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:616:37\u001b[22m" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:34:11.718Z", + "annotations": [], + "attachments": [ + { + "name": "screenshot", + "contentType": "image/png", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-8e28a-dling-7-1---404-page-exists-firefox/test-failed-1.png" + }, + { + "name": "video", + "contentType": "video/webm", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-8e28a-dling-7-1---404-page-exists-firefox/video.webm" + } + ], + "errorLocation": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 37, + "line": 616 + } + } + ], + "status": "unexpected" + } + ], + "id": "c50e3d8c82f89a880019-afc8dd199384cf264b0b", + "file": "mvp-integration.spec.ts", + "line": 609, + "column": 5 + }, + { + "title": "7.2 - Network error handling", + "ok": true, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "firefox", + "projectName": "firefox", + "results": [ + { + "workerIndex": 27, + "parallelIndex": 0, + "status": "passed", + "duration": 3313, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:34:14.409Z", + "annotations": [], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "c50e3d8c82f89a880019-2b4d8f703d5410323af4", + "file": "mvp-integration.spec.ts", + "line": 619, + "column": 5 + }, + { + "title": "7.1 - 404 page exists", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "webkit", + "projectName": "webkit", + "results": [ + { + "workerIndex": 47, + "parallelIndex": 0, + "status": "failed", + "duration": 3, + "error": { + "message": "Error: browserType.launch: \nโ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—\nโ•‘ Host system is missing dependencies to run browsers. โ•‘\nโ•‘ Please install them with the following command: โ•‘\nโ•‘ โ•‘\nโ•‘ sudo npx playwright install-deps โ•‘\nโ•‘ โ•‘\nโ•‘ Alternatively, use apt: โ•‘\nโ•‘ sudo apt-get install libicu74\\ โ•‘\nโ•‘ libjpeg-turbo8\\ โ•‘\nโ•‘ gstreamer1.0-libav โ•‘\nโ•‘ โ•‘\nโ•‘ <3 Playwright Team โ•‘\nโ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•", + "stack": "Error: browserType.launch: \nโ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—\nโ•‘ Host system is missing dependencies to run browsers. โ•‘\nโ•‘ Please install them with the following command: โ•‘\nโ•‘ โ•‘\nโ•‘ sudo npx playwright install-deps โ•‘\nโ•‘ โ•‘\nโ•‘ Alternatively, use apt: โ•‘\nโ•‘ sudo apt-get install libicu74\\ โ•‘\nโ•‘ libjpeg-turbo8\\ โ•‘\nโ•‘ gstreamer1.0-libav โ•‘\nโ•‘ โ•‘\nโ•‘ <3 Playwright Team โ•‘\nโ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•" + }, + "errors": [ + { + "message": "Error: browserType.launch: \nโ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—\nโ•‘ Host system is missing dependencies to run browsers. โ•‘\nโ•‘ Please install them with the following command: โ•‘\nโ•‘ โ•‘\nโ•‘ sudo npx playwright install-deps โ•‘\nโ•‘ โ•‘\nโ•‘ Alternatively, use apt: โ•‘\nโ•‘ sudo apt-get install libicu74\\ โ•‘\nโ•‘ libjpeg-turbo8\\ โ•‘\nโ•‘ gstreamer1.0-libav โ•‘\nโ•‘ โ•‘\nโ•‘ <3 Playwright Team โ•‘\nโ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:35:08.778Z", + "annotations": [], + "attachments": [] + } + ], + "status": "unexpected" + } + ], + "id": "c50e3d8c82f89a880019-0d75530f13556a58dd89", + "file": "mvp-integration.spec.ts", + "line": 609, + "column": 5 + }, + { + "title": "7.2 - Network error handling", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "webkit", + "projectName": "webkit", + "results": [ + { + "workerIndex": 48, + "parallelIndex": 0, + "status": "failed", + "duration": 3, + "error": { + "message": "Error: browserType.launch: \nโ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—\nโ•‘ Host system is missing dependencies to run browsers. โ•‘\nโ•‘ Please install them with the following command: โ•‘\nโ•‘ โ•‘\nโ•‘ sudo npx playwright install-deps โ•‘\nโ•‘ โ•‘\nโ•‘ Alternatively, use apt: โ•‘\nโ•‘ sudo apt-get install libicu74\\ โ•‘\nโ•‘ libjpeg-turbo8\\ โ•‘\nโ•‘ gstreamer1.0-libav โ•‘\nโ•‘ โ•‘\nโ•‘ <3 Playwright Team โ•‘\nโ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•", + "stack": "Error: browserType.launch: \nโ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—\nโ•‘ Host system is missing dependencies to run browsers. โ•‘\nโ•‘ Please install them with the following command: โ•‘\nโ•‘ โ•‘\nโ•‘ sudo npx playwright install-deps โ•‘\nโ•‘ โ•‘\nโ•‘ Alternatively, use apt: โ•‘\nโ•‘ sudo apt-get install libicu74\\ โ•‘\nโ•‘ libjpeg-turbo8\\ โ•‘\nโ•‘ gstreamer1.0-libav โ•‘\nโ•‘ โ•‘\nโ•‘ <3 Playwright Team โ•‘\nโ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•" + }, + "errors": [ + { + "message": "Error: browserType.launch: \nโ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—\nโ•‘ Host system is missing dependencies to run browsers. โ•‘\nโ•‘ Please install them with the following command: โ•‘\nโ•‘ โ•‘\nโ•‘ sudo npx playwright install-deps โ•‘\nโ•‘ โ•‘\nโ•‘ Alternatively, use apt: โ•‘\nโ•‘ sudo apt-get install libicu74\\ โ•‘\nโ•‘ libjpeg-turbo8\\ โ•‘\nโ•‘ gstreamer1.0-libav โ•‘\nโ•‘ โ•‘\nโ•‘ <3 Playwright Team โ•‘\nโ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:35:09.502Z", + "annotations": [], + "attachments": [] + } + ], + "status": "unexpected" + } + ], + "id": "c50e3d8c82f89a880019-1bcb4f154c323e0be74a", + "file": "mvp-integration.spec.ts", + "line": 619, + "column": 5 + }, + { + "title": "7.1 - 404 page exists", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "msedge", + "projectName": "msedge", + "results": [ + { + "workerIndex": 55, + "parallelIndex": 0, + "status": "failed", + "duration": 648, + "error": { + "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeTruthy\u001b[2m()\u001b[22m\n\nReceived: \u001b[31mfalse\u001b[39m", + "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeTruthy\u001b[2m()\u001b[22m\n\nReceived: \u001b[31mfalse\u001b[39m\n at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:616:37", + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 37, + "line": 616 + }, + "snippet": "\u001b[0m \u001b[90m 614 |\u001b[39m \u001b[36mconst\u001b[39m isRedirected \u001b[33m=\u001b[39m page\u001b[33m.\u001b[39murl()\u001b[33m.\u001b[39mincludes(\u001b[32m'login'\u001b[39m) \u001b[33m||\u001b[39m page\u001b[33m.\u001b[39murl() \u001b[33m===\u001b[39m \u001b[32m`${TEST_CONFIG.FRONTEND_URL}/`\u001b[39m\u001b[33m;\u001b[39m\n \u001b[90m 615 |\u001b[39m \n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 616 |\u001b[39m expect(is404 \u001b[33m||\u001b[39m isRedirected)\u001b[33m.\u001b[39mtoBeTruthy()\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 617 |\u001b[39m })\u001b[33m;\u001b[39m\n \u001b[90m 618 |\u001b[39m\n \u001b[90m 619 |\u001b[39m test(\u001b[32m'7.2 - Network error handling'\u001b[39m\u001b[33m,\u001b[39m \u001b[36masync\u001b[39m ({ page }) \u001b[33m=>\u001b[39m {\u001b[0m" + }, + "errors": [ + { + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 37, + "line": 616 + }, + "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeTruthy\u001b[2m()\u001b[22m\n\nReceived: \u001b[31mfalse\u001b[39m\n\n\u001b[0m \u001b[90m 614 |\u001b[39m \u001b[36mconst\u001b[39m isRedirected \u001b[33m=\u001b[39m page\u001b[33m.\u001b[39murl()\u001b[33m.\u001b[39mincludes(\u001b[32m'login'\u001b[39m) \u001b[33m||\u001b[39m page\u001b[33m.\u001b[39murl() \u001b[33m===\u001b[39m \u001b[32m`${TEST_CONFIG.FRONTEND_URL}/`\u001b[39m\u001b[33m;\u001b[39m\n \u001b[90m 615 |\u001b[39m \n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 616 |\u001b[39m expect(is404 \u001b[33m||\u001b[39m isRedirected)\u001b[33m.\u001b[39mtoBeTruthy()\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 617 |\u001b[39m })\u001b[33m;\u001b[39m\n \u001b[90m 618 |\u001b[39m\n \u001b[90m 619 |\u001b[39m test(\u001b[32m'7.2 - Network error handling'\u001b[39m\u001b[33m,\u001b[39m \u001b[36masync\u001b[39m ({ page }) \u001b[33m=>\u001b[39m {\u001b[0m\n\u001b[2m at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:616:37\u001b[22m" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:35:35.251Z", + "annotations": [], + "attachments": [ + { + "name": "screenshot", + "contentType": "image/png", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-8e28a-dling-7-1---404-page-exists-msedge/test-failed-1.png" + }, + { + "name": "video", + "contentType": "video/webm", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-8e28a-dling-7-1---404-page-exists-msedge/video.webm" + }, + { + "name": "error-context", + "contentType": "text/markdown", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-8e28a-dling-7-1---404-page-exists-msedge/error-context.md" + } + ], + "errorLocation": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 37, + "line": 616 + } + } + ], + "status": "unexpected" + } + ], + "id": "c50e3d8c82f89a880019-4ce7b8b8a7c2717a5495", + "file": "mvp-integration.spec.ts", + "line": 609, + "column": 5 + }, + { + "title": "7.2 - Network error handling", + "ok": true, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "msedge", + "projectName": "msedge", + "results": [ + { + "workerIndex": 56, + "parallelIndex": 0, + "status": "passed", + "duration": 2741, + "errors": [], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:35:36.624Z", + "annotations": [], + "attachments": [] + } + ], + "status": "expected" + } + ], + "id": "c50e3d8c82f89a880019-4dd49a5f611a907760fc", + "file": "mvp-integration.spec.ts", + "line": 619, + "column": 5 + } + ] + }, + { + "title": "8. Responsive Design", + "file": "mvp-integration.spec.ts", + "line": 638, + "column": 8, + "specs": [ + { + "title": "8.1 - Mobile viewport (375x667)", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "chromium", + "projectName": "chromium", + "results": [ + { + "workerIndex": 12, + "parallelIndex": 0, + "status": "timedOut", + "duration": 61643, + "error": { + "message": "\u001b[31mTest timeout of 60000ms exceeded while running \"beforeEach\" hook.\u001b[39m", + "stack": "\u001b[31mTest timeout of 60000ms exceeded while running \"beforeEach\" hook.\u001b[39m\n at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:640:10", + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 10, + "line": 640 + }, + "snippet": "\u001b[0m \u001b[90m 638 |\u001b[39m test\u001b[33m.\u001b[39mdescribe(\u001b[32m'8. Responsive Design'\u001b[39m\u001b[33m,\u001b[39m () \u001b[33m=>\u001b[39m {\n \u001b[90m 639 |\u001b[39m \n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 640 |\u001b[39m test\u001b[33m.\u001b[39mbeforeEach(\u001b[36masync\u001b[39m ({ page }) \u001b[33m=>\u001b[39m {\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 641 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mgoto(\u001b[32m`${TEST_CONFIG.FRONTEND_URL}/login`\u001b[39m)\u001b[33m;\u001b[39m\n \u001b[90m 642 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"email\"], input[name=\"email\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39memail)\u001b[33m;\u001b[39m\n \u001b[90m 643 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"password\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39mpassword)\u001b[33m;\u001b[39m\u001b[0m" + }, + "errors": [ + { + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 10, + "line": 640 + }, + "message": "\u001b[31mTest timeout of 60000ms exceeded while running \"beforeEach\" hook.\u001b[39m\n\n\u001b[0m \u001b[90m 638 |\u001b[39m test\u001b[33m.\u001b[39mdescribe(\u001b[32m'8. Responsive Design'\u001b[39m\u001b[33m,\u001b[39m () \u001b[33m=>\u001b[39m {\n \u001b[90m 639 |\u001b[39m \n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 640 |\u001b[39m test\u001b[33m.\u001b[39mbeforeEach(\u001b[36masync\u001b[39m ({ page }) \u001b[33m=>\u001b[39m {\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 641 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mgoto(\u001b[32m`${TEST_CONFIG.FRONTEND_URL}/login`\u001b[39m)\u001b[33m;\u001b[39m\n \u001b[90m 642 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"email\"], input[name=\"email\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39memail)\u001b[33m;\u001b[39m\n \u001b[90m 643 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"password\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39mpassword)\u001b[33m;\u001b[39m\u001b[0m\n\u001b[2m at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:640:10\u001b[22m" + }, + { + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 18, + "line": 642 + }, + "message": "Error: page.fill: Test timeout of 60000ms exceeded.\nCall log:\n\u001b[2m - waiting for locator('input[type=\"email\"], input[name=\"email\"]')\u001b[22m\n\n\n\u001b[0m \u001b[90m 640 |\u001b[39m test\u001b[33m.\u001b[39mbeforeEach(\u001b[36masync\u001b[39m ({ page }) \u001b[33m=>\u001b[39m {\n \u001b[90m 641 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mgoto(\u001b[32m`${TEST_CONFIG.FRONTEND_URL}/login`\u001b[39m)\u001b[33m;\u001b[39m\n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 642 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"email\"], input[name=\"email\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39memail)\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 643 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"password\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39mpassword)\u001b[33m;\u001b[39m\n \u001b[90m 644 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mclick(\u001b[32m'button[type=\"submit\"]'\u001b[39m)\u001b[33m;\u001b[39m\n \u001b[90m 645 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mwaitForURL(\u001b[35m/\\/(dashboard|home|app)/\u001b[39m\u001b[33m,\u001b[39m { timeout\u001b[33m:\u001b[39m \u001b[35m15000\u001b[39m })\u001b[33m;\u001b[39m\u001b[0m\n\u001b[2m at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:642:18\u001b[22m" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:26:47.206Z", + "annotations": [], + "attachments": [ + { + "name": "screenshot", + "contentType": "image/png", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-299e0----Mobile-viewport-375x667--chromium/test-failed-1.png" + }, + { + "name": "video", + "contentType": "video/webm", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-299e0----Mobile-viewport-375x667--chromium/video.webm" + }, + { + "name": "error-context", + "contentType": "text/markdown", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-299e0----Mobile-viewport-375x667--chromium/error-context.md" + } + ], + "errorLocation": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 10, + "line": 640 + } + } + ], + "status": "unexpected" + } + ], + "id": "c50e3d8c82f89a880019-8be1f6b740cd1dfb1f4b", + "file": "mvp-integration.spec.ts", + "line": 648, + "column": 5 + }, + { + "title": "8.2 - Tablet viewport (768x1024)", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "chromium", + "projectName": "chromium", + "results": [ + { + "workerIndex": 13, + "parallelIndex": 0, + "status": "timedOut", + "duration": 61707, + "error": { + "message": "\u001b[31mTest timeout of 60000ms exceeded while running \"beforeEach\" hook.\u001b[39m", + "stack": "\u001b[31mTest timeout of 60000ms exceeded while running \"beforeEach\" hook.\u001b[39m\n at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:640:10", + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 10, + "line": 640 + }, + "snippet": "\u001b[0m \u001b[90m 638 |\u001b[39m test\u001b[33m.\u001b[39mdescribe(\u001b[32m'8. Responsive Design'\u001b[39m\u001b[33m,\u001b[39m () \u001b[33m=>\u001b[39m {\n \u001b[90m 639 |\u001b[39m \n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 640 |\u001b[39m test\u001b[33m.\u001b[39mbeforeEach(\u001b[36masync\u001b[39m ({ page }) \u001b[33m=>\u001b[39m {\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 641 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mgoto(\u001b[32m`${TEST_CONFIG.FRONTEND_URL}/login`\u001b[39m)\u001b[33m;\u001b[39m\n \u001b[90m 642 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"email\"], input[name=\"email\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39memail)\u001b[33m;\u001b[39m\n \u001b[90m 643 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"password\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39mpassword)\u001b[33m;\u001b[39m\u001b[0m" + }, + "errors": [ + { + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 10, + "line": 640 + }, + "message": "\u001b[31mTest timeout of 60000ms exceeded while running \"beforeEach\" hook.\u001b[39m\n\n\u001b[0m \u001b[90m 638 |\u001b[39m test\u001b[33m.\u001b[39mdescribe(\u001b[32m'8. Responsive Design'\u001b[39m\u001b[33m,\u001b[39m () \u001b[33m=>\u001b[39m {\n \u001b[90m 639 |\u001b[39m \n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 640 |\u001b[39m test\u001b[33m.\u001b[39mbeforeEach(\u001b[36masync\u001b[39m ({ page }) \u001b[33m=>\u001b[39m {\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 641 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mgoto(\u001b[32m`${TEST_CONFIG.FRONTEND_URL}/login`\u001b[39m)\u001b[33m;\u001b[39m\n \u001b[90m 642 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"email\"], input[name=\"email\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39memail)\u001b[33m;\u001b[39m\n \u001b[90m 643 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"password\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39mpassword)\u001b[33m;\u001b[39m\u001b[0m\n\u001b[2m at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:640:10\u001b[22m" + }, + { + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 18, + "line": 642 + }, + "message": "Error: page.fill: Test timeout of 60000ms exceeded.\nCall log:\n\u001b[2m - waiting for locator('input[type=\"email\"], input[name=\"email\"]')\u001b[22m\n\n\n\u001b[0m \u001b[90m 640 |\u001b[39m test\u001b[33m.\u001b[39mbeforeEach(\u001b[36masync\u001b[39m ({ page }) \u001b[33m=>\u001b[39m {\n \u001b[90m 641 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mgoto(\u001b[32m`${TEST_CONFIG.FRONTEND_URL}/login`\u001b[39m)\u001b[33m;\u001b[39m\n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 642 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"email\"], input[name=\"email\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39memail)\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 643 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"password\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39mpassword)\u001b[33m;\u001b[39m\n \u001b[90m 644 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mclick(\u001b[32m'button[type=\"submit\"]'\u001b[39m)\u001b[33m;\u001b[39m\n \u001b[90m 645 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mwaitForURL(\u001b[35m/\\/(dashboard|home|app)/\u001b[39m\u001b[33m,\u001b[39m { timeout\u001b[33m:\u001b[39m \u001b[35m15000\u001b[39m })\u001b[33m;\u001b[39m\u001b[0m\n\u001b[2m at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:642:18\u001b[22m" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:27:49.470Z", + "annotations": [], + "attachments": [ + { + "name": "screenshot", + "contentType": "image/png", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-c81b2---Tablet-viewport-768x1024--chromium/test-failed-1.png" + }, + { + "name": "video", + "contentType": "video/webm", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-c81b2---Tablet-viewport-768x1024--chromium/video.webm" + }, + { + "name": "error-context", + "contentType": "text/markdown", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-c81b2---Tablet-viewport-768x1024--chromium/error-context.md" + } + ], + "errorLocation": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 10, + "line": 640 + } + } + ], + "status": "unexpected" + } + ], + "id": "c50e3d8c82f89a880019-478fa28143116d8e9e21", + "file": "mvp-integration.spec.ts", + "line": 658, + "column": 5 + }, + { + "title": "8.3 - Desktop viewport (1920x1080)", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "chromium", + "projectName": "chromium", + "results": [ + { + "workerIndex": 14, + "parallelIndex": 0, + "status": "timedOut", + "duration": 61675, + "error": { + "message": "\u001b[31mTest timeout of 60000ms exceeded while running \"beforeEach\" hook.\u001b[39m", + "stack": "\u001b[31mTest timeout of 60000ms exceeded while running \"beforeEach\" hook.\u001b[39m\n at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:640:10", + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 10, + "line": 640 + }, + "snippet": "\u001b[0m \u001b[90m 638 |\u001b[39m test\u001b[33m.\u001b[39mdescribe(\u001b[32m'8. Responsive Design'\u001b[39m\u001b[33m,\u001b[39m () \u001b[33m=>\u001b[39m {\n \u001b[90m 639 |\u001b[39m \n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 640 |\u001b[39m test\u001b[33m.\u001b[39mbeforeEach(\u001b[36masync\u001b[39m ({ page }) \u001b[33m=>\u001b[39m {\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 641 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mgoto(\u001b[32m`${TEST_CONFIG.FRONTEND_URL}/login`\u001b[39m)\u001b[33m;\u001b[39m\n \u001b[90m 642 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"email\"], input[name=\"email\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39memail)\u001b[33m;\u001b[39m\n \u001b[90m 643 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"password\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39mpassword)\u001b[33m;\u001b[39m\u001b[0m" + }, + "errors": [ + { + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 10, + "line": 640 + }, + "message": "\u001b[31mTest timeout of 60000ms exceeded while running \"beforeEach\" hook.\u001b[39m\n\n\u001b[0m \u001b[90m 638 |\u001b[39m test\u001b[33m.\u001b[39mdescribe(\u001b[32m'8. Responsive Design'\u001b[39m\u001b[33m,\u001b[39m () \u001b[33m=>\u001b[39m {\n \u001b[90m 639 |\u001b[39m \n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 640 |\u001b[39m test\u001b[33m.\u001b[39mbeforeEach(\u001b[36masync\u001b[39m ({ page }) \u001b[33m=>\u001b[39m {\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 641 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mgoto(\u001b[32m`${TEST_CONFIG.FRONTEND_URL}/login`\u001b[39m)\u001b[33m;\u001b[39m\n \u001b[90m 642 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"email\"], input[name=\"email\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39memail)\u001b[33m;\u001b[39m\n \u001b[90m 643 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"password\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39mpassword)\u001b[33m;\u001b[39m\u001b[0m\n\u001b[2m at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:640:10\u001b[22m" + }, + { + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 18, + "line": 642 + }, + "message": "Error: page.fill: Test timeout of 60000ms exceeded.\nCall log:\n\u001b[2m - waiting for locator('input[type=\"email\"], input[name=\"email\"]')\u001b[22m\n\n\n\u001b[0m \u001b[90m 640 |\u001b[39m test\u001b[33m.\u001b[39mbeforeEach(\u001b[36masync\u001b[39m ({ page }) \u001b[33m=>\u001b[39m {\n \u001b[90m 641 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mgoto(\u001b[32m`${TEST_CONFIG.FRONTEND_URL}/login`\u001b[39m)\u001b[33m;\u001b[39m\n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 642 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"email\"], input[name=\"email\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39memail)\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 643 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"password\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39mpassword)\u001b[33m;\u001b[39m\n \u001b[90m 644 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mclick(\u001b[32m'button[type=\"submit\"]'\u001b[39m)\u001b[33m;\u001b[39m\n \u001b[90m 645 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mwaitForURL(\u001b[35m/\\/(dashboard|home|app)/\u001b[39m\u001b[33m,\u001b[39m { timeout\u001b[33m:\u001b[39m \u001b[35m15000\u001b[39m })\u001b[33m;\u001b[39m\u001b[0m\n\u001b[2m at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:642:18\u001b[22m" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:28:51.870Z", + "annotations": [], + "attachments": [ + { + "name": "screenshot", + "contentType": "image/png", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-c9b49-Desktop-viewport-1920x1080--chromium/test-failed-1.png" + }, + { + "name": "video", + "contentType": "video/webm", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-c9b49-Desktop-viewport-1920x1080--chromium/video.webm" + }, + { + "name": "error-context", + "contentType": "text/markdown", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-c9b49-Desktop-viewport-1920x1080--chromium/error-context.md" + } + ], + "errorLocation": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 10, + "line": 640 + } + } + ], + "status": "unexpected" + } + ], + "id": "c50e3d8c82f89a880019-f6b77f1b142982acb686", + "file": "mvp-integration.spec.ts", + "line": 667, + "column": 5 + }, + { + "title": "8.1 - Mobile viewport (375x667)", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "firefox", + "projectName": "firefox", + "results": [ + { + "workerIndex": 27, + "parallelIndex": 0, + "status": "failed", + "duration": 1299, + "error": { + "message": "Error: page.waitForURL: NS_ERROR_FAILURE\n=========================== logs ===========================\nwaiting for navigation until \"load\"\n============================================================", + "stack": "Error: page.waitForURL: NS_ERROR_FAILURE\n=========================== logs ===========================\nwaiting for navigation until \"load\"\n============================================================\n at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:645:18", + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 18, + "line": 645 + }, + "snippet": "\u001b[0m \u001b[90m 643 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"password\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39mpassword)\u001b[33m;\u001b[39m\n \u001b[90m 644 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mclick(\u001b[32m'button[type=\"submit\"]'\u001b[39m)\u001b[33m;\u001b[39m\n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 645 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mwaitForURL(\u001b[35m/\\/(dashboard|home|app)/\u001b[39m\u001b[33m,\u001b[39m { timeout\u001b[33m:\u001b[39m \u001b[35m15000\u001b[39m })\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 646 |\u001b[39m })\u001b[33m;\u001b[39m\n \u001b[90m 647 |\u001b[39m\n \u001b[90m 648 |\u001b[39m test(\u001b[32m'8.1 - Mobile viewport (375x667)'\u001b[39m\u001b[33m,\u001b[39m \u001b[36masync\u001b[39m ({ page }) \u001b[33m=>\u001b[39m {\u001b[0m" + }, + "errors": [ + { + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 18, + "line": 645 + }, + "message": "Error: page.waitForURL: NS_ERROR_FAILURE\n=========================== logs ===========================\nwaiting for navigation until \"load\"\n============================================================\n\n\u001b[0m \u001b[90m 643 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"password\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39mpassword)\u001b[33m;\u001b[39m\n \u001b[90m 644 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mclick(\u001b[32m'button[type=\"submit\"]'\u001b[39m)\u001b[33m;\u001b[39m\n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 645 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mwaitForURL(\u001b[35m/\\/(dashboard|home|app)/\u001b[39m\u001b[33m,\u001b[39m { timeout\u001b[33m:\u001b[39m \u001b[35m15000\u001b[39m })\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 646 |\u001b[39m })\u001b[33m;\u001b[39m\n \u001b[90m 647 |\u001b[39m\n \u001b[90m 648 |\u001b[39m test(\u001b[32m'8.1 - Mobile viewport (375x667)'\u001b[39m\u001b[33m,\u001b[39m \u001b[36masync\u001b[39m ({ page }) \u001b[33m=>\u001b[39m {\u001b[0m\n\u001b[2m at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:645:18\u001b[22m" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:34:18.120Z", + "annotations": [], + "attachments": [ + { + "name": "screenshot", + "contentType": "image/png", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-299e0----Mobile-viewport-375x667--firefox/test-failed-1.png" + }, + { + "name": "video", + "contentType": "video/webm", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-299e0----Mobile-viewport-375x667--firefox/video.webm" + } + ], + "errorLocation": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 18, + "line": 645 + } + } + ], + "status": "unexpected" + } + ], + "id": "c50e3d8c82f89a880019-bec7aa72d785fcd47483", + "file": "mvp-integration.spec.ts", + "line": 648, + "column": 5 + }, + { + "title": "8.2 - Tablet viewport (768x1024)", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "firefox", + "projectName": "firefox", + "results": [ + { + "workerIndex": 28, + "parallelIndex": 0, + "status": "failed", + "duration": 16709, + "error": { + "message": "TimeoutError: page.waitForURL: Timeout 15000ms exceeded.\n=========================== logs ===========================\nwaiting for navigation until \"load\"\n navigated to \"http://localhost:5173/login\"\n navigated to \"http://localhost:5173/login\"\n============================================================", + "stack": "TimeoutError: page.waitForURL: Timeout 15000ms exceeded.\n=========================== logs ===========================\nwaiting for navigation until \"load\"\n navigated to \"http://localhost:5173/login\"\n navigated to \"http://localhost:5173/login\"\n============================================================\n at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:645:18", + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 18, + "line": 645 + }, + "snippet": "\u001b[0m \u001b[90m 643 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"password\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39mpassword)\u001b[33m;\u001b[39m\n \u001b[90m 644 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mclick(\u001b[32m'button[type=\"submit\"]'\u001b[39m)\u001b[33m;\u001b[39m\n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 645 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mwaitForURL(\u001b[35m/\\/(dashboard|home|app)/\u001b[39m\u001b[33m,\u001b[39m { timeout\u001b[33m:\u001b[39m \u001b[35m15000\u001b[39m })\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 646 |\u001b[39m })\u001b[33m;\u001b[39m\n \u001b[90m 647 |\u001b[39m\n \u001b[90m 648 |\u001b[39m test(\u001b[32m'8.1 - Mobile viewport (375x667)'\u001b[39m\u001b[33m,\u001b[39m \u001b[36masync\u001b[39m ({ page }) \u001b[33m=>\u001b[39m {\u001b[0m" + }, + "errors": [ + { + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 18, + "line": 645 + }, + "message": "TimeoutError: page.waitForURL: Timeout 15000ms exceeded.\n=========================== logs ===========================\nwaiting for navigation until \"load\"\n navigated to \"http://localhost:5173/login\"\n navigated to \"http://localhost:5173/login\"\n============================================================\n\n\u001b[0m \u001b[90m 643 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"password\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39mpassword)\u001b[33m;\u001b[39m\n \u001b[90m 644 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mclick(\u001b[32m'button[type=\"submit\"]'\u001b[39m)\u001b[33m;\u001b[39m\n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 645 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mwaitForURL(\u001b[35m/\\/(dashboard|home|app)/\u001b[39m\u001b[33m,\u001b[39m { timeout\u001b[33m:\u001b[39m \u001b[35m15000\u001b[39m })\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 646 |\u001b[39m })\u001b[33m;\u001b[39m\n \u001b[90m 647 |\u001b[39m\n \u001b[90m 648 |\u001b[39m test(\u001b[32m'8.1 - Mobile viewport (375x667)'\u001b[39m\u001b[33m,\u001b[39m \u001b[36masync\u001b[39m ({ page }) \u001b[33m=>\u001b[39m {\u001b[0m\n\u001b[2m at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:645:18\u001b[22m" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:34:20.370Z", + "annotations": [], + "attachments": [ + { + "name": "screenshot", + "contentType": "image/png", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-c81b2---Tablet-viewport-768x1024--firefox/test-failed-1.png" + }, + { + "name": "video", + "contentType": "video/webm", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-c81b2---Tablet-viewport-768x1024--firefox/video.webm" + }, + { + "name": "error-context", + "contentType": "text/markdown", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-c81b2---Tablet-viewport-768x1024--firefox/error-context.md" + } + ], + "errorLocation": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 18, + "line": 645 + } + } + ], + "status": "unexpected" + } + ], + "id": "c50e3d8c82f89a880019-1560edf6cc4a7287533e", + "file": "mvp-integration.spec.ts", + "line": 658, + "column": 5 + }, + { + "title": "8.3 - Desktop viewport (1920x1080)", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "firefox", + "projectName": "firefox", + "results": [ + { + "workerIndex": 29, + "parallelIndex": 0, + "status": "failed", + "duration": 16717, + "error": { + "message": "TimeoutError: page.waitForURL: Timeout 15000ms exceeded.\n=========================== logs ===========================\nwaiting for navigation until \"load\"\n navigated to \"http://localhost:5173/login\"\n navigated to \"http://localhost:5173/login\"\n============================================================", + "stack": "TimeoutError: page.waitForURL: Timeout 15000ms exceeded.\n=========================== logs ===========================\nwaiting for navigation until \"load\"\n navigated to \"http://localhost:5173/login\"\n navigated to \"http://localhost:5173/login\"\n============================================================\n at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:645:18", + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 18, + "line": 645 + }, + "snippet": "\u001b[0m \u001b[90m 643 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"password\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39mpassword)\u001b[33m;\u001b[39m\n \u001b[90m 644 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mclick(\u001b[32m'button[type=\"submit\"]'\u001b[39m)\u001b[33m;\u001b[39m\n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 645 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mwaitForURL(\u001b[35m/\\/(dashboard|home|app)/\u001b[39m\u001b[33m,\u001b[39m { timeout\u001b[33m:\u001b[39m \u001b[35m15000\u001b[39m })\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 646 |\u001b[39m })\u001b[33m;\u001b[39m\n \u001b[90m 647 |\u001b[39m\n \u001b[90m 648 |\u001b[39m test(\u001b[32m'8.1 - Mobile viewport (375x667)'\u001b[39m\u001b[33m,\u001b[39m \u001b[36masync\u001b[39m ({ page }) \u001b[33m=>\u001b[39m {\u001b[0m" + }, + "errors": [ + { + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 18, + "line": 645 + }, + "message": "TimeoutError: page.waitForURL: Timeout 15000ms exceeded.\n=========================== logs ===========================\nwaiting for navigation until \"load\"\n navigated to \"http://localhost:5173/login\"\n navigated to \"http://localhost:5173/login\"\n============================================================\n\n\u001b[0m \u001b[90m 643 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"password\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39mpassword)\u001b[33m;\u001b[39m\n \u001b[90m 644 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mclick(\u001b[32m'button[type=\"submit\"]'\u001b[39m)\u001b[33m;\u001b[39m\n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 645 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mwaitForURL(\u001b[35m/\\/(dashboard|home|app)/\u001b[39m\u001b[33m,\u001b[39m { timeout\u001b[33m:\u001b[39m \u001b[35m15000\u001b[39m })\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 646 |\u001b[39m })\u001b[33m;\u001b[39m\n \u001b[90m 647 |\u001b[39m\n \u001b[90m 648 |\u001b[39m test(\u001b[32m'8.1 - Mobile viewport (375x667)'\u001b[39m\u001b[33m,\u001b[39m \u001b[36masync\u001b[39m ({ page }) \u001b[33m=>\u001b[39m {\u001b[0m\n\u001b[2m at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:645:18\u001b[22m" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:34:38.384Z", + "annotations": [], + "attachments": [ + { + "name": "screenshot", + "contentType": "image/png", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-c9b49-Desktop-viewport-1920x1080--firefox/test-failed-1.png" + }, + { + "name": "video", + "contentType": "video/webm", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-c9b49-Desktop-viewport-1920x1080--firefox/video.webm" + }, + { + "name": "error-context", + "contentType": "text/markdown", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-c9b49-Desktop-viewport-1920x1080--firefox/error-context.md" + } + ], + "errorLocation": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 18, + "line": 645 + } + } + ], + "status": "unexpected" + } + ], + "id": "c50e3d8c82f89a880019-7eee3a86331fe7867c3c", + "file": "mvp-integration.spec.ts", + "line": 667, + "column": 5 + }, + { + "title": "8.1 - Mobile viewport (375x667)", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "webkit", + "projectName": "webkit", + "results": [ + { + "workerIndex": 49, + "parallelIndex": 0, + "status": "failed", + "duration": 2, + "error": { + "message": "Error: browserType.launch: \nโ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—\nโ•‘ Host system is missing dependencies to run browsers. โ•‘\nโ•‘ Please install them with the following command: โ•‘\nโ•‘ โ•‘\nโ•‘ sudo npx playwright install-deps โ•‘\nโ•‘ โ•‘\nโ•‘ Alternatively, use apt: โ•‘\nโ•‘ sudo apt-get install libicu74\\ โ•‘\nโ•‘ libjpeg-turbo8\\ โ•‘\nโ•‘ gstreamer1.0-libav โ•‘\nโ•‘ โ•‘\nโ•‘ <3 Playwright Team โ•‘\nโ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•", + "stack": "Error: browserType.launch: \nโ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—\nโ•‘ Host system is missing dependencies to run browsers. โ•‘\nโ•‘ Please install them with the following command: โ•‘\nโ•‘ โ•‘\nโ•‘ sudo npx playwright install-deps โ•‘\nโ•‘ โ•‘\nโ•‘ Alternatively, use apt: โ•‘\nโ•‘ sudo apt-get install libicu74\\ โ•‘\nโ•‘ libjpeg-turbo8\\ โ•‘\nโ•‘ gstreamer1.0-libav โ•‘\nโ•‘ โ•‘\nโ•‘ <3 Playwright Team โ•‘\nโ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•" + }, + "errors": [ + { + "message": "Error: browserType.launch: \nโ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—\nโ•‘ Host system is missing dependencies to run browsers. โ•‘\nโ•‘ Please install them with the following command: โ•‘\nโ•‘ โ•‘\nโ•‘ sudo npx playwright install-deps โ•‘\nโ•‘ โ•‘\nโ•‘ Alternatively, use apt: โ•‘\nโ•‘ sudo apt-get install libicu74\\ โ•‘\nโ•‘ libjpeg-turbo8\\ โ•‘\nโ•‘ gstreamer1.0-libav โ•‘\nโ•‘ โ•‘\nโ•‘ <3 Playwright Team โ•‘\nโ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:35:10.198Z", + "annotations": [], + "attachments": [] + } + ], + "status": "unexpected" + } + ], + "id": "c50e3d8c82f89a880019-996a6d0b75012ff27755", + "file": "mvp-integration.spec.ts", + "line": 648, + "column": 5 + }, + { + "title": "8.2 - Tablet viewport (768x1024)", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "webkit", + "projectName": "webkit", + "results": [ + { + "workerIndex": 50, + "parallelIndex": 0, + "status": "failed", + "duration": 2, + "error": { + "message": "Error: browserType.launch: \nโ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—\nโ•‘ Host system is missing dependencies to run browsers. โ•‘\nโ•‘ Please install them with the following command: โ•‘\nโ•‘ โ•‘\nโ•‘ sudo npx playwright install-deps โ•‘\nโ•‘ โ•‘\nโ•‘ Alternatively, use apt: โ•‘\nโ•‘ sudo apt-get install libicu74\\ โ•‘\nโ•‘ libjpeg-turbo8\\ โ•‘\nโ•‘ gstreamer1.0-libav โ•‘\nโ•‘ โ•‘\nโ•‘ <3 Playwright Team โ•‘\nโ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•", + "stack": "Error: browserType.launch: \nโ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—\nโ•‘ Host system is missing dependencies to run browsers. โ•‘\nโ•‘ Please install them with the following command: โ•‘\nโ•‘ โ•‘\nโ•‘ sudo npx playwright install-deps โ•‘\nโ•‘ โ•‘\nโ•‘ Alternatively, use apt: โ•‘\nโ•‘ sudo apt-get install libicu74\\ โ•‘\nโ•‘ libjpeg-turbo8\\ โ•‘\nโ•‘ gstreamer1.0-libav โ•‘\nโ•‘ โ•‘\nโ•‘ <3 Playwright Team โ•‘\nโ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•" + }, + "errors": [ + { + "message": "Error: browserType.launch: \nโ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—\nโ•‘ Host system is missing dependencies to run browsers. โ•‘\nโ•‘ Please install them with the following command: โ•‘\nโ•‘ โ•‘\nโ•‘ sudo npx playwright install-deps โ•‘\nโ•‘ โ•‘\nโ•‘ Alternatively, use apt: โ•‘\nโ•‘ sudo apt-get install libicu74\\ โ•‘\nโ•‘ libjpeg-turbo8\\ โ•‘\nโ•‘ gstreamer1.0-libav โ•‘\nโ•‘ โ•‘\nโ•‘ <3 Playwright Team โ•‘\nโ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:35:10.914Z", + "annotations": [], + "attachments": [] + } + ], + "status": "unexpected" + } + ], + "id": "c50e3d8c82f89a880019-725f24caa87a4419e94a", + "file": "mvp-integration.spec.ts", + "line": 658, + "column": 5 + }, + { + "title": "8.3 - Desktop viewport (1920x1080)", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "webkit", + "projectName": "webkit", + "results": [ + { + "workerIndex": 51, + "parallelIndex": 0, + "status": "failed", + "duration": 2, + "error": { + "message": "Error: browserType.launch: \nโ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—\nโ•‘ Host system is missing dependencies to run browsers. โ•‘\nโ•‘ Please install them with the following command: โ•‘\nโ•‘ โ•‘\nโ•‘ sudo npx playwright install-deps โ•‘\nโ•‘ โ•‘\nโ•‘ Alternatively, use apt: โ•‘\nโ•‘ sudo apt-get install libicu74\\ โ•‘\nโ•‘ libjpeg-turbo8\\ โ•‘\nโ•‘ gstreamer1.0-libav โ•‘\nโ•‘ โ•‘\nโ•‘ <3 Playwright Team โ•‘\nโ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•", + "stack": "Error: browserType.launch: \nโ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—\nโ•‘ Host system is missing dependencies to run browsers. โ•‘\nโ•‘ Please install them with the following command: โ•‘\nโ•‘ โ•‘\nโ•‘ sudo npx playwright install-deps โ•‘\nโ•‘ โ•‘\nโ•‘ Alternatively, use apt: โ•‘\nโ•‘ sudo apt-get install libicu74\\ โ•‘\nโ•‘ libjpeg-turbo8\\ โ•‘\nโ•‘ gstreamer1.0-libav โ•‘\nโ•‘ โ•‘\nโ•‘ <3 Playwright Team โ•‘\nโ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•" + }, + "errors": [ + { + "message": "Error: browserType.launch: \nโ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—\nโ•‘ Host system is missing dependencies to run browsers. โ•‘\nโ•‘ Please install them with the following command: โ•‘\nโ•‘ โ•‘\nโ•‘ sudo npx playwright install-deps โ•‘\nโ•‘ โ•‘\nโ•‘ Alternatively, use apt: โ•‘\nโ•‘ sudo apt-get install libicu74\\ โ•‘\nโ•‘ libjpeg-turbo8\\ โ•‘\nโ•‘ gstreamer1.0-libav โ•‘\nโ•‘ โ•‘\nโ•‘ <3 Playwright Team โ•‘\nโ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:35:11.640Z", + "annotations": [], + "attachments": [] + } + ], + "status": "unexpected" + } + ], + "id": "c50e3d8c82f89a880019-50f602f03238fa0c3494", + "file": "mvp-integration.spec.ts", + "line": 667, + "column": 5 + }, + { + "title": "8.1 - Mobile viewport (375x667)", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "msedge", + "projectName": "msedge", + "results": [ + { + "workerIndex": 56, + "parallelIndex": 0, + "status": "failed", + "duration": 16333, + "error": { + "message": "TimeoutError: page.waitForURL: Timeout 15000ms exceeded.\n=========================== logs ===========================\nwaiting for navigation until \"load\"\n navigated to \"http://localhost:5173/login\"\n============================================================", + "stack": "TimeoutError: page.waitForURL: Timeout 15000ms exceeded.\n=========================== logs ===========================\nwaiting for navigation until \"load\"\n navigated to \"http://localhost:5173/login\"\n============================================================\n at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:645:18", + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 18, + "line": 645 + }, + "snippet": "\u001b[0m \u001b[90m 643 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"password\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39mpassword)\u001b[33m;\u001b[39m\n \u001b[90m 644 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mclick(\u001b[32m'button[type=\"submit\"]'\u001b[39m)\u001b[33m;\u001b[39m\n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 645 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mwaitForURL(\u001b[35m/\\/(dashboard|home|app)/\u001b[39m\u001b[33m,\u001b[39m { timeout\u001b[33m:\u001b[39m \u001b[35m15000\u001b[39m })\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 646 |\u001b[39m })\u001b[33m;\u001b[39m\n \u001b[90m 647 |\u001b[39m\n \u001b[90m 648 |\u001b[39m test(\u001b[32m'8.1 - Mobile viewport (375x667)'\u001b[39m\u001b[33m,\u001b[39m \u001b[36masync\u001b[39m ({ page }) \u001b[33m=>\u001b[39m {\u001b[0m" + }, + "errors": [ + { + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 18, + "line": 645 + }, + "message": "TimeoutError: page.waitForURL: Timeout 15000ms exceeded.\n=========================== logs ===========================\nwaiting for navigation until \"load\"\n navigated to \"http://localhost:5173/login\"\n============================================================\n\n\u001b[0m \u001b[90m 643 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"password\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39mpassword)\u001b[33m;\u001b[39m\n \u001b[90m 644 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mclick(\u001b[32m'button[type=\"submit\"]'\u001b[39m)\u001b[33m;\u001b[39m\n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 645 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mwaitForURL(\u001b[35m/\\/(dashboard|home|app)/\u001b[39m\u001b[33m,\u001b[39m { timeout\u001b[33m:\u001b[39m \u001b[35m15000\u001b[39m })\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 646 |\u001b[39m })\u001b[33m;\u001b[39m\n \u001b[90m 647 |\u001b[39m\n \u001b[90m 648 |\u001b[39m test(\u001b[32m'8.1 - Mobile viewport (375x667)'\u001b[39m\u001b[33m,\u001b[39m \u001b[36masync\u001b[39m ({ page }) \u001b[33m=>\u001b[39m {\u001b[0m\n\u001b[2m at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:645:18\u001b[22m" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:35:39.444Z", + "annotations": [], + "attachments": [ + { + "name": "screenshot", + "contentType": "image/png", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-299e0----Mobile-viewport-375x667--msedge/test-failed-1.png" + }, + { + "name": "video", + "contentType": "video/webm", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-299e0----Mobile-viewport-375x667--msedge/video.webm" + }, + { + "name": "error-context", + "contentType": "text/markdown", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-299e0----Mobile-viewport-375x667--msedge/error-context.md" + } + ], + "errorLocation": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 18, + "line": 645 + } + } + ], + "status": "unexpected" + } + ], + "id": "c50e3d8c82f89a880019-7aea3d0e8727f9a28654", + "file": "mvp-integration.spec.ts", + "line": 648, + "column": 5 + }, + { + "title": "8.2 - Tablet viewport (768x1024)", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "msedge", + "projectName": "msedge", + "results": [ + { + "workerIndex": 57, + "parallelIndex": 0, + "status": "failed", + "duration": 16449, + "error": { + "message": "TimeoutError: page.waitForURL: Timeout 15000ms exceeded.\n=========================== logs ===========================\nwaiting for navigation until \"load\"\n navigated to \"http://localhost:5173/login\"\n============================================================", + "stack": "TimeoutError: page.waitForURL: Timeout 15000ms exceeded.\n=========================== logs ===========================\nwaiting for navigation until \"load\"\n navigated to \"http://localhost:5173/login\"\n============================================================\n at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:645:18", + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 18, + "line": 645 + }, + "snippet": "\u001b[0m \u001b[90m 643 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"password\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39mpassword)\u001b[33m;\u001b[39m\n \u001b[90m 644 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mclick(\u001b[32m'button[type=\"submit\"]'\u001b[39m)\u001b[33m;\u001b[39m\n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 645 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mwaitForURL(\u001b[35m/\\/(dashboard|home|app)/\u001b[39m\u001b[33m,\u001b[39m { timeout\u001b[33m:\u001b[39m \u001b[35m15000\u001b[39m })\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 646 |\u001b[39m })\u001b[33m;\u001b[39m\n \u001b[90m 647 |\u001b[39m\n \u001b[90m 648 |\u001b[39m test(\u001b[32m'8.1 - Mobile viewport (375x667)'\u001b[39m\u001b[33m,\u001b[39m \u001b[36masync\u001b[39m ({ page }) \u001b[33m=>\u001b[39m {\u001b[0m" + }, + "errors": [ + { + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 18, + "line": 645 + }, + "message": "TimeoutError: page.waitForURL: Timeout 15000ms exceeded.\n=========================== logs ===========================\nwaiting for navigation until \"load\"\n navigated to \"http://localhost:5173/login\"\n============================================================\n\n\u001b[0m \u001b[90m 643 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"password\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39mpassword)\u001b[33m;\u001b[39m\n \u001b[90m 644 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mclick(\u001b[32m'button[type=\"submit\"]'\u001b[39m)\u001b[33m;\u001b[39m\n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 645 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mwaitForURL(\u001b[35m/\\/(dashboard|home|app)/\u001b[39m\u001b[33m,\u001b[39m { timeout\u001b[33m:\u001b[39m \u001b[35m15000\u001b[39m })\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 646 |\u001b[39m })\u001b[33m;\u001b[39m\n \u001b[90m 647 |\u001b[39m\n \u001b[90m 648 |\u001b[39m test(\u001b[32m'8.1 - Mobile viewport (375x667)'\u001b[39m\u001b[33m,\u001b[39m \u001b[36masync\u001b[39m ({ page }) \u001b[33m=>\u001b[39m {\u001b[0m\n\u001b[2m at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:645:18\u001b[22m" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:35:56.359Z", + "annotations": [], + "attachments": [ + { + "name": "screenshot", + "contentType": "image/png", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-c81b2---Tablet-viewport-768x1024--msedge/test-failed-1.png" + }, + { + "name": "video", + "contentType": "video/webm", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-c81b2---Tablet-viewport-768x1024--msedge/video.webm" + }, + { + "name": "error-context", + "contentType": "text/markdown", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-c81b2---Tablet-viewport-768x1024--msedge/error-context.md" + } + ], + "errorLocation": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 18, + "line": 645 + } + } + ], + "status": "unexpected" + } + ], + "id": "c50e3d8c82f89a880019-66e7c8b0bfaf038f253d", + "file": "mvp-integration.spec.ts", + "line": 658, + "column": 5 + }, + { + "title": "8.3 - Desktop viewport (1920x1080)", + "ok": false, + "tags": [], + "tests": [ + { + "timeout": 60000, + "annotations": [], + "expectedStatus": "passed", + "projectId": "msedge", + "projectName": "msedge", + "results": [ + { + "workerIndex": 58, + "parallelIndex": 0, + "status": "failed", + "duration": 16337, + "error": { + "message": "TimeoutError: page.waitForURL: Timeout 15000ms exceeded.\n=========================== logs ===========================\nwaiting for navigation until \"load\"\n navigated to \"http://localhost:5173/login\"\n============================================================", + "stack": "TimeoutError: page.waitForURL: Timeout 15000ms exceeded.\n=========================== logs ===========================\nwaiting for navigation until \"load\"\n navigated to \"http://localhost:5173/login\"\n============================================================\n at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:645:18", + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 18, + "line": 645 + }, + "snippet": "\u001b[0m \u001b[90m 643 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"password\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39mpassword)\u001b[33m;\u001b[39m\n \u001b[90m 644 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mclick(\u001b[32m'button[type=\"submit\"]'\u001b[39m)\u001b[33m;\u001b[39m\n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 645 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mwaitForURL(\u001b[35m/\\/(dashboard|home|app)/\u001b[39m\u001b[33m,\u001b[39m { timeout\u001b[33m:\u001b[39m \u001b[35m15000\u001b[39m })\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 646 |\u001b[39m })\u001b[33m;\u001b[39m\n \u001b[90m 647 |\u001b[39m\n \u001b[90m 648 |\u001b[39m test(\u001b[32m'8.1 - Mobile viewport (375x667)'\u001b[39m\u001b[33m,\u001b[39m \u001b[36masync\u001b[39m ({ page }) \u001b[33m=>\u001b[39m {\u001b[0m" + }, + "errors": [ + { + "location": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 18, + "line": 645 + }, + "message": "TimeoutError: page.waitForURL: Timeout 15000ms exceeded.\n=========================== logs ===========================\nwaiting for navigation until \"load\"\n navigated to \"http://localhost:5173/login\"\n============================================================\n\n\u001b[0m \u001b[90m 643 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mfill(\u001b[32m'input[type=\"password\"]'\u001b[39m\u001b[33m,\u001b[39m \u001b[33mTEST_USER\u001b[39m\u001b[33m.\u001b[39mpassword)\u001b[33m;\u001b[39m\n \u001b[90m 644 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mclick(\u001b[32m'button[type=\"submit\"]'\u001b[39m)\u001b[33m;\u001b[39m\n\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 645 |\u001b[39m \u001b[36mawait\u001b[39m page\u001b[33m.\u001b[39mwaitForURL(\u001b[35m/\\/(dashboard|home|app)/\u001b[39m\u001b[33m,\u001b[39m { timeout\u001b[33m:\u001b[39m \u001b[35m15000\u001b[39m })\u001b[33m;\u001b[39m\n \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\n \u001b[90m 646 |\u001b[39m })\u001b[33m;\u001b[39m\n \u001b[90m 647 |\u001b[39m\n \u001b[90m 648 |\u001b[39m test(\u001b[32m'8.1 - Mobile viewport (375x667)'\u001b[39m\u001b[33m,\u001b[39m \u001b[36masync\u001b[39m ({ page }) \u001b[33m=>\u001b[39m {\u001b[0m\n\u001b[2m at /home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts:645:18\u001b[22m" + } + ], + "stdout": [], + "stderr": [], + "retry": 0, + "startTime": "2026-01-03T20:36:13.461Z", + "annotations": [], + "attachments": [ + { + "name": "screenshot", + "contentType": "image/png", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-c9b49-Desktop-viewport-1920x1080--msedge/test-failed-1.png" + }, + { + "name": "video", + "contentType": "video/webm", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-c9b49-Desktop-viewport-1920x1080--msedge/video.webm" + }, + { + "name": "error-context", + "contentType": "text/markdown", + "path": "/home/senke/git/talas/veza/apps/web/test-results/mvp-integration-MVP-Integr-c9b49-Desktop-viewport-1920x1080--msedge/error-context.md" + } + ], + "errorLocation": { + "file": "/home/senke/git/talas/veza/apps/web/e2e/mvp-integration.spec.ts", + "column": 18, + "line": 645 + } + } + ], + "status": "unexpected" + } + ], + "id": "c50e3d8c82f89a880019-24ffdadc4a1a30e0002e", + "file": "mvp-integration.spec.ts", + "line": 667, + "column": 5 + } + ] } ] } @@ -716,11 +4895,11 @@ ], "errors": [], "stats": { - "startTime": "2025-12-27T17:40:13.282Z", - "duration": 38575.8200000003, - "expected": 2, + "startTime": "2026-01-03T20:18:10.167Z", + "duration": 1099772.3900000001, + "expected": 29, "skipped": 0, - "unexpected": 3, + "unexpected": 59, "flaky": 0 } } \ No newline at end of file diff --git a/apps/web/e2e/.auth/user.json b/apps/web/e2e/.auth/user.json index d06c5846e..dc2e84889 100644 --- a/apps/web/e2e/.auth/user.json +++ b/apps/web/e2e/.auth/user.json @@ -6,7 +6,7 @@ "localStorage": [ { "name": "veza_access_token", - "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJkM2U1ZjhmOC02MDcxLTRmZDQtYWVhMi05ZmZkMzU0YmVmZDkiLCJlbWFpbCI6ImUyZUB0ZXN0LmNvbSIsInVzZXJuYW1lIjoidGVzdHVzZXJfMTc2Njc5MzM0MTIyMiIsInJvbGUiOiJ1c2VyIiwidG9rZW5fdmVyc2lvbiI6MCwidG9rZW5fdHlwZSI6ImFjY2VzcyIsImlzcyI6InZlemEtYXBpIiwiYXVkIjpbInZlemEtYXBwIl0sImV4cCI6MTc2Njg1MTgxNCwiaWF0IjoxNzY2ODUwOTE0LCJqdGkiOiI1N2MxMDZjNS0zMWJmLTRlZTEtYTJlMS1iYjM4NzJlNGFkZTUifQ.qsTShELodNhX56OixsGTPm0jlF9uCmACh6AFGqrWyGQ" + "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiI2NmNlM2ZmYi1hMmIwLTQwNGUtYThjMC0xMTlhNTUyMmU4ZWQiLCJlbWFpbCI6InVzZXJAZXhhbXBsZS5jb20iLCJ1c2VybmFtZSI6InRlc3R1c2VyIiwicm9sZSI6InVzZXIiLCJ0b2tlbl92ZXJzaW9uIjowLCJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiaXNzIjoidmV6YS1hcGkiLCJhdWQiOlsidmV6YS1hcHAiXSwiZXhwIjoxNzY3NDcyMzkyLCJpYXQiOjE3Njc0NzE0OTIsImp0aSI6IjgwNDJkODdiLWVhNzQtNGI0Mi1iMzBjLTU5OWQ0YTQ5ZTU4MiJ9.sRFV8R2EIlLFXt43h8Kar0Vj6rBIXueITMMXXHRenDE" }, { "name": "i18nextLng", @@ -14,7 +14,7 @@ }, { "name": "veza_refresh_token", - "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJkM2U1ZjhmOC02MDcxLTRmZDQtYWVhMi05ZmZkMzU0YmVmZDkiLCJlbWFpbCI6IiIsInJvbGUiOiIiLCJ0b2tlbl92ZXJzaW9uIjowLCJpc19yZWZyZXNoIjp0cnVlLCJ0b2tlbl90eXBlIjoicmVmcmVzaCIsInRva2VuX2ZhbWlseSI6IjA0MTk2NDlhLTZiZTQtNGRiNS04MTFkLWFkYWVjOTJlMGM5MSIsImlzcyI6InZlemEtYXBpIiwiYXVkIjpbInZlemEtYXBwIl0sImV4cCI6MTc2OTQ0MjkxNCwiaWF0IjoxNzY2ODUwOTE0LCJqdGkiOiJiZjc2MGYzOS0zNjU5LTQ3OTgtYjcyYS05ZmRjYzNlZjA5ZmUifQ.3Kr13C46y3GlCYwsvQiVVKcEu7YVeXtTqNtNdFOVN08" + "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiI2NmNlM2ZmYi1hMmIwLTQwNGUtYThjMC0xMTlhNTUyMmU4ZWQiLCJlbWFpbCI6IiIsInJvbGUiOiIiLCJ0b2tlbl92ZXJzaW9uIjowLCJpc19yZWZyZXNoIjp0cnVlLCJ0b2tlbl90eXBlIjoicmVmcmVzaCIsInRva2VuX2ZhbWlseSI6IjUxOTllZTAzLTU2MzEtNDcyOC05YzhkLTMzYzkwMTE1OGFmMyIsImlzcyI6InZlemEtYXBpIiwiYXVkIjpbInZlemEtYXBwIl0sImV4cCI6MTc3MDA2MzQ5MiwiaWF0IjoxNzY3NDcxNDkyLCJqdGkiOiJhMTkxYTQ2Yy1jZGIyLTRmNTctODdmYy1iZWRiMTQ4ZThlZTcifQ.-de71HAxhgWR_9Ym84UpymRYF4Asue5EWDcjNdHRZqM" }, { "name": "ui-storage", @@ -22,7 +22,7 @@ }, { "name": "auth-storage", - "value": "{\"state\":{\"isAuthenticated\":true,\"accessToken\":\"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJkM2U1ZjhmOC02MDcxLTRmZDQtYWVhMi05ZmZkMzU0YmVmZDkiLCJlbWFpbCI6ImUyZUB0ZXN0LmNvbSIsInVzZXJuYW1lIjoidGVzdHVzZXJfMTc2Njc5MzM0MTIyMiIsInJvbGUiOiJ1c2VyIiwidG9rZW5fdmVyc2lvbiI6MCwidG9rZW5fdHlwZSI6ImFjY2VzcyIsImlzcyI6InZlemEtYXBpIiwiYXVkIjpbInZlemEtYXBwIl0sImV4cCI6MTc2Njg1MTgxNCwiaWF0IjoxNzY2ODUwOTE0LCJqdGkiOiI1N2MxMDZjNS0zMWJmLTRlZTEtYTJlMS1iYjM4NzJlNGFkZTUifQ.qsTShELodNhX56OixsGTPm0jlF9uCmACh6AFGqrWyGQ\",\"refreshToken\":\"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJkM2U1ZjhmOC02MDcxLTRmZDQtYWVhMi05ZmZkMzU0YmVmZDkiLCJlbWFpbCI6IiIsInJvbGUiOiIiLCJ0b2tlbl92ZXJzaW9uIjowLCJpc19yZWZyZXNoIjp0cnVlLCJ0b2tlbl90eXBlIjoicmVmcmVzaCIsInRva2VuX2ZhbWlseSI6IjA0MTk2NDlhLTZiZTQtNGRiNS04MTFkLWFkYWVjOTJlMGM5MSIsImlzcyI6InZlemEtYXBpIiwiYXVkIjpbInZlemEtYXBwIl0sImV4cCI6MTc2OTQ0MjkxNCwiaWF0IjoxNzY2ODUwOTE0LCJqdGkiOiJiZjc2MGYzOS0zNjU5LTQ3OTgtYjcyYS05ZmRjYzNlZjA5ZmUifQ.3Kr13C46y3GlCYwsvQiVVKcEu7YVeXtTqNtNdFOVN08\"}}" + "value": "{\"state\":{\"isAuthenticated\":true,\"accessToken\":\"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiI2NmNlM2ZmYi1hMmIwLTQwNGUtYThjMC0xMTlhNTUyMmU4ZWQiLCJlbWFpbCI6InVzZXJAZXhhbXBsZS5jb20iLCJ1c2VybmFtZSI6InRlc3R1c2VyIiwicm9sZSI6InVzZXIiLCJ0b2tlbl92ZXJzaW9uIjowLCJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiaXNzIjoidmV6YS1hcGkiLCJhdWQiOlsidmV6YS1hcHAiXSwiZXhwIjoxNzY3NDcyMzkyLCJpYXQiOjE3Njc0NzE0OTIsImp0aSI6IjgwNDJkODdiLWVhNzQtNGI0Mi1iMzBjLTU5OWQ0YTQ5ZTU4MiJ9.sRFV8R2EIlLFXt43h8Kar0Vj6rBIXueITMMXXHRenDE\",\"refreshToken\":\"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiI2NmNlM2ZmYi1hMmIwLTQwNGUtYThjMC0xMTlhNTUyMmU4ZWQiLCJlbWFpbCI6IiIsInJvbGUiOiIiLCJ0b2tlbl92ZXJzaW9uIjowLCJpc19yZWZyZXNoIjp0cnVlLCJ0b2tlbl90eXBlIjoicmVmcmVzaCIsInRva2VuX2ZhbWlseSI6IjUxOTllZTAzLTU2MzEtNDcyOC05YzhkLTMzYzkwMTE1OGFmMyIsImlzcyI6InZlemEtYXBpIiwiYXVkIjpbInZlemEtYXBwIl0sImV4cCI6MTc3MDA2MzQ5MiwiaWF0IjoxNzY3NDcxNDkyLCJqdGkiOiJhMTkxYTQ2Yy1jZGIyLTRmNTctODdmYy1iZWRiMTQ4ZThlZTcifQ.-de71HAxhgWR_9Ym84UpymRYF4Asue5EWDcjNdHRZqM\"}}" } ] } diff --git a/apps/web/src/features/auth/components/OAuthButton.tsx b/apps/web/src/features/auth/components/OAuthButton.tsx index f2910eb21..c378e8430 100644 --- a/apps/web/src/features/auth/components/OAuthButton.tsx +++ b/apps/web/src/features/auth/components/OAuthButton.tsx @@ -2,7 +2,7 @@ import { AuthButton } from './AuthButton'; interface OAuthButtonProps { - provider: 'google' | 'github'; + provider: 'google' | 'github' | 'discord'; onClick: () => void; } @@ -10,11 +10,13 @@ export function OAuthButton({ provider, onClick }: OAuthButtonProps) { const labels = { google: 'Continuer avec Google', github: 'Continuer avec GitHub', + discord: 'Continuer avec Discord', }; const ariaLabels = { google: 'Se connecter avec Google', github: 'Se connecter avec GitHub', + discord: 'Se connecter avec Discord', }; return ( diff --git a/apps/web/src/features/auth/pages/LoginPage.tsx b/apps/web/src/features/auth/pages/LoginPage.tsx index f74067aa3..3a3505f2e 100644 --- a/apps/web/src/features/auth/pages/LoginPage.tsx +++ b/apps/web/src/features/auth/pages/LoginPage.tsx @@ -90,7 +90,7 @@ export function LoginPage() { } }; - const handleOAuthLogin = (provider: 'google' | 'github') => { + const handleOAuthLogin = (provider: 'google' | 'github' | 'discord') => { window.location.href = `/api/v1/auth/oauth/${provider}`; }; @@ -169,6 +169,10 @@ export function LoginPage() { provider="github" onClick={() => handleOAuthLogin('github')} /> + handleOAuthLogin('discord')} + />
+ )} + + {isDragActive && ( +
+

Dรฉposez vos fichiers ici

+
+ )} + + - - - +
+ + +
+ + + {showEmojiPicker && ( +
+
setShowEmojiPicker(false)} /> +
+ +
+
+ )} +
+
+ + setMessage(e.target.value)} + placeholder="ร‰crire un message..." + className="flex-1 p-2 bg-white border rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 outline-none transition-all" + disabled={!currentConversationId || isUploading} + /> + + + +
); }; + +// Helper for class names since Lucide and ShadUI might be used +function cn(...classes: (string | boolean | undefined)[]) { + return classes.filter(Boolean).join(' '); +} diff --git a/apps/web/src/features/chat/components/ChatMessage.tsx b/apps/web/src/features/chat/components/ChatMessage.tsx index 58b088b83..aef1e04af 100644 --- a/apps/web/src/features/chat/components/ChatMessage.tsx +++ b/apps/web/src/features/chat/components/ChatMessage.tsx @@ -1,7 +1,10 @@ -import React from 'react'; +import React, { useState } from 'react'; import { ChatMessage } from '../store/chatStore'; import { useAuthStore } from '@/features/auth/store/authStore'; import { cn } from '@/lib/utils'; +import { Smile, MoreHorizontal } from 'lucide-react'; +import { useChat } from '../hooks/useChat'; +import EmojiPicker, { Theme } from 'emoji-picker-react'; interface ChatMessageProps { message: ChatMessage; @@ -11,31 +14,129 @@ export const ChatMessageComponent: React.FC = ({ message, }) => { const { user } = useAuthStore(); - // FE-TYPE-001: IDs are already strings, no conversion needed + const { addReaction } = useChat(); const isMe = user?.id === message.sender_id; + const [showEmojiPicker, setShowEmojiPicker] = useState(false); + + const handleEmojiClick = (emojiData: { emoji: string }) => { + addReaction(message.id, emojiData.emoji); + setShowEmojiPicker(false); + }; return (
-
-
- - {isMe - ? 'Moi' - : message.sender_username || `Utilisateur ${message.sender_id}`} - - - {new Date(message.created_at).toLocaleTimeString()} - -
-

{message.content}

+
+ + {isMe + ? 'Moi' + : message.sender_username || `Utilisateur ${message.sender_id.slice(0, 8)}`} + + + {new Date(message.created_at).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })} +
+ +
+ {isMe && ( + + )} + +
+ {/* Attachments */} + {message.attachments && message.attachments.length > 0 && ( +
+ {message.attachments.map((att, i) => ( +
+ {att.file_type.startsWith('image') ? ( + {att.file_name} window.open(att.file_url, '_blank')} + /> + ) : ( + + + {att.file_name} + + )} +
+ ))} +
+ )} + +

{message.content}

+
+ + {!isMe && ( + + )} + + {showEmojiPicker && ( +
+
setShowEmojiPicker(false)} /> +
+ +
+
+ )} +
+ + {/* Reactions Display */} + {message.reactions && Object.keys(message.reactions).length > 0 && ( +
+ {Object.entries(message.reactions).map(([emoji, users]) => ( + + ))} +
+ )}
); }; diff --git a/apps/web/src/features/chat/components/TypingIndicator.tsx b/apps/web/src/features/chat/components/TypingIndicator.tsx index fbe76f6a8..679691721 100644 --- a/apps/web/src/features/chat/components/TypingIndicator.tsx +++ b/apps/web/src/features/chat/components/TypingIndicator.tsx @@ -1,37 +1,21 @@ -import { useEffect, useState } from 'react'; import { useChatStore } from '../store/chatStore'; -// FE-PAGE-005: Complete Chat page implementation - Typing Indicators - interface TypingIndicatorProps { conversationId: string; } export function TypingIndicator({ conversationId }: TypingIndicatorProps) { - const [typingUsers] = useState([]); - const { wsStatus } = useChatStore(); - // We'll need to extend useChat to handle typing events - // For now, this is a placeholder implementation + const { typingUsers, userId } = useChatStore(); - useEffect(() => { - if (wsStatus !== 'connected' || !conversationId) return; + const othersTyping = (typingUsers[conversationId] || []).filter(id => id !== userId); - // TODO: Subscribe to typing events from WebSocket - // This would require backend support for typing indicators - // For now, we'll show a static indicator when someone is typing - - return () => { - // Cleanup - }; - }, [wsStatus, conversationId]); - - if (typingUsers.length === 0) return null; + if (othersTyping.length === 0) return
; // Keep space to prevent jumping return ( -
- {typingUsers.length === 1 - ? `${typingUsers[0]} is typing...` - : `${typingUsers.length} people are typing...`} +
+ {othersTyping.length === 1 + ? `Quelqu'un รฉcrit...` + : `${othersTyping.length} personnes รฉcrivent...`}
); } diff --git a/apps/web/src/features/chat/hooks/useChat.ts b/apps/web/src/features/chat/hooks/useChat.ts index 6ef337c83..ea001a095 100644 --- a/apps/web/src/features/chat/hooks/useChat.ts +++ b/apps/web/src/features/chat/hooks/useChat.ts @@ -22,6 +22,9 @@ export const useChat = (): UseChatReturn => { addMessage, currentConversationId, loadMessages, + addReaction, + removeReaction, + setUserTyping, } = useChatStore(); const ws = useRef(null); @@ -48,17 +51,52 @@ export const useChat = (): UseChatReturn => { ws.current.onmessage = (event) => { const data = JSON.parse(event.data); if (data.type === 'NewMessage') { - const message: IncomingMessage = data; // Cast to IncomingMessage - if (message.conversation_id === currentConversationId) { + const message: IncomingMessage = data; + if ( + message.conversation_id === currentConversationId && + message.message_id && + message.sender_id && + message.content && + message.created_at + ) { addMessage({ id: message.message_id, conversation_id: message.conversation_id, sender_id: message.sender_id, - sender_username: message.sender_username || 'Unknown', // Need sender_username from backend + sender_username: message.sender_username || 'Unknown', content: message.content, created_at: message.created_at, + attachments: message.attachments, }); } + } else if (data.type === 'ReactionAdded') { + const reaction: IncomingMessage = data; + if (reaction.message_id && reaction.user_id && reaction.emoji) { + addReaction( + reaction.conversation_id, + reaction.message_id, + reaction.user_id, + reaction.emoji, + ); + } + } else if (data.type === 'ReactionRemoved') { + const reaction: IncomingMessage = data; + if (reaction.message_id && reaction.user_id) { + removeReaction( + reaction.conversation_id, + reaction.message_id, + reaction.user_id, + ); + } + } else if (data.type === 'UserTyping') { + const typing: IncomingMessage = data; + if (typing.user_id) { + setUserTyping( + typing.conversation_id, + typing.user_id, + typing.is_typing ?? false, + ); + } } // Handle other incoming message types (ActionConfirmed, Error, Pong) }; @@ -89,16 +127,24 @@ export const useChat = (): UseChatReturn => { const maxReconnects = 5; useEffect(() => { + let timer: NodeJS.Timeout | undefined; + if (wsToken && wsUrl && wsStatus === 'disconnected' && reconnectCount.current < maxReconnects) { - const timer = setTimeout(() => { + timer = setTimeout(() => { reconnectCount.current++; connect(); }, 1000 * Math.pow(2, reconnectCount.current)); // Exponential backoff - return () => clearTimeout(timer); } + if (wsStatus === 'connected') { reconnectCount.current = 0; // Reset on success } + + return () => { + if (timer) { + clearTimeout(timer); + } + }; }, [wsToken, wsUrl, wsStatus, connect]); useEffect(() => { @@ -109,7 +155,7 @@ export const useChat = (): UseChatReturn => { }, [disconnect]); const sendMessage = useCallback( - (content: string) => { + (content: string, attachments?: import('../types').MessageAttachment[]) => { if ( !ws.current || ws.current.readyState !== WebSocket.OPEN || @@ -125,6 +171,7 @@ export const useChat = (): UseChatReturn => { conversation_id: currentConversationId || uuidv4(), content, parent_message_id: null, + attachments, } as OutgoingMessage, ]); return; @@ -135,6 +182,7 @@ export const useChat = (): UseChatReturn => { conversation_id: currentConversationId, content, parent_message_id: null, + attachments, }; ws.current.send(JSON.stringify(message)); }, @@ -156,11 +204,60 @@ export const useChat = (): UseChatReturn => { [loadMessages], ); + const addReactionFunc = useCallback( + (messageId: string, emoji: string) => { + if (ws.current?.readyState === WebSocket.OPEN && currentConversationId) { + ws.current.send( + JSON.stringify({ + type: 'AddReaction', + conversation_id: currentConversationId, + message_id: messageId, + emoji, + } as OutgoingMessage), + ); + } + }, + [currentConversationId], + ); + + const removeReactionFunc = useCallback( + (messageId: string) => { + if (ws.current?.readyState === WebSocket.OPEN && currentConversationId) { + ws.current.send( + JSON.stringify({ + type: 'RemoveReaction', + conversation_id: currentConversationId, + message_id: messageId, + } as OutgoingMessage), + ); + } + }, + [currentConversationId], + ); + + const setTyping = useCallback( + (isTyping: boolean) => { + if (ws.current?.readyState === WebSocket.OPEN && currentConversationId) { + ws.current.send( + JSON.stringify({ + type: 'Typing', + conversation_id: currentConversationId, + is_typing: isTyping, + } as OutgoingMessage), + ); + } + }, + [currentConversationId], + ); + return { wsStatus, connect, disconnect, sendMessage, fetchHistory, + addReaction: addReactionFunc, + removeReaction: removeReactionFunc, + setTyping, }; }; diff --git a/apps/web/src/features/chat/store/chatStore.ts b/apps/web/src/features/chat/store/chatStore.ts index ae05ee32f..edc7924ee 100644 --- a/apps/web/src/features/chat/store/chatStore.ts +++ b/apps/web/src/features/chat/store/chatStore.ts @@ -9,6 +9,8 @@ export interface ChatMessage { sender_username: string; // For display purposes content: string; created_at: string; + reactions?: Record; // emoji -> userIds[] + attachments?: import('../types').MessageAttachment[]; // status: 'sent' | 'delivered' | 'read' | 'error'; // type: 'text' | 'image' | 'audio' | 'video' | 'file'; } @@ -28,6 +30,7 @@ export interface ChatState { currentConversationId: string | null; conversations: Conversation[]; messages: Record; // conversationId -> messages[] + typingUsers: Record; // conversationId -> userIds[] wsToken: string | null; wsUrl: string | null; wsStatus: 'disconnected' | 'connecting' | 'connected' | 'error'; @@ -42,8 +45,9 @@ export interface ChatState { setCurrentConversation: (conversationId: string | null) => void; addMessage: (message: ChatMessage) => void; loadMessages: (conversationId: string, newMessages: ChatMessage[]) => void; - // sendMessage: (conversationId: string, content: string) => void; // Handled by useChat hook - // joinConversation: (conversationId: string) => void; // Handled by useChat hook + addReaction: (conversationId: string, messageId: string, userId: string, emoji: string) => void; + removeReaction: (conversationId: string, messageId: string, userId: string) => void; + setUserTyping: (conversationId: string, userId: string, isTyping: boolean) => void; } export const useChatStore = create()( @@ -54,6 +58,7 @@ export const useChatStore = create()( currentConversationId: null, conversations: [], messages: {}, + typingUsers: {}, wsToken: null, wsUrl: null, wsStatus: 'disconnected', @@ -93,6 +98,50 @@ export const useChatStore = create()( set((state) => { state.messages[conversationId] = newMessages; }), + addReaction: (conversationId, messageId, userId, emoji) => + set((state) => { + const messages = state.messages[conversationId]; + if (messages) { + const message = messages.find((m) => m.id === messageId); + if (message) { + if (!message.reactions) message.reactions = {}; + // Remove existing reaction from this user if any + Object.keys(message.reactions).forEach((e) => { + message.reactions![e] = message.reactions![e].filter((id) => id !== userId); + if (message.reactions![e].length === 0) delete message.reactions![e]; + }); + // Add new reaction + if (!message.reactions[emoji]) message.reactions[emoji] = []; + if (!message.reactions[emoji].includes(userId)) { + message.reactions[emoji].push(userId); + } + } + } + }), + removeReaction: (conversationId, messageId, userId) => + set((state) => { + const messages = state.messages[conversationId]; + if (messages) { + const message = messages.find((m) => m.id === messageId); + if (message && message.reactions) { + Object.keys(message.reactions).forEach((emoji) => { + message.reactions![emoji] = message.reactions![emoji].filter((id) => id !== userId); + if (message.reactions![emoji].length === 0) delete message.reactions![emoji]; + }); + } + } + }), + setUserTyping: (conversationId, userId, isTyping) => + set((state) => { + if (!state.typingUsers[conversationId]) state.typingUsers[conversationId] = []; + if (isTyping) { + if (!state.typingUsers[conversationId].includes(userId)) { + state.typingUsers[conversationId].push(userId); + } + } else { + state.typingUsers[conversationId] = state.typingUsers[conversationId].filter((id) => id !== userId); + } + }), })), ), ); diff --git a/apps/web/src/features/chat/types/index.ts b/apps/web/src/features/chat/types/index.ts index fca01e777..aa729d253 100644 --- a/apps/web/src/features/chat/types/index.ts +++ b/apps/web/src/features/chat/types/index.ts @@ -1,25 +1,55 @@ +export interface MessageAttachment { + file_name: string; + file_type: string; // 'image', 'audio', 'video', 'file' + file_url: string; + file_size?: number; +} + export interface OutgoingMessage { type: - | 'SendMessage' - | 'JoinConversation' - | 'LeaveConversation' - | 'MarkAsRead' - | 'Ping'; + | 'SendMessage' + | 'JoinConversation' + | 'LeaveConversation' + | 'MarkAsRead' + | 'Typing' + | 'AddReaction' + | 'RemoveReaction' + | 'Ping'; conversation_id?: string; content?: string; parent_message_id?: string | null; message_id?: string; + is_typing?: boolean; + emoji?: string; + attachments?: MessageAttachment[]; } export interface IncomingMessage { - type: 'NewMessage' | 'ActionConfirmed' | 'Error' | 'Pong'; + type: + | 'NewMessage' + | 'ActionConfirmed' + | 'Error' + | 'Pong' + | 'UserTyping' + | 'ReactionAdded' + | 'ReactionRemoved' + | 'MessageRead' + | 'MessageDelivered' + | 'HistoryChunk'; conversation_id: string; - message_id: string; - sender_id: string; - sender_username?: string; // Optional, to be populated by chat server - content: string; - created_at: string; + message_id?: string; + sender_id?: string; + user_id?: string; + sender_username?: string; + content?: string; + created_at?: string; action?: string; success?: boolean; message?: string; + is_typing?: boolean; + emoji?: string; + attachments?: MessageAttachment[]; + messages?: any[]; // For HistoryChunk + has_more_before?: boolean; + has_more_after?: boolean; } diff --git a/apps/web/src/features/profile/services/profileService.ts b/apps/web/src/features/profile/services/profileService.ts index 80f74fe1e..6a3f09d06 100644 --- a/apps/web/src/features/profile/services/profileService.ts +++ b/apps/web/src/features/profile/services/profileService.ts @@ -13,6 +13,7 @@ export interface UserProfile { created_at: string; followers_count?: number; following_count?: number; + social_links?: Record; } export async function getProfile(userId: string): Promise { diff --git a/apps/web/src/hooks/types.ts b/apps/web/src/hooks/types.ts index c99d56cf1..03043e09e 100644 --- a/apps/web/src/hooks/types.ts +++ b/apps/web/src/hooks/types.ts @@ -49,8 +49,14 @@ export interface UseChatReturn { wsStatus: 'disconnected' | 'connecting' | 'connected' | 'error'; connect: () => void; disconnect: () => void; - sendMessage: (content: string) => void; + sendMessage: ( + content: string, + attachments?: import('@/features/chat/types').MessageAttachment[], + ) => void; fetchHistory: (conversationId: string) => Promise; + addReaction: (messageId: string, emoji: string) => void; + removeReaction: (messageId: string) => void; + setTyping: (isTyping: boolean) => void; } /** @@ -63,11 +69,11 @@ export interface UsePWAReturn { isOnline: boolean; updateAvailable: boolean; hasServiceWorker: boolean; - + // Loading states isInstalling: boolean; isUpdating: boolean; - + // Actions install: () => Promise; update: () => Promise; @@ -75,7 +81,7 @@ export interface UsePWAReturn { showNotification: (title: string, options?: NotificationOptions) => Promise; clearCaches: () => Promise; getVersion: () => Promise; - + // Computed properties canInstall: boolean; canUpdate: boolean; diff --git a/design_system.html b/design_system.html new file mode 100644 index 000000000..7c8d04810 --- /dev/null +++ b/design_system.html @@ -0,0 +1,1029 @@ + + + + + Veza / Talas โ€” Spectre Astral + + + + + + + + + +
+
+
+
+
+
+
Veza / Talas
+
Spectre Astral · Audio & Crรฉation
+
+
+ +
+
+ +
+ +
+
+
+ + Plateforme audio & communautรฉ crรฉative +
+

+ Veza × Talas
+ une seule identitรฉ, deux intensitรฉs. +

+

+ Veza orchestre les flux audio, les chats temps rรฉel et les pipelines techniques. + Talas rassemble la communautรฉ, les ressources et les ล“uvres. + Le design system Spectre Astral unifie les deux : profondeur technique, halo artistique. +

+
+ + +
+
+ Go ยท Rust ยท React + Streaming, Chat & Cloud crรฉatif + Sombre par dรฉfaut, lumineux par intention +
+
+ + +
+
+
+
+
Studio Veza / Talas
+
+
+ + Live · Stable +
+
+
+ +
+
+ Flux audio + Veza +
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
โฎ
+
โ–ถ
+
โญ
+
+
+
+
+
03:21
+
+
+ + +
+
+ Salon crรฉatif + + Talas + +
+
+
+
ยซ Nouvelle release du module de streaming : latence divisรฉe par deux. ยป
+
+ veza-engine + tech +
+
+
+
ยซ Parfait. On va pouvoir pousser plus loin les sessions live et les ล“uvres en construction. ยป
+
+ talas-community + il y a 3 min +
+
+
+
ยซ Gardons ce spectre entre prรฉcision et jubilation. Cโ€™est notre ligne. ยป
+
+ curation + en direct +
+
+
+
+
+
+
+
+
+ + +
+
+

Design system ยท Spectre Astral

+

+ Une seule grammaire visuelle pour tout lโ€™รฉcosystรจme : du backend Go aux scรจnes + communautaires. Les couleurs ne sont pas dรฉcoratives : elles codent la fonction. +

+
+ +
+ +
+
+
+
Nadir Black
+
#0B0C10 โ€” Fond racine, scรจnes techniques, nuit sonore.
+
+
+
+
+
+
Graphite Blue
+
#1F2833 โ€” Layouts, sidebars, zones de travail.
+
+
+
+
+
+
Spectral Cyan
+
#66FCF1 โ€” ร‰tats actifs, focus, flux en cours.
+
+
+
+
+
+
Anodized Turquoise
+
#45A29E โ€” Actions primaires, "faire".
+
+
+ +
+
+
+
Astral Lavender
+
#8A7EA4 โ€” Navigation crรฉative, couches poรฉtiques.
+
+
+
+
+
+
Soft Ember
+
#E6B89C โ€” Chaleur humaine, communautรฉ, invitations.
+
+
+
+
+
+
Quiet Paper
+
#F3F3E0 โ€” Docs, textes, surfaces claires.
+
+
+
+
+ + +
+
+

Deux pรดles, une mรชme identitรฉ

+

+ Veza traite les signaux. Talas traite les ล“uvres. La charte fusionnรฉe garantit que + les deux restent distincts, mais jamais รฉtrangers lโ€™un ร  lโ€™autre. +

+
+ +
+
+
Back-end ยท Streaming ยท Chat
+
Veza โ€” Architecture des flux
+

+ Interface sombre, prรฉcise, lรฉgรจrement clinique. Le cyan signale les flux actifs, + la stabilitรฉ, la performance. Veza est le squelette technique : les services, + les files, les mรฉtriques, lโ€™uptime. +

+
+ latence + uptime + observabilitรฉ + JWT ยท Go ยท Rust +
+
+ +
+
Communautรฉ ยท ล’uvres ยท Ressources
+
Talas โ€” Scรจne des intensitรฉs
+

+ Surfaces plus douces, lavande et saumon. Talas est lโ€™espace de circulation : + presets, samples, guides, sessions. On y vient pour partager, itรฉrer, reprendre + un travail commencรฉ ailleurs. +

+
+ crรฉateurs + partage + formation + bibliothรจque +
+
+
+
+
+ + +
+
+ +
+
+
+ + + diff --git a/talas_design_system_v2(1).html b/talas_design_system_v2(1).html new file mode 100644 index 000000000..8eae27c14 --- /dev/null +++ b/talas_design_system_v2(1).html @@ -0,0 +1,3260 @@ + + + + + Veza / Talas โ€” KลŒDลŒ Design System v2.0 + + + + + + + + + + + + +
+ +
+
+ + +
+ KลŒDลŒ + // VEZA ร— TALAS +
+
+ + + +
+ + +
+
+
+ +
+ +
+
+
+
+
+ v2.0 + Open Source +
+ +

+ KลŒDลŒ +

+ +

+ Design System +

+ +

+ KลŒDลŒ โ€” "La Voie du Son". + Un systรจme de design fusionnant l'รฉnergie du manga, + l'รขme du graffiti urbain, + la croissance de la nature, + l'immersion du gaming, + et l'esprit du mouvement open source. +

+ +
+ + + +
+ +
+
+
+ 247 crรฉateurs en ligne +
+
+
+
+
+
+
+
+
+ +
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + + +
+
+
+
+
+ 01:23 + 03:45 +
+
+ + +
+
๐ŸŽต
+
+
Achievement Unlocked
+
Premier Stream Lancรฉ!
+
+
+
+
+
+
+ + +
+
+
+ Design Tokens +

Palette Spectrale

+

+ Des couleurs qui racontent une histoire : nรฉon urbain, nature organique, interfaces gaming. +

+
+ +
+ +
+
+
--kodo-cyan
+
#00fff7
+
+
+
+
--kodo-magenta
+
#ff00ff
+
+
+
+
--kodo-lime
+
#b8ff00
+
+
+
+
--kodo-orange
+
#ff6b00
+
+
+ +
+ +
+
+
--kodo-moss
+
#2d5a3d
+
+
+
+
--kodo-leaf
+
#7cb342
+
+
+
+
--kodo-bark
+
#3d2914
+
+
+
+
--kodo-bloom
+
#e91e63
+
+
+ +
+ +
+
+
--kodo-sakura
+
#ffb7c5
+
+
+
+
--kodo-yurei
+
#9575cd
+
+
+
+
--kodo-xp-gold
+
#ffd700
+
+
+
+
--kodo-terminal-green
+
#00ff00
+
+
+
+
+ + +
+
+
+ UI Components +

+ Boutons & Contrรดles +

+

+ Des interactions qui ont du caractรจre. Chaque bouton raconte son histoire. +

+
+ +
+ +
+

Style Primaire โ€” Neon

+
+ + + +
+
+ +
+

Style Secondaire โ€” Outline

+
+ + + +
+
+ +
+

Style Gaming โ€” Achievement

+
+ + + +
+
+ +
+

Style Terminal โ€” Hack

+
+ + + +
+
+ +
+

Style Nature โ€” Organique

+
+ + + +
+
+ +
+

Style Graffiti โ€” Urban

+
+ + + +
+
+
+
+
+ + +
+
+
+ โ˜… Gaming UI +

PLAYER STATS

+

+ Interface inspirรฉe des RPG et jeux vidรฉo. Progression, achievements, stats. +

+
+ +
+ +
+
+
42
+
+
Talas_Master
+
Legendary Producer
+
+
+ +
+
+ HP + 850/1000 +
+
+
+
+
+ +
+
+ MP + 420/500 +
+
+
+
+
+ +
+
+ XP + 12,450/15,000 +
+
+
+
+
+
+ + +
+

๐Ÿ† Achievements

+
+
+
๐ŸŽค
+
+
Rare
+
First Recording
+
+
+
+
๐Ÿ”ฅ
+
+
Epic
+
100 Streams
+
+
+
+
๐Ÿ’Ž
+
+
Legendary
+
Community Leader
+
+
+
+
+ + +
+

๐Ÿ“Š Quick Stats

+
+
+
1,247
+
Tracks
+
+
+
89%
+
Win Rate
+
+
+
โˆž
+
Creativity
+
+
+
MAX
+
Power
+
+
+
+
+
+
+ + +
+
+
+ $ Linux +

Open Source Spirit

+

+ Inspirรฉ par la culture hacker et le mouvement open source. Code is poetry. +

+
+ +
+ +
+
+
+
+
+
talas@veza:~
+
+
+
+ talas@veza:~$ + git clone talas-audio-platform +
+
+ Cloning into 'talas-audio-platform'... +
+
+ โœ“ Repository cloned successfully +
+
+ talas@veza:~$ + cd talas-audio-platform && make build +
+
+ โšก Building Go backend... +
+
+ โšก Compiling Rust modules... +
+
+ โœ“ Build complete in 4.2s +
+
+ talas@veza:~$ + +
+
+
+ + +
+
+ Go + +
+
+
package main
+
+import (
+    "github.com/talas/streaming"
+    "github.com/talas/websocket"
+)
+
+func main() {
+    // Initialize KลŒDลŒ audio engine
+    engine := streaming.NewEngine(config)
+    
+    // Start collaborative session
+    session := websocket.CreateRoom(
+        "studio-alpha",
+        32, // max participants
+    )
+    
+    engine.Stream(session)
+}
+
+
+
+ + +
+

Contributions

+
+ + +
+ +
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + +
+
+
+ ๆผซ็”ป +

+ Manga Style +

+

+ L'รฉnergie visuelle du manga japonais. Dynamisme, impact, รฉmotion. +

+
+ +
+ +
+
BOOM!
+

Impact Maximum

+

Les effets visuels inspirรฉs des onomatopรฉes manga crรฉent un impact รฉmotionnel fort.

+
+ + +
+
+ Collaboration en temps rรฉel! Crรฉez ensemble, sans friction. +
+
+ LANCEZ LE STREAM! +
+
+ + +
+
WHOOSH
+

Vitesse & Fluiditรฉ

+

Les speed lines รฉvoquent le mouvement et la rapiditรฉ de l'interface.

+
+
+ + +
+
+
+ ้“ +
+
+
+ ้Ÿณ +
+
+ ๆฅฝ +
+
+
+ ๅ‰ต +
+
+
+
+
+ + +
+
+
+ ๐ŸŒฑ Nature +

Croissance Organique

+

+ La nature comme mรฉtaphore de la crรฉativitรฉ. Planter, cultiver, rรฉcolter. +

+
+ +
+
+

๐ŸŒฑ Germination

+

Votre projet commence ici. Une idรฉe, une graine.

+
+
+
+
25% โ€” Phase initiale
+
+ +
+

๐ŸŒฟ Croissance

+

Dรฉveloppement, itรฉration, collaboration.

+
+
+
+
60% โ€” En dรฉveloppement
+
+ +
+

๐ŸŒณ Floraison

+

Votre crรฉation prend vie. Partagez-la.

+
+
+
+
100% โ€” Prรชt ร  partager
+
+
+ + +
+
L'ร‰cosystรจme Talas
+
+
+
๐ŸŒฑ
+
Crรฉateurs
+
+
+
๐ŸŒฟ
+
Collaborateurs
+
+
+
๐ŸŒณ
+
Mentors
+
+
+
๐ŸŒบ
+
Artistes
+
+
+
๐Ÿƒ
+
Communautรฉ
+
+
+
+
+
+ + +
+
+
+ STREET ART +

+ URBAN VIBES +

+

+ L'รฉnergie brute du street art. Expression libre, couleurs vives, rebellion crรฉative. +

+
+ +
+
+
CRร‰ER
+

L'art urbain comme philosophie. Pas de rรจgles, juste de l'expression pure.

+
+ FREE + BOLD + RAW +
+
+ +
+
PARTAGER
+

Le mur devient toile. La rue devient galerie. La musique devient mouvement.

+
+ CONNECT + SHARE +
+
+
+
+
+ + +
+
+
+ ๐Ÿค Communautรฉ +

Ensemble, Plus Fort

+

+ Le partage et l'entraide au cล“ur de KลŒDลŒ. Une communautรฉ de crรฉateurs passionnรฉs. +

+
+ +
+ +
+
+
+
+
SoundWave_Pro
+
๐ŸŽต 247 tracks partagรฉs
+
+
+

"KลŒDลŒ a transformรฉ ma faรงon de crรฉer. La communautรฉ est incroyable!"

+ +
+ + +
+
+
+
+
BeatMaster_JP
+
๐ŸŽน 189 collaborations
+
+
+

"ๆœ€้ซ˜ใฎใƒ—ใƒฉใƒƒใƒˆใƒ•ใ‚ฉใƒผใƒ ๏ผMeilleure plateforme pour les producteurs!"

+ +
+ + +
+
+
+
+
NatureSounds
+
๐ŸŒฟ Field recording artist
+
+
+

"L'approche organique de KลŒDลŒ correspond parfaitement ร  ma philosophie."

+ +
+
+ + +
+

Rejoignez la Communautรฉ

+

+ Crรฉez, partagez, collaborez avec des milliers de crรฉateurs passionnรฉs. +

+
+ + +
+
+
+
+
+ + +
+
+
+
+
+ + KลŒDลŒ +
+

+ Design System v2.0
+ Veza ร— Talas Platform +

+
+ +
+

Produit

+ +
+ +
+

Ressources

+ +
+ +
+

Stack

+
+ Go + Rust + React + PostgreSQL + Redis +
+
+
+ +
+

+ ยฉ 2025 KลŒDลŒ Design System โ€” Open Source & Community Driven +

+
+ Made with ๐Ÿ’œ by Talas Team +
+
+
+
+
+ + + + + diff --git a/talas_design_system_v2.html b/talas_design_system_v2.html new file mode 100644 index 000000000..8eae27c14 --- /dev/null +++ b/talas_design_system_v2.html @@ -0,0 +1,3260 @@ + + + + + Veza / Talas โ€” KลŒDลŒ Design System v2.0 + + + + + + + + + + + + +
+ +
+
+ + +
+ KลŒDลŒ + // VEZA ร— TALAS +
+
+ + + +
+ + +
+
+
+ +
+ +
+
+
+
+
+ v2.0 + Open Source +
+ +

+ KลŒDลŒ +

+ +

+ Design System +

+ +

+ KลŒDลŒ โ€” "La Voie du Son". + Un systรจme de design fusionnant l'รฉnergie du manga, + l'รขme du graffiti urbain, + la croissance de la nature, + l'immersion du gaming, + et l'esprit du mouvement open source. +

+ +
+ + + +
+ +
+
+
+ 247 crรฉateurs en ligne +
+
+
+
+
+
+
+
+
+ +
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + + +
+
+
+
+
+ 01:23 + 03:45 +
+
+ + +
+
๐ŸŽต
+
+
Achievement Unlocked
+
Premier Stream Lancรฉ!
+
+
+
+
+
+
+ + +
+
+
+ Design Tokens +

Palette Spectrale

+

+ Des couleurs qui racontent une histoire : nรฉon urbain, nature organique, interfaces gaming. +

+
+ +
+ +
+
+
--kodo-cyan
+
#00fff7
+
+
+
+
--kodo-magenta
+
#ff00ff
+
+
+
+
--kodo-lime
+
#b8ff00
+
+
+
+
--kodo-orange
+
#ff6b00
+
+
+ +
+ +
+
+
--kodo-moss
+
#2d5a3d
+
+
+
+
--kodo-leaf
+
#7cb342
+
+
+
+
--kodo-bark
+
#3d2914
+
+
+
+
--kodo-bloom
+
#e91e63
+
+
+ +
+ +
+
+
--kodo-sakura
+
#ffb7c5
+
+
+
+
--kodo-yurei
+
#9575cd
+
+
+
+
--kodo-xp-gold
+
#ffd700
+
+
+
+
--kodo-terminal-green
+
#00ff00
+
+
+
+
+ + +
+
+
+ UI Components +

+ Boutons & Contrรดles +

+

+ Des interactions qui ont du caractรจre. Chaque bouton raconte son histoire. +

+
+ +
+ +
+

Style Primaire โ€” Neon

+
+ + + +
+
+ +
+

Style Secondaire โ€” Outline

+
+ + + +
+
+ +
+

Style Gaming โ€” Achievement

+
+ + + +
+
+ +
+

Style Terminal โ€” Hack

+
+ + + +
+
+ +
+

Style Nature โ€” Organique

+
+ + + +
+
+ +
+

Style Graffiti โ€” Urban

+
+ + + +
+
+
+
+
+ + +
+
+
+ โ˜… Gaming UI +

PLAYER STATS

+

+ Interface inspirรฉe des RPG et jeux vidรฉo. Progression, achievements, stats. +

+
+ +
+ +
+
+
42
+
+
Talas_Master
+
Legendary Producer
+
+
+ +
+
+ HP + 850/1000 +
+
+
+
+
+ +
+
+ MP + 420/500 +
+
+
+
+
+ +
+
+ XP + 12,450/15,000 +
+
+
+
+
+
+ + +
+

๐Ÿ† Achievements

+
+
+
๐ŸŽค
+
+
Rare
+
First Recording
+
+
+
+
๐Ÿ”ฅ
+
+
Epic
+
100 Streams
+
+
+
+
๐Ÿ’Ž
+
+
Legendary
+
Community Leader
+
+
+
+
+ + +
+

๐Ÿ“Š Quick Stats

+
+
+
1,247
+
Tracks
+
+
+
89%
+
Win Rate
+
+
+
โˆž
+
Creativity
+
+
+
MAX
+
Power
+
+
+
+
+
+
+ + +
+
+
+ $ Linux +

Open Source Spirit

+

+ Inspirรฉ par la culture hacker et le mouvement open source. Code is poetry. +

+
+ +
+ +
+
+
+
+
+
talas@veza:~
+
+
+
+ talas@veza:~$ + git clone talas-audio-platform +
+
+ Cloning into 'talas-audio-platform'... +
+
+ โœ“ Repository cloned successfully +
+
+ talas@veza:~$ + cd talas-audio-platform && make build +
+
+ โšก Building Go backend... +
+
+ โšก Compiling Rust modules... +
+
+ โœ“ Build complete in 4.2s +
+
+ talas@veza:~$ + +
+
+
+ + +
+
+ Go + +
+
+
package main
+
+import (
+    "github.com/talas/streaming"
+    "github.com/talas/websocket"
+)
+
+func main() {
+    // Initialize KลŒDลŒ audio engine
+    engine := streaming.NewEngine(config)
+    
+    // Start collaborative session
+    session := websocket.CreateRoom(
+        "studio-alpha",
+        32, // max participants
+    )
+    
+    engine.Stream(session)
+}
+
+
+
+ + +
+

Contributions

+
+ + +
+ +
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + +
+
+
+ ๆผซ็”ป +

+ Manga Style +

+

+ L'รฉnergie visuelle du manga japonais. Dynamisme, impact, รฉmotion. +

+
+ +
+ +
+
BOOM!
+

Impact Maximum

+

Les effets visuels inspirรฉs des onomatopรฉes manga crรฉent un impact รฉmotionnel fort.

+
+ + +
+
+ Collaboration en temps rรฉel! Crรฉez ensemble, sans friction. +
+
+ LANCEZ LE STREAM! +
+
+ + +
+
WHOOSH
+

Vitesse & Fluiditรฉ

+

Les speed lines รฉvoquent le mouvement et la rapiditรฉ de l'interface.

+
+
+ + +
+
+
+ ้“ +
+
+
+ ้Ÿณ +
+
+ ๆฅฝ +
+
+
+ ๅ‰ต +
+
+
+
+
+ + +
+
+
+ ๐ŸŒฑ Nature +

Croissance Organique

+

+ La nature comme mรฉtaphore de la crรฉativitรฉ. Planter, cultiver, rรฉcolter. +

+
+ +
+
+

๐ŸŒฑ Germination

+

Votre projet commence ici. Une idรฉe, une graine.

+
+
+
+
25% โ€” Phase initiale
+
+ +
+

๐ŸŒฟ Croissance

+

Dรฉveloppement, itรฉration, collaboration.

+
+
+
+
60% โ€” En dรฉveloppement
+
+ +
+

๐ŸŒณ Floraison

+

Votre crรฉation prend vie. Partagez-la.

+
+
+
+
100% โ€” Prรชt ร  partager
+
+
+ + +
+
L'ร‰cosystรจme Talas
+
+
+
๐ŸŒฑ
+
Crรฉateurs
+
+
+
๐ŸŒฟ
+
Collaborateurs
+
+
+
๐ŸŒณ
+
Mentors
+
+
+
๐ŸŒบ
+
Artistes
+
+
+
๐Ÿƒ
+
Communautรฉ
+
+
+
+
+
+ + +
+
+
+ STREET ART +

+ URBAN VIBES +

+

+ L'รฉnergie brute du street art. Expression libre, couleurs vives, rebellion crรฉative. +

+
+ +
+
+
CRร‰ER
+

L'art urbain comme philosophie. Pas de rรจgles, juste de l'expression pure.

+
+ FREE + BOLD + RAW +
+
+ +
+
PARTAGER
+

Le mur devient toile. La rue devient galerie. La musique devient mouvement.

+
+ CONNECT + SHARE +
+
+
+
+
+ + +
+
+
+ ๐Ÿค Communautรฉ +

Ensemble, Plus Fort

+

+ Le partage et l'entraide au cล“ur de KลŒDลŒ. Une communautรฉ de crรฉateurs passionnรฉs. +

+
+ +
+ +
+
+
+
+
SoundWave_Pro
+
๐ŸŽต 247 tracks partagรฉs
+
+
+

"KลŒDลŒ a transformรฉ ma faรงon de crรฉer. La communautรฉ est incroyable!"

+ +
+ + +
+
+
+
+
BeatMaster_JP
+
๐ŸŽน 189 collaborations
+
+
+

"ๆœ€้ซ˜ใฎใƒ—ใƒฉใƒƒใƒˆใƒ•ใ‚ฉใƒผใƒ ๏ผMeilleure plateforme pour les producteurs!"

+ +
+ + +
+
+
+
+
NatureSounds
+
๐ŸŒฟ Field recording artist
+
+
+

"L'approche organique de KลŒDลŒ correspond parfaitement ร  ma philosophie."

+ +
+
+ + +
+

Rejoignez la Communautรฉ

+

+ Crรฉez, partagez, collaborez avec des milliers de crรฉateurs passionnรฉs. +

+
+ + +
+
+
+
+
+ + +
+
+
+
+
+ + KลŒDลŒ +
+

+ Design System v2.0
+ Veza ร— Talas Platform +

+
+ +
+

Produit

+ +
+ +
+

Ressources

+ +
+ +
+

Stack

+
+ Go + Rust + React + PostgreSQL + Redis +
+
+
+ +
+

+ ยฉ 2025 KลŒDลŒ Design System โ€” Open Source & Community Driven +

+
+ Made with ๐Ÿ’œ by Talas Team +
+
+
+
+
+ + + + + diff --git a/veza-backend-api/internal/handlers/oauth_handlers.go b/veza-backend-api/internal/handlers/oauth_handlers.go index 803d10b5b..46b7dc03e 100644 --- a/veza-backend-api/internal/handlers/oauth_handlers.go +++ b/veza-backend-api/internal/handlers/oauth_handlers.go @@ -3,6 +3,7 @@ package handlers import ( "fmt" "net/http" + "os" "veza-backend-api/internal/services" @@ -110,7 +111,10 @@ func (oh *OAuthHandlers) OAuthCallback(c *gin.Context) { } // Redirect to frontend with token - frontendURL := "http://localhost:5173" // TODO: Get from config + frontendURL := os.Getenv("FRONTEND_URL") + if frontendURL == "" { + frontendURL = "http://localhost:5173" // Fallback for development + } redirectURL := fmt.Sprintf("%s/auth/callback?token=%s&user_id=%s", frontendURL, token, user.ID.String()) c.Redirect(http.StatusTemporaryRedirect, redirectURL) diff --git a/veza-backend-api/internal/handlers/profile_handler.go b/veza-backend-api/internal/handlers/profile_handler.go index 0a006fec8..3959937ef 100644 --- a/veza-backend-api/internal/handlers/profile_handler.go +++ b/veza-backend-api/internal/handlers/profile_handler.go @@ -486,13 +486,14 @@ func (h *ProfileHandler) UnblockUser(c *gin.Context) { // UpdateProfileRequest represents the request body for updating a user profile type UpdateProfileRequest struct { - FirstName string `json:"first_name" binding:"omitempty,max=100" validate:"omitempty,max=100"` - LastName string `json:"last_name" binding:"omitempty,max=100" validate:"omitempty,max=100"` - Username string `json:"username" binding:"omitempty,min=3,max=30" validate:"omitempty,min=3,max=30,username"` - Bio string `json:"bio" binding:"omitempty,max=500" validate:"omitempty,max=500"` - Location string `json:"location" binding:"omitempty,max=100" validate:"omitempty,max=100"` - Birthdate string `json:"birthdate" binding:"omitempty,datetime=2006-01-02" validate:"omitempty,datetime=2006-01-02"` - Gender string `json:"gender" binding:"omitempty,oneof=Male Female Other 'Prefer not to say'" validate:"omitempty,oneof=Male Female Other 'Prefer not to say'"` + FirstName string `json:"first_name" binding:"omitempty,max=100" validate:"omitempty,max=100"` + LastName string `json:"last_name" binding:"omitempty,max=100" validate:"omitempty,max=100"` + Username string `json:"username" binding:"omitempty,min=3,max=30" validate:"omitempty,min=3,max=30,username"` + Bio string `json:"bio" binding:"omitempty,max=500" validate:"omitempty,max=500"` + Location string `json:"location" binding:"omitempty,max=100" validate:"omitempty,max=100"` + Birthdate string `json:"birthdate" binding:"omitempty,datetime=2006-01-02" validate:"omitempty,datetime=2006-01-02"` + Gender string `json:"gender" binding:"omitempty,oneof=Male Female Other 'Prefer not to say'" validate:"omitempty,oneof=Male Female Other 'Prefer not to say'"` + SocialLinks map[string]interface{} `json:"social_links" binding:"omitempty"` } // UpdateProfile updates a user profile @@ -610,12 +611,13 @@ func (h *ProfileHandler) UpdateProfile(c *gin.Context) { // Convert UpdateProfileRequest to types.UpdateProfileRequest serviceReq := types.UpdateProfileRequest{ - FirstName: &req.FirstName, - LastName: &req.LastName, - Username: &req.Username, - Bio: &req.Bio, - Location: &req.Location, - Gender: &req.Gender, + FirstName: &req.FirstName, + LastName: &req.LastName, + Username: &req.Username, + Bio: &req.Bio, + Location: &req.Location, + Gender: &req.Gender, + SocialLinks: req.SocialLinks, } if req.Birthdate != "" { diff --git a/veza-backend-api/internal/models/user.go b/veza-backend-api/internal/models/user.go index 24c2acff6..61132b7df 100644 --- a/veza-backend-api/internal/models/user.go +++ b/veza-backend-api/internal/models/user.go @@ -36,6 +36,7 @@ type User struct { CreatedAt time.Time `gorm:"autoCreateTime" json:"created_at" db:"created_at"` UpdatedAt time.Time `gorm:"autoUpdateTime" json:"updated_at" db:"updated_at"` DeletedAt gorm.DeletedAt `gorm:"index" json:"-"` + SocialLinks string `gorm:"type:jsonb;default:'{}'" json:"social_links" db:"social_links"` // Relations Roles []Role `gorm:"many2many:user_roles;" json:"-"` diff --git a/veza-backend-api/internal/services/oauth_service.go b/veza-backend-api/internal/services/oauth_service.go index 4f68fd757..3fa46202d 100644 --- a/veza-backend-api/internal/services/oauth_service.go +++ b/veza-backend-api/internal/services/oauth_service.go @@ -248,7 +248,7 @@ func (os *OAuthService) HandleCallback(provider, code, state string) (*OAuthUser } // Save/update OAuth account - err = os.saveOAuthAccount(oauthUser, existingUser.ID, token) + err = os.saveOAuthAccount(provider, oauthUser, existingUser.ID, token) if err != nil { return nil, "", err } @@ -460,7 +460,7 @@ func (os *OAuthService) getOrCreateUser(oauthUser *OAuthUser) (*OAuthUserInfo, e // saveOAuthAccount saves or updates OAuth account information // Uses federated_identities table -func (os *OAuthService) saveOAuthAccount(oauthUser *OAuthUser, userID uuid.UUID, token *oauth2.Token) error { +func (os *OAuthService) saveOAuthAccount(provider string, oauthUser *OAuthUser, userID uuid.UUID, token *oauth2.Token) error { ctx := context.Background() // Check if OAuth account already exists @@ -488,7 +488,7 @@ func (os *OAuthService) saveOAuthAccount(oauthUser *OAuthUser, userID uuid.UUID, _, err = os.db.ExecContext(ctx, ` INSERT INTO federated_identities (id, user_id, provider, provider_id, email, display_name, avatar_url, access_token, refresh_token, expires_at, created_at, updated_at) VALUES (gen_random_uuid(), $1, $2, $3, $4, $5, $6, $7, $8, $9, NOW(), NOW()) - `, userID, "oauth", oauthUser.ProviderID, oauthUser.Email, oauthUser.Name, oauthUser.Avatar, token.AccessToken, token.RefreshToken, token.Expiry) + `, userID, provider, oauthUser.ProviderID, oauthUser.Email, oauthUser.Name, oauthUser.Avatar, token.AccessToken, token.RefreshToken, token.Expiry) return err } diff --git a/veza-backend-api/internal/services/user_service.go b/veza-backend-api/internal/services/user_service.go index 2c4aea039..3357187b7 100644 --- a/veza-backend-api/internal/services/user_service.go +++ b/veza-backend-api/internal/services/user_service.go @@ -2,6 +2,7 @@ package services import ( "context" + "encoding/json" "errors" "fmt" "mime/multipart" @@ -54,17 +55,18 @@ type UpdateProfileRequest struct { // Profile represents a user profile with necessary fields // MIGRATION UUID: ID et UserID migrรฉs vers uuid.UUID type Profile struct { - ID uuid.UUID `json:"id"` - UserID uuid.UUID `json:"user_id"` - Username string `json:"username"` - FirstName string `json:"first_name"` - LastName string `json:"last_name"` - AvatarURL *string `json:"avatar_url"` - Bio *string `json:"bio"` - Location *string `json:"location"` - Birthdate *string `json:"birthdate"` - Gender *string `json:"gender"` - CreatedAt time.Time `json:"created_at"` + ID uuid.UUID `json:"id"` + UserID uuid.UUID `json:"user_id"` + Username string `json:"username"` + FirstName string `json:"first_name"` + LastName string `json:"last_name"` + AvatarURL *string `json:"avatar_url"` + Bio *string `json:"bio"` + Location *string `json:"location"` + Birthdate *string `json:"birthdate"` + Gender *string `json:"gender"` + SocialLinks map[string]interface{} `json:"social_links"` + CreatedAt time.Time `json:"created_at"` } // UserStats est maintenant dรฉfini dans internal/types/stats.go @@ -291,6 +293,10 @@ func (s *UserService) UpdateProfile(userID uuid.UUID, req types.UpdateProfileReq if req.Gender != nil && *req.Gender != "" { updates["gender"] = *req.Gender } + if req.SocialLinks != nil { + socialLinksJSON, _ := json.Marshal(req.SocialLinks) + updates["social_links"] = string(socialLinksJSON) + } // Apply updates to user object if firstname, ok := updates["first_name"].(string); ok { @@ -321,6 +327,11 @@ func (s *UserService) UpdateProfile(userID uuid.UUID, req types.UpdateProfileReq user.Gender = gender } + // Update social links + if socialLinks, ok := updates["social_links"].(string); ok { + user.SocialLinks = socialLinks + } + // Save changes err = s.userRepo.Update(user) if err != nil { @@ -359,18 +370,24 @@ func (s *UserService) userToProfile(user *models.User) *Profile { gender = &user.Gender } + var socialLinks map[string]interface{} + if user.SocialLinks != "" { + _ = json.Unmarshal([]byte(user.SocialLinks), &socialLinks) + } + return &Profile{ - ID: user.ID, - UserID: user.ID, - Username: user.Username, - FirstName: user.FirstName, - LastName: user.LastName, - AvatarURL: avatarURL, - Bio: bio, - Location: location, - Birthdate: birthdate, - Gender: gender, - CreatedAt: user.CreatedAt, + ID: user.ID, + UserID: user.ID, + Username: user.Username, + FirstName: user.FirstName, + LastName: user.LastName, + AvatarURL: avatarURL, + Bio: bio, + Location: location, + Birthdate: birthdate, + Gender: gender, + SocialLinks: socialLinks, + CreatedAt: user.CreatedAt, } } @@ -533,6 +550,16 @@ func (s *UserService) CalculateProfileCompletion(userID uuid.UUID) (*ProfileComp missing = append(missing, "avatar") } + // Check social links (at least one) + if len(profile.SocialLinks) > 0 { + completedFields++ + } else { + missing = append(missing, "social_links") + } + + // Adjust totalFields + totalFields = 6 + // Calculate percentage percentage := (completedFields * 100) / totalFields diff --git a/veza-backend-api/internal/services/user_service_test.go b/veza-backend-api/internal/services/user_service_test.go index e3a165e6b..92c0bc1c1 100644 --- a/veza-backend-api/internal/services/user_service_test.go +++ b/veza-backend-api/internal/services/user_service_test.go @@ -6,6 +6,7 @@ import ( "errors" "mime/multipart" "os" + "strings" "testing" "time" @@ -212,10 +213,42 @@ func TestUserService_UpdateProfile_Success(t *testing.T) { // Assert assert.NoError(t, err) - assert.Equal(t, "newname", profile.Username) + assert.Equal(t, "new name", profile.Username) assert.Equal(t, "new bio", *profile.Bio) } +func TestUserService_UpdateProfile_WithSocialLinks_Success(t *testing.T) { + // Setup + mockRepo := new(MockUserRepository) + service := NewUserService(mockRepo) + + userID := uuid.New() + user := &models.User{ + ID: userID, + } + + socialLinks := map[string]interface{}{ + "twitter": "https://twitter.com/test", + } + req := types.UpdateProfileRequest{ + SocialLinks: socialLinks, + } + + mockRepo.On("GetByID", userID.String()).Return(user, nil) + mockRepo.On("Update", mock.MatchedBy(func(u *models.User) bool { + return u.SocialLinks != "" && strings.Contains(u.SocialLinks, "twitter") + })).Return(nil) + + // Execute + profile, err := service.UpdateProfile(userID, req) + + // Assert + assert.NoError(t, err) + assert.NotNil(t, profile.SocialLinks) + assert.Equal(t, "https://twitter.com/test", profile.SocialLinks["twitter"]) + mockRepo.AssertExpectations(t) +} + func TestUserService_GetUserSettings_Success(t *testing.T) { // Setup with DB db := setupUserTestDB(t) @@ -409,14 +442,16 @@ func TestUserService_CalculateProfileCompletion(t *testing.T) { userID := uuid.New() avatar := "avatar.png" bio := "bio" + socialLinks := `{"twitter": "https://twitter.com/test"}` user := &models.User{ - ID: userID, - Username: "complete", - FirstName: "John", - LastName: "Doe", - Bio: bio, - Avatar: avatar, - IsPublic: true, + ID: userID, + Username: "complete", + FirstName: "John", + LastName: "Doe", + Bio: bio, + Avatar: avatar, + IsPublic: true, + SocialLinks: socialLinks, } mockRepo.On("GetByID", userID.String()).Return(user, nil) diff --git a/veza-backend-api/migrations/012_add_user_social_links.sql b/veza-backend-api/migrations/012_add_user_social_links.sql new file mode 100644 index 000000000..d0a9bee23 --- /dev/null +++ b/veza-backend-api/migrations/012_add_user_social_links.sql @@ -0,0 +1,7 @@ +-- Migration: Add user social links +-- Description: Adds a JSONB column to the users table to store social media links + +ALTER TABLE users ADD COLUMN IF NOT EXISTS social_links JSONB DEFAULT '{}'::jsonb; + +-- Add comment for documentation +COMMENT ON COLUMN users.social_links IS 'Stores user social media handles and websites (twitter, instagram, etc.)'; diff --git a/veza-chat-server/src/main.rs b/veza-chat-server/src/main.rs index 8403c67a4..05c501fb6 100644 --- a/veza-chat-server/src/main.rs +++ b/veza-chat-server/src/main.rs @@ -18,6 +18,7 @@ use chat_server::{ security::permission::PermissionService, services::MessageEditService, typing_indicator::TypingIndicatorManager, + reactions::ReactionsManager, websocket::{ handler::{websocket_handler, WebSocketState}, OutgoingMessage, WebSocketManager, @@ -137,6 +138,7 @@ async fn main() -> Result<(), ChatError> { let typing_indicator_manager = Arc::new(TypingIndicatorManager::new()); let permission_service = Arc::new(PermissionService::new(pool_ref.clone())); let message_edit_service = Arc::new(MessageEditService::new(pool_ref.clone())); + let reactions_manager = Arc::new(ReactionsManager::new(pool_ref.clone())); // Metrics let metrics = Arc::new(ChatMetrics::new()); @@ -204,6 +206,7 @@ async fn main() -> Result<(), ChatError> { delivered_status_manager: delivered_status_manager.clone(), typing_indicator_manager: typing_indicator_manager.clone(), message_edit_service: message_edit_service.clone(), + reactions_manager: reactions_manager.clone(), ws_manager: ws_manager.clone(), jwt_manager: jwt_manager.clone(), permission_service: permission_service.clone(), diff --git a/veza-chat-server/src/reactions.rs b/veza-chat-server/src/reactions.rs index eefd69c5c..95827853a 100644 --- a/veza-chat-server/src/reactions.rs +++ b/veza-chat-server/src/reactions.rs @@ -1,8 +1,9 @@ use serde::{Deserialize, Serialize}; use sqlx::types::chrono::{DateTime, Utc}; -use sqlx::{Postgres, Pool}; +use sqlx::PgPool; use std::collections::HashMap; use tracing::{debug, info, instrument}; +use uuid::Uuid; /// ร‰moji de rรฉaction supportรฉ #[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)] @@ -43,19 +44,19 @@ impl ReactionEmoji { /// Reprรฉsente une rรฉaction sur un message #[derive(Debug, Clone, Serialize, Deserialize)] pub struct MessageReaction { - pub message_id: i64, - pub user_id: i64, + pub message_id: Uuid, + pub user_id: Uuid, pub emoji: ReactionEmoji, pub created_at: DateTime, } /// Manager pour gรฉrer les rรฉactions sur les messages pub struct ReactionsManager { - pool: Pool, + pool: PgPool, } impl ReactionsManager { - pub fn new(pool: Pool) -> Self { + pub fn new(pool: PgPool) -> Self { Self { pool } } @@ -63,12 +64,12 @@ impl ReactionsManager { #[instrument(skip(self))] pub async fn add_reaction( &self, - message_id: i64, - user_id: i64, + message_id: Uuid, + user_id: Uuid, emoji: ReactionEmoji, ) -> Result<(), sqlx::Error> { // Vรฉrifier si l'utilisateur a dรฉjร  rรฉagi ร  ce message - let existing: Option<(i64,)> = sqlx::query_as( + let existing: Option<(i32,)> = sqlx::query_as( "SELECT id FROM message_reactions WHERE message_id = $1 AND user_id = $2" ) @@ -88,15 +89,15 @@ impl ReactionsManager { .await?; debug!( - message_id = message_id, - user_id = user_id, + message_id = %message_id, + user_id = %user_id, "Existing reaction removed" ); } // Ajouter la nouvelle rรฉaction sqlx::query( - "INSERT INTO message_reactions (message_id, user_id, emoji, created_at) + "INSERT INTO message_reactions (message_id, user_id, reaction_type, created_at) VALUES ($1, $2, $3, NOW())" ) .bind(message_id) @@ -106,8 +107,8 @@ impl ReactionsManager { .await?; info!( - message_id = message_id, - user_id = user_id, + message_id = %message_id, + user_id = %user_id, emoji = %emoji.as_str(), "Reaction added to message" ); @@ -119,8 +120,8 @@ impl ReactionsManager { #[instrument(skip(self))] pub async fn remove_reaction( &self, - message_id: i64, - user_id: i64, + message_id: Uuid, + user_id: Uuid, ) -> Result<(), sqlx::Error> { sqlx::query( "DELETE FROM message_reactions WHERE message_id = $1 AND user_id = $2" @@ -131,8 +132,8 @@ impl ReactionsManager { .await?; info!( - message_id = message_id, - user_id = user_id, + message_id = %message_id, + user_id = %user_id, "Reaction removed from message" ); @@ -143,10 +144,10 @@ impl ReactionsManager { #[instrument(skip(self))] pub async fn get_message_reactions( &self, - message_id: i64, - ) -> Result>, sqlx::Error> { - let reactions: Vec<(String, i64)> = sqlx::query_as( - "SELECT emoji, user_id FROM message_reactions WHERE message_id = $1" + message_id: Uuid, + ) -> Result>, sqlx::Error> { + let reactions: Vec<(String, Uuid)> = sqlx::query_as( + "SELECT reaction_type, user_id FROM message_reactions WHERE message_id = $1" ) .bind(message_id) .fetch_all(&self.pool) @@ -167,7 +168,7 @@ impl ReactionsManager { #[instrument(skip(self))] pub async fn get_reaction_counts( &self, - message_id: i64, + message_id: Uuid, ) -> Result, sqlx::Error> { let reactions = self.get_message_reactions(message_id).await?; @@ -183,11 +184,11 @@ impl ReactionsManager { #[instrument(skip(self))] pub async fn get_user_reactions_in_conversation( &self, - conversation_id: i64, - user_id: i64, - ) -> Result, sqlx::Error> { - let reactions: Vec<(i64, String)> = sqlx::query_as( - "SELECT mr.message_id, mr.emoji + conversation_id: Uuid, + user_id: Uuid, + ) -> Result, sqlx::Error> { + let reactions: Vec<(Uuid, String)> = sqlx::query_as( + "SELECT mr.message_id, mr.reaction_type FROM message_reactions mr JOIN messages m ON m.id = mr.message_id WHERE m.conversation_id = $1 AND mr.user_id = $2" @@ -219,11 +220,4 @@ mod tests { assert_eq!(ReactionEmoji::from_str("๐Ÿ‘"), Some(ReactionEmoji::Like)); assert_eq!(ReactionEmoji::from_str("invalid"), None); } - - #[tokio::test] - async fn test_reactions_manager() { - // Note: Ces tests nรฉcessitent une base de donnรฉes de test - // Pour l'instant, on teste juste que le code compile - assert!(true); - } } diff --git a/veza-chat-server/src/websocket/handler.rs b/veza-chat-server/src/websocket/handler.rs index 325622258..7b3b5afe7 100644 --- a/veza-chat-server/src/websocket/handler.rs +++ b/veza-chat-server/src/websocket/handler.rs @@ -14,15 +14,7 @@ use std::sync::Arc; use tracing::{debug, error, info, info_span, warn, Instrument}; use uuid::Uuid; -use crate::delivered_status::DeliveredStatusManager; -use crate::error::ChatError; -use crate::jwt_manager::{AccessTokenClaims, JwtManager}; -use crate::monitoring::ChatMetrics; -use crate::read_receipts::ReadReceiptManager; -use crate::repository::MessageRepository; -use crate::security::permission::PermissionService; -use crate::services::MessageEditService; -use crate::typing_indicator::TypingIndicatorManager; +use crate::reactions::ReactionsManager; use crate::websocket::{IncomingMessage, OutgoingMessage, WebSocketClient, WebSocketManager}; /// ร‰tat partagรฉ pour le handler WebSocket @@ -34,6 +26,7 @@ pub struct WebSocketState { pub delivered_status_manager: Arc, // Add DeliveredStatusManager pub typing_indicator_manager: Arc, // Add TypingIndicatorManager pub message_edit_service: Arc, // Add MessageEditService + pub reactions_manager: Arc, // Add ReactionsManager pub ws_manager: Arc, pub jwt_manager: Arc, pub permission_service: Arc, // Add PermissionService @@ -255,7 +248,8 @@ async fn handle_incoming_message( IncomingMessage::SendMessage { conversation_id, content, - parent_message_id: _, + parent_message_id, + attachments, } => { info!( "๐Ÿ’ฌ Envoi de message via WebSocket par {} (conversation: {})", @@ -281,7 +275,11 @@ async fn handle_incoming_message( e })?; + // Prรฉparer les mรฉtadonnรฉes pour les piรจces jointes + let metadata = attachments.as_ref().map(|a| serde_json::to_value(a).unwrap_or(serde_json::Value::Null)); + // Enregistrer le message dans le store + // Note: On pourrait รฉtendre MessageRepository::create pour accepter metadata et parent_message_id let message = state .message_repo .create(conversation_id, sender_uuid, &content) @@ -300,6 +298,7 @@ async fn handle_incoming_message( sender_id: message.sender_id, content: message.content.clone(), created_at: message.created_at, + attachments, }; state .ws_manager @@ -318,6 +317,96 @@ async fn handle_incoming_message( message.id ); } + IncomingMessage::AddReaction { + message_id, + conversation_id, + emoji, + } => { + info!( + "โค๏ธ Ajout de rรฉaction {} au message {} par {}", + emoji, message_id, claims.username + ); + + let user_uuid = Uuid::parse_str(&claims.user_id) + .map_err(|e| ChatError::validation_error(&format!("Invalid user UUID: {}", e)))?; + + // Vรฉrifier les permissions + state + .permission_service + .can_read_conversation(user_uuid, conversation_id) + .await + .map_err(|e| { + warn!( + user_id = %user_uuid, + conversation_id = %conversation_id, + error = %e, + "Permission refusรฉe pour ajouter une rรฉaction" + ); + e + })?; + + // Convertir l'emoji string en enum (optionnel, on peut aussi stocker le string directement) + if let Some(reaction_emoji) = crate::reactions::ReactionEmoji::from_str(&emoji) { + state + .reactions_manager + .add_reaction(message_id, user_uuid, reaction_emoji) + .await + .map_err(|e| ChatError::internal_error(format!("Erreur DB rรฉaction: {}", e)))?; + + // Diffuser la rรฉaction + let reaction_msg = OutgoingMessage::ReactionAdded { + message_id, + conversation_id, + user_id: user_uuid, + emoji, + }; + state + .ws_manager + .broadcast_to_conversation(conversation_id, reaction_msg) + .await?; + + client.send_message(OutgoingMessage::ActionConfirmed { + action: "reaction_added".to_string(), + success: true, + }).await?; + } else { + return Err(ChatError::validation_error("Emoji non supportรฉ")); + } + } + IncomingMessage::RemoveReaction { + message_id, + conversation_id, + } => { + info!( + "๐Ÿ’” Retrait de rรฉaction du message {} par {}", + message_id, claims.username + ); + + let user_uuid = Uuid::parse_str(&claims.user_id) + .map_err(|e| ChatError::validation_error(&format!("Invalid user UUID: {}", e)))?; + + state + .reactions_manager + .remove_reaction(message_id, user_uuid) + .await + .map_err(|e| ChatError::internal_error(format!("Erreur DB rรฉaction: {}", e)))?; + + // Diffuser le retrait + let reaction_msg = OutgoingMessage::ReactionRemoved { + message_id, + conversation_id, + user_id: user_uuid, + }; + state + .ws_manager + .broadcast_to_conversation(conversation_id, reaction_msg) + .await?; + + client.send_message(OutgoingMessage::ActionConfirmed { + action: "reaction_removed".to_string(), + success: true, + }).await?; + } IncomingMessage::JoinConversation { conversation_id } => { info!( "๐Ÿ”— Client {} ({}) rejoint la conversation {}", diff --git a/veza-chat-server/src/websocket/mod.rs b/veza-chat-server/src/websocket/mod.rs index 3da414dc0..a4b39a323 100644 --- a/veza-chat-server/src/websocket/mod.rs +++ b/veza-chat-server/src/websocket/mod.rs @@ -27,6 +27,7 @@ pub enum IncomingMessage { conversation_id: Uuid, content: String, parent_message_id: Option, + attachments: Option>, }, /// Rejoindre une conversation JoinConversation { conversation_id: Uuid }, @@ -58,6 +59,17 @@ pub enum IncomingMessage { message_id: Uuid, conversation_id: Uuid, }, + /// Ajouter une rรฉaction + AddReaction { + message_id: Uuid, + conversation_id: Uuid, + emoji: String, // String representation from ReactionEmoji + }, + /// Retirer une rรฉaction + RemoveReaction { + message_id: Uuid, + conversation_id: Uuid, + }, /// Rรฉcupรฉrer l'historique avec pagination FetchHistory { conversation_id: Uuid, @@ -81,6 +93,15 @@ pub enum IncomingMessage { Ping, } +/// Piรจce jointe ร  un message +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct MessageAttachment { + pub file_name: String, + pub file_type: String, // 'image', 'audio', 'video', 'file' + pub file_url: String, + pub file_size: Option, +} + /// Message WebSocket sortant #[derive(Debug, Clone, Serialize)] #[serde(tag = "type")] @@ -92,6 +113,7 @@ pub enum OutgoingMessage { sender_id: Uuid, content: String, created_at: chrono::DateTime, + attachments: Option>, }, /// Message marquรฉ comme lu MessageRead { @@ -128,6 +150,19 @@ pub enum OutgoingMessage { deleter_id: Uuid, deleted_at: chrono::DateTime, }, + /// Rรฉaction ajoutรฉe + ReactionAdded { + message_id: Uuid, + conversation_id: Uuid, + user_id: Uuid, + emoji: String, + }, + /// Rรฉaction retirรฉe + ReactionRemoved { + message_id: Uuid, + conversation_id: Uuid, + user_id: Uuid, + }, /// Chunk d'historique (pagination) HistoryChunk { conversation_id: Uuid, diff --git a/veza_design_system_v3.html b/veza_design_system_v3.html new file mode 100644 index 000000000..23f2c70e8 --- /dev/null +++ b/veza_design_system_v3.html @@ -0,0 +1,3039 @@ + + + + + + Veza / Talas โ€” Design System v3 ยท Spectre Astral + + + + + + + + + + +
+ +
+ +
+ +
+ +
+
+
+
+ + Spectre Astral ยท Production Ready +
+ +

+ Veza + Talas
+ Design System v3 +

+ +

+ Le systรจme de design unifiรฉ pour l'รฉcosystรจme Veza/Talas. + 250+ composants, accessibilitรฉ WCAG AAA, + dark mode natif, support complet des 600 features. +

+ +
+ + +
+ +
+
+ 250+ + Composants +
+
+ 600 + Features supportรฉes +
+
+ AAA + WCAG Compliance +
+
+ 60 FPS + Animations +
+
+
+
+
+ + +
+
+

Design Tokens

+

+ Les fondations visuelles de Spectre Astral. Chaque couleur, espace et typographie + est dรฉfinie comme token rรฉutilisable pour garantir cohรฉrence absolue. +

+ + +
+

Palette Spectre Astral

+
+
+
+
+ Nadir Black + #0B0C10 โ€” Fond racine +
+
+
+
+
+ Graphite Blue + #1F2833 โ€” Surfaces secondaires +
+
+
+
+
+ Spectral Cyan + #66FCF1 โ€” Accent Veza +
+
+
+
+
+ Anodized Turquoise + #45A29E โ€” Actions primaires +
+
+
+
+
+ Astral Lavender + #8A7EA4 โ€” Accent Talas +
+
+
+
+
+ Soft Ember + #E6B89C โ€” Chaleur communautรฉ +
+
+
+
+
+ Quiet Paper + #F3F3E0 โ€” Texte primaire +
+
+
+
+
+ Muted Grey + #C5C6C7 โ€” Texte secondaire +
+
+
+
+ + +
+

Couleurs Sรฉmantiques

+
+
+
+
+ Success + #10b981 +
+
+
+
+
+ Warning + #f59e0b +
+
+
+
+
+ Error + #ef4444 +
+
+
+
+
+ Info + #3b82f6 +
+
+
+
+
+
+ + +
+
+

Composants

+

+ Bibliothรจque complรจte de 250+ composants prรชts pour la production. + Chaque composant supporte dark mode, accessibilitรฉ clavier et รฉtats multiples. +

+ + +
+

Boutons

+
+ + + +
+
+ + + +
+
+ + + + +
+
+ + +
+

Inputs

+
+
+ + +
+
+ + +
+
+ + + โš  Ce champ contient une erreur +
+
+ + +
+
+
+ + +
+

Badges

+
+ Default + Primary + Secondary + Success + Warning + Error + Veza + Talas +
+
+ + +
+

Avatars

+
+
XS
+
SM
+
MD
+
LG
+
XL
+
2XL
+
+
+
+ JD + +
+
+ AB + +
+
+ CD + +
+
+ EF + +
+
+
+ + +
+

Cards

+
+
+
+

Card Standard

+

Une card de base avec header et body pour afficher du contenu.

+
+
+
+
+

Card Veza

+

Variante avec accent cyan pour les รฉlรฉments techniques.

+
+
+
+
+

Card Talas

+

Variante avec accent lavande pour la communautรฉ.

+
+
+
+
+ + +
+

Audio Player

+
+
+
+
+
Titre du morceau
+
Artiste / Producteur
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + + +
+
+ 1:24 + 3:45 +
+
+
+ + +
+

Chat Messages

+
+
+
+ Salut ! Comment avance le projet ? +
+
+ veza-engine + 12:34 +
+
+
+
+ Super bien ! Je viens de finir l'intรฉgration du module de streaming. +
+
+ Envoyรฉ + 12:35 +
+
+
+ + + +
+
+
+ + +
+

Toasts

+
+
+ โœ“ +
+
Succรจs
+
Votre fichier a รฉtรฉ uploadรฉ avec succรจs.
+
+
+
+ โœ• +
+
Erreur
+
Une erreur est survenue lors du traitement.
+
+
+
+ โš  +
+
Attention
+
Votre session expire dans 5 minutes.
+
+
+
+
+ + +
+

Skeleton Loaders

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + +
+

Progress Bars

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + +
+

Spinners

+
+
+
+
+
+
+
+
+
+ + +
+
+

Patterns UX

+

+ Flows utilisateur standardisรฉs et patterns d'interaction rรฉcurrents + pour garantir une expรฉrience cohรฉrente sur l'ensemble de la plateforme. +

+ + +
+

Empty States

+
+
๐ŸŽต
+

Aucun morceau uploadรฉ

+

+ Commencez ร  partager votre musique avec le monde. + Uploadez votre premier morceau maintenant. +

+ +
+
+ + +
+

Tabs

+
+
+ + + + +
+
+

Contenu de l'onglet Overview...

+
+
+
+ + +
+

Online Status

+
+
+ + En ligne +
+
+ + Absent +
+
+ + Hors ligne +
+
+
+
+
+ + +
+
+

Accessibilitรฉ

+

+ Conformitรฉ WCAG AAA garantie. Navigation clavier complรจte, + support lecteurs d'รฉcran, et contrastes validรฉs. +

+ +
+
+
+

Contraste AAA

+

+ Ratio minimum 7:1 pour le texte normal, 4.5:1 pour le texte large. + Tous les รฉlรฉments UI respectent un ratio de 3:1. +

+
+
+
+
+

Navigation Clavier

+

+ Tab, Shift+Tab, Enter, Space, Arrow keys. Focus visible sur tous + les รฉlรฉments interactifs. Skip links disponibles. +

+
+
+
+
+

Screen Readers

+

+ Labels ARIA complets, roles sรฉmantiques, live regions pour les + mises ร  jour dynamiques. Testรฉ NVDA, JAWS, VoiceOver. +

+
+
+
+
+
+
+ + +
+
+ +
+
+
+ + + + diff --git a/veza_design_system_v4.html b/veza_design_system_v4.html new file mode 100644 index 000000000..d66bd62e7 --- /dev/null +++ b/veza_design_system_v4.html @@ -0,0 +1,2485 @@ + + + + + + VEZA ร— TALAS โ€” Design System v4 ยท NEON_REFINED + + + + + + + + +
+ +
+
+
+ +
+
+ VEZAร—TALAS +
+
+ + + + +
+
+
+ +
+ +
+
+
+ + Design System v4.0 +
+ +

+ NEON + REFINED + DESIGN +

+ +

+ Un systรจme de design รฉpurรฉ et cohรฉrent. L'essence du style urbain-tech + distillรฉe en composants production-ready. +

+ +
+ + +
+ +
+
+ 250+ + Components +
+
+ AAA + WCAG +
+
+ 60fps + Animations +
+
+
+
+ + +
+
+
+ +

Color System

+

+ Une palette nรฉon raffinรฉe pour des interfaces qui se dรฉmarquent tout en restant lisibles. +

+
+ +
+
+
+
+
Cyan
+
#00e5ff
+
+
+
+
+
+
Magenta
+
#ff0080
+
+
+
+
+
+
Green
+
#00ff88
+
+
+
+
+
+
Orange
+
#ff6600
+
+
+
+
+
+
Black
+
#08080c
+
+
+
+
+
+
Surface
+
#14141c
+
+
+
+
+
+
Text
+
#f0f0f5
+
+
+
+
+
+
Gradient
+
Cyan โ†’ Magenta
+
+
+
+
+
+ + +
+
+
+ +

UI Elements

+

+ Des composants essentiels, raffinรฉs et prรชts pour la production. +

+
+ +
+ +
+
Buttons
+
+ + + + + +
+
+ + + + +
+
+ + +
+
Badges & Tags
+
+ Default + Cyan + Magenta + Live + Warning + Error +
+
+ Tag + Active + With Removeร— +
+
+ + +
+
Form Inputs
+
+
+ + +
+
+ + + โœ• This field is required +
+
+ + + โœ“ Looks good! +
+
+
+ + +
+
Avatars
+
+
V
+
V
+
V
+
+ V + +
+
+ T + +
+
+ N + +
+
+
+ + +
+
Cards
+
+
+
+ Card Title + New +
+
+

Card body content with description text.

+
+
+
+
+ + +
+
Toast Notifications
+
+
+ โœ“ +
+
Success
+
Your changes have been saved.
+
+
+
+ โœ• +
+
Error
+
Something went wrong.
+
+
+
+
+
+
+
+ + +
+
+
+ +

Loading States

+

+ Des indicateurs de chargement variรฉs pour chaque situation. +

+
+ +
+ +
+
Spinners
+
+
+
+
+
+
+
+ + +
+
Dots Loader
+
+
+ + + +
+
+
+ + +
+
Pulse Loader
+
+
+
+
+
+
+
+
+ + +
+
Indeterminate Bar
+
+
+
+
+
+
+ + +
+
Progress Bar
+
+
+
+
+
+
+
+
+
+ 85% +
+
+
+
+ + +
+
Circular Progress
+
+
+ + + + + 70% +
+
+
+ + +
+
Glitch Text
+
+ LOADING... +
+
+ + +
+
Skeleton Loaders
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + +
+
+
+ +

Advanced Player

+

+ Un lecteur audio complet avec waveform interactive, queue et equalizer. +

+
+ +
+ +
+
+
โ™ช
+
+
Neon Streets
+
CyberWave โ€ข 2024
+
+ HQ + 320kbps +
+
+
+
+
+
+
+
+
+
+ +
+
+ +
+
+ +
+ 1:24 + 3:45 +
+ +
+
+ + + + + +
+ +
+ +
+
+
+
+
+
+ +
+
+ 1 +
+
+
Neon Streets
+
CyberWave
+
+ 3:45 +
+
+ 2 +
+
+
Digital Dreams
+
SynthMaster
+
+ 4:12 +
+
+ 3 +
+
+
Midnight Run
+
NightDriver
+
+ 3:28 +
+
+
+ + +
+
+
Mini Player
+
+
โ™ช
+
+
Neon Streets
+
CyberWave
+
+
+
+
+ +
+
+ +
+
Compact Controls
+
+ + + + + + +
+
+ +
+
Volume Controls
+
+
+ +
+
+
+
+
+ +
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+ + +
+
+
+ +

Messaging

+

+ Interface de chat moderne et รฉpurรฉe. +

+
+ +
+
+
+
+ # + general +
+ 3 online +
+ +
+
+
N
+
+
Hey! Le nouveau pack de samples est dispo ๐Ÿ”ฅ
+
+ NeonBeats + 14:32 +
+
+
+ +
+
C
+
+
Nice! Les kicks sont vraiment massifs cette fois
+
+ CyberWave + 14:33 +
+
+
+ +
+
+
Je teste รงa tout de suite, vous avez le link?
+
+ Sent + 14:34 +
+
+
+ +
+
N
+
+
+ + + +
+
+
+
+ +
+ + +
+
+ + +
+
+
Message States
+
+
+
U
+
+
Received message
+
+
+
+
+
Sent message
+
+
+
+
+ +
+
Typing Indicator
+
+
+ + + +
+
+
+ +
+
Online Status
+
+
+
+ U + +
+ Online +
+
+
+ U + +
+ Away +
+
+
+ U + +
+ Busy +
+
+
+
+
+
+
+
+ + +
+
+ +
+
+
+ + + + diff --git a/veza_design_system_v5.html b/veza_design_system_v5.html new file mode 100644 index 000000000..701b084f3 --- /dev/null +++ b/veza_design_system_v5.html @@ -0,0 +1,2140 @@ + + + + + + VEZA ยท TALAS โ€” Design System v5 ยท BOTANICAL + + + + + + + + +
+ +
+
+
+ +
+
+
+
+ veza ยท talas +
+
+ + + +
+ + +
+
+
+
+ +
+ +
+
+
+
+ + Open Source ยท v5.0 +
+ +

+ Design with + nature in mind +

+ +

+ Un systรจme de design minimaliste inspirรฉ par les formes organiques + et la sรฉrรฉnitรฉ de la nature. Calme, accessible, open source. +

+ +
+ + +
+ +
+
+ 250+ + Components +
+
+ MIT + License +
+
+ AAA + Accessible +
+
+
+
+
+ + +
+
+
+ +

Earth Palette

+

+ Des couleurs inspirรฉes par la forรชt, la terre et le ciel. Naturellement harmonieuses et apaisantes. +

+
+ +
+
+
+
+
Sage
+
#87a878
+
+
+
+
+
+
Moss
+
#4a5d42
+
+
+
+
+
+
Mint
+
#c8e0c0
+
+
+
+
+
+
Soil
+
#5c4d3c
+
+
+
+
+
+
Amber
+
#d4915d
+
+
+
+
+
+
Sky
+
#7ba3b8
+
+
+
+
+
+
Paper
+
#faf9f6
+
+
+
+
+
+
Ink
+
#2c2c2c
+
+
+
+
+
+ + +
+
+
+ +

Essential Elements

+

+ Des composants รฉpurรฉs qui respectent l'espace et favorisent la clartรฉ. +

+
+ +
+ +
+
Buttons
+
+ + + + +
+
+ + + + +
+
+ + +
+
Badges & Tags
+
+ Default + Sage + Moss + Amber + Sky +
+
+ Nature + Active + Minimal + Open Source +
+
+ + +
+
Form Inputs
+
+
+ + +
+
+ + + โœ“ Email verified +
+
+
+ + +
+
Avatars
+
+
A
+
B
+
+ C + +
+
+ D + +
+
E
+
+
+ + +
+
Cards
+
+
+
+ Simple Card + New +
+
+

Clean and minimal card design.

+
+
+
+
+ Nature Card +

With organic gradient.

+
+
+
+
+ + +
+
Toast Notifications
+
+
+ โœ“ +
+
Saved successfully
+
Your changes have been saved.
+
+
+
+ i +
+
New update available
+
Version 5.1 is ready.
+
+
+
+
+
+
+
+ + +
+
+
+ +

Organic Animations

+

+ Des animations douces inspirรฉes par les rythmes naturels โ€” respiration, croissance, mouvement des feuilles. +

+
+ +
+ +
+
Spinner
+
+
+
+
+
+
+
+ + +
+
Seed Dots
+
+
+ + + +
+
+
+ + +
+
Breathing
+
+
+
+
+ + +
+
Falling Leaves
+
+
+
+
+
+
+
+
+ + +
+
Growth Bar
+
+
+
+
+
+
+
+
+
+ + +
+
Ring Progress
+
+
+ + + + + 75% +
+
+
+ + +
+
Skeleton
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + +
+
+
+ +

Calm Listening

+

+ Un lecteur audio serein avec une interface รฉpurรฉe et des contrรดles intuitifs. +

+
+ +
+ +
+
+
๐ŸŒฟ
+
+
Forest Meditation
+
Ambient Nature ยท 2024
+
+ Lossless +
+
+
+ +
+
+
+ +
+ 2:34 + 8:12 +
+ +
+
+ + + + + +
+ +
+ +
+
+
+
+
+ +
+
+ 1 +
+
+
Forest Meditation
+
Ambient Nature
+
+ 8:12 +
+
+ 2 +
+
+
Morning Dew
+
Calm Waters
+
+ 6:45 +
+
+ 3 +
+
+
Autumn Breeze
+
Seasonal Sounds
+
+ 5:30 +
+
+
+ + +
+
+
Compact Progress
+
+
+
+
+
+
+
+
+ +
+
Control Buttons
+
+ + + + + +
+
+ +
+
Volume Levels
+
+
+ ๐Ÿ”‡ +
+
+
+
+
+ ๐Ÿ”ˆ +
+
+
+
+
+ ๐Ÿ”Š +
+
+
+
+
+
+
+
+
+
+ + +
+
+
+ +

Peaceful Messaging

+

+ Une interface de conversation calme et focalisรฉe. +

+
+ +
+
+
+
+ # + garden-talk +
+ 3 online +
+ +
+
+
M
+
+
The tomatoes are finally ripening! ๐Ÿ…
+
Maya ยท 2:34 PM
+
+
+ +
+
J
+
+
That's wonderful! Mine are still green. What variety did you plant?
+
Jonas ยท 2:36 PM
+
+
+ +
+
+
I'm using the Cherokee Purple heirloom variety. They take longer but worth it!
+
Sent ยท 2:38 PM
+
+
+ +
+
M
+
+
+ + + +
+
+
+
+ +
+ + +
+
+ + +
+
+
Message Bubbles
+
+
+
U
+
+
Incoming message
+
+
+
+
+
Outgoing message
+
+
+
+
+ +
+
Typing Indicator
+
+
+ + + +
+
+
+ +
+
Status Indicators
+
+
+
+ U + +
+ Online +
+
+
+ U + +
+ Away +
+
+
+ U + +
+ Offline +
+
+
+
+
+
+
+
+ + +
+
+ +
+
+
+ + + +