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

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

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

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

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

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

  it('calls storage.setField with the correct parameter', function() {
    const req = request('x', { auth: 'z' });
    const res = response();
    passwordRoute(req, res);
    sinon.assert.calledWith(storage.setField, 'x', 'auth', 'z');
    sinon.assert.calledWith(storage.setField, 'x', 'pwd', true);
    sinon.assert.calledWith(res.sendStatus, 200);
  });

  it('sends a 400 if auth is missing', function() {
    const req = request('x', {});
    const res = response();
    passwordRoute(req, res);
    sinon.assert.calledWith(res.sendStatus, 400);
  });

  it('sends a 404 on failure', function() {
    storage.setField.throws(new Error());
    const req = request('x', { auth: 'z' });
    const res = response();
    passwordRoute(req, res);
    sinon.assert.calledWith(res.sendStatus, 404);
  });
});