Skip to content

Commit 075059d

Browse files
committed
Handled edge cases, enhanced the code, and wrote new tests
1 parent ce3bdfb commit 075059d

File tree

4 files changed

+86
-17
lines changed

4 files changed

+86
-17
lines changed

controllers/badge.js

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
const badgeQuery = require('../models/badges')
2+
const logger = require('../utils/logger')
23

34
/**
45
* Get badges data
@@ -22,11 +23,20 @@ const getBadges = async (req, res) => {
2223

2324
const getUserBadges = async (req, res) => {
2425
try {
25-
const allUserBadges = await badgeQuery.fetchUserBadges(req.params.username)
26-
return res.json({
27-
message: 'User badges returned successfully!',
28-
userBadges: allUserBadges
29-
})
26+
const result = await badgeQuery.fetchUserBadges(req.params.username)
27+
if (result.userExists) {
28+
if (result.userBadges.length === 0) {
29+
return res.json({
30+
message: 'This user does not have any badges'
31+
})
32+
}
33+
return res.json({
34+
message: 'User badges returned successfully!',
35+
userBadges: result.userBadges
36+
})
37+
} else {
38+
return res.boom.notFound('The user does not exist')
39+
}
3040
} catch (error) {
3141
logger.error(`Error while fetching all user badges: ${error}`)
3242
return res.boom.serverUnavailable('Something went wrong please contact admin')

models/badges.js

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
const firestore = require('../utils/firestore')
22
const badgeModel = firestore.collection('badges')
3+
const { fetchUser } = require('../models/users')
34

45
/**
56
* Fetches the data about our badges
@@ -35,20 +36,19 @@ const fetchBadges = async ({
3536

3637
const fetchUserBadges = async (username) => {
3738
try {
38-
const snapshot = await badgeModel.get()
39-
const allBadges = []
40-
snapshot.forEach((doc) => {
41-
allBadges.push(doc.data())
42-
})
43-
const userBadges = []
44-
allBadges.forEach((badge) => {
45-
badge.users.forEach((user) => {
46-
if (user === username) {
47-
userBadges.push({ title: badge.title, description: badge.description })
39+
const result = await fetchUser({ username })
40+
if (result.userExists) {
41+
const userID = result.user.id
42+
const snapshot = await badgeModel.get()
43+
const userBadges = []
44+
snapshot.forEach((item) => {
45+
if (item.data().users.includes(userID)) {
46+
userBadges.push({ title: item.data().title, description: item.data().description })
4847
}
4948
})
50-
})
51-
return userBadges
49+
return { userExists: true, userBadges: userBadges }
50+
}
51+
return { userExists: false, userBadges: [] }
5252
} catch (err) {
5353
logger.error('Error retrieving user badges', err)
5454
return err
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/**
2+
* User's badges response
3+
* Multiple responses can be added to the object if required
4+
*
5+
* @return {Object}
6+
*/
7+
8+
const userFound = {
9+
userExists: true,
10+
userBadges: [{ title: 'badgeTitle', description: 'badgeDes' }]
11+
}
12+
13+
const userNotFound = {
14+
userExists: false,
15+
userBadges: []
16+
}
17+
18+
const badgesEmpty = {
19+
userExists: true,
20+
userBadges: []
21+
}
22+
23+
module.exports = { userFound, userNotFound, badgesEmpty }

test/integration/userBadges.test.js

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,22 @@
11
const chai = require('chai')
22
const { expect } = chai
3+
const sinon = require('sinon')
34
const chaiHttp = require('chai-http')
5+
const badges = require('../../models/badges')
6+
const userBadges = require('../fixtures/userBadges/userBadges')
47

58
const app = require('../../server')
69

710
chai.use(chaiHttp)
811

912
describe('User badges', function () {
1013
describe('GET /badges/:username', function () {
14+
afterEach(function () {
15+
badges.fetchUserBadges.restore()
16+
})
17+
1118
it('Should get the list of user badges', function (done) {
19+
sinon.stub(badges, 'fetchUserBadges').returns(userBadges.userFound)
1220
chai
1321
.request(app)
1422
.get('/badges/ankush')
@@ -19,6 +27,34 @@ describe('User badges', function () {
1927
expect(res.body.message).to.equal('User badges returned successfully!')
2028
expect(res.body.userBadges).to.be.a('array')
2129

30+
return done()
31+
})
32+
})
33+
it('Should return a not found message if the user in not found', function (done) {
34+
sinon.stub(badges, 'fetchUserBadges').returns(userBadges.userNotFound)
35+
chai
36+
.request(app)
37+
.get('/badges/invalidUsername')
38+
.end((err, res) => {
39+
if (err) { return done() }
40+
expect(res).to.have.status(404)
41+
expect(res.body.error).to.equal('Not Found')
42+
expect(res.body.message).to.equal('The user does not exist')
43+
44+
return done()
45+
})
46+
})
47+
it('Should return no badges found if the user does not have any badges', function (done) {
48+
sinon.stub(badges, 'fetchUserBadges').returns(userBadges.badgesEmpty)
49+
chai
50+
.request(app)
51+
.get('/badges/someuser')
52+
.end((err, res) => {
53+
if (err) { return done() }
54+
expect(res).to.have.status(200)
55+
expect(res.body).to.be.a('object')
56+
expect(res.body.message).to.equal('This user does not have any badges')
57+
2258
return done()
2359
})
2460
})

0 commit comments

Comments
 (0)