feat: name export file with meaningful title instead of id (#379)
This commit is contained in:
@@ -7,6 +7,7 @@ import defineStep from '../../models/steps.js';
|
||||
import defineFolder from '../../models/folders.js';
|
||||
import authMiddleware from '../../middleware/auth.js';
|
||||
import visibilityMiddleware from '../../middleware/verifyVisible.js';
|
||||
import { contentDisposition, toSafeFileName } from '../../config/contentDisposition.js';
|
||||
import { testRunStatus, priorities, testTypes, automationStatus, templates } from '../../config/enums.js';
|
||||
|
||||
export default function (sequelize) {
|
||||
@@ -31,6 +32,16 @@ export default function (sequelize) {
|
||||
}
|
||||
|
||||
try {
|
||||
const folder = await Folder.findByPk(folderId);
|
||||
if (!folder) {
|
||||
return res.status(404).send('Folder not found');
|
||||
}
|
||||
|
||||
const folderName = toSafeFileName(folder.name);
|
||||
const filename = `${folderName}.${type}`;
|
||||
res.setHeader('Access-Control-Expose-Headers', 'Content-Disposition');
|
||||
res.setHeader('Content-Disposition', contentDisposition(filename));
|
||||
|
||||
const cases = await Case.findAll({
|
||||
attributes: { exclude: ['createdAt', 'updatedAt', 'caseSteps'] },
|
||||
include: [
|
||||
@@ -74,7 +85,6 @@ export default function (sequelize) {
|
||||
});
|
||||
|
||||
res.setHeader('Content-Type', 'text/csv; charset=utf-8');
|
||||
res.setHeader('Content-Disposition', `attachment; filename=cases_folder_${folderId}.csv`);
|
||||
return res.send(csv);
|
||||
}
|
||||
|
||||
|
||||
@@ -34,7 +34,13 @@ vi.mock('../../middleware/verifyVisible.js', () => ({
|
||||
}),
|
||||
}));
|
||||
|
||||
// mock defineCase
|
||||
const mockFolder = {
|
||||
findByPk: vi.fn(),
|
||||
};
|
||||
vi.mock('../../models/folders.js', () => ({
|
||||
default: () => mockFolder,
|
||||
}));
|
||||
|
||||
const mockCase = {
|
||||
findAll: vi.fn(),
|
||||
belongsToMany: vi.fn(),
|
||||
@@ -66,6 +72,8 @@ describe('GET /download with type=csv', () => {
|
||||
});
|
||||
|
||||
it('should return CSV with human-readable labels for state, priority, type, automationStatus, and template', async () => {
|
||||
mockFolder.findByPk.mockResolvedValue({ id: 1, name: 'Test Folder' });
|
||||
|
||||
mockCase.findAll.mockResolvedValue([
|
||||
{
|
||||
id: 1,
|
||||
@@ -112,7 +120,7 @@ describe('GET /download with type=csv', () => {
|
||||
|
||||
expect(response.status).toBe(200);
|
||||
expect(response.headers['content-type']).toBe('text/csv; charset=utf-8');
|
||||
expect(response.headers['content-disposition']).toBe('attachment; filename=cases_folder_1.csv');
|
||||
expect(response.headers['content-disposition']).toContain('attachment; filename="Test Folder.csv"');
|
||||
|
||||
const csvContent = response.text;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user