const Path = require('path') const SandboxedModule = require('sandboxed-module') const sinon = require('sinon') const MODULE_PATH = Path.join( __dirname, '../../../app/src/UserActivateController.js' ) const VIEW_PATH = Path.join(__dirname, '../../../app/views/user/activate') describe('UserActivateController', function() { beforeEach(function() { this.user = { _id: (this.user_id = 'kwjewkl'), features: {}, email: 'joe@example.com' } this.UserGetter = { getUser: sinon.stub() } this.ErrorController = { notFound: sinon.stub() } this.UserActivateController = SandboxedModule.require(MODULE_PATH, { globals: { console: console }, requires: { '../../../../app/src/Features/User/UserGetter': this.UserGetter, '../../../../app/src/Features/Errors/ErrorController': this .ErrorController } }) this.req = { query: {}, session: { user: this.user } } this.res = {} }) describe('activateAccountPage', function() { beforeEach(function() { this.UserGetter.getUser = sinon.stub().callsArgWith(2, null, this.user) this.req.query.user_id = this.user_id this.req.query.token = this.token = 'mock-token-123' }) it('should 404 without a user_id', function(done) { delete this.req.query.user_id this.ErrorController.notFound = () => done() this.UserActivateController.activateAccountPage(this.req, this.res) }) it('should 404 without a token', function(done) { delete this.req.query.token this.ErrorController.notFound = () => done() this.UserActivateController.activateAccountPage(this.req, this.res) }) it('should 404 without a valid user_id', function(done) { this.UserGetter.getUser = sinon.stub().callsArgWith(2, null, null) this.ErrorController.notFound = () => done() this.UserActivateController.activateAccountPage(this.req, this.res) }) it('should 403 for complex user_id', function(done) { this.ErrorController.forbidden = () => done() this.req.query.user_id = { first_name: 'X' } this.UserActivateController.activateAccountPage(this.req, this.res) }) it('should redirect activated users to login', function(done) { this.user.loginCount = 1 this.res.redirect = url => { this.UserGetter.getUser.calledWith(this.user_id).should.equal(true) url.should.equal('/login') return done() } this.UserActivateController.activateAccountPage(this.req, this.res) }) it('render the activation page if the user has not logged in before', function(done) { this.user.loginCount = 0 this.res.render = (page, opts) => { page.should.equal(VIEW_PATH) opts.email.should.equal(this.user.email) opts.token.should.equal(this.token) return done() } this.UserActivateController.activateAccountPage(this.req, this.res) }) }) })