const test = require('node:test'); const assert = require('node:assert/strict'); const fs = require('node:fs'); const os = require('node:os'); const path = require('node:path'); const express = require('express'); require('../src/common'); const { createUploadSyncService } = require('../src/web/lib/media'); test('multipart uploads accept large text fields used by slide and template forms', async () => { const uploadDir = fs.mkdtempSync(path.join(os.tmpdir(), 'pulse-signage-upload-')); const uploadSyncService = createUploadSyncService({ common: {}, playerSnapshotCache: new Map(), notifyPlayerScreens: async () => {} }); const upload = uploadSyncService.createUploadMiddleware(uploadDir); const app = express(); app.post('/upload', upload.any(), function (_req, res) { res.sendStatus(204); }); app.use(function (error, _req, res, _next) { res.status(error.statusCode || 500).send(String(error && error.message ? error.message : error)); }); const server = app.listen(0); try { const address = server.address(); const largeValue = 'x'.repeat(1_100_000); const formData = new FormData(); formData.set('region_text_6', largeValue); const response = await fetch(`http://127.0.0.1:${address.port}/upload`, { method: 'POST', body: formData }); assert.equal(response.status, 204); } finally { await new Promise((resolve) => server.close(resolve)); fs.rmSync(uploadDir, { recursive: true, force: true }); } });