veza/vitest_output.txt

3534 lines
254 KiB
Text
Raw Permalink Normal View History

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