81 lines
2.6 KiB
TypeScript
81 lines
2.6 KiB
TypeScript
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
|
|
const cookieStore = {
|
|
get: vi.fn(),
|
|
set: vi.fn(),
|
|
delete: vi.fn(),
|
|
};
|
|
|
|
vi.mock('next/headers', () => {
|
|
return {
|
|
cookies: () => cookieStore,
|
|
};
|
|
});
|
|
|
|
import { GET as startGet } from '../../../../apps/website/app/auth/iracing/start/route';
|
|
import { GET as callbackGet } from '../../../../apps/website/app/auth/iracing/callback/route';
|
|
import { POST as logoutPost } from '../../../../apps/website/app/auth/logout/route';
|
|
|
|
describe('iRacing auth route handlers', () => {
|
|
beforeEach(() => {
|
|
cookieStore.get.mockReset();
|
|
cookieStore.set.mockReset();
|
|
cookieStore.delete.mockReset();
|
|
});
|
|
|
|
it('start route redirects to auth URL and sets state cookie', async () => {
|
|
const req = new Request('http://localhost/auth/iracing/start?returnTo=/dashboard');
|
|
|
|
const res = await startGet(req);
|
|
|
|
expect(res.status).toBe(307);
|
|
const location = res.headers.get('location') ?? '';
|
|
expect(location).toContain('/auth/iracing/callback');
|
|
expect(location).toContain('returnTo=%2Fdashboard');
|
|
expect(location).toMatch(/state=/);
|
|
|
|
expect(cookieStore.set).toHaveBeenCalled();
|
|
const [name] = cookieStore.set.mock.calls[0];
|
|
expect(name).toBe('gp_demo_auth_state');
|
|
});
|
|
|
|
it('callback route creates session cookie and redirects to returnTo', async () => {
|
|
cookieStore.get.mockImplementation((name: string) => {
|
|
if (name === 'gp_demo_auth_state') {
|
|
return { value: 'valid-state' };
|
|
}
|
|
return undefined;
|
|
});
|
|
|
|
const req = new Request(
|
|
'http://localhost/auth/iracing/callback?code=demo-code&state=valid-state&returnTo=/dashboard',
|
|
);
|
|
|
|
const res = await callbackGet(req);
|
|
|
|
expect(res.status).toBe(307);
|
|
const location = res.headers.get('location');
|
|
expect(location).toBe('http://localhost/dashboard');
|
|
|
|
expect(cookieStore.set).toHaveBeenCalled();
|
|
const [sessionName, sessionValue] = cookieStore.set.mock.calls[0];
|
|
expect(sessionName).toBe('gp_demo_session');
|
|
expect(typeof sessionValue).toBe('string');
|
|
|
|
expect(cookieStore.delete).toHaveBeenCalledWith('gp_demo_auth_state');
|
|
});
|
|
|
|
it('logout route deletes session cookie and redirects home using request origin', async () => {
|
|
const req = new Request('http://example.com/auth/logout', {
|
|
method: 'POST',
|
|
});
|
|
|
|
const res = await logoutPost(req);
|
|
|
|
expect(res.status).toBe(307);
|
|
const location = res.headers.get('location');
|
|
expect(location).toBe('http://example.com/');
|
|
|
|
expect(cookieStore.delete).toHaveBeenCalledWith('gp_demo_session');
|
|
});
|
|
}); |