diff --git a/src/__tests__/sessionController.test.ts b/src/__tests__/sessionController.test.ts new file mode 100644 index 00000000..2ed983d9 --- /dev/null +++ b/src/__tests__/sessionController.test.ts @@ -0,0 +1,31 @@ +import { describe, it, expect } from 'vitest'; +import { filterSessionsByStatus } from '../controllers/sessionController'; +import { Session } from '../models/Session'; + +describe('filterSessionsByStatus', () => { + const mockSessions: Session[] = [ + { id: '1', title: 'A', status: 'active', createdAt: new Date(), userId: 'u1' }, + { id: '2', title: 'B', status: 'completed', createdAt: new Date(), userId: 'u2' }, + { id: '3', title: 'C', status: 'expired', createdAt: new Date(), userId: 'u3' }, + ]; + + it('returns all sessions when no filter provided', () => { + expect(filterSessionsByStatus(mockSessions).length).toBe(3); + }); + + it('filters by single status', () => { + const result = filterSessionsByStatus(mockSessions, ['active']); + expect(result.length).toBe(1); + expect(result[0].status).toBe('active'); + }); + + it('filters by multiple statuses', () => { + const result = filterSessionsByStatus(mockSessions, ['active', 'completed']); + expect(result.length).toBe(2); + }); + + it('returns empty array for invalid statuses', () => { + const result = filterSessionsByStatus(mockSessions, ['invalid']); + expect(result.length).toBe(0); + }); +}); diff --git a/src/controllers/sessionController.ts b/src/controllers/sessionController.ts new file mode 100644 index 00000000..09b5fa84 --- /dev/null +++ b/src/controllers/sessionController.ts @@ -0,0 +1,16 @@ +import { Session, VALID_STATUSES, SessionStatus } from '../models/Session'; + +export const filterSessionsByStatus = ( + sessions: Session[], + statuses?: string[] +): Session[] => { + if (!statuses || statuses.length === 0) return sessions; + + const validFilters = statuses.filter(s => + VALID_STATUSES.includes(s as SessionStatus) + ) as SessionStatus[]; + + if (validFilters.length === 0) return []; + + return sessions.filter(session => validFilters.includes(session.status)); +}; diff --git a/src/models/Session.ts b/src/models/Session.ts new file mode 100644 index 00000000..29abd313 --- /dev/null +++ b/src/models/Session.ts @@ -0,0 +1,11 @@ +export type SessionStatus = 'active' | 'completed' | 'expired' | 'cancelled'; + +export const VALID_STATUSES: SessionStatus[] = ['active', 'completed', 'expired', 'cancelled']; + +export interface Session { + id: string; + title: string; + status: SessionStatus; + createdAt: Date; + userId: string; +}