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  
            
   Error   Une erreur inattendue s'est produite. Veuillez réessayer.    Retry      Show Details            Ignored nodes: comments, script, style    
            
   Error   Une erreur inattendue s'est produite. Veuillez réessayer.    Retry      Show Details             × SettingsPage > should handle save error 1068ms → expected "spy" to be called at least once Ignored nodes: comments, script, style    
   
  System Config      Manage your neural link and interface preferences. 

 
        Save Config  
                Global Preferences               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  
       
      V    Veza    Inscription   Créez votre compte 

      
   Nom d'utilisateur    
      Email     ... Ignored nodes: comments, script, style    
       
      V    Veza    Inscription   Créez votre compte 

      
   Nom d'utilisateur    
      Email    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  
       
      V    Veza    Inscription   Créez votre compte 

      
   Nom d'utilisateur    
      Email     ... Ignored nodes: comments, script, style    
       
      V    Veza    Inscription   Créez votre compte 

      
   Nom d'utilisateur    
      Email    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  
       
      V    Veza    Inscription   Créez votre compte 

             
  Inscription réussie ! 

  Un email de vérification a été envoyé à    test@example.com  

 
  Veuillez vérifier votre boîte mail et cliquer sur le lien de vérification. 

  Renvoyer l'email de vérification       Déjà un compte ? Se connecter       Ignored nodes: comments, script, style    
       
      V    Veza    Inscription   Créez votre compte 

             
  Inscription réussie ! 

  Un email de vérification a été envoyé à    test@example.com  

 
  Veuillez vérifier votre boîte mail et cliquer sur le lien de vérification. 

  Renvoyer l'email de vérification       Déjà un compte ? Se connecter        ✓ 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  Ce nom d'utilisateur est déjà pris 

 Ignored nodes: comments, script, style  Ce nom d'utilisateur est déjà pris  (If this is intentional, then use the `*AllBy*` variant of the query (like `queryAllByText`, `getAllByText`, or `findAllByText`)). Ignored nodes: comments, script, style  
       
      V    Veza    Inscription   Créez votre compte 

      
   Nom d'utilisateur    
  Ce nom d'utilisateur est déjà pris 

        
       
      V    Veza    Inscription   Créez votre compte 

      
   Nom d'utilisateur    
  Ce nom d'utilisateur est déjà pris 

     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