Skip to content

Commit

Permalink
add tests
Browse files Browse the repository at this point in the history
  • Loading branch information
wizardnet972 committed Dec 13, 2016
1 parent 22327ea commit cdeb73e
Show file tree
Hide file tree
Showing 9 changed files with 354 additions and 57 deletions.
37 changes: 17 additions & 20 deletions app/api/index.js
Original file line number Diff line number Diff line change
@@ -1,41 +1,42 @@
const jwt = require('jsonwebtoken');
const express = require('express');
const User = require('../db/user');
const crypt = require('../../utils/crypt');

const UserModel = require('../db/user');
const User = UserModel.User;
const router = express.Router();

router.get('/', (req, res) => {
res.send({});
})

router.use('/users', require('./users'));
router.use('/user', require('./user'));

router.post('/signup', (req, res) => {

crypt
.cryptPassword(req.body.password)
.then(hash => {

const user = new User({
name: req.body.name,
password: hash,
admin: true
});
let user = new User(Object.assign({}, req.body, { password: hash }));

user.save()
.then(() => {
console.log('User created successfully.');
.then(user => {
console.log('User created successfully.', user.toObject());
res.status(201).json({ userId: user.id });
})
.catch(err => {
throw err;
res.status(500).json(err);
});

}).catch(err => {
res.status(500).json({ message: "Signup failed." });
res.status(500).json(err);
})
});

router.post('/login', (req, res) => {

User.findOne({ name: req.body.name })
User.findOne({ email: req.body.email })
.then(user => {

if (!user) {
Expand All @@ -47,26 +48,22 @@ router.post('/login', (req, res) => {
.comparePassword(req.body.password, user.password)
.then(() => {

let token = jwt.sign(user, req.app.get('secret'), {
let token = jwt.sign({ userId: user.id }, req.app.get('secret'), {
expiresIn: req.app.get('expiresToken')
});

res.json({
user: {
id: user.id,
name: user.name
},
user: UserModel.normalize(user),
token: token
});
})
.catch(error => {
console.error('error on login', error);

res.status(400).send({ error: "Worng password" });
});
})
.catch(err => {
throw err;
res.status(500).json(err);
})
});

Expand Down
41 changes: 41 additions & 0 deletions app/api/user.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
const express = require('express');
const Authorize = require('../../utils/authorize');
const UserModel = require('../db/user');
const User = UserModel.User;
const router = express.Router();

Authorize(router);

router
.get('/', (req, res) => {
User.findById(req.payload.userId)
.then(user => {
if (!user) { res.send(404); return; }

res.json({ user: UserModel.normalize(user) });
})
.catch(err => {
res.status(500).send(err);
});
})

.put('/', (req, res) => {
User.findById(req.payload.userId)
.then(user => {
if (!user) { res.send(404); return; }

UserModel.update(user, req.body)
.save()
.then(user => {
res.json({ user: UserModel.normalize(user) });
})
.catch(err => {
res.status(500).send(err);
});
})
.catch(err => {
res.status(500).send(err);
});
});

module.exports = router;
46 changes: 25 additions & 21 deletions app/api/users.js
Original file line number Diff line number Diff line change
@@ -1,38 +1,45 @@
const express = require('express');
const User = require('../db/user');
const AuthorizeRequire = require('../../utils/authorize');

const Authorize = require('../../utils/authorize');
const UserModel = require('../db/user');
const User = UserModel.User;
const router = express.Router();

AuthorizeRequire(router);
Authorize(router);

router.get('/', (req, res) => {

User
.find({})
User.find({})
.then(users => {
res.json(users);
res.json({
users: users.map(user => UserModel.normalize(user))
});
});
});

router
.route('/:userId')

.get((req, res) => {
User
.findById(req.params.userId)

User.findById(req.params.userId)
.then(user => {
res.json(user);
if (!user) { res.sendStatus(404); return; }

res.json(UserModel.normalize(user));
})
.catch(err => {
res.status(500).send(err);
});
})

.put((req, res) => {
User
.findById(req.params.userId)

User.findById(req.params.userId)
.then(user => {
user.name = req.body.name;
user.save()
if (!user) { res.sendStatus(404); return; }

UserModel.update(user, req.body)
.save()
.then(user => {
res.json({ userId: user.id });
})
Expand All @@ -44,19 +51,16 @@ router
res.status(500).send(err);
});
})

.delete((req, res) => {
User
.remove({
_id: req.params.userId
})

User.remove({ _id: req.params.userId })
.then(() => {
res.json({ delete: true });
})
.catch(err => {
res.status(500).send(err);
})
});
});


module.exports = router;

40 changes: 36 additions & 4 deletions app/db/user.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,39 @@
const mongoose = require('mongoose');
const Schema = mongoose.Schema;

module.exports = mongoose.model('User', new Schema({
name: String,
password: String
}));
let UserSchema = new Schema({
email: { type: String, required: true },
name: { type: String, required: true },
password: { type: String, required: true },
age: { type: Number, required: false, default: null },
bio: { type: String, required: false, default: '' },
createdAt: { type: Date, default: Date.now },
admin: { type: Boolean, default: false }
});

UserSchema.pre('save', next => {
now = new Date();
if (!this.createdAt) {
this.createdAt = now;
}
next();
});

module.exports = {
User: mongoose.model('User', UserSchema),
normalize: (user) => {
return {
id: user.id,
name: user.name,
bio: user.bio,
createdAt: user.createdAt
}
},
update: (user, newUser) => {
delete newUser.createdAt;
delete newUser.password;
delete newUser.id;

return Object.assign(user, newUser);
}
}
16 changes: 13 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@
},
"scripts": {
"start": "node www",
"watch": "nodemon www"
"watch": "nodemon www",
"mocha": "mocha",
"test": "mocha tests"
},
"author": "Shlomi Levi <wizardnet972>",
"license": "MIT",
Expand All @@ -20,6 +22,14 @@
"mongoose": "^4.4.5",
"morgan": "^1.7.0",
"node-promise": "^0.5.12",
"promise": "^7.1.1"
"promise": "^7.1.1",
"query-string": "^4.2.3"
},
"devDependencies": {
"chai": "^3.5.0",
"chai-http": "^3.0.0",
"chai-jwt": "^2.0.0",
"mocha": "^3.2.0",
"sinon": "^1.17.6"
}
}
}
71 changes: 71 additions & 0 deletions tests/api.spec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
const server = require('../www');
const chai = require('chai');
const chaiHttp = require('chai-http');
const chaiJWT = require('chai-jwt');
const should = chai.should();

chai.use(chaiHttp);
chai.use(chaiJWT);

describe('a suite test for api route', function() {
var token = { admin: null, user: null };

it('should return 200', (done) => {
chai.request(server)
.get('/')
.end((err, res) => {
res.should.have.status(200);
done();
});
});

it('should have api route', (done) => {
chai.request(server)
.get('/api')
.end((err, res) => {
res.should.have.status(200);
res.body.should.be.a('object');
done();
});
});

it('should signup a new user as admin', (done) => {
const newAdmin = {
email: '[email protected]',
password: 'admin',
name: 'adminy',
age: '31',
bio: 'This is the wiazrdnet972 admin bio',
admin: true
}

chai.request(server)
.post('/api/signup')
.send(newAdmin)
.end((err, res) => {
res.should.have.status(201);
res.body.should.be.a('object');
res.body.should.have.property('userId').be.a('string');
done();
});
});

it('should signup a new user', (done) => {
const newUser = {
email: '[email protected]',
password: 'user',
name: 'user',
bio: 'This is the user bio'
}

chai.request(server)
.post('/api/signup')
.send(newUser)
.end((err, res) => {
res.should.have.status(201);
res.body.should.be.a('object');
res.body.should.have.property('userId').be.a('string');
done();
});
});
});
Loading

0 comments on commit cdeb73e

Please sign in to comment.