@@ -51,3 +51,70 @@ describe('Turn', () => {
5151 expect ( span . events . some ( e => e . name === 'exception' ) ) . toBe ( true ) ;
5252 } ) ;
5353} ) ;
54+
55+ describe ( 'Turn.setAttribute' , ( ) => {
56+ setupGenAITestEnvironment ( ) ;
57+ const getExporter = setupExporterPerTest ( ) ;
58+
59+ it ( 'writes an attribute to the underlying span' , ( ) => {
60+ const turn = Turn . create ( { } ) ;
61+ turn . setAttribute ( 'weave.cost.usd' , 0.42 ) ;
62+ turn . end ( ) ;
63+ const spans = getExporter ( ) . getFinishedSpans ( ) ;
64+ expect ( findSpan ( spans , 'invoke_agent' ) . attributes [ 'weave.cost.usd' ] ) . toBe (
65+ 0.42
66+ ) ;
67+ } ) ;
68+
69+ it ( 'returns this for chaining' , ( ) => {
70+ const turn = Turn . create ( { } ) ;
71+ expect ( turn . setAttribute ( 'k' , 'v' ) ) . toBe ( turn ) ;
72+ turn . end ( ) ;
73+ } ) ;
74+
75+ it ( 'is a no-op after end()' , ( ) => {
76+ const turn = Turn . create ( { } ) ;
77+ turn . end ( ) ;
78+ turn . setAttribute ( 'after.end' , 'x' ) ;
79+ const spans = getExporter ( ) . getFinishedSpans ( ) ;
80+ expect (
81+ findSpan ( spans , 'invoke_agent' ) . attributes [ 'after.end' ]
82+ ) . toBeUndefined ( ) ;
83+ } ) ;
84+ } ) ;
85+
86+ describe ( 'Turn.addEvent' , ( ) => {
87+ setupGenAITestEnvironment ( ) ;
88+ const getExporter = setupExporterPerTest ( ) ;
89+
90+ it ( 'writes a named event with attributes' , ( ) => {
91+ const turn = Turn . create ( { } ) ;
92+ turn . addEvent ( 'context_compacted' , { items_before : 50 , items_after : 10 } ) ;
93+ turn . end ( ) ;
94+ const spans = getExporter ( ) . getFinishedSpans ( ) ;
95+ const ev = findSpan ( spans , 'invoke_agent' ) . events . find (
96+ e => e . name === 'context_compacted'
97+ ) ;
98+ expect ( ev ?. attributes ) . toMatchObject ( { items_before : 50 , items_after : 10 } ) ;
99+ } ) ;
100+
101+ it ( 'returns this for chaining' , ( ) => {
102+ const turn = Turn . create ( { } ) ;
103+ expect ( turn . addEvent ( 'e' ) ) . toBe ( turn ) ;
104+ turn . end ( ) ;
105+ const spans = getExporter ( ) . getFinishedSpans ( ) ;
106+ expect (
107+ findSpan ( spans , 'invoke_agent' ) . events . find ( e => e . name === 'e' )
108+ ) . toBeDefined ( ) ;
109+ } ) ;
110+
111+ it ( 'is a no-op after end()' , ( ) => {
112+ const turn = Turn . create ( { } ) ;
113+ turn . end ( ) ;
114+ turn . addEvent ( 'after.end' ) ;
115+ const spans = getExporter ( ) . getFinishedSpans ( ) ;
116+ expect (
117+ findSpan ( spans , 'invoke_agent' ) . events . find ( e => e . name === 'after.end' )
118+ ) . toBeUndefined ( ) ;
119+ } ) ;
120+ } ) ;
0 commit comments