veza/vitest_output.txt
senke ae586f6134 Phase 2 stabilisation: code mort, Modal→Dialog, feature flags, tests, router split, Rust legacy
Bloc A - Code mort:
- Suppression Studio (components, views, features)
- Suppression gamification + services mock (projectService, storageService, gamificationService)
- Mise à jour Sidebar, Navbar, locales

Bloc B - Frontend:
- Suppression modal.tsx deprecated, Modal.stories (doublon Dialog)
- Feature flags: PLAYLIST_SEARCH, PLAYLIST_RECOMMENDATIONS, ROLE_MANAGEMENT = true
- Suppression 19 tests orphelins, retrait exclusions vitest.config

Bloc C - Backend:
- Extraction routes_auth.go depuis router.go

Bloc D - Rust:
- Suppression security_legacy.rs (code mort, patterns déjà dans security/)
2026-02-14 17:23:32 +01:00

3533 lines
254 KiB
Text
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

RUN v3.2.4 /home/senke/git/talas/veza/apps/web
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should queue POST requests
[INFO] [OfflineQueue] Queue cleared
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should queue POST requests
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks {"requestId":"req_1771008278562_4rvj7225p","priority":"normal","queueSize":1}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should not queue GET requests
[INFO] [OfflineQueue] Queue cleared
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should queue PUT requests
[INFO] [OfflineQueue] Queue cleared
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should queue PUT requests
[INFO] [OfflineQueue] Request queued: PUT /api/v1/tracks/123 {"requestId":"req_1771008278568_t3v5qyoif","priority":"normal","queueSize":1}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should queue DELETE requests
[INFO] [OfflineQueue] Queue cleared
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should queue DELETE requests
[INFO] [OfflineQueue] Request queued: DELETE /api/v1/tracks/123 {"requestId":"req_1771008278569_001pnmkbe","priority":"normal","queueSize":1}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should queue PATCH requests
[INFO] [OfflineQueue] Queue cleared
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should queue PATCH requests
[INFO] [OfflineQueue] Request queued: PATCH /api/v1/tracks/123 {"requestId":"req_1771008278570_noyjh3t8k","priority":"normal","queueSize":1}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should respect priority levels
[INFO] [OfflineQueue] Queue cleared
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should respect priority levels
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks {"requestId":"req_1771008278573_t26yqbfpo","priority":"low","queueSize":1}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should respect priority levels
[INFO] [OfflineQueue] Request queued: POST /api/v1/playlists {"requestId":"req_1771008278574_ewviry4vg","priority":"high","queueSize":2}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should respect priority levels
[INFO] [OfflineQueue] Request queued: POST /api/v1/comments {"requestId":"req_1771008278574_1z15d22if","priority":"normal","queueSize":3}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Queue cleared
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/0 {"requestId":"req_1771008278575_5tyfk5ijl","priority":"normal","queueSize":1}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/1 {"requestId":"req_1771008278576_zwynwlcn8","priority":"normal","queueSize":2}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/2 {"requestId":"req_1771008278576_zsv88dd4a","priority":"normal","queueSize":3}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/3 {"requestId":"req_1771008278576_fb1kd03tf","priority":"normal","queueSize":4}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/4 {"requestId":"req_1771008278576_zggpxi1xu","priority":"normal","queueSize":5}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/5 {"requestId":"req_1771008278576_g60z548gs","priority":"normal","queueSize":6}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/6 {"requestId":"req_1771008278576_5btz52rlc","priority":"normal","queueSize":7}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/7 {"requestId":"req_1771008278576_vvkrl5l03","priority":"normal","queueSize":8}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/8 {"requestId":"req_1771008278577_fu760prw4","priority":"normal","queueSize":9}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/9 {"requestId":"req_1771008278577_xulfqdmla","priority":"normal","queueSize":10}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/10 {"requestId":"req_1771008278577_cyowqyl98","priority":"normal","queueSize":11}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/11 {"requestId":"req_1771008278577_7y6tg357i","priority":"normal","queueSize":12}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/12 {"requestId":"req_1771008278577_oehxhdmd8","priority":"normal","queueSize":13}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/13 {"requestId":"req_1771008278577_s4pn6l8xd","priority":"normal","queueSize":14}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/14 {"requestId":"req_1771008278577_579hkv5l0","priority":"normal","queueSize":15}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/15 {"requestId":"req_1771008278577_37lg5xyej","priority":"normal","queueSize":16}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/16 {"requestId":"req_1771008278577_e1k01rhs2","priority":"normal","queueSize":17}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/17 {"requestId":"req_1771008278577_gu06m7nc4","priority":"normal","queueSize":18}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/18 {"requestId":"req_1771008278577_oxfnc1vwu","priority":"normal","queueSize":19}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/19 {"requestId":"req_1771008278577_iehtuafes","priority":"normal","queueSize":20}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/20 {"requestId":"req_1771008278578_nw1yhin4e","priority":"normal","queueSize":21}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/21 {"requestId":"req_1771008278578_m9iur28qd","priority":"normal","queueSize":22}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/22 {"requestId":"req_1771008278578_3zo3u8wup","priority":"normal","queueSize":23}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/23 {"requestId":"req_1771008278578_kccux6pgf","priority":"normal","queueSize":24}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/24 {"requestId":"req_1771008278578_fxbq1m1zx","priority":"normal","queueSize":25}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/25 {"requestId":"req_1771008278578_aaksm5tqt","priority":"normal","queueSize":26}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/26 {"requestId":"req_1771008278578_6l8r03jq2","priority":"normal","queueSize":27}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/27 {"requestId":"req_1771008278578_g8gej4v9k","priority":"normal","queueSize":28}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/28 {"requestId":"req_1771008278578_x1lm7ryu5","priority":"normal","queueSize":29}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/29 {"requestId":"req_1771008278579_e2cojpnz2","priority":"normal","queueSize":30}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/30 {"requestId":"req_1771008278579_90khld8bf","priority":"normal","queueSize":31}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/31 {"requestId":"req_1771008278579_71e4lw7b2","priority":"normal","queueSize":32}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/32 {"requestId":"req_1771008278579_x8bq86bxk","priority":"normal","queueSize":33}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/33 {"requestId":"req_1771008278579_ksjmtwkym","priority":"normal","queueSize":34}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/34 {"requestId":"req_1771008278579_fckq4os5e","priority":"normal","queueSize":35}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/35 {"requestId":"req_1771008278579_wlcxr35nh","priority":"normal","queueSize":36}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/36 {"requestId":"req_1771008278579_2ddgpphlw","priority":"normal","queueSize":37}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/37 {"requestId":"req_1771008278579_gh2otddxi","priority":"normal","queueSize":38}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/38 {"requestId":"req_1771008278579_d3kqrdxoj","priority":"normal","queueSize":39}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/39 {"requestId":"req_1771008278580_q6dy88hzf","priority":"normal","queueSize":40}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/40 {"requestId":"req_1771008278580_g5pim85bn","priority":"normal","queueSize":41}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/41 {"requestId":"req_1771008278580_zpri2uq23","priority":"normal","queueSize":42}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/42 {"requestId":"req_1771008278580_76edgfmfp","priority":"normal","queueSize":43}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/43 {"requestId":"req_1771008278580_q8xobvhsp","priority":"normal","queueSize":44}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/44 {"requestId":"req_1771008278580_sosdb5tm2","priority":"normal","queueSize":45}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/45 {"requestId":"req_1771008278580_zk3cuuh9g","priority":"normal","queueSize":46}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/46 {"requestId":"req_1771008278580_jj6r7qha5","priority":"normal","queueSize":47}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/47 {"requestId":"req_1771008278581_jub4x7iqo","priority":"normal","queueSize":48}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/48 {"requestId":"req_1771008278581_jjfbizecl","priority":"normal","queueSize":49}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/49 {"requestId":"req_1771008278581_m2n92smnz","priority":"normal","queueSize":50}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/50 {"requestId":"req_1771008278581_p6p9oihqv","priority":"normal","queueSize":51}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/51 {"requestId":"req_1771008278581_6ocxxva2x","priority":"normal","queueSize":52}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/52 {"requestId":"req_1771008278581_fanfoui0e","priority":"normal","queueSize":53}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/53 {"requestId":"req_1771008278581_fovlqddmp","priority":"normal","queueSize":54}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/54 {"requestId":"req_1771008278582_7ii2ucoir","priority":"normal","queueSize":55}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/55 {"requestId":"req_1771008278582_veg7prthf","priority":"normal","queueSize":56}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/56 {"requestId":"req_1771008278582_y1uxhpjvm","priority":"normal","queueSize":57}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/57 {"requestId":"req_1771008278582_k23p1nijz","priority":"normal","queueSize":58}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/58 {"requestId":"req_1771008278582_58g3xg61q","priority":"normal","queueSize":59}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/59 {"requestId":"req_1771008278582_9m2312tqf","priority":"normal","queueSize":60}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/60 {"requestId":"req_1771008278584_i9u6k18gc","priority":"normal","queueSize":61}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/61 {"requestId":"req_1771008278584_6kkusqo63","priority":"normal","queueSize":62}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/62 {"requestId":"req_1771008278585_snupkfhoi","priority":"normal","queueSize":63}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/63 {"requestId":"req_1771008278585_eivrevww4","priority":"normal","queueSize":64}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/64 {"requestId":"req_1771008278585_au7jcttwz","priority":"normal","queueSize":65}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/65 {"requestId":"req_1771008278586_l3qx6w84j","priority":"normal","queueSize":66}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/66 {"requestId":"req_1771008278586_bs857w1d2","priority":"normal","queueSize":67}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/67 {"requestId":"req_1771008278586_wfjmv16gg","priority":"normal","queueSize":68}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/68 {"requestId":"req_1771008278587_totzmg3e7","priority":"normal","queueSize":69}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/69 {"requestId":"req_1771008278587_z917y0ed4","priority":"normal","queueSize":70}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/70 {"requestId":"req_1771008278587_rlo7gqm0e","priority":"normal","queueSize":71}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/71 {"requestId":"req_1771008278588_jd2ivc2oj","priority":"normal","queueSize":72}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/72 {"requestId":"req_1771008278588_0dp22y1p4","priority":"normal","queueSize":73}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/73 {"requestId":"req_1771008278588_zqj11orc5","priority":"normal","queueSize":74}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/74 {"requestId":"req_1771008278589_6y6furh8q","priority":"normal","queueSize":75}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/75 {"requestId":"req_1771008278589_dl0gjhebd","priority":"normal","queueSize":76}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/76 {"requestId":"req_1771008278589_dlwcc4kkv","priority":"normal","queueSize":77}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/77 {"requestId":"req_1771008278590_62oow5p3j","priority":"normal","queueSize":78}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/78 {"requestId":"req_1771008278590_cj23qmofw","priority":"normal","queueSize":79}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/79 {"requestId":"req_1771008278591_sl3o7negm","priority":"normal","queueSize":80}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/80 {"requestId":"req_1771008278592_ecm1qkeni","priority":"normal","queueSize":81}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/81 {"requestId":"req_1771008278592_p2dxvb1ka","priority":"normal","queueSize":82}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/82 {"requestId":"req_1771008278593_ugg64ciet","priority":"normal","queueSize":83}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/83 {"requestId":"req_1771008278593_ikxc6a8uj","priority":"normal","queueSize":84}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/84 {"requestId":"req_1771008278594_3adupejxg","priority":"normal","queueSize":85}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/85 {"requestId":"req_1771008278594_cf5iz4go4","priority":"normal","queueSize":86}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/86 {"requestId":"req_1771008278595_38flnwq78","priority":"normal","queueSize":87}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/87 {"requestId":"req_1771008278595_qen1khw5z","priority":"normal","queueSize":88}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/88 {"requestId":"req_1771008278595_0qebx1w1l","priority":"normal","queueSize":89}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/89 {"requestId":"req_1771008278596_zx9eg498r","priority":"normal","queueSize":90}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/90 {"requestId":"req_1771008278596_r8s5omh5v","priority":"normal","queueSize":91}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/91 {"requestId":"req_1771008278598_mgnfr5lr3","priority":"normal","queueSize":92}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/92 {"requestId":"req_1771008278599_t7sfjm4xl","priority":"normal","queueSize":93}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/93 {"requestId":"req_1771008278599_lzfkf2pdp","priority":"normal","queueSize":94}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/94 {"requestId":"req_1771008278600_9mo2cqlnw","priority":"normal","queueSize":95}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/95 {"requestId":"req_1771008278600_n9wkac0b2","priority":"normal","queueSize":96}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/96 {"requestId":"req_1771008278601_z1m1jxv8w","priority":"normal","queueSize":97}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/97 {"requestId":"req_1771008278601_5dn1qtqcu","priority":"normal","queueSize":98}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/98 {"requestId":"req_1771008278601_wwjbbadyn","priority":"normal","queueSize":99}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/99 {"requestId":"req_1771008278602_nf85903id","priority":"normal","queueSize":100}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > queueRequest > should evict oldest low-priority request when queue is full
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks/new {"requestId":"req_1771008278603_1uopq991t","priority":"low","queueSize":100}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > processQueue > should process queued requests when online
[INFO] [OfflineQueue] Queue cleared
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > processQueue > should process queued requests when online
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks {"requestId":"req_1771008278607_7j49mibvi","priority":"normal","queueSize":1}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > processQueue > should process queued requests when online
[INFO] [OfflineQueue] Processing 1 queued requests
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > processQueue > should process queued requests when online
[INFO] [OfflineQueue] Request succeeded: POST /api/v1/tracks {"requestId":"req_1771008278607_7j49mibvi"}
src/hooks/usePreload.test.ts (7 tests | 3 failed) 96ms
× usePreload > should preload images 55ms
→ waitFor is not defined
× usePreload > should preload scripts 6ms
→ waitFor is not defined
× usePreload > should preload styles 6ms
→ waitFor is not defined
✓ usePreload > should prefetch resources 7ms
✓ usePreload > should cleanup preload links on unmount 6ms
✓ usePreloadRoute > should prefetch route 4ms
✓ usePreloadRoute > should cleanup prefetch link on unmount 4ms
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > processQueue > should process queued requests when online
[INFO] [OfflineQueue] All queued requests processed successfully
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > processQueue > should not process queue when offline
[INFO] [OfflineQueue] Queue cleared
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > processQueue > should not process queue when offline
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks {"requestId":"req_1771008278713_cfouwxyqn","priority":"normal","queueSize":1}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > processQueue > should retry failed requests up to max retries
[INFO] [OfflineQueue] Queue cleared
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > processQueue > should retry failed requests up to max retries
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks {"requestId":"req_1771008278714_aktjui1us","priority":"normal","queueSize":1}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > processQueue > should retry failed requests up to max retries
[INFO] [OfflineQueue] Processing 1 queued requests
src/features/streaming/hooks/usePlaybackRealtime.test.ts (13 tests | 8 failed) 255ms
✓ usePlaybackRealtime > should initialize with default state 70ms
✓ usePlaybackRealtime > should connect to WebSocket when trackId is provided and autoConnect is true 24ms
✓ usePlaybackRealtime > should not connect when autoConnect is false 8ms
✓ usePlaybackRealtime > should subscribe to track after connection 15ms
✓ usePlaybackRealtime > should handle analytics_update messages 15ms
× usePlaybackRealtime > should handle stats_update messages 25ms
→ waitFor is not defined
× usePlaybackRealtime > should call onAnalyticsUpdate callback when analytics update is received 10ms
→ waitFor is not defined
× usePlaybackRealtime > should call onStatsUpdate callback when stats update is received 9ms
→ waitFor is not defined
× usePlaybackRealtime > should disconnect when disconnect is called 15ms
→ waitFor is not defined
× usePlaybackRealtime > should reconnect on connection loss 11ms
→ waitFor is not defined
× usePlaybackRealtime > should cleanup on unmount 8ms
→ waitFor is not defined
× usePlaybackRealtime > should handle invalid JSON messages gracefully 8ms
→ waitFor is not defined
× usePlaybackRealtime > should update connection state when trackId changes 8ms
→ waitFor is not defined
stdout | src/features/streaming/services/playbackAnalyticsService.test.ts > playbackAnalyticsService > recordPlaybackEvent > should retry on network error
[ERROR] [PlaybackAnalytics] Failed to record event: {"trackId":"42","playTime":180,"error":"Network error: Unable to connect to server. Please check your connection and try again.","status":0,"timestamp":"2026-02-13T18:44:39.163Z"}
stdout | src/features/streaming/services/playbackAnalyticsService.test.ts > playbackAnalyticsService > recordPlaybackEvent > should retry on network error
[ERROR] [PlaybackAnalytics] Failed to record event: {"trackId":"42","playTime":180,"error":"Network error: Unable to connect to server. Please check your connection and try again.","status":0,"timestamp":"2026-02-13T18:44:40.163Z"}
stdout | src/features/streaming/services/playbackAnalyticsService.test.ts > playbackAnalyticsService > recordPlaybackEvent > should save to localStorage on final failure
[ERROR] [PlaybackAnalytics] Failed to record event: {"trackId":"42","playTime":180,"error":"Network error: Unable to connect to server. Please check your connection and try again.","status":0,"timestamp":"2026-02-13T18:44:39.171Z"}
stdout | src/features/streaming/services/playbackAnalyticsService.test.ts > playbackAnalyticsService > recordPlaybackEvent > should save to localStorage on final failure
[INFO] [PlaybackAnalytics] Saved event to localStorage (1 pending) {"trackId":"42","playTime":180}
stdout | src/features/streaming/hooks/usePlaybackAnalytics.test.ts > usePlaybackAnalytics > should handle errors when sending analytics
[ERROR] [PlaybackAnalytics] Failed to record playback analytics after all retries: {"error":{}}
stdout | src/features/streaming/services/playbackAnalyticsService.test.ts > playbackAnalyticsService > recordPlaybackEvent > should not retry on 400 error
[ERROR] [PlaybackAnalytics] Failed to record event: {"trackId":"42","playTime":180,"error":"Invalid request","status":400,"timestamp":"2026-02-13T18:44:39.178Z"}
stdout | src/features/streaming/services/playbackAnalyticsService.test.ts > playbackAnalyticsService > recordPlaybackEvent > should not retry on 400 error
[INFO] [PlaybackAnalytics] Saved event to localStorage (1 pending) {"trackId":"42","playTime":180}
stdout | src/features/streaming/services/playbackAnalyticsService.test.ts > playbackAnalyticsService > recordPlaybackEvent > should not retry on 401 error
[ERROR] [PlaybackAnalytics] Failed to record event: {"trackId":"42","playTime":180,"error":"Unauthorized","status":401,"timestamp":"2026-02-13T18:44:39.182Z"}
stdout | src/features/streaming/services/playbackAnalyticsService.test.ts > playbackAnalyticsService > recordPlaybackEvent > should not retry on 401 error
[INFO] [PlaybackAnalytics] Saved event to localStorage (1 pending) {"trackId":"42","playTime":180}
stdout | src/features/streaming/services/playbackAnalyticsService.test.ts > playbackAnalyticsService > recordPlaybackEvent > should call onError callback on error
[ERROR] [PlaybackAnalytics] Failed to record event: {"trackId":"42","playTime":180,"error":"Server error","status":500,"timestamp":"2026-02-13T18:44:39.185Z"}
stdout | src/features/streaming/services/playbackAnalyticsService.test.ts > playbackAnalyticsService > recordPlaybackEvent > should call onError callback on error
[INFO] [PlaybackAnalytics] Saved event to localStorage (1 pending) {"trackId":"42","playTime":180}
stdout | src/features/streaming/services/playbackAnalyticsService.test.ts > playbackAnalyticsService > recordPlaybackEvent > should call onRetry callback on retry
[ERROR] [PlaybackAnalytics] Failed to record event: {"trackId":"42","playTime":180,"error":"Network error: Unable to connect to server. Please check your connection and try again.","status":0,"timestamp":"2026-02-13T18:44:39.188Z"}
stdout | src/features/streaming/services/playbackAnalyticsService.test.ts > playbackAnalyticsService > recordPlaybackEvent > should skip retry if skipRetry option is true
[ERROR] [PlaybackAnalytics] Failed to record event: {"trackId":"42","playTime":180,"error":"Server error","status":500,"timestamp":"2026-02-13T18:44:39.200Z"}
stdout | src/features/streaming/services/playbackAnalyticsService.test.ts > playbackAnalyticsService > recordPlaybackEvent > should skip retry if skipRetry option is true
[INFO] [PlaybackAnalytics] Saved event to localStorage (1 pending) {"trackId":"42","playTime":180}
stdout | src/features/streaming/services/playbackAnalyticsService.test.ts > playbackAnalyticsService > recordPlaybackEvent > should skip fallback if skipFallback option is true
[ERROR] [PlaybackAnalytics] Failed to record event: {"trackId":"42","playTime":180,"error":"Network error: Unable to connect to server. Please check your connection and try again.","status":0,"timestamp":"2026-02-13T18:44:39.202Z"}
stdout | src/features/streaming/services/playbackAnalyticsService.test.ts > playbackAnalyticsService > getPlaybackDashboard > should retry on network error
[ERROR] [PlaybackAnalytics] Failed to get dashboard: {"trackId":"42","error":"Network error: Unable to connect to server. Please check your connection and try again.","status":0,"timestamp":"2026-02-13T18:44:39.206Z"}
stdout | src/features/streaming/services/playbackAnalyticsService.test.ts > playbackAnalyticsService > retryPendingAnalytics > should retry pending analytics successfully
[INFO] [PlaybackAnalytics] Retried 1 pending events
stdout | src/features/streaming/services/playbackAnalyticsService.test.ts > playbackAnalyticsService > retryPendingAnalytics > should remove events after max retries
[ERROR] [PlaybackAnalytics] Failed to record event: {"trackId":"42","playTime":180,"error":"Network error: Unable to connect to server. Please check your connection and try again.","status":0,"timestamp":"2026-02-13T18:44:39.217Z"}
stdout | src/features/streaming/services/playbackAnalyticsService.test.ts > playbackAnalyticsService > retryPendingAnalytics > should remove events after max retries
[WARN] [PlaybackAnalytics] Removed event after 5 failed retries {"trackId":"42"}
✓ src/features/streaming/services/playbackAnalyticsService.test.ts (17 tests) 77ms
✓ src/features/streaming/hooks/usePlaybackAnalytics.test.ts (19 tests) 235ms
stdout | src/features/streaming/components/PlaybackSummary.test.tsx > PlaybackSummary > should render error state
[ERROR] Failed to load playback summary: {"message":"Failed to fetch"}
✓ src/features/streaming/components/PlaybackSummary.test.tsx (12 tests) 809ms
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > processQueue > should retry failed requests up to max retries
[ERROR] [OfflineQueue] Request failed after 3 retries: POST /api/v1/tracks {"requestId":"req_1771008278714_aktjui1us","error":{}}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > processQueue > should retry failed requests up to max retries
[INFO] [OfflineQueue] All queued requests processed successfully
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > processQueue > should remove request from queue after max retries
[INFO] [OfflineQueue] Queue cleared
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > processQueue > should remove request from queue after max retries
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks {"requestId":"req_1771008281724_dap850qls","priority":"normal","queueSize":1}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > processQueue > should remove request from queue after max retries
[INFO] [OfflineQueue] Processing 1 queued requests
src/features/settings/pages/SettingsPage.test.tsx (6 tests | 2 failed) 2689ms
✓ SettingsPage > should load and display settings 320ms
✓ SettingsPage > should display loading state 38ms
✓ SettingsPage > should save settings on button click 138ms
✓ SettingsPage > should display validation errors 49ms
× SettingsPage > should handle load error 1050ms
→ Unable to find an element with the text: /failed to load settings/i. This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible.
Ignored nodes: comments, script, style
<body>
<div>
<div
class="container mx-auto px-4 py-8 flex items-center justify-center min-h-layout-page"
>
<div
class="flex flex-col rounded-lg text-card-foreground transition-[box-shadow,background-color,border-color] duration-[var(--sumi-duration-normal)] ease-out relative overflow-hidden bg-card border shadow-card hover:shadow-card-hover hover:bg-card/95 border-destructive/30 glass"
data-slot="card"
>
<div
class="relative z-10 w-full h-full flex flex-col"
>
<div
class="p-4 pt-6"
data-slot="card-content"
>
<div
aria-live="polite"
class="rounded-lg border flex shadow-card bg-destructive/10 border-destructive/30 text-destructive p-4 gap-4"
role="alert"
>
<div
class="flex-shrink-0 pt-0.5"
>
<svg
class="lucide lucide-alert-circle w-5 h-5 text-destructive"
fill="none"
height="24"
stroke="currentColor"
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
viewBox="0 0 24 24"
width="24"
xmlns="http://www.w3.org/2000/svg"
>
<circle
cx="12"
cy="12"
r="10"
/>
<line
x1="12"
x2="12"
y1="8"
y2="12"
/>
<line
x1="12"
x2="12.01"
y1="16"
y2="16"
/>
</svg>
</div>
<div
class="flex-1 min-w-0"
>
<div
class="font-semibold mb-1 text-base"
>
Error
</div>
<div
class="opacity-90 text-sm"
>
Une erreur inattendue s'est produite. Veuillez réessayer.
</div>
<div
class="mt-4 flex flex-wrap gap-2 items-center"
>
<button
class="inline-flex items-center justify-center whitespace-nowrap rounded-full text-sm font-sans font-medium tracking-tight transition-[color,box-shadow,border-color,background-color] duration-[var(--sumi-duration-normal)] ease-out focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background focus-visible:shadow-[var(--sumi-shadow-glow)] disabled:pointer-events-none disabled:opacity-50 gap-2 border hover:border-border h-10 px-4 py-2 border-current text-current hover:bg-current/10 bg-transparent"
>
Retry
</button>
<button
class="inline-flex items-center justify-center whitespace-nowrap rounded-full text-sm font-sans font-medium tracking-tight transition-[color,box-shadow,border-color,background-color] duration-[var(--sumi-duration-normal)] ease-out focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background focus-visible:shadow-[var(--sumi-shadow-glow)] disabled:pointer-events-none disabled:opacity-50 gap-2 h-10 px-4 py-2 text-current hover:bg-current/10 hover:text-current"
>
<svg
class="lucide lucide-chevron-down w-4 h-4 mr-1"
fill="none"
height="24"
stroke="currentColor"
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
viewBox="0 0 24 24"
width="24"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="m6 9 6 6 6-6"
/>
</svg>
Show Details
</button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div
class="fixed z-50 flex flex-col gap-2 top-4 right-4"
/>
</div>
</body>
Ignored nodes: comments, script, style
<html>
<head />
<body>
<div>
<div
class="container mx-auto px-4 py-8 flex items-center justify-center min-h-layout-page"
>
<div
class="flex flex-col rounded-lg text-card-foreground transition-[box-shadow,background-color,border-color] duration-[var(--sumi-duration-normal)] ease-out relative overflow-hidden bg-card border shadow-card hover:shadow-card-hover hover:bg-card/95 border-destructive/30 glass"
data-slot="card"
>
<div
class="relative z-10 w-full h-full flex flex-col"
>
<div
class="p-4 pt-6"
data-slot="card-content"
>
<div
aria-live="polite"
class="rounded-lg border flex shadow-card bg-destructive/10 border-destructive/30 text-destructive p-4 gap-4"
role="alert"
>
<div
class="flex-shrink-0 pt-0.5"
>
<svg
class="lucide lucide-alert-circle w-5 h-5 text-destructive"
fill="none"
height="24"
stroke="currentColor"
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
viewBox="0 0 24 24"
width="24"
xmlns="http://www.w3.org/2000/svg"
>
<circle
cx="12"
cy="12"
r="10"
/>
<line
x1="12"
x2="12"
y1="8"
y2="12"
/>
<line
x1="12"
x2="12.01"
y1="16"
y2="16"
/>
</svg>
</div>
<div
class="flex-1 min-w-0"
>
<div
class="font-semibold mb-1 text-base"
>
Error
</div>
<div
class="opacity-90 text-sm"
>
Une erreur inattendue s'est produite. Veuillez réessayer.
</div>
<div
class="mt-4 flex flex-wrap gap-2 items-center"
>
<button
class="inline-flex items-center justify-center whitespace-nowrap rounded-full text-sm font-sans font-medium tracking-tight transition-[color,box-shadow,border-color,background-color] duration-[var(--sumi-duration-normal)] ease-out focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background focus-visible:shadow-[var(--sumi-shadow-glow)] disabled:pointer-events-none disabled:opacity-50 gap-2 border hover:border-border h-10 px-4 py-2 border-current text-current hover:bg-current/10 bg-transparent"
>
Retry
</button>
<button
class="inline-flex items-center justify-center whitespace-nowrap rounded-full text-sm font-sans font-medium tracking-tight transition-[color,box-shadow,border-color,background-color] duration-[var(--sumi-duration-normal)] ease-out focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background focus-visible:shadow-[var(--sumi-shadow-glow)] disabled:pointer-events-none disabled:opacity-50 gap-2 h-10 px-4 py-2 text-current hover:bg-current/10 hover:text-current"
>
<svg
class="lucide lucide-chevron-down w-4 h-4 mr-1"
fill="none"
height="24"
stroke="currentColor"
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
viewBox="0 0 24 24"
width="24"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="m6 9 6 6 6-6"
/>
</svg>
Show Details
</button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div
class="fixed z-50 flex flex-col gap-2 top-4 right-4"
/>
</div>
</body>
</html>
× SettingsPage > should handle save error 1068ms
→ expected "spy" to be called at least once
Ignored nodes: comments, script, style
<html>
<head />
<body>
<div>
<div
class="container mx-auto px-4 py-8 pb-24 max-w-5xl"
>
<div
class="mb-8 flex items-end justify-between"
>
<div>
<h1
class="text-display font-heading text-foreground mb-2"
>
System Config
</h1>
<p
class="text-muted-foreground flex items-center gap-2"
>
<svg
class="lucide lucide-shield w-4 h-4 text-primary"
fill="none"
height="24"
stroke="currentColor"
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
viewBox="0 0 24 24"
width="24"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10"
/>
</svg>
Manage your neural link and interface preferences.
</p>
</div>
<button
class="inline-flex items-center justify-center whitespace-nowrap font-sans tracking-tight transition-[color,box-shadow,border-color,background-color] duration-[var(--sumi-duration-normal)] ease-out focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background focus-visible:shadow-[var(--sumi-shadow-glow)] disabled:pointer-events-none disabled:opacity-50 gap-2 bg-primary text-primary-foreground hover:bg-primary/90 border border-transparent font-semibold h-12 rounded-full px-8 text-base shadow-glow-cyan min-w-36"
>
<svg
class="lucide lucide-save mr-2 h-4 w-4"
fill="none"
height="24"
stroke="currentColor"
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
viewBox="0 0 24 24"
width="24"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2z"
/>
<polyline
points="17 21 17 13 7 13 7 21"
/>
<polyline
points="7 3 7 8 15 8"
/>
</svg>
 Save Config
</button>
</div>
<div
class="flex flex-col rounded-lg text-card-foreground transition-[box-shadow,background-color,border-color] duration-[var(--sumi-duration-normal)] ease-out relative dark:bg-black/20 border overflow-hidden border-border bg-card/80 backdrop-blur-xl"
data-slot="card"
>
<div
class="relative z-10 w-full h-full flex flex-col"
>
<div
class="p-6 border-b border-border bg-muted/20 flex items-center gap-2"
>
<svg
class="lucide lucide-sliders w-5 h-5 text-primary"
fill="none"
height="24"
stroke="currentColor"
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
viewBox="0 0 24 24"
width="24"
xmlns="http://www.w3.org/2000/svg"
>
<line
x1="4"
x2="4"
y1="21"
y2="14"
/>
<line
x1="4"
x2="4"
y1="10"
y2="3"
/>
<line
x1="12"
x2="12"
y1="21"
y2="12"
/>
<line
x1="12"
x2="12"
y1="8"
y2="3"
/>
<line
x1="20"
x2="20"
y1="21"
y2="16"
/>
<line
x1="20"
x2="20"
y1="12"
y2="3"
/>
<line
x1="2"
x2="6"
y1="14"
y2="14"
/>
<line
x1="10"
x2="14"
y1="8"
y2="8"
/>
<line
x1="18"
x2="22"
y1="16"
y2="16"
/>
</svg>
<h2
class="font-bold text-lg"
>
Global Preferences
</h2>
</div>
<div
class="p-6"
>
<div
data-testid="settings-tabs"
>
<button>
Change Language
</button>
</div>
</div>
</div>
</div>
</div>
<div
class="fixed z-50 flex flex-col gap-2 top-4 right-4"
/>
</div>
</body>
</html>
stdout | src/components/search/Search.test.tsx > Search Component > calls onSearch when user submits with Enter
[DEBUG] Search submitted from Search component {"query":"test","component":"Search"}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > processQueue > should remove request from queue after max retries
[ERROR] [OfflineQueue] Request failed after 3 retries: POST /api/v1/tracks {"requestId":"req_1771008281724_dap850qls","error":{}}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > processQueue > should remove request from queue after max retries
[INFO] [OfflineQueue] All queued requests processed successfully
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > getQueueSize > should return current queue size
[INFO] [OfflineQueue] Queue cleared
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > getQueueSize > should return current queue size
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks {"requestId":"req_1771008284731_x2gxejkh0","priority":"normal","queueSize":1}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > getQueueSize > should return current queue size
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks {"requestId":"req_1771008284731_08xe40tpc","priority":"normal","queueSize":2}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > getQueue > should return copy of queue
[INFO] [OfflineQueue] Queue cleared
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > getQueue > should return copy of queue
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks {"requestId":"req_1771008284733_zw21nildj","priority":"normal","queueSize":1}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > clearQueue > should clear all queued requests
[INFO] [OfflineQueue] Queue cleared
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > clearQueue > should clear all queued requests
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks {"requestId":"req_1771008284736_d9a0z6ee4","priority":"normal","queueSize":1}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > clearQueue > should clear all queued requests
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks {"requestId":"req_1771008284737_es58lwzjs","priority":"normal","queueSize":2}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > clearQueue > should clear all queued requests
[INFO] [OfflineQueue] Queue cleared
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > removeRequest > should remove specific request from queue
[INFO] [OfflineQueue] Queue cleared
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > removeRequest > should remove specific request from queue
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks {"requestId":"req_1771008284739_je3aywmof","priority":"normal","queueSize":1}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > removeRequest > should remove specific request from queue
[INFO] [OfflineQueue] Request queued: POST /api/v1/playlists {"requestId":"req_1771008284739_g2v7nsjml","priority":"normal","queueSize":2}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > removeRequest > should remove specific request from queue
[INFO] [OfflineQueue] Request removed from queue: req_1771008284739_je3aywmof
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > removeRequest > should return false if request not found
[INFO] [OfflineQueue] Queue cleared
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > shouldQueueRequest > should return false for GET requests
[INFO] [OfflineQueue] Queue cleared
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > shouldQueueRequest > should return true for POST requests
[INFO] [OfflineQueue] Queue cleared
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > shouldQueueRequest > should return true for PUT requests
[INFO] [OfflineQueue] Queue cleared
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > shouldQueueRequest > should return true for DELETE requests
[INFO] [OfflineQueue] Queue cleared
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > shouldQueueRequest > should return true for PATCH requests
[INFO] [OfflineQueue] Queue cleared
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > persistence > should persist queue to localStorage
[INFO] [OfflineQueue] Queue cleared
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > persistence > should persist queue to localStorage
[INFO] [OfflineQueue] Request queued: POST /api/v1/tracks {"requestId":"req_1771008284750_r6tft7zn6","priority":"normal","queueSize":1}
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > persistence > should load queue from localStorage on initialization
[INFO] [OfflineQueue] Queue cleared
stdout | src/services/offlineQueue.test.ts > OfflineQueueService > persistence > should filter out old requests (>24 hours) on load
[INFO] [OfflineQueue] Queue cleared
✓ src/services/offlineQueue.test.ts (24 tests) 6205ms
✓ OfflineQueueService > processQueue > should retry failed requests up to max retries 3009ms
✓ OfflineQueueService > processQueue > should remove request from queue after max retries 3006ms
stdout | src/components/search/Search.test.tsx > Search Component > shows suggestions when fetchSuggestions is provided
[DEBUG] Suggestions loaded {"query":"track","count":1,"component":"Search"}
stdout | src/components/search/Search.test.tsx > Search Component > calls onResultSelect when suggestion is clicked
[DEBUG] Suggestions loaded {"query":"track","count":1,"component":"Search"}
stdout | src/components/search/Search.test.tsx > Search Component > calls onResultSelect when suggestion is clicked
[DEBUG] Search result selected from Search component {"type":"track","id":"1","component":"Search"}
stdout | src/components/search/Search.test.tsx > Search Component > adds query to history when searching
[DEBUG] Search submitted from Search component {"query":"new search","component":"Search"}
✓ src/features/auth/pages/ResetPasswordPage.test.tsx (14 tests) 5666ms
✓ ResetPasswordPage > should render reset password form when token is present 511ms
✓ ResetPasswordPage > should validate password minimum length 445ms
✓ ResetPasswordPage > should validate password confirmation match 540ms
✓ ResetPasswordPage > should call handleReset with form data on valid submission 446ms
✓ ResetPasswordPage > should redirect to login after successful reset 3057ms
stdout | src/components/search/Search.test.tsx > Search Component > limits history items to maxHistoryItems
[DEBUG] Search submitted from Search component {"query":"search 1","component":"Search"}
stdout | src/components/search/Search.test.tsx > Search Component > limits history items to maxHistoryItems
[DEBUG] Search submitted from Search component {"query":"search 2","component":"Search"}
stdout | src/components/search/Search.test.tsx > Search Component > limits history items to maxHistoryItems
[DEBUG] Search submitted from Search component {"query":"search 3","component":"Search"}
stdout | src/services/responseCache.test.ts > ResponseCacheService > get > should return null for non-GET requests
[INFO] [ResponseCache] Cache cleared (0 entries)
stdout | src/services/responseCache.test.ts > ResponseCacheService > get > should return null when cache is empty
[INFO] [ResponseCache] Cache cleared (0 entries)
stdout | src/services/responseCache.test.ts > ResponseCacheService > get > should return cached response for GET request
[INFO] [ResponseCache] Cache cleared (0 entries)
stdout | src/services/responseCache.test.ts > ResponseCacheService > get > should return cached response for GET request
[DEBUG] [ResponseCache] Cached: /api/v1/tracks {"key":"GET:/api/v1/tracks:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cache hit: /api/v1/tracks {"key":"GET:/api/v1/tracks:","age":0}
stdout | src/services/responseCache.test.ts > ResponseCacheService > get > should return null for expired cache entries
[INFO] [ResponseCache] Cache cleared (1 entries)
stdout | src/services/responseCache.test.ts > ResponseCacheService > get > should return null for expired cache entries
[DEBUG] [ResponseCache] Cached: /api/v1/tracks {"key":"GET:/api/v1/tracks:","maxAge":1,"etag":"none"}
stdout | src/components/search/Search.test.tsx > Search Component > limits history items to maxHistoryItems
[DEBUG] Search submitted from Search component {"query":"search 4","component":"Search"}
stdout | src/components/search/Search.test.tsx > Search Component > navigates suggestions with arrow keys
[DEBUG] Suggestions loaded {"query":"1","count":3,"component":"Search"}
✓ src/features/auth/__tests__/auth.integration.test.tsx (30 tests) 3900ms
✓ Auth Pages Integration Tests > Page rendering > should render login page correctly 327ms
✓ Auth Pages Integration Tests > Complete Authentication Flow > should complete full login flow with form interaction 440ms
✓ Auth Pages Integration Tests > Complete Authentication Flow > should complete full registration flow with form interaction 807ms
✓ Auth Pages Integration Tests > Complete Authentication Flow > should complete reset password flow with form interaction 431ms
✓ Auth Pages Integration Tests > Complete Authentication Flow > should handle password mismatch validation in reset password flow 361ms
✓ Auth Pages Integration Tests > Complete Authentication Flow > should handle remember me checkbox interaction 300ms
stdout | src/services/responseCache.test.ts > ResponseCacheService > get > should return null for expired cache entries
[DEBUG] [ResponseCache] Cache expired: /api/v1/tracks
stdout | src/services/responseCache.test.ts > ResponseCacheService > get > should respect _disableCache flag
[INFO] [ResponseCache] Cache cleared (0 entries)
stdout | src/services/responseCache.test.ts > ResponseCacheService > get > should handle different query parameters as different cache keys
[INFO] [ResponseCache] Cache cleared (0 entries)
stdout | src/services/responseCache.test.ts > ResponseCacheService > get > should handle different query parameters as different cache keys
[DEBUG] [ResponseCache] Cached: /api/v1/tracks {"key":"GET:/api/v1/tracks?page=1:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks {"key":"GET:/api/v1/tracks?page=2:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cache hit: /api/v1/tracks {"key":"GET:/api/v1/tracks?page=1:","age":1}
[DEBUG] [ResponseCache] Cache hit: /api/v1/tracks {"key":"GET:/api/v1/tracks?page=2:","age":0}
stdout | src/services/responseCache.test.ts > ResponseCacheService > set > should cache GET request responses
[INFO] [ResponseCache] Cache cleared (2 entries)
stdout | src/services/responseCache.test.ts > ResponseCacheService > set > should cache GET request responses
[DEBUG] [ResponseCache] Cached: /api/v1/tracks {"key":"GET:/api/v1/tracks:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cache hit: /api/v1/tracks {"key":"GET:/api/v1/tracks:","age":0}
stdout | src/services/responseCache.test.ts > ResponseCacheService > set > should not cache non-GET requests
[INFO] [ResponseCache] Cache cleared (1 entries)
stdout | src/services/responseCache.test.ts > ResponseCacheService > set > should respect Cache-Control no-store directive
[INFO] [ResponseCache] Cache cleared (0 entries)
stdout | src/services/responseCache.test.ts > ResponseCacheService > set > should respect Cache-Control no-store directive
[DEBUG] [ResponseCache] Not caching (no-store/no-cache): /api/v1/tracks
stdout | src/services/responseCache.test.ts > ResponseCacheService > set > should respect Cache-Control no-cache directive
[INFO] [ResponseCache] Cache cleared (0 entries)
stdout | src/services/responseCache.test.ts > ResponseCacheService > set > should respect Cache-Control no-cache directive
[DEBUG] [ResponseCache] Not caching (no-store/no-cache): /api/v1/tracks
stdout | src/services/responseCache.test.ts > ResponseCacheService > set > should respect Cache-Control max-age directive
[INFO] [ResponseCache] Cache cleared (0 entries)
stdout | src/services/responseCache.test.ts > ResponseCacheService > set > should respect Cache-Control max-age directive
[DEBUG] [ResponseCache] Cached: /api/v1/tracks {"key":"GET:/api/v1/tracks:","maxAge":1,"etag":"none"}
[DEBUG] [ResponseCache] Cache hit: /api/v1/tracks {"key":"GET:/api/v1/tracks:","age":0}
stdout | src/features/playlists/__tests__/playlist.integration.test.tsx > Playlist CRUD Integration Tests > Read Playlist > should display playlist details
[DEBUG] [ResponseCache] Cached: /playlists/1 {"key":"GET:/api/v1/playlists/1:","maxAge":300,"etag":"none"}
stdout | src/features/playlists/__tests__/playlist.integration.test.tsx > Playlist CRUD Integration Tests > Read Playlist > should display playlist details
[DEBUG] [ResponseCache] Cached: /playlists/1/collaborators {"key":"GET:/api/v1/playlists/1/collaborators:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /playlists/1/collaborators {"key":"GET:/api/v1/playlists/1/collaborators:","maxAge":300,"etag":"none"}
stdout | src/components/search/Search.test.tsx > Search Component > selects suggestion with Enter key
[DEBUG] Suggestions loaded {"query":"track","count":1,"component":"Search"}
stdout | src/components/search/Search.test.tsx > Search Component > selects suggestion with Enter key
[DEBUG] Search result selected from Search component {"type":"track","id":"1","component":"Search"}
✓ src/features/auth/pages/VerifyEmailPage.test.tsx (13 tests) 4254ms
✓ VerifyEmailPage > should redirect to login after successful verification 3085ms
✓ src/features/tracks/services/chunkedUploadService.test.ts (7 tests) 7562ms
✓ chunkedUploadService > splitFileIntoChunks > should split file into chunks of correct size 1303ms
✓ chunkedUploadService > ChunkedUploadManager > should initiate upload and upload chunks sequentially 921ms
✓ chunkedUploadService > ChunkedUploadManager > should pause and resume upload 1191ms
✓ chunkedUploadService > ChunkedUploadManager > should retry failed chunks 3406ms
✓ chunkedUploadService > ChunkedUploadManager > should cancel upload 718ms
stdout | src/components/search/Search.test.tsx > Search Component > closes dropdown with Escape key
[DEBUG] Suggestions loaded {"query":"track","count":1,"component":"Search"}
stdout | src/features/playlists/__tests__/playlist.integration.test.tsx > Playlist CRUD Integration Tests > Delete Playlist > should delete playlist successfully
[DEBUG] [ResponseCache] Cached: /playlists/1 {"key":"GET:/api/v1/playlists/1:","maxAge":300,"etag":"none"}
stdout | src/features/playlists/__tests__/playlist.integration.test.tsx > Playlist CRUD Integration Tests > Delete Playlist > should delete playlist successfully
[DEBUG] [ResponseCache] Cached: /playlists/1/collaborators {"key":"GET:/api/v1/playlists/1/collaborators:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /playlists/1/collaborators {"key":"GET:/api/v1/playlists/1/collaborators:","maxAge":300,"etag":"none"}
✓ src/features/auth/pages/LoginPage.test.tsx (30 tests) 4953ms
✓ LoginPage > should render login form 521ms
✓ LoginPage > should validate password field 449ms
✓ LoginPage > should call handleLogin on valid form submission 388ms
✓ LoginPage > should update form data on input change 338ms
✓ LoginPage > should save email to localStorage when remember me is checked 305ms
✓ LoginPage > should remove email from localStorage when remember me is unchecked 590ms
stdout | src/services/responseCache.test.ts > ResponseCacheService > set > should respect Cache-Control max-age directive
[DEBUG] [ResponseCache] Cache expired: /api/v1/tracks
stdout | src/services/responseCache.test.ts > ResponseCacheService > set > should store ETag and Last-Modified headers
[INFO] [ResponseCache] Cache cleared (0 entries)
stdout | src/services/responseCache.test.ts > ResponseCacheService > set > should store ETag and Last-Modified headers
[DEBUG] [ResponseCache] Cached: /api/v1/tracks {"key":"GET:/api/v1/tracks:","maxAge":300,"etag":"present"}
[DEBUG] [ResponseCache] Cache hit: /api/v1/tracks {"key":"GET:/api/v1/tracks:","age":0}
stdout | src/services/responseCache.test.ts > ResponseCacheService > invalidate > should invalidate cache entries matching string pattern
[INFO] [ResponseCache] Cache cleared (1 entries)
stdout | src/services/responseCache.test.ts > ResponseCacheService > invalidate > should invalidate cache entries matching string pattern
[DEBUG] [ResponseCache] Cached: /api/v1/tracks {"key":"GET:/api/v1/tracks:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/playlists {"key":"GET:/api/v1/playlists:","maxAge":300,"etag":"none"}
[INFO] [ResponseCache] Invalidated 1 cache entries for pattern: /tracks
[DEBUG] [ResponseCache] Cache hit: /api/v1/playlists {"key":"GET:/api/v1/playlists:","age":2}
stdout | src/services/responseCache.test.ts > ResponseCacheService > invalidate > should invalidate cache entries matching regex pattern
[INFO] [ResponseCache] Cache cleared (1 entries)
stdout | src/services/responseCache.test.ts > ResponseCacheService > invalidate > should invalidate cache entries matching regex pattern
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/123 {"key":"GET:/api/v1/tracks/123:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/456 {"key":"GET:/api/v1/tracks/456:","maxAge":300,"etag":"none"}
[INFO] [ResponseCache] Invalidated 2 cache entries for pattern: /\/tracks\/\d+/
stdout | src/services/responseCache.test.ts > ResponseCacheService > clear > should clear all cache entries
[INFO] [ResponseCache] Cache cleared (0 entries)
stdout | src/services/responseCache.test.ts > ResponseCacheService > clear > should clear all cache entries
[DEBUG] [ResponseCache] Cached: /api/v1/tracks {"key":"GET:/api/v1/tracks:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/playlists {"key":"GET:/api/v1/playlists:","maxAge":300,"etag":"none"}
[INFO] [ResponseCache] Cache cleared (2 entries)
stdout | src/services/responseCache.test.ts > ResponseCacheService > getStats > should return cache statistics
[INFO] [ResponseCache] Cache cleared (0 entries)
stdout | src/services/responseCache.test.ts > ResponseCacheService > getStats > should return cache statistics
[DEBUG] [ResponseCache] Cached: /api/v1/tracks {"key":"GET:/api/v1/tracks:","maxAge":300,"etag":"none"}
stdout | src/services/responseCache.test.ts > ResponseCacheService > cleanup > should remove expired cache entries
[INFO] [ResponseCache] Cache cleared (1 entries)
stdout | src/services/responseCache.test.ts > ResponseCacheService > cleanup > should remove expired cache entries
[DEBUG] [ResponseCache] Cached: /api/v1/tracks {"key":"GET:/api/v1/tracks:","maxAge":1,"etag":"none"}
✓ src/components/search/Search.test.tsx (18 tests) 4619ms
✓ Search Component > shows suggestions when fetchSuggestions is provided 474ms
✓ Search Component > calls onResultSelect when suggestion is clicked 475ms
✓ Search Component > limits history items to maxHistoryItems 689ms
✓ Search Component > navigates suggestions with arrow keys 446ms
✓ Search Component > selects suggestion with Enter key 410ms
✓ Search Component > closes dropdown with Escape key 452ms
✓ Search Component > does not show suggestions when showSuggestions is false 506ms
stdout | src/services/responseCache.test.ts > ResponseCacheService > cleanup > should remove expired cache entries
[DEBUG] [ResponseCache] Cleaned up 1 expired cache entries
stdout | src/services/responseCache.test.ts > ResponseCacheService > cache size limits > should evict oldest entries when cache size limit is reached
[INFO] [ResponseCache] Cache cleared (0 entries)
stdout | src/services/responseCache.test.ts > ResponseCacheService > cache size limits > should evict oldest entries when cache size limit is reached
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/0 {"key":"GET:/api/v1/tracks/0:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/1 {"key":"GET:/api/v1/tracks/1:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/2 {"key":"GET:/api/v1/tracks/2:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/3 {"key":"GET:/api/v1/tracks/3:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/4 {"key":"GET:/api/v1/tracks/4:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/5 {"key":"GET:/api/v1/tracks/5:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/6 {"key":"GET:/api/v1/tracks/6:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/7 {"key":"GET:/api/v1/tracks/7:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/8 {"key":"GET:/api/v1/tracks/8:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/9 {"key":"GET:/api/v1/tracks/9:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/10 {"key":"GET:/api/v1/tracks/10:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/11 {"key":"GET:/api/v1/tracks/11:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/12 {"key":"GET:/api/v1/tracks/12:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/13 {"key":"GET:/api/v1/tracks/13:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/14 {"key":"GET:/api/v1/tracks/14:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/15 {"key":"GET:/api/v1/tracks/15:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/16 {"key":"GET:/api/v1/tracks/16:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/17 {"key":"GET:/api/v1/tracks/17:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/18 {"key":"GET:/api/v1/tracks/18:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/19 {"key":"GET:/api/v1/tracks/19:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/20 {"key":"GET:/api/v1/tracks/20:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/21 {"key":"GET:/api/v1/tracks/21:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/22 {"key":"GET:/api/v1/tracks/22:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/23 {"key":"GET:/api/v1/tracks/23:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/24 {"key":"GET:/api/v1/tracks/24:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/25 {"key":"GET:/api/v1/tracks/25:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/26 {"key":"GET:/api/v1/tracks/26:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/27 {"key":"GET:/api/v1/tracks/27:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/28 {"key":"GET:/api/v1/tracks/28:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/29 {"key":"GET:/api/v1/tracks/29:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/30 {"key":"GET:/api/v1/tracks/30:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/31 {"key":"GET:/api/v1/tracks/31:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/32 {"key":"GET:/api/v1/tracks/32:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/33 {"key":"GET:/api/v1/tracks/33:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/34 {"key":"GET:/api/v1/tracks/34:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/35 {"key":"GET:/api/v1/tracks/35:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/36 {"key":"GET:/api/v1/tracks/36:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/37 {"key":"GET:/api/v1/tracks/37:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/38 {"key":"GET:/api/v1/tracks/38:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/39 {"key":"GET:/api/v1/tracks/39:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/40 {"key":"GET:/api/v1/tracks/40:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/41 {"key":"GET:/api/v1/tracks/41:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/42 {"key":"GET:/api/v1/tracks/42:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/43 {"key":"GET:/api/v1/tracks/43:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/44 {"key":"GET:/api/v1/tracks/44:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/45 {"key":"GET:/api/v1/tracks/45:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/46 {"key":"GET:/api/v1/tracks/46:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/47 {"key":"GET:/api/v1/tracks/47:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/48 {"key":"GET:/api/v1/tracks/48:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/49 {"key":"GET:/api/v1/tracks/49:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/50 {"key":"GET:/api/v1/tracks/50:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/51 {"key":"GET:/api/v1/tracks/51:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/52 {"key":"GET:/api/v1/tracks/52:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/53 {"key":"GET:/api/v1/tracks/53:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/54 {"key":"GET:/api/v1/tracks/54:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/55 {"key":"GET:/api/v1/tracks/55:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/56 {"key":"GET:/api/v1/tracks/56:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/57 {"key":"GET:/api/v1/tracks/57:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/58 {"key":"GET:/api/v1/tracks/58:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/59 {"key":"GET:/api/v1/tracks/59:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/60 {"key":"GET:/api/v1/tracks/60:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/61 {"key":"GET:/api/v1/tracks/61:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/62 {"key":"GET:/api/v1/tracks/62:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/63 {"key":"GET:/api/v1/tracks/63:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/64 {"key":"GET:/api/v1/tracks/64:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/65 {"key":"GET:/api/v1/tracks/65:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/66 {"key":"GET:/api/v1/tracks/66:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/67 {"key":"GET:/api/v1/tracks/67:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/68 {"key":"GET:/api/v1/tracks/68:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/69 {"key":"GET:/api/v1/tracks/69:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/70 {"key":"GET:/api/v1/tracks/70:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/71 {"key":"GET:/api/v1/tracks/71:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/72 {"key":"GET:/api/v1/tracks/72:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/73 {"key":"GET:/api/v1/tracks/73:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/74 {"key":"GET:/api/v1/tracks/74:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/75 {"key":"GET:/api/v1/tracks/75:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/76 {"key":"GET:/api/v1/tracks/76:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/77 {"key":"GET:/api/v1/tracks/77:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/78 {"key":"GET:/api/v1/tracks/78:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/79 {"key":"GET:/api/v1/tracks/79:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/80 {"key":"GET:/api/v1/tracks/80:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/81 {"key":"GET:/api/v1/tracks/81:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/82 {"key":"GET:/api/v1/tracks/82:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/83 {"key":"GET:/api/v1/tracks/83:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/84 {"key":"GET:/api/v1/tracks/84:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/85 {"key":"GET:/api/v1/tracks/85:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/86 {"key":"GET:/api/v1/tracks/86:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/87 {"key":"GET:/api/v1/tracks/87:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/88 {"key":"GET:/api/v1/tracks/88:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/89 {"key":"GET:/api/v1/tracks/89:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/90 {"key":"GET:/api/v1/tracks/90:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/91 {"key":"GET:/api/v1/tracks/91:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/92 {"key":"GET:/api/v1/tracks/92:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/93 {"key":"GET:/api/v1/tracks/93:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/94 {"key":"GET:/api/v1/tracks/94:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/95 {"key":"GET:/api/v1/tracks/95:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/96 {"key":"GET:/api/v1/tracks/96:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/97 {"key":"GET:/api/v1/tracks/97:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/98 {"key":"GET:/api/v1/tracks/98:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/99 {"key":"GET:/api/v1/tracks/99:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/100 {"key":"GET:/api/v1/tracks/100:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/101 {"key":"GET:/api/v1/tracks/101:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/102 {"key":"GET:/api/v1/tracks/102:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/103 {"key":"GET:/api/v1/tracks/103:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /api/v1/tracks/104 {"key":"GET:/api/v1/tracks/104:","maxAge":300,"etag":"none"}
✓ src/services/responseCache.test.ts (18 tests) 3410ms
✓ ResponseCacheService > get > should return null for expired cache entries 1104ms
✓ ResponseCacheService > set > should respect Cache-Control max-age directive 1109ms
✓ ResponseCacheService > cleanup > should remove expired cache entries 1104ms
stdout | src/features/playlists/__tests__/playlist.integration.test.tsx > Playlist CRUD Integration Tests > Complete Playlist Management Flow > should handle playlist creation errors
[ERROR] Failed to create playlist: {"error":{}}
✓ src/features/playlists/__tests__/playlist.integration.test.tsx (12 tests) 4978ms
✓ Playlist CRUD Integration Tests > Create Playlist > should create a new playlist successfully 819ms
✓ Playlist CRUD Integration Tests > Read Playlist > should display playlist list 331ms
✓ Playlist CRUD Integration Tests > Read Playlist > should display playlist details 788ms
✓ Playlist CRUD Integration Tests > Update Playlist > should update playlist successfully 307ms
✓ Playlist CRUD Integration Tests > Delete Playlist > should delete playlist successfully 1039ms
✓ Playlist CRUD Integration Tests > Complete Playlist Management Flow > should complete full playlist creation flow 405ms
✓ Playlist CRUD Integration Tests > Complete Playlist Management Flow > should complete full playlist editing flow 508ms
✓ src/features/playlists/__tests__/collaboration.integration.test.tsx (5 tests) 4106ms
✓ Playlist Collaboration Integration Tests > Add Collaborator > should add a collaborator successfully 1825ms
✓ Playlist Collaboration Integration Tests > Add Collaborator > should add collaborator with write permission 955ms
✓ Playlist Collaboration Integration Tests > Remove Collaborator > should remove a collaborator successfully 405ms
✓ Playlist Collaboration Integration Tests > Update Collaborator Permission > should update collaborator permission successfully 606ms
✓ Playlist Collaboration Integration Tests > Update Collaborator Permission > should update collaborator permission to admin 302ms
stdout | src/services/adminService.test.ts > adminService > getDashboardStats > should return dashboard statistics
[DEBUG] [ResponseCache] Cached: /audit/stats {"key":"GET:/api/v1/audit/stats:","maxAge":300,"etag":"none"}
✓ src/services/adminService.test.ts (6 tests) 3445ms
✓ adminService > getModerationQueue > should return reports filtered by status 606ms
✓ adminService > getModerationQueue > should filter reports by status 604ms
✓ adminService > resolveReport > should resolve a report successfully 402ms
✓ adminService > resolveReport > should handle different actions 1203ms
✓ adminService > getRecentUploads > should return recent uploads 403ms
✓ src/features/auth/hooks/useUsernameAvailability.test.ts (7 tests) 2972ms
✓ useUsernameAvailability > should check availability when username is long enough 534ms
✓ useUsernameAvailability > should return false when username is not available 522ms
✓ useUsernameAvailability > should debounce the API call 736ms
✓ useUsernameAvailability > should handle errors gracefully 566ms
✓ useUsernameAvailability > should reset when username changes to empty 524ms
✓ src/services/projectService.test.ts (5 tests) 2653ms
✓ projectService > list > should return list of projects 514ms
✓ projectService > get > should return project details 303ms
✓ projectService > create > should create a new project 806ms
✓ projectService > update > should update a project 503ms
✓ projectService > delete > should delete a project 502ms
✓ src/components/forms/LoginForm.test.tsx (10 tests) 3348ms
✓ LoginForm > should render all form fields 323ms
✓ LoginForm > should validate email format 467ms
✓ LoginForm > should submit form with valid data 481ms
✓ LoginForm > should include remember_me when checkbox is checked 571ms
✓ LoginForm > should show loading state during submission 573ms
✓ LoginForm > should handle submission errors gracefully 447ms
✓ src/components/ui/select.test.tsx (19 tests) 2060ms
✓ src/components/ui/avatar-upload.test.tsx (9 tests) 2251ms
✓ AvatarUpload Component > renders avatar upload component 432ms
✓ AvatarUpload Component > handles file selection 413ms
✓ AvatarUpload Component > validates file size 1172ms
✓ src/features/playlists/components/AddCollaboratorModal.test.tsx (12 tests) 2634ms
✓ AddCollaboratorModal > should show validation error for empty username 496ms
✓ AddCollaboratorModal > should submit form with valid data 432ms
✓ AddCollaboratorModal > should handle different permission levels 433ms
✓ AddCollaboratorModal > should handle submission error 468ms
src/features/auth/pages/RegisterPage.test.tsx (25 tests | 4 failed) 17043ms
✓ RegisterPage > should render register form 551ms
✓ RegisterPage > should redirect to dashboard if already authenticated 31ms
✓ RegisterPage > should validate required fields 222ms
✓ RegisterPage > should validate email format 466ms
✓ RegisterPage > should validate username minimum length 146ms
✓ RegisterPage > should validate password minimum length 303ms
✓ RegisterPage > should validate password confirmation match 568ms
✓ RegisterPage > should clear error when user starts typing 350ms
✓ RegisterPage > should call handleRegister with form data on valid submission 810ms
✓ RegisterPage > should display error message when registration fails 39ms
✓ RegisterPage > should show loading state on button 61ms
✓ RegisterPage > should display footer link to login 15ms
✓ RegisterPage > should render terms acceptance checkbox 13ms
✓ RegisterPage > should display links to terms and privacy policy 13ms
× RegisterPage > should validate terms acceptance on form submission 1828ms
→ Unable to find an element with the text: Vous devez accepter les conditions d'utilisation et la politique de confidentialité. This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible.
Ignored nodes: comments, script, style
<body>
<div>
<div
aria-label="Page d'authentification"
class="min-h-screen flex items-center justify-center bg-background py-12 px-4 sm:px-6 lg:px-8 relative overflow-hidden"
role="main"
>
<div
class="fixed inset-0 bg-background"
>
<div
class="absolute inset-0 bg-gradient-to-br from-primary/5 via-transparent to-primary/5"
/>
<div
class="absolute top-1/4 left-1/4 w-96 h-96 bg-primary/10 rounded-full blur-3xl animate-pulse"
/>
<div
class="absolute bottom-1/4 right-1/4 w-64 h-64 bg-primary/5 rounded-full blur-3xl animate-pulse"
style="animation-delay: 2s;"
/>
<div
class="absolute top-2/3 left-1/2 w-72 h-72 bg-secondary/5 rounded-full blur-3xl animate-pulse"
style="animation-delay: 4s;"
/>
</div>
<div
class="max-w-md w-full mx-auto space-y-8 relative z-10 animate-auth-enter"
>
<header
class="text-center"
>
<div
class="flex items-center justify-center mb-6"
>
<div
aria-hidden="true"
class="h-12 w-12 rounded-xl bg-primary flex items-center justify-center shadow-sm"
>
<span
class="text-primary-foreground font-bold text-2xl"
>
V
</span>
</div>
<span
class="ml-3 font-bold text-3xl text-foreground"
>
Veza
</span>
</div>
<h1
class="text-3xl font-bold text-foreground mb-2"
id="auth-form-title"
>
Inscription
</h1>
<p
class="text-sm text-muted-foreground"
role="doc-subtitle"
>
Créez votre compte
</p>
</header>
<div
aria-labelledby="auth-form-title"
class="flex flex-col rounded-lg text-card-foreground relative overflow-hidden border hover:bg-card/90 hover:border-border hover:shadow-card-hover transition-all duration-[var(--sumi-duration-slow)] ease-in-out p-8 w-full bg-card/80 backdrop-blur-md border-border/50 shadow-2xl"
data-slot="card"
>
<div
class="relative z-10 w-full h-full flex flex-col"
>
<form
aria-label="Formulaire d'inscription"
class="space-y-4"
>
<div
class="space-y-4"
>
<div>
<div
class="w-full"
>
<label
class="block text-sm font-medium text-foreground mb-1"
for="register-username"
>
Nom d'utilisateur
</label>
<div
class="relative"
>
<input
aria-invalid="false"
aria-required="true"
autocomplete="username"
class="w-full px-4 py-2.5 border rounded-xl focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/20 transition-all duration-[var(--sumi-duration-slow)] ease-in-out focus-visible:shadow-[0_0_0_3px_oklch(var(--primary)/0.15),0_0_12px_oklch(var(--primary)/0.1)] bg-card border-border text-foreground placeholder:text-muted-foreground focus-visible:border-primary"
id="register-username"
required=""
type="text"
value="testuser"
/>
</div>
</div>
<div
aria-atomic="true"
aria-live="polite"
class="mt-1.5"
/>
</div>
<div
class="w-full"
>
<label
class="block text-sm font-medium text-foreground mb-1"
for="register-email"
>
Email
</label>
<div
class="relative"
>
<input
aria-invalid="false"
aria-required="true"
autocomplete="email"
class="w-full px-4 py-2.5 border rounded-xl focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/20 transition-all duration-[var(--sumi-duration-slow)] ease-in-out focus-visible:shadow-[0_0_0_3px_oklch(var(--primary)/0.15),0_0_12px_oklch(var(--primary)/0.1)] bg-card border-border text-foreground placeholder:text-muted-foreground focus-visible:border-primary"
id="register-email"
required=""
type="email"
value="test@example.com"
/>
</div>
...
Ignored nodes: comments, script, style
<html>
<head />
<body>
<div>
<div
aria-label="Page d'authentification"
class="min-h-screen flex items-center justify-center bg-background py-12 px-4 sm:px-6 lg:px-8 relative overflow-hidden"
role="main"
>
<div
class="fixed inset-0 bg-background"
>
<div
class="absolute inset-0 bg-gradient-to-br from-primary/5 via-transparent to-primary/5"
/>
<div
class="absolute top-1/4 left-1/4 w-96 h-96 bg-primary/10 rounded-full blur-3xl animate-pulse"
/>
<div
class="absolute bottom-1/4 right-1/4 w-64 h-64 bg-primary/5 rounded-full blur-3xl animate-pulse"
style="animation-delay: 2s;"
/>
<div
class="absolute top-2/3 left-1/2 w-72 h-72 bg-secondary/5 rounded-full blur-3xl animate-pulse"
style="animation-delay: 4s;"
/>
</div>
<div
class="max-w-md w-full mx-auto space-y-8 relative z-10 animate-auth-enter"
>
<header
class="text-center"
>
<div
class="flex items-center justify-center mb-6"
>
<div
aria-hidden="true"
class="h-12 w-12 rounded-xl bg-primary flex items-center justify-center shadow-sm"
>
<span
class="text-primary-foreground font-bold text-2xl"
>
V
</span>
</div>
<span
class="ml-3 font-bold text-3xl text-foreground"
>
Veza
</span>
</div>
<h1
class="text-3xl font-bold text-foreground mb-2"
id="auth-form-title"
>
Inscription
</h1>
<p
class="text-sm text-muted-foreground"
role="doc-subtitle"
>
Créez votre compte
</p>
</header>
<div
aria-labelledby="auth-form-title"
class="flex flex-col rounded-lg text-card-foreground relative overflow-hidden border hover:bg-card/90 hover:border-border hover:shadow-card-hover transition-all duration-[var(--sumi-duration-slow)] ease-in-out p-8 w-full bg-card/80 backdrop-blur-md border-border/50 shadow-2xl"
data-slot="card"
>
<div
class="relative z-10 w-full h-full flex flex-col"
>
<form
aria-label="Formulaire d'inscription"
class="space-y-4"
>
<div
class="space-y-4"
>
<div>
<div
class="w-full"
>
<label
class="block text-sm font-medium text-foreground mb-1"
for="register-username"
>
Nom d'utilisateur
</label>
<div
class="relative"
>
<input
aria-invalid="false"
aria-required="true"
autocomplete="username"
class="w-full px-4 py-2.5 border rounded-xl focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/20 transition-all duration-[var(--sumi-duration-slow)] ease-in-out focus-visible:shadow-[0_0_0_3px_oklch(var(--primary)/0.15),0_0_12px_oklch(var(--primary)/0.1)] bg-card border-border text-foreground placeholder:text-muted-foreground focus-visible:border-primary"
id="register-username"
required=""
type="text"
value="testuser"
/>
</div>
</div>
<div
aria-atomic="true"
aria-live="polite"
class="mt-1.5"
/>
</div>
<div
class="w-full"
>
<label
class="block text-sm font-medium text-foreground mb-1"
for="register-email"
>
Email
</label>
<div
class="relative"
>
<input
aria-invalid="false"
aria-required="true"
autocomplete="email"
class="w-full px-4 py-2.5 border rounded-xl focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/20 transition-all duration-[var(--sumi-duration-slow)] ease-in-out focus-visible:shadow-[0_0_0_3px_oklch(var(--primary)/0.15),0_0_12px_oklch(var(--primary)/0.1)] bg-card border-border text-foreground placeholder:text-muted-foreground focus-visible:border-primary"
...
× RegisterPage > should clear terms error when checkbox is checked 2945ms
→ Unable to find an element with the text: Vous devez accepter les conditions d'utilisation et la politique de confidentialité. This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible.
Ignored nodes: comments, script, style
<body>
<div>
<div
aria-label="Page d'authentification"
class="min-h-screen flex items-center justify-center bg-background py-12 px-4 sm:px-6 lg:px-8 relative overflow-hidden"
role="main"
>
<div
class="fixed inset-0 bg-background"
>
<div
class="absolute inset-0 bg-gradient-to-br from-primary/5 via-transparent to-primary/5"
/>
<div
class="absolute top-1/4 left-1/4 w-96 h-96 bg-primary/10 rounded-full blur-3xl animate-pulse"
/>
<div
class="absolute bottom-1/4 right-1/4 w-64 h-64 bg-primary/5 rounded-full blur-3xl animate-pulse"
style="animation-delay: 2s;"
/>
<div
class="absolute top-2/3 left-1/2 w-72 h-72 bg-secondary/5 rounded-full blur-3xl animate-pulse"
style="animation-delay: 4s;"
/>
</div>
<div
class="max-w-md w-full mx-auto space-y-8 relative z-10 animate-auth-enter"
>
<header
class="text-center"
>
<div
class="flex items-center justify-center mb-6"
>
<div
aria-hidden="true"
class="h-12 w-12 rounded-xl bg-primary flex items-center justify-center shadow-sm"
>
<span
class="text-primary-foreground font-bold text-2xl"
>
V
</span>
</div>
<span
class="ml-3 font-bold text-3xl text-foreground"
>
Veza
</span>
</div>
<h1
class="text-3xl font-bold text-foreground mb-2"
id="auth-form-title"
>
Inscription
</h1>
<p
class="text-sm text-muted-foreground"
role="doc-subtitle"
>
Créez votre compte
</p>
</header>
<div
aria-labelledby="auth-form-title"
class="flex flex-col rounded-lg text-card-foreground relative overflow-hidden border hover:bg-card/90 hover:border-border hover:shadow-card-hover transition-all duration-[var(--sumi-duration-slow)] ease-in-out p-8 w-full bg-card/80 backdrop-blur-md border-border/50 shadow-2xl"
data-slot="card"
>
<div
class="relative z-10 w-full h-full flex flex-col"
>
<form
aria-label="Formulaire d'inscription"
class="space-y-4"
>
<div
class="space-y-4"
>
<div>
<div
class="w-full"
>
<label
class="block text-sm font-medium text-foreground mb-1"
for="register-username"
>
Nom d'utilisateur
</label>
<div
class="relative"
>
<input
aria-invalid="false"
aria-required="true"
autocomplete="username"
class="w-full px-4 py-2.5 border rounded-xl focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/20 transition-all duration-[var(--sumi-duration-slow)] ease-in-out focus-visible:shadow-[0_0_0_3px_oklch(var(--primary)/0.15),0_0_12px_oklch(var(--primary)/0.1)] bg-card border-border text-foreground placeholder:text-muted-foreground focus-visible:border-primary"
id="register-username"
required=""
type="text"
value="testuser"
/>
</div>
</div>
<div
aria-atomic="true"
aria-live="polite"
class="mt-1.5"
/>
</div>
<div
class="w-full"
>
<label
class="block text-sm font-medium text-foreground mb-1"
for="register-email"
>
Email
</label>
<div
class="relative"
>
<input
aria-invalid="false"
aria-required="true"
autocomplete="email"
class="w-full px-4 py-2.5 border rounded-xl focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/20 transition-all duration-[var(--sumi-duration-slow)] ease-in-out focus-visible:shadow-[0_0_0_3px_oklch(var(--primary)/0.15),0_0_12px_oklch(var(--primary)/0.1)] bg-card border-border text-foreground placeholder:text-muted-foreground focus-visible:border-primary"
id="register-email"
required=""
type="email"
value="test@example.com"
/>
</div>
...
Ignored nodes: comments, script, style
<html>
<head />
<body>
<div>
<div
aria-label="Page d'authentification"
class="min-h-screen flex items-center justify-center bg-background py-12 px-4 sm:px-6 lg:px-8 relative overflow-hidden"
role="main"
>
<div
class="fixed inset-0 bg-background"
>
<div
class="absolute inset-0 bg-gradient-to-br from-primary/5 via-transparent to-primary/5"
/>
<div
class="absolute top-1/4 left-1/4 w-96 h-96 bg-primary/10 rounded-full blur-3xl animate-pulse"
/>
<div
class="absolute bottom-1/4 right-1/4 w-64 h-64 bg-primary/5 rounded-full blur-3xl animate-pulse"
style="animation-delay: 2s;"
/>
<div
class="absolute top-2/3 left-1/2 w-72 h-72 bg-secondary/5 rounded-full blur-3xl animate-pulse"
style="animation-delay: 4s;"
/>
</div>
<div
class="max-w-md w-full mx-auto space-y-8 relative z-10 animate-auth-enter"
>
<header
class="text-center"
>
<div
class="flex items-center justify-center mb-6"
>
<div
aria-hidden="true"
class="h-12 w-12 rounded-xl bg-primary flex items-center justify-center shadow-sm"
>
<span
class="text-primary-foreground font-bold text-2xl"
>
V
</span>
</div>
<span
class="ml-3 font-bold text-3xl text-foreground"
>
Veza
</span>
</div>
<h1
class="text-3xl font-bold text-foreground mb-2"
id="auth-form-title"
>
Inscription
</h1>
<p
class="text-sm text-muted-foreground"
role="doc-subtitle"
>
Créez votre compte
</p>
</header>
<div
aria-labelledby="auth-form-title"
class="flex flex-col rounded-lg text-card-foreground relative overflow-hidden border hover:bg-card/90 hover:border-border hover:shadow-card-hover transition-all duration-[var(--sumi-duration-slow)] ease-in-out p-8 w-full bg-card/80 backdrop-blur-md border-border/50 shadow-2xl"
data-slot="card"
>
<div
class="relative z-10 w-full h-full flex flex-col"
>
<form
aria-label="Formulaire d'inscription"
class="space-y-4"
>
<div
class="space-y-4"
>
<div>
<div
class="w-full"
>
<label
class="block text-sm font-medium text-foreground mb-1"
for="register-username"
>
Nom d'utilisateur
</label>
<div
class="relative"
>
<input
aria-invalid="false"
aria-required="true"
autocomplete="username"
class="w-full px-4 py-2.5 border rounded-xl focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/20 transition-all duration-[var(--sumi-duration-slow)] ease-in-out focus-visible:shadow-[0_0_0_3px_oklch(var(--primary)/0.15),0_0_12px_oklch(var(--primary)/0.1)] bg-card border-border text-foreground placeholder:text-muted-foreground focus-visible:border-primary"
id="register-username"
required=""
type="text"
value="testuser"
/>
</div>
</div>
<div
aria-atomic="true"
aria-live="polite"
class="mt-1.5"
/>
</div>
<div
class="w-full"
>
<label
class="block text-sm font-medium text-foreground mb-1"
for="register-email"
>
Email
</label>
<div
class="relative"
>
<input
aria-invalid="false"
aria-required="true"
autocomplete="email"
class="w-full px-4 py-2.5 border rounded-xl focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/20 transition-all duration-[var(--sumi-duration-slow)] ease-in-out focus-visible:shadow-[0_0_0_3px_oklch(var(--primary)/0.15),0_0_12px_oklch(var(--primary)/0.1)] bg-card border-border text-foreground placeholder:text-muted-foreground focus-visible:border-primary"
...
✓ RegisterPage > should allow form submission when terms are accepted 1167ms
× RegisterPage > should display verification notice after successful registration 1747ms
→ Unable to find an element with the text: /Un email de vérification a été envoyé à test@example.com/. This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible.
Ignored nodes: comments, script, style
<body>
<div>
<div
aria-label="Page d'authentification"
class="min-h-screen flex items-center justify-center bg-background py-12 px-4 sm:px-6 lg:px-8 relative overflow-hidden"
role="main"
>
<div
class="fixed inset-0 bg-background"
>
<div
class="absolute inset-0 bg-gradient-to-br from-primary/5 via-transparent to-primary/5"
/>
<div
class="absolute top-1/4 left-1/4 w-96 h-96 bg-primary/10 rounded-full blur-3xl animate-pulse"
/>
<div
class="absolute bottom-1/4 right-1/4 w-64 h-64 bg-primary/5 rounded-full blur-3xl animate-pulse"
style="animation-delay: 2s;"
/>
<div
class="absolute top-2/3 left-1/2 w-72 h-72 bg-secondary/5 rounded-full blur-3xl animate-pulse"
style="animation-delay: 4s;"
/>
</div>
<div
class="max-w-md w-full mx-auto space-y-8 relative z-10 animate-auth-enter"
>
<header
class="text-center"
>
<div
class="flex items-center justify-center mb-6"
>
<div
aria-hidden="true"
class="h-12 w-12 rounded-xl bg-primary flex items-center justify-center shadow-sm"
>
<span
class="text-primary-foreground font-bold text-2xl"
>
V
</span>
</div>
<span
class="ml-3 font-bold text-3xl text-foreground"
>
Veza
</span>
</div>
<h1
class="text-3xl font-bold text-foreground mb-2"
id="auth-form-title"
>
Inscription
</h1>
<p
class="text-sm text-muted-foreground"
role="doc-subtitle"
>
Créez votre compte
</p>
</header>
<div
aria-labelledby="auth-form-title"
class="flex flex-col rounded-lg text-card-foreground relative overflow-hidden border hover:bg-card/90 hover:border-border hover:shadow-card-hover transition-all duration-[var(--sumi-duration-slow)] ease-in-out p-8 w-full bg-card/80 backdrop-blur-md border-border/50 shadow-2xl"
data-slot="card"
>
<div
class="relative z-10 w-full h-full flex flex-col"
>
<div
aria-live="polite"
class="text-center space-y-5 animate-fade-in py-4"
role="status"
>
<div
class="flex justify-center"
>
<div
class="h-16 w-16 rounded-full bg-success/10 flex items-center justify-center"
>
<svg
class="lucide lucide-mail h-8 w-8 text-success"
fill="none"
height="24"
stroke="currentColor"
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
viewBox="0 0 24 24"
width="24"
xmlns="http://www.w3.org/2000/svg"
>
<rect
height="16"
rx="2"
width="20"
x="2"
y="4"
/>
<path
d="m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7"
/>
</svg>
</div>
</div>
<div>
<p
class="text-lg font-semibold text-foreground"
>
Inscription réussie !
</p>
<p
class="text-sm text-muted-foreground mt-2"
>
Un email de vérification a été envoyé à
 
<span
class="font-medium text-foreground"
>
test@example.com
</span>
</p>
</div>
<p
class="text-sm text-muted-foreground"
>
Veuillez vérifier votre boîte mail et cliquer sur le lien de vérification.
</p>
<button
aria-disabled="false"
aria-label="Renvoyer l'email de vérification"
class="w-full px-4 py-2.5 rounded-xl font-medium transition-all duration-[var(--sumi-duration-slow)] ease-in-out focus:outline-none focus:ring-2 focus:ring-primary/20 focus:ring-offset-2 focus:ring-offset-background bg-muted text-foreground hover:bg-muted/80 border border-border"
type="button"
>
Renvoyer l'email de vérification
</button>
</div>
</div>
</div>
<nav
aria-label="Navigation d'authentification"
class="text-center space-x-4"
>
<a
class="text-sm text-muted-foreground hover:text-foreground transition-colors duration-[var(--duration-fast)] focus:outline-none focus:ring-2 focus:ring-primary/30 focus:ring-offset-2 focus:ring-offset-background rounded"
href="/login"
>
Déjà un compte ? Se connecter
</a>
</nav>
</div>
</div>
</div>
</body>
Ignored nodes: comments, script, style
<html>
<head />
<body>
<div>
<div
aria-label="Page d'authentification"
class="min-h-screen flex items-center justify-center bg-background py-12 px-4 sm:px-6 lg:px-8 relative overflow-hidden"
role="main"
>
<div
class="fixed inset-0 bg-background"
>
<div
class="absolute inset-0 bg-gradient-to-br from-primary/5 via-transparent to-primary/5"
/>
<div
class="absolute top-1/4 left-1/4 w-96 h-96 bg-primary/10 rounded-full blur-3xl animate-pulse"
/>
<div
class="absolute bottom-1/4 right-1/4 w-64 h-64 bg-primary/5 rounded-full blur-3xl animate-pulse"
style="animation-delay: 2s;"
/>
<div
class="absolute top-2/3 left-1/2 w-72 h-72 bg-secondary/5 rounded-full blur-3xl animate-pulse"
style="animation-delay: 4s;"
/>
</div>
<div
class="max-w-md w-full mx-auto space-y-8 relative z-10 animate-auth-enter"
>
<header
class="text-center"
>
<div
class="flex items-center justify-center mb-6"
>
<div
aria-hidden="true"
class="h-12 w-12 rounded-xl bg-primary flex items-center justify-center shadow-sm"
>
<span
class="text-primary-foreground font-bold text-2xl"
>
V
</span>
</div>
<span
class="ml-3 font-bold text-3xl text-foreground"
>
Veza
</span>
</div>
<h1
class="text-3xl font-bold text-foreground mb-2"
id="auth-form-title"
>
Inscription
</h1>
<p
class="text-sm text-muted-foreground"
role="doc-subtitle"
>
Créez votre compte
</p>
</header>
<div
aria-labelledby="auth-form-title"
class="flex flex-col rounded-lg text-card-foreground relative overflow-hidden border hover:bg-card/90 hover:border-border hover:shadow-card-hover transition-all duration-[var(--sumi-duration-slow)] ease-in-out p-8 w-full bg-card/80 backdrop-blur-md border-border/50 shadow-2xl"
data-slot="card"
>
<div
class="relative z-10 w-full h-full flex flex-col"
>
<div
aria-live="polite"
class="text-center space-y-5 animate-fade-in py-4"
role="status"
>
<div
class="flex justify-center"
>
<div
class="h-16 w-16 rounded-full bg-success/10 flex items-center justify-center"
>
<svg
class="lucide lucide-mail h-8 w-8 text-success"
fill="none"
height="24"
stroke="currentColor"
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
viewBox="0 0 24 24"
width="24"
xmlns="http://www.w3.org/2000/svg"
>
<rect
height="16"
rx="2"
width="20"
x="2"
y="4"
/>
<path
d="m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7"
/>
</svg>
</div>
</div>
<div>
<p
class="text-lg font-semibold text-foreground"
>
Inscription réussie !
</p>
<p
class="text-sm text-muted-foreground mt-2"
>
Un email de vérification a été envoyé à
 
<span
class="font-medium text-foreground"
>
test@example.com
</span>
</p>
</div>
<p
class="text-sm text-muted-foreground"
>
Veuillez vérifier votre boîte mail et cliquer sur le lien de vérification.
</p>
<button
aria-disabled="false"
aria-label="Renvoyer l'email de vérification"
class="w-full px-4 py-2.5 rounded-xl font-medium transition-all duration-[var(--sumi-duration-slow)] ease-in-out focus:outline-none focus:ring-2 focus:ring-primary/20 focus:ring-offset-2 focus:ring-offset-background bg-muted text-foreground hover:bg-muted/80 border border-border"
type="button"
>
Renvoyer l'email de vérification
</button>
</div>
</div>
</div>
<nav
aria-label="Navigation d'authentification"
class="text-center space-x-4"
>
<a
class="text-sm text-muted-foreground hover:text-foreground transition-colors duration-[var(--duration-fast)] focus:outline-none focus:ring-2 focus:ring-primary/30 focus:ring-offset-2 focus:ring-offset-background rounded"
href="/login"
>
Déjà un compte ? Se connecter
</a>
</nav>
</div>
</div>
</div>
</body>
</html>
✓ RegisterPage > should display resend verification email button 611ms
✓ RegisterPage > should call resendVerificationEmail when resend button is clicked 667ms
✓ RegisterPage > should show success message after resending verification email 850ms
✓ RegisterPage > should display checking status when username is being verified 173ms
✓ RegisterPage > should display available status when username is available 296ms
✓ RegisterPage > should display unavailable status when username is taken 128ms
× RegisterPage > should prevent form submission when username is not available 3017ms
→ Found multiple elements with the text: Ce nom d'utilisateur est déjà pris
Here are the matching elements:
Ignored nodes: comments, script, style
<p
class="mt-1 text-sm text-destructive animate-shake"
id="register-username-error"
role="alert"
>
Ce nom d'utilisateur est déjà pris
</p>
Ignored nodes: comments, script, style
<span>
Ce nom d'utilisateur est déjà pris
</span>
(If this is intentional, then use the `*AllBy*` variant of the query (like `queryAllByText`, `getAllByText`, or `findAllByText`)).
Ignored nodes: comments, script, style
<body>
<div>
<div
aria-label="Page d'authentification"
class="min-h-screen flex items-center justify-center bg-background py-12 px-4 sm:px-6 lg:px-8 relative overflow-hidden"
role="main"
>
<div
class="fixed inset-0 bg-background"
>
<div
class="absolute inset-0 bg-gradient-to-br from-primary/5 via-transparent to-primary/5"
/>
<div
class="absolute top-1/4 left-1/4 w-96 h-96 bg-primary/10 rounded-full blur-3xl animate-pulse"
/>
<div
class="absolute bottom-1/4 right-1/4 w-64 h-64 bg-primary/5 rounded-full blur-3xl animate-pulse"
style="animation-delay: 2s;"
/>
<div
class="absolute top-2/3 left-1/2 w-72 h-72 bg-secondary/5 rounded-full blur-3xl animate-pulse"
style="animation-delay: 4s;"
/>
</div>
<div
class="max-w-md w-full mx-auto space-y-8 relative z-10 animate-auth-enter"
>
<header
class="text-center"
>
<div
class="flex items-center justify-center mb-6"
>
<div
aria-hidden="true"
class="h-12 w-12 rounded-xl bg-primary flex items-center justify-center shadow-sm"
>
<span
class="text-primary-foreground font-bold text-2xl"
>
V
</span>
</div>
<span
class="ml-3 font-bold text-3xl text-foreground"
>
Veza
</span>
</div>
<h1
class="text-3xl font-bold text-foreground mb-2"
id="auth-form-title"
>
Inscription
</h1>
<p
class="text-sm text-muted-foreground"
role="doc-subtitle"
>
Créez votre compte
</p>
</header>
<div
aria-labelledby="auth-form-title"
class="flex flex-col rounded-lg text-card-foreground relative overflow-hidden border hover:bg-card/90 hover:border-border hover:shadow-card-hover transition-all duration-[var(--sumi-duration-slow)] ease-in-out p-8 w-full bg-card/80 backdrop-blur-md border-border/50 shadow-2xl"
data-slot="card"
>
<div
class="relative z-10 w-full h-full flex flex-col"
>
<form
aria-label="Formulaire d'inscription"
class="space-y-4"
>
<div
class="space-y-4"
>
<div>
<div
class="w-full"
>
<label
class="block text-sm font-medium text-foreground mb-1"
for="register-username"
>
Nom d'utilisateur
</label>
<div
class="relative"
>
<input
aria-describedby="register-username-error"
aria-invalid="true"
aria-required="true"
autocomplete="username"
class="w-full px-4 py-2.5 border rounded-xl focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/20 transition-all duration-[var(--sumi-duration-slow)] ease-in-out focus-visible:shadow-[0_0_0_3px_oklch(var(--primary)/0.15),0_0_12px_oklch(var(--primary)/0.1)] bg-card text-foreground placeholder:text-muted-foreground border-destructive focus-visible:border-destructive"
id="register-username"
required=""
type="text"
value="takenuser"
/>
</div>
<p
class="mt-1 text-sm text-destructive animate-shake"
id="register-username-error"
role="alert"
>
Ce nom d'utilisateur est déjà pris
</p>
</div>
<div
aria-atomic="true"
aria-live="polite"
class="mt-1.5"
>
<p
class="text-xs text-destructive flex items-center gap-1.5"
role="alert"
>
<svg
class="lucide lucide-x h-3 w-3"
fill="none"
height="24"
stroke="currentColor"
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
viewBox="0 0 24 24"
width="24"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M18 6 6 18"
...
Ignored nodes: comments, script, style
<html>
<head />
<body>
<div>
<div
aria-label="Page d'authentification"
class="min-h-screen flex items-center justify-center bg-background py-12 px-4 sm:px-6 lg:px-8 relative overflow-hidden"
role="main"
>
<div
class="fixed inset-0 bg-background"
>
<div
class="absolute inset-0 bg-gradient-to-br from-primary/5 via-transparent to-primary/5"
/>
<div
class="absolute top-1/4 left-1/4 w-96 h-96 bg-primary/10 rounded-full blur-3xl animate-pulse"
/>
<div
class="absolute bottom-1/4 right-1/4 w-64 h-64 bg-primary/5 rounded-full blur-3xl animate-pulse"
style="animation-delay: 2s;"
/>
<div
class="absolute top-2/3 left-1/2 w-72 h-72 bg-secondary/5 rounded-full blur-3xl animate-pulse"
style="animation-delay: 4s;"
/>
</div>
<div
class="max-w-md w-full mx-auto space-y-8 relative z-10 animate-auth-enter"
>
<header
class="text-center"
>
<div
class="flex items-center justify-center mb-6"
>
<div
aria-hidden="true"
class="h-12 w-12 rounded-xl bg-primary flex items-center justify-center shadow-sm"
>
<span
class="text-primary-foreground font-bold text-2xl"
>
V
</span>
</div>
<span
class="ml-3 font-bold text-3xl text-foreground"
>
Veza
</span>
</div>
<h1
class="text-3xl font-bold text-foreground mb-2"
id="auth-form-title"
>
Inscription
</h1>
<p
class="text-sm text-muted-foreground"
role="doc-subtitle"
>
Créez votre compte
</p>
</header>
<div
aria-labelledby="auth-form-title"
class="flex flex-col rounded-lg text-card-foreground relative overflow-hidden border hover:bg-card/90 hover:border-border hover:shadow-card-hover transition-all duration-[var(--sumi-duration-slow)] ease-in-out p-8 w-full bg-card/80 backdrop-blur-md border-border/50 shadow-2xl"
data-slot="card"
>
<div
class="relative z-10 w-full h-full flex flex-col"
>
<form
aria-label="Formulaire d'inscription"
class="space-y-4"
>
<div
class="space-y-4"
>
<div>
<div
class="w-full"
>
<label
class="block text-sm font-medium text-foreground mb-1"
for="register-username"
>
Nom d'utilisateur
</label>
<div
class="relative"
>
<input
aria-describedby="register-username-error"
aria-invalid="true"
aria-required="true"
autocomplete="username"
class="w-full px-4 py-2.5 border rounded-xl focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/20 transition-all duration-[var(--sumi-duration-slow)] ease-in-out focus-visible:shadow-[0_0_0_3px_oklch(var(--primary)/0.15),0_0_12px_oklch(var(--primary)/0.1)] bg-card text-foreground placeholder:text-muted-foreground border-destructive focus-visible:border-destructive"
id="register-username"
required=""
type="text"
value="takenuser"
/>
</div>
<p
class="mt-1 text-sm text-destructive animate-shake"
id="register-username-error"
role="alert"
>
Ce nom d'utilisateur est déjà pris
</p>
</div>
<div
aria-atomic="true"
aria-live="polite"
class="mt-1.5"
>
<p
class="text-xs text-destructive flex items-center gap-1.5"
role="alert"
>
<svg
class="lucide lucide-x h-3 w-3"
fill="none"
height="24"
stroke="currentColor"
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
viewBox[3...
✓ src/services/searchService.test.ts (4 tests) 2484ms
✓ searchService > global > should return search results 619ms
✓ searchService > global > should filter results by query 615ms
✓ searchService > global > should return empty results for no matches 604ms
✓ searchService > global > should handle pagination 625ms
stdout | src/services/analyticsService.test.ts > analyticsService > recordEvent > should record an event successfully
[DEBUG] [ResponseCache] Cached: /csrf-token {"key":"GET:/api/v1/csrf-token:","maxAge":300,"etag":"none"}
stdout | src/services/analyticsService.test.ts > analyticsService > recordEvent > should record an event successfully
[INFO] [ResponseCache] Cache cleared (1 entries)
[DEBUG] [StateInvalidation] Cleared all response cache
[DEBUG] [StateInvalidation] State invalidated {"target":"cache","invalidateAll":true}
stdout | src/services/analyticsService.test.ts > analyticsService > recordEvent > should record an event successfully
[DEBUG] [Analytics] Event recorded {"event_name":"test_event","payload":{}}
stdout | src/services/analyticsService.test.ts > analyticsService > recordEvent > should handle different event types
[INFO] [ResponseCache] Cache cleared (0 entries)
[DEBUG] [StateInvalidation] Cleared all response cache
[DEBUG] [StateInvalidation] State invalidated {"target":"cache","invalidateAll":true}
stdout | src/services/analyticsService.test.ts > analyticsService > recordEvent > should handle different event types
[DEBUG] [Analytics] Event recorded {"event_name":"click","payload":{}}
stdout | src/services/analyticsService.test.ts > analyticsService > recordEvent > should handle different event types
[INFO] [ResponseCache] Cache cleared (0 entries)
[DEBUG] [StateInvalidation] Cleared all response cache
[DEBUG] [StateInvalidation] State invalidated {"target":"cache","invalidateAll":true}
stdout | src/services/analyticsService.test.ts > analyticsService > recordEvent > should handle different event types
[DEBUG] [Analytics] Event recorded {"event_name":"view","payload":{}}
stdout | src/services/analyticsService.test.ts > analyticsService > recordEvent > should handle different event types
[INFO] [ResponseCache] Cache cleared (0 entries)
[DEBUG] [StateInvalidation] Cleared all response cache
[DEBUG] [StateInvalidation] State invalidated {"target":"cache","invalidateAll":true}
stdout | src/services/analyticsService.test.ts > analyticsService > recordEvent > should handle different event types
[DEBUG] [Analytics] Event recorded {"event_name":"download","payload":{}}
stdout | src/services/analyticsService.test.ts > analyticsService > recordEvent > should handle different event types
[INFO] [ResponseCache] Cache cleared (0 entries)
[DEBUG] [StateInvalidation] Cleared all response cache
[DEBUG] [StateInvalidation] State invalidated {"target":"cache","invalidateAll":true}
stdout | src/services/analyticsService.test.ts > analyticsService > recordEvent > should handle different event types
[DEBUG] [Analytics] Event recorded {"event_name":"play","payload":{}}
stdout | src/services/analyticsService.test.ts > analyticsService > getGlobalStats > should return global statistics
[DEBUG] [ResponseCache] Cached: /analytics {"key":"GET:/api/v1/analytics?days=\"30\":","maxAge":300,"etag":"none"}
stdout | src/services/analyticsService.test.ts > analyticsService > getGlobalStats > should return global statistics
[INFO] [Analytics] Backend returned empty stats, using baseline defaults
stdout | src/services/analyticsService.test.ts > analyticsService > getGlobalStats > should handle different time ranges
[DEBUG] [ResponseCache] Cached: /analytics {"key":"GET:/api/v1/analytics?days=\"7\":","maxAge":300,"etag":"none"}
stdout | src/services/analyticsService.test.ts > analyticsService > getGlobalStats > should handle different time ranges
[INFO] [Analytics] Backend returned empty stats, using baseline defaults
stdout | src/services/analyticsService.test.ts > analyticsService > getGlobalStats > should handle different time ranges
[DEBUG] [ResponseCache] Cached: /analytics {"key":"GET:/api/v1/analytics?days=\"30\":","maxAge":300,"etag":"none"}
stdout | src/services/analyticsService.test.ts > analyticsService > getGlobalStats > should handle different time ranges
[INFO] [Analytics] Backend returned empty stats, using baseline defaults
stdout | src/services/analyticsService.test.ts > analyticsService > getGlobalStats > should handle different time ranges
[DEBUG] [ResponseCache] Cached: /analytics {"key":"GET:/api/v1/analytics?days=\"90\":","maxAge":300,"etag":"none"}
stdout | src/services/analyticsService.test.ts > analyticsService > getGlobalStats > should handle different time ranges
[INFO] [Analytics] Backend returned empty stats, using baseline defaults
stdout | src/services/analyticsService.test.ts > analyticsService > getGlobalStats > should handle different time ranges
[DEBUG] [ResponseCache] Cached: /analytics {"key":"GET:/api/v1/analytics?days=\"all\":","maxAge":300,"etag":"none"}
stdout | src/services/analyticsService.test.ts > analyticsService > getGlobalStats > should handle different time ranges
[INFO] [Analytics] Backend returned empty stats, using baseline defaults
stdout | src/services/analyticsService.test.ts > analyticsService > getTopTracks > should return top tracks
[DEBUG] [ResponseCache] Cached: /analytics/tracks/top {"key":"GET:/api/v1/analytics/tracks/top?days=\"30\":","maxAge":300,"etag":"none"}
stdout | src/services/analyticsService.test.ts > analyticsService > getTopTracks > should handle different time ranges
[DEBUG] [ResponseCache] Cached: /analytics/tracks/top {"key":"GET:/api/v1/analytics/tracks/top?days=\"7\":","maxAge":300,"etag":"none"}
stdout | src/services/analyticsService.test.ts > analyticsService > getTopTracks > should handle different time ranges
[DEBUG] [ResponseCache] Cached: /analytics/tracks/top {"key":"GET:/api/v1/analytics/tracks/top?days=\"30\":","maxAge":300,"etag":"none"}
stdout | src/services/analyticsService.test.ts > analyticsService > getTopTracks > should handle different time ranges
[DEBUG] [ResponseCache] Cached: /analytics/tracks/top {"key":"GET:/api/v1/analytics/tracks/top?days=\"90\":","maxAge":300,"etag":"none"}
stdout | src/services/analyticsService.test.ts > analyticsService > getTopTracks > should handle different time ranges
[DEBUG] [ResponseCache] Cached: /analytics/tracks/top {"key":"GET:/api/v1/analytics/tracks/top?days=\"all\":","maxAge":300,"etag":"none"}
✓ src/services/analyticsService.test.ts (7 tests) 2262ms
✓ analyticsService > recordEvent > should record an event successfully 391ms
✓ analyticsService > recordEvent > should handle different event types 567ms
✓ analyticsService > getGlobalStats > should handle different time ranges 535ms
✓ analyticsService > getTopTracks > should handle different time ranges 378ms
stdout | src/features/user/components/ProfileForm.test.tsx > ProfileForm Component > renders profile form correctly
[ERROR] Failed to load profile completion:
stdout | src/features/user/components/ProfileForm.test.tsx > ProfileForm Component > displays user information
[ERROR] Failed to load profile completion:
stdout | src/features/user/components/ProfileForm.test.tsx > ProfileForm Component > enables editing mode when edit button is clicked
[ERROR] Failed to load profile completion:
✓ src/services/groupService.test.ts (5 tests) 2477ms
✓ groupService > list > should return list of groups 534ms
✓ groupService > get > should return group details 303ms
✓ groupService > create > should create a new group 806ms
✓ groupService > join > should join a group 405ms
✓ groupService > leave > should leave a group 408ms
stdout | src/features/user/components/ProfileForm.test.tsx > ProfileForm Component > validates form fields
[ERROR] Failed to load profile completion:
✓ src/features/tracks/components/CommentThread.test.tsx (18 tests) 2995ms
✓ CommentThread > should show reply form when reply button is clicked 309ms
✓ CommentThread > should submit reply 656ms
✓ CommentThread > should submit edited comment 507ms
✓ CommentThread > should delete comment when confirmed 332ms
stdout | src/features/playlists/pages/PlaylistDetailPage.test.tsx > PlaylistDetailPage > should open add track modal when button is clicked
[DEBUG] [ResponseCache] Cached: /playlists/1/collaborators {"key":"GET:/api/v1/playlists/1/collaborators:","maxAge":300,"etag":"none"}
stdout | src/features/auth/pages/SessionsPage.test.tsx > SessionsPage > should display error when fetch fails
[ERROR] Failed to fetch sessions {"message":"Failed to load sessions"}
stdout | src/features/playlists/pages/PlaylistDetailPage.test.tsx > PlaylistDetailPage > should open add track modal when button is clicked
[DEBUG] [ResponseCache] Cached: /playlists/1/collaborators {"key":"GET:/api/v1/playlists/1/collaborators:","maxAge":300,"etag":"none"}
stdout | src/features/playlists/pages/PlaylistDetailPage.test.tsx > PlaylistDetailPage > should open add track modal when button is clicked
[DEBUG] [ResponseCache] Cached: /playlists/1/collaborators {"key":"GET:/api/v1/playlists/1/collaborators:","maxAge":300,"etag":"none"}
stdout | src/features/playlists/pages/PlaylistDetailPage.test.tsx > PlaylistDetailPage > should open add track modal when button is clicked
[DEBUG] [ResponseCache] Cached: /playlists/1/collaborators {"key":"GET:/api/v1/playlists/1/collaborators:","maxAge":300,"etag":"none"}
stdout | src/features/playlists/pages/PlaylistDetailPage.test.tsx > PlaylistDetailPage > should open add track modal when button is clicked
[DEBUG] [ResponseCache] Cached: /playlists/1/collaborators {"key":"GET:/api/v1/playlists/1/collaborators:","maxAge":300,"etag":"none"}
stdout | src/features/user/components/ProfileForm.test.tsx > ProfileForm Component > allows form submission with valid data
[ERROR] Failed to load profile completion:
stdout | src/features/auth/pages/SessionsPage.test.tsx > SessionsPage > should display error when revoke fails
[ERROR] Failed to revoke session {"message":"Failed to revoke session","sessionId":"2"}
stdout | src/features/playlists/pages/PlaylistDetailPage.test.tsx > PlaylistDetailPage > should close add track modal when close button is clicked
[DEBUG] [ResponseCache] Cached: /playlists/1/collaborators {"key":"GET:/api/v1/playlists/1/collaborators:","maxAge":300,"etag":"none"}
✓ src/features/auth/pages/SessionsPage.test.tsx (9 tests) 1835ms
✓ SessionsPage > should display sessions correctly 306ms
✓ SessionsPage > should revoke a specific session 537ms
✓ src/features/playlists/components/PlaylistForm.test.tsx (12 tests | 1 skipped) 2768ms
✓ PlaylistForm > should render form with default values for create mode 534ms
✓ PlaylistForm > should validate title max length 1352ms
stdout | src/features/playlists/pages/PlaylistDetailPage.test.tsx > PlaylistDetailPage > should refetch playlist when track is removed
[DEBUG] [ResponseCache] Cached: /playlists/1/collaborators {"key":"GET:/api/v1/playlists/1/collaborators:","maxAge":300,"etag":"none"}
stdout | src/features/user/components/ProfileForm.test.tsx > ProfileForm Component > cancels editing and resets form
[ERROR] Failed to load profile completion:
stdout | src/features/playlists/pages/PlaylistDetailPage.test.tsx > PlaylistDetailPage > should refetch playlist when track is added
[DEBUG] [ResponseCache] Cached: /playlists/1/collaborators {"key":"GET:/api/v1/playlists/1/collaborators:","maxAge":300,"etag":"none"}
stdout | src/features/user/components/ProfileForm.test.tsx > ProfileForm Component > handles avatar upload
[ERROR] Failed to load profile completion:
✓ src/features/user/components/ProfileForm.test.tsx (7 tests) 2901ms
✓ ProfileForm Component > renders profile form correctly 359ms
✓ ProfileForm Component > enables editing mode when edit button is clicked 465ms
✓ ProfileForm Component > validates form fields 885ms
✓ ProfileForm Component > allows form submission with valid data 453ms
✓ ProfileForm Component > cancels editing and resets form 436ms
✓ src/features/tracks/components/TrackList.test.tsx (28 tests) 1754ms
stdout | src/features/playlists/pages/PlaylistDetailPage.test.tsx > PlaylistDetailPage > should open share modal when share button is clicked
[DEBUG] [ResponseCache] Cached: /playlists/1/collaborators {"key":"GET:/api/v1/playlists/1/collaborators:","maxAge":300,"etag":"none"}
stdout | src/features/playlists/pages/PlaylistDetailPage.test.tsx > PlaylistDetailPage > should open share modal when share button is clicked
[DEBUG] [ResponseCache] Cached: /playlists/1/collaborators {"key":"GET:/api/v1/playlists/1/collaborators:","maxAge":300,"etag":"none"}
✓ src/features/player/__tests__/player.e2e.test.tsx (21 tests) 2144ms
stdout | src/features/playlists/pages/PlaylistDetailPage.test.tsx
[DEBUG] [ResponseCache] Cached: /playlists/1/collaborators {"key":"GET:/api/v1/playlists/1/collaborators:","maxAge":300,"etag":"none"}
stdout | src/features/playlists/pages/PlaylistDetailPage.test.tsx
[DEBUG] [ResponseCache] Cached: /playlists/1/collaborators {"key":"GET:/api/v1/playlists/1/collaborators:","maxAge":300,"etag":"none"}
stdout | src/features/playlists/pages/PlaylistDetailPage.test.tsx
[DEBUG] [ResponseCache] Cached: /playlists/1/collaborators {"key":"GET:/api/v1/playlists/1/collaborators:","maxAge":300,"etag":"none"}
stdout | src/features/playlists/pages/PlaylistDetailPage.test.tsx
[DEBUG] [ResponseCache] Cached: /playlists/1/collaborators {"key":"GET:/api/v1/playlists/1/collaborators:","maxAge":300,"etag":"none"}
✓ src/features/playlists/pages/PlaylistDetailPage.test.tsx (18 tests | 1 skipped) 4195ms
✓ PlaylistDetailPage > should render playlist title 403ms
✓ PlaylistDetailPage > should render playlist actions (Play All, Shuffle, Follow) 346ms
✓ PlaylistDetailPage > should open add track modal when button is clicked 919ms
✓ PlaylistDetailPage > should refetch playlist when track is removed 356ms
✓ PlaylistDetailPage > should refetch playlist when track is added 314ms
✓ PlaylistDetailPage > should open share modal when share button is clicked 343ms
✓ src/components/ui/date-picker.test.tsx (17 tests) 2928ms
✓ DatePicker Component > opens calendar when trigger is clicked 532ms
✓ DatePicker Component > navigates to previous month 346ms
✓ DatePicker Component > navigates to next month 386ms
✓ src/features/tracks/components/TrackFilters.test.tsx (30 tests) 2432ms
✓ TrackFilters > should call onSearchChange when search input changes 625ms
✓ src/services/storageService.test.ts (5 tests) 2053ms
✓ storageService > listFiles > should return list of files 429ms
✓ storageService > listFiles > should list files in specific folder 404ms
✓ storageService > deleteFiles > should delete files 502ms
✓ storageService > moveFiles > should move files to target folder 503ms
✓ src/components/data/Table.test.tsx (20 tests) 1859ms
✓ Table Component > maintains selection across pages when paginated 568ms
✓ src/features/auth/components/TwoFactorVerify.test.tsx (10 tests) 2292ms
✓ TwoFactorVerify > should allow entering verification code 474ms
✓ TwoFactorVerify > should call onSuccess with backup code 518ms
✓ src/services/commerceService.test.ts (3 tests) 1855ms
✓ commerceService > getPurchases > should return purchases 615ms
✓ commerceService > getSellerStats > should return sales statistics 405ms
✓ commerceService > requestRefund > should request refund successfully 810ms
✓ src/features/playlists/components/AddTrackToPlaylistModal.test.tsx (10 tests) 2379ms
✓ AddTrackToPlaylistModal > should render modal when open 394ms
✓ AddTrackToPlaylistModal > should search tracks when query is entered 539ms
✓ AddTrackToPlaylistModal > should add selected tracks to playlist 401ms
✓ src/features/auth/pages/ForgotPasswordPage.test.tsx (10 tests) 1919ms
✓ ForgotPasswordPage > should render forgot password form 507ms
✓ ForgotPasswordPage > should validate email format 357ms
✓ ForgotPasswordPage > should call handleRequestReset with email on valid submission 366ms
✓ src/features/tracks/components/TrackSearch.test.tsx (5 tests) 1637ms
✓ TrackSearch > should perform search when query changes 534ms
✓ TrackSearch > should perform search when search button is clicked 423ms
✓ TrackSearch > should perform search on Enter key press 349ms
stdout | src/components/layout/DashboardLayout.test.tsx > DashboardLayout Component
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
stdout | src/components/layout/DashboardLayout.test.tsx > DashboardLayout Component
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
stdout | src/components/layout/DashboardLayout.test.tsx > DashboardLayout Component
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
stdout | src/components/layout/DashboardLayout.test.tsx > DashboardLayout Component
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
✓ src/features/profile/components/AvatarUpload.test.tsx (8 tests) 1685ms
✓ AvatarUpload > should validate file format 318ms
✓ AvatarUpload > should validate file size 865ms
stdout | src/components/layout/DashboardLayout.test.tsx > DashboardLayout Component
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
stdout | src/components/layout/DashboardLayout.test.tsx
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
stdout | src/components/layout/DashboardLayout.test.tsx
[DEBUG] [ResponseCache] Cached: /notifications?limit=50 {"key":"GET:/api/v1/notifications?limit=50:","maxAge":300,"etag":"none"}
stdout | src/components/layout/DashboardLayout.test.tsx
[DEBUG] [ResponseCache] Cached: /notifications?limit=50 {"key":"GET:/api/v1/notifications?limit=50:","maxAge":300,"etag":"none"}
stdout | src/components/layout/DashboardLayout.test.tsx
[DEBUG] [ResponseCache] Cached: /notifications?limit=50 {"key":"GET:/api/v1/notifications?limit=50:","maxAge":300,"etag":"none"}
stdout | src/components/layout/DashboardLayout.test.tsx
[DEBUG] [ResponseCache] Cached: /notifications?limit=50 {"key":"GET:/api/v1/notifications?limit=50:","maxAge":300,"etag":"none"}
stdout | src/components/layout/DashboardLayout.test.tsx
[DEBUG] [ResponseCache] Cached: /notifications?limit=50 {"key":"GET:/api/v1/notifications?limit=50:","maxAge":300,"etag":"none"}
stdout | src/components/layout/DashboardLayout.test.tsx
[DEBUG] [ResponseCache] Cached: /notifications?limit=50 {"key":"GET:/api/v1/notifications?limit=50:","maxAge":300,"etag":"none"}
✓ src/components/layout/DashboardLayout.test.tsx (6 tests) 2414ms
✓ DashboardLayout Component > renders layout with sidebar and header 765ms
✓ DashboardLayout Component > renders children content in main section 310ms
✓ DashboardLayout Component > renders Sidebar component 351ms
✓ DashboardLayout Component > renders multiple children correctly 321ms
stdout | src/features/playlists/components/CreatePlaylistDialog.test.tsx > CreatePlaylistDialog > should handle creation error
[ERROR] Failed to create playlist: {"error":{}}
✓ src/features/playlists/components/CreatePlaylistDialog.test.tsx (6 tests) 1378ms
✓ CreatePlaylistDialog > should create playlist on form submit 617ms
✓ CreatePlaylistDialog > should handle creation error 309ms
✓ src/__tests__/accessibility.test.tsx (22 tests) 1424ms
✓ Accessibility Tests > Keyboard Navigation > should navigate through form fields with Tab key 486ms
✓ src/features/player/components/PlaybackSpeedControl.test.tsx (16 tests) 1275ms
✓ src/features/tracks/components/TrackGrid.test.tsx (29 tests) 1396ms
✓ TrackGrid > should render track grid 334ms
✓ src/components/filters/Filters.test.tsx (18 tests) 1431ms
✓ Filters Component > calls onChange when select filter value changes 373ms
stdout | src/features/playlists/components/PlaylistFollowButton.test.tsx > PlaylistFollowButton > should render follow button when not following
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
stdout | src/features/playlists/components/PlaylistFollowButton.test.tsx > PlaylistFollowButton > should render unfollow button when following
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
stdout | src/features/playlists/components/PlaylistFollowButton.test.tsx > PlaylistFollowButton > should not render for playlist owner
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
stdout | src/features/playlists/components/PlaylistFollowButton.test.tsx > PlaylistFollowButton > should not render when user is not logged in
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
stdout | src/features/playlists/components/PlaylistFollowButton.test.tsx > PlaylistFollowButton > should call followPlaylist when follow button is clicked
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
✓ src/services/chatService.test.ts (4 tests) 1536ms
✓ chatService > getServers > should return servers with channels 525ms
✓ chatService > getDMs > should return direct messages 403ms
✓ chatService > getMessages > should return messages for a channel 302ms
stdout | src/features/playlists/components/PlaylistFollowButton.test.tsx > PlaylistFollowButton > should call unfollowPlaylist when unfollow button is clicked
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
stdout | src/features/playlists/components/PlaylistFollowButton.test.tsx > PlaylistFollowButton > should show success message on follow
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
stdout | src/features/playlists/components/PlaylistFollowButton.test.tsx > PlaylistFollowButton > should show success message on unfollow
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
stdout | src/features/playlists/components/PlaylistFollowButton.test.tsx > PlaylistFollowButton > should show error message on follow failure
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
stdout | src/features/playlists/components/PlaylistFollowButton.test.tsx > PlaylistFollowButton > should show follower count when showCount is true
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
stdout | src/features/playlists/components/PlaylistFollowButton.test.tsx > PlaylistFollowButton > should update follower count optimistically
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
stdout | src/features/playlists/components/PlaylistFollowButton.test.tsx > PlaylistFollowButton > should call onFollowChange callback
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
stdout | src/features/playlists/components/PlaylistFollowButton.test.tsx > PlaylistFollowButton > should be disabled during update
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
✓ src/features/playlists/components/PlaylistFollowButton.test.tsx (13 tests) 1986ms
✓ PlaylistFollowButton > should render follow button when not following 302ms
✓ PlaylistFollowButton > should call followPlaylist when follow button is clicked 439ms
stdout | src/test/stores.test.ts > Zustand Stores > Auth Store > should handle login action
[DEBUG] [ResponseCache] Cached: /csrf-token {"key":"GET:/api/v1/csrf-token:","maxAge":300,"etag":"none"}
stdout | src/test/stores.test.ts > Zustand Stores > Auth Store > should handle clearError action
[WARN] [StateInvalidation] QueryClient not available, falling back to event system
[DEBUG] [StateInvalidation] State invalidated {"target":"all","resourceType":"users","resourceId":"logout","invalidateAll":false}
[WARN] [StateInvalidation] QueryClient not available, falling back to event system
[DEBUG] [StateInvalidation] State invalidated {"target":"all","resourceType":"users","resourceId":"logout","invalidateAll":false}
stdout | src/features/tracks/pages/TrackDetailPage.test.tsx > TrackDetailPage > should render track details after loading
[DEBUG] [ResponseCache] Cached: /tracks/1/comments?page=1&limit=20 {"key":"GET:/api/v1/tracks/1/comments?page=1&limit=20:","maxAge":300,"etag":"none"}
[WARN] [API] Received non-wrapped response format (unexpected) {"request_id":"req_1771008318099_p3fak8lyw","url":"/tracks/1/comments?page=1&limit=20","method":"GET","status":200,"response_preview":"{\"data\":[{\"id\":\"track-1\",\"title\":\"Storybook Track\",\"artist\":\"Test Artist\",\"duration\":240,\"cover_url\":\"https://picsum.photos/200\",\"coverUrl\":\"https://picsum.photos/200\",\"genre\":\"Pop\",\"created_at\":\"2024","timestamp":"2026-02-13T18:45:18.100Z"}
stdout | src/test/stores.test.ts > Zustand Stores > Auth Store
[WARN] [StateInvalidation] QueryClient not available, falling back to event system
[DEBUG] [StateInvalidation] State invalidated {"target":"all","resourceType":"users","resourceId":"logout","invalidateAll":false}
✓ src/features/playlists/components/PlaylistSearch.test.tsx (7 tests) 1416ms
✓ PlaylistSearch > should display search results 339ms
stdout | src/test/stores.test.ts > Zustand Stores > Auth Store
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
[INFO] [ResponseCache] Invalidated 1 cache entries for pattern: /auth/me
[WARN] [StateInvalidation] QueryClient not available, falling back to event system
[DEBUG] [StateInvalidation] State invalidated {"target":"all","resourceType":"users","resourceId":"logout","invalidateAll":false}
stdout | src/test/stores.test.ts > Zustand Stores > Auth Store > should clear authentication state on logout
[INFO] [Auth] Performing local logout (no API call)
stdout | src/test/stores.test.ts > Zustand Stores > Auth Store > should clear authentication state on logout
[DEBUG] [ResponseCache] Cached: /csrf-token {"key":"GET:/api/v1/csrf-token:","maxAge":300,"etag":"none"}
stdout | src/test/stores.test.ts > Zustand Stores > Auth Store > should clear authentication state on logout
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
stdout | src/test/stores.test.ts > Zustand Stores > UI Store > should have initial state
[DEBUG] [ResponseCache] Cached: /csrf-token {"key":"GET:/api/v1/csrf-token:","maxAge":300,"etag":"none"}
stdout | src/test/stores.test.ts > Zustand Stores > UI Store > should have initial state
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
stdout | src/test/stores.test.ts > Zustand Stores > UI Store > should have initial state
[DEBUG] [ResponseCache] Cached: /csrf-token {"key":"GET:/api/v1/csrf-token:","maxAge":300,"etag":"none"}
stdout | src/test/stores.test.ts > Zustand Stores > UI Store
[INFO] [ResponseCache] Invalidated 1 cache entries for pattern: /auth/me
[WARN] [StateInvalidation] QueryClient not available, falling back to event system
[DEBUG] [StateInvalidation] State invalidated {"target":"all","resourceType":"users","resourceId":"logout","invalidateAll":false}
stdout | src/test/stores.test.ts > Zustand Stores > UI Store > should handle theme changes
[DEBUG] [ResponseCache] Cached: /csrf-token {"key":"GET:/api/v1/csrf-token:","maxAge":300,"etag":"none"}
stdout | src/test/stores.test.ts > Zustand Stores > UI Store
[WARN] [StateInvalidation] QueryClient not available, falling back to event system
[DEBUG] [StateInvalidation] State invalidated {"target":"all","resourceType":"users","resourceId":"logout","invalidateAll":false}
stdout | src/test/stores.test.ts > Zustand Stores > UI Store
[WARN] [StateInvalidation] QueryClient not available, falling back to event system
[DEBUG] [StateInvalidation] State invalidated {"target":"all","resourceType":"users","resourceId":"logout","invalidateAll":false}
stdout | src/test/stores.test.ts > Zustand Stores > UI Store > should handle language changes
[DEBUG] [ResponseCache] Cached: /csrf-token {"key":"GET:/api/v1/csrf-token:","maxAge":300,"etag":"none"}
stdout | src/features/tracks/pages/TrackDetailPage.test.tsx > TrackDetailPage > should play track when play button is clicked
[DEBUG] [ResponseCache] Cached: /tracks/1/comments?page=1&limit=20 {"key":"GET:/api/v1/tracks/1/comments?page=1&limit=20:","maxAge":300,"etag":"none"}
[WARN] [API] Received non-wrapped response format (unexpected) {"request_id":"req_1771008318743_mw9u8uj9j","url":"/tracks/1/comments?page=1&limit=20","method":"GET","status":200,"response_preview":"{\"data\":[{\"id\":\"track-1\",\"title\":\"Storybook Track\",\"artist\":\"Test Artist\",\"duration\":240,\"cover_url\":\"https://picsum.photos/200\",\"coverUrl\":\"https://picsum.photos/200\",\"genre\":\"Pop\",\"created_at\":\"2024","timestamp":"2026-02-13T18:45:18.743Z"}
stdout | src/test/stores.test.ts > Zustand Stores > UI Store > should handle language changes
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
stdout | src/test/stores.test.ts > Zustand Stores > UI Store > should handle sidebar toggle
[DEBUG] [ResponseCache] Cached: /csrf-token {"key":"GET:/api/v1/csrf-token:","maxAge":300,"etag":"none"}
stdout | src/test/stores.test.ts > Zustand Stores > UI Store > should handle sidebar toggle
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
stdout | src/test/stores.test.ts > Zustand Stores > UI Store > should handle sidebar toggle
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
stdout | src/test/stores.test.ts > Zustand Stores > UI Store
[DEBUG] [ResponseCache] Cached: /csrf-token {"key":"GET:/api/v1/csrf-token:","maxAge":300,"etag":"none"}
stdout | src/test/stores.test.ts > Zustand Stores > Chat Store
[INFO] [ResponseCache] Invalidated 1 cache entries for pattern: /auth/me
[WARN] [StateInvalidation] QueryClient not available, falling back to event system
[DEBUG] [StateInvalidation] State invalidated {"target":"all","resourceType":"users","resourceId":"logout","invalidateAll":false}
✓ src/components/navigation/Tabs.test.tsx (24 tests) 1630ms
stdout | src/test/stores.test.ts > Zustand Stores > Chat Store > should have initial state
[DEBUG] [ResponseCache] Cached: /csrf-token {"key":"GET:/api/v1/csrf-token:","maxAge":300,"etag":"none"}
stdout | src/test/stores.test.ts > Zustand Stores > Chat Store > should have initial state
[WARN] [StateInvalidation] QueryClient not available, falling back to event system
[DEBUG] [StateInvalidation] State invalidated {"target":"all","resourceType":"users","resourceId":"logout","invalidateAll":false}
stdout | src/test/stores.test.ts > Zustand Stores > Chat Store
[WARN] [StateInvalidation] QueryClient not available, falling back to event system
[DEBUG] [StateInvalidation] State invalidated {"target":"all","resourceType":"users","resourceId":"logout","invalidateAll":false}
stdout | src/test/stores.test.ts > Zustand Stores > Chat Store > should handle conversation actions
[DEBUG] [ResponseCache] Cached: /csrf-token {"key":"GET:/api/v1/csrf-token:","maxAge":300,"etag":"none"}
stdout | src/test/stores.test.ts > Zustand Stores > Chat Store > should handle conversation actions
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
stdout | src/test/stores.test.ts > Zustand Stores > Chat Store > should handle message actions
[DEBUG] [ResponseCache] Cached: /csrf-token {"key":"GET:/api/v1/csrf-token:","maxAge":300,"etag":"none"}
stdout | src/test/stores.test.ts > Zustand Stores > Chat Store > should handle message actions
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
stdout | src/test/stores.test.ts > Zustand Stores > Chat Store > should handle message actions
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
stdout | src/test/stores.test.ts > Zustand Stores > Chat Store
[DEBUG] [ResponseCache] Cached: /csrf-token {"key":"GET:/api/v1/csrf-token:","maxAge":300,"etag":"none"}
stdout | src/test/stores.test.ts > Zustand Stores > Library Store
[INFO] [ResponseCache] Invalidated 1 cache entries for pattern: /auth/me
[WARN] [StateInvalidation] QueryClient not available, falling back to event system
[DEBUG] [StateInvalidation] State invalidated {"target":"all","resourceType":"users","resourceId":"logout","invalidateAll":false}
stdout | src/test/stores.test.ts > Zustand Stores > Library Store > should have initial state
[DEBUG] [ResponseCache] Cached: /csrf-token {"key":"GET:/api/v1/csrf-token:","maxAge":300,"etag":"none"}
stdout | src/test/stores.test.ts > Zustand Stores > Library Store > should have initial state
[WARN] [StateInvalidation] QueryClient not available, falling back to event system
[DEBUG] [StateInvalidation] State invalidated {"target":"all","resourceType":"users","resourceId":"logout","invalidateAll":false}
stdout | src/test/stores.test.ts > Zustand Stores > Library Store
[WARN] [StateInvalidation] QueryClient not available, falling back to event system
[DEBUG] [StateInvalidation] State invalidated {"target":"all","resourceType":"users","resourceId":"logout","invalidateAll":false}
stdout | src/test/stores.test.ts > Zustand Stores > Library Store > should handle filter actions
[DEBUG] [ResponseCache] Cached: /csrf-token {"key":"GET:/api/v1/csrf-token:","maxAge":300,"etag":"none"}
✓ src/features/tracks/components/TrackHistory.test.tsx (10 tests) 1439ms
✓ TrackHistory > should render loading state initially 420ms
stdout | src/test/stores.test.ts > Zustand Stores > Library Store > should handle filter actions
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
stdout | src/test/stores.test.ts > Zustand Stores > Player Store > should have initial state
[DEBUG] [ResponseCache] Cached: /csrf-token {"key":"GET:/api/v1/csrf-token:","maxAge":300,"etag":"none"}
stdout | src/test/stores.test.ts > Zustand Stores > Player Store > should have initial state
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
stdout | src/test/stores.test.ts > Zustand Stores > Player Store > should have initial state
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
stdout | src/test/stores.test.ts > Zustand Stores > Player Store > should have initial state
[DEBUG] [ResponseCache] Cached: /csrf-token {"key":"GET:/api/v1/csrf-token:","maxAge":300,"etag":"none"}
stdout | src/features/tracks/pages/TrackDetailPage.test.tsx > TrackDetailPage > should pause track when pause button is clicked if track is playing
[DEBUG] [ResponseCache] Cached: /tracks/1/comments?page=1&limit=20 {"key":"GET:/api/v1/tracks/1/comments?page=1&limit=20:","maxAge":300,"etag":"none"}
[WARN] [API] Received non-wrapped response format (unexpected) {"request_id":"req_1771008319315_iauforwz5","url":"/tracks/1/comments?page=1&limit=20","method":"GET","status":200,"response_preview":"{\"data\":[{\"id\":\"track-1\",\"title\":\"Storybook Track\",\"artist\":\"Test Artist\",\"duration\":240,\"cover_url\":\"https://picsum.photos/200\",\"coverUrl\":\"https://picsum.photos/200\",\"genre\":\"Pop\",\"created_at\":\"2024","timestamp":"2026-02-13T18:45:19.315Z"}
stdout | src/test/stores.test.ts > Zustand Stores > Player Store
[INFO] [ResponseCache] Invalidated 1 cache entries for pattern: /auth/me
[WARN] [StateInvalidation] QueryClient not available, falling back to event system
[DEBUG] [StateInvalidation] State invalidated {"target":"all","resourceType":"users","resourceId":"logout","invalidateAll":false}
stdout | src/test/stores.test.ts > Zustand Stores > Player Store > should handle play action
[DEBUG] [ResponseCache] Cached: /csrf-token {"key":"GET:/api/v1/csrf-token:","maxAge":300,"etag":"none"}
stdout | src/test/stores.test.ts > Zustand Stores > Player Store
[WARN] [StateInvalidation] QueryClient not available, falling back to event system
[DEBUG] [StateInvalidation] State invalidated {"target":"all","resourceType":"users","resourceId":"logout","invalidateAll":false}
stdout | src/test/stores.test.ts > Zustand Stores > Player Store
[WARN] [StateInvalidation] QueryClient not available, falling back to event system
[DEBUG] [StateInvalidation] State invalidated {"target":"all","resourceType":"users","resourceId":"logout","invalidateAll":false}
stdout | src/test/stores.test.ts > Zustand Stores > Player Store > should handle pause action
[DEBUG] [ResponseCache] Cached: /csrf-token {"key":"GET:/api/v1/csrf-token:","maxAge":300,"etag":"none"}
stdout | src/test/stores.test.ts > Zustand Stores > Player Store > should handle pause action
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
stdout | src/test/stores.test.ts > Zustand Stores > Player Store > should handle resume action
[DEBUG] [ResponseCache] Cached: /csrf-token {"key":"GET:/api/v1/csrf-token:","maxAge":300,"etag":"none"}
stdout | src/test/stores.test.ts > Zustand Stores > Player Store > should handle resume action
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
stdout | src/test/stores.test.ts > Zustand Stores > Player Store > should handle resume action
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
stdout | src/test/stores.test.ts > Zustand Stores > Player Store
[DEBUG] [ResponseCache] Cached: /csrf-token {"key":"GET:/api/v1/csrf-token:","maxAge":300,"etag":"none"}
stdout | src/test/stores.test.ts > Zustand Stores > Player Store > should handle volume changes
[INFO] [ResponseCache] Invalidated 1 cache entries for pattern: /auth/me
[WARN] [StateInvalidation] QueryClient not available, falling back to event system
[DEBUG] [StateInvalidation] State invalidated {"target":"all","resourceType":"users","resourceId":"logout","invalidateAll":false}
stdout | src/test/stores.test.ts > Zustand Stores > Player Store
[DEBUG] [ResponseCache] Cached: /csrf-token {"key":"GET:/api/v1/csrf-token:","maxAge":300,"etag":"none"}
stdout | src/test/stores.test.ts > Zustand Stores > Player Store
[WARN] [StateInvalidation] QueryClient not available, falling back to event system
[DEBUG] [StateInvalidation] State invalidated {"target":"all","resourceType":"users","resourceId":"logout","invalidateAll":false}
stdout | src/test/stores.test.ts > Zustand Stores > Player Store > should handle toggle mute
[WARN] [StateInvalidation] QueryClient not available, falling back to event system
[DEBUG] [StateInvalidation] State invalidated {"target":"all","resourceType":"users","resourceId":"logout","invalidateAll":false}
stdout | src/test/stores.test.ts > Zustand Stores > Player Store
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
[INFO] [ResponseCache] Invalidated 1 cache entries for pattern: /auth/me
[WARN] [StateInvalidation] QueryClient not available, falling back to event system
[DEBUG] [StateInvalidation] State invalidated {"target":"all","resourceType":"users","resourceId":"logout","invalidateAll":false}
stdout | src/test/stores.test.ts > Zustand Stores > Player Store > should handle add to queue
[DEBUG] [ResponseCache] Cached: /csrf-token {"key":"GET:/api/v1/csrf-token:","maxAge":300,"etag":"none"}
stdout | src/test/stores.test.ts > Zustand Stores > Player Store > should handle add to queue
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
stdout | src/test/stores.test.ts > Zustand Stores > Player Store
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
stdout | src/test/stores.test.ts > Zustand Stores > Player Store > should handle clear queue
[DEBUG] [ResponseCache] Cached: /csrf-token {"key":"GET:/api/v1/csrf-token:","maxAge":300,"etag":"none"}
stdout | src/test/stores.test.ts > Zustand Stores > Player Store > should handle clear queue
[DEBUG] [ResponseCache] Cached: /csrf-token {"key":"GET:/api/v1/csrf-token:","maxAge":300,"etag":"none"}
stdout | src/features/tracks/pages/TrackDetailPage.test.tsx > TrackDetailPage > should add track to queue when queue button is clicked
[DEBUG] [ResponseCache] Cached: /tracks/1/comments?page=1&limit=20 {"key":"GET:/api/v1/tracks/1/comments?page=1&limit=20:","maxAge":300,"etag":"none"}
[WARN] [API] Received non-wrapped response format (unexpected) {"request_id":"req_1771008319736_dpes344q5","url":"/tracks/1/comments?page=1&limit=20","method":"GET","status":200,"response_preview":"{\"data\":[{\"id\":\"track-1\",\"title\":\"Storybook Track\",\"artist\":\"Test Artist\",\"duration\":240,\"cover_url\":\"https://picsum.photos/200\",\"coverUrl\":\"https://picsum.photos/200\",\"genre\":\"Pop\",\"created_at\":\"2024","timestamp":"2026-02-13T18:45:19.736Z"}
stdout | src/test/stores.test.ts > Zustand Stores > Player Store > should handle clear queue
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
stdout | src/test/stores.test.ts > Zustand Stores > Player Store
[DEBUG] [ResponseCache] Cached: /csrf-token {"key":"GET:/api/v1/csrf-token:","maxAge":300,"etag":"none"}
stdout | src/test/stores.test.ts > Zustand Stores > Player Store > should handle toggle shuffle
[INFO] [ResponseCache] Invalidated 1 cache entries for pattern: /auth/me
[WARN] [StateInvalidation] QueryClient not available, falling back to event system
[DEBUG] [StateInvalidation] State invalidated {"target":"all","resourceType":"users","resourceId":"logout","invalidateAll":false}
stdout | src/test/stores.test.ts > Zustand Stores > Player Store
[DEBUG] [ResponseCache] Cached: /csrf-token {"key":"GET:/api/v1/csrf-token:","maxAge":300,"etag":"none"}
stdout | src/test/stores.test.ts > Zustand Stores > Player Store
[WARN] [StateInvalidation] QueryClient not available, falling back to event system
[DEBUG] [StateInvalidation] State invalidated {"target":"all","resourceType":"users","resourceId":"logout","invalidateAll":false}
stdout | src/test/stores.test.ts > Zustand Stores > Player Store > should handle set repeat
[WARN] [StateInvalidation] QueryClient not available, falling back to event system
[DEBUG] [StateInvalidation] State invalidated {"target":"all","resourceType":"users","resourceId":"logout","invalidateAll":false}
stdout | src/test/stores.test.ts > Zustand Stores > Player Store
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
[INFO] [ResponseCache] Invalidated 1 cache entries for pattern: /auth/me
[WARN] [StateInvalidation] QueryClient not available, falling back to event system
[DEBUG] [StateInvalidation] State invalidated {"target":"all","resourceType":"users","resourceId":"logout","invalidateAll":false}
stdout | src/test/stores.test.ts
[DEBUG] [ResponseCache] Cached: /csrf-token {"key":"GET:/api/v1/csrf-token:","maxAge":300,"etag":"none"}
stdout | src/test/stores.test.ts
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
stdout | src/test/stores.test.ts
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
stdout | src/test/stores.test.ts
[DEBUG] [ResponseCache] Cached: /csrf-token {"key":"GET:/api/v1/csrf-token:","maxAge":300,"etag":"none"}
stdout | src/test/stores.test.ts
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
stdout | src/services/requestDeduplication.test.ts > RequestDeduplicationService > getOrCreateRequest > should deduplicate identical concurrent GET requests
[INFO] [RequestDeduplication] Cache cleared (0 entries)
stdout | src/services/requestDeduplication.test.ts > RequestDeduplicationService > getOrCreateRequest > should deduplicate identical concurrent GET requests
[DEBUG] [RequestDeduplication] New request: GET /api/v1/tracks {"key":"GET:/api/v1/tracks","cacheSize":1}
[DEBUG] [RequestDeduplication] Reusing request: GET /api/v1/tracks {"key":"GET:/api/v1/tracks","resolveCount":2}
✓ src/test/stores.test.ts (25 tests) 2168ms
stdout | src/features/tracks/pages/TrackDetailPage.test.tsx > TrackDetailPage > should copy share link when share button is clicked
[DEBUG] [ResponseCache] Cached: /tracks/1/comments?page=1&limit=20 {"key":"GET:/api/v1/tracks/1/comments?page=1&limit=20:","maxAge":300,"etag":"none"}
[WARN] [API] Received non-wrapped response format (unexpected) {"request_id":"req_1771008320027_z0lnxtf7s","url":"/tracks/1/comments?page=1&limit=20","method":"GET","status":200,"response_preview":"{\"data\":[{\"id\":\"track-1\",\"title\":\"Storybook Track\",\"artist\":\"Test Artist\",\"duration\":240,\"cover_url\":\"https://picsum.photos/200\",\"coverUrl\":\"https://picsum.photos/200\",\"genre\":\"Pop\",\"created_at\":\"2024","timestamp":"2026-02-13T18:45:20.027Z"}
stdout | src/services/requestDeduplication.test.ts > RequestDeduplicationService > getOrCreateRequest > should create separate promises for different requests
[INFO] [RequestDeduplication] Cache cleared (1 entries)
stdout | src/services/requestDeduplication.test.ts > RequestDeduplicationService > getOrCreateRequest > should create separate promises for different requests
[DEBUG] [RequestDeduplication] New request: GET /api/v1/tracks {"key":"GET:/api/v1/tracks","cacheSize":1}
[DEBUG] [RequestDeduplication] New request: GET /api/v1/playlists {"key":"GET:/api/v1/playlists","cacheSize":2}
stdout | src/services/requestDeduplication.test.ts > RequestDeduplicationService > getOrCreateRequest > should handle different query parameters as different requests
[INFO] [RequestDeduplication] Cache cleared (2 entries)
stdout | src/services/requestDeduplication.test.ts > RequestDeduplicationService > getOrCreateRequest > should handle different query parameters as different requests
[DEBUG] [RequestDeduplication] New request: GET /api/v1/tracks {"key":"GET:/api/v1/tracks?page=1","cacheSize":1}
[DEBUG] [RequestDeduplication] New request: GET /api/v1/tracks {"key":"GET:/api/v1/tracks?page=2","cacheSize":2}
stdout | src/services/requestDeduplication.test.ts > RequestDeduplicationService > getOrCreateRequest > should deduplicate POST requests with identical data by default
[INFO] [RequestDeduplication] Cache cleared (2 entries)
stdout | src/services/requestDeduplication.test.ts > RequestDeduplicationService > getOrCreateRequest > should deduplicate POST requests with identical data by default
[DEBUG] [RequestDeduplication] New request: POST /api/v1/tracks {"key":"POST:/api/v1/tracks|{\"title\":\"Test\"}","cacheSize":1}
[DEBUG] [RequestDeduplication] Reusing request: POST /api/v1/tracks {"key":"POST:/api/v1/tracks|{\"title\":\"Test\"}","resolveCount":2}
stdout | src/services/requestDeduplication.test.ts > RequestDeduplicationService > getOrCreateRequest > should remove request from cache after completion
[INFO] [RequestDeduplication] Cache cleared (1 entries)
stdout | src/services/requestDeduplication.test.ts > RequestDeduplicationService > getOrCreateRequest > should remove request from cache after completion
[DEBUG] [RequestDeduplication] New request: GET /api/v1/tracks {"key":"GET:/api/v1/tracks","cacheSize":1}
stdout | src/features/tracks/pages/TrackDetailPage.test.tsx > TrackDetailPage > should navigate back when back button is clicked
[DEBUG] [ResponseCache] Cached: /tracks/1/comments?page=1&limit=20 {"key":"GET:/api/v1/tracks/1/comments?page=1&limit=20:","maxAge":300,"etag":"none"}
[WARN] [API] Received non-wrapped response format (unexpected) {"request_id":"req_1771008320388_oaon1axdb","url":"/tracks/1/comments?page=1&limit=20","method":"GET","status":200,"response_preview":"{\"data\":[{\"id\":\"track-1\",\"title\":\"Storybook Track\",\"artist\":\"Test Artist\",\"duration\":240,\"cover_url\":\"https://picsum.photos/200\",\"coverUrl\":\"https://picsum.photos/200\",\"genre\":\"Pop\",\"created_at\":\"2024","timestamp":"2026-02-13T18:45:20.388Z"}
stdout | src/features/tracks/pages/TrackDetailPage.test.tsx > TrackDetailPage > should display waveform if available
[DEBUG] [ResponseCache] Cached: /tracks/1/comments?page=1&limit=20 {"key":"GET:/api/v1/tracks/1/comments?page=1&limit=20:","maxAge":300,"etag":"none"}
[WARN] [API] Received non-wrapped response format (unexpected) {"request_id":"req_1771008320661_d1yulhtq5","url":"/tracks/1/comments?page=1&limit=20","method":"GET","status":200,"response_preview":"{\"data\":[{\"id\":\"track-1\",\"title\":\"Storybook Track\",\"artist\":\"Test Artist\",\"duration\":240,\"cover_url\":\"https://picsum.photos/200\",\"coverUrl\":\"https://picsum.photos/200\",\"genre\":\"Pop\",\"created_at\":\"2024","timestamp":"2026-02-13T18:45:20.661Z"}
stdout | src/features/tracks/pages/TrackDetailPage.test.tsx > TrackDetailPage > should display cover art if available
[DEBUG] [ResponseCache] Cached: /tracks/1/comments?page=1&limit=20 {"key":"GET:/api/v1/tracks/1/comments?page=1&limit=20:","maxAge":300,"etag":"none"}
[WARN] [API] Received non-wrapped response format (unexpected) {"request_id":"req_1771008320767_v27mqs9ia","url":"/tracks/1/comments?page=1&limit=20","method":"GET","status":200,"response_preview":"{\"data\":[{\"id\":\"track-1\",\"title\":\"Storybook Track\",\"artist\":\"Test Artist\",\"duration\":240,\"cover_url\":\"https://picsum.photos/200\",\"coverUrl\":\"https://picsum.photos/200\",\"genre\":\"Pop\",\"created_at\":\"2024","timestamp":"2026-02-13T18:45:20.767Z"}
✓ src/features/settings/components/PreferenceSettings.test.tsx (10 tests) 553ms
stdout | src/features/tracks/pages/TrackDetailPage.test.tsx > TrackDetailPage > should display placeholder if no cover art
[DEBUG] [ResponseCache] Cached: /tracks/1/comments?page=1&limit=20 {"key":"GET:/api/v1/tracks/1/comments?page=1&limit=20:","maxAge":300,"etag":"none"}
[WARN] [API] Received non-wrapped response format (unexpected) {"request_id":"req_1771008320923_6z60qqj0p","url":"/tracks/1/comments?page=1&limit=20","method":"GET","status":200,"response_preview":"{\"data\":[{\"id\":\"track-1\",\"title\":\"Storybook Track\",\"artist\":\"Test Artist\",\"duration\":240,\"cover_url\":\"https://picsum.photos/200\",\"coverUrl\":\"https://picsum.photos/200\",\"genre\":\"Pop\",\"created_at\":\"2024","timestamp":"2026-02-13T18:45:20.923Z"}
✓ src/features/tracks/pages/TrackDetailPage.test.tsx (12 tests) 3924ms
✓ TrackDetailPage > should render track details after loading 802ms
✓ TrackDetailPage > should play track when play button is clicked 616ms
✓ TrackDetailPage > should pause track when pause button is clicked if track is playing 406ms
✓ TrackDetailPage > should copy share link when share button is clicked 331ms
✓ TrackDetailPage > should navigate back when back button is clicked 419ms
stdout | src/services/requestDeduplication.test.ts > RequestDeduplicationService > getOrCreateRequest > should remove request from cache after completion
[DEBUG] [RequestDeduplication] Removed from cache: GET:/api/v1/tracks
stdout | src/services/requestDeduplication.test.ts > RequestDeduplicationService > getOrCreateRequest > should remove request from cache after completion
[DEBUG] [RequestDeduplication] New request: GET /api/v1/tracks {"key":"GET:/api/v1/tracks","cacheSize":1}
stdout | src/services/requestDeduplication.test.ts > RequestDeduplicationService > getOrCreateRequest > should handle errors and remove from cache
[INFO] [RequestDeduplication] Cache cleared (1 entries)
stdout | src/services/requestDeduplication.test.ts > RequestDeduplicationService > getOrCreateRequest > should handle errors and remove from cache
[DEBUG] [RequestDeduplication] New request: GET /api/v1/tracks {"key":"GET:/api/v1/tracks","cacheSize":1}
stdout | src/services/requestDeduplication.test.ts > RequestDeduplicationService > getOrCreateRequest > should handle errors and remove from cache
[DEBUG] [RequestDeduplication] Removed from cache (error): GET:/api/v1/tracks
stdout | src/services/requestDeduplication.test.ts > RequestDeduplicationService > clearCache > should clear all cached requests
[INFO] [RequestDeduplication] Cache cleared (0 entries)
stdout | src/services/requestDeduplication.test.ts > RequestDeduplicationService > clearCache > should clear all cached requests
[DEBUG] [RequestDeduplication] New request: GET /api/v1/tracks {"key":"GET:/api/v1/tracks","cacheSize":1}
stdout | src/services/requestDeduplication.test.ts > RequestDeduplicationService > clearCache > should clear all cached requests
[INFO] [RequestDeduplication] Cache cleared (1 entries)
stdout | src/services/requestDeduplication.test.ts > RequestDeduplicationService > getCacheStats > should return cache statistics
[INFO] [RequestDeduplication] Cache cleared (0 entries)
stdout | src/services/requestDeduplication.test.ts > RequestDeduplicationService > getCacheStats > should return cache statistics
[DEBUG] [RequestDeduplication] New request: GET /api/v1/tracks {"key":"GET:/api/v1/tracks","cacheSize":1}
stdout | src/services/requestDeduplication.test.ts > RequestDeduplicationService > cleanup > should remove old cache entries
[INFO] [RequestDeduplication] Cache cleared (1 entries)
stdout | src/services/requestDeduplication.test.ts > RequestDeduplicationService > cleanup > should remove old cache entries
[DEBUG] [RequestDeduplication] New request: GET /api/v1/tracks {"key":"GET:/api/v1/tracks","cacheSize":1}
stdout | src/services/requestDeduplication.test.ts > RequestDeduplicationService > cleanup > should remove old cache entries
[DEBUG] [RequestDeduplication] Cleaned up 1 old cache entries
✓ src/services/requestDeduplication.test.ts (10 tests | 1 skipped) 1312ms
✓ RequestDeduplicationService > getOrCreateRequest > should remove request from cache after completion 1105ms
✓ src/services/developerService.test.ts (4 tests) 1346ms
✓ developerService > listKeys > should return empty array when no keys stored 313ms
✓ developerService > createKey > should create a new API key 695ms
✓ developerService > revokeKey > should revoke an API key 308ms
✓ src/features/tracks/components/TrackListRow.test.tsx (24 tests) 1384ms
✓ src/features/player/components/MiniPlayer.test.tsx (24 tests) 1132ms
✓ src/components/feedback/Toast.test.tsx (19 tests) 1187ms
✓ Toast Components > ToastComponent > calls onDismiss when close button is clicked 360ms
✓ src/features/player/components/QualitySelector.test.tsx (17 tests) 1623ms
✓ QualitySelector > should open dropdown when button is clicked 317ms
✓ src/features/tracks/components/CommentSection.test.tsx (8 tests) 2055ms
✓ CommentSection > should render comment section 333ms
✓ CommentSection > should create a new comment 1020ms
stdout | src/features/streaming/components/PlaybackDashboard.test.tsx > PlaybackDashboard > should render error message when API call fails
[ERROR] Failed to load playback dashboard: {"message":"Track not found: 123"}
✓ src/components/forms/FormBuilder.test.tsx (21 tests) 1798ms
✓ FormBuilder Component > updates form data when field value changes 326ms
✓ FormBuilder Component > validates email format 372ms
✓ FormBuilder Component > submits form with valid data 315ms
✓ src/features/streaming/components/PlaybackDashboard.test.tsx (9 tests) 1316ms
✓ src/components/ui/loading-spinner.test.tsx (9 tests) 393ms
✓ src/components/ui/dialog.test.tsx (19 tests) 886ms
✓ src/components/ui/dropdown.test.tsx (21 tests) 1608ms
✓ Dropdown Component > opens menu when trigger is clicked 348ms
✓ Dropdown Component > closes menu when clicking outside 313ms
✓ src/features/playlists/hooks/usePlaylist.test.tsx (21 tests) 1259ms
✓ src/features/auth/components/ForgotPasswordForm.test.tsx (8 tests) 1001ms
✓ src/features/tracks/components/TrackListPagination.test.tsx (23 tests) 1411ms
✓ TrackListPagination > should render pagination 348ms
✓ src/components/navigation/Pagination.test.tsx (21 tests) 1276ms
✓ Pagination Component > calls onPageChange when page number is clicked 327ms
✓ src/features/playlists/components/PlaylistBatchActions.test.tsx (8 tests) 917ms
✓ src/features/tracks/components/ViewToggle.test.tsx (13 tests) 1274ms
✓ ViewToggle > should render view toggle 304ms
✓ src/features/playlists/components/PlaylistListSkeleton.test.tsx (5 tests) 660ms
✓ PlaylistListSkeleton > should render skeleton list with default count 325ms
✓ src/features/auth/components/RegisterForm.test.tsx (8 tests) 1578ms
✓ RegisterForm Component > renders register form correctly 546ms
✓ src/features/playlists/components/CollaboratorManagement.test.tsx (11 tests) 1187ms
✓ CollaboratorManagement > should open add modal when add button is clicked 330ms
✓ src/features/tracks/components/TrackSort.test.tsx (17 tests) 1091ms
✓ TrackSort > should render track sort 355ms
✓ src/features/tracks/hooks/useInfiniteScroll.test.ts (12 tests) 1059ms
✓ src/features/tracks/components/TrackGridDensitySelector.test.tsx (6 tests) 661ms
✓ TrackGridDensitySelector > should render density selector 380ms
stdout | src/features/profile/pages/UserProfilePage.test.tsx
[DEBUG] [ResponseCache] Cached: /users/123 {"key":"GET:/api/v1/users/123:","maxAge":300,"etag":"none"}
stdout | src/features/profile/pages/UserProfilePage.test.tsx
[DEBUG] [ResponseCache] Cached: /users/123 {"key":"GET:/api/v1/users/123:","maxAge":300,"etag":"none"}
stdout | src/features/profile/pages/UserProfilePage.test.tsx
[DEBUG] [ResponseCache] Cached: /users/123 {"key":"GET:/api/v1/users/123:","maxAge":300,"etag":"none"}
✓ src/features/profile/pages/UserProfilePage.test.tsx (7 tests) 1381ms
✓ UserProfilePage Component > renders loading state initially 394ms
✓ UserProfilePage Component > renders profile successfully 418ms
✓ src/components/ui/ImageViewerModal.test.tsx (13 tests) 518ms
stdout | src/features/streaming/components/PlaybackHeatmap.test.tsx > PlaybackHeatmap > should render error message on error
[ERROR] Failed to load playback heatmap: {"message":"Failed to load heatmap"}
✓ src/features/playlists/components/PlaylistList.test.tsx (8 tests) 1007ms
✓ PlaylistList > should render loading state 366ms
✓ src/features/streaming/components/PlaybackHeatmap.test.tsx (9 tests) 435ms
✓ src/features/player/components/AudioPlayer.test.tsx (20 tests) 1153ms
✓ src/components/ui/file-upload.test.tsx (15 tests) 1339ms
✓ FileUpload Component > opens file dialog when button is clicked 315ms
stdout | src/components/ErrorBoundary.test.tsx > ErrorBoundary > should catch errors and display error UI
[ERROR] [ErrorBoundary] React error caught {"component":"ErrorBoundary","errorType":"Error","errorMessage":"Test error","stack":"Error: Test error\n at ThrowError (/home/senke/git/talas/veza/apps/web/src/components/ErrorBoundary.test.tsx:8:11)\n at renderWithHooks (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:15486:18)\n at mountIndeterminateComponent (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:20103:13)\n at beginWork (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:21626:16)\n at beginWork$1 (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:27465:14)\n at performUnitOfWork (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26599:12)\n at workLoopSync (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26505:5)\n at renderRootSync (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26473:7)\n at recoverFromConcurrentError (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:25889:20)\n at performConcurrentWorkOnRoot (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:25789:22)","componentStack":"\n at ThrowError (/home/senke/git/talas/veza/apps/web/src/components/ErrorBoundary.test.tsx:10:23)\n at ErrorBoundary (/home/senke/git/talas/veza/apps/web/src/components/ErrorBoundary.tsx:16:5)","url":"http://localhost:3000/","userAgent":"Mozilla/5.0 (linux) AppleWebKit/537.36 (KHTML, like Gecko) jsdom/24.1.3","timestamp":"2026-02-13T18:45:38.270Z"}
stdout | src/components/ErrorBoundary.test.tsx > ErrorBoundary > should display retry button
[ERROR] [ErrorBoundary] React error caught {"component":"ErrorBoundary","errorType":"Error","errorMessage":"Test error","stack":"Error: Test error\n at ThrowError (/home/senke/git/talas/veza/apps/web/src/components/ErrorBoundary.test.tsx:8:11)\n at renderWithHooks (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:15486:18)\n at mountIndeterminateComponent (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:20103:13)\n at beginWork (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:21626:16)\n at beginWork$1 (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:27465:14)\n at performUnitOfWork (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26599:12)\n at workLoopSync (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26505:5)\n at renderRootSync (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26473:7)\n at recoverFromConcurrentError (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:25889:20)\n at performConcurrentWorkOnRoot (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:25789:22)","componentStack":"\n at ThrowError (/home/senke/git/talas/veza/apps/web/src/components/ErrorBoundary.test.tsx:10:23)\n at ErrorBoundary (/home/senke/git/talas/veza/apps/web/src/components/ErrorBoundary.tsx:16:5)","url":"http://localhost:3000/","userAgent":"Mozilla/5.0 (linux) AppleWebKit/537.36 (KHTML, like Gecko) jsdom/24.1.3","timestamp":"2026-02-13T18:45:38.485Z"}
✓ src/components/ui/slider.test.tsx (7 tests) 601ms
✓ Slider Component > renders slider 343ms
stdout | src/components/ErrorBoundary.test.tsx > ErrorBoundary > should display home button
[ERROR] [ErrorBoundary] React error caught {"component":"ErrorBoundary","errorType":"Error","errorMessage":"Test error","stack":"Error: Test error\n at ThrowError (/home/senke/git/talas/veza/apps/web/src/components/ErrorBoundary.test.tsx:8:11)\n at renderWithHooks (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:15486:18)\n at mountIndeterminateComponent (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:20103:13)\n at beginWork (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:21626:16)\n at beginWork$1 (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:27465:14)\n at performUnitOfWork (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26599:12)\n at workLoopSync (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26505:5)\n at renderRootSync (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26473:7)\n at recoverFromConcurrentError (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:25889:20)\n at performConcurrentWorkOnRoot (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:25789:22)","componentStack":"\n at ThrowError (/home/senke/git/talas/veza/apps/web/src/components/ErrorBoundary.test.tsx:10:23)\n at ErrorBoundary (/home/senke/git/talas/veza/apps/web/src/components/ErrorBoundary.tsx:16:5)","url":"http://localhost:3000/","userAgent":"Mozilla/5.0 (linux) AppleWebKit/537.36 (KHTML, like Gecko) jsdom/24.1.3","timestamp":"2026-02-13T18:45:38.644Z"}
stdout | src/components/ErrorBoundary.test.tsx > ErrorBoundary > should reset error state when retry button is clicked
[ERROR] [ErrorBoundary] React error caught {"component":"ErrorBoundary","errorType":"Error","errorMessage":"Test error","stack":"Error: Test error\n at ThrowError (/home/senke/git/talas/veza/apps/web/src/components/ErrorBoundary.test.tsx:8:11)\n at renderWithHooks (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:15486:18)\n at mountIndeterminateComponent (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:20103:13)\n at beginWork (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:21626:16)\n at beginWork$1 (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:27465:14)\n at performUnitOfWork (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26599:12)\n at workLoopSync (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26505:5)\n at renderRootSync (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26473:7)\n at recoverFromConcurrentError (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:25889:20)\n at performConcurrentWorkOnRoot (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:25789:22)","componentStack":"\n at ThrowError (/home/senke/git/talas/veza/apps/web/src/components/ErrorBoundary.test.tsx:10:23)\n at ErrorBoundary (/home/senke/git/talas/veza/apps/web/src/components/ErrorBoundary.tsx:16:5)","url":"http://localhost:3000/","userAgent":"Mozilla/5.0 (linux) AppleWebKit/537.36 (KHTML, like Gecko) jsdom/24.1.3","timestamp":"2026-02-13T18:45:38.754Z"}
stdout | src/components/ErrorBoundary.test.tsx > ErrorBoundary > should use custom fallback when provided
[ERROR] [ErrorBoundary] React error caught {"component":"ErrorBoundary","errorType":"Error","errorMessage":"Test error","stack":"Error: Test error\n at ThrowError (/home/senke/git/talas/veza/apps/web/src/components/ErrorBoundary.test.tsx:8:11)\n at renderWithHooks (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:15486:18)\n at mountIndeterminateComponent (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:20103:13)\n at beginWork (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:21626:16)\n at beginWork$1 (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:27465:14)\n at performUnitOfWork (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26599:12)\n at workLoopSync (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26505:5)\n at renderRootSync (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26473:7)\n at recoverFromConcurrentError (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:25889:20)\n at performConcurrentWorkOnRoot (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:25789:22)","componentStack":"\n at ThrowError (/home/senke/git/talas/veza/apps/web/src/components/ErrorBoundary.test.tsx:10:23)\n at ErrorBoundary (/home/senke/git/talas/veza/apps/web/src/components/ErrorBoundary.tsx:16:5)","url":"http://localhost:3000/","userAgent":"Mozilla/5.0 (linux) AppleWebKit/537.36 (KHTML, like Gecko) jsdom/24.1.3","timestamp":"2026-02-13T18:45:38.827Z"}
stdout | src/components/ErrorBoundary.test.tsx > ErrorBoundary > should log error to console
[ERROR] [ErrorBoundary] React error caught {"component":"ErrorBoundary","errorType":"Error","errorMessage":"Test error","stack":"Error: Test error\n at ThrowError (/home/senke/git/talas/veza/apps/web/src/components/ErrorBoundary.test.tsx:8:11)\n at renderWithHooks (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:15486:18)\n at mountIndeterminateComponent (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:20103:13)\n at beginWork (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:21626:16)\n at beginWork$1 (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:27465:14)\n at performUnitOfWork (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26599:12)\n at workLoopSync (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26505:5)\n at renderRootSync (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26473:7)\n at recoverFromConcurrentError (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:25889:20)\n at performConcurrentWorkOnRoot (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:25789:22)","componentStack":"\n at ThrowError (/home/senke/git/talas/veza/apps/web/src/components/ErrorBoundary.test.tsx:10:23)\n at ErrorBoundary (/home/senke/git/talas/veza/apps/web/src/components/ErrorBoundary.tsx:16:5)","url":"http://localhost:3000/","userAgent":"Mozilla/5.0 (linux) AppleWebKit/537.36 (KHTML, like Gecko) jsdom/24.1.3","timestamp":"2026-02-13T18:45:38.857Z"}
stdout | src/components/ErrorBoundary.test.tsx > ErrorBoundary > should have correct state structure
[ERROR] [ErrorBoundary] React error caught {"component":"ErrorBoundary","errorType":"Error","errorMessage":"Test error","stack":"Error: Test error\n at ThrowError (/home/senke/git/talas/veza/apps/web/src/components/ErrorBoundary.test.tsx:8:11)\n at renderWithHooks (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:15486:18)\n at mountIndeterminateComponent (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:20103:13)\n at beginWork (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:21626:16)\n at beginWork$1 (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:27465:14)\n at performUnitOfWork (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26599:12)\n at workLoopSync (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26505:5)\n at renderRootSync (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26473:7)\n at recoverFromConcurrentError (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:25889:20)\n at performConcurrentWorkOnRoot (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:25789:22)","componentStack":"\n at ThrowError (/home/senke/git/talas/veza/apps/web/src/components/ErrorBoundary.test.tsx:10:23)\n at ErrorBoundary (/home/senke/git/talas/veza/apps/web/src/components/ErrorBoundary.tsx:16:5)","url":"http://localhost:3000/","userAgent":"Mozilla/5.0 (linux) AppleWebKit/537.36 (KHTML, like Gecko) jsdom/24.1.3","timestamp":"2026-02-13T18:45:38.891Z"}
✓ src/components/ErrorBoundary.test.tsx (8 tests) 774ms
✓ src/features/player/components/PlayerError.test.tsx (21 tests) 1071ms
✓ src/features/auth/components/AuthInput.test.tsx (24 tests) 934ms
✓ src/features/auth/components/AuthFormField.test.tsx (9 tests) 314ms
✓ src/features/tracks/components/ShareDialog.test.tsx (12 tests) 1135ms
✓ ShareDialog > should show check icon after copying 308ms
✓ src/features/playlists/components/PlaylistActions.test.tsx (9 tests) 999ms
✓ src/features/player/components/VolumeControl.test.tsx (21 tests) 960ms
✓ VolumeControl > should render volume control 361ms
✓ src/features/playlists/components/PlaylistTrackItem.test.tsx (9 tests) 846ms
✓ PlaylistTrackItem > should call onTrackClick when item is clicked 362ms
✓ src/router/index.test.tsx (13 tests) 320ms
✓ src/components/ui/table.test.tsx (6 tests) 462ms
✓ src/features/playlists/components/SharePlaylistModal.test.tsx (4 tests) 571ms
✓ SharePlaylistModal > should call onClose when Close is clicked 327ms
✓ src/features/tracks/components/TrackSearchFilters.test.tsx (5 tests) 800ms
✓ TrackSearchFilters > should show advanced filters when toggle is clicked 417ms
✓ src/features/player/components/ProgressBar.test.tsx (16 tests) 790ms
✓ ProgressBar > should render progress bar 310ms
✓ src/features/tracks/components/TrackCard.test.tsx (27 tests) 1272ms
✓ TrackCard > should call onPlay when play button is clicked 370ms
✓ src/features/player/components/RepeatShuffleButtons.test.tsx (14 tests) 848ms
✓ src/features/tracks/hooks/useTrackList.test.ts (33 tests) 768ms
✓ src/components/ui/accordion/Accordion.test.tsx (5 tests) 180ms
✓ src/components/ui/tabs.test.tsx (6 tests) 217ms
✓ src/components/ui/button-loading.test.tsx (7 tests) 304ms
✓ src/components/ui/LoadingState.test.tsx (13 tests) 503ms
✓ src/components/charts/Chart.test.tsx (23 tests) 527ms
✓ src/components/data/List.test.tsx (18 tests) 456ms
✓ src/features/playlists/components/CollaboratorList.test.tsx (6 tests) 546ms
✓ src/features/auth/components/LoginForm.test.tsx (6 tests) 668ms
✓ src/features/auth/components/PasswordStrengthIndicator.test.tsx (13 tests) 583ms
✓ src/features/playlists/components/PlaylistHeader.test.tsx (15 tests) 744ms
✓ src/components/ui/WaveformVisualizer.test.tsx (6 tests) 421ms
✓ src/context/ToastContext.test.tsx (5 tests) 361ms
✓ src/features/tracks/components/TrackListEmpty.test.tsx (27 tests) 708ms
✓ src/components/ui/tooltip.test.tsx (22 tests) 622ms
✓ src/features/player/services/playerService.test.ts (45 tests) 137ms
✓ src/features/player/store/playerStore.test.ts (32 tests) 304ms
✓ src/features/auth/components/AuthButton.test.tsx (11 tests) 788ms
✓ AuthButton > should render button with children 377ms
✓ src/components/ui/alert.test.tsx (10 tests) 607ms
✓ src/features/player/components/TrackInfo.test.tsx (18 tests) 269ms
✓ src/features/tracks/components/TrackListContainer.test.tsx (8 tests) 600ms
✓ TrackListContainer > should render track list with tracks 373ms
✓ src/features/auth/components/AuthLayout.test.tsx (11 tests) 603ms
✓ src/features/chat/components/ChatMessages.test.tsx (8 tests) 556ms
✓ src/components/ui/progress.test.tsx (9 tests) 305ms
✓ src/components/data/Timeline.test.tsx (19 tests) 588ms
✓ src/features/playlists/components/PlaylistRecommendations.test.tsx (9 tests) 534ms
✓ src/components/feedback/Progress.test.tsx (22 tests) 973ms
✓ Progress Component > Linear variant > renders linear progress bar 379ms
✓ src/features/player/components/PlayPauseButton.test.tsx (13 tests) 1115ms
✓ PlayPauseButton > should render play button when not playing 351ms
stdout | src/features/tracks/components/UploadQuota.test.tsx > UploadQuota > should display error message when API call fails
[ERROR] Failed to load quota: {"error":{"code":"SERVER","retryable":false,"name":"TrackServiceError"}}
✓ src/features/tracks/components/UploadQuota.test.tsx (11 tests) 990ms
✓ UploadQuota > should display tracks quota with progress bar 317ms
✓ src/features/player/components/NextPreviousButtons.test.tsx (11 tests) 2310ms
✓ NextPreviousButtons > should call onPrevious when previous button is clicked 1287ms
✓ src/hooks/useGlobalKeyboardShortcuts.test.ts (3 tests) 415ms
✓ src/features/streaming/hooks/useHLSStream.test.ts (9 tests) 920ms
✓ src/components/ui/input.test.tsx (10 tests) 634ms
✓ src/features/chat/components/ChatInput.test.tsx (6 tests) 799ms
✓ ChatInput Component > renders input and send button 474ms
✓ src/features/tracks/components/TrackListSelectionActions.test.tsx (12 tests) 1973ms
✓ TrackListSelectionActions > should call onPlay when play button is clicked 867ms
✓ src/components/ui/badge.test.tsx (21 tests) 526ms
✓ src/components/forms/PasswordStrengthIndicator.test.tsx (14 tests) 1005ms
✓ PasswordStrengthIndicator > should display all validation rules 488ms
✓ src/features/playlists/hooks/usePlaylistTrack.test.tsx (6 tests) 916ms
✓ useAddTrackToPlaylist > should add a track to playlist successfully 520ms
✓ src/services/sessionService.test.ts (5 tests) 690ms
✓ sessionService > getSessions > should return list of sessions 642ms
✓ src/components/ui/ErrorDisplay.test.tsx (11 tests) 1079ms
✓ ErrorDisplay > should render with a string error 665ms
✓ src/features/player/components/TimeDisplay.test.tsx (13 tests) 623ms
✓ TimeDisplay > should render time display 418ms
✓ src/components/ui/modal.test.tsx (16 tests) 2275ms
✓ Modal Component > renders nothing when open is false 326ms
✓ Modal Component > renders modal when open is true 393ms
✓ Modal Component > displays title when provided 599ms
stdout | src/features/playlists/components/PlaylistErrorBoundary.test.tsx > PlaylistErrorBoundary > should render error UI when an error occurs
[ERROR] PlaylistErrorBoundary caught an error {"error":"Test error","stack":"Error: Test error\n at ThrowError (/home/senke/git/talas/veza/apps/web/src/features/playlists/components/PlaylistErrorBoundary.test.tsx:14:11)\n at renderWithHooks (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:15486:18)\n at mountIndeterminateComponent (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:20103:13)\n at beginWork (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:21626:16)\n at beginWork$1 (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:27465:14)\n at performUnitOfWork (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26599:12)\n at workLoopSync (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26505:5)\n at renderRootSync (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26473:7)\n at recoverFromConcurrentError (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:25889:20)\n at performConcurrentWorkOnRoot (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:25789:22)","componentStack":"\n at ThrowError (/home/senke/git/talas/veza/apps/web/src/features/playlists/components/PlaylistErrorBoundary.test.tsx:10:23)\n at PlaylistErrorBoundary (/home/senke/git/talas/veza/apps/web/src/features/playlists/components/PlaylistErrorBoundary.tsx:16:5)\n at Router (/home/senke/git/talas/veza/node_modules/react-router/dist/umd/react-router.development.js:1207:17)\n at BrowserRouter (/home/senke/git/talas/veza/node_modules/react-router-dom/dist/umd/react-router-dom.development.js:695:7)"}
stdout | src/features/playlists/components/PlaylistErrorBoundary.test.tsx > PlaylistErrorBoundary > should call onError callback when error occurs
[ERROR] PlaylistErrorBoundary caught an error {"error":"Test error","stack":"Error: Test error\n at ThrowError (/home/senke/git/talas/veza/apps/web/src/features/playlists/components/PlaylistErrorBoundary.test.tsx:14:11)\n at renderWithHooks (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:15486:18)\n at mountIndeterminateComponent (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:20103:13)\n at beginWork (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:21626:16)\n at beginWork$1 (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:27465:14)\n at performUnitOfWork (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26599:12)\n at workLoopSync (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26505:5)\n at renderRootSync (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26473:7)\n at recoverFromConcurrentError (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:25889:20)\n at performConcurrentWorkOnRoot (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:25789:22)","componentStack":"\n at ThrowError (/home/senke/git/talas/veza/apps/web/src/features/playlists/components/PlaylistErrorBoundary.test.tsx:10:23)\n at PlaylistErrorBoundary (/home/senke/git/talas/veza/apps/web/src/features/playlists/components/PlaylistErrorBoundary.tsx:16:5)\n at Router (/home/senke/git/talas/veza/node_modules/react-router/dist/umd/react-router.development.js:1207:17)\n at BrowserRouter (/home/senke/git/talas/veza/node_modules/react-router-dom/dist/umd/react-router-dom.development.js:695:7)"}
✓ src/components/feedback/Alert.test.tsx (19 tests) 1302ms
✓ Alert Component > Rendering > renders alert with children 470ms
✓ Alert Component > Dismissible > calls onClose when close button is clicked 369ms
✓ src/components/ui/Toast.test.tsx (8 tests) 1374ms
✓ Toast Component > renders toast with message 369ms
✓ Toast Component > calls onClose when close button is clicked 868ms
stdout | src/features/playlists/components/PlaylistErrorBoundary.test.tsx > PlaylistErrorBoundary > should reset error state when reset button is clicked
[ERROR] PlaylistErrorBoundary caught an error {"error":"Test error","stack":"Error: Test error\n at ThrowError (/home/senke/git/talas/veza/apps/web/src/features/playlists/components/PlaylistErrorBoundary.test.tsx:14:11)\n at renderWithHooks (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:15486:18)\n at mountIndeterminateComponent (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:20103:13)\n at beginWork (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:21626:16)\n at beginWork$1 (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:27465:14)\n at performUnitOfWork (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26599:12)\n at workLoopSync (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26505:5)\n at renderRootSync (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26473:7)\n at recoverFromConcurrentError (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:25889:20)\n at performConcurrentWorkOnRoot (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:25789:22)","componentStack":"\n at ThrowError (/home/senke/git/talas/veza/apps/web/src/features/playlists/components/PlaylistErrorBoundary.test.tsx:10:23)\n at PlaylistErrorBoundary (/home/senke/git/talas/veza/apps/web/src/features/playlists/components/PlaylistErrorBoundary.tsx:16:5)\n at Router (/home/senke/git/talas/veza/node_modules/react-router/dist/umd/react-router.development.js:1207:17)\n at BrowserRouter (/home/senke/git/talas/veza/node_modules/react-router-dom/dist/umd/react-router-dom.development.js:695:7)"}
[ERROR] PlaylistErrorBoundary caught an error {"error":"Test error","stack":"Error: Test error\n at ThrowError (/home/senke/git/talas/veza/apps/web/src/features/playlists/components/PlaylistErrorBoundary.test.tsx:14:11)\n at renderWithHooks (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:15486:18)\n at mountIndeterminateComponent (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:20103:13)\n at beginWork (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:21626:16)\n at beginWork$1 (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:27465:14)\n at performUnitOfWork (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26599:12)\n at workLoopSync (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26505:5)\n at renderRootSync (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26473:7)\n at recoverFromConcurrentError (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:25889:20)\n at performSyncWorkOnRoot (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26135:20)","componentStack":"\n at ThrowError (/home/senke/git/talas/veza/apps/web/src/features/playlists/components/PlaylistErrorBoundary.test.tsx:10:23)\n at PlaylistErrorBoundary (/home/senke/git/talas/veza/apps/web/src/features/playlists/components/PlaylistErrorBoundary.tsx:16:5)\n at Router (/home/senke/git/talas/veza/node_modules/react-router/dist/umd/react-router.development.js:1207:17)\n at BrowserRouter (/home/senke/git/talas/veza/node_modules/react-router-dom/dist/umd/react-router-dom.development.js:695:7)"}
stdout | src/features/playlists/components/PlaylistErrorBoundary.test.tsx > PlaylistErrorBoundary > should render custom fallback when provided
[ERROR] PlaylistErrorBoundary caught an error {"error":"Test error","stack":"Error: Test error\n at ThrowError (/home/senke/git/talas/veza/apps/web/src/features/playlists/components/PlaylistErrorBoundary.test.tsx:14:11)\n at renderWithHooks (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:15486:18)\n at mountIndeterminateComponent (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:20103:13)\n at beginWork (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:21626:16)\n at beginWork$1 (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:27465:14)\n at performUnitOfWork (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26599:12)\n at workLoopSync (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26505:5)\n at renderRootSync (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26473:7)\n at recoverFromConcurrentError (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:25889:20)\n at performConcurrentWorkOnRoot (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:25789:22)","componentStack":"\n at ThrowError (/home/senke/git/talas/veza/apps/web/src/features/playlists/components/PlaylistErrorBoundary.test.tsx:10:23)\n at PlaylistErrorBoundary (/home/senke/git/talas/veza/apps/web/src/features/playlists/components/PlaylistErrorBoundary.tsx:16:5)\n at Router (/home/senke/git/talas/veza/node_modules/react-router/dist/umd/react-router.development.js:1207:17)\n at BrowserRouter (/home/senke/git/talas/veza/node_modules/react-router-dom/dist/umd/react-router-dom.development.js:695:7)"}
stdout | src/features/playlists/components/PlaylistErrorBoundary.test.tsx > PlaylistErrorBoundary > should display error message when available
[ERROR] PlaylistErrorBoundary caught an error {"error":"Test error","stack":"Error: Test error\n at ThrowError (/home/senke/git/talas/veza/apps/web/src/features/playlists/components/PlaylistErrorBoundary.test.tsx:14:11)\n at renderWithHooks (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:15486:18)\n at mountIndeterminateComponent (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:20103:13)\n at beginWork (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:21626:16)\n at beginWork$1 (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:27465:14)\n at performUnitOfWork (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26599:12)\n at workLoopSync (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26505:5)\n at renderRootSync (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26473:7)\n at recoverFromConcurrentError (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:25889:20)\n at performConcurrentWorkOnRoot (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:25789:22)","componentStack":"\n at ThrowError (/home/senke/git/talas/veza/apps/web/src/features/playlists/components/PlaylistErrorBoundary.test.tsx:10:23)\n at PlaylistErrorBoundary (/home/senke/git/talas/veza/apps/web/src/features/playlists/components/PlaylistErrorBoundary.tsx:16:5)\n at Router (/home/senke/git/talas/veza/node_modules/react-router/dist/umd/react-router.development.js:1207:17)\n at BrowserRouter (/home/senke/git/talas/veza/node_modules/react-router-dom/dist/umd/react-router-dom.development.js:695:7)"}
✓ src/features/playlists/components/PlaylistErrorBoundary.test.tsx (6 tests) 1950ms
✓ PlaylistErrorBoundary > should render error UI when an error occurs 375ms
✓ PlaylistErrorBoundary > should reset error state when reset button is clicked 883ms
✓ src/context/AudioContext.test.tsx (12 tests) 449ms
✓ src/features/streaming/components/BitrateSelector.test.tsx (13 tests) 1803ms
✓ BitrateSelector > should render with current bitrate 812ms
✓ BitrateSelector > should call onBitrateChange when bitrate is selected 458ms
✓ src/features/player/components/PlayerLoading.test.tsx (13 tests) 986ms
✓ PlayerLoading > should render when isLoading is true 332ms
✓ src/features/playlists/components/PlaylistTrackList.test.tsx (10 tests) 1132ms
✓ PlaylistTrackList > should render tracks in order 367ms
✓ src/features/tracks/components/TrackStatsDisplay.test.tsx (13 tests) 2105ms
✓ TrackStatsDisplay > should render loading state initially 749ms
✓ TrackStatsDisplay > should display stats in horizontal layout 601ms
✓ TrackStatsDisplay > should display stats in vertical layout 329ms
✓ src/features/player/hooks/usePlayer.test.ts (17 tests) 322ms
✓ src/components/ui/switch.test.tsx (8 tests) 802ms
✓ Switch Component > renders switch 381ms
stdout | src/features/auth/components/UserProfile.test.tsx > UserProfile Component > should handle fetch errors gracefully
[ERROR] Failed to fetch sessions count {"message":"An unexpected error occurred"}
✓ src/components/ui/skeleton.test.tsx (11 tests) 582ms
✓ src/features/auth/components/UserProfile.test.tsx (5 tests) 337ms
✓ src/components/ui/HelpText.test.tsx (4 tests) 396ms
✓ src/components/ui/empty-state.test.tsx (6 tests) 492ms
✓ src/components/ui/ImageCropper.test.tsx (4 tests) 669ms
✓ ImageCropper Component > renders cropper with image 531ms
✓ src/features/auth/components/OAuthButton.test.tsx (6 tests) 1456ms
✓ OAuthButton > should call onClick when Google button is clicked 360ms
✓ OAuthButton > should have type="button" to prevent form submission 536ms
✓ src/features/playlists/hooks/usePlaylistNotifications.test.tsx (5 tests) 1584ms
✓ usePlaylistNotifications > should fetch playlist notifications 378ms
✓ usePlaylistNotifications > should mark all notifications as read 486ms
✓ src/features/auth/components/EmailVerificationBadge.test.tsx (4 tests) 564ms
✓ EmailVerificationBadge > should display verified badge when email is verified 504ms
✓ src/components/ui/radio-group.test.tsx (6 tests) 821ms
✓ RadioGroup Component > renders radio group 601ms
✓ src/features/playlists/components/PlaylistCard.test.tsx (7 tests) 768ms
✓ src/components/ui/button.test.tsx (10 tests) 1159ms
✓ Button Component > renders with default props 397ms
✓ Button Component > handles click events 385ms
✓ src/components/data/Grid.test.tsx (16 tests) 336ms
✓ src/utils/date.test.ts (33 tests) 849ms
✓ date utilities > formatDate > should format date in short format 354ms
✓ src/components/ui/AnimatedNumber.test.tsx (4 tests) 434ms
✓ AnimatedNumber > renders the value 336ms
stdout | src/features/streaming/hooks/useBitrateAdaptation.test.ts > useBitrateAdaptation > should handle errors during adaptation
[ERROR] Bitrate adaptation failed: {"error":{}}
stdout | src/features/streaming/hooks/useBitrateAdaptation.test.ts > useBitrateAdaptation > should handle non-Error exceptions
[ERROR] Bitrate adaptation failed: {"error":{}}
stdout | src/features/streaming/hooks/useBitrateAdaptation.test.ts > useBitrateAdaptation > should clear error when clearError is called
[ERROR] Bitrate adaptation failed: {"error":{}}
✓ src/features/streaming/hooks/useBitrateAdaptation.test.ts (12 tests) 959ms
✓ useBitrateAdaptation > should initialize with current bitrate 597ms
✓ src/test/components.test.tsx (14 tests) 1190ms
✓ UI Components > Button > should render with default props 309ms
✓ src/hooks/useLocalStorage.test.ts (4 tests) 146ms
✓ src/components/ui/collapsible.test.tsx (6 tests) 671ms
✓ Collapsible > renders trigger content 332ms
✓ src/features/tracks/components/TrackSearchResults.test.tsx (7 tests) 654ms
✓ src/features/auth/pages/OAuthCallbackPage.test.tsx (2 tests) 1076ms
✓ OAuthCallbackPage > should render loading message 973ms
✓ src/features/playlists/components/RemoveTrackButton.test.tsx (4 tests) 2153ms
✓ RemoveTrackButton > should render button with aria-label 1336ms
✓ RemoveTrackButton > should not call onRemove when disabled 418ms
✓ src/features/chat/components/ChatMessage.test.tsx (6 tests) 1500ms
✓ ChatMessageComponent > renders message content 1058ms
✓ src/components/ui/focus-trap.test.tsx (6 tests) 248ms
✓ src/components/navigation/Breadcrumbs.test.tsx (17 tests) 915ms
✓ Breadcrumbs Component > renders breadcrumbs with items 427ms
✓ src/components/ui/FAB.test.tsx (7 tests) 528ms
✓ FAB > renders children 386ms
✓ src/components/ui/textarea.test.tsx (6 tests) 674ms
✓ src/components/ui/checkbox.test.tsx (8 tests) 798ms
✓ Checkbox Component > renders checkbox 323ms
✓ src/utils/url.test.ts (45 tests) 213ms
✓ src/features/auth/routes.test.tsx (5 tests) 302ms
✓ src/components/ui/virtualized-list.test.tsx (4 tests) 330ms
✓ src/components/ui/scroll-area.test.tsx (4 tests) 228ms
✓ src/components/ui/DataList.test.tsx (7 tests) 391ms
✓ src/components/ui/LazyComponent.test.tsx (4 tests) 808ms
✓ LazyComponent > renders lazy component when loaded 445ms
✓ src/features/tracks/services/trackDownloadService.test.ts (9 tests) 238ms
✓ src/components/ui/card.test.tsx (13 tests) 941ms
✓ Card Component > renders Card component correctly 775ms
✓ src/components/ui/confirmation-dialog.test.tsx (8 tests) 1658ms
✓ ConfirmationDialog Component > calls onConfirm when confirm button is clicked 824ms
✓ src/features/auth/hooks/useOAuthCallback.test.tsx (3 tests) 264ms
✓ src/features/tracks/components/TrackListSkeleton.test.tsx (9 tests) 939ms
✓ TrackListSkeleton > should render skeleton loader 618ms
✓ src/features/tracks/services/commentService.test.ts (18 tests) 333ms
✓ src/features/auth/components/AuthErrorMessage.test.tsx (6 tests) 368ms
✓ src/features/playlists/components/PlaylistAnalytics.test.tsx (7 tests) 650ms
stdout | src/config/env.test.ts > Environment Variables > should parse environment variables correctly
[WARN] [Config] API is cross-origin: cookies will not be sent, login may fail or redirect in a loop. Use VITE_API_URL=/api/v1 so the Vite proxy is used (same origin). {"apiOrigin":"https://api.example.com","pageOrigin":"http://localhost:3000"}
✓ src/config/env.test.ts (6 tests) 326ms
✓ src/components/ui/label.test.tsx (5 tests) 643ms
✓ Label Component > renders label 342ms
✓ src/components/ui/dropdown-menu.test.tsx (8 tests) 955ms
✓ DropdownMenu Component > renders trigger and content 387ms
✓ src/hooks/useOnlineStatus.test.ts (6 tests) 418ms
✓ src/components/ui/ComingSoon.test.tsx (6 tests) 360ms
✓ src/features/settings/services/settingsService.test.ts (16 tests) 170ms
✓ src/hooks/useIntersectionObserver.test.ts (7 tests) 245ms
✓ src/components/ui/FormField.test.tsx (7 tests) 597ms
✓ FormField Component > renders label 492ms
✓ src/components/ui/optimized-image.test.tsx (5 tests) 315ms
✓ src/test/setup.test.tsx (3 tests) 118ms
✓ src/features/player/hooks/useKeyboardShortcuts.test.ts (19 tests) 327ms