Files
tatort/tests/views/Anmeldung.test.ts

176 lines
4.6 KiB
TypeScript

import { describe, it, expect, vi } from 'vitest';
// import { actions } from '$root/routes/anmeldung/+page.server';
// import { load } from '$root/routes/(token-based)/+layout.server'
import { actions } from '../../src/routes/anmeldung/+page.server';
import { load } from '../../src/routes/(token-based)/+layout.server';
import { baseData } from '../fixtures';
import { ROUTE_NAMES } from '../../src/routes';
import { dev } from '$app/environment';
import { vorgangExists, vorgangPINValidation } from '$lib/server/vorgangService';
import type { Redirect } from '@sveltejs/kit';
vi.mock('$lib/server/vorgangService', () => ({
vorgangExists: vi.fn(),
vorgangPINValidation: vi.fn()
}));
describe('Vorgang Anzeige via Token', () => {
it('Setze Cookie nach erfolgreicher Eingabe', async () => {
// Mock formData
const vorgObj = baseData.vorgang;
const formData = new FormData();
formData.set('vorgang-token', vorgObj.vorgangToken);
formData.set('vorgang-pin', vorgObj.vorgangPIN);
const mockRequest = {
formData: vi.fn().mockResolvedValue(formData)
};
vi.mocked(vorgangPINValidation).mockReturnValueOnce(true);
const cookiesSet = vi.fn();
const event = {
request: mockRequest,
cookies: {
set: cookiesSet
}
};
let thrownRedirect: Redirect | undefined;
try {
await actions.default(event);
} catch (e) {
thrownRedirect = e as Redirect;
}
// Redirect bei erfolgreicher Eingabe
expect(thrownRedirect?.status).toBe(303);
expect(thrownRedirect?.location).toBe(ROUTE_NAMES.VORGANG(vorgObj.vorgangToken));
// Cookie wurde gesetzt
const COOKIE_NAME = `token-${vorgObj.vorgangToken}`;
expect(cookiesSet).toHaveBeenCalledWith(COOKIE_NAME, vorgObj.vorgangPIN, {
path: '/',
httpOnly: true,
sameSite: 'strict',
secure: !dev
});
});
it('Schlägt fehl wenn keine Daten übergeben werden', async () => {
const formData = new FormData(); // no data
const mockRequest = {
formData: vi.fn().mockResolvedValue(formData)
};
const cookiesSet = vi.fn();
const event = {
request: mockRequest,
cookies: {
set: cookiesSet
}
};
const result = await actions.default(event);
expect(result.status).toBe(400);
expect(result.data.message).toMatch(/PIN eingeben/i);
// Cookie wird nicht gesetzt
expect(cookiesSet).not.toHaveBeenCalled();
});
it('Falsche PIN', async () => {
// Mock formData
const vorgObj = baseData.vorgang;
const formData = new FormData();
formData.set('vorgang-token', vorgObj.vorgangToken);
formData.set('vorgang-pin', vorgObj.vorgangPIN);
const mockRequest = {
formData: vi.fn().mockResolvedValue(formData)
};
// PIN-Validierung nicht erfolgreich
vi.mocked(vorgangPINValidation).mockReturnValueOnce(false);
const cookiesSet = vi.fn();
const event = {
request: mockRequest,
cookies: {
set: cookiesSet
}
};
const result = await actions.default(event);
expect(result.status).toBe(400);
expect(result.data.message).toMatch(/Falsch/i);
});
// Nicht vorhandener Vorgang-Token nicht notwendig, da PIN-Check
// entsprechend fehlerhaft
it.skip('Nicht vorhandener Vorgang-Token', () => {});
});
describe('Teste Guard', () => {
it('Lese Cookie aus', async () => {
const vorgObj = baseData.vorgang;
const COOKIE_NAME = `token-${vorgObj.vorgangToken}`;
const cookiesGet = vi.fn().mockImplementation((key: string) => {
if (key === COOKIE_NAME) return vorgObj.vorgangPIN;
return undefined;
});
// mocked objects
const event = {
cookies: {
get: cookiesGet
},
locals: {},
params: { vorgang: vorgObj.vorgangToken }
};
vi.mocked(vorgangExists).mockReturnValueOnce(true);
vi.mocked(vorgangPINValidation).mockReturnValueOnce(true);
await load(event);
expect(cookiesGet).toHaveBeenCalledWith(COOKIE_NAME);
});
it('Kein Cookie gesetzt', async () => {
const vorgObj = baseData.vorgang;
const COOKIE_NAME = `token-${vorgObj.vorgangToken}`;
const cookiesGet = vi.fn().mockImplementation((key: string) => {
if (key === COOKIE_NAME) return vorgObj.vorgangPIN;
return undefined;
});
// mocked objects
const event = {
cookies: {
get: cookiesGet
},
locals: {},
params: { vorgang: vorgObj.vorgangToken }
};
vi.mocked(vorgangExists).mockReturnValueOnce(true);
vi.mocked(vorgangPINValidation).mockReturnValueOnce(false);
let thrownRedirect;
try {
await load(event);
throw new Error('Function did not throw');
} catch (e) {
thrownRedirect = e;
}
expect(thrownRedirect?.status).toBe(303);
expect(thrownRedirect?.location).toBe(
ROUTE_NAMES.ANMELDUNG_VORGANG_PARAM(vorgObj.vorgangToken)
);
expect(cookiesGet).toHaveBeenCalledWith(COOKIE_NAME);
});
});