var assert = require('chai').assert;
var rewire = require('rewire');

var log = require('../../lib/log');

var config = rewire('../../lib/config');
var session = rewire('../../lib/session');
var plugin = rewire('../../lib/plugins/retry');

describe('plugin:retry', function() {
  var USER = {};
  var NEXT = {};
  var PROBLEMS = [{id: 0, name: 'name0'}];

  before(function() {
    log.init();
    config.init();
    plugin.init();

    session.getUser = function() {
      return USER;
    };

    plugin.__set__('config', config);
    plugin.__set__('session', session);
    plugin.setNext(NEXT);
  });

  it('should fail if auto login disabled', function(done) {
    config.autologin.enable = false;
    NEXT.getProblems = function(cb) {
      return cb(session.errors.EXPIRED);
    };

    plugin.getProblems(function(e, problems) {
      assert.equal(e, session.errors.EXPIRED);
      done();
    });
  });

  it('should retry if session expired', function(done) {
    config.autologin.enable = true;

    var n = 0;
    NEXT.getProblems = function(cb) {
      ++n;
      if (n === 1) return cb(session.errors.EXPIRED);
      return cb(null, PROBLEMS);
    };

    NEXT.login = function(user, cb) {
      return cb(null, user);
    };

    plugin.getProblems(function(e, problems) {
      assert.equal(e, null);
      assert.equal(problems, PROBLEMS);
      done();
    });
  });

  it('should fail if user expired locally', function(done) {
    config.autologin.enable = true;

    var n = 0;
    NEXT.getProblems = function(cb) {
      ++n;
      if (n === 1) return cb(session.errors.EXPIRED);
      return cb(null, PROBLEMS);
    };

    session.getUser = function() {
      return null;
    };

    plugin.getProblems(function(e, problems) {
      assert.equal(e, null);
      assert.equal(problems, PROBLEMS);
      done();
    });
  });

  it('should fail if other errors', function(done) {
    config.autologin.enable = true;
    NEXT.getProblems = function(cb) {
      return cb('unknown error');
    };

    plugin.getProblems(function(e, problems) {
      assert.equal(e, 'unknown error');
      done();
    });
  });
});