import { describe, it, expect } from 'vitest'; import { AdminDashboardViewDataBuilder } from './AdminDashboardViewDataBuilder'; import type { DashboardStats } from '@/lib/types/admin'; describe('AdminDashboardViewDataBuilder', () => { describe('happy paths', () => { it('should transform DashboardStats DTO to AdminDashboardViewData correctly', () => { const dashboardStats: DashboardStats = { totalUsers: 1000, activeUsers: 800, suspendedUsers: 50, deletedUsers: 150, systemAdmins: 5, recentLogins: 120, newUsersToday: 15, }; const result = AdminDashboardViewDataBuilder.build(dashboardStats); expect(result).toEqual({ stats: { totalUsers: 1000, activeUsers: 800, suspendedUsers: 50, deletedUsers: 150, systemAdmins: 5, recentLogins: 120, newUsersToday: 15, }, }); }); it('should handle zero values correctly', () => { const dashboardStats: DashboardStats = { totalUsers: 0, activeUsers: 0, suspendedUsers: 0, deletedUsers: 0, systemAdmins: 0, recentLogins: 0, newUsersToday: 0, }; const result = AdminDashboardViewDataBuilder.build(dashboardStats); expect(result).toEqual({ stats: { totalUsers: 0, activeUsers: 0, suspendedUsers: 0, deletedUsers: 0, systemAdmins: 0, recentLogins: 0, newUsersToday: 0, }, }); }); it('should handle large numbers correctly', () => { const dashboardStats: DashboardStats = { totalUsers: 1000000, activeUsers: 750000, suspendedUsers: 25000, deletedUsers: 225000, systemAdmins: 50, recentLogins: 50000, newUsersToday: 1000, }; const result = AdminDashboardViewDataBuilder.build(dashboardStats); expect(result.stats.totalUsers).toBe(1000000); expect(result.stats.activeUsers).toBe(750000); expect(result.stats.systemAdmins).toBe(50); }); }); describe('data transformation', () => { it('should preserve all DTO fields in the output', () => { const dashboardStats: DashboardStats = { totalUsers: 500, activeUsers: 400, suspendedUsers: 25, deletedUsers: 75, systemAdmins: 3, recentLogins: 80, newUsersToday: 10, }; const result = AdminDashboardViewDataBuilder.build(dashboardStats); expect(result.stats.totalUsers).toBe(dashboardStats.totalUsers); expect(result.stats.activeUsers).toBe(dashboardStats.activeUsers); expect(result.stats.suspendedUsers).toBe(dashboardStats.suspendedUsers); expect(result.stats.deletedUsers).toBe(dashboardStats.deletedUsers); expect(result.stats.systemAdmins).toBe(dashboardStats.systemAdmins); expect(result.stats.recentLogins).toBe(dashboardStats.recentLogins); expect(result.stats.newUsersToday).toBe(dashboardStats.newUsersToday); }); it('should not modify the input DTO', () => { const dashboardStats: DashboardStats = { totalUsers: 100, activeUsers: 80, suspendedUsers: 5, deletedUsers: 15, systemAdmins: 2, recentLogins: 20, newUsersToday: 5, }; const originalStats = { ...dashboardStats }; AdminDashboardViewDataBuilder.build(dashboardStats); expect(dashboardStats).toEqual(originalStats); }); }); describe('edge cases', () => { it('should handle negative values (if API returns them)', () => { const dashboardStats: DashboardStats = { totalUsers: -1, activeUsers: -1, suspendedUsers: -1, deletedUsers: -1, systemAdmins: -1, recentLogins: -1, newUsersToday: -1, }; const result = AdminDashboardViewDataBuilder.build(dashboardStats); expect(result.stats.totalUsers).toBe(-1); expect(result.stats.activeUsers).toBe(-1); }); it('should handle very large numbers', () => { const dashboardStats: DashboardStats = { totalUsers: Number.MAX_SAFE_INTEGER, activeUsers: Number.MAX_SAFE_INTEGER - 1000, suspendedUsers: 100, deletedUsers: 100, systemAdmins: 10, recentLogins: 1000, newUsersToday: 100, }; const result = AdminDashboardViewDataBuilder.build(dashboardStats); expect(result.stats.totalUsers).toBe(Number.MAX_SAFE_INTEGER); expect(result.stats.activeUsers).toBe(Number.MAX_SAFE_INTEGER - 1000); }); }); });