const sinon = require('sinon');
const proxyquire = require('proxyquire').noCallThru();

const storage = {
  ttl: sinon.stub()
};

function request(id, meta) {
  return {
    params: { id },
    meta
  };
}

function response() {
  return {
    sendStatus: sinon.stub(),
    send: sinon.stub()
  };
}

const infoRoute = proxyquire('../../server/routes/info', {
  '../storage': storage
});

describe('/api/info', function() {
  afterEach(function() {
    storage.ttl.reset();
  });

  it('calls storage.ttl with the id parameter', async function() {
    const req = request('x');
    const res = response();
    await infoRoute(req, res);
    sinon.assert.calledWith(storage.ttl, 'x');
  });

  it('sends a 404 on failure', async function() {
    storage.ttl.returns(Promise.reject(new Error()));
    const res = response();
    await infoRoute(request('x'), res);
    sinon.assert.calledWith(res.sendStatus, 404);
  });

  it('returns a json object', async function() {
    storage.ttl.returns(Promise.resolve(123));
    const meta = {
      dlimit: '1',
      dl: '0'
    };
    const res = response();
    await infoRoute(request('x', meta), res);
    sinon.assert.calledWithMatch(res.send, {
      dlimit: 1,
      dtotal: 0,
      ttl: 123
    });
  });
});