3534 lines
254 KiB
Text
3534 lines
254 KiB
Text
|
|
|
|||
|
|
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
|
|||
|
|
[36m<body>[39m
|
|||
|
|
[36m<div>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"container mx-auto px-4 py-8 flex items-center justify-center min-h-layout-page"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"flex flex-col rounded-lg text-card-foreground transition-[box-shadow,background-color,border-color] duration-[var(--sumi-duration-normal)] ease-out relative overflow-hidden bg-card border shadow-card hover:shadow-card-hover hover:bg-card/95 border-destructive/30 glass"[39m
|
|||
|
|
[33mdata-slot[39m=[32m"card"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"relative z-10 w-full h-full flex flex-col"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"p-4 pt-6"[39m
|
|||
|
|
[33mdata-slot[39m=[32m"card-content"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33maria-live[39m=[32m"polite"[39m
|
|||
|
|
[33mclass[39m=[32m"rounded-lg border flex shadow-card bg-destructive/10 border-destructive/30 text-destructive p-4 gap-4"[39m
|
|||
|
|
[33mrole[39m=[32m"alert"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"flex-shrink-0 pt-0.5"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<svg[39m
|
|||
|
|
[33mclass[39m=[32m"lucide lucide-alert-circle w-5 h-5 text-destructive"[39m
|
|||
|
|
[33mfill[39m=[32m"none"[39m
|
|||
|
|
[33mheight[39m=[32m"24"[39m
|
|||
|
|
[33mstroke[39m=[32m"currentColor"[39m
|
|||
|
|
[33mstroke-linecap[39m=[32m"round"[39m
|
|||
|
|
[33mstroke-linejoin[39m=[32m"round"[39m
|
|||
|
|
[33mstroke-width[39m=[32m"2"[39m
|
|||
|
|
[33mviewBox[39m=[32m"0 0 24 24"[39m
|
|||
|
|
[33mwidth[39m=[32m"24"[39m
|
|||
|
|
[33mxmlns[39m=[32m"http://www.w3.org/2000/svg"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<circle[39m
|
|||
|
|
[33mcx[39m=[32m"12"[39m
|
|||
|
|
[33mcy[39m=[32m"12"[39m
|
|||
|
|
[33mr[39m=[32m"10"[39m
|
|||
|
|
[36m/>[39m
|
|||
|
|
[36m<line[39m
|
|||
|
|
[33mx1[39m=[32m"12"[39m
|
|||
|
|
[33mx2[39m=[32m"12"[39m
|
|||
|
|
[33my1[39m=[32m"8"[39m
|
|||
|
|
[33my2[39m=[32m"12"[39m
|
|||
|
|
[36m/>[39m
|
|||
|
|
[36m<line[39m
|
|||
|
|
[33mx1[39m=[32m"12"[39m
|
|||
|
|
[33mx2[39m=[32m"12.01"[39m
|
|||
|
|
[33my1[39m=[32m"16"[39m
|
|||
|
|
[33my2[39m=[32m"16"[39m
|
|||
|
|
[36m/>[39m
|
|||
|
|
[36m</svg>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"flex-1 min-w-0"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"font-semibold mb-1 text-base"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[0mError[0m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"opacity-90 text-sm"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[0mUne erreur inattendue s'est produite. Veuillez réessayer.[0m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"mt-4 flex flex-wrap gap-2 items-center"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<button[39m
|
|||
|
|
[33mclass[39m=[32m"inline-flex items-center justify-center whitespace-nowrap rounded-full text-sm font-sans font-medium tracking-tight transition-[color,box-shadow,border-color,background-color] duration-[var(--sumi-duration-normal)] ease-out focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background focus-visible:shadow-[var(--sumi-shadow-glow)] disabled:pointer-events-none disabled:opacity-50 gap-2 border hover:border-border h-10 px-4 py-2 border-current text-current hover:bg-current/10 bg-transparent"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[0mRetry[0m
|
|||
|
|
[36m</button>[39m
|
|||
|
|
[36m<button[39m
|
|||
|
|
[33mclass[39m=[32m"inline-flex items-center justify-center whitespace-nowrap rounded-full text-sm font-sans font-medium tracking-tight transition-[color,box-shadow,border-color,background-color] duration-[var(--sumi-duration-normal)] ease-out focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background focus-visible:shadow-[var(--sumi-shadow-glow)] disabled:pointer-events-none disabled:opacity-50 gap-2 h-10 px-4 py-2 text-current hover:bg-current/10 hover:text-current"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<svg[39m
|
|||
|
|
[33mclass[39m=[32m"lucide lucide-chevron-down w-4 h-4 mr-1"[39m
|
|||
|
|
[33mfill[39m=[32m"none"[39m
|
|||
|
|
[33mheight[39m=[32m"24"[39m
|
|||
|
|
[33mstroke[39m=[32m"currentColor"[39m
|
|||
|
|
[33mstroke-linecap[39m=[32m"round"[39m
|
|||
|
|
[33mstroke-linejoin[39m=[32m"round"[39m
|
|||
|
|
[33mstroke-width[39m=[32m"2"[39m
|
|||
|
|
[33mviewBox[39m=[32m"0 0 24 24"[39m
|
|||
|
|
[33mwidth[39m=[32m"24"[39m
|
|||
|
|
[33mxmlns[39m=[32m"http://www.w3.org/2000/svg"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<path[39m
|
|||
|
|
[33md[39m=[32m"m6 9 6 6 6-6"[39m
|
|||
|
|
[36m/>[39m
|
|||
|
|
[36m</svg>[39m
|
|||
|
|
[0mShow Details[0m
|
|||
|
|
[36m</button>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"fixed z-50 flex flex-col gap-2 top-4 right-4"[39m
|
|||
|
|
[36m/>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m</body>[39m
|
|||
|
|
|
|||
|
|
Ignored nodes: comments, script, style
|
|||
|
|
[36m<html>[39m
|
|||
|
|
[36m<head />[39m
|
|||
|
|
[36m<body>[39m
|
|||
|
|
[36m<div>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"container mx-auto px-4 py-8 flex items-center justify-center min-h-layout-page"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"flex flex-col rounded-lg text-card-foreground transition-[box-shadow,background-color,border-color] duration-[var(--sumi-duration-normal)] ease-out relative overflow-hidden bg-card border shadow-card hover:shadow-card-hover hover:bg-card/95 border-destructive/30 glass"[39m
|
|||
|
|
[33mdata-slot[39m=[32m"card"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"relative z-10 w-full h-full flex flex-col"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"p-4 pt-6"[39m
|
|||
|
|
[33mdata-slot[39m=[32m"card-content"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33maria-live[39m=[32m"polite"[39m
|
|||
|
|
[33mclass[39m=[32m"rounded-lg border flex shadow-card bg-destructive/10 border-destructive/30 text-destructive p-4 gap-4"[39m
|
|||
|
|
[33mrole[39m=[32m"alert"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"flex-shrink-0 pt-0.5"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<svg[39m
|
|||
|
|
[33mclass[39m=[32m"lucide lucide-alert-circle w-5 h-5 text-destructive"[39m
|
|||
|
|
[33mfill[39m=[32m"none"[39m
|
|||
|
|
[33mheight[39m=[32m"24"[39m
|
|||
|
|
[33mstroke[39m=[32m"currentColor"[39m
|
|||
|
|
[33mstroke-linecap[39m=[32m"round"[39m
|
|||
|
|
[33mstroke-linejoin[39m=[32m"round"[39m
|
|||
|
|
[33mstroke-width[39m=[32m"2"[39m
|
|||
|
|
[33mviewBox[39m=[32m"0 0 24 24"[39m
|
|||
|
|
[33mwidth[39m=[32m"24"[39m
|
|||
|
|
[33mxmlns[39m=[32m"http://www.w3.org/2000/svg"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<circle[39m
|
|||
|
|
[33mcx[39m=[32m"12"[39m
|
|||
|
|
[33mcy[39m=[32m"12"[39m
|
|||
|
|
[33mr[39m=[32m"10"[39m
|
|||
|
|
[36m/>[39m
|
|||
|
|
[36m<line[39m
|
|||
|
|
[33mx1[39m=[32m"12"[39m
|
|||
|
|
[33mx2[39m=[32m"12"[39m
|
|||
|
|
[33my1[39m=[32m"8"[39m
|
|||
|
|
[33my2[39m=[32m"12"[39m
|
|||
|
|
[36m/>[39m
|
|||
|
|
[36m<line[39m
|
|||
|
|
[33mx1[39m=[32m"12"[39m
|
|||
|
|
[33mx2[39m=[32m"12.01"[39m
|
|||
|
|
[33my1[39m=[32m"16"[39m
|
|||
|
|
[33my2[39m=[32m"16"[39m
|
|||
|
|
[36m/>[39m
|
|||
|
|
[36m</svg>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"flex-1 min-w-0"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"font-semibold mb-1 text-base"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[0mError[0m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"opacity-90 text-sm"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[0mUne erreur inattendue s'est produite. Veuillez réessayer.[0m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"mt-4 flex flex-wrap gap-2 items-center"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<button[39m
|
|||
|
|
[33mclass[39m=[32m"inline-flex items-center justify-center whitespace-nowrap rounded-full text-sm font-sans font-medium tracking-tight transition-[color,box-shadow,border-color,background-color] duration-[var(--sumi-duration-normal)] ease-out focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background focus-visible:shadow-[var(--sumi-shadow-glow)] disabled:pointer-events-none disabled:opacity-50 gap-2 border hover:border-border h-10 px-4 py-2 border-current text-current hover:bg-current/10 bg-transparent"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[0mRetry[0m
|
|||
|
|
[36m</button>[39m
|
|||
|
|
[36m<button[39m
|
|||
|
|
[33mclass[39m=[32m"inline-flex items-center justify-center whitespace-nowrap rounded-full text-sm font-sans font-medium tracking-tight transition-[color,box-shadow,border-color,background-color] duration-[var(--sumi-duration-normal)] ease-out focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background focus-visible:shadow-[var(--sumi-shadow-glow)] disabled:pointer-events-none disabled:opacity-50 gap-2 h-10 px-4 py-2 text-current hover:bg-current/10 hover:text-current"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<svg[39m
|
|||
|
|
[33mclass[39m=[32m"lucide lucide-chevron-down w-4 h-4 mr-1"[39m
|
|||
|
|
[33mfill[39m=[32m"none"[39m
|
|||
|
|
[33mheight[39m=[32m"24"[39m
|
|||
|
|
[33mstroke[39m=[32m"currentColor"[39m
|
|||
|
|
[33mstroke-linecap[39m=[32m"round"[39m
|
|||
|
|
[33mstroke-linejoin[39m=[32m"round"[39m
|
|||
|
|
[33mstroke-width[39m=[32m"2"[39m
|
|||
|
|
[33mviewBox[39m=[32m"0 0 24 24"[39m
|
|||
|
|
[33mwidth[39m=[32m"24"[39m
|
|||
|
|
[33mxmlns[39m=[32m"http://www.w3.org/2000/svg"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<path[39m
|
|||
|
|
[33md[39m=[32m"m6 9 6 6 6-6"[39m
|
|||
|
|
[36m/>[39m
|
|||
|
|
[36m</svg>[39m
|
|||
|
|
[0mShow Details[0m
|
|||
|
|
[36m</button>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"fixed z-50 flex flex-col gap-2 top-4 right-4"[39m
|
|||
|
|
[36m/>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m</body>[39m
|
|||
|
|
[36m</html>[39m
|
|||
|
|
× SettingsPage > should handle save error 1068ms
|
|||
|
|
→ expected "spy" to be called at least once
|
|||
|
|
|
|||
|
|
Ignored nodes: comments, script, style
|
|||
|
|
[36m<html>[39m
|
|||
|
|
[36m<head />[39m
|
|||
|
|
[36m<body>[39m
|
|||
|
|
[36m<div>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"container mx-auto px-4 py-8 pb-24 max-w-5xl"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"mb-8 flex items-end justify-between"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<div>[39m
|
|||
|
|
[36m<h1[39m
|
|||
|
|
[33mclass[39m=[32m"text-display font-heading text-foreground mb-2"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[0mSystem Config[0m
|
|||
|
|
[36m</h1>[39m
|
|||
|
|
[36m<p[39m
|
|||
|
|
[33mclass[39m=[32m"text-muted-foreground flex items-center gap-2"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<svg[39m
|
|||
|
|
[33mclass[39m=[32m"lucide lucide-shield w-4 h-4 text-primary"[39m
|
|||
|
|
[33mfill[39m=[32m"none"[39m
|
|||
|
|
[33mheight[39m=[32m"24"[39m
|
|||
|
|
[33mstroke[39m=[32m"currentColor"[39m
|
|||
|
|
[33mstroke-linecap[39m=[32m"round"[39m
|
|||
|
|
[33mstroke-linejoin[39m=[32m"round"[39m
|
|||
|
|
[33mstroke-width[39m=[32m"2"[39m
|
|||
|
|
[33mviewBox[39m=[32m"0 0 24 24"[39m
|
|||
|
|
[33mwidth[39m=[32m"24"[39m
|
|||
|
|
[33mxmlns[39m=[32m"http://www.w3.org/2000/svg"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<path[39m
|
|||
|
|
[33md[39m=[32m"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10"[39m
|
|||
|
|
[36m/>[39m
|
|||
|
|
[36m</svg>[39m
|
|||
|
|
[0mManage your neural link and interface preferences.[0m
|
|||
|
|
[36m</p>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m<button[39m
|
|||
|
|
[33mclass[39m=[32m"inline-flex items-center justify-center whitespace-nowrap font-sans tracking-tight transition-[color,box-shadow,border-color,background-color] duration-[var(--sumi-duration-normal)] ease-out focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background focus-visible:shadow-[var(--sumi-shadow-glow)] disabled:pointer-events-none disabled:opacity-50 gap-2 bg-primary text-primary-foreground hover:bg-primary/90 border border-transparent font-semibold h-12 rounded-full px-8 text-base shadow-glow-cyan min-w-36"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<svg[39m
|
|||
|
|
[33mclass[39m=[32m"lucide lucide-save mr-2 h-4 w-4"[39m
|
|||
|
|
[33mfill[39m=[32m"none"[39m
|
|||
|
|
[33mheight[39m=[32m"24"[39m
|
|||
|
|
[33mstroke[39m=[32m"currentColor"[39m
|
|||
|
|
[33mstroke-linecap[39m=[32m"round"[39m
|
|||
|
|
[33mstroke-linejoin[39m=[32m"round"[39m
|
|||
|
|
[33mstroke-width[39m=[32m"2"[39m
|
|||
|
|
[33mviewBox[39m=[32m"0 0 24 24"[39m
|
|||
|
|
[33mwidth[39m=[32m"24"[39m
|
|||
|
|
[33mxmlns[39m=[32m"http://www.w3.org/2000/svg"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<path[39m
|
|||
|
|
[33md[39m=[32m"M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2z"[39m
|
|||
|
|
[36m/>[39m
|
|||
|
|
[36m<polyline[39m
|
|||
|
|
[33mpoints[39m=[32m"17 21 17 13 7 13 7 21"[39m
|
|||
|
|
[36m/>[39m
|
|||
|
|
[36m<polyline[39m
|
|||
|
|
[33mpoints[39m=[32m"7 3 7 8 15 8"[39m
|
|||
|
|
[36m/>[39m
|
|||
|
|
[36m</svg>[39m
|
|||
|
|
[0m Save Config[0m
|
|||
|
|
[36m</button>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"flex flex-col rounded-lg text-card-foreground transition-[box-shadow,background-color,border-color] duration-[var(--sumi-duration-normal)] ease-out relative dark:bg-black/20 border overflow-hidden border-border bg-card/80 backdrop-blur-xl"[39m
|
|||
|
|
[33mdata-slot[39m=[32m"card"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"relative z-10 w-full h-full flex flex-col"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"p-6 border-b border-border bg-muted/20 flex items-center gap-2"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<svg[39m
|
|||
|
|
[33mclass[39m=[32m"lucide lucide-sliders w-5 h-5 text-primary"[39m
|
|||
|
|
[33mfill[39m=[32m"none"[39m
|
|||
|
|
[33mheight[39m=[32m"24"[39m
|
|||
|
|
[33mstroke[39m=[32m"currentColor"[39m
|
|||
|
|
[33mstroke-linecap[39m=[32m"round"[39m
|
|||
|
|
[33mstroke-linejoin[39m=[32m"round"[39m
|
|||
|
|
[33mstroke-width[39m=[32m"2"[39m
|
|||
|
|
[33mviewBox[39m=[32m"0 0 24 24"[39m
|
|||
|
|
[33mwidth[39m=[32m"24"[39m
|
|||
|
|
[33mxmlns[39m=[32m"http://www.w3.org/2000/svg"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<line[39m
|
|||
|
|
[33mx1[39m=[32m"4"[39m
|
|||
|
|
[33mx2[39m=[32m"4"[39m
|
|||
|
|
[33my1[39m=[32m"21"[39m
|
|||
|
|
[33my2[39m=[32m"14"[39m
|
|||
|
|
[36m/>[39m
|
|||
|
|
[36m<line[39m
|
|||
|
|
[33mx1[39m=[32m"4"[39m
|
|||
|
|
[33mx2[39m=[32m"4"[39m
|
|||
|
|
[33my1[39m=[32m"10"[39m
|
|||
|
|
[33my2[39m=[32m"3"[39m
|
|||
|
|
[36m/>[39m
|
|||
|
|
[36m<line[39m
|
|||
|
|
[33mx1[39m=[32m"12"[39m
|
|||
|
|
[33mx2[39m=[32m"12"[39m
|
|||
|
|
[33my1[39m=[32m"21"[39m
|
|||
|
|
[33my2[39m=[32m"12"[39m
|
|||
|
|
[36m/>[39m
|
|||
|
|
[36m<line[39m
|
|||
|
|
[33mx1[39m=[32m"12"[39m
|
|||
|
|
[33mx2[39m=[32m"12"[39m
|
|||
|
|
[33my1[39m=[32m"8"[39m
|
|||
|
|
[33my2[39m=[32m"3"[39m
|
|||
|
|
[36m/>[39m
|
|||
|
|
[36m<line[39m
|
|||
|
|
[33mx1[39m=[32m"20"[39m
|
|||
|
|
[33mx2[39m=[32m"20"[39m
|
|||
|
|
[33my1[39m=[32m"21"[39m
|
|||
|
|
[33my2[39m=[32m"16"[39m
|
|||
|
|
[36m/>[39m
|
|||
|
|
[36m<line[39m
|
|||
|
|
[33mx1[39m=[32m"20"[39m
|
|||
|
|
[33mx2[39m=[32m"20"[39m
|
|||
|
|
[33my1[39m=[32m"12"[39m
|
|||
|
|
[33my2[39m=[32m"3"[39m
|
|||
|
|
[36m/>[39m
|
|||
|
|
[36m<line[39m
|
|||
|
|
[33mx1[39m=[32m"2"[39m
|
|||
|
|
[33mx2[39m=[32m"6"[39m
|
|||
|
|
[33my1[39m=[32m"14"[39m
|
|||
|
|
[33my2[39m=[32m"14"[39m
|
|||
|
|
[36m/>[39m
|
|||
|
|
[36m<line[39m
|
|||
|
|
[33mx1[39m=[32m"10"[39m
|
|||
|
|
[33mx2[39m=[32m"14"[39m
|
|||
|
|
[33my1[39m=[32m"8"[39m
|
|||
|
|
[33my2[39m=[32m"8"[39m
|
|||
|
|
[36m/>[39m
|
|||
|
|
[36m<line[39m
|
|||
|
|
[33mx1[39m=[32m"18"[39m
|
|||
|
|
[33mx2[39m=[32m"22"[39m
|
|||
|
|
[33my1[39m=[32m"16"[39m
|
|||
|
|
[33my2[39m=[32m"16"[39m
|
|||
|
|
[36m/>[39m
|
|||
|
|
[36m</svg>[39m
|
|||
|
|
[36m<h2[39m
|
|||
|
|
[33mclass[39m=[32m"font-bold text-lg"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[0mGlobal Preferences[0m
|
|||
|
|
[36m</h2>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"p-6"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mdata-testid[39m=[32m"settings-tabs"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<button>[39m
|
|||
|
|
[0mChange Language[0m
|
|||
|
|
[36m</button>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"fixed z-50 flex flex-col gap-2 top-4 right-4"[39m
|
|||
|
|
[36m/>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m</body>[39m
|
|||
|
|
[36m</html>[39m
|
|||
|
|
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
|
|||
|
|
[36m<body>[39m
|
|||
|
|
[36m<div>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33maria-label[39m=[32m"Page d'authentification"[39m
|
|||
|
|
[33mclass[39m=[32m"min-h-screen flex items-center justify-center bg-background py-12 px-4 sm:px-6 lg:px-8 relative overflow-hidden"[39m
|
|||
|
|
[33mrole[39m=[32m"main"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"fixed inset-0 bg-background"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"absolute inset-0 bg-gradient-to-br from-primary/5 via-transparent to-primary/5"[39m
|
|||
|
|
[36m/>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"absolute top-1/4 left-1/4 w-96 h-96 bg-primary/10 rounded-full blur-3xl animate-pulse"[39m
|
|||
|
|
[36m/>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"absolute bottom-1/4 right-1/4 w-64 h-64 bg-primary/5 rounded-full blur-3xl animate-pulse"[39m
|
|||
|
|
[33mstyle[39m=[32m"animation-delay: 2s;"[39m
|
|||
|
|
[36m/>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"absolute top-2/3 left-1/2 w-72 h-72 bg-secondary/5 rounded-full blur-3xl animate-pulse"[39m
|
|||
|
|
[33mstyle[39m=[32m"animation-delay: 4s;"[39m
|
|||
|
|
[36m/>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"max-w-md w-full mx-auto space-y-8 relative z-10 animate-auth-enter"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<header[39m
|
|||
|
|
[33mclass[39m=[32m"text-center"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"flex items-center justify-center mb-6"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33maria-hidden[39m=[32m"true"[39m
|
|||
|
|
[33mclass[39m=[32m"h-12 w-12 rounded-xl bg-primary flex items-center justify-center shadow-sm"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<span[39m
|
|||
|
|
[33mclass[39m=[32m"text-primary-foreground font-bold text-2xl"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[0mV[0m
|
|||
|
|
[36m</span>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m<span[39m
|
|||
|
|
[33mclass[39m=[32m"ml-3 font-bold text-3xl text-foreground"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[0mVeza[0m
|
|||
|
|
[36m</span>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m<h1[39m
|
|||
|
|
[33mclass[39m=[32m"text-3xl font-bold text-foreground mb-2"[39m
|
|||
|
|
[33mid[39m=[32m"auth-form-title"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[0mInscription[0m
|
|||
|
|
[36m</h1>[39m
|
|||
|
|
[36m<p[39m
|
|||
|
|
[33mclass[39m=[32m"text-sm text-muted-foreground"[39m
|
|||
|
|
[33mrole[39m=[32m"doc-subtitle"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[0mCréez votre compte[0m
|
|||
|
|
[36m</p>[39m
|
|||
|
|
[36m</header>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33maria-labelledby[39m=[32m"auth-form-title"[39m
|
|||
|
|
[33mclass[39m=[32m"flex flex-col rounded-lg text-card-foreground relative overflow-hidden border hover:bg-card/90 hover:border-border hover:shadow-card-hover transition-all duration-[var(--sumi-duration-slow)] ease-in-out p-8 w-full bg-card/80 backdrop-blur-md border-border/50 shadow-2xl"[39m
|
|||
|
|
[33mdata-slot[39m=[32m"card"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"relative z-10 w-full h-full flex flex-col"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<form[39m
|
|||
|
|
[33maria-label[39m=[32m"Formulaire d'inscription"[39m
|
|||
|
|
[33mclass[39m=[32m"space-y-4"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"space-y-4"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<div>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"w-full"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<label[39m
|
|||
|
|
[33mclass[39m=[32m"block text-sm font-medium text-foreground mb-1"[39m
|
|||
|
|
[33mfor[39m=[32m"register-username"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[0mNom d'utilisateur[0m
|
|||
|
|
[36m</label>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"relative"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<input[39m
|
|||
|
|
[33maria-invalid[39m=[32m"false"[39m
|
|||
|
|
[33maria-required[39m=[32m"true"[39m
|
|||
|
|
[33mautocomplete[39m=[32m"username"[39m
|
|||
|
|
[33mclass[39m=[32m"w-full px-4 py-2.5 border rounded-xl focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/20 transition-all duration-[var(--sumi-duration-slow)] ease-in-out focus-visible:shadow-[0_0_0_3px_oklch(var(--primary)/0.15),0_0_12px_oklch(var(--primary)/0.1)] bg-card border-border text-foreground placeholder:text-muted-foreground focus-visible:border-primary"[39m
|
|||
|
|
[33mid[39m=[32m"register-username"[39m
|
|||
|
|
[33mrequired[39m=[32m""[39m
|
|||
|
|
[33mtype[39m=[32m"text"[39m
|
|||
|
|
[33mvalue[39m=[32m"testuser"[39m
|
|||
|
|
[36m/>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33maria-atomic[39m=[32m"true"[39m
|
|||
|
|
[33maria-live[39m=[32m"polite"[39m
|
|||
|
|
[33mclass[39m=[32m"mt-1.5"[39m
|
|||
|
|
[36m/>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"w-full"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<label[39m
|
|||
|
|
[33mclass[39m=[32m"block text-sm font-medium text-foreground mb-1"[39m
|
|||
|
|
[33mfor[39m=[32m"register-email"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[0mEmail[0m
|
|||
|
|
[36m</label>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"relative"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<input[39m
|
|||
|
|
[33maria-invalid[39m=[32m"false"[39m
|
|||
|
|
[33maria-required[39m=[32m"true"[39m
|
|||
|
|
[33mautocomplete[39m=[32m"email"[39m
|
|||
|
|
[33mclass[39m=[32m"w-full px-4 py-2.5 border rounded-xl focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/20 transition-all duration-[var(--sumi-duration-slow)] ease-in-out focus-visible:shadow-[0_0_0_3px_oklch(var(--primary)/0.15),0_0_12px_oklch(var(--primary)/0.1)] bg-card border-border text-foreground placeholder:text-muted-foreground focus-visible:border-primary"[39m
|
|||
|
|
[33mid[39m=[32m"register-email"[39m
|
|||
|
|
[33mrequired[39m=[32m""[39m
|
|||
|
|
[33mtype[39m=[32m"email"[39m
|
|||
|
|
[33mvalue[39m=[32m"test@example.com"[39m
|
|||
|
|
[36m/>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
...
|
|||
|
|
|
|||
|
|
Ignored nodes: comments, script, style
|
|||
|
|
[36m<html>[39m
|
|||
|
|
[36m<head />[39m
|
|||
|
|
[36m<body>[39m
|
|||
|
|
[36m<div>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33maria-label[39m=[32m"Page d'authentification"[39m
|
|||
|
|
[33mclass[39m=[32m"min-h-screen flex items-center justify-center bg-background py-12 px-4 sm:px-6 lg:px-8 relative overflow-hidden"[39m
|
|||
|
|
[33mrole[39m=[32m"main"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"fixed inset-0 bg-background"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"absolute inset-0 bg-gradient-to-br from-primary/5 via-transparent to-primary/5"[39m
|
|||
|
|
[36m/>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"absolute top-1/4 left-1/4 w-96 h-96 bg-primary/10 rounded-full blur-3xl animate-pulse"[39m
|
|||
|
|
[36m/>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"absolute bottom-1/4 right-1/4 w-64 h-64 bg-primary/5 rounded-full blur-3xl animate-pulse"[39m
|
|||
|
|
[33mstyle[39m=[32m"animation-delay: 2s;"[39m
|
|||
|
|
[36m/>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"absolute top-2/3 left-1/2 w-72 h-72 bg-secondary/5 rounded-full blur-3xl animate-pulse"[39m
|
|||
|
|
[33mstyle[39m=[32m"animation-delay: 4s;"[39m
|
|||
|
|
[36m/>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"max-w-md w-full mx-auto space-y-8 relative z-10 animate-auth-enter"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<header[39m
|
|||
|
|
[33mclass[39m=[32m"text-center"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"flex items-center justify-center mb-6"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33maria-hidden[39m=[32m"true"[39m
|
|||
|
|
[33mclass[39m=[32m"h-12 w-12 rounded-xl bg-primary flex items-center justify-center shadow-sm"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<span[39m
|
|||
|
|
[33mclass[39m=[32m"text-primary-foreground font-bold text-2xl"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[0mV[0m
|
|||
|
|
[36m</span>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m<span[39m
|
|||
|
|
[33mclass[39m=[32m"ml-3 font-bold text-3xl text-foreground"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[0mVeza[0m
|
|||
|
|
[36m</span>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m<h1[39m
|
|||
|
|
[33mclass[39m=[32m"text-3xl font-bold text-foreground mb-2"[39m
|
|||
|
|
[33mid[39m=[32m"auth-form-title"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[0mInscription[0m
|
|||
|
|
[36m</h1>[39m
|
|||
|
|
[36m<p[39m
|
|||
|
|
[33mclass[39m=[32m"text-sm text-muted-foreground"[39m
|
|||
|
|
[33mrole[39m=[32m"doc-subtitle"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[0mCréez votre compte[0m
|
|||
|
|
[36m</p>[39m
|
|||
|
|
[36m</header>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33maria-labelledby[39m=[32m"auth-form-title"[39m
|
|||
|
|
[33mclass[39m=[32m"flex flex-col rounded-lg text-card-foreground relative overflow-hidden border hover:bg-card/90 hover:border-border hover:shadow-card-hover transition-all duration-[var(--sumi-duration-slow)] ease-in-out p-8 w-full bg-card/80 backdrop-blur-md border-border/50 shadow-2xl"[39m
|
|||
|
|
[33mdata-slot[39m=[32m"card"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"relative z-10 w-full h-full flex flex-col"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<form[39m
|
|||
|
|
[33maria-label[39m=[32m"Formulaire d'inscription"[39m
|
|||
|
|
[33mclass[39m=[32m"space-y-4"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"space-y-4"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<div>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"w-full"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<label[39m
|
|||
|
|
[33mclass[39m=[32m"block text-sm font-medium text-foreground mb-1"[39m
|
|||
|
|
[33mfor[39m=[32m"register-username"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[0mNom d'utilisateur[0m
|
|||
|
|
[36m</label>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"relative"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<input[39m
|
|||
|
|
[33maria-invalid[39m=[32m"false"[39m
|
|||
|
|
[33maria-required[39m=[32m"true"[39m
|
|||
|
|
[33mautocomplete[39m=[32m"username"[39m
|
|||
|
|
[33mclass[39m=[32m"w-full px-4 py-2.5 border rounded-xl focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/20 transition-all duration-[var(--sumi-duration-slow)] ease-in-out focus-visible:shadow-[0_0_0_3px_oklch(var(--primary)/0.15),0_0_12px_oklch(var(--primary)/0.1)] bg-card border-border text-foreground placeholder:text-muted-foreground focus-visible:border-primary"[39m
|
|||
|
|
[33mid[39m=[32m"register-username"[39m
|
|||
|
|
[33mrequired[39m=[32m""[39m
|
|||
|
|
[33mtype[39m=[32m"text"[39m
|
|||
|
|
[33mvalue[39m=[32m"testuser"[39m
|
|||
|
|
[36m/>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33maria-atomic[39m=[32m"true"[39m
|
|||
|
|
[33maria-live[39m=[32m"polite"[39m
|
|||
|
|
[33mclass[39m=[32m"mt-1.5"[39m
|
|||
|
|
[36m/>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"w-full"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<label[39m
|
|||
|
|
[33mclass[39m=[32m"block text-sm font-medium text-foreground mb-1"[39m
|
|||
|
|
[33mfor[39m=[32m"register-email"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[0mEmail[0m
|
|||
|
|
[36m</label>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"relative"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<input[39m
|
|||
|
|
[33maria-invalid[39m=[32m"false"[39m
|
|||
|
|
[33maria-required[39m=[32m"true"[39m
|
|||
|
|
[33mautocomplete[39m=[32m"email"[39m
|
|||
|
|
[33mclass[39m=[32m"w-full px-4 py-2.5 border rounded-xl focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/20 transition-all duration-[var(--sumi-duration-slow)] ease-in-out focus-visible:shadow-[0_0_0_3px_oklch(var(--primary)/0.15),0_0_12px_oklch(var(--primary)/0.1)] bg-card border-border text-foreground placeholder:text-muted-foreground focus-visible:border-primary"[39m
|
|||
|
|
...
|
|||
|
|
× RegisterPage > should clear terms error when checkbox is checked 2945ms
|
|||
|
|
→ Unable to find an element with the text: Vous devez accepter les conditions d'utilisation et la politique de confidentialité. This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible.
|
|||
|
|
|
|||
|
|
Ignored nodes: comments, script, style
|
|||
|
|
[36m<body>[39m
|
|||
|
|
[36m<div>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33maria-label[39m=[32m"Page d'authentification"[39m
|
|||
|
|
[33mclass[39m=[32m"min-h-screen flex items-center justify-center bg-background py-12 px-4 sm:px-6 lg:px-8 relative overflow-hidden"[39m
|
|||
|
|
[33mrole[39m=[32m"main"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"fixed inset-0 bg-background"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"absolute inset-0 bg-gradient-to-br from-primary/5 via-transparent to-primary/5"[39m
|
|||
|
|
[36m/>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"absolute top-1/4 left-1/4 w-96 h-96 bg-primary/10 rounded-full blur-3xl animate-pulse"[39m
|
|||
|
|
[36m/>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"absolute bottom-1/4 right-1/4 w-64 h-64 bg-primary/5 rounded-full blur-3xl animate-pulse"[39m
|
|||
|
|
[33mstyle[39m=[32m"animation-delay: 2s;"[39m
|
|||
|
|
[36m/>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"absolute top-2/3 left-1/2 w-72 h-72 bg-secondary/5 rounded-full blur-3xl animate-pulse"[39m
|
|||
|
|
[33mstyle[39m=[32m"animation-delay: 4s;"[39m
|
|||
|
|
[36m/>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"max-w-md w-full mx-auto space-y-8 relative z-10 animate-auth-enter"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<header[39m
|
|||
|
|
[33mclass[39m=[32m"text-center"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"flex items-center justify-center mb-6"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33maria-hidden[39m=[32m"true"[39m
|
|||
|
|
[33mclass[39m=[32m"h-12 w-12 rounded-xl bg-primary flex items-center justify-center shadow-sm"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<span[39m
|
|||
|
|
[33mclass[39m=[32m"text-primary-foreground font-bold text-2xl"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[0mV[0m
|
|||
|
|
[36m</span>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m<span[39m
|
|||
|
|
[33mclass[39m=[32m"ml-3 font-bold text-3xl text-foreground"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[0mVeza[0m
|
|||
|
|
[36m</span>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m<h1[39m
|
|||
|
|
[33mclass[39m=[32m"text-3xl font-bold text-foreground mb-2"[39m
|
|||
|
|
[33mid[39m=[32m"auth-form-title"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[0mInscription[0m
|
|||
|
|
[36m</h1>[39m
|
|||
|
|
[36m<p[39m
|
|||
|
|
[33mclass[39m=[32m"text-sm text-muted-foreground"[39m
|
|||
|
|
[33mrole[39m=[32m"doc-subtitle"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[0mCréez votre compte[0m
|
|||
|
|
[36m</p>[39m
|
|||
|
|
[36m</header>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33maria-labelledby[39m=[32m"auth-form-title"[39m
|
|||
|
|
[33mclass[39m=[32m"flex flex-col rounded-lg text-card-foreground relative overflow-hidden border hover:bg-card/90 hover:border-border hover:shadow-card-hover transition-all duration-[var(--sumi-duration-slow)] ease-in-out p-8 w-full bg-card/80 backdrop-blur-md border-border/50 shadow-2xl"[39m
|
|||
|
|
[33mdata-slot[39m=[32m"card"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"relative z-10 w-full h-full flex flex-col"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<form[39m
|
|||
|
|
[33maria-label[39m=[32m"Formulaire d'inscription"[39m
|
|||
|
|
[33mclass[39m=[32m"space-y-4"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"space-y-4"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<div>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"w-full"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<label[39m
|
|||
|
|
[33mclass[39m=[32m"block text-sm font-medium text-foreground mb-1"[39m
|
|||
|
|
[33mfor[39m=[32m"register-username"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[0mNom d'utilisateur[0m
|
|||
|
|
[36m</label>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"relative"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<input[39m
|
|||
|
|
[33maria-invalid[39m=[32m"false"[39m
|
|||
|
|
[33maria-required[39m=[32m"true"[39m
|
|||
|
|
[33mautocomplete[39m=[32m"username"[39m
|
|||
|
|
[33mclass[39m=[32m"w-full px-4 py-2.5 border rounded-xl focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/20 transition-all duration-[var(--sumi-duration-slow)] ease-in-out focus-visible:shadow-[0_0_0_3px_oklch(var(--primary)/0.15),0_0_12px_oklch(var(--primary)/0.1)] bg-card border-border text-foreground placeholder:text-muted-foreground focus-visible:border-primary"[39m
|
|||
|
|
[33mid[39m=[32m"register-username"[39m
|
|||
|
|
[33mrequired[39m=[32m""[39m
|
|||
|
|
[33mtype[39m=[32m"text"[39m
|
|||
|
|
[33mvalue[39m=[32m"testuser"[39m
|
|||
|
|
[36m/>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33maria-atomic[39m=[32m"true"[39m
|
|||
|
|
[33maria-live[39m=[32m"polite"[39m
|
|||
|
|
[33mclass[39m=[32m"mt-1.5"[39m
|
|||
|
|
[36m/>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"w-full"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<label[39m
|
|||
|
|
[33mclass[39m=[32m"block text-sm font-medium text-foreground mb-1"[39m
|
|||
|
|
[33mfor[39m=[32m"register-email"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[0mEmail[0m
|
|||
|
|
[36m</label>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"relative"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<input[39m
|
|||
|
|
[33maria-invalid[39m=[32m"false"[39m
|
|||
|
|
[33maria-required[39m=[32m"true"[39m
|
|||
|
|
[33mautocomplete[39m=[32m"email"[39m
|
|||
|
|
[33mclass[39m=[32m"w-full px-4 py-2.5 border rounded-xl focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/20 transition-all duration-[var(--sumi-duration-slow)] ease-in-out focus-visible:shadow-[0_0_0_3px_oklch(var(--primary)/0.15),0_0_12px_oklch(var(--primary)/0.1)] bg-card border-border text-foreground placeholder:text-muted-foreground focus-visible:border-primary"[39m
|
|||
|
|
[33mid[39m=[32m"register-email"[39m
|
|||
|
|
[33mrequired[39m=[32m""[39m
|
|||
|
|
[33mtype[39m=[32m"email"[39m
|
|||
|
|
[33mvalue[39m=[32m"test@example.com"[39m
|
|||
|
|
[36m/>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
...
|
|||
|
|
|
|||
|
|
Ignored nodes: comments, script, style
|
|||
|
|
[36m<html>[39m
|
|||
|
|
[36m<head />[39m
|
|||
|
|
[36m<body>[39m
|
|||
|
|
[36m<div>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33maria-label[39m=[32m"Page d'authentification"[39m
|
|||
|
|
[33mclass[39m=[32m"min-h-screen flex items-center justify-center bg-background py-12 px-4 sm:px-6 lg:px-8 relative overflow-hidden"[39m
|
|||
|
|
[33mrole[39m=[32m"main"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"fixed inset-0 bg-background"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"absolute inset-0 bg-gradient-to-br from-primary/5 via-transparent to-primary/5"[39m
|
|||
|
|
[36m/>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"absolute top-1/4 left-1/4 w-96 h-96 bg-primary/10 rounded-full blur-3xl animate-pulse"[39m
|
|||
|
|
[36m/>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"absolute bottom-1/4 right-1/4 w-64 h-64 bg-primary/5 rounded-full blur-3xl animate-pulse"[39m
|
|||
|
|
[33mstyle[39m=[32m"animation-delay: 2s;"[39m
|
|||
|
|
[36m/>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"absolute top-2/3 left-1/2 w-72 h-72 bg-secondary/5 rounded-full blur-3xl animate-pulse"[39m
|
|||
|
|
[33mstyle[39m=[32m"animation-delay: 4s;"[39m
|
|||
|
|
[36m/>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"max-w-md w-full mx-auto space-y-8 relative z-10 animate-auth-enter"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<header[39m
|
|||
|
|
[33mclass[39m=[32m"text-center"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"flex items-center justify-center mb-6"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33maria-hidden[39m=[32m"true"[39m
|
|||
|
|
[33mclass[39m=[32m"h-12 w-12 rounded-xl bg-primary flex items-center justify-center shadow-sm"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<span[39m
|
|||
|
|
[33mclass[39m=[32m"text-primary-foreground font-bold text-2xl"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[0mV[0m
|
|||
|
|
[36m</span>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m<span[39m
|
|||
|
|
[33mclass[39m=[32m"ml-3 font-bold text-3xl text-foreground"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[0mVeza[0m
|
|||
|
|
[36m</span>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m<h1[39m
|
|||
|
|
[33mclass[39m=[32m"text-3xl font-bold text-foreground mb-2"[39m
|
|||
|
|
[33mid[39m=[32m"auth-form-title"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[0mInscription[0m
|
|||
|
|
[36m</h1>[39m
|
|||
|
|
[36m<p[39m
|
|||
|
|
[33mclass[39m=[32m"text-sm text-muted-foreground"[39m
|
|||
|
|
[33mrole[39m=[32m"doc-subtitle"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[0mCréez votre compte[0m
|
|||
|
|
[36m</p>[39m
|
|||
|
|
[36m</header>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33maria-labelledby[39m=[32m"auth-form-title"[39m
|
|||
|
|
[33mclass[39m=[32m"flex flex-col rounded-lg text-card-foreground relative overflow-hidden border hover:bg-card/90 hover:border-border hover:shadow-card-hover transition-all duration-[var(--sumi-duration-slow)] ease-in-out p-8 w-full bg-card/80 backdrop-blur-md border-border/50 shadow-2xl"[39m
|
|||
|
|
[33mdata-slot[39m=[32m"card"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"relative z-10 w-full h-full flex flex-col"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<form[39m
|
|||
|
|
[33maria-label[39m=[32m"Formulaire d'inscription"[39m
|
|||
|
|
[33mclass[39m=[32m"space-y-4"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"space-y-4"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<div>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"w-full"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<label[39m
|
|||
|
|
[33mclass[39m=[32m"block text-sm font-medium text-foreground mb-1"[39m
|
|||
|
|
[33mfor[39m=[32m"register-username"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[0mNom d'utilisateur[0m
|
|||
|
|
[36m</label>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"relative"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<input[39m
|
|||
|
|
[33maria-invalid[39m=[32m"false"[39m
|
|||
|
|
[33maria-required[39m=[32m"true"[39m
|
|||
|
|
[33mautocomplete[39m=[32m"username"[39m
|
|||
|
|
[33mclass[39m=[32m"w-full px-4 py-2.5 border rounded-xl focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/20 transition-all duration-[var(--sumi-duration-slow)] ease-in-out focus-visible:shadow-[0_0_0_3px_oklch(var(--primary)/0.15),0_0_12px_oklch(var(--primary)/0.1)] bg-card border-border text-foreground placeholder:text-muted-foreground focus-visible:border-primary"[39m
|
|||
|
|
[33mid[39m=[32m"register-username"[39m
|
|||
|
|
[33mrequired[39m=[32m""[39m
|
|||
|
|
[33mtype[39m=[32m"text"[39m
|
|||
|
|
[33mvalue[39m=[32m"testuser"[39m
|
|||
|
|
[36m/>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33maria-atomic[39m=[32m"true"[39m
|
|||
|
|
[33maria-live[39m=[32m"polite"[39m
|
|||
|
|
[33mclass[39m=[32m"mt-1.5"[39m
|
|||
|
|
[36m/>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"w-full"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<label[39m
|
|||
|
|
[33mclass[39m=[32m"block text-sm font-medium text-foreground mb-1"[39m
|
|||
|
|
[33mfor[39m=[32m"register-email"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[0mEmail[0m
|
|||
|
|
[36m</label>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"relative"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<input[39m
|
|||
|
|
[33maria-invalid[39m=[32m"false"[39m
|
|||
|
|
[33maria-required[39m=[32m"true"[39m
|
|||
|
|
[33mautocomplete[39m=[32m"email"[39m
|
|||
|
|
[33mclass[39m=[32m"w-full px-4 py-2.5 border rounded-xl focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/20 transition-all duration-[var(--sumi-duration-slow)] ease-in-out focus-visible:shadow-[0_0_0_3px_oklch(var(--primary)/0.15),0_0_12px_oklch(var(--primary)/0.1)] bg-card border-border text-foreground placeholder:text-muted-foreground focus-visible:border-primary"[39m
|
|||
|
|
...
|
|||
|
|
✓ RegisterPage > should allow form submission when terms are accepted 1167ms
|
|||
|
|
× RegisterPage > should display verification notice after successful registration 1747ms
|
|||
|
|
→ Unable to find an element with the text: /Un email de vérification a été envoyé à test@example.com/. This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible.
|
|||
|
|
|
|||
|
|
Ignored nodes: comments, script, style
|
|||
|
|
[36m<body>[39m
|
|||
|
|
[36m<div>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33maria-label[39m=[32m"Page d'authentification"[39m
|
|||
|
|
[33mclass[39m=[32m"min-h-screen flex items-center justify-center bg-background py-12 px-4 sm:px-6 lg:px-8 relative overflow-hidden"[39m
|
|||
|
|
[33mrole[39m=[32m"main"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"fixed inset-0 bg-background"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"absolute inset-0 bg-gradient-to-br from-primary/5 via-transparent to-primary/5"[39m
|
|||
|
|
[36m/>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"absolute top-1/4 left-1/4 w-96 h-96 bg-primary/10 rounded-full blur-3xl animate-pulse"[39m
|
|||
|
|
[36m/>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"absolute bottom-1/4 right-1/4 w-64 h-64 bg-primary/5 rounded-full blur-3xl animate-pulse"[39m
|
|||
|
|
[33mstyle[39m=[32m"animation-delay: 2s;"[39m
|
|||
|
|
[36m/>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"absolute top-2/3 left-1/2 w-72 h-72 bg-secondary/5 rounded-full blur-3xl animate-pulse"[39m
|
|||
|
|
[33mstyle[39m=[32m"animation-delay: 4s;"[39m
|
|||
|
|
[36m/>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"max-w-md w-full mx-auto space-y-8 relative z-10 animate-auth-enter"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<header[39m
|
|||
|
|
[33mclass[39m=[32m"text-center"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"flex items-center justify-center mb-6"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33maria-hidden[39m=[32m"true"[39m
|
|||
|
|
[33mclass[39m=[32m"h-12 w-12 rounded-xl bg-primary flex items-center justify-center shadow-sm"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<span[39m
|
|||
|
|
[33mclass[39m=[32m"text-primary-foreground font-bold text-2xl"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[0mV[0m
|
|||
|
|
[36m</span>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m<span[39m
|
|||
|
|
[33mclass[39m=[32m"ml-3 font-bold text-3xl text-foreground"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[0mVeza[0m
|
|||
|
|
[36m</span>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m<h1[39m
|
|||
|
|
[33mclass[39m=[32m"text-3xl font-bold text-foreground mb-2"[39m
|
|||
|
|
[33mid[39m=[32m"auth-form-title"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[0mInscription[0m
|
|||
|
|
[36m</h1>[39m
|
|||
|
|
[36m<p[39m
|
|||
|
|
[33mclass[39m=[32m"text-sm text-muted-foreground"[39m
|
|||
|
|
[33mrole[39m=[32m"doc-subtitle"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[0mCréez votre compte[0m
|
|||
|
|
[36m</p>[39m
|
|||
|
|
[36m</header>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33maria-labelledby[39m=[32m"auth-form-title"[39m
|
|||
|
|
[33mclass[39m=[32m"flex flex-col rounded-lg text-card-foreground relative overflow-hidden border hover:bg-card/90 hover:border-border hover:shadow-card-hover transition-all duration-[var(--sumi-duration-slow)] ease-in-out p-8 w-full bg-card/80 backdrop-blur-md border-border/50 shadow-2xl"[39m
|
|||
|
|
[33mdata-slot[39m=[32m"card"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"relative z-10 w-full h-full flex flex-col"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33maria-live[39m=[32m"polite"[39m
|
|||
|
|
[33mclass[39m=[32m"text-center space-y-5 animate-fade-in py-4"[39m
|
|||
|
|
[33mrole[39m=[32m"status"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"flex justify-center"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"h-16 w-16 rounded-full bg-success/10 flex items-center justify-center"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<svg[39m
|
|||
|
|
[33mclass[39m=[32m"lucide lucide-mail h-8 w-8 text-success"[39m
|
|||
|
|
[33mfill[39m=[32m"none"[39m
|
|||
|
|
[33mheight[39m=[32m"24"[39m
|
|||
|
|
[33mstroke[39m=[32m"currentColor"[39m
|
|||
|
|
[33mstroke-linecap[39m=[32m"round"[39m
|
|||
|
|
[33mstroke-linejoin[39m=[32m"round"[39m
|
|||
|
|
[33mstroke-width[39m=[32m"2"[39m
|
|||
|
|
[33mviewBox[39m=[32m"0 0 24 24"[39m
|
|||
|
|
[33mwidth[39m=[32m"24"[39m
|
|||
|
|
[33mxmlns[39m=[32m"http://www.w3.org/2000/svg"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<rect[39m
|
|||
|
|
[33mheight[39m=[32m"16"[39m
|
|||
|
|
[33mrx[39m=[32m"2"[39m
|
|||
|
|
[33mwidth[39m=[32m"20"[39m
|
|||
|
|
[33mx[39m=[32m"2"[39m
|
|||
|
|
[33my[39m=[32m"4"[39m
|
|||
|
|
[36m/>[39m
|
|||
|
|
[36m<path[39m
|
|||
|
|
[33md[39m=[32m"m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7"[39m
|
|||
|
|
[36m/>[39m
|
|||
|
|
[36m</svg>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m<div>[39m
|
|||
|
|
[36m<p[39m
|
|||
|
|
[33mclass[39m=[32m"text-lg font-semibold text-foreground"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[0mInscription réussie ![0m
|
|||
|
|
[36m</p>[39m
|
|||
|
|
[36m<p[39m
|
|||
|
|
[33mclass[39m=[32m"text-sm text-muted-foreground mt-2"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[0mUn email de vérification a été envoyé à[0m
|
|||
|
|
[0m [0m
|
|||
|
|
[36m<span[39m
|
|||
|
|
[33mclass[39m=[32m"font-medium text-foreground"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[0mtest@example.com[0m
|
|||
|
|
[36m</span>[39m
|
|||
|
|
[36m</p>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m<p[39m
|
|||
|
|
[33mclass[39m=[32m"text-sm text-muted-foreground"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[0mVeuillez vérifier votre boîte mail et cliquer sur le lien de vérification.[0m
|
|||
|
|
[36m</p>[39m
|
|||
|
|
[36m<button[39m
|
|||
|
|
[33maria-disabled[39m=[32m"false"[39m
|
|||
|
|
[33maria-label[39m=[32m"Renvoyer l'email de vérification"[39m
|
|||
|
|
[33mclass[39m=[32m"w-full px-4 py-2.5 rounded-xl font-medium transition-all duration-[var(--sumi-duration-slow)] ease-in-out focus:outline-none focus:ring-2 focus:ring-primary/20 focus:ring-offset-2 focus:ring-offset-background bg-muted text-foreground hover:bg-muted/80 border border-border"[39m
|
|||
|
|
[33mtype[39m=[32m"button"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[0mRenvoyer l'email de vérification[0m
|
|||
|
|
[36m</button>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m<nav[39m
|
|||
|
|
[33maria-label[39m=[32m"Navigation d'authentification"[39m
|
|||
|
|
[33mclass[39m=[32m"text-center space-x-4"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<a[39m
|
|||
|
|
[33mclass[39m=[32m"text-sm text-muted-foreground hover:text-foreground transition-colors duration-[var(--duration-fast)] focus:outline-none focus:ring-2 focus:ring-primary/30 focus:ring-offset-2 focus:ring-offset-background rounded"[39m
|
|||
|
|
[33mhref[39m=[32m"/login"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[0mDéjà un compte ? Se connecter[0m
|
|||
|
|
[36m</a>[39m
|
|||
|
|
[36m</nav>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m</body>[39m
|
|||
|
|
|
|||
|
|
Ignored nodes: comments, script, style
|
|||
|
|
[36m<html>[39m
|
|||
|
|
[36m<head />[39m
|
|||
|
|
[36m<body>[39m
|
|||
|
|
[36m<div>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33maria-label[39m=[32m"Page d'authentification"[39m
|
|||
|
|
[33mclass[39m=[32m"min-h-screen flex items-center justify-center bg-background py-12 px-4 sm:px-6 lg:px-8 relative overflow-hidden"[39m
|
|||
|
|
[33mrole[39m=[32m"main"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"fixed inset-0 bg-background"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"absolute inset-0 bg-gradient-to-br from-primary/5 via-transparent to-primary/5"[39m
|
|||
|
|
[36m/>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"absolute top-1/4 left-1/4 w-96 h-96 bg-primary/10 rounded-full blur-3xl animate-pulse"[39m
|
|||
|
|
[36m/>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"absolute bottom-1/4 right-1/4 w-64 h-64 bg-primary/5 rounded-full blur-3xl animate-pulse"[39m
|
|||
|
|
[33mstyle[39m=[32m"animation-delay: 2s;"[39m
|
|||
|
|
[36m/>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"absolute top-2/3 left-1/2 w-72 h-72 bg-secondary/5 rounded-full blur-3xl animate-pulse"[39m
|
|||
|
|
[33mstyle[39m=[32m"animation-delay: 4s;"[39m
|
|||
|
|
[36m/>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"max-w-md w-full mx-auto space-y-8 relative z-10 animate-auth-enter"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<header[39m
|
|||
|
|
[33mclass[39m=[32m"text-center"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"flex items-center justify-center mb-6"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33maria-hidden[39m=[32m"true"[39m
|
|||
|
|
[33mclass[39m=[32m"h-12 w-12 rounded-xl bg-primary flex items-center justify-center shadow-sm"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<span[39m
|
|||
|
|
[33mclass[39m=[32m"text-primary-foreground font-bold text-2xl"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[0mV[0m
|
|||
|
|
[36m</span>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m<span[39m
|
|||
|
|
[33mclass[39m=[32m"ml-3 font-bold text-3xl text-foreground"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[0mVeza[0m
|
|||
|
|
[36m</span>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m<h1[39m
|
|||
|
|
[33mclass[39m=[32m"text-3xl font-bold text-foreground mb-2"[39m
|
|||
|
|
[33mid[39m=[32m"auth-form-title"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[0mInscription[0m
|
|||
|
|
[36m</h1>[39m
|
|||
|
|
[36m<p[39m
|
|||
|
|
[33mclass[39m=[32m"text-sm text-muted-foreground"[39m
|
|||
|
|
[33mrole[39m=[32m"doc-subtitle"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[0mCréez votre compte[0m
|
|||
|
|
[36m</p>[39m
|
|||
|
|
[36m</header>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33maria-labelledby[39m=[32m"auth-form-title"[39m
|
|||
|
|
[33mclass[39m=[32m"flex flex-col rounded-lg text-card-foreground relative overflow-hidden border hover:bg-card/90 hover:border-border hover:shadow-card-hover transition-all duration-[var(--sumi-duration-slow)] ease-in-out p-8 w-full bg-card/80 backdrop-blur-md border-border/50 shadow-2xl"[39m
|
|||
|
|
[33mdata-slot[39m=[32m"card"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"relative z-10 w-full h-full flex flex-col"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33maria-live[39m=[32m"polite"[39m
|
|||
|
|
[33mclass[39m=[32m"text-center space-y-5 animate-fade-in py-4"[39m
|
|||
|
|
[33mrole[39m=[32m"status"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"flex justify-center"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"h-16 w-16 rounded-full bg-success/10 flex items-center justify-center"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<svg[39m
|
|||
|
|
[33mclass[39m=[32m"lucide lucide-mail h-8 w-8 text-success"[39m
|
|||
|
|
[33mfill[39m=[32m"none"[39m
|
|||
|
|
[33mheight[39m=[32m"24"[39m
|
|||
|
|
[33mstroke[39m=[32m"currentColor"[39m
|
|||
|
|
[33mstroke-linecap[39m=[32m"round"[39m
|
|||
|
|
[33mstroke-linejoin[39m=[32m"round"[39m
|
|||
|
|
[33mstroke-width[39m=[32m"2"[39m
|
|||
|
|
[33mviewBox[39m=[32m"0 0 24 24"[39m
|
|||
|
|
[33mwidth[39m=[32m"24"[39m
|
|||
|
|
[33mxmlns[39m=[32m"http://www.w3.org/2000/svg"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<rect[39m
|
|||
|
|
[33mheight[39m=[32m"16"[39m
|
|||
|
|
[33mrx[39m=[32m"2"[39m
|
|||
|
|
[33mwidth[39m=[32m"20"[39m
|
|||
|
|
[33mx[39m=[32m"2"[39m
|
|||
|
|
[33my[39m=[32m"4"[39m
|
|||
|
|
[36m/>[39m
|
|||
|
|
[36m<path[39m
|
|||
|
|
[33md[39m=[32m"m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7"[39m
|
|||
|
|
[36m/>[39m
|
|||
|
|
[36m</svg>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m<div>[39m
|
|||
|
|
[36m<p[39m
|
|||
|
|
[33mclass[39m=[32m"text-lg font-semibold text-foreground"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[0mInscription réussie ![0m
|
|||
|
|
[36m</p>[39m
|
|||
|
|
[36m<p[39m
|
|||
|
|
[33mclass[39m=[32m"text-sm text-muted-foreground mt-2"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[0mUn email de vérification a été envoyé à[0m
|
|||
|
|
[0m [0m
|
|||
|
|
[36m<span[39m
|
|||
|
|
[33mclass[39m=[32m"font-medium text-foreground"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[0mtest@example.com[0m
|
|||
|
|
[36m</span>[39m
|
|||
|
|
[36m</p>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m<p[39m
|
|||
|
|
[33mclass[39m=[32m"text-sm text-muted-foreground"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[0mVeuillez vérifier votre boîte mail et cliquer sur le lien de vérification.[0m
|
|||
|
|
[36m</p>[39m
|
|||
|
|
[36m<button[39m
|
|||
|
|
[33maria-disabled[39m=[32m"false"[39m
|
|||
|
|
[33maria-label[39m=[32m"Renvoyer l'email de vérification"[39m
|
|||
|
|
[33mclass[39m=[32m"w-full px-4 py-2.5 rounded-xl font-medium transition-all duration-[var(--sumi-duration-slow)] ease-in-out focus:outline-none focus:ring-2 focus:ring-primary/20 focus:ring-offset-2 focus:ring-offset-background bg-muted text-foreground hover:bg-muted/80 border border-border"[39m
|
|||
|
|
[33mtype[39m=[32m"button"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[0mRenvoyer l'email de vérification[0m
|
|||
|
|
[36m</button>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m<nav[39m
|
|||
|
|
[33maria-label[39m=[32m"Navigation d'authentification"[39m
|
|||
|
|
[33mclass[39m=[32m"text-center space-x-4"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<a[39m
|
|||
|
|
[33mclass[39m=[32m"text-sm text-muted-foreground hover:text-foreground transition-colors duration-[var(--duration-fast)] focus:outline-none focus:ring-2 focus:ring-primary/30 focus:ring-offset-2 focus:ring-offset-background rounded"[39m
|
|||
|
|
[33mhref[39m=[32m"/login"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[0mDéjà un compte ? Se connecter[0m
|
|||
|
|
[36m</a>[39m
|
|||
|
|
[36m</nav>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m</body>[39m
|
|||
|
|
[36m</html>[39m
|
|||
|
|
✓ 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
|
|||
|
|
[36m<p[39m
|
|||
|
|
[33mclass[39m=[32m"mt-1 text-sm text-destructive animate-shake"[39m
|
|||
|
|
[33mid[39m=[32m"register-username-error"[39m
|
|||
|
|
[33mrole[39m=[32m"alert"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[0mCe nom d'utilisateur est déjà pris[0m
|
|||
|
|
[36m</p>[39m
|
|||
|
|
|
|||
|
|
Ignored nodes: comments, script, style
|
|||
|
|
[36m<span>[39m
|
|||
|
|
[0mCe nom d'utilisateur est déjà pris[0m
|
|||
|
|
[36m</span>[39m
|
|||
|
|
|
|||
|
|
(If this is intentional, then use the `*AllBy*` variant of the query (like `queryAllByText`, `getAllByText`, or `findAllByText`)).
|
|||
|
|
|
|||
|
|
Ignored nodes: comments, script, style
|
|||
|
|
[36m<body>[39m
|
|||
|
|
[36m<div>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33maria-label[39m=[32m"Page d'authentification"[39m
|
|||
|
|
[33mclass[39m=[32m"min-h-screen flex items-center justify-center bg-background py-12 px-4 sm:px-6 lg:px-8 relative overflow-hidden"[39m
|
|||
|
|
[33mrole[39m=[32m"main"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"fixed inset-0 bg-background"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"absolute inset-0 bg-gradient-to-br from-primary/5 via-transparent to-primary/5"[39m
|
|||
|
|
[36m/>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"absolute top-1/4 left-1/4 w-96 h-96 bg-primary/10 rounded-full blur-3xl animate-pulse"[39m
|
|||
|
|
[36m/>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"absolute bottom-1/4 right-1/4 w-64 h-64 bg-primary/5 rounded-full blur-3xl animate-pulse"[39m
|
|||
|
|
[33mstyle[39m=[32m"animation-delay: 2s;"[39m
|
|||
|
|
[36m/>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"absolute top-2/3 left-1/2 w-72 h-72 bg-secondary/5 rounded-full blur-3xl animate-pulse"[39m
|
|||
|
|
[33mstyle[39m=[32m"animation-delay: 4s;"[39m
|
|||
|
|
[36m/>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"max-w-md w-full mx-auto space-y-8 relative z-10 animate-auth-enter"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<header[39m
|
|||
|
|
[33mclass[39m=[32m"text-center"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"flex items-center justify-center mb-6"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33maria-hidden[39m=[32m"true"[39m
|
|||
|
|
[33mclass[39m=[32m"h-12 w-12 rounded-xl bg-primary flex items-center justify-center shadow-sm"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<span[39m
|
|||
|
|
[33mclass[39m=[32m"text-primary-foreground font-bold text-2xl"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[0mV[0m
|
|||
|
|
[36m</span>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m<span[39m
|
|||
|
|
[33mclass[39m=[32m"ml-3 font-bold text-3xl text-foreground"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[0mVeza[0m
|
|||
|
|
[36m</span>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m<h1[39m
|
|||
|
|
[33mclass[39m=[32m"text-3xl font-bold text-foreground mb-2"[39m
|
|||
|
|
[33mid[39m=[32m"auth-form-title"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[0mInscription[0m
|
|||
|
|
[36m</h1>[39m
|
|||
|
|
[36m<p[39m
|
|||
|
|
[33mclass[39m=[32m"text-sm text-muted-foreground"[39m
|
|||
|
|
[33mrole[39m=[32m"doc-subtitle"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[0mCréez votre compte[0m
|
|||
|
|
[36m</p>[39m
|
|||
|
|
[36m</header>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33maria-labelledby[39m=[32m"auth-form-title"[39m
|
|||
|
|
[33mclass[39m=[32m"flex flex-col rounded-lg text-card-foreground relative overflow-hidden border hover:bg-card/90 hover:border-border hover:shadow-card-hover transition-all duration-[var(--sumi-duration-slow)] ease-in-out p-8 w-full bg-card/80 backdrop-blur-md border-border/50 shadow-2xl"[39m
|
|||
|
|
[33mdata-slot[39m=[32m"card"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"relative z-10 w-full h-full flex flex-col"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<form[39m
|
|||
|
|
[33maria-label[39m=[32m"Formulaire d'inscription"[39m
|
|||
|
|
[33mclass[39m=[32m"space-y-4"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"space-y-4"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<div>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"w-full"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<label[39m
|
|||
|
|
[33mclass[39m=[32m"block text-sm font-medium text-foreground mb-1"[39m
|
|||
|
|
[33mfor[39m=[32m"register-username"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[0mNom d'utilisateur[0m
|
|||
|
|
[36m</label>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"relative"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<input[39m
|
|||
|
|
[33maria-describedby[39m=[32m"register-username-error"[39m
|
|||
|
|
[33maria-invalid[39m=[32m"true"[39m
|
|||
|
|
[33maria-required[39m=[32m"true"[39m
|
|||
|
|
[33mautocomplete[39m=[32m"username"[39m
|
|||
|
|
[33mclass[39m=[32m"w-full px-4 py-2.5 border rounded-xl focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/20 transition-all duration-[var(--sumi-duration-slow)] ease-in-out focus-visible:shadow-[0_0_0_3px_oklch(var(--primary)/0.15),0_0_12px_oklch(var(--primary)/0.1)] bg-card text-foreground placeholder:text-muted-foreground border-destructive focus-visible:border-destructive"[39m
|
|||
|
|
[33mid[39m=[32m"register-username"[39m
|
|||
|
|
[33mrequired[39m=[32m""[39m
|
|||
|
|
[33mtype[39m=[32m"text"[39m
|
|||
|
|
[33mvalue[39m=[32m"takenuser"[39m
|
|||
|
|
[36m/>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m<p[39m
|
|||
|
|
[33mclass[39m=[32m"mt-1 text-sm text-destructive animate-shake"[39m
|
|||
|
|
[33mid[39m=[32m"register-username-error"[39m
|
|||
|
|
[33mrole[39m=[32m"alert"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[0mCe nom d'utilisateur est déjà pris[0m
|
|||
|
|
[36m</p>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33maria-atomic[39m=[32m"true"[39m
|
|||
|
|
[33maria-live[39m=[32m"polite"[39m
|
|||
|
|
[33mclass[39m=[32m"mt-1.5"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<p[39m
|
|||
|
|
[33mclass[39m=[32m"text-xs text-destructive flex items-center gap-1.5"[39m
|
|||
|
|
[33mrole[39m=[32m"alert"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<svg[39m
|
|||
|
|
[33mclass[39m=[32m"lucide lucide-x h-3 w-3"[39m
|
|||
|
|
[33mfill[39m=[32m"none"[39m
|
|||
|
|
[33mheight[39m=[32m"24"[39m
|
|||
|
|
[33mstroke[39m=[32m"currentColor"[39m
|
|||
|
|
[33mstroke-linecap[39m=[32m"round"[39m
|
|||
|
|
[33mstroke-linejoin[39m=[32m"round"[39m
|
|||
|
|
[33mstroke-width[39m=[32m"2"[39m
|
|||
|
|
[33mviewBox[39m=[32m"0 0 24 24"[39m
|
|||
|
|
[33mwidth[39m=[32m"24"[39m
|
|||
|
|
[33mxmlns[39m=[32m"http://www.w3.org/2000/svg"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<path[39m
|
|||
|
|
[33md[39m=[32m"M18 6 6 18"[39m
|
|||
|
|
...
|
|||
|
|
|
|||
|
|
Ignored nodes: comments, script, style
|
|||
|
|
[36m<html>[39m
|
|||
|
|
[36m<head />[39m
|
|||
|
|
[36m<body>[39m
|
|||
|
|
[36m<div>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33maria-label[39m=[32m"Page d'authentification"[39m
|
|||
|
|
[33mclass[39m=[32m"min-h-screen flex items-center justify-center bg-background py-12 px-4 sm:px-6 lg:px-8 relative overflow-hidden"[39m
|
|||
|
|
[33mrole[39m=[32m"main"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"fixed inset-0 bg-background"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"absolute inset-0 bg-gradient-to-br from-primary/5 via-transparent to-primary/5"[39m
|
|||
|
|
[36m/>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"absolute top-1/4 left-1/4 w-96 h-96 bg-primary/10 rounded-full blur-3xl animate-pulse"[39m
|
|||
|
|
[36m/>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"absolute bottom-1/4 right-1/4 w-64 h-64 bg-primary/5 rounded-full blur-3xl animate-pulse"[39m
|
|||
|
|
[33mstyle[39m=[32m"animation-delay: 2s;"[39m
|
|||
|
|
[36m/>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"absolute top-2/3 left-1/2 w-72 h-72 bg-secondary/5 rounded-full blur-3xl animate-pulse"[39m
|
|||
|
|
[33mstyle[39m=[32m"animation-delay: 4s;"[39m
|
|||
|
|
[36m/>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"max-w-md w-full mx-auto space-y-8 relative z-10 animate-auth-enter"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<header[39m
|
|||
|
|
[33mclass[39m=[32m"text-center"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"flex items-center justify-center mb-6"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33maria-hidden[39m=[32m"true"[39m
|
|||
|
|
[33mclass[39m=[32m"h-12 w-12 rounded-xl bg-primary flex items-center justify-center shadow-sm"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<span[39m
|
|||
|
|
[33mclass[39m=[32m"text-primary-foreground font-bold text-2xl"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[0mV[0m
|
|||
|
|
[36m</span>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m<span[39m
|
|||
|
|
[33mclass[39m=[32m"ml-3 font-bold text-3xl text-foreground"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[0mVeza[0m
|
|||
|
|
[36m</span>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m<h1[39m
|
|||
|
|
[33mclass[39m=[32m"text-3xl font-bold text-foreground mb-2"[39m
|
|||
|
|
[33mid[39m=[32m"auth-form-title"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[0mInscription[0m
|
|||
|
|
[36m</h1>[39m
|
|||
|
|
[36m<p[39m
|
|||
|
|
[33mclass[39m=[32m"text-sm text-muted-foreground"[39m
|
|||
|
|
[33mrole[39m=[32m"doc-subtitle"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[0mCréez votre compte[0m
|
|||
|
|
[36m</p>[39m
|
|||
|
|
[36m</header>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33maria-labelledby[39m=[32m"auth-form-title"[39m
|
|||
|
|
[33mclass[39m=[32m"flex flex-col rounded-lg text-card-foreground relative overflow-hidden border hover:bg-card/90 hover:border-border hover:shadow-card-hover transition-all duration-[var(--sumi-duration-slow)] ease-in-out p-8 w-full bg-card/80 backdrop-blur-md border-border/50 shadow-2xl"[39m
|
|||
|
|
[33mdata-slot[39m=[32m"card"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"relative z-10 w-full h-full flex flex-col"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<form[39m
|
|||
|
|
[33maria-label[39m=[32m"Formulaire d'inscription"[39m
|
|||
|
|
[33mclass[39m=[32m"space-y-4"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"space-y-4"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<div>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"w-full"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<label[39m
|
|||
|
|
[33mclass[39m=[32m"block text-sm font-medium text-foreground mb-1"[39m
|
|||
|
|
[33mfor[39m=[32m"register-username"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[0mNom d'utilisateur[0m
|
|||
|
|
[36m</label>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33mclass[39m=[32m"relative"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<input[39m
|
|||
|
|
[33maria-describedby[39m=[32m"register-username-error"[39m
|
|||
|
|
[33maria-invalid[39m=[32m"true"[39m
|
|||
|
|
[33maria-required[39m=[32m"true"[39m
|
|||
|
|
[33mautocomplete[39m=[32m"username"[39m
|
|||
|
|
[33mclass[39m=[32m"w-full px-4 py-2.5 border rounded-xl focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/20 transition-all duration-[var(--sumi-duration-slow)] ease-in-out focus-visible:shadow-[0_0_0_3px_oklch(var(--primary)/0.15),0_0_12px_oklch(var(--primary)/0.1)] bg-card text-foreground placeholder:text-muted-foreground border-destructive focus-visible:border-destructive"[39m
|
|||
|
|
[33mid[39m=[32m"register-username"[39m
|
|||
|
|
[33mrequired[39m=[32m""[39m
|
|||
|
|
[33mtype[39m=[32m"text"[39m
|
|||
|
|
[33mvalue[39m=[32m"takenuser"[39m
|
|||
|
|
[36m/>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m<p[39m
|
|||
|
|
[33mclass[39m=[32m"mt-1 text-sm text-destructive animate-shake"[39m
|
|||
|
|
[33mid[39m=[32m"register-username-error"[39m
|
|||
|
|
[33mrole[39m=[32m"alert"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[0mCe nom d'utilisateur est déjà pris[0m
|
|||
|
|
[36m</p>[39m
|
|||
|
|
[36m</div>[39m
|
|||
|
|
[36m<div[39m
|
|||
|
|
[33maria-atomic[39m=[32m"true"[39m
|
|||
|
|
[33maria-live[39m=[32m"polite"[39m
|
|||
|
|
[33mclass[39m=[32m"mt-1.5"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<p[39m
|
|||
|
|
[33mclass[39m=[32m"text-xs text-destructive flex items-center gap-1.5"[39m
|
|||
|
|
[33mrole[39m=[32m"alert"[39m
|
|||
|
|
[36m>[39m
|
|||
|
|
[36m<svg[39m
|
|||
|
|
[33mclass[39m=[32m"lucide lucide-x h-3 w-3"[39m
|
|||
|
|
[33mfill[39m=[32m"none"[39m
|
|||
|
|
[33mheight[39m=[32m"24"[39m
|
|||
|
|
[33mstroke[39m=[32m"currentColor"[39m
|
|||
|
|
[33mstroke-linecap[39m=[32m"round"[39m
|
|||
|
|
[33mstroke-linejoin[39m=[32m"round"[39m
|
|||
|
|
[33mstroke-width[39m=[32m"2"[39m
|
|||
|
|
[33mviewBox[3...
|
|||
|
|
✓ src/services/searchService.test.ts (4 tests) 2484ms
|
|||
|
|
✓ searchService > global > should return search results 619ms
|
|||
|
|
✓ searchService > global > should filter results by query 615ms
|
|||
|
|
✓ searchService > global > should return empty results for no matches 604ms
|
|||
|
|
✓ searchService > global > should handle pagination 625ms
|
|||
|
|
stdout | src/services/analyticsService.test.ts > analyticsService > recordEvent > should record an event successfully
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /csrf-token {"key":"GET:/api/v1/csrf-token:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/services/analyticsService.test.ts > analyticsService > recordEvent > should record an event successfully
|
|||
|
|
[INFO] [ResponseCache] Cache cleared (1 entries)
|
|||
|
|
[DEBUG] [StateInvalidation] Cleared all response cache
|
|||
|
|
[DEBUG] [StateInvalidation] State invalidated {"target":"cache","invalidateAll":true}
|
|||
|
|
|
|||
|
|
stdout | src/services/analyticsService.test.ts > analyticsService > recordEvent > should record an event successfully
|
|||
|
|
[DEBUG] [Analytics] Event recorded {"event_name":"test_event","payload":{}}
|
|||
|
|
|
|||
|
|
stdout | src/services/analyticsService.test.ts > analyticsService > recordEvent > should handle different event types
|
|||
|
|
[INFO] [ResponseCache] Cache cleared (0 entries)
|
|||
|
|
[DEBUG] [StateInvalidation] Cleared all response cache
|
|||
|
|
[DEBUG] [StateInvalidation] State invalidated {"target":"cache","invalidateAll":true}
|
|||
|
|
|
|||
|
|
stdout | src/services/analyticsService.test.ts > analyticsService > recordEvent > should handle different event types
|
|||
|
|
[DEBUG] [Analytics] Event recorded {"event_name":"click","payload":{}}
|
|||
|
|
|
|||
|
|
stdout | src/services/analyticsService.test.ts > analyticsService > recordEvent > should handle different event types
|
|||
|
|
[INFO] [ResponseCache] Cache cleared (0 entries)
|
|||
|
|
[DEBUG] [StateInvalidation] Cleared all response cache
|
|||
|
|
[DEBUG] [StateInvalidation] State invalidated {"target":"cache","invalidateAll":true}
|
|||
|
|
|
|||
|
|
stdout | src/services/analyticsService.test.ts > analyticsService > recordEvent > should handle different event types
|
|||
|
|
[DEBUG] [Analytics] Event recorded {"event_name":"view","payload":{}}
|
|||
|
|
|
|||
|
|
stdout | src/services/analyticsService.test.ts > analyticsService > recordEvent > should handle different event types
|
|||
|
|
[INFO] [ResponseCache] Cache cleared (0 entries)
|
|||
|
|
[DEBUG] [StateInvalidation] Cleared all response cache
|
|||
|
|
[DEBUG] [StateInvalidation] State invalidated {"target":"cache","invalidateAll":true}
|
|||
|
|
|
|||
|
|
stdout | src/services/analyticsService.test.ts > analyticsService > recordEvent > should handle different event types
|
|||
|
|
[DEBUG] [Analytics] Event recorded {"event_name":"download","payload":{}}
|
|||
|
|
|
|||
|
|
stdout | src/services/analyticsService.test.ts > analyticsService > recordEvent > should handle different event types
|
|||
|
|
[INFO] [ResponseCache] Cache cleared (0 entries)
|
|||
|
|
[DEBUG] [StateInvalidation] Cleared all response cache
|
|||
|
|
[DEBUG] [StateInvalidation] State invalidated {"target":"cache","invalidateAll":true}
|
|||
|
|
|
|||
|
|
stdout | src/services/analyticsService.test.ts > analyticsService > recordEvent > should handle different event types
|
|||
|
|
[DEBUG] [Analytics] Event recorded {"event_name":"play","payload":{}}
|
|||
|
|
|
|||
|
|
stdout | src/services/analyticsService.test.ts > analyticsService > getGlobalStats > should return global statistics
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /analytics {"key":"GET:/api/v1/analytics?days=\"30\":","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/services/analyticsService.test.ts > analyticsService > getGlobalStats > should return global statistics
|
|||
|
|
[INFO] [Analytics] Backend returned empty stats, using baseline defaults
|
|||
|
|
|
|||
|
|
stdout | src/services/analyticsService.test.ts > analyticsService > getGlobalStats > should handle different time ranges
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /analytics {"key":"GET:/api/v1/analytics?days=\"7\":","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/services/analyticsService.test.ts > analyticsService > getGlobalStats > should handle different time ranges
|
|||
|
|
[INFO] [Analytics] Backend returned empty stats, using baseline defaults
|
|||
|
|
|
|||
|
|
stdout | src/services/analyticsService.test.ts > analyticsService > getGlobalStats > should handle different time ranges
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /analytics {"key":"GET:/api/v1/analytics?days=\"30\":","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/services/analyticsService.test.ts > analyticsService > getGlobalStats > should handle different time ranges
|
|||
|
|
[INFO] [Analytics] Backend returned empty stats, using baseline defaults
|
|||
|
|
|
|||
|
|
stdout | src/services/analyticsService.test.ts > analyticsService > getGlobalStats > should handle different time ranges
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /analytics {"key":"GET:/api/v1/analytics?days=\"90\":","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/services/analyticsService.test.ts > analyticsService > getGlobalStats > should handle different time ranges
|
|||
|
|
[INFO] [Analytics] Backend returned empty stats, using baseline defaults
|
|||
|
|
|
|||
|
|
stdout | src/services/analyticsService.test.ts > analyticsService > getGlobalStats > should handle different time ranges
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /analytics {"key":"GET:/api/v1/analytics?days=\"all\":","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/services/analyticsService.test.ts > analyticsService > getGlobalStats > should handle different time ranges
|
|||
|
|
[INFO] [Analytics] Backend returned empty stats, using baseline defaults
|
|||
|
|
|
|||
|
|
stdout | src/services/analyticsService.test.ts > analyticsService > getTopTracks > should return top tracks
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /analytics/tracks/top {"key":"GET:/api/v1/analytics/tracks/top?days=\"30\":","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/services/analyticsService.test.ts > analyticsService > getTopTracks > should handle different time ranges
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /analytics/tracks/top {"key":"GET:/api/v1/analytics/tracks/top?days=\"7\":","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/services/analyticsService.test.ts > analyticsService > getTopTracks > should handle different time ranges
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /analytics/tracks/top {"key":"GET:/api/v1/analytics/tracks/top?days=\"30\":","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/services/analyticsService.test.ts > analyticsService > getTopTracks > should handle different time ranges
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /analytics/tracks/top {"key":"GET:/api/v1/analytics/tracks/top?days=\"90\":","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/services/analyticsService.test.ts > analyticsService > getTopTracks > should handle different time ranges
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /analytics/tracks/top {"key":"GET:/api/v1/analytics/tracks/top?days=\"all\":","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
✓ src/services/analyticsService.test.ts (7 tests) 2262ms
|
|||
|
|
✓ analyticsService > recordEvent > should record an event successfully 391ms
|
|||
|
|
✓ analyticsService > recordEvent > should handle different event types 567ms
|
|||
|
|
✓ analyticsService > getGlobalStats > should handle different time ranges 535ms
|
|||
|
|
✓ analyticsService > getTopTracks > should handle different time ranges 378ms
|
|||
|
|
stdout | src/features/user/components/ProfileForm.test.tsx > ProfileForm Component > renders profile form correctly
|
|||
|
|
[ERROR] Failed to load profile completion:
|
|||
|
|
|
|||
|
|
stdout | src/features/user/components/ProfileForm.test.tsx > ProfileForm Component > displays user information
|
|||
|
|
[ERROR] Failed to load profile completion:
|
|||
|
|
|
|||
|
|
stdout | src/features/user/components/ProfileForm.test.tsx > ProfileForm Component > enables editing mode when edit button is clicked
|
|||
|
|
[ERROR] Failed to load profile completion:
|
|||
|
|
|
|||
|
|
✓ src/services/groupService.test.ts (5 tests) 2477ms
|
|||
|
|
✓ groupService > list > should return list of groups 534ms
|
|||
|
|
✓ groupService > get > should return group details 303ms
|
|||
|
|
✓ groupService > create > should create a new group 806ms
|
|||
|
|
✓ groupService > join > should join a group 405ms
|
|||
|
|
✓ groupService > leave > should leave a group 408ms
|
|||
|
|
stdout | src/features/user/components/ProfileForm.test.tsx > ProfileForm Component > validates form fields
|
|||
|
|
[ERROR] Failed to load profile completion:
|
|||
|
|
|
|||
|
|
✓ src/features/tracks/components/CommentThread.test.tsx (18 tests) 2995ms
|
|||
|
|
✓ CommentThread > should show reply form when reply button is clicked 309ms
|
|||
|
|
✓ CommentThread > should submit reply 656ms
|
|||
|
|
✓ CommentThread > should submit edited comment 507ms
|
|||
|
|
✓ CommentThread > should delete comment when confirmed 332ms
|
|||
|
|
stdout | src/features/playlists/pages/PlaylistDetailPage.test.tsx > PlaylistDetailPage > should open add track modal when button is clicked
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /playlists/1/collaborators {"key":"GET:/api/v1/playlists/1/collaborators:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/features/auth/pages/SessionsPage.test.tsx > SessionsPage > should display error when fetch fails
|
|||
|
|
[ERROR] Failed to fetch sessions {"message":"Failed to load sessions"}
|
|||
|
|
|
|||
|
|
stdout | src/features/playlists/pages/PlaylistDetailPage.test.tsx > PlaylistDetailPage > should open add track modal when button is clicked
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /playlists/1/collaborators {"key":"GET:/api/v1/playlists/1/collaborators:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/features/playlists/pages/PlaylistDetailPage.test.tsx > PlaylistDetailPage > should open add track modal when button is clicked
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /playlists/1/collaborators {"key":"GET:/api/v1/playlists/1/collaborators:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/features/playlists/pages/PlaylistDetailPage.test.tsx > PlaylistDetailPage > should open add track modal when button is clicked
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /playlists/1/collaborators {"key":"GET:/api/v1/playlists/1/collaborators:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/features/playlists/pages/PlaylistDetailPage.test.tsx > PlaylistDetailPage > should open add track modal when button is clicked
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /playlists/1/collaborators {"key":"GET:/api/v1/playlists/1/collaborators:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/features/user/components/ProfileForm.test.tsx > ProfileForm Component > allows form submission with valid data
|
|||
|
|
[ERROR] Failed to load profile completion:
|
|||
|
|
|
|||
|
|
stdout | src/features/auth/pages/SessionsPage.test.tsx > SessionsPage > should display error when revoke fails
|
|||
|
|
[ERROR] Failed to revoke session {"message":"Failed to revoke session","sessionId":"2"}
|
|||
|
|
|
|||
|
|
stdout | src/features/playlists/pages/PlaylistDetailPage.test.tsx > PlaylistDetailPage > should close add track modal when close button is clicked
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /playlists/1/collaborators {"key":"GET:/api/v1/playlists/1/collaborators:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
✓ src/features/auth/pages/SessionsPage.test.tsx (9 tests) 1835ms
|
|||
|
|
✓ SessionsPage > should display sessions correctly 306ms
|
|||
|
|
✓ SessionsPage > should revoke a specific session 537ms
|
|||
|
|
✓ src/features/playlists/components/PlaylistForm.test.tsx (12 tests | 1 skipped) 2768ms
|
|||
|
|
✓ PlaylistForm > should render form with default values for create mode 534ms
|
|||
|
|
✓ PlaylistForm > should validate title max length 1352ms
|
|||
|
|
stdout | src/features/playlists/pages/PlaylistDetailPage.test.tsx > PlaylistDetailPage > should refetch playlist when track is removed
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /playlists/1/collaborators {"key":"GET:/api/v1/playlists/1/collaborators:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/features/user/components/ProfileForm.test.tsx > ProfileForm Component > cancels editing and resets form
|
|||
|
|
[ERROR] Failed to load profile completion:
|
|||
|
|
|
|||
|
|
stdout | src/features/playlists/pages/PlaylistDetailPage.test.tsx > PlaylistDetailPage > should refetch playlist when track is added
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /playlists/1/collaborators {"key":"GET:/api/v1/playlists/1/collaborators:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/features/user/components/ProfileForm.test.tsx > ProfileForm Component > handles avatar upload
|
|||
|
|
[ERROR] Failed to load profile completion:
|
|||
|
|
|
|||
|
|
✓ src/features/user/components/ProfileForm.test.tsx (7 tests) 2901ms
|
|||
|
|
✓ ProfileForm Component > renders profile form correctly 359ms
|
|||
|
|
✓ ProfileForm Component > enables editing mode when edit button is clicked 465ms
|
|||
|
|
✓ ProfileForm Component > validates form fields 885ms
|
|||
|
|
✓ ProfileForm Component > allows form submission with valid data 453ms
|
|||
|
|
✓ ProfileForm Component > cancels editing and resets form 436ms
|
|||
|
|
✓ src/features/tracks/components/TrackList.test.tsx (28 tests) 1754ms
|
|||
|
|
stdout | src/features/playlists/pages/PlaylistDetailPage.test.tsx > PlaylistDetailPage > should open share modal when share button is clicked
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /playlists/1/collaborators {"key":"GET:/api/v1/playlists/1/collaborators:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/features/playlists/pages/PlaylistDetailPage.test.tsx > PlaylistDetailPage > should open share modal when share button is clicked
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /playlists/1/collaborators {"key":"GET:/api/v1/playlists/1/collaborators:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
✓ src/features/player/__tests__/player.e2e.test.tsx (21 tests) 2144ms
|
|||
|
|
stdout | src/features/playlists/pages/PlaylistDetailPage.test.tsx
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /playlists/1/collaborators {"key":"GET:/api/v1/playlists/1/collaborators:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/features/playlists/pages/PlaylistDetailPage.test.tsx
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /playlists/1/collaborators {"key":"GET:/api/v1/playlists/1/collaborators:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/features/playlists/pages/PlaylistDetailPage.test.tsx
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /playlists/1/collaborators {"key":"GET:/api/v1/playlists/1/collaborators:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/features/playlists/pages/PlaylistDetailPage.test.tsx
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /playlists/1/collaborators {"key":"GET:/api/v1/playlists/1/collaborators:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
✓ src/features/playlists/pages/PlaylistDetailPage.test.tsx (18 tests | 1 skipped) 4195ms
|
|||
|
|
✓ PlaylistDetailPage > should render playlist title 403ms
|
|||
|
|
✓ PlaylistDetailPage > should render playlist actions (Play All, Shuffle, Follow) 346ms
|
|||
|
|
✓ PlaylistDetailPage > should open add track modal when button is clicked 919ms
|
|||
|
|
✓ PlaylistDetailPage > should refetch playlist when track is removed 356ms
|
|||
|
|
✓ PlaylistDetailPage > should refetch playlist when track is added 314ms
|
|||
|
|
✓ PlaylistDetailPage > should open share modal when share button is clicked 343ms
|
|||
|
|
✓ src/components/ui/date-picker.test.tsx (17 tests) 2928ms
|
|||
|
|
✓ DatePicker Component > opens calendar when trigger is clicked 532ms
|
|||
|
|
✓ DatePicker Component > navigates to previous month 346ms
|
|||
|
|
✓ DatePicker Component > navigates to next month 386ms
|
|||
|
|
✓ src/features/tracks/components/TrackFilters.test.tsx (30 tests) 2432ms
|
|||
|
|
✓ TrackFilters > should call onSearchChange when search input changes 625ms
|
|||
|
|
✓ src/services/storageService.test.ts (5 tests) 2053ms
|
|||
|
|
✓ storageService > listFiles > should return list of files 429ms
|
|||
|
|
✓ storageService > listFiles > should list files in specific folder 404ms
|
|||
|
|
✓ storageService > deleteFiles > should delete files 502ms
|
|||
|
|
✓ storageService > moveFiles > should move files to target folder 503ms
|
|||
|
|
✓ src/components/data/Table.test.tsx (20 tests) 1859ms
|
|||
|
|
✓ Table Component > maintains selection across pages when paginated 568ms
|
|||
|
|
✓ src/features/auth/components/TwoFactorVerify.test.tsx (10 tests) 2292ms
|
|||
|
|
✓ TwoFactorVerify > should allow entering verification code 474ms
|
|||
|
|
✓ TwoFactorVerify > should call onSuccess with backup code 518ms
|
|||
|
|
✓ src/services/commerceService.test.ts (3 tests) 1855ms
|
|||
|
|
✓ commerceService > getPurchases > should return purchases 615ms
|
|||
|
|
✓ commerceService > getSellerStats > should return sales statistics 405ms
|
|||
|
|
✓ commerceService > requestRefund > should request refund successfully 810ms
|
|||
|
|
✓ src/features/playlists/components/AddTrackToPlaylistModal.test.tsx (10 tests) 2379ms
|
|||
|
|
✓ AddTrackToPlaylistModal > should render modal when open 394ms
|
|||
|
|
✓ AddTrackToPlaylistModal > should search tracks when query is entered 539ms
|
|||
|
|
✓ AddTrackToPlaylistModal > should add selected tracks to playlist 401ms
|
|||
|
|
✓ src/features/auth/pages/ForgotPasswordPage.test.tsx (10 tests) 1919ms
|
|||
|
|
✓ ForgotPasswordPage > should render forgot password form 507ms
|
|||
|
|
✓ ForgotPasswordPage > should validate email format 357ms
|
|||
|
|
✓ ForgotPasswordPage > should call handleRequestReset with email on valid submission 366ms
|
|||
|
|
✓ src/features/tracks/components/TrackSearch.test.tsx (5 tests) 1637ms
|
|||
|
|
✓ TrackSearch > should perform search when query changes 534ms
|
|||
|
|
✓ TrackSearch > should perform search when search button is clicked 423ms
|
|||
|
|
✓ TrackSearch > should perform search on Enter key press 349ms
|
|||
|
|
stdout | src/components/layout/DashboardLayout.test.tsx > DashboardLayout Component
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/components/layout/DashboardLayout.test.tsx > DashboardLayout Component
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/components/layout/DashboardLayout.test.tsx > DashboardLayout Component
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/components/layout/DashboardLayout.test.tsx > DashboardLayout Component
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
✓ src/features/profile/components/AvatarUpload.test.tsx (8 tests) 1685ms
|
|||
|
|
✓ AvatarUpload > should validate file format 318ms
|
|||
|
|
✓ AvatarUpload > should validate file size 865ms
|
|||
|
|
stdout | src/components/layout/DashboardLayout.test.tsx > DashboardLayout Component
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/components/layout/DashboardLayout.test.tsx
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/components/layout/DashboardLayout.test.tsx
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /notifications?limit=50 {"key":"GET:/api/v1/notifications?limit=50:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/components/layout/DashboardLayout.test.tsx
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /notifications?limit=50 {"key":"GET:/api/v1/notifications?limit=50:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/components/layout/DashboardLayout.test.tsx
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /notifications?limit=50 {"key":"GET:/api/v1/notifications?limit=50:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/components/layout/DashboardLayout.test.tsx
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /notifications?limit=50 {"key":"GET:/api/v1/notifications?limit=50:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/components/layout/DashboardLayout.test.tsx
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /notifications?limit=50 {"key":"GET:/api/v1/notifications?limit=50:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/components/layout/DashboardLayout.test.tsx
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /notifications?limit=50 {"key":"GET:/api/v1/notifications?limit=50:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
✓ src/components/layout/DashboardLayout.test.tsx (6 tests) 2414ms
|
|||
|
|
✓ DashboardLayout Component > renders layout with sidebar and header 765ms
|
|||
|
|
✓ DashboardLayout Component > renders children content in main section 310ms
|
|||
|
|
✓ DashboardLayout Component > renders Sidebar component 351ms
|
|||
|
|
✓ DashboardLayout Component > renders multiple children correctly 321ms
|
|||
|
|
stdout | src/features/playlists/components/CreatePlaylistDialog.test.tsx > CreatePlaylistDialog > should handle creation error
|
|||
|
|
[ERROR] Failed to create playlist: {"error":{}}
|
|||
|
|
|
|||
|
|
✓ src/features/playlists/components/CreatePlaylistDialog.test.tsx (6 tests) 1378ms
|
|||
|
|
✓ CreatePlaylistDialog > should create playlist on form submit 617ms
|
|||
|
|
✓ CreatePlaylistDialog > should handle creation error 309ms
|
|||
|
|
✓ src/__tests__/accessibility.test.tsx (22 tests) 1424ms
|
|||
|
|
✓ Accessibility Tests > Keyboard Navigation > should navigate through form fields with Tab key 486ms
|
|||
|
|
✓ src/features/player/components/PlaybackSpeedControl.test.tsx (16 tests) 1275ms
|
|||
|
|
✓ src/features/tracks/components/TrackGrid.test.tsx (29 tests) 1396ms
|
|||
|
|
✓ TrackGrid > should render track grid 334ms
|
|||
|
|
✓ src/components/filters/Filters.test.tsx (18 tests) 1431ms
|
|||
|
|
✓ Filters Component > calls onChange when select filter value changes 373ms
|
|||
|
|
stdout | src/features/playlists/components/PlaylistFollowButton.test.tsx > PlaylistFollowButton > should render follow button when not following
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/features/playlists/components/PlaylistFollowButton.test.tsx > PlaylistFollowButton > should render unfollow button when following
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/features/playlists/components/PlaylistFollowButton.test.tsx > PlaylistFollowButton > should not render for playlist owner
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/features/playlists/components/PlaylistFollowButton.test.tsx > PlaylistFollowButton > should not render when user is not logged in
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/features/playlists/components/PlaylistFollowButton.test.tsx > PlaylistFollowButton > should call followPlaylist when follow button is clicked
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
✓ src/services/chatService.test.ts (4 tests) 1536ms
|
|||
|
|
✓ chatService > getServers > should return servers with channels 525ms
|
|||
|
|
✓ chatService > getDMs > should return direct messages 403ms
|
|||
|
|
✓ chatService > getMessages > should return messages for a channel 302ms
|
|||
|
|
stdout | src/features/playlists/components/PlaylistFollowButton.test.tsx > PlaylistFollowButton > should call unfollowPlaylist when unfollow button is clicked
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/features/playlists/components/PlaylistFollowButton.test.tsx > PlaylistFollowButton > should show success message on follow
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/features/playlists/components/PlaylistFollowButton.test.tsx > PlaylistFollowButton > should show success message on unfollow
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/features/playlists/components/PlaylistFollowButton.test.tsx > PlaylistFollowButton > should show error message on follow failure
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/features/playlists/components/PlaylistFollowButton.test.tsx > PlaylistFollowButton > should show follower count when showCount is true
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/features/playlists/components/PlaylistFollowButton.test.tsx > PlaylistFollowButton > should update follower count optimistically
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/features/playlists/components/PlaylistFollowButton.test.tsx > PlaylistFollowButton > should call onFollowChange callback
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/features/playlists/components/PlaylistFollowButton.test.tsx > PlaylistFollowButton > should be disabled during update
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
✓ src/features/playlists/components/PlaylistFollowButton.test.tsx (13 tests) 1986ms
|
|||
|
|
✓ PlaylistFollowButton > should render follow button when not following 302ms
|
|||
|
|
✓ PlaylistFollowButton > should call followPlaylist when follow button is clicked 439ms
|
|||
|
|
stdout | src/test/stores.test.ts > Zustand Stores > Auth Store > should handle login action
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /csrf-token {"key":"GET:/api/v1/csrf-token:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/test/stores.test.ts > Zustand Stores > Auth Store > should handle clearError action
|
|||
|
|
[WARN] [StateInvalidation] QueryClient not available, falling back to event system
|
|||
|
|
[DEBUG] [StateInvalidation] State invalidated {"target":"all","resourceType":"users","resourceId":"logout","invalidateAll":false}
|
|||
|
|
[WARN] [StateInvalidation] QueryClient not available, falling back to event system
|
|||
|
|
[DEBUG] [StateInvalidation] State invalidated {"target":"all","resourceType":"users","resourceId":"logout","invalidateAll":false}
|
|||
|
|
|
|||
|
|
stdout | src/features/tracks/pages/TrackDetailPage.test.tsx > TrackDetailPage > should render track details after loading
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /tracks/1/comments?page=1&limit=20 {"key":"GET:/api/v1/tracks/1/comments?page=1&limit=20:","maxAge":300,"etag":"none"}
|
|||
|
|
[WARN] [API] Received non-wrapped response format (unexpected) {"request_id":"req_1771008318099_p3fak8lyw","url":"/tracks/1/comments?page=1&limit=20","method":"GET","status":200,"response_preview":"{\"data\":[{\"id\":\"track-1\",\"title\":\"Storybook Track\",\"artist\":\"Test Artist\",\"duration\":240,\"cover_url\":\"https://picsum.photos/200\",\"coverUrl\":\"https://picsum.photos/200\",\"genre\":\"Pop\",\"created_at\":\"2024","timestamp":"2026-02-13T18:45:18.100Z"}
|
|||
|
|
|
|||
|
|
stdout | src/test/stores.test.ts > Zustand Stores > Auth Store
|
|||
|
|
[WARN] [StateInvalidation] QueryClient not available, falling back to event system
|
|||
|
|
[DEBUG] [StateInvalidation] State invalidated {"target":"all","resourceType":"users","resourceId":"logout","invalidateAll":false}
|
|||
|
|
|
|||
|
|
✓ src/features/playlists/components/PlaylistSearch.test.tsx (7 tests) 1416ms
|
|||
|
|
✓ PlaylistSearch > should display search results 339ms
|
|||
|
|
stdout | src/test/stores.test.ts > Zustand Stores > Auth Store
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
|
|||
|
|
[INFO] [ResponseCache] Invalidated 1 cache entries for pattern: /auth/me
|
|||
|
|
[WARN] [StateInvalidation] QueryClient not available, falling back to event system
|
|||
|
|
[DEBUG] [StateInvalidation] State invalidated {"target":"all","resourceType":"users","resourceId":"logout","invalidateAll":false}
|
|||
|
|
|
|||
|
|
stdout | src/test/stores.test.ts > Zustand Stores > Auth Store > should clear authentication state on logout
|
|||
|
|
[INFO] [Auth] Performing local logout (no API call)
|
|||
|
|
|
|||
|
|
stdout | src/test/stores.test.ts > Zustand Stores > Auth Store > should clear authentication state on logout
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /csrf-token {"key":"GET:/api/v1/csrf-token:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/test/stores.test.ts > Zustand Stores > Auth Store > should clear authentication state on logout
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/test/stores.test.ts > Zustand Stores > UI Store > should have initial state
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /csrf-token {"key":"GET:/api/v1/csrf-token:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/test/stores.test.ts > Zustand Stores > UI Store > should have initial state
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/test/stores.test.ts > Zustand Stores > UI Store > should have initial state
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /csrf-token {"key":"GET:/api/v1/csrf-token:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/test/stores.test.ts > Zustand Stores > UI Store
|
|||
|
|
[INFO] [ResponseCache] Invalidated 1 cache entries for pattern: /auth/me
|
|||
|
|
[WARN] [StateInvalidation] QueryClient not available, falling back to event system
|
|||
|
|
[DEBUG] [StateInvalidation] State invalidated {"target":"all","resourceType":"users","resourceId":"logout","invalidateAll":false}
|
|||
|
|
|
|||
|
|
stdout | src/test/stores.test.ts > Zustand Stores > UI Store > should handle theme changes
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /csrf-token {"key":"GET:/api/v1/csrf-token:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/test/stores.test.ts > Zustand Stores > UI Store
|
|||
|
|
[WARN] [StateInvalidation] QueryClient not available, falling back to event system
|
|||
|
|
[DEBUG] [StateInvalidation] State invalidated {"target":"all","resourceType":"users","resourceId":"logout","invalidateAll":false}
|
|||
|
|
|
|||
|
|
stdout | src/test/stores.test.ts > Zustand Stores > UI Store
|
|||
|
|
[WARN] [StateInvalidation] QueryClient not available, falling back to event system
|
|||
|
|
[DEBUG] [StateInvalidation] State invalidated {"target":"all","resourceType":"users","resourceId":"logout","invalidateAll":false}
|
|||
|
|
|
|||
|
|
stdout | src/test/stores.test.ts > Zustand Stores > UI Store > should handle language changes
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /csrf-token {"key":"GET:/api/v1/csrf-token:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/features/tracks/pages/TrackDetailPage.test.tsx > TrackDetailPage > should play track when play button is clicked
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /tracks/1/comments?page=1&limit=20 {"key":"GET:/api/v1/tracks/1/comments?page=1&limit=20:","maxAge":300,"etag":"none"}
|
|||
|
|
[WARN] [API] Received non-wrapped response format (unexpected) {"request_id":"req_1771008318743_mw9u8uj9j","url":"/tracks/1/comments?page=1&limit=20","method":"GET","status":200,"response_preview":"{\"data\":[{\"id\":\"track-1\",\"title\":\"Storybook Track\",\"artist\":\"Test Artist\",\"duration\":240,\"cover_url\":\"https://picsum.photos/200\",\"coverUrl\":\"https://picsum.photos/200\",\"genre\":\"Pop\",\"created_at\":\"2024","timestamp":"2026-02-13T18:45:18.743Z"}
|
|||
|
|
|
|||
|
|
stdout | src/test/stores.test.ts > Zustand Stores > UI Store > should handle language changes
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/test/stores.test.ts > Zustand Stores > UI Store > should handle sidebar toggle
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /csrf-token {"key":"GET:/api/v1/csrf-token:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/test/stores.test.ts > Zustand Stores > UI Store > should handle sidebar toggle
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/test/stores.test.ts > Zustand Stores > UI Store > should handle sidebar toggle
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/test/stores.test.ts > Zustand Stores > UI Store
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /csrf-token {"key":"GET:/api/v1/csrf-token:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/test/stores.test.ts > Zustand Stores > Chat Store
|
|||
|
|
[INFO] [ResponseCache] Invalidated 1 cache entries for pattern: /auth/me
|
|||
|
|
[WARN] [StateInvalidation] QueryClient not available, falling back to event system
|
|||
|
|
[DEBUG] [StateInvalidation] State invalidated {"target":"all","resourceType":"users","resourceId":"logout","invalidateAll":false}
|
|||
|
|
|
|||
|
|
✓ src/components/navigation/Tabs.test.tsx (24 tests) 1630ms
|
|||
|
|
stdout | src/test/stores.test.ts > Zustand Stores > Chat Store > should have initial state
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /csrf-token {"key":"GET:/api/v1/csrf-token:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/test/stores.test.ts > Zustand Stores > Chat Store > should have initial state
|
|||
|
|
[WARN] [StateInvalidation] QueryClient not available, falling back to event system
|
|||
|
|
[DEBUG] [StateInvalidation] State invalidated {"target":"all","resourceType":"users","resourceId":"logout","invalidateAll":false}
|
|||
|
|
|
|||
|
|
stdout | src/test/stores.test.ts > Zustand Stores > Chat Store
|
|||
|
|
[WARN] [StateInvalidation] QueryClient not available, falling back to event system
|
|||
|
|
[DEBUG] [StateInvalidation] State invalidated {"target":"all","resourceType":"users","resourceId":"logout","invalidateAll":false}
|
|||
|
|
|
|||
|
|
stdout | src/test/stores.test.ts > Zustand Stores > Chat Store > should handle conversation actions
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /csrf-token {"key":"GET:/api/v1/csrf-token:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/test/stores.test.ts > Zustand Stores > Chat Store > should handle conversation actions
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/test/stores.test.ts > Zustand Stores > Chat Store > should handle message actions
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /csrf-token {"key":"GET:/api/v1/csrf-token:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/test/stores.test.ts > Zustand Stores > Chat Store > should handle message actions
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/test/stores.test.ts > Zustand Stores > Chat Store > should handle message actions
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/test/stores.test.ts > Zustand Stores > Chat Store
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /csrf-token {"key":"GET:/api/v1/csrf-token:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/test/stores.test.ts > Zustand Stores > Library Store
|
|||
|
|
[INFO] [ResponseCache] Invalidated 1 cache entries for pattern: /auth/me
|
|||
|
|
[WARN] [StateInvalidation] QueryClient not available, falling back to event system
|
|||
|
|
[DEBUG] [StateInvalidation] State invalidated {"target":"all","resourceType":"users","resourceId":"logout","invalidateAll":false}
|
|||
|
|
|
|||
|
|
stdout | src/test/stores.test.ts > Zustand Stores > Library Store > should have initial state
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /csrf-token {"key":"GET:/api/v1/csrf-token:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/test/stores.test.ts > Zustand Stores > Library Store > should have initial state
|
|||
|
|
[WARN] [StateInvalidation] QueryClient not available, falling back to event system
|
|||
|
|
[DEBUG] [StateInvalidation] State invalidated {"target":"all","resourceType":"users","resourceId":"logout","invalidateAll":false}
|
|||
|
|
|
|||
|
|
stdout | src/test/stores.test.ts > Zustand Stores > Library Store
|
|||
|
|
[WARN] [StateInvalidation] QueryClient not available, falling back to event system
|
|||
|
|
[DEBUG] [StateInvalidation] State invalidated {"target":"all","resourceType":"users","resourceId":"logout","invalidateAll":false}
|
|||
|
|
|
|||
|
|
stdout | src/test/stores.test.ts > Zustand Stores > Library Store > should handle filter actions
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /csrf-token {"key":"GET:/api/v1/csrf-token:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
✓ src/features/tracks/components/TrackHistory.test.tsx (10 tests) 1439ms
|
|||
|
|
✓ TrackHistory > should render loading state initially 420ms
|
|||
|
|
stdout | src/test/stores.test.ts > Zustand Stores > Library Store > should handle filter actions
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/test/stores.test.ts > Zustand Stores > Player Store > should have initial state
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /csrf-token {"key":"GET:/api/v1/csrf-token:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/test/stores.test.ts > Zustand Stores > Player Store > should have initial state
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/test/stores.test.ts > Zustand Stores > Player Store > should have initial state
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/test/stores.test.ts > Zustand Stores > Player Store > should have initial state
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /csrf-token {"key":"GET:/api/v1/csrf-token:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/features/tracks/pages/TrackDetailPage.test.tsx > TrackDetailPage > should pause track when pause button is clicked if track is playing
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /tracks/1/comments?page=1&limit=20 {"key":"GET:/api/v1/tracks/1/comments?page=1&limit=20:","maxAge":300,"etag":"none"}
|
|||
|
|
[WARN] [API] Received non-wrapped response format (unexpected) {"request_id":"req_1771008319315_iauforwz5","url":"/tracks/1/comments?page=1&limit=20","method":"GET","status":200,"response_preview":"{\"data\":[{\"id\":\"track-1\",\"title\":\"Storybook Track\",\"artist\":\"Test Artist\",\"duration\":240,\"cover_url\":\"https://picsum.photos/200\",\"coverUrl\":\"https://picsum.photos/200\",\"genre\":\"Pop\",\"created_at\":\"2024","timestamp":"2026-02-13T18:45:19.315Z"}
|
|||
|
|
|
|||
|
|
stdout | src/test/stores.test.ts > Zustand Stores > Player Store
|
|||
|
|
[INFO] [ResponseCache] Invalidated 1 cache entries for pattern: /auth/me
|
|||
|
|
[WARN] [StateInvalidation] QueryClient not available, falling back to event system
|
|||
|
|
[DEBUG] [StateInvalidation] State invalidated {"target":"all","resourceType":"users","resourceId":"logout","invalidateAll":false}
|
|||
|
|
|
|||
|
|
stdout | src/test/stores.test.ts > Zustand Stores > Player Store > should handle play action
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /csrf-token {"key":"GET:/api/v1/csrf-token:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/test/stores.test.ts > Zustand Stores > Player Store
|
|||
|
|
[WARN] [StateInvalidation] QueryClient not available, falling back to event system
|
|||
|
|
[DEBUG] [StateInvalidation] State invalidated {"target":"all","resourceType":"users","resourceId":"logout","invalidateAll":false}
|
|||
|
|
|
|||
|
|
stdout | src/test/stores.test.ts > Zustand Stores > Player Store
|
|||
|
|
[WARN] [StateInvalidation] QueryClient not available, falling back to event system
|
|||
|
|
[DEBUG] [StateInvalidation] State invalidated {"target":"all","resourceType":"users","resourceId":"logout","invalidateAll":false}
|
|||
|
|
|
|||
|
|
stdout | src/test/stores.test.ts > Zustand Stores > Player Store > should handle pause action
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /csrf-token {"key":"GET:/api/v1/csrf-token:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/test/stores.test.ts > Zustand Stores > Player Store > should handle pause action
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/test/stores.test.ts > Zustand Stores > Player Store > should handle resume action
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /csrf-token {"key":"GET:/api/v1/csrf-token:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/test/stores.test.ts > Zustand Stores > Player Store > should handle resume action
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/test/stores.test.ts > Zustand Stores > Player Store > should handle resume action
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/test/stores.test.ts > Zustand Stores > Player Store
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /csrf-token {"key":"GET:/api/v1/csrf-token:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/test/stores.test.ts > Zustand Stores > Player Store > should handle volume changes
|
|||
|
|
[INFO] [ResponseCache] Invalidated 1 cache entries for pattern: /auth/me
|
|||
|
|
[WARN] [StateInvalidation] QueryClient not available, falling back to event system
|
|||
|
|
[DEBUG] [StateInvalidation] State invalidated {"target":"all","resourceType":"users","resourceId":"logout","invalidateAll":false}
|
|||
|
|
|
|||
|
|
stdout | src/test/stores.test.ts > Zustand Stores > Player Store
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /csrf-token {"key":"GET:/api/v1/csrf-token:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/test/stores.test.ts > Zustand Stores > Player Store
|
|||
|
|
[WARN] [StateInvalidation] QueryClient not available, falling back to event system
|
|||
|
|
[DEBUG] [StateInvalidation] State invalidated {"target":"all","resourceType":"users","resourceId":"logout","invalidateAll":false}
|
|||
|
|
|
|||
|
|
stdout | src/test/stores.test.ts > Zustand Stores > Player Store > should handle toggle mute
|
|||
|
|
[WARN] [StateInvalidation] QueryClient not available, falling back to event system
|
|||
|
|
[DEBUG] [StateInvalidation] State invalidated {"target":"all","resourceType":"users","resourceId":"logout","invalidateAll":false}
|
|||
|
|
|
|||
|
|
stdout | src/test/stores.test.ts > Zustand Stores > Player Store
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
|
|||
|
|
[INFO] [ResponseCache] Invalidated 1 cache entries for pattern: /auth/me
|
|||
|
|
[WARN] [StateInvalidation] QueryClient not available, falling back to event system
|
|||
|
|
[DEBUG] [StateInvalidation] State invalidated {"target":"all","resourceType":"users","resourceId":"logout","invalidateAll":false}
|
|||
|
|
|
|||
|
|
stdout | src/test/stores.test.ts > Zustand Stores > Player Store > should handle add to queue
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /csrf-token {"key":"GET:/api/v1/csrf-token:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/test/stores.test.ts > Zustand Stores > Player Store > should handle add to queue
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/test/stores.test.ts > Zustand Stores > Player Store
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/test/stores.test.ts > Zustand Stores > Player Store > should handle clear queue
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /csrf-token {"key":"GET:/api/v1/csrf-token:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/test/stores.test.ts > Zustand Stores > Player Store > should handle clear queue
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /csrf-token {"key":"GET:/api/v1/csrf-token:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/features/tracks/pages/TrackDetailPage.test.tsx > TrackDetailPage > should add track to queue when queue button is clicked
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /tracks/1/comments?page=1&limit=20 {"key":"GET:/api/v1/tracks/1/comments?page=1&limit=20:","maxAge":300,"etag":"none"}
|
|||
|
|
[WARN] [API] Received non-wrapped response format (unexpected) {"request_id":"req_1771008319736_dpes344q5","url":"/tracks/1/comments?page=1&limit=20","method":"GET","status":200,"response_preview":"{\"data\":[{\"id\":\"track-1\",\"title\":\"Storybook Track\",\"artist\":\"Test Artist\",\"duration\":240,\"cover_url\":\"https://picsum.photos/200\",\"coverUrl\":\"https://picsum.photos/200\",\"genre\":\"Pop\",\"created_at\":\"2024","timestamp":"2026-02-13T18:45:19.736Z"}
|
|||
|
|
|
|||
|
|
stdout | src/test/stores.test.ts > Zustand Stores > Player Store > should handle clear queue
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/test/stores.test.ts > Zustand Stores > Player Store
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /csrf-token {"key":"GET:/api/v1/csrf-token:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/test/stores.test.ts > Zustand Stores > Player Store > should handle toggle shuffle
|
|||
|
|
[INFO] [ResponseCache] Invalidated 1 cache entries for pattern: /auth/me
|
|||
|
|
[WARN] [StateInvalidation] QueryClient not available, falling back to event system
|
|||
|
|
[DEBUG] [StateInvalidation] State invalidated {"target":"all","resourceType":"users","resourceId":"logout","invalidateAll":false}
|
|||
|
|
|
|||
|
|
stdout | src/test/stores.test.ts > Zustand Stores > Player Store
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /csrf-token {"key":"GET:/api/v1/csrf-token:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/test/stores.test.ts > Zustand Stores > Player Store
|
|||
|
|
[WARN] [StateInvalidation] QueryClient not available, falling back to event system
|
|||
|
|
[DEBUG] [StateInvalidation] State invalidated {"target":"all","resourceType":"users","resourceId":"logout","invalidateAll":false}
|
|||
|
|
|
|||
|
|
stdout | src/test/stores.test.ts > Zustand Stores > Player Store > should handle set repeat
|
|||
|
|
[WARN] [StateInvalidation] QueryClient not available, falling back to event system
|
|||
|
|
[DEBUG] [StateInvalidation] State invalidated {"target":"all","resourceType":"users","resourceId":"logout","invalidateAll":false}
|
|||
|
|
|
|||
|
|
stdout | src/test/stores.test.ts > Zustand Stores > Player Store
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
|
|||
|
|
[INFO] [ResponseCache] Invalidated 1 cache entries for pattern: /auth/me
|
|||
|
|
[WARN] [StateInvalidation] QueryClient not available, falling back to event system
|
|||
|
|
[DEBUG] [StateInvalidation] State invalidated {"target":"all","resourceType":"users","resourceId":"logout","invalidateAll":false}
|
|||
|
|
|
|||
|
|
stdout | src/test/stores.test.ts
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /csrf-token {"key":"GET:/api/v1/csrf-token:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/test/stores.test.ts
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/test/stores.test.ts
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/test/stores.test.ts
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /csrf-token {"key":"GET:/api/v1/csrf-token:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/test/stores.test.ts
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /auth/me {"key":"GET:/api/v1/auth/me:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/services/requestDeduplication.test.ts > RequestDeduplicationService > getOrCreateRequest > should deduplicate identical concurrent GET requests
|
|||
|
|
[INFO] [RequestDeduplication] Cache cleared (0 entries)
|
|||
|
|
|
|||
|
|
stdout | src/services/requestDeduplication.test.ts > RequestDeduplicationService > getOrCreateRequest > should deduplicate identical concurrent GET requests
|
|||
|
|
[DEBUG] [RequestDeduplication] New request: GET /api/v1/tracks {"key":"GET:/api/v1/tracks","cacheSize":1}
|
|||
|
|
[DEBUG] [RequestDeduplication] Reusing request: GET /api/v1/tracks {"key":"GET:/api/v1/tracks","resolveCount":2}
|
|||
|
|
|
|||
|
|
✓ src/test/stores.test.ts (25 tests) 2168ms
|
|||
|
|
stdout | src/features/tracks/pages/TrackDetailPage.test.tsx > TrackDetailPage > should copy share link when share button is clicked
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /tracks/1/comments?page=1&limit=20 {"key":"GET:/api/v1/tracks/1/comments?page=1&limit=20:","maxAge":300,"etag":"none"}
|
|||
|
|
[WARN] [API] Received non-wrapped response format (unexpected) {"request_id":"req_1771008320027_z0lnxtf7s","url":"/tracks/1/comments?page=1&limit=20","method":"GET","status":200,"response_preview":"{\"data\":[{\"id\":\"track-1\",\"title\":\"Storybook Track\",\"artist\":\"Test Artist\",\"duration\":240,\"cover_url\":\"https://picsum.photos/200\",\"coverUrl\":\"https://picsum.photos/200\",\"genre\":\"Pop\",\"created_at\":\"2024","timestamp":"2026-02-13T18:45:20.027Z"}
|
|||
|
|
|
|||
|
|
stdout | src/services/requestDeduplication.test.ts > RequestDeduplicationService > getOrCreateRequest > should create separate promises for different requests
|
|||
|
|
[INFO] [RequestDeduplication] Cache cleared (1 entries)
|
|||
|
|
|
|||
|
|
stdout | src/services/requestDeduplication.test.ts > RequestDeduplicationService > getOrCreateRequest > should create separate promises for different requests
|
|||
|
|
[DEBUG] [RequestDeduplication] New request: GET /api/v1/tracks {"key":"GET:/api/v1/tracks","cacheSize":1}
|
|||
|
|
[DEBUG] [RequestDeduplication] New request: GET /api/v1/playlists {"key":"GET:/api/v1/playlists","cacheSize":2}
|
|||
|
|
|
|||
|
|
stdout | src/services/requestDeduplication.test.ts > RequestDeduplicationService > getOrCreateRequest > should handle different query parameters as different requests
|
|||
|
|
[INFO] [RequestDeduplication] Cache cleared (2 entries)
|
|||
|
|
|
|||
|
|
stdout | src/services/requestDeduplication.test.ts > RequestDeduplicationService > getOrCreateRequest > should handle different query parameters as different requests
|
|||
|
|
[DEBUG] [RequestDeduplication] New request: GET /api/v1/tracks {"key":"GET:/api/v1/tracks?page=1","cacheSize":1}
|
|||
|
|
[DEBUG] [RequestDeduplication] New request: GET /api/v1/tracks {"key":"GET:/api/v1/tracks?page=2","cacheSize":2}
|
|||
|
|
|
|||
|
|
stdout | src/services/requestDeduplication.test.ts > RequestDeduplicationService > getOrCreateRequest > should deduplicate POST requests with identical data by default
|
|||
|
|
[INFO] [RequestDeduplication] Cache cleared (2 entries)
|
|||
|
|
|
|||
|
|
stdout | src/services/requestDeduplication.test.ts > RequestDeduplicationService > getOrCreateRequest > should deduplicate POST requests with identical data by default
|
|||
|
|
[DEBUG] [RequestDeduplication] New request: POST /api/v1/tracks {"key":"POST:/api/v1/tracks|{\"title\":\"Test\"}","cacheSize":1}
|
|||
|
|
[DEBUG] [RequestDeduplication] Reusing request: POST /api/v1/tracks {"key":"POST:/api/v1/tracks|{\"title\":\"Test\"}","resolveCount":2}
|
|||
|
|
|
|||
|
|
stdout | src/services/requestDeduplication.test.ts > RequestDeduplicationService > getOrCreateRequest > should remove request from cache after completion
|
|||
|
|
[INFO] [RequestDeduplication] Cache cleared (1 entries)
|
|||
|
|
|
|||
|
|
stdout | src/services/requestDeduplication.test.ts > RequestDeduplicationService > getOrCreateRequest > should remove request from cache after completion
|
|||
|
|
[DEBUG] [RequestDeduplication] New request: GET /api/v1/tracks {"key":"GET:/api/v1/tracks","cacheSize":1}
|
|||
|
|
|
|||
|
|
stdout | src/features/tracks/pages/TrackDetailPage.test.tsx > TrackDetailPage > should navigate back when back button is clicked
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /tracks/1/comments?page=1&limit=20 {"key":"GET:/api/v1/tracks/1/comments?page=1&limit=20:","maxAge":300,"etag":"none"}
|
|||
|
|
[WARN] [API] Received non-wrapped response format (unexpected) {"request_id":"req_1771008320388_oaon1axdb","url":"/tracks/1/comments?page=1&limit=20","method":"GET","status":200,"response_preview":"{\"data\":[{\"id\":\"track-1\",\"title\":\"Storybook Track\",\"artist\":\"Test Artist\",\"duration\":240,\"cover_url\":\"https://picsum.photos/200\",\"coverUrl\":\"https://picsum.photos/200\",\"genre\":\"Pop\",\"created_at\":\"2024","timestamp":"2026-02-13T18:45:20.388Z"}
|
|||
|
|
|
|||
|
|
stdout | src/features/tracks/pages/TrackDetailPage.test.tsx > TrackDetailPage > should display waveform if available
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /tracks/1/comments?page=1&limit=20 {"key":"GET:/api/v1/tracks/1/comments?page=1&limit=20:","maxAge":300,"etag":"none"}
|
|||
|
|
[WARN] [API] Received non-wrapped response format (unexpected) {"request_id":"req_1771008320661_d1yulhtq5","url":"/tracks/1/comments?page=1&limit=20","method":"GET","status":200,"response_preview":"{\"data\":[{\"id\":\"track-1\",\"title\":\"Storybook Track\",\"artist\":\"Test Artist\",\"duration\":240,\"cover_url\":\"https://picsum.photos/200\",\"coverUrl\":\"https://picsum.photos/200\",\"genre\":\"Pop\",\"created_at\":\"2024","timestamp":"2026-02-13T18:45:20.661Z"}
|
|||
|
|
|
|||
|
|
stdout | src/features/tracks/pages/TrackDetailPage.test.tsx > TrackDetailPage > should display cover art if available
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /tracks/1/comments?page=1&limit=20 {"key":"GET:/api/v1/tracks/1/comments?page=1&limit=20:","maxAge":300,"etag":"none"}
|
|||
|
|
[WARN] [API] Received non-wrapped response format (unexpected) {"request_id":"req_1771008320767_v27mqs9ia","url":"/tracks/1/comments?page=1&limit=20","method":"GET","status":200,"response_preview":"{\"data\":[{\"id\":\"track-1\",\"title\":\"Storybook Track\",\"artist\":\"Test Artist\",\"duration\":240,\"cover_url\":\"https://picsum.photos/200\",\"coverUrl\":\"https://picsum.photos/200\",\"genre\":\"Pop\",\"created_at\":\"2024","timestamp":"2026-02-13T18:45:20.767Z"}
|
|||
|
|
|
|||
|
|
✓ src/features/settings/components/PreferenceSettings.test.tsx (10 tests) 553ms
|
|||
|
|
stdout | src/features/tracks/pages/TrackDetailPage.test.tsx > TrackDetailPage > should display placeholder if no cover art
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /tracks/1/comments?page=1&limit=20 {"key":"GET:/api/v1/tracks/1/comments?page=1&limit=20:","maxAge":300,"etag":"none"}
|
|||
|
|
[WARN] [API] Received non-wrapped response format (unexpected) {"request_id":"req_1771008320923_6z60qqj0p","url":"/tracks/1/comments?page=1&limit=20","method":"GET","status":200,"response_preview":"{\"data\":[{\"id\":\"track-1\",\"title\":\"Storybook Track\",\"artist\":\"Test Artist\",\"duration\":240,\"cover_url\":\"https://picsum.photos/200\",\"coverUrl\":\"https://picsum.photos/200\",\"genre\":\"Pop\",\"created_at\":\"2024","timestamp":"2026-02-13T18:45:20.923Z"}
|
|||
|
|
|
|||
|
|
✓ src/features/tracks/pages/TrackDetailPage.test.tsx (12 tests) 3924ms
|
|||
|
|
✓ TrackDetailPage > should render track details after loading 802ms
|
|||
|
|
✓ TrackDetailPage > should play track when play button is clicked 616ms
|
|||
|
|
✓ TrackDetailPage > should pause track when pause button is clicked if track is playing 406ms
|
|||
|
|
✓ TrackDetailPage > should copy share link when share button is clicked 331ms
|
|||
|
|
✓ TrackDetailPage > should navigate back when back button is clicked 419ms
|
|||
|
|
stdout | src/services/requestDeduplication.test.ts > RequestDeduplicationService > getOrCreateRequest > should remove request from cache after completion
|
|||
|
|
[DEBUG] [RequestDeduplication] Removed from cache: GET:/api/v1/tracks
|
|||
|
|
|
|||
|
|
stdout | src/services/requestDeduplication.test.ts > RequestDeduplicationService > getOrCreateRequest > should remove request from cache after completion
|
|||
|
|
[DEBUG] [RequestDeduplication] New request: GET /api/v1/tracks {"key":"GET:/api/v1/tracks","cacheSize":1}
|
|||
|
|
|
|||
|
|
stdout | src/services/requestDeduplication.test.ts > RequestDeduplicationService > getOrCreateRequest > should handle errors and remove from cache
|
|||
|
|
[INFO] [RequestDeduplication] Cache cleared (1 entries)
|
|||
|
|
|
|||
|
|
stdout | src/services/requestDeduplication.test.ts > RequestDeduplicationService > getOrCreateRequest > should handle errors and remove from cache
|
|||
|
|
[DEBUG] [RequestDeduplication] New request: GET /api/v1/tracks {"key":"GET:/api/v1/tracks","cacheSize":1}
|
|||
|
|
|
|||
|
|
stdout | src/services/requestDeduplication.test.ts > RequestDeduplicationService > getOrCreateRequest > should handle errors and remove from cache
|
|||
|
|
[DEBUG] [RequestDeduplication] Removed from cache (error): GET:/api/v1/tracks
|
|||
|
|
|
|||
|
|
stdout | src/services/requestDeduplication.test.ts > RequestDeduplicationService > clearCache > should clear all cached requests
|
|||
|
|
[INFO] [RequestDeduplication] Cache cleared (0 entries)
|
|||
|
|
|
|||
|
|
stdout | src/services/requestDeduplication.test.ts > RequestDeduplicationService > clearCache > should clear all cached requests
|
|||
|
|
[DEBUG] [RequestDeduplication] New request: GET /api/v1/tracks {"key":"GET:/api/v1/tracks","cacheSize":1}
|
|||
|
|
|
|||
|
|
stdout | src/services/requestDeduplication.test.ts > RequestDeduplicationService > clearCache > should clear all cached requests
|
|||
|
|
[INFO] [RequestDeduplication] Cache cleared (1 entries)
|
|||
|
|
|
|||
|
|
stdout | src/services/requestDeduplication.test.ts > RequestDeduplicationService > getCacheStats > should return cache statistics
|
|||
|
|
[INFO] [RequestDeduplication] Cache cleared (0 entries)
|
|||
|
|
|
|||
|
|
stdout | src/services/requestDeduplication.test.ts > RequestDeduplicationService > getCacheStats > should return cache statistics
|
|||
|
|
[DEBUG] [RequestDeduplication] New request: GET /api/v1/tracks {"key":"GET:/api/v1/tracks","cacheSize":1}
|
|||
|
|
|
|||
|
|
stdout | src/services/requestDeduplication.test.ts > RequestDeduplicationService > cleanup > should remove old cache entries
|
|||
|
|
[INFO] [RequestDeduplication] Cache cleared (1 entries)
|
|||
|
|
|
|||
|
|
stdout | src/services/requestDeduplication.test.ts > RequestDeduplicationService > cleanup > should remove old cache entries
|
|||
|
|
[DEBUG] [RequestDeduplication] New request: GET /api/v1/tracks {"key":"GET:/api/v1/tracks","cacheSize":1}
|
|||
|
|
|
|||
|
|
stdout | src/services/requestDeduplication.test.ts > RequestDeduplicationService > cleanup > should remove old cache entries
|
|||
|
|
[DEBUG] [RequestDeduplication] Cleaned up 1 old cache entries
|
|||
|
|
|
|||
|
|
✓ src/services/requestDeduplication.test.ts (10 tests | 1 skipped) 1312ms
|
|||
|
|
✓ RequestDeduplicationService > getOrCreateRequest > should remove request from cache after completion 1105ms
|
|||
|
|
✓ src/services/developerService.test.ts (4 tests) 1346ms
|
|||
|
|
✓ developerService > listKeys > should return empty array when no keys stored 313ms
|
|||
|
|
✓ developerService > createKey > should create a new API key 695ms
|
|||
|
|
✓ developerService > revokeKey > should revoke an API key 308ms
|
|||
|
|
✓ src/features/tracks/components/TrackListRow.test.tsx (24 tests) 1384ms
|
|||
|
|
✓ src/features/player/components/MiniPlayer.test.tsx (24 tests) 1132ms
|
|||
|
|
✓ src/components/feedback/Toast.test.tsx (19 tests) 1187ms
|
|||
|
|
✓ Toast Components > ToastComponent > calls onDismiss when close button is clicked 360ms
|
|||
|
|
✓ src/features/player/components/QualitySelector.test.tsx (17 tests) 1623ms
|
|||
|
|
✓ QualitySelector > should open dropdown when button is clicked 317ms
|
|||
|
|
✓ src/features/tracks/components/CommentSection.test.tsx (8 tests) 2055ms
|
|||
|
|
✓ CommentSection > should render comment section 333ms
|
|||
|
|
✓ CommentSection > should create a new comment 1020ms
|
|||
|
|
stdout | src/features/streaming/components/PlaybackDashboard.test.tsx > PlaybackDashboard > should render error message when API call fails
|
|||
|
|
[ERROR] Failed to load playback dashboard: {"message":"Track not found: 123"}
|
|||
|
|
|
|||
|
|
✓ src/components/forms/FormBuilder.test.tsx (21 tests) 1798ms
|
|||
|
|
✓ FormBuilder Component > updates form data when field value changes 326ms
|
|||
|
|
✓ FormBuilder Component > validates email format 372ms
|
|||
|
|
✓ FormBuilder Component > submits form with valid data 315ms
|
|||
|
|
✓ src/features/streaming/components/PlaybackDashboard.test.tsx (9 tests) 1316ms
|
|||
|
|
✓ src/components/ui/loading-spinner.test.tsx (9 tests) 393ms
|
|||
|
|
✓ src/components/ui/dialog.test.tsx (19 tests) 886ms
|
|||
|
|
✓ src/components/ui/dropdown.test.tsx (21 tests) 1608ms
|
|||
|
|
✓ Dropdown Component > opens menu when trigger is clicked 348ms
|
|||
|
|
✓ Dropdown Component > closes menu when clicking outside 313ms
|
|||
|
|
✓ src/features/playlists/hooks/usePlaylist.test.tsx (21 tests) 1259ms
|
|||
|
|
✓ src/features/auth/components/ForgotPasswordForm.test.tsx (8 tests) 1001ms
|
|||
|
|
✓ src/features/tracks/components/TrackListPagination.test.tsx (23 tests) 1411ms
|
|||
|
|
✓ TrackListPagination > should render pagination 348ms
|
|||
|
|
✓ src/components/navigation/Pagination.test.tsx (21 tests) 1276ms
|
|||
|
|
✓ Pagination Component > calls onPageChange when page number is clicked 327ms
|
|||
|
|
✓ src/features/playlists/components/PlaylistBatchActions.test.tsx (8 tests) 917ms
|
|||
|
|
✓ src/features/tracks/components/ViewToggle.test.tsx (13 tests) 1274ms
|
|||
|
|
✓ ViewToggle > should render view toggle 304ms
|
|||
|
|
✓ src/features/playlists/components/PlaylistListSkeleton.test.tsx (5 tests) 660ms
|
|||
|
|
✓ PlaylistListSkeleton > should render skeleton list with default count 325ms
|
|||
|
|
✓ src/features/auth/components/RegisterForm.test.tsx (8 tests) 1578ms
|
|||
|
|
✓ RegisterForm Component > renders register form correctly 546ms
|
|||
|
|
✓ src/features/playlists/components/CollaboratorManagement.test.tsx (11 tests) 1187ms
|
|||
|
|
✓ CollaboratorManagement > should open add modal when add button is clicked 330ms
|
|||
|
|
✓ src/features/tracks/components/TrackSort.test.tsx (17 tests) 1091ms
|
|||
|
|
✓ TrackSort > should render track sort 355ms
|
|||
|
|
✓ src/features/tracks/hooks/useInfiniteScroll.test.ts (12 tests) 1059ms
|
|||
|
|
✓ src/features/tracks/components/TrackGridDensitySelector.test.tsx (6 tests) 661ms
|
|||
|
|
✓ TrackGridDensitySelector > should render density selector 380ms
|
|||
|
|
stdout | src/features/profile/pages/UserProfilePage.test.tsx
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /users/123 {"key":"GET:/api/v1/users/123:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/features/profile/pages/UserProfilePage.test.tsx
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /users/123 {"key":"GET:/api/v1/users/123:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
stdout | src/features/profile/pages/UserProfilePage.test.tsx
|
|||
|
|
[DEBUG] [ResponseCache] Cached: /users/123 {"key":"GET:/api/v1/users/123:","maxAge":300,"etag":"none"}
|
|||
|
|
|
|||
|
|
✓ src/features/profile/pages/UserProfilePage.test.tsx (7 tests) 1381ms
|
|||
|
|
✓ UserProfilePage Component > renders loading state initially 394ms
|
|||
|
|
✓ UserProfilePage Component > renders profile successfully 418ms
|
|||
|
|
✓ src/components/ui/ImageViewerModal.test.tsx (13 tests) 518ms
|
|||
|
|
stdout | src/features/streaming/components/PlaybackHeatmap.test.tsx > PlaybackHeatmap > should render error message on error
|
|||
|
|
[ERROR] Failed to load playback heatmap: {"message":"Failed to load heatmap"}
|
|||
|
|
|
|||
|
|
✓ src/features/playlists/components/PlaylistList.test.tsx (8 tests) 1007ms
|
|||
|
|
✓ PlaylistList > should render loading state 366ms
|
|||
|
|
✓ src/features/streaming/components/PlaybackHeatmap.test.tsx (9 tests) 435ms
|
|||
|
|
✓ src/features/player/components/AudioPlayer.test.tsx (20 tests) 1153ms
|
|||
|
|
✓ src/components/ui/file-upload.test.tsx (15 tests) 1339ms
|
|||
|
|
✓ FileUpload Component > opens file dialog when button is clicked 315ms
|
|||
|
|
stdout | src/components/ErrorBoundary.test.tsx > ErrorBoundary > should catch errors and display error UI
|
|||
|
|
[ERROR] [ErrorBoundary] React error caught {"component":"ErrorBoundary","errorType":"Error","errorMessage":"Test error","stack":"Error: Test error\n at ThrowError (/home/senke/git/talas/veza/apps/web/src/components/ErrorBoundary.test.tsx:8:11)\n at renderWithHooks (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:15486:18)\n at mountIndeterminateComponent (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:20103:13)\n at beginWork (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:21626:16)\n at beginWork$1 (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:27465:14)\n at performUnitOfWork (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26599:12)\n at workLoopSync (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26505:5)\n at renderRootSync (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26473:7)\n at recoverFromConcurrentError (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:25889:20)\n at performConcurrentWorkOnRoot (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:25789:22)","componentStack":"\n at ThrowError (/home/senke/git/talas/veza/apps/web/src/components/ErrorBoundary.test.tsx:10:23)\n at ErrorBoundary (/home/senke/git/talas/veza/apps/web/src/components/ErrorBoundary.tsx:16:5)","url":"http://localhost:3000/","userAgent":"Mozilla/5.0 (linux) AppleWebKit/537.36 (KHTML, like Gecko) jsdom/24.1.3","timestamp":"2026-02-13T18:45:38.270Z"}
|
|||
|
|
|
|||
|
|
stdout | src/components/ErrorBoundary.test.tsx > ErrorBoundary > should display retry button
|
|||
|
|
[ERROR] [ErrorBoundary] React error caught {"component":"ErrorBoundary","errorType":"Error","errorMessage":"Test error","stack":"Error: Test error\n at ThrowError (/home/senke/git/talas/veza/apps/web/src/components/ErrorBoundary.test.tsx:8:11)\n at renderWithHooks (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:15486:18)\n at mountIndeterminateComponent (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:20103:13)\n at beginWork (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:21626:16)\n at beginWork$1 (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:27465:14)\n at performUnitOfWork (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26599:12)\n at workLoopSync (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26505:5)\n at renderRootSync (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26473:7)\n at recoverFromConcurrentError (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:25889:20)\n at performConcurrentWorkOnRoot (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:25789:22)","componentStack":"\n at ThrowError (/home/senke/git/talas/veza/apps/web/src/components/ErrorBoundary.test.tsx:10:23)\n at ErrorBoundary (/home/senke/git/talas/veza/apps/web/src/components/ErrorBoundary.tsx:16:5)","url":"http://localhost:3000/","userAgent":"Mozilla/5.0 (linux) AppleWebKit/537.36 (KHTML, like Gecko) jsdom/24.1.3","timestamp":"2026-02-13T18:45:38.485Z"}
|
|||
|
|
|
|||
|
|
✓ src/components/ui/slider.test.tsx (7 tests) 601ms
|
|||
|
|
✓ Slider Component > renders slider 343ms
|
|||
|
|
stdout | src/components/ErrorBoundary.test.tsx > ErrorBoundary > should display home button
|
|||
|
|
[ERROR] [ErrorBoundary] React error caught {"component":"ErrorBoundary","errorType":"Error","errorMessage":"Test error","stack":"Error: Test error\n at ThrowError (/home/senke/git/talas/veza/apps/web/src/components/ErrorBoundary.test.tsx:8:11)\n at renderWithHooks (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:15486:18)\n at mountIndeterminateComponent (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:20103:13)\n at beginWork (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:21626:16)\n at beginWork$1 (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:27465:14)\n at performUnitOfWork (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26599:12)\n at workLoopSync (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26505:5)\n at renderRootSync (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26473:7)\n at recoverFromConcurrentError (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:25889:20)\n at performConcurrentWorkOnRoot (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:25789:22)","componentStack":"\n at ThrowError (/home/senke/git/talas/veza/apps/web/src/components/ErrorBoundary.test.tsx:10:23)\n at ErrorBoundary (/home/senke/git/talas/veza/apps/web/src/components/ErrorBoundary.tsx:16:5)","url":"http://localhost:3000/","userAgent":"Mozilla/5.0 (linux) AppleWebKit/537.36 (KHTML, like Gecko) jsdom/24.1.3","timestamp":"2026-02-13T18:45:38.644Z"}
|
|||
|
|
|
|||
|
|
stdout | src/components/ErrorBoundary.test.tsx > ErrorBoundary > should reset error state when retry button is clicked
|
|||
|
|
[ERROR] [ErrorBoundary] React error caught {"component":"ErrorBoundary","errorType":"Error","errorMessage":"Test error","stack":"Error: Test error\n at ThrowError (/home/senke/git/talas/veza/apps/web/src/components/ErrorBoundary.test.tsx:8:11)\n at renderWithHooks (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:15486:18)\n at mountIndeterminateComponent (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:20103:13)\n at beginWork (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:21626:16)\n at beginWork$1 (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:27465:14)\n at performUnitOfWork (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26599:12)\n at workLoopSync (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26505:5)\n at renderRootSync (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26473:7)\n at recoverFromConcurrentError (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:25889:20)\n at performConcurrentWorkOnRoot (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:25789:22)","componentStack":"\n at ThrowError (/home/senke/git/talas/veza/apps/web/src/components/ErrorBoundary.test.tsx:10:23)\n at ErrorBoundary (/home/senke/git/talas/veza/apps/web/src/components/ErrorBoundary.tsx:16:5)","url":"http://localhost:3000/","userAgent":"Mozilla/5.0 (linux) AppleWebKit/537.36 (KHTML, like Gecko) jsdom/24.1.3","timestamp":"2026-02-13T18:45:38.754Z"}
|
|||
|
|
|
|||
|
|
stdout | src/components/ErrorBoundary.test.tsx > ErrorBoundary > should use custom fallback when provided
|
|||
|
|
[ERROR] [ErrorBoundary] React error caught {"component":"ErrorBoundary","errorType":"Error","errorMessage":"Test error","stack":"Error: Test error\n at ThrowError (/home/senke/git/talas/veza/apps/web/src/components/ErrorBoundary.test.tsx:8:11)\n at renderWithHooks (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:15486:18)\n at mountIndeterminateComponent (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:20103:13)\n at beginWork (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:21626:16)\n at beginWork$1 (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:27465:14)\n at performUnitOfWork (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26599:12)\n at workLoopSync (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26505:5)\n at renderRootSync (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26473:7)\n at recoverFromConcurrentError (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:25889:20)\n at performConcurrentWorkOnRoot (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:25789:22)","componentStack":"\n at ThrowError (/home/senke/git/talas/veza/apps/web/src/components/ErrorBoundary.test.tsx:10:23)\n at ErrorBoundary (/home/senke/git/talas/veza/apps/web/src/components/ErrorBoundary.tsx:16:5)","url":"http://localhost:3000/","userAgent":"Mozilla/5.0 (linux) AppleWebKit/537.36 (KHTML, like Gecko) jsdom/24.1.3","timestamp":"2026-02-13T18:45:38.827Z"}
|
|||
|
|
|
|||
|
|
stdout | src/components/ErrorBoundary.test.tsx > ErrorBoundary > should log error to console
|
|||
|
|
[ERROR] [ErrorBoundary] React error caught {"component":"ErrorBoundary","errorType":"Error","errorMessage":"Test error","stack":"Error: Test error\n at ThrowError (/home/senke/git/talas/veza/apps/web/src/components/ErrorBoundary.test.tsx:8:11)\n at renderWithHooks (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:15486:18)\n at mountIndeterminateComponent (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:20103:13)\n at beginWork (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:21626:16)\n at beginWork$1 (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:27465:14)\n at performUnitOfWork (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26599:12)\n at workLoopSync (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26505:5)\n at renderRootSync (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26473:7)\n at recoverFromConcurrentError (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:25889:20)\n at performConcurrentWorkOnRoot (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:25789:22)","componentStack":"\n at ThrowError (/home/senke/git/talas/veza/apps/web/src/components/ErrorBoundary.test.tsx:10:23)\n at ErrorBoundary (/home/senke/git/talas/veza/apps/web/src/components/ErrorBoundary.tsx:16:5)","url":"http://localhost:3000/","userAgent":"Mozilla/5.0 (linux) AppleWebKit/537.36 (KHTML, like Gecko) jsdom/24.1.3","timestamp":"2026-02-13T18:45:38.857Z"}
|
|||
|
|
|
|||
|
|
stdout | src/components/ErrorBoundary.test.tsx > ErrorBoundary > should have correct state structure
|
|||
|
|
[ERROR] [ErrorBoundary] React error caught {"component":"ErrorBoundary","errorType":"Error","errorMessage":"Test error","stack":"Error: Test error\n at ThrowError (/home/senke/git/talas/veza/apps/web/src/components/ErrorBoundary.test.tsx:8:11)\n at renderWithHooks (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:15486:18)\n at mountIndeterminateComponent (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:20103:13)\n at beginWork (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:21626:16)\n at beginWork$1 (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:27465:14)\n at performUnitOfWork (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26599:12)\n at workLoopSync (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26505:5)\n at renderRootSync (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26473:7)\n at recoverFromConcurrentError (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:25889:20)\n at performConcurrentWorkOnRoot (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:25789:22)","componentStack":"\n at ThrowError (/home/senke/git/talas/veza/apps/web/src/components/ErrorBoundary.test.tsx:10:23)\n at ErrorBoundary (/home/senke/git/talas/veza/apps/web/src/components/ErrorBoundary.tsx:16:5)","url":"http://localhost:3000/","userAgent":"Mozilla/5.0 (linux) AppleWebKit/537.36 (KHTML, like Gecko) jsdom/24.1.3","timestamp":"2026-02-13T18:45:38.891Z"}
|
|||
|
|
|
|||
|
|
✓ src/components/ErrorBoundary.test.tsx (8 tests) 774ms
|
|||
|
|
✓ src/features/player/components/PlayerError.test.tsx (21 tests) 1071ms
|
|||
|
|
✓ src/features/auth/components/AuthInput.test.tsx (24 tests) 934ms
|
|||
|
|
✓ src/features/auth/components/AuthFormField.test.tsx (9 tests) 314ms
|
|||
|
|
✓ src/features/tracks/components/ShareDialog.test.tsx (12 tests) 1135ms
|
|||
|
|
✓ ShareDialog > should show check icon after copying 308ms
|
|||
|
|
✓ src/features/playlists/components/PlaylistActions.test.tsx (9 tests) 999ms
|
|||
|
|
✓ src/features/player/components/VolumeControl.test.tsx (21 tests) 960ms
|
|||
|
|
✓ VolumeControl > should render volume control 361ms
|
|||
|
|
✓ src/features/playlists/components/PlaylistTrackItem.test.tsx (9 tests) 846ms
|
|||
|
|
✓ PlaylistTrackItem > should call onTrackClick when item is clicked 362ms
|
|||
|
|
✓ src/router/index.test.tsx (13 tests) 320ms
|
|||
|
|
✓ src/components/ui/table.test.tsx (6 tests) 462ms
|
|||
|
|
✓ src/features/playlists/components/SharePlaylistModal.test.tsx (4 tests) 571ms
|
|||
|
|
✓ SharePlaylistModal > should call onClose when Close is clicked 327ms
|
|||
|
|
✓ src/features/tracks/components/TrackSearchFilters.test.tsx (5 tests) 800ms
|
|||
|
|
✓ TrackSearchFilters > should show advanced filters when toggle is clicked 417ms
|
|||
|
|
✓ src/features/player/components/ProgressBar.test.tsx (16 tests) 790ms
|
|||
|
|
✓ ProgressBar > should render progress bar 310ms
|
|||
|
|
✓ src/features/tracks/components/TrackCard.test.tsx (27 tests) 1272ms
|
|||
|
|
✓ TrackCard > should call onPlay when play button is clicked 370ms
|
|||
|
|
✓ src/features/player/components/RepeatShuffleButtons.test.tsx (14 tests) 848ms
|
|||
|
|
✓ src/features/tracks/hooks/useTrackList.test.ts (33 tests) 768ms
|
|||
|
|
✓ src/components/ui/accordion/Accordion.test.tsx (5 tests) 180ms
|
|||
|
|
✓ src/components/ui/tabs.test.tsx (6 tests) 217ms
|
|||
|
|
✓ src/components/ui/button-loading.test.tsx (7 tests) 304ms
|
|||
|
|
✓ src/components/ui/LoadingState.test.tsx (13 tests) 503ms
|
|||
|
|
✓ src/components/charts/Chart.test.tsx (23 tests) 527ms
|
|||
|
|
✓ src/components/data/List.test.tsx (18 tests) 456ms
|
|||
|
|
✓ src/features/playlists/components/CollaboratorList.test.tsx (6 tests) 546ms
|
|||
|
|
✓ src/features/auth/components/LoginForm.test.tsx (6 tests) 668ms
|
|||
|
|
✓ src/features/auth/components/PasswordStrengthIndicator.test.tsx (13 tests) 583ms
|
|||
|
|
✓ src/features/playlists/components/PlaylistHeader.test.tsx (15 tests) 744ms
|
|||
|
|
✓ src/components/ui/WaveformVisualizer.test.tsx (6 tests) 421ms
|
|||
|
|
✓ src/context/ToastContext.test.tsx (5 tests) 361ms
|
|||
|
|
✓ src/features/tracks/components/TrackListEmpty.test.tsx (27 tests) 708ms
|
|||
|
|
✓ src/components/ui/tooltip.test.tsx (22 tests) 622ms
|
|||
|
|
✓ src/features/player/services/playerService.test.ts (45 tests) 137ms
|
|||
|
|
✓ src/features/player/store/playerStore.test.ts (32 tests) 304ms
|
|||
|
|
✓ src/features/auth/components/AuthButton.test.tsx (11 tests) 788ms
|
|||
|
|
✓ AuthButton > should render button with children 377ms
|
|||
|
|
✓ src/components/ui/alert.test.tsx (10 tests) 607ms
|
|||
|
|
✓ src/features/player/components/TrackInfo.test.tsx (18 tests) 269ms
|
|||
|
|
✓ src/features/tracks/components/TrackListContainer.test.tsx (8 tests) 600ms
|
|||
|
|
✓ TrackListContainer > should render track list with tracks 373ms
|
|||
|
|
✓ src/features/auth/components/AuthLayout.test.tsx (11 tests) 603ms
|
|||
|
|
✓ src/features/chat/components/ChatMessages.test.tsx (8 tests) 556ms
|
|||
|
|
✓ src/components/ui/progress.test.tsx (9 tests) 305ms
|
|||
|
|
✓ src/components/data/Timeline.test.tsx (19 tests) 588ms
|
|||
|
|
✓ src/features/playlists/components/PlaylistRecommendations.test.tsx (9 tests) 534ms
|
|||
|
|
✓ src/components/feedback/Progress.test.tsx (22 tests) 973ms
|
|||
|
|
✓ Progress Component > Linear variant > renders linear progress bar 379ms
|
|||
|
|
✓ src/features/player/components/PlayPauseButton.test.tsx (13 tests) 1115ms
|
|||
|
|
✓ PlayPauseButton > should render play button when not playing 351ms
|
|||
|
|
stdout | src/features/tracks/components/UploadQuota.test.tsx > UploadQuota > should display error message when API call fails
|
|||
|
|
[ERROR] Failed to load quota: {"error":{"code":"SERVER","retryable":false,"name":"TrackServiceError"}}
|
|||
|
|
|
|||
|
|
✓ src/features/tracks/components/UploadQuota.test.tsx (11 tests) 990ms
|
|||
|
|
✓ UploadQuota > should display tracks quota with progress bar 317ms
|
|||
|
|
✓ src/features/player/components/NextPreviousButtons.test.tsx (11 tests) 2310ms
|
|||
|
|
✓ NextPreviousButtons > should call onPrevious when previous button is clicked 1287ms
|
|||
|
|
✓ src/hooks/useGlobalKeyboardShortcuts.test.ts (3 tests) 415ms
|
|||
|
|
✓ src/features/streaming/hooks/useHLSStream.test.ts (9 tests) 920ms
|
|||
|
|
✓ src/components/ui/input.test.tsx (10 tests) 634ms
|
|||
|
|
✓ src/features/chat/components/ChatInput.test.tsx (6 tests) 799ms
|
|||
|
|
✓ ChatInput Component > renders input and send button 474ms
|
|||
|
|
✓ src/features/tracks/components/TrackListSelectionActions.test.tsx (12 tests) 1973ms
|
|||
|
|
✓ TrackListSelectionActions > should call onPlay when play button is clicked 867ms
|
|||
|
|
✓ src/components/ui/badge.test.tsx (21 tests) 526ms
|
|||
|
|
✓ src/components/forms/PasswordStrengthIndicator.test.tsx (14 tests) 1005ms
|
|||
|
|
✓ PasswordStrengthIndicator > should display all validation rules 488ms
|
|||
|
|
✓ src/features/playlists/hooks/usePlaylistTrack.test.tsx (6 tests) 916ms
|
|||
|
|
✓ useAddTrackToPlaylist > should add a track to playlist successfully 520ms
|
|||
|
|
✓ src/services/sessionService.test.ts (5 tests) 690ms
|
|||
|
|
✓ sessionService > getSessions > should return list of sessions 642ms
|
|||
|
|
✓ src/components/ui/ErrorDisplay.test.tsx (11 tests) 1079ms
|
|||
|
|
✓ ErrorDisplay > should render with a string error 665ms
|
|||
|
|
✓ src/features/player/components/TimeDisplay.test.tsx (13 tests) 623ms
|
|||
|
|
✓ TimeDisplay > should render time display 418ms
|
|||
|
|
✓ src/components/ui/modal.test.tsx (16 tests) 2275ms
|
|||
|
|
✓ Modal Component > renders nothing when open is false 326ms
|
|||
|
|
✓ Modal Component > renders modal when open is true 393ms
|
|||
|
|
✓ Modal Component > displays title when provided 599ms
|
|||
|
|
stdout | src/features/playlists/components/PlaylistErrorBoundary.test.tsx > PlaylistErrorBoundary > should render error UI when an error occurs
|
|||
|
|
[ERROR] PlaylistErrorBoundary caught an error {"error":"Test error","stack":"Error: Test error\n at ThrowError (/home/senke/git/talas/veza/apps/web/src/features/playlists/components/PlaylistErrorBoundary.test.tsx:14:11)\n at renderWithHooks (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:15486:18)\n at mountIndeterminateComponent (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:20103:13)\n at beginWork (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:21626:16)\n at beginWork$1 (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:27465:14)\n at performUnitOfWork (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26599:12)\n at workLoopSync (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26505:5)\n at renderRootSync (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26473:7)\n at recoverFromConcurrentError (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:25889:20)\n at performConcurrentWorkOnRoot (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:25789:22)","componentStack":"\n at ThrowError (/home/senke/git/talas/veza/apps/web/src/features/playlists/components/PlaylistErrorBoundary.test.tsx:10:23)\n at PlaylistErrorBoundary (/home/senke/git/talas/veza/apps/web/src/features/playlists/components/PlaylistErrorBoundary.tsx:16:5)\n at Router (/home/senke/git/talas/veza/node_modules/react-router/dist/umd/react-router.development.js:1207:17)\n at BrowserRouter (/home/senke/git/talas/veza/node_modules/react-router-dom/dist/umd/react-router-dom.development.js:695:7)"}
|
|||
|
|
|
|||
|
|
stdout | src/features/playlists/components/PlaylistErrorBoundary.test.tsx > PlaylistErrorBoundary > should call onError callback when error occurs
|
|||
|
|
[ERROR] PlaylistErrorBoundary caught an error {"error":"Test error","stack":"Error: Test error\n at ThrowError (/home/senke/git/talas/veza/apps/web/src/features/playlists/components/PlaylistErrorBoundary.test.tsx:14:11)\n at renderWithHooks (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:15486:18)\n at mountIndeterminateComponent (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:20103:13)\n at beginWork (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:21626:16)\n at beginWork$1 (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:27465:14)\n at performUnitOfWork (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26599:12)\n at workLoopSync (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26505:5)\n at renderRootSync (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26473:7)\n at recoverFromConcurrentError (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:25889:20)\n at performConcurrentWorkOnRoot (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:25789:22)","componentStack":"\n at ThrowError (/home/senke/git/talas/veza/apps/web/src/features/playlists/components/PlaylistErrorBoundary.test.tsx:10:23)\n at PlaylistErrorBoundary (/home/senke/git/talas/veza/apps/web/src/features/playlists/components/PlaylistErrorBoundary.tsx:16:5)\n at Router (/home/senke/git/talas/veza/node_modules/react-router/dist/umd/react-router.development.js:1207:17)\n at BrowserRouter (/home/senke/git/talas/veza/node_modules/react-router-dom/dist/umd/react-router-dom.development.js:695:7)"}
|
|||
|
|
|
|||
|
|
✓ src/components/feedback/Alert.test.tsx (19 tests) 1302ms
|
|||
|
|
✓ Alert Component > Rendering > renders alert with children 470ms
|
|||
|
|
✓ Alert Component > Dismissible > calls onClose when close button is clicked 369ms
|
|||
|
|
✓ src/components/ui/Toast.test.tsx (8 tests) 1374ms
|
|||
|
|
✓ Toast Component > renders toast with message 369ms
|
|||
|
|
✓ Toast Component > calls onClose when close button is clicked 868ms
|
|||
|
|
stdout | src/features/playlists/components/PlaylistErrorBoundary.test.tsx > PlaylistErrorBoundary > should reset error state when reset button is clicked
|
|||
|
|
[ERROR] PlaylistErrorBoundary caught an error {"error":"Test error","stack":"Error: Test error\n at ThrowError (/home/senke/git/talas/veza/apps/web/src/features/playlists/components/PlaylistErrorBoundary.test.tsx:14:11)\n at renderWithHooks (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:15486:18)\n at mountIndeterminateComponent (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:20103:13)\n at beginWork (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:21626:16)\n at beginWork$1 (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:27465:14)\n at performUnitOfWork (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26599:12)\n at workLoopSync (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26505:5)\n at renderRootSync (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26473:7)\n at recoverFromConcurrentError (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:25889:20)\n at performConcurrentWorkOnRoot (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:25789:22)","componentStack":"\n at ThrowError (/home/senke/git/talas/veza/apps/web/src/features/playlists/components/PlaylistErrorBoundary.test.tsx:10:23)\n at PlaylistErrorBoundary (/home/senke/git/talas/veza/apps/web/src/features/playlists/components/PlaylistErrorBoundary.tsx:16:5)\n at Router (/home/senke/git/talas/veza/node_modules/react-router/dist/umd/react-router.development.js:1207:17)\n at BrowserRouter (/home/senke/git/talas/veza/node_modules/react-router-dom/dist/umd/react-router-dom.development.js:695:7)"}
|
|||
|
|
[ERROR] PlaylistErrorBoundary caught an error {"error":"Test error","stack":"Error: Test error\n at ThrowError (/home/senke/git/talas/veza/apps/web/src/features/playlists/components/PlaylistErrorBoundary.test.tsx:14:11)\n at renderWithHooks (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:15486:18)\n at mountIndeterminateComponent (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:20103:13)\n at beginWork (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:21626:16)\n at beginWork$1 (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:27465:14)\n at performUnitOfWork (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26599:12)\n at workLoopSync (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26505:5)\n at renderRootSync (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26473:7)\n at recoverFromConcurrentError (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:25889:20)\n at performSyncWorkOnRoot (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26135:20)","componentStack":"\n at ThrowError (/home/senke/git/talas/veza/apps/web/src/features/playlists/components/PlaylistErrorBoundary.test.tsx:10:23)\n at PlaylistErrorBoundary (/home/senke/git/talas/veza/apps/web/src/features/playlists/components/PlaylistErrorBoundary.tsx:16:5)\n at Router (/home/senke/git/talas/veza/node_modules/react-router/dist/umd/react-router.development.js:1207:17)\n at BrowserRouter (/home/senke/git/talas/veza/node_modules/react-router-dom/dist/umd/react-router-dom.development.js:695:7)"}
|
|||
|
|
|
|||
|
|
stdout | src/features/playlists/components/PlaylistErrorBoundary.test.tsx > PlaylistErrorBoundary > should render custom fallback when provided
|
|||
|
|
[ERROR] PlaylistErrorBoundary caught an error {"error":"Test error","stack":"Error: Test error\n at ThrowError (/home/senke/git/talas/veza/apps/web/src/features/playlists/components/PlaylistErrorBoundary.test.tsx:14:11)\n at renderWithHooks (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:15486:18)\n at mountIndeterminateComponent (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:20103:13)\n at beginWork (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:21626:16)\n at beginWork$1 (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:27465:14)\n at performUnitOfWork (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26599:12)\n at workLoopSync (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26505:5)\n at renderRootSync (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26473:7)\n at recoverFromConcurrentError (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:25889:20)\n at performConcurrentWorkOnRoot (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:25789:22)","componentStack":"\n at ThrowError (/home/senke/git/talas/veza/apps/web/src/features/playlists/components/PlaylistErrorBoundary.test.tsx:10:23)\n at PlaylistErrorBoundary (/home/senke/git/talas/veza/apps/web/src/features/playlists/components/PlaylistErrorBoundary.tsx:16:5)\n at Router (/home/senke/git/talas/veza/node_modules/react-router/dist/umd/react-router.development.js:1207:17)\n at BrowserRouter (/home/senke/git/talas/veza/node_modules/react-router-dom/dist/umd/react-router-dom.development.js:695:7)"}
|
|||
|
|
|
|||
|
|
stdout | src/features/playlists/components/PlaylistErrorBoundary.test.tsx > PlaylistErrorBoundary > should display error message when available
|
|||
|
|
[ERROR] PlaylistErrorBoundary caught an error {"error":"Test error","stack":"Error: Test error\n at ThrowError (/home/senke/git/talas/veza/apps/web/src/features/playlists/components/PlaylistErrorBoundary.test.tsx:14:11)\n at renderWithHooks (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:15486:18)\n at mountIndeterminateComponent (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:20103:13)\n at beginWork (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:21626:16)\n at beginWork$1 (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:27465:14)\n at performUnitOfWork (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26599:12)\n at workLoopSync (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26505:5)\n at renderRootSync (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:26473:7)\n at recoverFromConcurrentError (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:25889:20)\n at performConcurrentWorkOnRoot (/home/senke/git/talas/veza/node_modules/react-dom/cjs/react-dom.development.js:25789:22)","componentStack":"\n at ThrowError (/home/senke/git/talas/veza/apps/web/src/features/playlists/components/PlaylistErrorBoundary.test.tsx:10:23)\n at PlaylistErrorBoundary (/home/senke/git/talas/veza/apps/web/src/features/playlists/components/PlaylistErrorBoundary.tsx:16:5)\n at Router (/home/senke/git/talas/veza/node_modules/react-router/dist/umd/react-router.development.js:1207:17)\n at BrowserRouter (/home/senke/git/talas/veza/node_modules/react-router-dom/dist/umd/react-router-dom.development.js:695:7)"}
|
|||
|
|
|
|||
|
|
✓ src/features/playlists/components/PlaylistErrorBoundary.test.tsx (6 tests) 1950ms
|
|||
|
|
✓ PlaylistErrorBoundary > should render error UI when an error occurs 375ms
|
|||
|
|
✓ PlaylistErrorBoundary > should reset error state when reset button is clicked 883ms
|
|||
|
|
✓ src/context/AudioContext.test.tsx (12 tests) 449ms
|
|||
|
|
✓ src/features/streaming/components/BitrateSelector.test.tsx (13 tests) 1803ms
|
|||
|
|
✓ BitrateSelector > should render with current bitrate 812ms
|
|||
|
|
✓ BitrateSelector > should call onBitrateChange when bitrate is selected 458ms
|
|||
|
|
✓ src/features/player/components/PlayerLoading.test.tsx (13 tests) 986ms
|
|||
|
|
✓ PlayerLoading > should render when isLoading is true 332ms
|
|||
|
|
✓ src/features/playlists/components/PlaylistTrackList.test.tsx (10 tests) 1132ms
|
|||
|
|
✓ PlaylistTrackList > should render tracks in order 367ms
|
|||
|
|
✓ src/features/tracks/components/TrackStatsDisplay.test.tsx (13 tests) 2105ms
|
|||
|
|
✓ TrackStatsDisplay > should render loading state initially 749ms
|
|||
|
|
✓ TrackStatsDisplay > should display stats in horizontal layout 601ms
|
|||
|
|
✓ TrackStatsDisplay > should display stats in vertical layout 329ms
|
|||
|
|
✓ src/features/player/hooks/usePlayer.test.ts (17 tests) 322ms
|
|||
|
|
✓ src/components/ui/switch.test.tsx (8 tests) 802ms
|
|||
|
|
✓ Switch Component > renders switch 381ms
|
|||
|
|
stdout | src/features/auth/components/UserProfile.test.tsx > UserProfile Component > should handle fetch errors gracefully
|
|||
|
|
[ERROR] Failed to fetch sessions count {"message":"An unexpected error occurred"}
|
|||
|
|
|
|||
|
|
✓ src/components/ui/skeleton.test.tsx (11 tests) 582ms
|
|||
|
|
✓ src/features/auth/components/UserProfile.test.tsx (5 tests) 337ms
|
|||
|
|
✓ src/components/ui/HelpText.test.tsx (4 tests) 396ms
|
|||
|
|
✓ src/components/ui/empty-state.test.tsx (6 tests) 492ms
|
|||
|
|
✓ src/components/ui/ImageCropper.test.tsx (4 tests) 669ms
|
|||
|
|
✓ ImageCropper Component > renders cropper with image 531ms
|
|||
|
|
✓ src/features/auth/components/OAuthButton.test.tsx (6 tests) 1456ms
|
|||
|
|
✓ OAuthButton > should call onClick when Google button is clicked 360ms
|
|||
|
|
✓ OAuthButton > should have type="button" to prevent form submission 536ms
|
|||
|
|
✓ src/features/playlists/hooks/usePlaylistNotifications.test.tsx (5 tests) 1584ms
|
|||
|
|
✓ usePlaylistNotifications > should fetch playlist notifications 378ms
|
|||
|
|
✓ usePlaylistNotifications > should mark all notifications as read 486ms
|
|||
|
|
✓ src/features/auth/components/EmailVerificationBadge.test.tsx (4 tests) 564ms
|
|||
|
|
✓ EmailVerificationBadge > should display verified badge when email is verified 504ms
|
|||
|
|
✓ src/components/ui/radio-group.test.tsx (6 tests) 821ms
|
|||
|
|
✓ RadioGroup Component > renders radio group 601ms
|
|||
|
|
✓ src/features/playlists/components/PlaylistCard.test.tsx (7 tests) 768ms
|
|||
|
|
✓ src/components/ui/button.test.tsx (10 tests) 1159ms
|
|||
|
|
✓ Button Component > renders with default props 397ms
|
|||
|
|
✓ Button Component > handles click events 385ms
|
|||
|
|
✓ src/components/data/Grid.test.tsx (16 tests) 336ms
|
|||
|
|
✓ src/utils/date.test.ts (33 tests) 849ms
|
|||
|
|
✓ date utilities > formatDate > should format date in short format 354ms
|
|||
|
|
✓ src/components/ui/AnimatedNumber.test.tsx (4 tests) 434ms
|
|||
|
|
✓ AnimatedNumber > renders the value 336ms
|
|||
|
|
stdout | src/features/streaming/hooks/useBitrateAdaptation.test.ts > useBitrateAdaptation > should handle errors during adaptation
|
|||
|
|
[ERROR] Bitrate adaptation failed: {"error":{}}
|
|||
|
|
|
|||
|
|
stdout | src/features/streaming/hooks/useBitrateAdaptation.test.ts > useBitrateAdaptation > should handle non-Error exceptions
|
|||
|
|
[ERROR] Bitrate adaptation failed: {"error":{}}
|
|||
|
|
|
|||
|
|
stdout | src/features/streaming/hooks/useBitrateAdaptation.test.ts > useBitrateAdaptation > should clear error when clearError is called
|
|||
|
|
[ERROR] Bitrate adaptation failed: {"error":{}}
|
|||
|
|
|
|||
|
|
✓ src/features/streaming/hooks/useBitrateAdaptation.test.ts (12 tests) 959ms
|
|||
|
|
✓ useBitrateAdaptation > should initialize with current bitrate 597ms
|
|||
|
|
✓ src/test/components.test.tsx (14 tests) 1190ms
|
|||
|
|
✓ UI Components > Button > should render with default props 309ms
|
|||
|
|
✓ src/hooks/useLocalStorage.test.ts (4 tests) 146ms
|
|||
|
|
✓ src/components/ui/collapsible.test.tsx (6 tests) 671ms
|
|||
|
|
✓ Collapsible > renders trigger content 332ms
|
|||
|
|
✓ src/features/tracks/components/TrackSearchResults.test.tsx (7 tests) 654ms
|
|||
|
|
✓ src/features/auth/pages/OAuthCallbackPage.test.tsx (2 tests) 1076ms
|
|||
|
|
✓ OAuthCallbackPage > should render loading message 973ms
|
|||
|
|
✓ src/features/playlists/components/RemoveTrackButton.test.tsx (4 tests) 2153ms
|
|||
|
|
✓ RemoveTrackButton > should render button with aria-label 1336ms
|
|||
|
|
✓ RemoveTrackButton > should not call onRemove when disabled 418ms
|
|||
|
|
✓ src/features/chat/components/ChatMessage.test.tsx (6 tests) 1500ms
|
|||
|
|
✓ ChatMessageComponent > renders message content 1058ms
|
|||
|
|
✓ src/components/ui/focus-trap.test.tsx (6 tests) 248ms
|
|||
|
|
✓ src/components/navigation/Breadcrumbs.test.tsx (17 tests) 915ms
|
|||
|
|
✓ Breadcrumbs Component > renders breadcrumbs with items 427ms
|
|||
|
|
✓ src/components/ui/FAB.test.tsx (7 tests) 528ms
|
|||
|
|
✓ FAB > renders children 386ms
|
|||
|
|
✓ src/components/ui/textarea.test.tsx (6 tests) 674ms
|
|||
|
|
✓ src/components/ui/checkbox.test.tsx (8 tests) 798ms
|
|||
|
|
✓ Checkbox Component > renders checkbox 323ms
|
|||
|
|
✓ src/utils/url.test.ts (45 tests) 213ms
|
|||
|
|
✓ src/features/auth/routes.test.tsx (5 tests) 302ms
|
|||
|
|
✓ src/components/ui/virtualized-list.test.tsx (4 tests) 330ms
|
|||
|
|
✓ src/components/ui/scroll-area.test.tsx (4 tests) 228ms
|
|||
|
|
✓ src/components/ui/DataList.test.tsx (7 tests) 391ms
|
|||
|
|
✓ src/components/ui/LazyComponent.test.tsx (4 tests) 808ms
|
|||
|
|
✓ LazyComponent > renders lazy component when loaded 445ms
|
|||
|
|
✓ src/features/tracks/services/trackDownloadService.test.ts (9 tests) 238ms
|
|||
|
|
✓ src/components/ui/card.test.tsx (13 tests) 941ms
|
|||
|
|
✓ Card Component > renders Card component correctly 775ms
|
|||
|
|
✓ src/components/ui/confirmation-dialog.test.tsx (8 tests) 1658ms
|
|||
|
|
✓ ConfirmationDialog Component > calls onConfirm when confirm button is clicked 824ms
|
|||
|
|
✓ src/features/auth/hooks/useOAuthCallback.test.tsx (3 tests) 264ms
|
|||
|
|
✓ src/features/tracks/components/TrackListSkeleton.test.tsx (9 tests) 939ms
|
|||
|
|
✓ TrackListSkeleton > should render skeleton loader 618ms
|
|||
|
|
✓ src/features/tracks/services/commentService.test.ts (18 tests) 333ms
|
|||
|
|
✓ src/features/auth/components/AuthErrorMessage.test.tsx (6 tests) 368ms
|
|||
|
|
✓ src/features/playlists/components/PlaylistAnalytics.test.tsx (7 tests) 650ms
|
|||
|
|
stdout | src/config/env.test.ts > Environment Variables > should parse environment variables correctly
|
|||
|
|
[WARN] [Config] API is cross-origin: cookies will not be sent, login may fail or redirect in a loop. Use VITE_API_URL=/api/v1 so the Vite proxy is used (same origin). {"apiOrigin":"https://api.example.com","pageOrigin":"http://localhost:3000"}
|
|||
|
|
|
|||
|
|
✓ src/config/env.test.ts (6 tests) 326ms
|
|||
|
|
✓ src/components/ui/label.test.tsx (5 tests) 643ms
|
|||
|
|
✓ Label Component > renders label 342ms
|
|||
|
|
✓ src/components/ui/dropdown-menu.test.tsx (8 tests) 955ms
|
|||
|
|
✓ DropdownMenu Component > renders trigger and content 387ms
|
|||
|
|
✓ src/hooks/useOnlineStatus.test.ts (6 tests) 418ms
|
|||
|
|
✓ src/components/ui/ComingSoon.test.tsx (6 tests) 360ms
|
|||
|
|
✓ src/features/settings/services/settingsService.test.ts (16 tests) 170ms
|
|||
|
|
✓ src/hooks/useIntersectionObserver.test.ts (7 tests) 245ms
|
|||
|
|
✓ src/components/ui/FormField.test.tsx (7 tests) 597ms
|
|||
|
|
✓ FormField Component > renders label 492ms
|
|||
|
|
✓ src/components/ui/optimized-image.test.tsx (5 tests) 315ms
|
|||
|
|
✓ src/test/setup.test.tsx (3 tests) 118ms
|
|||
|
|
✓ src/features/player/hooks/useKeyboardShortcuts.test.ts (19 tests) 327ms
|