Skip to content
This repository was archived by the owner on Aug 5, 2019. It is now read-only.

Commit 9b5b2b9

Browse files
committed
Server tests
1 parent 3aefff1 commit 9b5b2b9

File tree

13 files changed

+347
-162
lines changed

13 files changed

+347
-162
lines changed

jest.config.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
module.exports = {
22
collectCoverage: true,
33
coverageDirectory: './coverage',
4-
coveragePathIgnorePatterns: ['dist'],
4+
coveragePathIgnorePatterns: ['dist', 'node_modules'],
55
testPathIgnorePatterns: ['dist'],
66
};

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
"main": "index.js",
66
"scripts": {
77
"pretest": "npm run clean",
8-
"test": "jest --no-cache --runInBand --forceExit",
8+
"test": "jest --forceExit",
99
"test:watch": "jest --watch",
1010
"lint": "eslint . ",
1111
"build": "npm run build:server && npm run build:client",

src/server/models/CreditCard.js

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,30 @@ mongoose.Promise = bluebird;
99

1010
// Create a schema
1111
const CreditCardSchema = new mongoose.Schema({
12-
userId: String,
13-
name: String,
14-
limit: Number,
15-
balance: Number,
16-
interest_rate: Number,
17-
updated_at: { type: Date, default: Date.now },
12+
userId: {
13+
type: String,
14+
required: true,
15+
},
16+
name: {
17+
type: String,
18+
required: true,
19+
},
20+
limit: {
21+
type: Number,
22+
require: true,
23+
},
24+
balance: {
25+
type: Number,
26+
require: true,
27+
},
28+
interest_rate: {
29+
type: Number,
30+
require: true,
31+
},
32+
updated_at: {
33+
type: Date,
34+
default: Date.now,
35+
},
1836
});
1937

2038
module.exports = mongoose.model('CreditCard', CreditCardSchema);

src/server/routesLogic/creditCards.js

Lines changed: 56 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -1,61 +1,38 @@
1-
import logger from 'console';
2-
31
const User = require('../models/User');
42
const CreditCard = require('../models/CreditCard');
53

6-
export const getAllCreditCards = (req, res, next) => {
4+
export const getAllCreditCards = (req, res) => {
75
// TODO: Update to use query to sort (ex: 'sort=balance', 'sort=interest_rate'.
8-
User.findById(req.session && req.session.userId).exec((error, user) => {
9-
if (error) {
10-
return next(error);
11-
}
12-
if (user === null) {
13-
return res.redirect('/login');
6+
User.findById(req.session && req.session.userId, userError => {
7+
if (userError) {
8+
return res
9+
.status(400)
10+
.json({ error: true, message: 'Error fetching data' });
1411
}
15-
let response = {};
16-
CreditCard.find({ userId: req.session.userId }, (err, data) => {
17-
if (err) {
18-
response = { error: true, message: 'Error fetching data' };
19-
} else {
20-
response = { error: false, message: data };
12+
CreditCard.find({ userId: req.session.userId }, (cardError, data) => {
13+
if (cardError) {
14+
return res
15+
.status(400)
16+
.json({ error: true, message: 'Error fetching data' });
2117
}
22-
res.json(response);
18+
return res.json({ error: false, message: data });
2319
}).sort([['balance', 'descending']]);
2420
});
2521
};
2622

2723
export const getCreditCardById = (req, res) => {
28-
logger.info('request = ', req.params);
29-
let response = {};
3024
CreditCard.findById(req.params.id, (err, data) => {
3125
if (err) {
32-
response = { error: true, message: 'Error fetching data' };
33-
} else {
34-
response = { error: false, message: data };
26+
return res
27+
.status(400)
28+
.json({ error: true, message: 'Error fetching data' });
3529
}
36-
res.json(response);
30+
return res.json({ error: false, message: data });
3731
});
3832
};
3933

4034
export const addCreditCard = (req, res) => {
41-
let response = {};
4235
const creditCard = new CreditCard();
43-
if (
44-
!(
45-
req.session.userId &&
46-
req.body.user &&
47-
req.body.name &&
48-
req.body.limit &&
49-
req.body.balance &&
50-
req.body.interest_rate
51-
)
52-
) {
53-
response = {
54-
error: true,
55-
message: 'Error adding data, all fields required',
56-
};
57-
return res.json(response);
58-
}
5936
creditCard.userId = req.session.userId;
6037
creditCard.user = req.body.user;
6138
creditCard.name = req.body.name;
@@ -64,69 +41,62 @@ export const addCreditCard = (req, res) => {
6441
creditCard.interest_rate = req.body.interest_rate;
6542
creditCard.save((err, data) => {
6643
if (err) {
67-
response = { error: true, message: 'Error adding data' };
68-
} else {
69-
response = {
70-
error: false,
71-
message: 'Data added',
72-
data,
73-
};
44+
return res
45+
.status(400)
46+
.json({ error: true, message: 'Error adding data' });
7447
}
75-
res.json(response);
48+
return res.json({
49+
error: false,
50+
message: 'Data added',
51+
data,
52+
});
7653
});
7754
};
7855

7956
export const deleteCreditCard = (req, res) => {
80-
let response = {};
81-
CreditCard.findById(req.params.id, err => {
82-
if (err) {
83-
return res.json({ error: true, message: 'Error fetching data' });
57+
CreditCard.findById(req.params.id, findError => {
58+
if (findError) {
59+
return res
60+
.status(400)
61+
.json({ error: true, message: 'Error fetching data' });
8462
}
85-
CreditCard.remove({ _id: req.params.id }, () => {
86-
if (err) {
87-
response = { error: true, message: 'Error deleting data' };
88-
} else {
89-
response = {
90-
error: false,
91-
message: `Data associated with ${req.params.id} is deleted`,
92-
};
63+
CreditCard.remove({ _id: req.params.id }, removeError => {
64+
if (removeError) {
65+
return res
66+
.status(400)
67+
.json({ error: true, message: 'Error deleting data' });
9368
}
94-
res.json(response);
69+
return res.json({
70+
error: false,
71+
message: `Data associated with ${req.params.id} is deleted`,
72+
});
9573
});
9674
});
9775
};
9876

9977
export const putOrUpdate = (req, res) => {
100-
let response = {};
10178
CreditCard.findById(req.params.id, (err, initialData) => {
10279
const data = initialData;
103-
data.userId = req.session.userId;
10480
if (err) {
105-
response = { error: true, message: 'Error fetching data' };
106-
} else {
107-
if (req.body.name !== undefined) {
108-
data.name = req.body.name;
109-
}
110-
if (req.body.limit !== undefined) {
111-
data.limit = req.body.limit;
112-
}
113-
if (req.body.balance !== undefined) {
114-
data.balance = req.body.balance;
115-
}
116-
if (req.body.interest_rate !== undefined) {
117-
data.interest_rate = req.body.interest_rate;
81+
return res
82+
.status(400)
83+
.json({ error: true, message: 'Error fetching data' });
84+
}
85+
data.userId = req.session.userId;
86+
data.name = req.body.name;
87+
data.limit = req.body.limit;
88+
data.balance = req.body.balance;
89+
data.interest_rate = req.body.interest_rate;
90+
data.save(saveError => {
91+
if (saveError) {
92+
return res
93+
.status(400)
94+
.json({ error: true, message: 'Error updating data' });
11895
}
119-
data.save(() => {
120-
if (err) {
121-
response = { error: true, message: 'Error updating data' };
122-
} else {
123-
response = {
124-
error: false,
125-
message: `Data is updated for ${req.body.name}`,
126-
};
127-
}
128-
res.json(response);
96+
return res.json({
97+
error: false,
98+
message: `Data is updated for ${req.body.name}`,
12999
});
130-
}
100+
});
131101
});
132102
};

src/server/routesLogic/creditCards.test.js

Lines changed: 126 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import session from 'supertest-session';
22
import mockingoose from 'mockingoose';
33
import { server } from '../server';
44
import {
5+
VALID_USERID,
56
CREDIT_CARD,
67
INVALID_CREDIT_CARD,
78
LOGIN_SUCCESS_MOCK_USER,
@@ -23,6 +24,54 @@ describe('Test /creditcards API routes', () => {
2324
.expect(200);
2425
});
2526

27+
describe('Test getCreditCards', () => {
28+
it('getCreditCards success, return 200 status, and error = false', async () => {
29+
mockingoose.User.toReturn(VALID_USERID, 'findOne');
30+
mockingoose.CreditCard.toReturn(CREDIT_CARD, 'find');
31+
const response = await serverSession
32+
.get('/api/creditcards')
33+
.set('Accept', 'text/html, application/json');
34+
expect(response.statusCode).toBe(200);
35+
expect(response.error).toEqual(false);
36+
});
37+
it('getCreditCards failure, find User error, return 400 status, and error = true', async () => {
38+
mockingoose.User.toReturn(new Error('Error'), 'findOne');
39+
const response = await serverSession
40+
.get('/api/creditcards')
41+
.set('Accept', 'text/html application/json');
42+
expect(response.statusCode).toBe(400);
43+
expect(response.body.error).toEqual(true);
44+
});
45+
it('getCreditCards failure, find CreditCard, return 400 status, and error = true', async () => {
46+
mockingoose.User.toReturn(VALID_USERID, 'findOne');
47+
mockingoose.CreditCard.toReturn(new Error('Error'), 'find');
48+
const response = await serverSession
49+
.get('/api/creditcards')
50+
.set('Accept', 'text/html application/json');
51+
expect(response.statusCode).toBe(400);
52+
expect(response.body.error).toEqual(true);
53+
});
54+
});
55+
56+
describe('Test getCreditCardById', () => {
57+
it('getCreditCardById success, return 200 status, and error = false', async () => {
58+
mockingoose.CreditCard.toReturn(CREDIT_CARD, 'findOne');
59+
const response = await serverSession
60+
.get('/api/creditcards/8675309')
61+
.set('Accept', 'text/html application/json');
62+
expect(response.statusCode).toBe(200);
63+
expect(response.body.error).toEqual(false);
64+
});
65+
it('getCreditCardById failure, return 400 status, and error = true', async () => {
66+
mockingoose.CreditCard.toReturn(new Error('Error'), 'findOne');
67+
const response = await serverSession
68+
.get('/api/creditcards/8675309')
69+
.set('Accept', 'text/html application/json');
70+
expect(response.statusCode).toBe(400);
71+
expect(response.body.error).toEqual(true);
72+
});
73+
});
74+
2675
describe('Test addCreditCard', () => {
2776
it('addCreditCard success, return 200 status, and error = false', async () => {
2877
mockingoose.CreditCard.toReturn(CREDIT_CARD, 'save');
@@ -32,16 +81,90 @@ describe('Test /creditcards API routes', () => {
3281
.send(CREDIT_CARD);
3382
expect(response.body.data.limit).toEqual(10000);
3483
});
35-
it('addCreditCard failure, error = true', async () => {
84+
it('addCreditCard failure, return 400 status, error = true', async () => {
3685
mockingoose.CreditCard.toReturn(INVALID_CREDIT_CARD, 'save');
3786
const response = await serverSession
3887
.post('/api/creditcards')
3988
.set('Accept', 'text/html, application/json')
4089
.send(INVALID_CREDIT_CARD);
90+
expect(response.statusCode).toBe(400);
4191
expect(response.body.error).toBe(true);
42-
expect(response.body.message).toEqual(
43-
'Error adding data, all fields required',
92+
expect(response.body.message).toEqual('Error adding data');
93+
});
94+
});
95+
96+
describe('Test deleteCreditCard', () => {
97+
it('deleteCreditCard success, return 200 status, and error = false', async () => {
98+
mockingoose.CreditCard.toReturn(VALID_USERID, 'findOne').toReturn(
99+
VALID_USERID,
100+
'remove',
101+
);
102+
const response = await serverSession
103+
.delete('/api/creditcards/8675309')
104+
.set('Accept', 'text/html application/json');
105+
expect(response.statusCode).toBe(200);
106+
expect(response.body.error).toEqual(false);
107+
});
108+
it('deleteCreditCard failure, invalid userId, return 400 status, and error = true', async () => {
109+
mockingoose.CreditCard.toReturn(new Error('Error'), 'findOne').toReturn(
110+
VALID_USERID,
111+
'remove',
112+
);
113+
const response = await serverSession
114+
.delete('/api/creditcards/8675309')
115+
.set('Accept', 'text/html application/json');
116+
expect(response.statusCode).toBe(400);
117+
expect(response.body.error).toEqual(true);
118+
});
119+
it('deleteCreditCard failure, invalid credit card, return 400 status, and error = true', async () => {
120+
mockingoose.CreditCard.toReturn(VALID_USERID, 'findOne').toReturn(
121+
new Error('Error'),
122+
'remove',
123+
);
124+
const response = await serverSession
125+
.delete('/api/creditcards/8675309')
126+
.set('Accept', 'text/html application/json');
127+
expect(response.statusCode).toBe(400);
128+
expect(response.body.error).toEqual(true);
129+
});
130+
});
131+
132+
describe('Test putOrUpdate', () => {
133+
it('putOrUpdate success, return 200 status, and error = false', async () => {
134+
mockingoose.CreditCard.toReturn(CREDIT_CARD, 'findOne').toReturn(
135+
CREDIT_CARD,
136+
'save',
44137
);
138+
const response = await serverSession
139+
.put('/api/creditcards/8675309')
140+
.set('Accept', 'text/html application/json')
141+
.send(CREDIT_CARD);
142+
expect(response.statusCode).toBe(200);
143+
expect(response.body.error).toEqual(false);
144+
});
145+
it('putOrUpdate failure, find error, return 400 status, and error = true', async () => {
146+
mockingoose.CreditCard.toReturn(new Error('Error'), 'findOne').toReturn(
147+
CREDIT_CARD,
148+
'save',
149+
);
150+
const response = await serverSession
151+
.put('/api/creditcards/8675309')
152+
.set('Accept', 'text/html application/json')
153+
.send(CREDIT_CARD);
154+
expect(response.statusCode).toBe(400);
155+
expect(response.body.error).toEqual(true);
156+
});
157+
it('putOrUpdate failure, update error, return 400 status, and error = true', async () => {
158+
mockingoose.CreditCard.toReturn(CREDIT_CARD, 'findOne').toReturn(
159+
new Error('Error'),
160+
'save',
161+
);
162+
const response = await serverSession
163+
.put('/api/creditcards/8675309')
164+
.set('Accept', 'text/html application/json')
165+
.send(CREDIT_CARD);
166+
expect(response.statusCode).toBe(400);
167+
expect(response.body.error).toEqual(true);
45168
});
46169
});
47170
});

0 commit comments

Comments
 (0)