import { describe, expect, it, vi } from 'vitest' import { mount } from '@vue/test-utils' import GroupDistributionChart from '../GroupDistributionChart.vue' const messages: Record = { 'admin.dashboard.groupDistribution': 'Group Distribution', 'admin.dashboard.group': 'Group', 'admin.dashboard.noGroup': 'No Group', 'admin.dashboard.requests': 'Requests', 'admin.dashboard.tokens': 'Tokens', 'admin.dashboard.actual': 'Actual', 'admin.dashboard.standard': 'Standard', 'admin.dashboard.metricTokens': 'By Tokens', 'admin.dashboard.metricActualCost': 'By Actual Cost', 'admin.dashboard.noDataAvailable': 'No data available', } vi.mock('vue-i18n', async () => { const actual = await vi.importActual('vue-i18n') return { ...actual, useI18n: () => ({ t: (key: string) => messages[key] ?? key, }), } }) vi.mock('vue-chartjs', () => ({ Doughnut: { props: ['data'], template: '
{{ JSON.stringify(data) }}
', }, })) describe('GroupDistributionChart', () => { const groupStats = [ { group_id: 1, group_name: 'group-a', requests: 9, total_tokens: 1200, cost: 1.8, actual_cost: 0.1, }, { group_id: 2, group_name: 'group-b', requests: 4, total_tokens: 600, cost: 0.7, actual_cost: 0.9, }, ] it('uses total_tokens and token ordering by default', () => { const wrapper = mount(GroupDistributionChart, { props: { groupStats, }, global: { stubs: { LoadingSpinner: true, }, }, }) const chartData = JSON.parse(wrapper.find('.chart-data').text()) expect(chartData.labels).toEqual(['group-a', 'group-b']) expect(chartData.datasets[0].data).toEqual([1200, 600]) const rows = wrapper.findAll('tbody tr') expect(rows[0].text()).toContain('group-a') expect(rows[1].text()).toContain('group-b') const options = (wrapper.vm as any).$?.setupState.doughnutOptions const label = options.plugins.tooltip.callbacks.label({ label: 'group-a', raw: 1200, dataset: { data: [1200, 600] }, }) expect(label).toBe('group-a: 1.20K (66.7%)') }) it('uses actual_cost and reorders rows in actual cost mode', () => { const wrapper = mount(GroupDistributionChart, { props: { groupStats, metric: 'actual_cost', }, global: { stubs: { LoadingSpinner: true, }, }, }) const chartData = JSON.parse(wrapper.find('.chart-data').text()) expect(chartData.labels).toEqual(['group-b', 'group-a']) expect(chartData.datasets[0].data).toEqual([0.9, 0.1]) const rows = wrapper.findAll('tbody tr') expect(rows[0].text()).toContain('group-b') expect(rows[1].text()).toContain('group-a') const options = (wrapper.vm as any).$?.setupState.doughnutOptions const label = options.plugins.tooltip.callbacks.label({ label: 'group-b', raw: 0.9, dataset: { data: [0.9, 0.1] }, }) expect(label).toBe('group-b: $0.900 (90.0%)') }) })