mirror of
https://github.com/codeninjasllc/codecombat.git
synced 2025-03-14 07:00:01 -04:00
Set up level achievements to be created manually by the client, hopefully making them a bit more stable.
This commit is contained in:
parent
2393165d9a
commit
b86e3c30dc
8 changed files with 249 additions and 201 deletions
|
@ -4,4 +4,4 @@ utils = require '../lib/utils'
|
|||
module.exports = class EarnedAchievement extends CocoModel
|
||||
@className: 'EarnedAchievement'
|
||||
@schema: require 'schemas/models/earned_achievement'
|
||||
urlRoot: '/db/earnedachievement'
|
||||
urlRoot: '/db/earned_achievement'
|
||||
|
|
|
@ -24,6 +24,7 @@ module.exports =
|
|||
}
|
||||
]
|
||||
collection: type: 'string'
|
||||
triggeredBy: c.objectId()
|
||||
achievementName: type: 'string'
|
||||
created: type: 'date'
|
||||
changed: type: 'date'
|
||||
|
|
|
@ -73,20 +73,26 @@ module.exports = class HeroVictoryModal extends ModalView
|
|||
earnedAchievements.sizeShouldBe = achievementIDs.length
|
||||
res = @supermodel.loadCollection(earnedAchievements, 'earned_achievements')
|
||||
@earnedAchievements = res.model
|
||||
@listenTo @earnedAchievements, 'sync', ->
|
||||
if (new Date() - @waitingToContinueSince) > 20 * 1000
|
||||
# In case there is some network problem, like we saw with CloudFlare + school proxies, we'll let them keep playing.
|
||||
application.tracker?.trackEvent 'Unlocking Failed', level: @level.get('slug'), label: @level.get('slug')
|
||||
window.levelUnlocksNotWorking = true
|
||||
@readyToContinue = true
|
||||
@updateSavingProgressStatus()
|
||||
else if @earnedAchievements.models.length < @earnedAchievements.sizeShouldBe
|
||||
@earnedAchievements.fetch()
|
||||
else
|
||||
@listenToOnce me, 'sync', ->
|
||||
@readyToContinue = true
|
||||
@updateSavingProgressStatus()
|
||||
me.fetch() unless me.loading
|
||||
@listenToOnce @earnedAchievements, 'sync', ->
|
||||
@newEarnedAchievements = []
|
||||
recorded = (earned.get('achievement') for earned in @earnedAchievements.length)
|
||||
for achievement in @achievements.models
|
||||
continue unless achievement.completed
|
||||
earnedObjects = []
|
||||
if achievement.id not in recorded
|
||||
ea = new EarnedAchievement({
|
||||
collection: achievement.get('collection')
|
||||
triggeredBy: @session.id
|
||||
achievement: achievement.id
|
||||
})
|
||||
ea.save()
|
||||
@newEarnedAchievements.push ea
|
||||
@listenToOnce ea, 'sync', ->
|
||||
if _.all((ea.id for ea in @newEarnedAchievements))
|
||||
@listenToOnce me, 'sync', ->
|
||||
@readyToContinue = true
|
||||
@updateSavingProgressStatus()
|
||||
me.fetch() unless me.loading
|
||||
else
|
||||
@readyToContinue = true
|
||||
|
||||
|
|
|
@ -38,7 +38,7 @@ AchievementSchema.statics.earnedAchievements = {}
|
|||
AchievementSchema.statics.loadAchievements = (done) ->
|
||||
AchievementSchema.statics.resetAchievements()
|
||||
Achievement = require('../achievements/Achievement')
|
||||
query = Achievement.find({})
|
||||
query = Achievement.find({collection: {$ne: 'level.sessions'}})
|
||||
query.exec (err, docs) ->
|
||||
_.each docs, (achievement) ->
|
||||
category = achievement.get 'collection'
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
mongoose = require 'mongoose'
|
||||
jsonschema = require '../../app/schemas/models/earned_achievement'
|
||||
util = require '../../app/lib/utils'
|
||||
|
||||
EarnedAchievementSchema = new mongoose.Schema({
|
||||
notified:
|
||||
|
@ -14,4 +15,59 @@ EarnedAchievementSchema.pre 'save', (next) ->
|
|||
EarnedAchievementSchema.index({user: 1, achievement: 1}, {unique: true, name: 'earned achievement index'})
|
||||
EarnedAchievementSchema.index({user: 1, changed: -1}, {name: 'latest '})
|
||||
|
||||
EarnedAchievementSchema.statics.createForAchievement = (achievement, doc, originalDocObj, done) ->
|
||||
User = require '../users/User'
|
||||
userObjectID = doc.get(achievement.get('userField'))
|
||||
userID = if _.isObject userObjectID then userObjectID.toHexString() else userObjectID # Standardize! Use strings, not ObjectId's
|
||||
|
||||
earned =
|
||||
user: userID
|
||||
achievement: achievement._id.toHexString()
|
||||
achievementName: achievement.get 'name'
|
||||
earnedRewards: achievement.get 'rewards'
|
||||
|
||||
worth = achievement.get('worth') ? 10
|
||||
earnedPoints = 0
|
||||
wrapUp = (earnedAchievementDoc) ->
|
||||
# Update user's experience points
|
||||
update = {$inc: {points: earnedPoints}}
|
||||
for rewardType, rewards of achievement.get('rewards') ? {}
|
||||
if rewardType is 'gems'
|
||||
update.$inc['earned.gems'] = rewards if rewards
|
||||
else if rewards.length
|
||||
update.$addToSet ?= {}
|
||||
update.$addToSet["earned.#{rewardType}"] = $each: rewards
|
||||
User.update {_id: userID}, update, {}, (err, count) ->
|
||||
log.error err if err?
|
||||
done?(earnedAchievementDoc)
|
||||
|
||||
isRepeatable = achievement.get('proportionalTo')?
|
||||
if isRepeatable
|
||||
#log.debug 'Upserting repeatable achievement called \'' + (achievement.get 'name') + '\' for ' + userID
|
||||
proportionalTo = achievement.get 'proportionalTo'
|
||||
originalAmount = if originalDocObj then util.getByPath(originalDocObj, proportionalTo) or 0 else 0
|
||||
docObj = doc.toObject()
|
||||
newAmount = docObj[proportionalTo]
|
||||
|
||||
if originalAmount isnt newAmount
|
||||
expFunction = achievement.getExpFunction()
|
||||
earned.notified = false
|
||||
earned.achievedAmount = newAmount
|
||||
earned.earnedPoints = (expFunction(newAmount) - expFunction(originalAmount)) * worth
|
||||
earned.previouslyAchievedAmount = originalAmount
|
||||
EarnedAchievement.update {achievement: earned.achievement, user: earned.user}, earned, {upsert: true}, (err) ->
|
||||
return log.debug err if err?
|
||||
|
||||
earnedPoints = earned.earnedPoints
|
||||
#log.debug earnedPoints
|
||||
wrapUp()
|
||||
|
||||
else # not alreadyAchieved
|
||||
#log.debug 'Creating a new earned achievement called \'' + (achievement.get 'name') + '\' for ' + userID
|
||||
earned.earnedPoints = worth
|
||||
(new EarnedAchievement(earned)).save (err, doc) ->
|
||||
return log.error err if err?
|
||||
earnedPoints = worth
|
||||
wrapUp(doc)
|
||||
|
||||
module.exports = EarnedAchievement = mongoose.model('EarnedAchievement', EarnedAchievementSchema)
|
||||
|
|
|
@ -12,7 +12,7 @@ class EarnedAchievementHandler extends Handler
|
|||
|
||||
# Don't allow POSTs or anything yet
|
||||
hasAccess: (req) ->
|
||||
req.method is 'GET' # or req.user.isAdmin()
|
||||
req.method in ['GET', 'POST'] # or req.user.isAdmin()
|
||||
|
||||
get: (req, res) ->
|
||||
return @getByAchievementIDs(req, res) if req.query.view is 'get-by-achievement-ids'
|
||||
|
@ -36,6 +36,41 @@ class EarnedAchievementHandler extends Handler
|
|||
return @sendDatabaseError(res, err) if err
|
||||
documents = (@formatEntity(req, doc) for doc in documents)
|
||||
@sendSuccess(res, documents)
|
||||
|
||||
post: (req, res) ->
|
||||
achievementID = req.body.achievement
|
||||
triggeredBy = req.body.triggeredBy
|
||||
collection = req.body.collection
|
||||
if collection isnt 'level.sessions'
|
||||
return @sendBadInputError(res, 'Only doing level session achievements for now.')
|
||||
|
||||
model = mongoose.modelNameByCollection(collection)
|
||||
|
||||
async.parallel({
|
||||
achievement: (callback) ->
|
||||
Achievement.findById achievementID, (err, achievement) -> callback(err, achievement)
|
||||
|
||||
trigger: (callback) ->
|
||||
model.findById triggeredBy, (err, trigger) -> callback(err, trigger)
|
||||
|
||||
earned: (callback) ->
|
||||
q = { achievement: achievementID, user: req.user._id+'' }
|
||||
EarnedAchievement.findOne q, (err, earned) -> callback(err, earned)
|
||||
}, (err, { achievement, trigger, earned } ) =>
|
||||
return @sendDatabaseError(res, err) if err
|
||||
if earned
|
||||
return @sendSuccess(res, earned.toObject())
|
||||
if not achievement
|
||||
return @sendNotFoundError(res, 'Could not find achievement.')
|
||||
if not trigger
|
||||
return @sendNotFoundError(res, 'Could not find trigger.')
|
||||
if achievement.get('proportionalTo')
|
||||
return @sendBadInputError(res, 'Cannot currently do this to repeatable docs...')
|
||||
EarnedAchievement.createForAchievement(achievement, trigger, null, (earnedAchievementDoc) =>
|
||||
@sendSuccess(res, earnedAchievementDoc.toObject())
|
||||
)
|
||||
|
||||
)
|
||||
|
||||
getByAchievementIDs: (req, res) ->
|
||||
query = { user: req.user._id+''}
|
||||
|
|
|
@ -40,60 +40,8 @@ AchievablePlugin = (schema, options) ->
|
|||
isRepeatable = achievement.get('proportionalTo')?
|
||||
alreadyAchieved = if isNew then false else LocalMongo.matchesQuery originalDocObj, query
|
||||
newlyAchieved = LocalMongo.matchesQuery(docObj, query)
|
||||
#log.debug 'isRepeatable: ' + isRepeatable
|
||||
#log.debug 'alreadyAchieved: ' + alreadyAchieved
|
||||
#log.debug 'newlyAchieved: ' + newlyAchieved
|
||||
|
||||
userObjectID = doc.get(achievement.get('userField'))
|
||||
userID = if _.isObject userObjectID then userObjectID.toHexString() else userObjectID # Standardize! Use strings, not ObjectId's
|
||||
|
||||
if newlyAchieved and (not alreadyAchieved or isRepeatable)
|
||||
earned =
|
||||
user: userID
|
||||
achievement: achievement._id.toHexString()
|
||||
achievementName: achievement.get 'name'
|
||||
earnedRewards: achievement.get 'rewards'
|
||||
|
||||
worth = achievement.get('worth') ? 10
|
||||
earnedPoints = 0
|
||||
wrapUp = ->
|
||||
# Update user's experience points
|
||||
update = {$inc: {points: earnedPoints}}
|
||||
for rewardType, rewards of achievement.get('rewards') ? {}
|
||||
if rewardType is 'gems'
|
||||
update.$inc['earned.gems'] = rewards if rewards
|
||||
else if rewards.length
|
||||
update.$addToSet ?= {}
|
||||
update.$addToSet["earned.#{rewardType}"] = $each: rewards
|
||||
User.update {_id: userID}, update, {}, (err, count) ->
|
||||
log.error err if err?
|
||||
|
||||
if isRepeatable
|
||||
#log.debug 'Upserting repeatable achievement called \'' + (achievement.get 'name') + '\' for ' + userID
|
||||
proportionalTo = achievement.get 'proportionalTo'
|
||||
originalAmount = if originalDocObj then util.getByPath(originalDocObj, proportionalTo) or 0 else 0
|
||||
newAmount = docObj[proportionalTo]
|
||||
|
||||
if originalAmount isnt newAmount
|
||||
expFunction = achievement.getExpFunction()
|
||||
earned.notified = false
|
||||
earned.achievedAmount = newAmount
|
||||
earned.earnedPoints = (expFunction(newAmount) - expFunction(originalAmount)) * worth
|
||||
earned.previouslyAchievedAmount = originalAmount
|
||||
EarnedAchievement.update {achievement: earned.achievement, user: earned.user}, earned, {upsert: true}, (err) ->
|
||||
return log.debug err if err?
|
||||
|
||||
earnedPoints = earned.earnedPoints
|
||||
#log.debug earnedPoints
|
||||
wrapUp()
|
||||
|
||||
else # not alreadyAchieved
|
||||
#log.debug 'Creating a new earned achievement called \'' + (achievement.get 'name') + '\' for ' + userID
|
||||
earned.earnedPoints = worth
|
||||
(new EarnedAchievement(earned)).save (err, doc) ->
|
||||
return log.error err if err?
|
||||
earnedPoints = worth
|
||||
wrapUp()
|
||||
return unless newlyAchieved and (not alreadyAchieved or isRepeatable)
|
||||
EarnedAchievement.createForAchievement(achievement, doc, originalDocObj)
|
||||
|
||||
delete before[doc.id] if doc.id of before
|
||||
|
||||
|
|
|
@ -120,134 +120,136 @@ describe 'Achievement', ->
|
|||
expect(body.type).toBeDefined()
|
||||
done()
|
||||
|
||||
describe 'Achieving Achievements', ->
|
||||
it 'wait for achievements to be loaded', (done) ->
|
||||
Achievement.loadAchievements (achievements) ->
|
||||
expect(Object.keys(achievements).length).toBe(2)
|
||||
# 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()
|
||||
|
||||
loadedAchievements = Achievement.getLoadedAchievements()
|
||||
expect(Object.keys(loadedAchievements).length).toBe(2)
|
||||
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 '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 '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()
|
||||
|
|
Loading…
Reference in a new issue