1

I have an application build with koa and koa-router. When testing routes with supertest I face a problem, that content-type response header is always application/json; charset=utf-8.

const app = koa();
router
    .get('/img', function *(next) {
      this.type = 'image/png';
      // this.set('Content-Type', 'image/png'); 
      // this.set('content-type', 'image/png');
      this.body = renderImage();
    });

app
  .use(router.routes())
  .use(router.allowedMethods());


describe('Routes', () => {

  it('should handle /tiles/*/*/*/* requests', (done) => {
    request(http.createServer(app.callback()))
      .get('/img')
      .expect(200)
      .expect('Content-Type', 'image/png')
      .end(function (err, res) {
        console.log(res.res.headers);
        if (err) return done(err);

        expect(renderImage).to.be.called;
        done();
      });
  });

How test fails:

Error: expected "Content-Type" of "image/png", got "application/json; charset=utf-8" at Test._assertHeader (node_modules/supertest/lib/test.js:215:12) at Test._assertFunction (node_modules/supertest/lib/test.js:247:11) at Test.assert (node_modules/supertest/lib/test.js:148:18) at Server.assert (node_modules/supertest/lib/test.js:127:12) at emitCloseNT (net.js:1525:8)

What is logged via console.log(res.res.headers):

{ 'content-type': 'application/json; charset=utf-8',
'content-length': '2',
date: 'Wed, 09 Mar 2016 10:15:37 GMT',
connection: 'close' }

Yet, if I do a request from the browser to the provided route, content-type header is changed correctly:

Connection:keep-alive
Content-Length:334
Content-Type:image/png
Date:Wed, 09 Mar 2016 10:15:01 GMT

Neither this.set('Content-Type', 'image/png'); nor this.set('content-type', 'image/png'); changes the situation.

Is it a bug? Has anyone faced the same issue?

Alexandr Lazarev
  • 12,554
  • 4
  • 38
  • 47

1 Answers1

2

A couple things to try:

Is this.body = renderImage() actually setting the body to null or undefined?
When looking through the Koa.js code for the response object, it looks like koa is removing the content-type header if the body is set to null or undefined.

Is the return value of renderImage() an object? If so, is it a buffer or stream? When the body is set koa tries to detect what the content-typeof the response should be. If it is not a string, Buffer, or stream, koa forces the content-type header to be application/json.

mikefrey
  • 4,653
  • 3
  • 29
  • 40
  • Thanks! I've stubbed `renderImage` function so that it returned an empty object: ``renderImage: sinon.stub().returns({})`. That was why the header was removed. I wonder why it is not mentioned in the specs. – Alexandr Lazarev Mar 10 '16 at 17:06