Whoop whoop test for recalculation of gamesCompleted

This commit is contained in:
Ruben Vereecken 2014-06-24 18:14:26 +02:00
parent 7a4c6daec8
commit 7a07e1feb0
6 changed files with 88 additions and 5 deletions

View file

@ -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

View file

@ -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)

View file

@ -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 '.', '_'

View file

@ -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()

View file

@ -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()

View file

@ -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()