Используете mocha / chai, чтобы гарантировать, что REST API обслуживает файл?

Я хочу подтвердить, что вызов одной из конечных точек моего REST API обслуживает файл, но я не уверен, как это сделать, и я не вижу никаких примеров по этому поводу? Я просмотрел документацию, но это мне не очень помогло.

Код на стороне сервера, по сути, делает (в Express):

handleRetrieveContent(req, res, next) {
   const filepaht = '...';
   res.sendFile(filepath)
}

и тестовый пример:

it('Should get a file', (done) => {
    chai.request(url)
        .get('/api/exercise/1?token=' + token)
        .end(function(err, res) {
            if (err) { done(err); }
            res.should.have.status(200);
            // Not sure what the test here should be?
            res.should.be.json;
            // TODO get access to saved file and do tests on it                
        });
});     

По сути, я хочу провести следующие тесты:

  • убедитесь, что ответ - это файл
  • убедитесь, что файл имеет допустимое содержимое (проверка контрольной суммы)

Любая помощь будет оценена по достоинству.


person Andre M    schedule 09.11.2016    source источник


Ответы (1)


Предоставленное решение было основано на дальнейших экспериментах, и ответ был предоставлен на странице https://github.com/chaijs/chai-http/issues/126 - код примечания предполагает использование ES6 (проверено с Node 6.7.0).

const chai = require('chai');
const chaiHttp = require('chai-http');
const md5 = require('md5');
const expect = chai.expect;

const binaryParser = function (res, cb) {
    res.setEncoding('binary');
    res.data = '';
    res.on("data", function (chunk) {
        res.data += chunk;
    });
    res.on('end', function () {
        cb(null, new Buffer(res.data, 'binary'));
    });
};

it('Should get a file', (done) => {
    chai.request(url)
    .get('/api/exercise/1?token=' + token)
        .buffer()
        .parse(binaryParser)
        .end(function(err, res) {
            if (err) { done(err); }
            res.should.have.status(200);

            // Check the headers for type and size
            res.should.have.header('content-type');
            res.header['content-type'].should.be.equal('application/pdf');
            res.should.have.header('content-length');
            const size = fs.statSync(filepath).size.toString();
            res.header['content-length'].should.be.equal(size);
           
            // verify checksum                
            expect(md5(res.body)).to.equal('fa7d7e650b2cec68f302b31ba28235d8');              
        });
});

Изменить: большая часть этого была в Чтении выходного буфера / потока ответа с помощью супертеста / суперагента на сервере node.js с возможными улучшениями

person Andre M    schedule 10.11.2016