Guest User

Untitled

a guest
Dec 25th, 2017
381
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.31 KB | None | 0 0
  1. # db/index.js
  2.  
  3. global.TABLE_USERS = 'users';
  4.  
  5. const Promise = require('bluebird');
  6. const Sequelize = require('sequelize');
  7. const config = require('./../config');
  8. const User = require('./User');
  9.  
  10. /**
  11. * @return {Promise}
  12. */
  13. const connect = () => {
  14. return new Promise((resolve, reject) => {
  15. let sequelize = new Sequelize(config.postgres.database, config.postgres.user, config.postgres.password, {
  16. host: config.postgres.host,
  17. dialect: 'postgres',
  18. pool: {
  19. max: 5,
  20. min: 0,
  21. acquire: 30000,
  22. idle: 10000
  23. },
  24. define: {
  25. underscored: false,
  26. freezeTableName: false,
  27. charset: 'utf8',
  28. dialectOptions: {
  29. collate: 'utf8_general_ci'
  30. }
  31. },
  32. });
  33.  
  34. let user = User(sequelize);
  35.  
  36. sequelize
  37. .authenticate()
  38. .then(() => {
  39. resolve({
  40. User: user,
  41. sequelize: sequelize
  42. })
  43. })
  44. .catch(err => {
  45. console.error('Couldn't authenticate');
  46. reject(err)
  47. })
  48. });
  49. };
  50.  
  51. module.exports.connect = connect;
  52.  
  53. const express = require('express');
  54. const bodyParser = require('body-parser');
  55. global.Promise = require('bluebird');
  56. let routing = require('./routing');
  57. const config = require('./config');
  58. const middleware = require('./middleware');
  59. let database = require('./db');
  60. let Repositories = require('./repositories');
  61. let Services = require('./services');
  62. let Controllers = require('./controllers');
  63. const Promise = require('bluebird');
  64.  
  65. /**
  66. * @property {http.Server} this.app
  67. */
  68. class Server {
  69.  
  70. constructor() {
  71. this.app = express();
  72. }
  73.  
  74. /**
  75. * @param {Function} beforeHook
  76. *
  77. */
  78. init(beforeHook = null) {
  79. return this._initDatabaseConnection()
  80. .then(() => {
  81. this._initContainer(beforeHook);
  82. this._initRoutes();
  83. return this._initServer()
  84. });
  85. }
  86.  
  87. /**
  88. *
  89. * @param {Function} beforeHook
  90. * @private
  91. */
  92. _initContainer(beforeHook) {
  93. this.container = {};
  94. // Modify for testing before starting
  95. if (typeof beforeHook === 'function') beforeHook(this);
  96. this.container = Repositories(this.database);
  97. this.container = Services(this.container);
  98. this.controllers = Controllers(this.container);
  99. }
  100.  
  101. /**
  102. *
  103. * @private
  104. */
  105. _initRoutes() {
  106. this.app.use(bodyParser.json());
  107. middleware.handleCors(this.app);
  108. this.app.use(routing({...this.controllers, ...this.services}));
  109. middleware.handleErrors(this.app);
  110. }
  111.  
  112. /**
  113. *
  114. * @private
  115. *
  116. * @return {Promise}
  117. */
  118. _initServer() {
  119. return new Promise((resolve, reject) => {
  120. this.server = this.app.listen(config.app.port, () => {
  121. console.log(`Server started listening in ${config.app.env} on port ${config.app.port}`);
  122. resolve(this)
  123. });
  124. });
  125. }
  126.  
  127. /**
  128. *
  129. * @return {Promise}
  130. * @private
  131. */
  132. _initDatabaseConnection() {
  133. return database.connect()
  134. .then(connection => {
  135. this.database = connection;
  136. console.log('Connected to the database');
  137.  
  138. return Promise.resolve()
  139. })
  140. }
  141.  
  142. /**
  143. * @return {Promise}
  144. */
  145. close() {
  146. this.server.close();
  147. return this.database.sequelize.close();
  148. }
  149. }
  150.  
  151. module.exports = Server;
  152.  
  153. const assert = require('assert');
  154. const chai = require('chai'),
  155. expect = chai.expect,
  156. chaiHttp = require('chai-http');
  157.  
  158. chai.use(chaiHttp);
  159.  
  160. const Server = require('../../src/Server');
  161.  
  162. describe('Server app test', () => {
  163.  
  164. let server;
  165.  
  166. before(async () => {
  167. server = await (new Server()).init();
  168. });
  169.  
  170. after(async () => {
  171. await server.close();
  172. });
  173.  
  174. it('should say respond it's name', async () => {
  175. let pingServer = () => {
  176. return new Promise((resolve, reject) => {
  177. chai.request(server.server)
  178. .get('/')
  179. .end((err, res) => {
  180. expect(err).to.be.null;
  181. expect(res).to.have.status(200);
  182. resolve(res.body)
  183. });
  184. });
  185. };
  186.  
  187. let res = await pingServer();
  188. assert.equal(res.msg, 'API server');
  189. });
  190. });
  191.  
  192. const assert = require('assert');
  193. const chai = require('chai'),
  194. expect = chai.expect,
  195. chaiHttp = require('chai-http');
  196.  
  197. chai.use(chaiHttp);
  198.  
  199. const sinon = require('sinon');
  200. const Promise = require('bluebird');
  201. const Response = require('./../../src/lib/RequestHelper');
  202. const UserValidation = require('./../../src/validation/UserValidation');
  203. const Server = require('./../../src/Server');
  204. const ReCaptchaService = require('./../../src/services/ReCaptchaService');
  205. const ValidationError = require('./../../src/errors/ValidationError');
  206.  
  207.  
  208. describe('/users/signup', () => {
  209.  
  210. describe('valid reCaptcha scenario', () => {
  211. let server, reCaptchaServiceStub;
  212.  
  213. before(async () => {
  214. reCaptchaServiceStub = sinon.stub(ReCaptchaService.prototype, 'authenticate').returns(true);
  215.  
  216. function setReCaptchaServiceStub(server) {
  217. server.services = {ReCaptchaService: new reCaptchaServiceStub()};
  218. }
  219.  
  220. server = await (new Server()).init(setReCaptchaServiceStub);
  221. });
  222.  
  223. after(async () => {
  224. reCaptchaServiceStub.restore();
  225. await server.database.User.destroy({where: {}});
  226. await server.close();
  227. });
  228.  
  229. beforeEach(async () => {
  230. await server.database.User.destroy({where: {}});
  231. });
  232.  
  233. it('should allow user to register', async () => {
  234.  
  235. let data = {email: 'myemail@gmail.com', password: '1234'};
  236. data[UserValidation.CAPTCHA_RESPONSE] = 'captcha_token';
  237.  
  238. let signUp = (data) => {
  239. return new Promise((resolve, reject) => {
  240. chai.request(server.server)
  241. .post('/users/signup')
  242. .send(data)
  243. .end((err, res) => {
  244. console.log(res.body)
  245. expect(err).to.be.null;
  246. expect(res).to.have.status(Response.STATUS_OK);
  247. resolve(res.body)
  248. });
  249. });
  250. };
  251.  
  252. let res = await signUp(data);
  253. expect(res.token).to.be.a('string');
  254. });
  255. });
  256.  
  257. describe('invalid reCaptcha scenario', () => {
  258. let server, reCaptchaServiceStub;
  259.  
  260. before(async () => {
  261. reCaptchaServiceStub = sinon.stub(ReCaptchaService.prototype, 'authenticate')
  262. .onCall()
  263. .throws(new ValidationError('some err'));
  264.  
  265. function setReCaptchaServiceStub(server) {
  266. server.container.ReCaptchaService = new reCaptchaServiceStub()
  267. }
  268.  
  269. server = await (new Server()).init(setReCaptchaServiceStub);
  270. });
  271.  
  272. after(async () => {
  273. reCaptchaServiceStub.restore();
  274. await server.close();
  275. });
  276.  
  277. beforeEach(async () => {
  278. await server.database.User.destroy({where: {}});
  279. });
  280.  
  281. it('should send a bad request on invalid reCaptcha', async () => {
  282.  
  283. let data = {email: 'myemail@gmail.com', password: '1234'};
  284. data[UserValidation.CAPTCHA_RESPONSE] = 'random_token';
  285.  
  286. let signUp = (data) => {
  287. return new Promise((resolve, reject) => {
  288. chai.request(server.server)
  289. .post('/users/signup')
  290. .send(data)
  291. .end((err, res) => {
  292. expect(err).to.not.be.null;
  293. expect(res).to.have.status(Response.STATUS_BAD_REQUEST);
  294. resolve(res.body);
  295. });
  296. });
  297. };
  298.  
  299. let res = await signUp(data);
  300. expect(res.err).to.equal(UserValidation.ERR_INVALID_RECAPTCHA);
  301. });
  302. });
  303. });
Add Comment
Please, Sign In to add comment