var sinon        = require('sinon'),
    should       = require('should'),

    express      = require('express'),
    staticTheme  = require('../../../server/middleware/static-theme');

describe('staticTheme', function () {
    var next;

    beforeEach(function () {
        next = sinon.spy();
    });

    it('should call next if hbs file type', function () {
        var req = {
            path: 'mytemplate.hbs'
        };

        staticTheme(null)(req, null, next);
        next.called.should.be.true();
    });

    it('should call next if md file type', function () {
        var req = {
            path: 'README.md'
        };

        staticTheme(null)(req, null, next);
        next.called.should.be.true();
    });

    it('should call next if json file type', function () {
        var req = {
            path: 'sample.json'
        };

        staticTheme(null)(req, null, next);
        next.called.should.be.true();
    });

    it('should call express.static if valid file type', function (done) {
        var req = {
                path: 'myvalidfile.css',
                app: {
                    get: function () { return 'casper'; }
                }
            },
            activeThemeStub,
            sandbox = sinon.sandbox.create(),
            expressStatic = sinon.spy(express, 'static');

        activeThemeStub = sandbox.spy(req.app, 'get');

        staticTheme(null)(req, null, function (reqArg, res, next2) {
            /*jshint unused:false */
            sandbox.restore();
            next.called.should.be.false();
            activeThemeStub.called.should.be.true();
            expressStatic.called.should.be.true();
            should.exist(expressStatic.args[0][1].maxAge);
            done();
        });
    });

    it('should not error if active theme is missing', function (done) {
        var req = {
                path: 'myvalidfile.css',
                app: {
                    get: function () { return undefined; }
                }
            },
            activeThemeStub,
            sandbox = sinon.sandbox.create();

        activeThemeStub = sandbox.spy(req.app, 'get');

        staticTheme(null)(req, null, function (reqArg, res, next2) {
            /*jshint unused:false */
            sandbox.restore();
            next.called.should.be.false();
            done();
        });
    });

    it('should not call next if file is on whitelist', function (done) {
        var req = {
                path: 'manifest.json',
                app: {
                    get: function () { return 'casper'; }
                }
            },
            activeThemeStub,
            sandbox = sinon.sandbox.create();

        activeThemeStub = sandbox.spy(req.app, 'get');

        staticTheme(null)(req, null, function (reqArg, res, next2) {
            /*jshint unused:false */
            sandbox.restore();
            next.called.should.be.false();
            activeThemeStub.called.should.be.true();
            done();
        });
    });
});