/*globals describe, it, beforeEach, afterEach */
/*jshint expr:true*/
var _            = require('lodash'),
    sinon        = require('sinon'),
    should       = require('should'),
    express      = require('express'),

    // Stuff we test
    themeHandler = require('../../../server/middleware/theme-handler'),
    errors       = require('../../../server/errors'),

    config   = require('../../../server/config'),
    origConfig = _.cloneDeep(config),
    defaultConfig  = require('../../../../config.example')[process.env.NODE_ENV];

should.equal(true, true);

describe('Theme Handler', function () {
    var req, res, next, blogApp, handler, sandbox;

    beforeEach(function () {
        req = sinon.spy();
        res = sinon.spy();
        next = sinon.spy();
        blogApp = express();
        handler = themeHandler(blogApp);
        sandbox = sinon.sandbox.create();
    });

    afterEach(function () {
        sandbox.restore();

        // Reset config
        config.set(_.merge({}, origConfig, defaultConfig));
    });

    describe('ghostLocals', function () {
        it('sets all locals', function () {
            req.path = '/awesome-post';

            handler.ghostLocals(req, res, next);

            res.locals.should.be.an.Object;
            res.locals.version.should.exist;
            res.locals.safeVersion.should.exist;
            res.locals.relativeUrl.should.equal(req.path);
            next.called.should.be.true;
        });
    });

    describe('activateTheme', function () {
        it('should activate new theme', function () {
            var errorStub = sandbox.stub(errors, 'updateActiveTheme');
            handler.activateTheme('casper');

            errorStub.calledWith('casper').should.be.true;
            blogApp.get('activeTheme').should.equal('casper');
        });
    });

    describe('configHbsForContext', function () {
        it('calls next', function () {
            req.secure = true;
            res.locals = {};
            handler.configHbsForContext(req, res, next);

            next.called.should.be.true;
        });

        it('sets secure local variable', function () {
            req.secure = true;
            res.locals = {};

            handler.configHbsForContext(req, res, next);

            res.locals.secure.should.equal(req.secure);
        });

        it('sets view path', function () {
            req.secure = true;
            res.locals = {};
            blogApp.set('activeTheme', 'casper');

            handler.configHbsForContext(req, res, next);

            blogApp.get('views').should.not.be.undefined;
        });
    });

    // describe('updateActiveTheme', function () {
    //     it('updates the active theme if changed', function () {
    //         var activateThemeSpy = sinon.spy(handler, 'activateTheme');
    //         sandbox.stub(api.settings, 'read').withArgs(sinon.match.has('key', 'activeTheme')).returns(Promise.resolve({
    //             settings: [{
    //                 key: 'activeKey',
    //                 value: 'casper'
    //             }]
    //         }));
    //         blogApp.set('activeTheme', 'not-casper');
    //         config.set({paths: {availableThemes: {casper: {}}}});
    //
    //         handler.updateActiveTheme(req, res, next);
    //
    //         activateThemeSpy.called.should.be.false;
    //         next.called.should.be.false;
    //     });
    //
    //     it('throws error if theme is missing', function () {
    //         var errorSpy = sinon.spy(errors, 'throwError');
    //         sandbox.stub(api.settings, 'read').withArgs(sinon.match.has('key', 'activeTheme')).returns(Promise.resolve({
    //             settings: [{
    //                 key: 'activeKey',
    //                 value: 'rasper'
    //             }]
    //         }));
    //         blogApp.set('activeTheme', 'not-casper');
    //         config.set({paths: {availableThemes: {casper: {}}}});
    //
    //         handler.updateActiveTheme(req, res, next);
    //
    //         errorSpy.called.should.be.true;
    //         next.called.should.be.false;
    //     });
    // });
});