155 lines
5.2 KiB
TypeScript
155 lines
5.2 KiB
TypeScript
// File: frontend/lib/services/__tests__/session.service.test.ts
|
|
// Change Log:
|
|
// - 2026-06-13: Refactor to use static imports instead of require, fixing ESM module resolution errors
|
|
|
|
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
import { sessionService, extractArrayData, transformSession } from '../session.service';
|
|
import apiClient from '@/lib/api/client';
|
|
|
|
// Mock apiClient
|
|
vi.mock('@/lib/api/client', () => ({
|
|
default: {
|
|
get: vi.fn(),
|
|
delete: vi.fn(),
|
|
},
|
|
}));
|
|
|
|
describe('sessionService', () => {
|
|
beforeEach(() => {
|
|
vi.clearAllMocks();
|
|
});
|
|
|
|
describe('getActiveSessions', () => {
|
|
it('should get active sessions from array response', async () => {
|
|
const mockSessions = [
|
|
{
|
|
id: 1,
|
|
userId: 1,
|
|
user: { username: 'testuser', firstName: 'Test', lastName: 'User' },
|
|
deviceName: 'Chrome',
|
|
ipAddress: '192.168.1.1',
|
|
lastActive: '2026-01-01T00:00:00Z',
|
|
isCurrent: true,
|
|
},
|
|
];
|
|
(apiClient.get as any).mockResolvedValue({ data: mockSessions });
|
|
const result = await sessionService.getActiveSessions();
|
|
expect(result).toHaveLength(1);
|
|
expect(result[0].id).toBe(1);
|
|
expect(result[0].user.username).toBe('testuser');
|
|
expect(apiClient.get).toHaveBeenCalledWith('/auth/sessions');
|
|
});
|
|
|
|
it('should get active sessions from nested data response', async () => {
|
|
const mockSessions = [
|
|
{
|
|
id: 2,
|
|
userId: 2,
|
|
user: { username: 'testuser2', firstName: 'Test2', lastName: 'User2' },
|
|
deviceName: 'Firefox',
|
|
ipAddress: '192.168.1.2',
|
|
lastActive: '2026-01-02T00:00:00Z',
|
|
isCurrent: false,
|
|
},
|
|
];
|
|
(apiClient.get as any).mockResolvedValue({ data: { data: mockSessions } });
|
|
const result = await sessionService.getActiveSessions();
|
|
expect(result).toHaveLength(1);
|
|
expect(result[0].id).toBe(2);
|
|
expect(apiClient.get).toHaveBeenCalledWith('/auth/sessions');
|
|
});
|
|
|
|
it('should handle string id in session and convert to number', async () => {
|
|
const mockSessions = [
|
|
{
|
|
id: '3',
|
|
userId: 3,
|
|
user: { username: 'testuser3', firstName: 'Test3', lastName: 'User3' },
|
|
deviceName: 'Safari',
|
|
ipAddress: '192.168.1.3',
|
|
lastActive: '2026-01-03T00:00:00Z',
|
|
isCurrent: false,
|
|
},
|
|
];
|
|
(apiClient.get as any).mockResolvedValue({ data: { data: { data: mockSessions } } });
|
|
const result = await sessionService.getActiveSessions();
|
|
expect(result).toHaveLength(1);
|
|
expect(result[0].id).toBe(3);
|
|
expect(typeof result[0].id).toBe('number');
|
|
});
|
|
|
|
it('should return empty array for non-array response', async () => {
|
|
(apiClient.get as any).mockResolvedValue({ data: 'not an array' });
|
|
const result = await sessionService.getActiveSessions();
|
|
expect(result).toEqual([]);
|
|
});
|
|
|
|
it('should return empty array for null response', async () => {
|
|
(apiClient.get as any).mockResolvedValue({ data: null });
|
|
const result = await sessionService.getActiveSessions();
|
|
expect(result).toEqual([]);
|
|
});
|
|
});
|
|
|
|
describe('revokeSession', () => {
|
|
it('should revoke session by id', async () => {
|
|
const mockResponse = { success: true };
|
|
(apiClient.delete as any).mockResolvedValue({ data: mockResponse });
|
|
const result = await sessionService.revokeSession(1);
|
|
expect(result).toEqual(mockResponse);
|
|
expect(apiClient.delete).toHaveBeenCalledWith('/auth/sessions/1');
|
|
});
|
|
|
|
it('should revoke session with numeric id', async () => {
|
|
const mockResponse = { success: true };
|
|
(apiClient.delete as any).mockResolvedValue({ data: mockResponse });
|
|
await sessionService.revokeSession(123);
|
|
expect(apiClient.delete).toHaveBeenCalledWith('/auth/sessions/123');
|
|
});
|
|
});
|
|
|
|
describe('Helper Functions', () => {
|
|
it('should extract array data from nested structure', () => {
|
|
const data = { data: { data: [1, 2, 3] } };
|
|
const result = extractArrayData(data);
|
|
expect(result).toEqual([1, 2, 3]);
|
|
});
|
|
|
|
it('should return empty array for non-array data', () => {
|
|
const data = { data: 'not an array' };
|
|
const result = extractArrayData(data);
|
|
expect(result).toEqual([]);
|
|
});
|
|
|
|
it('should transform session with number id', () => {
|
|
const session = {
|
|
id: 1,
|
|
userId: 1,
|
|
user: { username: 'test', firstName: 'Test', lastName: 'User' },
|
|
deviceName: 'Chrome',
|
|
ipAddress: '192.168.1.1',
|
|
lastActive: '2026-01-01T00:00:00Z',
|
|
isCurrent: true,
|
|
};
|
|
const result = transformSession(session);
|
|
expect(result.id).toBe(1);
|
|
expect(typeof result.id).toBe('number');
|
|
});
|
|
|
|
it('should transform session with string id to number', () => {
|
|
const session = {
|
|
id: '1',
|
|
userId: 1,
|
|
user: { username: 'test', firstName: 'Test', lastName: 'User' },
|
|
deviceName: 'Chrome',
|
|
ipAddress: '192.168.1.1',
|
|
lastActive: '2026-01-01T00:00:00Z',
|
|
isCurrent: true,
|
|
};
|
|
const result = transformSession(session);
|
|
expect(result.id).toBe(1);
|
|
expect(typeof result.id).toBe('number');
|
|
});
|
|
});
|
|
});
|