Files
gridpilot.gg/apps/website/lib/view-models/AnalyticsMetricsViewModel.test.ts
Marc Mintel d97f50ed72
Some checks failed
Contract Testing / contract-tests (pull_request) Failing after 6m4s
Contract Testing / contract-snapshot (pull_request) Has been skipped
view data fixes
2026-01-23 11:59:49 +01:00

62 lines
1.7 KiB
TypeScript

import { describe, it, expect } from 'vitest';
import { AnalyticsMetricsViewModel } from './AnalyticsMetricsViewModel';
import { AnalyticsMetricsViewData } from '../view-data/AnalyticsMetricsViewData';
describe('AnalyticsMetricsViewModel', () => {
it('maps metrics fields from AnalyticsMetricsViewData', () => {
const viewData: AnalyticsMetricsViewData = {
pageViews: 1234,
uniqueVisitors: 567,
averageSessionDuration: 180,
bounceRate: 42.5,
};
const vm = new AnalyticsMetricsViewModel(viewData);
expect(vm.pageViews).toBe(1234);
expect(vm.uniqueVisitors).toBe(567);
expect(vm.averageSessionDuration).toBe(180);
expect(vm.bounceRate).toBe(42.5);
});
it('formats counts using NumberDisplay', () => {
const viewData: AnalyticsMetricsViewData = {
pageViews: 1200,
uniqueVisitors: 3500,
averageSessionDuration: 75,
bounceRate: 10,
};
const vm = new AnalyticsMetricsViewModel(viewData);
expect(vm.formattedPageViews).toBe('1,200');
expect(vm.formattedUniqueVisitors).toBe('3,500');
});
it('formats session duration using DurationDisplay', () => {
const viewData: AnalyticsMetricsViewData = {
pageViews: 0,
uniqueVisitors: 0,
averageSessionDuration: 125,
bounceRate: 0,
};
const vm = new AnalyticsMetricsViewModel(viewData);
expect(vm.formattedSessionDuration).toBe('2:05.000');
});
it('formats bounce rate using PercentDisplay', () => {
const viewData: AnalyticsMetricsViewData = {
pageViews: 0,
uniqueVisitors: 0,
averageSessionDuration: 0,
bounceRate: 0.37345,
};
const vm = new AnalyticsMetricsViewModel(viewData);
expect(vm.formattedBounceRate).toBe('37.3%');
});
});