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",