Tweaked, re-enabled achievement specs.

This commit is contained in:
Scott Erickson 2014-11-21 10:59:48 -08:00
parent c77d38d59f
commit e5b87e5158
2 changed files with 130 additions and 131 deletions

View file

@ -67,7 +67,7 @@ class EarnedAchievementHandler extends Handler
if achievement.get('proportionalTo')
return @sendBadInputError(res, 'Cannot currently do this to repeatable docs...')
EarnedAchievement.createForAchievement(achievement, trigger, null, (earnedAchievementDoc) =>
@sendSuccess(res, earnedAchievementDoc.toObject())
@sendCreated(res, earnedAchievementDoc.toObject())
)
)

View file

@ -122,134 +122,133 @@ describe 'Achievement', ->
# TODO: Took level achievements out of this auto achievement business, so fix these tests
#describe 'Achieving Achievements', ->
# it 'wait for achievements to be loaded', (done) ->
# Achievement.loadAchievements (achievements) ->
# expect(Object.keys(achievements).length).toBe(1)
#
# loadedAchievements = Achievement.getLoadedAchievements()
# expect(Object.keys(loadedAchievements).length).toBe(1)
# done()
#
# it 'saving an object that should trigger an unlockable achievement', (done) ->
# unittest.getNormalJoe (joe) ->
# session = new LevelSession
# permissions: simplePermissions
# creator: joe._id
# level: original: 'dungeon-arena'
# session.save (err, doc) ->
# expect(err).toBeNull()
# expect(doc).toBeDefined()
# expect(doc.creator).toBe(session.creator)
# done()
#
# it 'verify that an unlockable achievement has been earned', (done) ->
# unittest.getNormalJoe (joe) ->
# EarnedAchievement.find {}, (err, docs) ->
# expect(err).toBeNull()
# expect(docs.length).toBe(1)
# achievement = docs[0]
# expect(achievement).toBeDefined()
#
# expect(achievement.get 'achievement').toBe unlockable._id
# expect(achievement.get 'user').toBe joe._id.toHexString()
# expect(achievement.get 'notified').toBeFalsy()
# expect(achievement.get 'earnedPoints').toBe unlockable.worth
# expect(achievement.get 'achievedAmount').toBeUndefined()
# expect(achievement.get 'previouslyAchievedAmount').toBeUndefined()
# done()
#
# it 'saving an object that should trigger a repeatable achievement', (done) ->
# unittest.getNormalJoe (joe) ->
# expect(joe.get 'simulatedBy').toBeFalsy()
# joe.set('simulatedBy', 2)
# joe.save (err, doc) ->
# expect(err).toBeNull()
# done()
#
# it 'verify that a repeatable achievement has been earned', (done) ->
# unittest.getNormalJoe (joe) ->
# EarnedAchievement.find {achievementName: repeatable.name}, (err, docs) ->
# expect(err).toBeNull()
# expect(docs.length).toBe(1)
# achievement = docs[0]
#
# expect(achievement.get 'achievement').toBe repeatable._id
# expect(achievement.get 'user').toBe joe._id.toHexString()
# expect(achievement.get 'notified').toBeFalsy()
# expect(achievement.get 'earnedPoints').toBe 2 * repeatable.worth
# expect(achievement.get 'achievedAmount').toBe 2
# expect(achievement.get 'previouslyAchievedAmount').toBeFalsy()
# done()
#
#
# it 'verify that the repeatable achievement with complex exp has been earned', (done) ->
# unittest.getNormalJoe (joe) ->
# EarnedAchievement.find {achievementName: diminishing.name}, (err, docs) ->
# expect(err).toBeNull()
# expect(docs.length).toBe 1
# achievement = docs[0]
#
# expect(achievement.get 'achievedAmount').toBe 2
# expect(achievement.get 'earnedPoints').toBe (Math.log(.5 * (2 + .5)) + 1) * diminishing.worth
#
# done()
describe 'Level Session Achievement', ->
it 'does not generate earned achievements automatically, they need to be created manually', (done) ->
unittest.getNormalJoe (joe) ->
session = new LevelSession
permissions: simplePermissions
creator: joe._id
level: original: 'dungeon-arena'
session.save (err, session) ->
expect(err).toBeNull()
expect(session).toBeDefined()
expect(session.creator).toBe(session.creator)
EarnedAchievement.find {}, (err, earnedAchievements) ->
expect(err).toBeNull()
expect(earnedAchievements.length).toBe(0)
json = {achievement: unlockable._id, triggeredBy: session._id, collection: 'level.sessions'}
request.post {uri: getURL('/db/earned_achievement'), json: json}, (err, res, body) ->
expect(res.statusCode).toBe(201)
expect(body.achievement).toBe unlockable._id+''
expect(body.user).toBe joe._id.toHexString()
expect(body.notified).toBeFalsy()
expect(body.earnedPoints).toBe unlockable.worth
expect(body.achievedAmount).toBeUndefined()
expect(body.previouslyAchievedAmount).toBeUndefined()
done()
#describe 'Recalculate Achievements', ->
# EarnedAchievementHandler = require '../../../server/achievements/earned_achievement_handler'
#
# it 'remove earned achievements', (done) ->
# clearModels [EarnedAchievement], (err) ->
# expect(err).toBeNull()
# EarnedAchievement.find {}, (err, earned) ->
# expect(earned.length).toBe 0
#
# User.update {}, {$set: {points: 0}}, {multi:true}, (err) ->
# expect(err).toBeNull()
# done()
#
# it 'can not be accessed by regular users', (done) ->
# loginJoe -> request.post {uri:getURL '/admin/earned_achievement/recalculate'}, (err, res, body) ->
# expect(res.statusCode).toBe 403
# done()
#
# it 'can recalculate a selection of achievements', (done) ->
# loginAdmin ->
# EarnedAchievementHandler.constructor.recalculate ['dungeon-arena-started'], ->
# EarnedAchievement.find {}, (err, earnedAchievements) ->
# expect(earnedAchievements.length).toBe 1
#
# # Recalculate again, doesn't change a thing
# EarnedAchievementHandler.constructor.recalculate ['dungeon-arena-started'], ->
# EarnedAchievement.find {}, (err, earnedAchievements) ->
# expect(earnedAchievements.length).toBe 1
#
# unittest.getNormalJoe (joe) ->
# User.findById joe.get('id'), (err, guy) ->
# expect(err).toBeNull()
# expect(guy.get 'points').toBe unlockable.worth
# done()
#
# it 'can recalculate all achievements', (done) ->
# loginAdmin ->
# Achievement.count {}, (err, count) ->
# expect(count).toBe 3
# EarnedAchievementHandler.constructor.recalculate ->
# EarnedAchievement.find {}, (err, earnedAchievements) ->
# expect(earnedAchievements.length).toBe 3
# unittest.getNormalJoe (joe) ->
# User.findById joe.get('id'), (err, guy) ->
# expect(err).toBeNull()
# expect(guy.get 'points').toBe unlockable.worth + 2 * repeatable.worth + (Math.log(.5 * (2 + .5)) + 1) * diminishing.worth
# done()
#
# it 'cleaning up test: deleting all Achievements and related', (done) ->
# clearModels [Achievement, EarnedAchievement, LevelSession], (err) ->
# expect(err).toBeNull()
#
# # reset achievements in memory as well
# Achievement.resetAchievements()
# loadedAchievements = Achievement.getLoadedAchievements()
# expect(Object.keys(loadedAchievements).length).toBe(0)
#
# done()
describe 'Achieving Achievements', ->
it 'wait for achievements to be loaded', (done) ->
Achievement.loadAchievements (achievements) ->
expect(Object.keys(achievements).length).toBe(1)
loadedAchievements = Achievement.getLoadedAchievements()
expect(Object.keys(loadedAchievements).length).toBe(1)
done()
it 'saving an object that should trigger a repeatable achievement', (done) ->
unittest.getNormalJoe (joe) ->
expect(joe.get 'simulatedBy').toBeFalsy()
joe.set('simulatedBy', 2)
joe.save (err, doc) ->
expect(err).toBeNull()
done()
it 'verify that a repeatable achievement has been earned', (done) ->
unittest.getNormalJoe (joe) ->
EarnedAchievement.find {achievementName: repeatable.name}, (err, docs) ->
expect(err).toBeNull()
expect(docs.length).toBe(1)
achievement = docs[0]
expect(achievement.get 'achievement').toBe repeatable._id
expect(achievement.get 'user').toBe joe._id.toHexString()
expect(achievement.get 'notified').toBeFalsy()
expect(achievement.get 'earnedPoints').toBe 2 * repeatable.worth
expect(achievement.get 'achievedAmount').toBe 2
expect(achievement.get 'previouslyAchievedAmount').toBeFalsy()
done()
it 'verify that the repeatable achievement with complex exp has been earned', (done) ->
unittest.getNormalJoe (joe) ->
EarnedAchievement.find {achievementName: diminishing.name}, (err, docs) ->
expect(err).toBeNull()
expect(docs.length).toBe 1
achievement = docs[0]
expect(achievement.get 'achievedAmount').toBe 2
expect(achievement.get 'earnedPoints').toBe (Math.log(.5 * (2 + .5)) + 1) * diminishing.worth
done()
describe 'Recalculate Achievements', ->
EarnedAchievementHandler = require '../../../server/achievements/earned_achievement_handler'
it 'remove earned achievements', (done) ->
clearModels [EarnedAchievement], (err) ->
expect(err).toBeNull()
EarnedAchievement.find {}, (err, earned) ->
expect(earned.length).toBe 0
User.update {}, {$set: {points: 0}}, {multi:true}, (err) ->
expect(err).toBeNull()
done()
it 'can not be accessed by regular users', (done) ->
loginJoe -> request.post {uri:getURL '/admin/earned_achievement/recalculate'}, (err, res, body) ->
expect(res.statusCode).toBe 403
done()
it 'can recalculate a selection of achievements', (done) ->
loginAdmin ->
EarnedAchievementHandler.constructor.recalculate ['dungeon-arena-started'], ->
EarnedAchievement.find {}, (err, earnedAchievements) ->
expect(earnedAchievements.length).toBe 1
# Recalculate again, doesn't change a thing
EarnedAchievementHandler.constructor.recalculate ['dungeon-arena-started'], ->
EarnedAchievement.find {}, (err, earnedAchievements) ->
expect(earnedAchievements.length).toBe 1
unittest.getNormalJoe (joe) ->
User.findById joe.get('id'), (err, guy) ->
expect(err).toBeNull()
expect(guy.get 'points').toBe unlockable.worth
done()
it 'can recalculate all achievements', (done) ->
loginAdmin ->
Achievement.count {}, (err, count) ->
expect(count).toBe 3
EarnedAchievementHandler.constructor.recalculate ->
EarnedAchievement.find {}, (err, earnedAchievements) ->
expect(earnedAchievements.length).toBe 3
unittest.getNormalJoe (joe) ->
User.findById joe.get('id'), (err, guy) ->
expect(err).toBeNull()
expect(guy.get 'points').toBe unlockable.worth + 2 * repeatable.worth + (Math.log(.5 * (2 + .5)) + 1) * diminishing.worth
done()
it 'cleaning up test: deleting all Achievements and related', (done) ->
clearModels [Achievement, EarnedAchievement, LevelSession], (err) ->
expect(err).toBeNull()
# reset achievements in memory as well
Achievement.resetAchievements()
loadedAchievements = Achievement.getLoadedAchievements()
expect(Object.keys(loadedAchievements).length).toBe(0)
done()