import { describe, expect, it } from 'vitest'; import { AnalyticsMetricsViewData } from '../view-data/AnalyticsMetricsViewData'; import { AnalyticsMetricsViewModel } from './AnalyticsMetricsViewModel'; 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%'); }); });