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() }) }) })