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

View File

@@ -0,0 +1,96 @@
import { beforeEach, describe, expect, it, vi } from 'vitest'
import { createEvent, mockSuccessReadBody } from './setup'
import fs from 'fs/promises'
vi.mock('multer', () => {
const single = vi.fn((field) => (req, _res, cb) => {
if (req.__mockMulterError) {
cb(req.__mockMulterError)
return
}
req.file = req.__mockFile || null
req.body = req.body || {}
cb(null)
})
const multerFn = vi.fn(() => ({ single }))
const diskStorage = vi.fn(() => ({}))
multerFn.diskStorage = diskStorage
return {
default: multerFn,
diskStorage
}
})
vi.mock('child_process', () => ({
exec: vi.fn()
}))
vi.mock('util', () => ({
promisify: () => () => Promise.resolve({ stdout: 'PDF Inhalt', stderr: '' })
}))
import saveCsvHandler from '../server/api/cms/save-csv.post.js'
import uploadSpielplanHandler from '../server/api/cms/upload-spielplan-pdf.post.js'
import satzungUploadHandler from '../server/api/cms/satzung-upload.post.js'
describe('CMS File Endpoints', () => {
beforeEach(() => {
vi.restoreAllMocks()
vi.clearAllMocks()
})
describe('POST /api/cms/save-csv', () => {
it('validiert Eingaben', async () => {
const event = createEvent()
mockSuccessReadBody({})
await expect(saveCsvHandler(event)).rejects.toMatchObject({ statusCode: 400 })
})
it('speichert erlaubte Datei', async () => {
const event = createEvent()
mockSuccessReadBody({ filename: 'mannschaften.csv', content: 'data' })
vi.spyOn(fs, 'mkdir').mockResolvedValue(undefined)
vi.spyOn(fs, 'writeFile').mockResolvedValue(undefined)
const response = await saveCsvHandler(event)
expect(response.success).toBe(true)
expect(fs.writeFile).toHaveBeenCalled()
})
})
describe('POST /api/cms/upload-spielplan-pdf', () => {
it('erfordert Authorization Header', async () => {
const event = createEvent({ method: 'POST' })
event.node.req.__mockFile = { filename: 'file.pdf', originalname: 'orig.pdf', path: 'tmp', mimetype: 'application/pdf' }
event.node.req.body = { type: 'gesamt' }
await expect(uploadSpielplanHandler(event)).rejects.toMatchObject({ statusCode: 401 })
})
it('lädt PDF hoch und gibt Erfolg zurück', async () => {
const event = createEvent({ method: 'POST', headers: { authorization: 'Bearer token' } })
event.node.req.__mockFile = { filename: 'spielplan_gesamt.pdf', originalname: 'orig.pdf', path: 'tmp', mimetype: 'application/pdf' }
event.node.req.body = { type: 'gesamt' }
const response = await uploadSpielplanHandler(event)
expect(response.success).toBe(true)
expect(response.filename).toBeDefined()
})
})
describe('POST /api/cms/satzung-upload', () => {
it('verarbeitet hochgeladene Satzung', async () => {
const event = createEvent({ method: 'POST' })
event.node.req.__mockFile = { path: 'public/documents/satzung.pdf', filename: 'satzung.pdf', originalname: 'satzung.pdf', mimetype: 'application/pdf' }
vi.spyOn(fs, 'readFile').mockResolvedValueOnce(JSON.stringify({ seiten: {}, vorstand: { vorsitzender: { email: '' }, schriftfuehrer: { email: '' } } }))
vi.spyOn(fs, 'writeFile').mockResolvedValue(undefined)
const response = await satzungUploadHandler(event)
expect(response.success).toBe(true)
expect(fs.writeFile).toHaveBeenCalled()
})
})
})