diff --git a/backend/middlewares/ThumbnailGeneratorMWs.ts b/backend/middlewares/ThumbnailGeneratorMWs.ts index 64e8716..1faaf8f 100644 --- a/backend/middlewares/ThumbnailGeneratorMWs.ts +++ b/backend/middlewares/ThumbnailGeneratorMWs.ts @@ -1,4 +1,4 @@ -/// +/// import * as path from "path"; diff --git a/backend/middlewares/ExtendedRequest.d.ts b/backend/middlewares/customtypings/ExtendedRequest.d.ts similarity index 100% rename from backend/middlewares/ExtendedRequest.d.ts rename to backend/middlewares/customtypings/ExtendedRequest.d.ts diff --git a/backend/middlewares/jimp.d.ts b/backend/middlewares/customtypings/jimp.d.ts similarity index 100% rename from backend/middlewares/jimp.d.ts rename to backend/middlewares/customtypings/jimp.d.ts diff --git a/backend/middlewares/AuthenticationMWs.ts b/backend/middlewares/user/AuthenticationMWs.ts similarity index 85% rename from backend/middlewares/AuthenticationMWs.ts rename to backend/middlewares/user/AuthenticationMWs.ts index d180bc2..c55fab1 100644 --- a/backend/middlewares/AuthenticationMWs.ts +++ b/backend/middlewares/user/AuthenticationMWs.ts @@ -1,18 +1,17 @@ -/// -/// +/// +/// import {NextFunction, Request, Response} from "express"; -import {Error, ErrorCodes} from "../../common/entities/Error"; -import {UserRoles} from "../../common/entities/User"; -import {ObjectManagerRepository} from "../model/ObjectManagerRepository"; +import {Error, ErrorCodes} from "../../../common/entities/Error"; +import {UserRoles} from "../../../common/entities/User"; +import {ObjectManagerRepository} from "../../model/ObjectManagerRepository"; export class AuthenticationMWs { public static authenticate(req:Request, res:Response, next:NextFunction) { if (typeof req.session.user === 'undefined') { return next(new Error(ErrorCodes.NOT_AUTHENTICATED)); - } - //TODO: uncomment + } return next(); } diff --git a/backend/middlewares/UserMWs.ts b/backend/middlewares/user/UserMWs.ts similarity index 93% rename from backend/middlewares/UserMWs.ts rename to backend/middlewares/user/UserMWs.ts index 1323f4e..49a1f43 100644 --- a/backend/middlewares/UserMWs.ts +++ b/backend/middlewares/user/UserMWs.ts @@ -1,7 +1,7 @@ import {NextFunction, Request, Response} from "express"; -import {Error, ErrorCodes} from "../../common/entities/Error"; -import {ObjectManagerRepository} from "../model/ObjectManagerRepository"; -import {User} from "../../common/entities/User"; +import {Error, ErrorCodes} from "../../../common/entities/Error"; +import {ObjectManagerRepository} from "../../model/ObjectManagerRepository"; +import {User} from "../../../common/entities/User"; export class UserMWs { diff --git a/backend/middlewares/UserRequestConstrainsMWs.ts b/backend/middlewares/user/UserRequestConstrainsMWs.ts similarity index 88% rename from backend/middlewares/UserRequestConstrainsMWs.ts rename to backend/middlewares/user/UserRequestConstrainsMWs.ts index 5a14422..a6315ce 100644 --- a/backend/middlewares/UserRequestConstrainsMWs.ts +++ b/backend/middlewares/user/UserRequestConstrainsMWs.ts @@ -1,7 +1,7 @@ import {NextFunction, Request, Response} from "express"; -import {Error, ErrorCodes} from "../../common/entities/Error"; -import {UserRoles} from "../../common/entities/User"; -import {ObjectManagerRepository} from "../model/ObjectManagerRepository"; +import {Error, ErrorCodes} from "../../../common/entities/Error"; +import {UserRoles} from "../../../common/entities/User"; +import {ObjectManagerRepository} from "../../model/ObjectManagerRepository"; export class UserRequestConstrainsMWs { diff --git a/backend/model/ObjectManagerRepository.ts b/backend/model/ObjectManagerRepository.ts index 8b6d9a5..040528f 100644 --- a/backend/model/ObjectManagerRepository.ts +++ b/backend/model/ObjectManagerRepository.ts @@ -34,6 +34,10 @@ export class ObjectManagerRepository { return this._instance; } + public static reset() { + this._instance = null; + } + getGalleryManager():IGalleryManager { return this._galleryManager; diff --git a/backend/routes/AdminRouter.ts b/backend/routes/AdminRouter.ts index c0485ce..31f3757 100644 --- a/backend/routes/AdminRouter.ts +++ b/backend/routes/AdminRouter.ts @@ -1,6 +1,6 @@ /// -import {AuthenticationMWs} from "../middlewares/AuthenticationMWs"; +import {AuthenticationMWs} from "../middlewares/user/AuthenticationMWs"; import {UserRoles} from "../../common/entities/User"; export class AdminRouter { diff --git a/backend/routes/GalleryRouter.ts b/backend/routes/GalleryRouter.ts index 97f0904..6a8d351 100644 --- a/backend/routes/GalleryRouter.ts +++ b/backend/routes/GalleryRouter.ts @@ -1,6 +1,6 @@ /// -import {AuthenticationMWs} from "../middlewares/AuthenticationMWs"; +import {AuthenticationMWs} from "../middlewares/user/AuthenticationMWs"; import {GalleryMWs} from "../middlewares/GalleryMWs"; import {RenderingMWs} from "../middlewares/RenderingMWs"; import {ThumbnailGeneratorMWs} from "../middlewares/ThumbnailGeneratorMWs"; diff --git a/backend/routes/SharingRouter.ts b/backend/routes/SharingRouter.ts index 33c8457..d760309 100644 --- a/backend/routes/SharingRouter.ts +++ b/backend/routes/SharingRouter.ts @@ -1,6 +1,6 @@ /// -import {AuthenticationMWs} from "../middlewares/AuthenticationMWs"; +import {AuthenticationMWs} from "../middlewares/user/AuthenticationMWs"; import {UserRoles} from "../../common/entities/User"; export class SharingRouter { diff --git a/backend/routes/UserRouter.ts b/backend/routes/UserRouter.ts index 72a252d..738650a 100644 --- a/backend/routes/UserRouter.ts +++ b/backend/routes/UserRouter.ts @@ -1,9 +1,9 @@ /// -import {UserMWs} from "../middlewares/UserMWs"; +import {UserMWs} from "../middlewares/user/UserMWs"; import {UserRoles} from "../../common/entities/User"; -import {AuthenticationMWs} from "../middlewares/AuthenticationMWs"; -import {UserRequestConstrainsMWs} from "../middlewares/UserRequestConstrainsMWs"; +import {AuthenticationMWs} from "../middlewares/user/AuthenticationMWs"; +import {UserRequestConstrainsMWs} from "../middlewares/user/UserRequestConstrainsMWs"; import {RenderingMWs} from "../middlewares/RenderingMWs"; export class UserRouter { diff --git a/package.json b/package.json index 51024ed..fd2306f 100644 --- a/package.json +++ b/package.json @@ -9,8 +9,8 @@ "main": "./backend/server.js", "scripts": { "install": "typings install && tsc -p backend && tsc -p test/backend && tsc -p common && webpack --config ./frontend/webpack.config.js -p", - "pretest": "typings install", - "test": "karma start ./karma.conf.js", + "pretest": "typings install && tsc -p test/backend", + "test": "karma start ./karma.conf.js && mocha --recursive test/backend/unit", "start": "node ./backend/server", "postinstall": "node ./test/backend/initMongo.js" }, @@ -54,6 +54,7 @@ "zone.js": "^0.6.12" }, "devDependencies": { + "chai": "^3.5.0", "compression-webpack-plugin": "^0.3.0", "css-loader": "^0.23.1", "es6-promise-loader": "^1.0.1", @@ -74,6 +75,7 @@ "karma-phantomjs-launcher": "^1.0.0", "karma-sourcemap-loader": "^0.3.7", "karma-webpack": "1.7.0", + "mocha": "^2.4.5", "ng2lint": "0.0.10", "phantomjs-prebuilt": "^2.1.7", "protractor": "^3.2.2", diff --git a/test/backend/mocha.opts b/test/backend/mocha.opts new file mode 100644 index 0000000..4a52320 --- /dev/null +++ b/test/backend/mocha.opts @@ -0,0 +1 @@ +--recursive diff --git a/test/backend/unit/middlewares/uesr/AuthenticationMWs.ts b/test/backend/unit/middlewares/uesr/AuthenticationMWs.ts new file mode 100644 index 0000000..974209a --- /dev/null +++ b/test/backend/unit/middlewares/uesr/AuthenticationMWs.ts @@ -0,0 +1,228 @@ +import {expect} from "chai"; +import {AuthenticationMWs} from "../../../../../backend/middlewares/user/AuthenticationMWs"; +import {Error, ErrorCodes} from "../../../../../common/entities/Error"; +import {UserRoles} from "../../../../../common/entities/User"; +import {ObjectManagerRepository} from "../../../../../backend/model/ObjectManagerRepository"; +import {UserManager} from "../../../../../backend/model/memory/UserManager"; + + +describe('Authentication middleware', () => { + + beforeEach(() => { + ObjectManagerRepository.reset(); + }); + + describe('authenticate', () => { + it('should call next on authenticated', (done) => { + let req:any = { + session: { + user: "A user" + } + }; + let next:any = (err) => { + expect(err).to.be.undefined; + done(); + }; + AuthenticationMWs.authenticate(req, null, next); + + }); + + it('should call next with error on not authenticated', (done) => { + let req:any = { + session: {} + }; + let res:any = {}; + let next:any = (err:Error) => { + expect(err).not.to.be.undefined; + expect(err.code).to.be.eql(ErrorCodes.NOT_AUTHENTICATED); + done(); + }; + AuthenticationMWs.authenticate(req, null, next); + + }); + }); + + describe('inverseAuthenticate', () => { + + it('should call next with error on authenticated', (done) => { + let req:any = { + session: {} + }; + let res:any = {}; + let next:any = (err) => { + expect(err).to.be.undefined; + done(); + }; + AuthenticationMWs.inverseAuthenticate(req, null, next); + + }); + + + it('should call next error on authenticated', (done) => { + let req:any = { + session: { + user: "A user" + } + }; + let res:any = {}; + let next:any = (err:Error) => { + expect(err).not.to.be.undefined; + expect(err.code).to.be.eql(ErrorCodes.ALREADY_AUTHENTICATED); + done(); + }; + AuthenticationMWs.inverseAuthenticate(req, null, next); + + }); + }); + + describe('authorise', () => { + it('should call next on authorised', (done) => { + let req:any = { + session: { + user: { + role: UserRoles.Guest + } + } + }; + let next:any = (err) => { + expect(err).to.be.undefined; + done(); + }; + AuthenticationMWs.authorise(UserRoles.Guest)(req, null, next); + + }); + + it('should call next with error on not authorised', (done) => { + let req:any = { + session: { + user: { + role: UserRoles.Guest + } + } + }; + let next:any = (err:Error) => { + expect(err).not.to.be.undefined; + expect(err.code).to.be.eql(ErrorCodes.NOT_AUTHORISED); + done(); + }; + AuthenticationMWs.authorise(UserRoles.Developer)(req, null, next); + + }); + }); + + describe('login', () => { + beforeEach(() => { + ObjectManagerRepository.reset(); + }); + + describe('should call next on missing...', () => { + it('body', (done) => { + let req:any = {}; + let next:any = (err) => { + expect(err).to.be.undefined; + done(); + }; + AuthenticationMWs.login(req, null, next); + + }); + + it('loginCredential', (done) => { + let req:any = { + body: {} + }; + let next:any = (err) => { + expect(err).to.be.undefined; + done(); + }; + AuthenticationMWs.login(req, null, next); + + + }); + + + it('loginCredential content', (done) => { + let req:any = { + body: {loginCredential: {}} + }; + let next:any = (err) => { + expect(err).to.be.undefined; + done(); + }; + AuthenticationMWs.login(req, null, next); + + + }); + + }); + it('should call next with error on not finding user', (done) => { + let req:any = { + body: { + loginCredential: { + username: "aa", + password: "bb" + } + } + }; + let next:any = (err:Error) => { + expect(err).not.to.be.undefined; + expect(err.code).to.be.eql(ErrorCodes.CREDENTIAL_NOT_FOUND); + done(); + }; + ObjectManagerRepository.getInstance().setUserManager({ + findOne: (filter, cb) => { + cb(null, null); + } + }); + AuthenticationMWs.login(req, null, next); + + + }); + + it('should call next with user on the session on finding user', (done) => { + let req:any = { + session: {}, + body: { + loginCredential: { + username: "aa", + password: "bb" + } + } + }; + let next:any = (err:Error) => { + expect(err).to.be.undefined; + expect(req.session.user).to.be.eql("test user"); + done(); + }; + ObjectManagerRepository.getInstance().setUserManager({ + findOne: (filter, cb:any) => { + cb(null, "test user"); + } + }); + AuthenticationMWs.login(req, null, next); + + + }); + }); + + + describe('logout', () => { + it('should call next on logout', (done) => { + let req:any = { + session: { + user: { + role: UserRoles.Guest + } + } + }; + let next:any = (err) => { + expect(err).to.be.undefined; + expect(req.session.user).to.be.undefined; + done(); + }; + AuthenticationMWs.logout(req, null, next); + + }); + + }); + +}); diff --git a/typings.json b/typings.json index b7cb22b..8d37456 100644 --- a/typings.json +++ b/typings.json @@ -3,6 +3,7 @@ "version": false, "ambientDependencies": { "body-parser": "registry:dt/body-parser#0.0.0+20160317120654", + "chai": "registry:dt/chai#3.4.0+20160317120654", "core-js": "registry:dt/core-js#0.0.0+20160317120654", "debug": "github:DefinitelyTyped/DefinitelyTyped/debug/debug.d.ts#0d622d857f97d44ea7dcad2b3edec1f23c48fe9e", "express": "github:DefinitelyTyped/DefinitelyTyped/express/express.d.ts#0d622d857f97d44ea7dcad2b3edec1f23c48fe9e",