test Login angepasst, return fail wenn formaDaten leer

This commit is contained in:
2025-10-17 12:12:07 +02:00
parent 01afbea9a3
commit 416118197b
2 changed files with 112 additions and 110 deletions

View File

@@ -1,6 +1,6 @@
import { dev } from '$app/environment'; import { dev } from '$app/environment';
import { loginUser, logoutUser } from '$lib/server/authService'; import { loginUser, logoutUser } from '$lib/server/authService';
import { redirect } from '@sveltejs/kit'; import { fail, redirect } from '@sveltejs/kit';
import { ROUTE_NAMES } from '../index.js'; import { ROUTE_NAMES } from '../index.js';
export const actions = { export const actions = {
@@ -8,9 +8,13 @@ export const actions = {
logout: (event) => logoutUser(event), logout: (event) => logoutUser(event),
getVorgangByToken: async ({ request, cookies }) => { getVorgangByToken: async ({ request, cookies }) => {
const data = await request.formData(); const data = await request.formData();
const vorgangToken = data.get('vorgang-token') as string; const vorgangToken = data.get('vorgang-token');
const vorgangPIN = data.get('vorgang-pin') as string; const vorgangPIN = data.get('vorgang-pin') as string;
if (!vorgangToken || !vorgangPIN) {
return fail(400, { message: 'Token oder PIN fehlen' });
}
const COOKIE_NAME = `token-${vorgangToken}`; const COOKIE_NAME = `token-${vorgangToken}`;
cookies.set(COOKIE_NAME, vorgangPIN, { cookies.set(COOKIE_NAME, vorgangPIN, {
path: '/', path: '/',

View File

@@ -1,144 +1,142 @@
import { describe, it, expect, vi } from 'vitest'; import { describe, it, expect, vi } from 'vitest';
import { actions } from '$root/routes/anmeldung/+page.server'; // import { actions } from '$root/routes/anmeldung/+page.server';
import { load } from '$root/routes/(token-based)/+layout.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 { baseData } from '../fixtures';
import { ROUTE_NAMES } from '../../src/routes'; import { ROUTE_NAMES } from '../../src/routes';
import { dev } from '$app/environment'; import { dev } from '$app/environment';
import { vorgangExists, vorgangPINValidation } from '$lib/server/vorgangService'; import { vorgangExists, vorgangPINValidation } from '$lib/server/vorgangService';
import { Redirect } from '@sveltejs/kit'; import type { Redirect } from '@sveltejs/kit';
vi.mock('$lib/server/vorgangService', () => ({ vi.mock('$lib/server/vorgangService', () => ({
vorgangExists: vi.fn(), vorgangExists: vi.fn(),
vorgangPINValidation: vi.fn(), vorgangPINValidation: vi.fn()
})); }));
describe('Vorgang Anzeige via Token', () => { describe('Vorgang Anzeige via Token', () => {
it('Setze Cookie nach erfolgreicher Eingabe', async () => { it('Setze Cookie nach erfolgreicher Eingabe', async () => {
// Mock formData // Mock formData
const vorgObj = baseData.vorgang; const vorgObj = baseData.vorgang;
const formData = new FormData(); const formData = new FormData();
formData.set('vorgang-token', vorgObj.vorgangToken); formData.set('vorgang-token', vorgObj.vorgangToken);
formData.set('vorgang-pin', vorgObj.vorgangPIN); formData.set('vorgang-pin', vorgObj.vorgangPIN);
const mockRequest = { const mockRequest = {
formData: vi.fn().mockResolvedValue(formData) formData: vi.fn().mockResolvedValue(formData)
}; };
const cookiesSet = vi.fn(); const cookiesSet = vi.fn();
const event = { const event = {
request: mockRequest, request: mockRequest,
cookies: { cookies: {
set: cookiesSet set: cookiesSet
} }
}; };
let thrownRedirect: Redirect | undefined; let thrownRedirect: Redirect | undefined;
try { try {
await actions.getVorgangByToken(event); await actions.getVorgangByToken(event);
} catch (e) { } catch (e) {
thrownRedirect = e as Redirect; thrownRedirect = e as Redirect;
} }
// Redirect bei erfolgreicher Eingabe // Redirect bei erfolgreicher Eingabe
expect(thrownRedirect?.status).toBe(303); expect(thrownRedirect?.status).toBe(303);
expect(thrownRedirect?.location).toBe(ROUTE_NAMES.VORGANG(vorgObj.vorgangToken)); expect(thrownRedirect?.location).toBe(ROUTE_NAMES.VORGANG(vorgObj.vorgangToken));
// Cookie wurde gesetzt // Cookie wurde gesetzt
const COOKIE_NAME = `token-${vorgObj.vorgangToken}` const COOKIE_NAME = `token-${vorgObj.vorgangToken}`;
expect(cookiesSet).toHaveBeenCalledWith(COOKIE_NAME, vorgObj.vorgangPIN, { expect(cookiesSet).toHaveBeenCalledWith(COOKIE_NAME, vorgObj.vorgangPIN, {
path: '/', path: '/',
httpOnly: true, httpOnly: true,
sameSite: 'strict', sameSite: 'strict',
secure: !dev secure: !dev
}); });
}); });
it('Schlägt fehl wenn keine Daten übergeben werden', async () => { it('Schlägt fehl wenn keine Daten übergeben werden', async () => {
const formData = new FormData(); // no data const formData = new FormData(); // no data
const mockRequest = {
const mockRequest = { formData: vi.fn().mockResolvedValue(formData)
formData: vi.fn().mockResolvedValue(formData) };
}; const cookiesSet = vi.fn();
const event = {
const cookiesSet = vi.fn(); request: mockRequest,
cookies: {
const event = { set: cookiesSet
request: mockRequest, }
cookies: { };
set: cookiesSet const result = await actions.getVorgangByToken(event);
} expect(result.status).toBe(400);
}; expect(result.data.message).toMatch(/fehlen|ungültig/i);
// Cookie wird nicht gesetzt
const result = await actions.getVorgangByToken(event); expect(cookiesSet).not.toHaveBeenCalled();
});
expect(result).toBeUndefined(); it.todo('Überprüfe was passiert, wenn Eingabe falsch, bzw. nicht im System passend gefunden');
// Cookie wird nicht gesetzt
expect(cookiesSet).not.toHaveBeenCalled();
});
}); });
describe('Teste Guard', () => { describe('Teste Guard', () => {
it('Lese Cookie aus', async () => { it('Lese Cookie aus', async () => {
const vorgObj = baseData.vorgang; const vorgObj = baseData.vorgang;
const COOKIE_NAME = `token-${vorgObj.vorgangToken}` const COOKIE_NAME = `token-${vorgObj.vorgangToken}`;
const cookiesGet = vi.fn().mockImplementation((key: string) => { const cookiesGet = vi.fn().mockImplementation((key: string) => {
if (key === COOKIE_NAME) return vorgObj.vorgangPIN; if (key === COOKIE_NAME) return vorgObj.vorgangPIN;
return undefined; return undefined;
}); });
// mocked objects
const event = {
cookies: {
get: cookiesGet
},
locals: {},
params: { vorgang: vorgObj.vorgangToken }
};
vi.mocked(vorgangExists).mockReturnValueOnce(true);
vi.mocked(vorgangPINValidation).mockReturnValueOnce(true);
// mocked objects await load(event);
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);
});
expect(cookiesGet).toHaveBeenCalledWith(COOKIE_NAME); it('Kein Cookie gesetzt', async () => {
}); const vorgObj = baseData.vorgang;
it('Kein Cookie gesetzt', async () => { const COOKIE_NAME = `token-${vorgObj.vorgangToken}`;
const vorgObj = baseData.vorgang; const cookiesGet = vi.fn().mockImplementation((key: string) => {
if (key === COOKIE_NAME) return vorgObj.vorgangPIN;
return undefined;
});
const COOKIE_NAME = `token-${vorgObj.vorgangToken}` // mocked objects
const cookiesGet = vi.fn().mockImplementation((key: string) => { const event = {
if (key === COOKIE_NAME) return vorgObj.vorgangPIN; cookies: {
return undefined; 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)
);
// mocked objects expect(cookiesGet).toHaveBeenCalledWith(COOKIE_NAME);
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);
});
}); });