Skip to content

Commit f2b8bf9

Browse files
Ognjen Bostjancicclaude
andcommitted
test(conversations): Consolidate redundant turn and reasoning tests
Merge the three agentName tests and two modelName tests into two attribute-driven cases via an assistantFromAttributes helper, and drop reasoning assertions that were duplicated across the parse, turn, and integration layers. Reasoning is now covered once at the unit (parse) layer, once at the turn layer, and via the markdown-exclusion test. Refs TET-2453 Co-Authored-By: Claude <noreply@anthropic.com>
1 parent 657bdcf commit f2b8bf9

1 file changed

Lines changed: 26 additions & 127 deletions

File tree

static/app/views/explore/conversations/utils/conversationMessages.spec.ts

Lines changed: 26 additions & 127 deletions
Original file line numberDiff line numberDiff line change
@@ -728,101 +728,42 @@ describe('conversationMessages utilities', () => {
728728
expect(assistantMessages).toHaveLength(2);
729729
});
730730

731-
it('includes agentName from gen_ai.agent.name', () => {
731+
function assistantFromAttributes(attributes: Record<string, string>) {
732732
const turns = [
733733
makeTurn({
734734
generation: {
735735
id: 'gen-1',
736736
value: {start_timestamp: 1000, end_timestamp: 1100},
737-
attributes: {
738-
[SpanFields.GEN_AI_AGENT_NAME]: 'my-agent',
739-
},
740-
} as any,
741-
userContent: 'Hello',
742-
assistantContent: 'Hi',
743-
}),
744-
];
745-
746-
const messages = turnsToMessages(turns);
747-
const assistant = messages.find(m => m.role === 'assistant');
748-
expect(assistant?.agentName).toBe('my-agent');
749-
});
750-
751-
it('falls back agentName to gen_ai.function_id', () => {
752-
const turns = [
753-
makeTurn({
754-
generation: {
755-
id: 'gen-1',
756-
value: {start_timestamp: 1000, end_timestamp: 1100},
757-
attributes: {
758-
[SpanFields.GEN_AI_FUNCTION_ID]: 'vercel-func',
759-
},
760-
} as any,
761-
userContent: 'Hello',
762-
assistantContent: 'Hi',
763-
}),
764-
];
765-
766-
const messages = turnsToMessages(turns);
767-
const assistant = messages.find(m => m.role === 'assistant');
768-
expect(assistant?.agentName).toBe('vercel-func');
769-
});
770-
771-
it('prefers gen_ai.agent.name over gen_ai.function_id for agentName', () => {
772-
const turns = [
773-
makeTurn({
774-
generation: {
775-
id: 'gen-1',
776-
value: {start_timestamp: 1000, end_timestamp: 1100},
777-
attributes: {
778-
[SpanFields.GEN_AI_AGENT_NAME]: 'preferred-agent',
779-
[SpanFields.GEN_AI_FUNCTION_ID]: 'fallback-func',
780-
},
781-
} as any,
782-
userContent: 'Hello',
783-
assistantContent: 'Hi',
784-
}),
785-
];
786-
787-
const messages = turnsToMessages(turns);
788-
const assistant = messages.find(m => m.role === 'assistant');
789-
expect(assistant?.agentName).toBe('preferred-agent');
790-
});
791-
792-
it('includes modelName from gen_ai.response.model', () => {
793-
const turns = [
794-
makeTurn({
795-
generation: {
796-
id: 'gen-1',
797-
value: {start_timestamp: 1000, end_timestamp: 1100},
798-
attributes: {
799-
[SpanFields.GEN_AI_RESPONSE_MODEL]: 'gpt-4o',
800-
},
737+
attributes,
801738
} as any,
802739
userContent: 'Hello',
803740
assistantContent: 'Hi',
804741
}),
805742
];
806-
807-
const messages = turnsToMessages(turns);
808-
const assistant = messages.find(m => m.role === 'assistant');
809-
expect(assistant?.modelName).toBe('gpt-4o');
810-
});
811-
812-
it('leaves agentName and modelName undefined when not set', () => {
813-
const turns = [
814-
makeTurn({
815-
generation: {
816-
id: 'gen-1',
817-
value: {start_timestamp: 1000, end_timestamp: 1100},
818-
} as any,
819-
userContent: 'Hello',
820-
assistantContent: 'Hi',
821-
}),
822-
];
823-
824-
const messages = turnsToMessages(turns);
825-
const assistant = messages.find(m => m.role === 'assistant');
743+
return turnsToMessages(turns).find(m => m.role === 'assistant');
744+
}
745+
746+
it('resolves agentName from agent.name, then function_id, preferring agent.name', () => {
747+
expect(
748+
assistantFromAttributes({[SpanFields.GEN_AI_AGENT_NAME]: 'my-agent'})?.agentName
749+
).toBe('my-agent');
750+
expect(
751+
assistantFromAttributes({[SpanFields.GEN_AI_FUNCTION_ID]: 'vercel-func'})
752+
?.agentName
753+
).toBe('vercel-func');
754+
expect(
755+
assistantFromAttributes({
756+
[SpanFields.GEN_AI_AGENT_NAME]: 'preferred-agent',
757+
[SpanFields.GEN_AI_FUNCTION_ID]: 'fallback-func',
758+
})?.agentName
759+
).toBe('preferred-agent');
760+
});
761+
762+
it('resolves modelName from gen_ai.response.model, undefined when unset', () => {
763+
expect(
764+
assistantFromAttributes({[SpanFields.GEN_AI_RESPONSE_MODEL]: 'gpt-4o'})?.modelName
765+
).toBe('gpt-4o');
766+
const assistant = assistantFromAttributes({});
826767
expect(assistant?.agentName).toBeUndefined();
827768
expect(assistant?.modelName).toBeUndefined();
828769
});
@@ -961,20 +902,6 @@ describe('conversationMessages utilities', () => {
961902
const assistant = turnsToMessages(turns).find(m => m.role === 'assistant');
962903
expect(assistant?.reasoning).toBe('Let me think step by step...');
963904
});
964-
965-
it('attaches reasoning to tool-call-only turns without text', () => {
966-
const turns = [
967-
makeTurn({
968-
userContent: 'Question',
969-
toolCalls: [{name: 'search', nodeId: 'tool-1', hasError: false}],
970-
reasoning: 'Thinking out loud',
971-
}),
972-
];
973-
974-
const assistant = turnsToMessages(turns).find(m => m.role === 'assistant');
975-
expect(assistant?.content).toBe('');
976-
expect(assistant?.reasoning).toBe('Thinking out loud');
977-
});
978905
});
979906

980907
describe('extractMessagesFromNodes (integration)', () => {
@@ -1211,34 +1138,6 @@ describe('conversationMessages utilities', () => {
12111138
});
12121139
});
12131140

1214-
describe('reasoning in extractMessagesFromNodes', () => {
1215-
it('includes reasoning on assistant messages', () => {
1216-
const outputMessages = JSON.stringify([
1217-
{
1218-
role: 'assistant',
1219-
parts: [
1220-
{type: 'reasoning', content: 'Thinking...'},
1221-
{type: 'text', text: 'Answer'},
1222-
],
1223-
},
1224-
]);
1225-
const inputMessages = JSON.stringify([{role: 'user', content: 'Question'}]);
1226-
const node = createMockNode({
1227-
id: 'span-1',
1228-
startTimestamp: 1000,
1229-
attributes: {
1230-
[SpanFields.GEN_AI_INPUT_MESSAGES]: inputMessages,
1231-
[SpanFields.GEN_AI_OUTPUT_MESSAGES]: outputMessages,
1232-
},
1233-
});
1234-
1235-
const messages = extractMessagesFromNodes([node as any]);
1236-
const assistant = messages.find(m => m.role === 'assistant');
1237-
expect(assistant?.content).toBe('Answer');
1238-
expect(assistant?.reasoning).toBe('Thinking...');
1239-
});
1240-
});
1241-
12421141
describe('messagesToMarkdown', () => {
12431142
it('formats user messages with email', () => {
12441143
const result = messagesToMarkdown([

0 commit comments

Comments
 (0)