Update dependencies in package.json and package-lock.json; add testing scripts for Vitest, and include new packages such as supertest and vitest. Refactor Navigation component to improve event handling and cleanup, ensuring better performance and user experience. Enhance error handling in various API endpoints for PDF uploads and CSV saves, ensuring robust error propagation. Update nodemailer transport configuration for consistency across API handlers.

This commit is contained in:
Torsten Schulz (local)
2025-11-10 13:08:50 +01:00
parent 95d7a3dfe8
commit bde1d32b14
15 changed files with 2055 additions and 15 deletions

121
tests/setup.ts Normal file
View File

@@ -0,0 +1,121 @@
import { vi } from 'vitest'
type CookieStore = Record<string, { value: string; options?: Record<string, any> }>
declare global {
// eslint-disable-next-line no-var
var __testCookies__: WeakMap<any, CookieStore>
}
if (!global.__testCookies__) {
global.__testCookies__ = new WeakMap()
}
const getCookieStore = (event: any): CookieStore => {
if (!global.__testCookies__.has(event)) {
global.__testCookies__.set(event, {})
}
return global.__testCookies__.get(event) as CookieStore
}
global.readBody = vi.fn(async (event: any) => event.__body ?? null)
global.getQuery = (event: any) => event.__query ?? {}
global.getHeader = (event: any, name: string) => {
const headers = event.node?.req?.headers || {}
const key = Object.keys(headers).find(h => h.toLowerCase() === name.toLowerCase())
return key ? headers[key] : undefined
}
global.setCookie = (event: any, name: string, value: string, options = {}) => {
const store = getCookieStore(event)
store[name] = { value, options }
}
global.getCookie = (event: any, name: string) => {
const store = getCookieStore(event)
return store[name]?.value ?? null
}
global.deleteCookie = (event: any, name: string) => {
const store = getCookieStore(event)
if (store[name]) {
delete store[name]
}
}
global.createError = ({ statusCode = 500, statusMessage, message }: any) => {
const error = new Error(statusMessage || message || 'Unbekannter Fehler')
error.name = 'H3Error'
// @ts-ignore
error.statusCode = statusCode
// @ts-ignore
error.statusMessage = statusMessage || message || 'Fehler'
return error
}
global.useRuntimeConfig = () => ({
encryptionKey: 'test-encryption-key',
smtp: {
host: 'localhost',
port: 1025,
user: 'test',
pass: 'pass'
},
membership: {
adminEmails: ['admin@test.local']
}
})
global.defineEventHandler = (handler: any) => handler
export const createEvent = (overrides: Record<string, any> = {}) => {
const event = {
context: {},
node: {
req: {
headers: overrides.headers || {},
method: overrides.method || 'GET'
},
res: {
setHeader: vi.fn(),
getHeader: vi.fn(),
end: vi.fn(),
statusCode: 200
}
},
__body: overrides.body,
__query: overrides.query,
...overrides
}
if (overrides.cookies) {
const store = getCookieStore(event)
Object.entries(overrides.cookies).forEach(([key, value]) => {
store[key] = { value: value as string }
})
}
return event
}
export const resetEventMocks = () => {
(global.readBody as any).mockClear()
global.__testCookies__ = new WeakMap()
}
export const expectError = async (fn: () => Promise<any>, statusCode: number) => {
try {
await fn()
throw new Error('Erwarteter Fehler wurde nicht ausgelöst')
} catch (error: any) {
expect(error.statusCode).toBe(statusCode)
}
}
export const mockSuccessReadBody = (payload: any) => {
(global.readBody as any).mockResolvedValue(payload)
}
beforeEach(() => {
resetEventMocks()
})