1- import { detectMode , formatLogLine , resolveAgentContext } from '../action' ;
1+ import { detectMode , extractReadableMessage , formatLogLine , resolveAgentContext } from '../action' ;
22import type { LogsContext } from '../action' ;
33import { describe , expect , it } from 'vitest' ;
44
@@ -20,21 +20,110 @@ describe('detectMode', () => {
2020 } ) ;
2121} ) ;
2222
23- describe ( 'formatLogLine' , ( ) => {
24- const event = { timestamp : 1709391000000 , message : 'Hello world' } ;
23+ describe ( 'extractReadableMessage' , ( ) => {
24+ it ( 'returns plain text as-is' , ( ) => {
25+ const result = extractReadableMessage ( 'WARNING: Invalid HTTP request received.' ) ;
26+ expect ( result . message ) . toBe ( 'WARNING: Invalid HTTP request received.' ) ;
27+ expect ( result . level ) . toBeUndefined ( ) ;
28+ } ) ;
29+
30+ it ( 'extracts level and message from simple JSON' , ( ) => {
31+ const raw = JSON . stringify ( {
32+ timestamp : '2026-03-03T21:49:11Z' ,
33+ level : 'INFO' ,
34+ message : 'Invoking Agent.....' ,
35+ logger : 'bedrock_agentcore.app' ,
36+ } ) ;
37+ const result = extractReadableMessage ( raw ) ;
38+ expect ( result . level ) . toBe ( 'INFO' ) ;
39+ expect ( result . message ) . toBe ( 'Invoking Agent.....' ) ;
40+ } ) ;
41+
42+ it ( 'extracts string body from OTel JSON' , ( ) => {
43+ const raw = JSON . stringify ( {
44+ scope : { name : 'bedrock_agentcore.app' } ,
45+ severityText : 'INFO' ,
46+ body : 'Returning streaming response (generator) (0.000s)' ,
47+ traceId : 'abc123' ,
48+ } ) ;
49+ const result = extractReadableMessage ( raw ) ;
50+ expect ( result . level ) . toBe ( 'INFO' ) ;
51+ expect ( result . message ) . toBe ( 'Returning streaming response (generator) (0.000s)' ) ;
52+ } ) ;
2553
26- it ( 'formats human-readable line with timestamp' , ( ) => {
54+ it ( 'extracts text from OTel body.content array' , ( ) => {
55+ const raw = JSON . stringify ( { severityText : '' , body : { content : [ { text : 'hello' } ] } , traceId : 'abc' } ) ;
56+ const result = extractReadableMessage ( raw ) ;
57+ expect ( result . message ) . toBe ( 'hello' ) ;
58+ } ) ;
59+
60+ it ( 'extracts assistant response from OTel body.message.content' , ( ) => {
61+ const raw = JSON . stringify ( {
62+ severityText : '' ,
63+ body : {
64+ message : { content : [ { text : 'Hello! How can I help you today?' } ] , role : 'assistant' } ,
65+ index : 0 ,
66+ finish_reason : 'end_turn' ,
67+ } ,
68+ } ) ;
69+ const result = extractReadableMessage ( raw ) ;
70+ expect ( result . message ) . toBe ( '[assistant] Hello! How can I help you today?' ) ;
71+ } ) ;
72+
73+ it ( 'extracts from OTel input/output messages' , ( ) => {
74+ const raw = JSON . stringify ( {
75+ severityText : '' ,
76+ body : {
77+ output : { messages : [ { content : { message : '[{"text": "Hi there!"}]' } , role : 'assistant' } ] } ,
78+ input : { messages : [ { content : { content : '[{"text": "hello"}]' } , role : 'user' } ] } ,
79+ } ,
80+ } ) ;
81+ const result = extractReadableMessage ( raw ) ;
82+ expect ( result . message ) . toContain ( '[user] hello' ) ;
83+ expect ( result . message ) . toContain ( '[assistant] Hi there!' ) ;
84+ } ) ;
85+
86+ it ( 'handles invalid JSON gracefully' , ( ) => {
87+ const result = extractReadableMessage ( '{not valid json}' ) ;
88+ expect ( result . message ) . toBe ( '{not valid json}' ) ;
89+ } ) ;
90+ } ) ;
91+
92+ describe ( 'formatLogLine' , ( ) => {
93+ it ( 'formats plain text with timestamp' , ( ) => {
94+ const event = { timestamp : 1709391000000 , message : 'Hello world' } ;
2795 const line = formatLogLine ( event , false ) ;
2896 expect ( line ) . toContain ( 'Hello world' ) ;
2997 expect ( line ) . toContain ( '2024-03-02' ) ;
3098 } ) ;
3199
32- it ( 'formats JSON line' , ( ) => {
100+ it ( 'formats structured log with level tag' , ( ) => {
101+ const event = {
102+ timestamp : 1709391000000 ,
103+ message : JSON . stringify ( { level : 'WARN' , message : 'something happened' } ) ,
104+ } ;
105+ const line = formatLogLine ( event , false ) ;
106+ expect ( line ) . toContain ( 'WARN' ) ;
107+ expect ( line ) . toContain ( 'something happened' ) ;
108+ expect ( line ) . not . toContain ( '"level"' ) ;
109+ } ) ;
110+
111+ it ( 'formats JSON output with extracted fields' , ( ) => {
112+ const event = { timestamp : 1709391000000 , message : JSON . stringify ( { level : 'INFO' , message : 'test message' } ) } ;
33113 const line = formatLogLine ( event , true ) ;
34114 const parsed = JSON . parse ( line ) ;
35- expect ( parsed . message ) . toBe ( 'Hello world' ) ;
115+ expect ( parsed . level ) . toBe ( 'INFO' ) ;
116+ expect ( parsed . message ) . toBe ( 'test message' ) ;
36117 expect ( parsed . timestamp ) . toBeDefined ( ) ;
37118 } ) ;
119+
120+ it ( 'formats JSON output for plain text messages' , ( ) => {
121+ const event = { timestamp : 1709391000000 , message : 'plain text' } ;
122+ const line = formatLogLine ( event , true ) ;
123+ const parsed = JSON . parse ( line ) ;
124+ expect ( parsed . message ) . toBe ( 'plain text' ) ;
125+ expect ( parsed . level ) . toBeUndefined ( ) ;
126+ } ) ;
38127} ) ;
39128
40129describe ( 'resolveAgentContext' , ( ) => {
0 commit comments