Finally managed a setup that makes the tests succeed

This commit is contained in:
Ruben Vereecken 2014-06-14 15:34:23 +02:00
parent 488d49e286
commit faf02d8e4b
3 changed files with 52 additions and 23 deletions

View file

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

View file

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

View file

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