import React from 'react'; import { fireEvent, render, screen } from '@testing-library/react'; import { Message } from '@memori.ai/memori-api-client/dist/types'; import ChatConsumptionDropdown from './ChatConsumptionDropdown'; type TestMessage = Message & { llmUsage?: { provider?: string; model?: string; totalInputTokens?: number; outputTokens?: number; energyImpact?: { energy?: number | { parsedValue?: number }; gwp?: number | { parsedValue?: number; source?: string }; wcf?: number | { parsedValue?: number; source?: string }; }; }; }; describe('ChatConsumptionDropdown', () => { it('renders aggregated token and environmental usage', () => { const history = [ { text: 'First response', timestamp: '2021-03-01T12:00:00.000Z', llmUsage: { provider: 'OpenAI', model: 'gpt-5', totalInputTokens: 1000, outputTokens: 200, energyImpact: { energy: { parsedValue: 0.0012 }, gwp: { parsedValue: 0.00045 }, wcf: { parsedValue: 0.0021 }, }, }, }, { text: 'Second response', timestamp: '2021-03-01T12:01:00.000Z', llmUsage: { provider: 'Anthropic', model: 'claude-3', totalInputTokens: 250, outputTokens: 50, energyImpact: { energy: 0.0008, gwp: { source: '0.00035' }, wcf: { source: '0.0014' }, }, }, }, ] as TestMessage[]; render(); fireEvent.click(screen.getByTitle('write_and_speak.showMessageConsumptionLabel')); expect(screen.getByText('chatLogs.totalChatConsumptionTitle')).toBeTruthy(); expect(screen.getByText('chatLogs.modelUsage')).toBeTruthy(); expect(screen.getByText('chatLogs.environmentalImpact')).toBeTruthy(); expect(screen.getByText('1,250')).toBeTruthy(); expect(screen.getByText('250')).toBeTruthy(); expect(screen.getByText('OpenAI · gpt-5')).toBeTruthy(); expect(screen.getByText('Anthropic · claude-3')).toBeTruthy(); expect(screen.getByText('2 Wh')).toBeTruthy(); expect(screen.getByText('800 mg')).toBeTruthy(); expect(screen.getByText('3.5 mL')).toBeTruthy(); }); it('does not render when the chat has no llm usage data', () => { const history = [ { text: 'Plain message', timestamp: '2021-03-01T12:00:00.000Z', }, ] as TestMessage[]; const { container } = render(); expect(container.firstChild).toBeNull(); expect( screen.queryByTitle('write_and_speak.showMessageConsumptionLabel') ).toBeNull(); }); it('supports a custom trigger node', () => { const history = [ { text: 'First response', timestamp: '2021-03-01T12:00:00.000Z', llmUsage: { provider: 'OpenAI', model: 'gpt-5', totalInputTokens: 1000, outputTokens: 200, energyImpact: { energy: { parsedValue: 0.0012 }, gwp: { parsedValue: 0.00045 }, wcf: { parsedValue: 0.0021 }, }, }, }, ] as TestMessage[]; render( Open usage} /> ); fireEvent.click(screen.getByRole('button', { name: 'Open usage' })); expect(screen.getByText('chatLogs.totalChatConsumptionTitle')).toBeTruthy(); }); });