Files
gridpilot.gg/apps/website/lib/page-queries/AdminDashboardPageQuery.test.ts
Marc Mintel 1b0a1f4aee
Some checks failed
Contract Testing / contract-tests (pull_request) Failing after 7m11s
Contract Testing / contract-snapshot (pull_request) Has been skipped
view data fixes
2026-01-24 23:29:55 +01:00

146 lines
4.3 KiB
TypeScript

import { describe, it, expect, vi, beforeEach } from 'vitest';
import { AdminDashboardPageQuery } from './AdminDashboardPageQuery';
import { AdminService } from '@/lib/services/admin/AdminService';
import { Result } from '@/lib/contracts/Result';
import { AdminDashboardViewDataBuilder } from '@/lib/builders/view-data/AdminDashboardViewDataBuilder';
import type { DashboardStats } from '@/lib/types/admin';
// Mock dependencies
vi.mock('@/lib/services/admin/AdminService', () => ({
AdminService: vi.fn(),
}));
vi.mock('@/lib/builders/view-data/AdminDashboardViewDataBuilder', () => ({
AdminDashboardViewDataBuilder: {
build: vi.fn(),
},
}));
describe('AdminDashboardPageQuery', () => {
let query: AdminDashboardPageQuery;
let mockServiceInstance: any;
beforeEach(() => {
vi.clearAllMocks();
query = new AdminDashboardPageQuery();
mockServiceInstance = {
getDashboardStats: vi.fn(),
};
vi.mocked(AdminService).mockImplementation(function() {
return mockServiceInstance;
});
});
it('should return view data when service succeeds', async () => {
const mockStats: DashboardStats = {
totalUsers: 1250,
activeUsers: 1100,
suspendedUsers: 50,
deletedUsers: 100,
systemAdmins: 5,
recentLogins: 450,
newUsersToday: 12,
userGrowth: [
{ label: 'This week', value: 45, color: '#10b981' },
{ label: 'Last week', value: 38, color: '#3b82f6' },
],
roleDistribution: [
{ label: 'Users', value: 1200, color: '#6b7280' },
{ label: 'Admins', value: 50, color: '#8b5cf6' },
],
statusDistribution: {
active: 1100,
suspended: 50,
deleted: 100,
},
activityTimeline: [
{ date: '2024-01-01', newUsers: 10, logins: 200 },
{ date: '2024-01-02', newUsers: 15, logins: 220 },
],
};
const mockViewData = {
stats: {
totalUsers: 1250,
activeUsers: 1100,
suspendedUsers: 50,
deletedUsers: 100,
systemAdmins: 5,
recentLogins: 450,
newUsersToday: 12,
},
};
mockServiceInstance.getDashboardStats.mockResolvedValue(Result.ok(mockStats));
(AdminDashboardViewDataBuilder.build as any).mockReturnValue(mockViewData);
const result = await query.execute();
expect(result.isOk()).toBe(true);
expect(result.unwrap()).toEqual(mockViewData);
expect(AdminService).toHaveBeenCalled();
expect(mockServiceInstance.getDashboardStats).toHaveBeenCalled();
expect(AdminDashboardViewDataBuilder.build).toHaveBeenCalledWith(mockStats);
});
it('should return error when service fails', async () => {
const serviceError = { type: 'serverError', message: 'Service error' };
mockServiceInstance.getDashboardStats.mockResolvedValue(Result.err(serviceError));
const result = await query.execute();
expect(result.isErr()).toBe(true);
expect(result.getError()).toBe('serverError');
});
it('should provide a static execute method', async () => {
const mockStats: DashboardStats = {
totalUsers: 1250,
activeUsers: 1100,
suspendedUsers: 50,
deletedUsers: 100,
systemAdmins: 5,
recentLogins: 450,
newUsersToday: 12,
userGrowth: [
{ label: 'This week', value: 45, color: '#10b981' },
{ label: 'Last week', value: 38, color: '#3b82f6' },
],
roleDistribution: [
{ label: 'Users', value: 1200, color: '#6b7280' },
{ label: 'Admins', value: 50, color: '#8b5cf6' },
],
statusDistribution: {
active: 1100,
suspended: 50,
deleted: 100,
},
activityTimeline: [
{ date: '2024-01-01', newUsers: 10, logins: 200 },
{ date: '2024-01-02', newUsers: 15, logins: 220 },
],
};
const mockViewData = {
stats: {
totalUsers: 1250,
activeUsers: 1100,
suspendedUsers: 50,
deletedUsers: 100,
systemAdmins: 5,
recentLogins: 450,
newUsersToday: 12,
},
};
mockServiceInstance.getDashboardStats.mockResolvedValue(Result.ok(mockStats));
(AdminDashboardViewDataBuilder.build as any).mockReturnValue(mockViewData);
const result = await AdminDashboardPageQuery.execute();
expect(result.isOk()).toBe(true);
expect(result.unwrap()).toEqual(mockViewData);
});
});