@@ -136,8 +136,10 @@ suite("cloud/commands/logs", () => {
136136
137137 const logMessages = messages . filter ( ( m ) => m . type === "log" )
138138 assert . strictEqual ( logMessages . length , 2 )
139- assert . ok ( logMessages [ 0 ] . html . includes ( "line 1" ) )
140- assert . ok ( logMessages [ 1 ] . html . includes ( "line 2" ) )
139+ assert . strictEqual ( logMessages [ 0 ] . entry . message , "line 1" )
140+ assert . strictEqual ( logMessages [ 0 ] . entry . level , "info" )
141+ assert . strictEqual ( logMessages [ 1 ] . entry . message , "line 2" )
142+ assert . strictEqual ( logMessages [ 1 ] . entry . level , "error" )
141143
142144 const statusMessages = messages . filter ( ( m ) => m . type === "status" )
143145 assert . ok ( statusMessages . some ( ( m ) => m . text === "Stream ended." ) )
@@ -446,104 +448,87 @@ suite("cloud/commands/logs", () => {
446448 } )
447449
448450 suite ( "formatLogEntry" , ( ) => {
449- test ( "formats a log entry with level, timestamp, and message" , ( ) => {
450- const html = formatLogEntry ( {
451+ test ( "returns level, timestamp, and message fields " , ( ) => {
452+ const entry = formatLogEntry ( {
451453 timestamp : "2025-01-15T10:30:00Z" ,
452454 message : "Server started" ,
453455 level : "info" ,
454456 } )
455- assert . ok ( html . startsWith ( '<div class="log-line"' ) )
456- assert . ok ( html . includes ( 'data-level="info"' ) )
457- assert . ok ( html . includes ( "color:#00cccc" ) )
458- assert . ok ( html . includes ( "Server started" ) )
459- assert . ok ( html . includes ( "2025-01-15T10:30:00.000Z" ) )
460- assert . ok ( html . includes ( '<span class="ts">' ) )
461- assert . ok ( html . includes ( "┃" ) )
457+ assert . equal ( entry . level , "info" )
458+ assert . equal ( entry . message , "Server started" )
459+ assert . equal ( entry . timestamp , "2025-01-15T10:30:00.000Z" )
462460 } )
463461
464462 test ( "normalizes warn to warning" , ( ) => {
465- const html = formatLogEntry ( {
463+ const entry = formatLogEntry ( {
466464 timestamp : "2025-01-15T10:30:00Z" ,
467465 message : "msg" ,
468466 level : "warn" ,
469467 } )
470- assert . ok ( html . includes ( 'data- level= "warning"' ) )
468+ assert . equal ( entry . level , "warning" )
471469 } )
472470
473471 test ( "normalizes fatal to critical" , ( ) => {
474- const html = formatLogEntry ( {
472+ const entry = formatLogEntry ( {
475473 timestamp : "2025-01-15T10:30:00Z" ,
476474 message : "msg" ,
477475 level : "fatal" ,
478476 } )
479- assert . ok ( html . includes ( 'data- level= "critical"' ) )
477+ assert . equal ( entry . level , "critical" )
480478 } )
481479
482480 test ( "infers level from message prefix when level is unknown" , ( ) => {
483- const html = formatLogEntry ( {
481+ const entry = formatLogEntry ( {
484482 timestamp : "2025-01-15T10:30:00Z" ,
485483 message : ' INFO 50.35.91.231:0 - "GET / HTTP/1.1" 200' ,
486484 level : "unknown" ,
487485 } )
488- assert . ok ( html . includes ( 'data-level="info"' ) )
489- assert . ok ( html . includes ( "color:#00cccc" ) )
486+ assert . equal ( entry . level , "info" )
490487 } )
491488
492489 test ( "defaults to info when level is missing" , ( ) => {
493- const html = formatLogEntry ( {
490+ const entry = formatLogEntry ( {
494491 timestamp : "2025-01-15T10:30:00Z" ,
495492 message : "no level" ,
496493 level : undefined as any ,
497494 } )
498- assert . ok ( html . includes ( 'data- level= "info"' ) )
495+ assert . equal ( entry . level , "info" )
499496 } )
500497
501- test ( "uses default color for unknown level" , ( ) => {
502- const html = formatLogEntry ( {
498+ test ( "preserves unrecognized level verbatim " , ( ) => {
499+ const entry = formatLogEntry ( {
503500 timestamp : "2025-01-15T10:30:00Z" ,
504501 message : "msg" ,
505502 level : "trace" ,
506503 } )
507- assert . ok ( html . includes ( 'data-level="trace"' ) )
508- assert . ok ( html . includes ( "color:#888" ) )
504+ assert . equal ( entry . level , "trace" )
509505 } )
510506
511507 test ( "lowercases level" , ( ) => {
512- const html = formatLogEntry ( {
508+ const entry = formatLogEntry ( {
513509 timestamp : "2025-01-15T10:30:00Z" ,
514510 message : "msg" ,
515511 level : "ERROR" ,
516512 } )
517- assert . ok ( html . includes ( 'data- level= "error"' ) )
513+ assert . equal ( entry . level , "error" )
518514 } )
519515
520- test ( "escapes HTML in message " , ( ) => {
521- const html = formatLogEntry ( {
516+ test ( "passes message through unescaped (webview sets it as text) " , ( ) => {
517+ const entry = formatLogEntry ( {
522518 timestamp : "2025-01-15T10:30:00Z" ,
523519 message : "<script>alert('xss')</script>" ,
524520 level : "info" ,
525521 } )
526- assert . ok ( html . includes ( "<script>" ) )
527- assert . ok ( ! html . includes ( "<script>alert" ) )
528- } )
529-
530- test ( "escapes quotes in level for attribute safety" , ( ) => {
531- const html = formatLogEntry ( {
532- timestamp : "2025-01-15T10:30:00Z" ,
533- message : "msg" ,
534- level : '"onclick="alert(1)' ,
535- } )
536- assert . ok ( ! html . includes ( 'data-level=""onclick' ) )
537- assert . ok ( html . includes ( """ ) )
522+ assert . equal ( entry . message , "<script>alert('xss')</script>" )
538523 } )
539524
540525 test ( "handles invalid timestamp gracefully" , ( ) => {
541- const html = formatLogEntry ( {
526+ const entry = formatLogEntry ( {
542527 timestamp : "not-a-date" ,
543528 message : "msg" ,
544529 level : "info" ,
545530 } )
546- assert . ok ( html . includes ( "not-a-date" ) )
531+ assert . equal ( entry . timestamp , "not-a-date" )
547532 } )
548533 } )
549534
0 commit comments