Skip to content

Commit 71ee3bb

Browse files
committed
feat(User Router): Completed tests for user router
1 parent 816c4a2 commit 71ee3bb

File tree

16 files changed

+602
-275
lines changed

16 files changed

+602
-275
lines changed

TODO.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
### TODOs
22
| Filename | line # | TODO
33
|:------|:------:|:------
4-
| routes/index.js | 229 | Implement API Generator
5-
| routes/users.js | 43 | Test users route
4+
| routes/index.js | 240 | Implement API Generator
65
| services/queue/clock.js | 11 | work on a clock functionality so kue can support scheduled jobs

controllers/Users.js

Lines changed: 61 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,14 @@ UsersController.find = function(req,res,next){
4444
var query;
4545
if(req.query.search){
4646
query = req.query.search;
47+
// Clean appId and userId
48+
if(query && query.appId){
49+
delete query.appId;
50+
}
51+
if(query && query.userId){
52+
delete query.userId;
53+
}
54+
4755
Users.search(query)
4856
.then(function(resp){
4957
res.ok(resp);
@@ -54,15 +62,18 @@ UsersController.find = function(req,res,next){
5462
}else{
5563
query = req.query;
5664
// Clean appId and userId
57-
delete query.appId;
58-
delete query.userId;
59-
delete query.developer;
60-
var projection = query.projection; // Projection should be comma separated. eg. name,location
65+
if(query && query.appId){
66+
delete query.appId;
67+
}
68+
if(query && query.userId){
69+
delete query.userId;
70+
}
71+
var projection = query.select; // Projection should be comma separated. eg. name,location
6172
var ourProjection;
6273

6374
if(projection){
64-
ourProjection = this.buildProjection(projection);
65-
delete query.projection;
75+
ourProjection = UsersController.buildProjection(projection);
76+
delete query.select;
6677
}
6778
var limit = query.limit * 1;
6879
if(limit){
@@ -84,7 +95,6 @@ UsersController.find = function(req,res,next){
8495
}else{
8596
query.createdAt = {};
8697
query.createdAt.$gt = new Date('1989-03-15T00:00:00').toISOString();
87-
delete query.from;
8898
if(to){
8999
delete query.to;
90100
}else{
@@ -106,6 +116,8 @@ UsersController.find = function(req,res,next){
106116
if(populate){
107117
delete query.populate;
108118
}
119+
120+
console.log('our query: >>>>>>>>>>>',query);
109121
var totalResult = Users.count(query);
110122
var total = Users.count({});
111123
var question = Users.find(query);
@@ -131,7 +143,12 @@ UsersController.find = function(req,res,next){
131143
return [question.select(resp),total,totalResult];
132144
})
133145
.spread(function(resp,total,totalResult){
134-
var ourLastId = resp[resp.length - 1]._id;
146+
var ourLastId;
147+
if(resp.length === 0){
148+
ourLastId = null;
149+
}else{
150+
ourLastId = resp[resp.length - 1]._id;
151+
}
135152
var extraData = {};
136153
extraData.limit = limit * 1;
137154
extraData.total = total;
@@ -170,7 +187,18 @@ UsersController.find = function(req,res,next){
170187

171188
UsersController.findOne = function(req,res,next){
172189
var id = req.params.id;
173-
Users.findById(id)
190+
var query = req.query;
191+
var populate;
192+
if(query){
193+
populate = query.populate; // Samples: 'name location' will populate name and location references. only supports this for now | 'name', 'firstname' will populate name referenece and only pick the firstname attribute
194+
}
195+
var question = Users.findById(id);
196+
if(populate){
197+
delete query.populate;
198+
question = question.populate(populate);
199+
}
200+
201+
question
174202
.then(function(resp){
175203
res.ok(resp);
176204
})
@@ -181,6 +209,9 @@ UsersController.findOne = function(req,res,next){
181209

182210
UsersController.create = function(req,res,next){
183211
var data = req.body;
212+
if(data && data.secure){
213+
delete data.secure;
214+
}
184215
Users.create(data)
185216
.then(function(resp){
186217
res.ok(resp);
@@ -192,7 +223,17 @@ UsersController.create = function(req,res,next){
192223

193224
UsersController.update = function(req,res,next){
194225
var query = req.query;
226+
// Clean appId and userId
227+
if(query && query.appId){
228+
delete query.appId;
229+
}
230+
if(query && query.userId){
231+
delete query.userId;
232+
}
195233
var data = req.body;
234+
if(data && data.secure){
235+
delete data.secure;
236+
}
196237
Users.updateMany(query,data)
197238
.then(function(resp){
198239
res.ok(resp);
@@ -205,6 +246,10 @@ UsersController.update = function(req,res,next){
205246
UsersController.updateOne = function(req,res,next){
206247
var id = req.params.id;
207248
var data = req.body;
249+
if(data && data.secure){
250+
delete data.secure;
251+
}
252+
208253
Users.findByIdAndUpdate(id,data)
209254
.then(function(resp){
210255
res.ok(resp);
@@ -216,6 +261,13 @@ UsersController.updateOne = function(req,res,next){
216261

217262
UsersController.delete = function(req,res,next){
218263
var query = req.query;
264+
// Clean appId and userId
265+
if(query && query.appId){
266+
delete query.appId;
267+
}
268+
if(query && query.userId){
269+
delete query.userId;
270+
}
219271
// Find match
220272
Users.find(query)
221273
.then(function(resp){

gulpfile.js

Lines changed: 24 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ var gulp = require('gulp');
44
var stylish = require('jshint-stylish');
55
var nodemon = require('gulp-nodemon');
66
var debug = require('debug')('gulp');
7-
var mocha = require('gulp-mocha');
87
var todo = require('gulp-todo');
8+
var mocha = require('gulp-mocha');
99

1010
var runSequence = require('run-sequence');
1111
var conventionalChangelog = require('gulp-conventional-changelog');
@@ -31,23 +31,26 @@ gulp.task('default', function(){
3131
stream
3232
.on('restart', function () {
3333
debug('restarted!');
34-
})
34+
})
3535
.on('crash', function() {
3636
debug('Application has crashed!\n');
3737
stream.emit('restart', 10); // restart the server in 10 seconds
38-
});
38+
});
3939
});
4040

4141
gulp.task('test', function() {
4242
// Override RATE LIMIT HERE FOR UNIT TEST
4343
process.env.RATE_LIMIT = 10;
4444
process.env.SECURE_MODE = true;
4545
process.env.NO_CACHE = 'no';
46+
process.env.NODE_ENV = 'test';
4647
gulp.src('./test', {read: false})
4748
// `gulp-mocha` needs filepaths so you can't have any plugins before it
48-
.pipe(mocha({reporter: 'spec'}));
49-
}
50-
);
49+
.pipe(mocha({
50+
reporter: 'spec'
51+
}));
52+
}
53+
);
5154

5255
gulp.task('create', function(){
5356

@@ -59,7 +62,7 @@ gulp.task('todo', function() {
5962
.pipe(todo())
6063
.pipe(gulp.dest('./'));
6164
// -> Will output a TODO.md with your todos
62-
});
65+
});
6366

6467
gulp.task('sanity',['lint','test','todo']);
6568

@@ -68,20 +71,20 @@ gulp.task('sanity',['lint','test','todo']);
6871
gulp.task('changelog', function () {
6972
return gulp.src('./CHANGELOG.md', {
7073
buffer: false
71-
})
74+
})
7275
.pipe(conventionalChangelog({
7376
preset: 'angular' // Or to any other commit message convention you use.
74-
}))
77+
}))
7578
.pipe(gulp.dest('./'));
7679
});
7780

7881
gulp.task('github-release', function(done) {
7982
conventionalGithubReleaser({
8083
type: "oauth",
8184
token: config.gitOAuthToken // change this to your own GitHub token or use an environment variable
82-
}, {
85+
}, {
8386
preset: 'angular' // Or to any other commit message convention you use.
84-
}, done);
87+
}, done);
8588
});
8689

8790
// Remember to pass argument '-r patch/minor/major' to the release command
@@ -114,14 +117,14 @@ gulp.task('create-new-tag', function (cb) {
114117
// We parse the json file instead of using require because require caches
115118
// multiple calls so the version number won't be updated
116119
return JSON.parse(fs.readFileSync('./package.json', 'utf8')).version;
117-
};
118-
var version = getPackageJsonVersion();
119-
git.tag(version, 'Created Tag for version: ' + version, function (error) {
120+
};
121+
var version = getPackageJsonVersion();
122+
git.tag(version, 'Created Tag for version: ' + version, function (error) {
120123
if (error) {
121124
return cb(error);
122-
}
123-
git.push('origin', 'dev', {args: '--tags'}, cb);
124-
});
125+
}
126+
git.push('origin', 'dev', {args: '--tags'}, cb);
127+
});
125128
});
126129

127130
gulp.task('release', function (callback) {
@@ -136,9 +139,9 @@ gulp.task('release', function (callback) {
136139
function (error) {
137140
if (error) {
138141
console.log(error.message);
139-
} else {
142+
} else {
140143
console.log('RELEASE FINISHED SUCCESSFULLY');
141-
}
142-
callback(error);
143-
});
144+
}
145+
callback(error);
146+
});
144147
});

models/RequestLogs.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ var queue = require('../services/queue');
1212

1313
var schemaObject = {
1414
RequestId: {
15-
type: 'String'
15+
type: 'String',
16+
unique: true
1617
},
1718
ipAddress: {
1819
type: 'String'

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
"gulp-conventional-changelog": "^1.1.3",
3232
"gulp-git": "^2.4.1",
3333
"gulp-jshint": "^2.0.4",
34-
"gulp-mocha": "^4.1.0",
34+
"gulp-mocha": "^4.3.1",
3535
"gulp-nodemon": "^2.2.1",
3636
"gulp-todo": "^5.4.0",
3737
"gulp-util": "^3.0.8",

routes/index.js

Lines changed: 27 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ var initialize = require('./initialize');
1010
var config = require('../config');
1111
var helmet = require('helmet');
1212
var redisClient = require('../services/database').redis;
13-
var limiter = require('express-limiter')(router, redisClient);
13+
// var limiter = require('express-limiter')(router, redisClient);
1414
var _ = require('lodash');
1515
var bodyParser = require('body-parser');
1616
var cors = require('cors');
@@ -64,11 +64,22 @@ router._enforceUserIdAndAppId = function(req,res,next){
6464
req.userId = userId;
6565
req.appId = appId;
6666
req.developer = developer;
67-
req.body.client = appId;
68-
req.body.owner = userId;
69-
req.body.createdBy = userId;
70-
req.body.developer = developer;
71-
next();
67+
if(req.body.length){
68+
req.body = _.map(req.body,function(value){
69+
value.client = appId;
70+
value.owner = userId;
71+
value.createdBy = userId;
72+
value.developer = developer;
73+
return value;
74+
});
75+
next();
76+
}else{
77+
req.body.client = appId;
78+
req.body.owner = userId;
79+
req.body.createdBy = userId;
80+
req.body.developer = developer;
81+
next();
82+
}
7283
}
7384
};
7485

@@ -164,16 +175,16 @@ router.use(contentLength.validateMax({max: MAX_CONTENT_LENGTH_ACCEPTED, status:
164175
router.use(router._allRequestData);
165176

166177
// API Rate limiter
167-
limiter({
168-
path: '*',
169-
method: 'all',
170-
lookup: ['ip','userId','appId'],
171-
total: config.rateLimit * 1,
172-
expire: config.rateLimitExpiry * 1,
173-
onRateLimited: function (req, res, next) {
174-
next({ message: 'Rate limit exceeded', statusCode: 429 });
175-
}
176-
});
178+
// limiter({
179+
// path: '*',
180+
// method: 'all',
181+
// lookup: ['ip','userId','appId','developer'],
182+
// total: config.rateLimit * 1,
183+
// expire: config.rateLimitExpiry * 1,
184+
// onRateLimited: function (req, res, next) {
185+
// next({ message: 'Rate limit exceeded', statusCode: 429 });
186+
// }
187+
// });
177188

178189

179190
router.use(expressValidator());

routes/users.js

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,10 @@ router.get('/'+service+'/:id', usersController.findOne);
2525
router.post('/'+service, usersController.create);
2626

2727
// update all records that matches the query
28-
router.put('/'+service, usersController.updateOne);
28+
router.put('/'+service, usersController.update);
2929

3030
// update a single record
31-
router.put('/'+service+'/:id', usersController.findOne);
31+
router.patch('/'+service+'/:id', usersController.updateOne);
3232

3333
// delete all records that matches the query
3434
router.delete('/'+service, usersController.delete);
@@ -40,4 +40,3 @@ router.delete('/'+service+'/:id', usersController.deleteOne);
4040
router.post('/'+service+'/:id/restore', usersController.restore);
4141

4242
module.exports = router;
43-
// Todo: Test users route

services/encryption/index.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ interpreter: function(req, res, next){
107107

108108
var key = req.get('x-tag');
109109

110-
if(req.method === 'POST' && config.secureMode){
110+
if(req.method === 'POST' && config.secureMode && req.body.secure === true){
111111
if(req.body.secureData){
112112
var truthHash = req.body.truth;
113113
encryption.decrypt(req.body.secureData, key, truthHash)
@@ -119,6 +119,7 @@ interpreter: function(req, res, next){
119119
debug('decryptedText: ', resp);
120120
var parsedJSON = JSON.parse(resp);
121121
req.body = parsedJSON;
122+
req.body.secure = true;
122123
next();
123124
}
124125
})

0 commit comments

Comments
 (0)