Skip to content

Commit

Permalink
feat: added tests to make sure the cors headers are properly set
Browse files Browse the repository at this point in the history
And add a working version for csv, although it is kinda hacky-ish.

The whole issue is explained here: #75
  • Loading branch information
AdriVanHoudt committed Jan 21, 2020
1 parent 81c87ff commit 4e81971
Show file tree
Hide file tree
Showing 2 changed files with 141 additions and 8 deletions.
19 changes: 11 additions & 8 deletions lib/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,6 @@ exports.plugin = {

server.ext('onPreResponse', async (request, h) => {

//todo
if (request.response.isBoom) {
return h.continue;
}
Expand Down Expand Up @@ -116,14 +115,20 @@ exports.plugin = {
delimiter: internals.separator
});

csvStream.pipe(res);
csvStream._readableState.objectMode = false;

res.setHeader('Content-disposition', 'attachment;');
res.setHeader('Content-type', `${preferredType}; charset=utf-8; header=present;`);
// csvStream.pipe(res);

csvStream.headers = {
'Content-disposition': 'attachment;',
'Content-type': `${preferredType}; charset=utf-8; header=present;`
};
// res.setHeader('Content-disposition', 'attachment;');
// res.setHeader('Content-type', `${preferredType}; charset=utf-8; header=present;`);

internals.headerQueryMapToCsv(headerQueryMap, dataset, csvStream);

return h.abandon;
return csvStream;
});
}
};
Expand Down Expand Up @@ -270,10 +275,8 @@ internals.headerQueryMapToCsv = (headerQueryMap, dataset, csvStream) => {
// Push data to stream
internals.generateDataRows(headerQueryMap, dataset, (dataRow) => {

dataRow = dataRow.map((value) => {
dataRow = dataRow.map((value) => `${value}`);

return `${value}`;
});
csvStream.write(dataRow);
});

Expand Down
130 changes: 130 additions & 0 deletions test/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -985,4 +985,134 @@ describe('Hapi csv', () => {
return await server.stop();
});
});

describe('handle cors headers', () => {

it('Require cors headers to be returned CSV', async () => {

const result = [{
first_name: 'firstName1',
last_name: 'lastName1',
age: 25
}, {
first_name: 'firstName2',
last_name: 'lastName2',
age: 27
}];

const server = new Hapi.Server({
routes: {
cors: { credentials: true }
}
});

await server.register({
plugin: HapiCsv,
options: {
resultKey: 'items'
}
});

server.route([{
method: 'GET',
path: '/test',
options: {
handler: function (request, h) {

return result;
},
response: {
schema: Joi.array().items(
Joi.object().keys({
first_name: Joi.string(),
last_name: Joi.string(),
age: Joi.number()
})
)
}
}
}]);

await server.initialize();

const res = await server.inject({
method: 'GET',
url: '/test',
headers: {
'Accept': 'text/csv'
}
});

expect(res.headers['content-type']).to.equal('text/csv; charset=utf-8; header=present;');
expect(res.headers['content-disposition']).to.equal('attachment;');
expect(res.headers['access-control-allow-credentials']).to.equal('true');
expect(res.headers['access-control-expose-headers']).to.equal('WWW-Authenticate,Server-Authorization');

return server.stop();
});

it('Require cors headers to be returned Excel', async () => {

const result = [{
first_name: 'firstName1',
last_name: 'lastName1',
age: 25
}, {
first_name: 'firstName2',
last_name: 'lastName2',
age: 27
}];

const server = new Hapi.Server({
routes: {
cors: { credentials: true }
}
});

await server.register({
plugin: HapiCsv,
options: {
enableExcel: true,
resultKey: 'items'
}
});

server.route([{
method: 'GET',
path: '/test',
options: {
handler: function (request, h) {

return result;
},
response: {
schema: Joi.array().items(
Joi.object().keys({
first_name: Joi.string(),
last_name: Joi.string(),
age: Joi.number()
})
)
}
}
}]);

await server.initialize();

const res = await server.inject({
method: 'GET',
url: '/test',
headers: {
'Accept': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
}
});

expect(res.headers['content-type']).to.equal('application/vnd.openxmlformats-officedocument.spreadsheetml.sheet; charset=utf-8; header=present;');
expect(res.headers['content-disposition']).to.equal('attachment;');
expect(res.headers['access-control-allow-credentials']).to.equal('true');
expect(res.headers['access-control-expose-headers']).to.equal('WWW-Authenticate,Server-Authorization');

return server.stop();
});
});
});

0 comments on commit 4e81971

Please sign in to comment.