From 7a07e1feb0c4bc04e4ed711b252899c1d4853849 Mon Sep 17 00:00:00 2001 From: Ruben Vereecken Date: Tue, 24 Jun 2014 18:14:26 +0200 Subject: [PATCH] Whoop whoop test for recalculation of gamesCompleted --- .../earned_achievement_handler.coffee | 2 +- server/commons/Handler.coffee | 13 ++++++++ server/routes/admin.coffee | 2 +- server/users/user_handler.coffee | 23 ++++++++++++++ test/server/functional/admin.spec.coffee | 23 ++++++++++++++ test/server/functional/user.spec.coffee | 30 +++++++++++++++++-- 6 files changed, 88 insertions(+), 5 deletions(-) create mode 100644 test/server/functional/admin.spec.coffee diff --git a/server/achievements/earned_achievement_handler.coffee b/server/achievements/earned_achievement_handler.coffee index 24615054d..399106473 100644 --- a/server/achievements/earned_achievement_handler.coffee +++ b/server/achievements/earned_achievement_handler.coffee @@ -21,7 +21,7 @@ class EarnedAchievementHandler extends Handler EarnedAchievementHandler.recalculate achievementSlugsOrIDs, onSuccess else EarnedAchievementHandler.recalculate onSuccess - @sendSuccess res, {} + @sendAccepted res, {} # Returns success: boolean # TODO call onFinished diff --git a/server/commons/Handler.coffee b/server/commons/Handler.coffee index ee4c312de..e2d1c4330 100644 --- a/server/commons/Handler.coffee +++ b/server/commons/Handler.coffee @@ -47,6 +47,7 @@ module.exports = class Handler # sending functions sendUnauthorizedError: (res) -> errors.forbidden(res) #TODO: rename sendUnauthorizedError to sendForbiddenError + sendForbiddenError: (res) -> errors.forbidden(res) sendNotFoundError: (res) -> errors.notFound(res) sendMethodNotAllowed: (res) -> errors.badMethod(res) sendBadInputError: (res, message) -> errors.badInput(res, message) @@ -62,6 +63,18 @@ module.exports = class Handler res.send(message) res.end() + sendCreated: (res, message) -> + res.send 201, message + res.end() + + sendAccepted: (res, message) -> + res.send 202, message + res.end() + + sendNoContent: (res, message) -> + res.send 204, message + res.end() + # generic handlers get: (req, res) -> @sendUnauthorizedError(res) if not @hasAccess(req) diff --git a/server/routes/admin.coffee b/server/routes/admin.coffee index c2ae7612a..0cf1c8c7a 100644 --- a/server/routes/admin.coffee +++ b/server/routes/admin.coffee @@ -13,7 +13,7 @@ module.exports.setup = (app) -> parts = module.split('/') module = parts[0] - return errors.unauthorized(res, 'Must be admin to access this area.') unless req.user?.isAdmin() + return errors.forbidden(res, 'Admins only') unless req.user?.isAdmin() try moduleName = module.replace '.', '_' diff --git a/server/users/user_handler.coffee b/server/users/user_handler.coffee index 0ed4f6a51..e6c0bda80 100644 --- a/server/users/user_handler.coffee +++ b/server/users/user_handler.coffee @@ -375,5 +375,28 @@ UserHandler = class UserHandler extends Handler return @sendNotFoundError res unless remark? @sendSuccess res, remark + statHandlers: + gamesCompleted: (done) -> + LevelSession = require '../levels/sessions/LevelSession' + + User.find {}, (err, users) -> + async.eachSeries users, ((user, doneWithUser) -> + userID = user.get('_id').toHexString() + + LevelSession.find {creator: userID, 'state.completed': true}, (err, sessions) -> + completedCount = sessions.length + User.findOneAndUpdate {_id: user.get '_id'}, {$set: 'stats.gamesCompleted': completedCount}, (err) -> + log.error err if err? + doneWithUser() + ), done + + recalculate: (req, res, statName) -> + return @sendForbiddenError(res) unless req.user.isAdmin() + + if statName of @statHandlers + @statHandlers[statName] -> log.debug "Finished recalculating stats" + return @sendAccepted res, {} + else return @sendNotFoundError(res) + module.exports = new UserHandler() diff --git a/test/server/functional/admin.spec.coffee b/test/server/functional/admin.spec.coffee new file mode 100644 index 000000000..d3a34baa4 --- /dev/null +++ b/test/server/functional/admin.spec.coffee @@ -0,0 +1,23 @@ +common = require '../common' + +describe 'recalculate statistics', -> + url = getURL '/admin/user/recalculate/' + + it 'does not allow regular users', (done) -> + loginJoe -> + request.post {uri:url + 'gamesCompleted'}, (err, res, body) -> + expect(res.statusCode).toBe 403 + done() + + it 'responds with a 202 Accepted', (done) -> + loginAdmin -> + request.post {uri:url + 'gamesCompleted'}, (err, res, body) -> + expect(res.statusCode).toBe 202 + done() + + it 'responds with a 404 when not found', (done) -> + loginAdmin -> + request.post {uri:url + 'ballsKicked'}, (err, res, body) -> + expect(res.statusCode).toBe 404 + done() + diff --git a/test/server/functional/user.spec.coffee b/test/server/functional/user.spec.coffee index 89db41e21..81cc765a6 100644 --- a/test/server/functional/user.spec.coffee +++ b/test/server/functional/user.spec.coffee @@ -270,9 +270,11 @@ describe 'GET /db/user', -> ) describe 'statistics', -> + LevelSession = require '../../../server/levels/sessions/LevelSession' + User = require '../../../server/users/User' + UserHandler = require '../../../server/users/user_handler' + it 'games completed', (done) -> - LevelSession = require '../../../server/levels/sessions/LevelSession' - User = require '../../../server/users/User' session = new LevelSession name: 'Beat Gandalf' @@ -286,9 +288,31 @@ describe 'statistics', -> session.save (err) -> expect(err).toBeNull() - User.findOne {_id: joe.get 'id'}, (err, guy) -> + User.findById joe.get('id'), (err, guy) -> expect(err).toBeNull() expect(guy.get 'id').toBe joe.get 'id' expect(guy.get 'stats.gamesCompleted').toBe 1 done() + + it 'recalculates games completed', (done) -> + unittest.getNormalJoe (joe) -> + loginAdmin -> + User.findByIdAndUpdate joe.get('id'), {$set:'stats.gamesCompleted':0}, (err, guy) -> + expect(err).toBeNull() + expect(guy.get 'id').toBe joe.get 'id' + expect(guy.get 'stats.gamesCompleted').toBe 0 + + UserHandler.statHandlers.gamesCompleted -> + User.findById joe.get('id'), (err, guy) -> + expect(err).toBeNull() + expect(guy.get 'id').toBe joe.get 'id' + expect(guy.get 'stats.gamesCompleted').toBe 1 + done() + + + xit 'cleans up', (done) -> + clearModels [LevelSession], (err) -> + expect(err).toBeNull() + + done()