mirror of
https://github.com/codeninjasllc/codecombat.git
synced 2025-03-14 07:00:01 -04:00
Finally managed a setup that makes the tests succeed
This commit is contained in:
parent
488d49e286
commit
faf02d8e4b
3 changed files with 52 additions and 23 deletions
|
@ -24,11 +24,30 @@ AchievementSchema.methods.objectifyQuery = ->
|
|||
AchievementSchema.methods.stringifyQuery = ->
|
||||
@set('query', JSON.stringify(@get('query'))) if typeof @get('query') != "string"
|
||||
|
||||
AchievementSchema.methods.getExpFunction: ->
|
||||
AchievementSchema.methods.getExpFunction = ->
|
||||
kind = @get('function')?.kind or jsonschema.function.default.kind
|
||||
parameters = @get('function')?.parameters or jsonschema.function.default.parameters
|
||||
return utils.functionCreators[kind](parameters) if kind of utils.functionCreators
|
||||
|
||||
AchievementSchema.statics.achievements = {}
|
||||
|
||||
AchievementSchema.statics.loadAchievements = (done) ->
|
||||
AchievementSchema.statics.resetAchievements()
|
||||
Achievement = require('../achievements/Achievement')
|
||||
query = Achievement.find({})
|
||||
query.exec (err, docs) ->
|
||||
_.each docs, (achievement) ->
|
||||
category = achievement.get 'collection'
|
||||
AchievementSchema.statics.achievements[category] = [] unless category of AchievementSchema.statics.achievements
|
||||
AchievementSchema.statics.achievements[category].push achievement
|
||||
done(AchievementSchema.statics.achievements) if done?
|
||||
|
||||
AchievementSchema.statics.getLoadedAchievements = ->
|
||||
AchievementSchema.statics.achievements
|
||||
|
||||
AchievementSchema.statics.resetAchievements = ->
|
||||
delete AchievementSchema.statics.achievements[category] for category of AchievementSchema.statics.achievements
|
||||
|
||||
AchievementSchema.post 'init', (doc) -> doc.objectifyQuery()
|
||||
|
||||
AchievementSchema.pre 'save', (next) ->
|
||||
|
@ -36,10 +55,11 @@ AchievementSchema.pre 'save', (next) ->
|
|||
next()
|
||||
|
||||
# Reload achievements upon save
|
||||
AchievementSchema.post 'save', -> AchievablePlugin.loadAchievements()
|
||||
AchievementSchema.post 'save', -> @constructor.loadAchievements()
|
||||
|
||||
AchievementSchema.plugin(plugins.NamedPlugin)
|
||||
AchievementSchema.plugin(plugins.SearchablePlugin, {searchable: ['name']})
|
||||
|
||||
module.exports = Achievement = mongoose.model('Achievement', AchievementSchema)
|
||||
|
||||
AchievementSchema.statics.loadAchievements()
|
||||
|
|
|
@ -4,26 +4,30 @@ LocalMongo = require '../../app/lib/LocalMongo'
|
|||
util = require '../../app/lib/utils'
|
||||
log = require 'winston'
|
||||
|
||||
achievements = {}
|
||||
|
||||
module.exports = AchievablePlugin = (schema, options) ->
|
||||
AchievablePlugin = (schema, options) ->
|
||||
User = require '../users/User' # Avoid mutual inclusion cycles
|
||||
Achievement = require('../achievements/Achievement')
|
||||
|
||||
before = {}
|
||||
|
||||
schema.post 'init', (doc) ->
|
||||
#log.debug 'initd'
|
||||
#log.debug doc.toObject()
|
||||
before[doc.id] = doc.toObject()
|
||||
|
||||
schema.post 'save', (doc) ->
|
||||
#log.debug 'waiting in init: ' + Object.keys(before).length
|
||||
isNew = not doc.isInit('_id')
|
||||
originalDocObj = before[doc.id] unless isNew
|
||||
|
||||
category = doc.constructor.modelName
|
||||
loadedAchievements = Achievement.getLoadedAchievements()
|
||||
log.debug 'about to save ' + category + ', number of achievements is ' + Object.keys(loadedAchievements).length
|
||||
|
||||
if category of achievements
|
||||
if category of loadedAchievements
|
||||
docObj = doc.toObject()
|
||||
for achievement in achievements[category]
|
||||
for achievement in loadedAchievements[category]
|
||||
query = achievement.get('query')
|
||||
isRepeatable = achievement.get('proportionalTo')?
|
||||
alreadyAchieved = if isNew then false else LocalMongo.matchesQuery originalDocObj, query
|
||||
|
@ -80,15 +84,4 @@ module.exports = AchievablePlugin = (schema, options) ->
|
|||
delete before[doc.id] unless isNew # This assumes everything we patch has a _id
|
||||
return
|
||||
|
||||
module.exports.loadAchievements = ->
|
||||
log.debug 'Reloading all achievements'
|
||||
achievements = {}
|
||||
Achievement = require('../achievements/Achievement')
|
||||
query = Achievement.find({})
|
||||
query.exec (err, docs) ->
|
||||
_.each docs, (achievement) ->
|
||||
category = achievement.get 'collection'
|
||||
achievements[category] = [] unless category of achievements
|
||||
achievements[category].push achievement
|
||||
|
||||
AchievablePlugin.loadAchievements()
|
||||
module.exports = AchievablePlugin
|
||||
|
|
|
@ -93,6 +93,15 @@ describe 'Achievement', ->
|
|||
|
||||
|
||||
describe 'Achieving Achievements', ->
|
||||
it 'wait for achievements to be loaded', (done) ->
|
||||
Achievement.loadAchievements (achievements) ->
|
||||
expect(Object.keys(achievements).length).toBe(2)
|
||||
|
||||
loadedAchievements = Achievement.getLoadedAchievements()
|
||||
expect(Object.keys(loadedAchievements).length).toBe(2)
|
||||
|
||||
done()
|
||||
|
||||
|
||||
it 'allows users to unlock one-time Achievements', (done) ->
|
||||
loginJoe (joe) ->
|
||||
|
@ -106,19 +115,26 @@ describe 'Achieving Achievements', ->
|
|||
expect(err).toBeNull()
|
||||
expect(doc).toBeDefined()
|
||||
expect(doc.creator).toBe(session.creator)
|
||||
done()
|
||||
|
||||
EarnedAchievement.find {}, (err, docs) ->
|
||||
expect(err).toBeNull()
|
||||
console.log docs
|
||||
expect(docs.length).toBe(1)
|
||||
done()
|
||||
it 'check if the earned achievement was already saved', (done) ->
|
||||
EarnedAchievement.find {}, (err, docs) ->
|
||||
expect(err).toBeNull()
|
||||
expect(docs.length).toBe(1)
|
||||
done()
|
||||
|
||||
it 'cleaning up test: deleting all Achievements and relates', (done) ->
|
||||
clearModels [Achievement, EarnedAchievement, LevelSession], (err) ->
|
||||
expect(err).toBeNull()
|
||||
|
||||
Achievement.resetAchievements()
|
||||
loadedAchievements = Achievement.getLoadedAchievements()
|
||||
expect(Object.keys(loadedAchievements).length).toBe(0)
|
||||
|
||||
done()
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
Loading…
Reference in a new issue