import assert from 'assert';
import { Misago } from 'misago/index';

var misago = null;

describe('Misago', function() {
  it("addInitializer registers new initializer", function() {
    misago = new Misago();

    misago.addInitializer({
      name: 'test',
      initializer: null
    });

    assert.equal(misago._initializers[0].key, 'test',
      "test initializer was registered");

    assert.equal(misago._initializers.length, 1,
      "addInitializer() registered single initializer in container");
    assert.equal(misago._initializers[0].key, 'test',
      "addInitializer() registered test initializer in container");
  });

  it("init() calls test initializer", function() {
    misago = new Misago();

    misago.addInitializer({
      name: 'test',
      initializer: function(misago) {
        assert.equal(misago, misago, "initializer was called with context");
        assert.equal(misago._context, 'tru', "context is preserved");
      }
    });

    misago.init('tru');
  });

  it("init() calls test initializers in order", function() {
    misago = new Misago();

    misago.addInitializer({
      name: 'carrot',
      initializer: function(misago) {
        assert.equal(misago._context.next, 'carrot',
          "first initializer was called in right order");

        misago._context.next = 'apple';
      },
      before: 'apple'
    });

    misago.addInitializer({
      name: 'apple',
      initializer: function(misago) {
        assert.equal(misago._context.next, 'apple',
          "second initializer was called in right order");

        misago._context.next = 'orange';
      }
    });

    misago.addInitializer({
      name: 'orange',
      initializer: function(misago) {
        assert.equal(misago._context.next, 'orange',
          "pen-ultimate initializer was called in right order");

        misago._context.next = 'banana';
      },
      before: '_end'
    });

    misago.addInitializer({
      name: 'banana',
      initializer: function(misago) {
        assert.equal(misago._context.next, 'banana',
          "ultimate initializer was called in right order");
      },
      after: 'orange'
    });

    misago.init({next: 'carrot'});
  });

  it("has() tests if context has value", function() {
    misago = new Misago();
    misago.init({valid: 'okay'});

    assert.equal(misago.has('invalid'), false,
      "has() returned false for nonexisting key");
    assert.equal(misago.has('valid'), true,
      "has() returned true for existing key");
  });

  it("get() allows access to context values", function() {
    misago = new Misago();
    misago.init({valid: 'okay'});

    assert.equal(misago.get('invalid'), undefined,
      "get() returned undefined for nonexisting key");
    assert.equal(misago.get('invalid', 'fallback'), 'fallback',
      "get() returned fallback value for nonexisting key");
    assert.equal(misago.get('valid'), 'okay',
      "get() returned value for existing key");
    assert.equal(misago.get('valid', 'fallback'), 'okay',
      "get() returned value for existing key instead of fallback");
  });

  it("pop() allows single time access to context values", function() {
    misago = new Misago();
    misago.init({valid: 'okay'});

    assert.equal(misago.pop('invalid'), undefined,
      "pop() returned undefined for nonexisting key");
    assert.equal(misago.pop('valid'), 'okay',
      "pop() returned value for existing key");
    assert.equal(misago.get('valid'), null,
      "get() returned null for popped value");
  });
});