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

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

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

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

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

describe('/api/params', function() {
  afterEach(function() {
    storage.setField.reset();
  });

  it('calls storage.setField with the correct parameter', function() {
    const req = request('x');
    const dlimit = 2;
    req.body.dlimit = dlimit;
    const res = response();
    paramsRoute(req, res);
    sinon.assert.calledWith(storage.setField, 'x', 'dlimit', dlimit);
    sinon.assert.calledWith(res.sendStatus, 200);
  });

  it('sends a 400 if dlimit is too large', function() {
    const req = request('x');
    const res = response();
    req.body.dlimit = 201;
    paramsRoute(req, res);
    sinon.assert.calledWith(res.sendStatus, 400);
  });

  it('sends a 404 on failure', function() {
    storage.setField.throws(new Error());
    const req = request('x');
    const res = response();
    req.body.dlimit = 2;
    paramsRoute(req, res);
    sinon.assert.calledWith(res.sendStatus, 404);
  });
});