mirror of
https://github.com/codeninjasllc/codecombat.git
synced 2024-11-27 09:35:39 -05:00
Finished basic functional tests for achievement
This commit is contained in:
parent
aecf937722
commit
b66f4984c3
9 changed files with 118 additions and 14 deletions
|
@ -2,6 +2,7 @@ mongoose = require('mongoose')
|
||||||
jsonschema = require('../../app/schemas/models/achievement')
|
jsonschema = require('../../app/schemas/models/achievement')
|
||||||
log = require 'winston'
|
log = require 'winston'
|
||||||
util = require '../../app/lib/utils'
|
util = require '../../app/lib/utils'
|
||||||
|
plugins = require('../plugins/plugins')
|
||||||
|
|
||||||
# `pre` and `post` are not called for update operations executed directly on the database,
|
# `pre` and `post` are not called for update operations executed directly on the database,
|
||||||
# including `Model.update`,`.findByIdAndUpdate`,`.findOneAndUpdate`, `.findOneAndRemove`,and `.findByIdAndRemove`.order
|
# including `Model.update`,`.findByIdAndUpdate`,`.findOneAndUpdate`, `.findOneAndRemove`,and `.findByIdAndRemove`.order
|
||||||
|
@ -35,9 +36,7 @@ AchievementSchema.pre('save', (next) ->
|
||||||
next()
|
next()
|
||||||
)
|
)
|
||||||
|
|
||||||
module.exports = Achievement = mongoose.model('Achievement', AchievementSchema)
|
|
||||||
|
|
||||||
plugins = require('../plugins/plugins')
|
|
||||||
|
|
||||||
AchievementSchema.plugin(plugins.NamedPlugin)
|
AchievementSchema.plugin(plugins.NamedPlugin)
|
||||||
AchievementSchema.plugin(plugins.SearchablePlugin, {searchable: ['name']})
|
AchievementSchema.plugin(plugins.SearchablePlugin, {searchable: ['name']})
|
||||||
|
|
||||||
|
module.exports = Achievement = mongoose.model('Achievement', AchievementSchema)
|
||||||
|
|
|
@ -17,6 +17,7 @@ module.exports = class Handler
|
||||||
postEditableProperties: []
|
postEditableProperties: []
|
||||||
jsonSchema: {}
|
jsonSchema: {}
|
||||||
waterfallFunctions: []
|
waterfallFunctions: []
|
||||||
|
allowedMethods: ['GET', 'POST', 'PUT', 'PATCH']
|
||||||
|
|
||||||
# subclasses should override these methods
|
# subclasses should override these methods
|
||||||
hasAccess: (req) -> true
|
hasAccess: (req) -> true
|
||||||
|
@ -420,3 +421,7 @@ module.exports = class Handler
|
||||||
dict[document.id] = document
|
dict[document.id] = document
|
||||||
res.send dict
|
res.send dict
|
||||||
res.end()
|
res.end()
|
||||||
|
|
||||||
|
delete: (req, res) -> @sendMethodNotAllowed res, @allowedMethods, "DELETE not allowed."
|
||||||
|
|
||||||
|
head: (req, res) -> @sendMethodNotAllowed res, @allowedMethods, "HEAD not allowed."
|
||||||
|
|
|
@ -17,8 +17,9 @@ module.exports.notFound = (res, message='Not found.') ->
|
||||||
res.send 404, message
|
res.send 404, message
|
||||||
res.end()
|
res.end()
|
||||||
|
|
||||||
module.exports.badMethod = (res, message='Method Not Allowed') ->
|
module.exports.badMethod = (res, allowed=['GET', 'POST', 'PUT', 'PATCH'], message='Method Not Allowed') ->
|
||||||
# TODO: The response MUST include an Allow header containing a list of valid methods for the requested resource
|
allowHeader = _.reduce allowed, ((str, current) -> str += ', ' + current)
|
||||||
|
res.set 'Allow', allowHeader # TODO not sure if these are always the case
|
||||||
res.send 405, message
|
res.send 405, message
|
||||||
res.end()
|
res.end()
|
||||||
|
|
||||||
|
@ -40,4 +41,4 @@ module.exports.gatewayTimeoutError = (res, message="Gateway timeout") ->
|
||||||
|
|
||||||
module.exports.clientTimeout = (res, message="The server did not recieve the client response in a timely manner") ->
|
module.exports.clientTimeout = (res, message="The server did not recieve the client response in a timely manner") ->
|
||||||
res.send 408, message
|
res.send 408, message
|
||||||
res.end()
|
res.end()
|
||||||
|
|
|
@ -8,7 +8,7 @@ module.exports.setup = (app) ->
|
||||||
app.all '/file*', (req, res) ->
|
app.all '/file*', (req, res) ->
|
||||||
return fileGet(req, res) if req.route.method is 'get'
|
return fileGet(req, res) if req.route.method is 'get'
|
||||||
return filePost(req, res) if req.route.method is 'post'
|
return filePost(req, res) if req.route.method is 'post'
|
||||||
return errors.badMethod(res)
|
return errors.badMethod(res, ['GET', 'POST'])
|
||||||
|
|
||||||
|
|
||||||
fileGet = (req, res) ->
|
fileGet = (req, res) ->
|
||||||
|
|
|
@ -30,6 +30,8 @@ models_path = [
|
||||||
'../../server/levels/thangs/LevelThangType'
|
'../../server/levels/thangs/LevelThangType'
|
||||||
'../../server/users/User'
|
'../../server/users/User'
|
||||||
'../../server/patches/Patch'
|
'../../server/patches/Patch'
|
||||||
|
'../../server/achievements/Achievement'
|
||||||
|
'../../server/achievements/EarnedAchievement'
|
||||||
]
|
]
|
||||||
|
|
||||||
for m in models_path
|
for m in models_path
|
||||||
|
@ -162,4 +164,4 @@ tick = ->
|
||||||
mongoose.disconnect()
|
mongoose.disconnect()
|
||||||
clearTimeout tickInterval
|
clearTimeout tickInterval
|
||||||
|
|
||||||
tickInterval = setInterval tick, 1000
|
tickInterval = setInterval tick, 1000
|
||||||
|
|
86
test/server/functional/achievement.spec.coffee
Normal file
86
test/server/functional/achievement.spec.coffee
Normal file
|
@ -0,0 +1,86 @@
|
||||||
|
require '../common'
|
||||||
|
|
||||||
|
describe 'Achievement', ->
|
||||||
|
|
||||||
|
unlockable =
|
||||||
|
name: 'One Time Only'
|
||||||
|
description: 'So you did the really cool thing.'
|
||||||
|
worth: 6.66
|
||||||
|
collection: 'level.session'
|
||||||
|
|
||||||
|
repeatable =
|
||||||
|
name: 'Lots of em'
|
||||||
|
description: 'Oops you did it again.'
|
||||||
|
worth: 1
|
||||||
|
collection: 'User'
|
||||||
|
proportionalTo: '_id'
|
||||||
|
|
||||||
|
url = getURL('/db/achievement')
|
||||||
|
allowHeader = 'GET, POST, PUT, PATCH'
|
||||||
|
|
||||||
|
it 'preparing test: deleting all Achievements first', (done) ->
|
||||||
|
clearModels [Achievement], (err) ->
|
||||||
|
expect(err).toBeNull()
|
||||||
|
done()
|
||||||
|
|
||||||
|
it 'can\'t be created by ordinary users', (done) ->
|
||||||
|
loginJoe ->
|
||||||
|
request.post {uri: url, json: unlockable}, (err, res, body) ->
|
||||||
|
expect(res.statusCode).toBe(403)
|
||||||
|
done()
|
||||||
|
|
||||||
|
it 'can\'t be updated by ordinary users', (done) ->
|
||||||
|
loginJoe ->
|
||||||
|
request.put {uri: url, json:unlockable}, (err, res, body) ->
|
||||||
|
expect(res.statusCode).toBe(403)
|
||||||
|
|
||||||
|
request {method: 'patch', uri: url, json: unlockable}, (err, res, body) ->
|
||||||
|
expect(res.statusCode).toBe(403)
|
||||||
|
done()
|
||||||
|
|
||||||
|
it 'can be created by admins', (done) ->
|
||||||
|
loginAdmin ->
|
||||||
|
request.post {uri: url, json: unlockable}, (err, res, body) ->
|
||||||
|
expect(res.statusCode).toBe(200)
|
||||||
|
unlockable._id = body._id
|
||||||
|
done()
|
||||||
|
|
||||||
|
it 'can get all for ordinary users', (done) ->
|
||||||
|
loginJoe ->
|
||||||
|
request.get {uri: url, json: unlockable}, (err, res, body) ->
|
||||||
|
expect(res.statusCode).toBe(200)
|
||||||
|
expect(body.length).toBe(1)
|
||||||
|
done()
|
||||||
|
|
||||||
|
it 'can be read by ordinary users', (done) ->
|
||||||
|
loginJoe ->
|
||||||
|
request.get {uri: url + '/' + unlockable._id, json: unlockable}, (err, res, body) ->
|
||||||
|
expect(res.statusCode).toBe(200)
|
||||||
|
expect(body.name).toBe(unlockable.name)
|
||||||
|
done()
|
||||||
|
|
||||||
|
it 'can\'t be requested with HTTP HEAD method', (done) ->
|
||||||
|
loginJoe ->
|
||||||
|
request.head {uri: url + '/' + unlockable._id}, (err, res, body) ->
|
||||||
|
expect(res.statusCode).toBe(405)
|
||||||
|
expect(res.headers.allow).toBe(allowHeader)
|
||||||
|
done()
|
||||||
|
|
||||||
|
it 'can\'t be requested with HTTP DEL method', (done) ->
|
||||||
|
loginJoe ->
|
||||||
|
request.del {uri: url + '/' + unlockable._id}, (err, res, body) ->
|
||||||
|
expect(res.statusCode).toBe(405)
|
||||||
|
expect(res.headers.allow).toBe(allowHeader)
|
||||||
|
done()
|
||||||
|
|
||||||
|
it 'get schema', (done) ->
|
||||||
|
request.get {uri:url + '/schema'}, (err, res, body) ->
|
||||||
|
expect(res.statusCode).toBe(200)
|
||||||
|
body = JSON.parse(body)
|
||||||
|
expect(body.type).toBeDefined()
|
||||||
|
done()
|
||||||
|
|
||||||
|
it 'cleaning up test: deleting all Achievements', (done) ->
|
||||||
|
clearModels [Achievement], (err) ->
|
||||||
|
expect(err).toBeNull()
|
||||||
|
done()
|
|
@ -28,6 +28,8 @@ xdescribe '/file', ->
|
||||||
my_buffer_url: 'http://fc07.deviantart.net/fs37/f/2008/283/5/1/Chu_Chu_Pikachu_by_angelishi.gif'
|
my_buffer_url: 'http://fc07.deviantart.net/fs37/f/2008/283/5/1/Chu_Chu_Pikachu_by_angelishi.gif'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
allowHeader = 'GET, POST'
|
||||||
|
|
||||||
it 'preparing test : deletes all the files first', (done) ->
|
it 'preparing test : deletes all the files first', (done) ->
|
||||||
dropGridFS ->
|
dropGridFS ->
|
||||||
done()
|
done()
|
||||||
|
@ -147,19 +149,28 @@ xdescribe '/file', ->
|
||||||
|
|
||||||
request.post(options, func)
|
request.post(options, func)
|
||||||
|
|
||||||
|
it ' can\'t be requested with HTTP PATCH method', (done) ->
|
||||||
|
request {method: 'patch', uri:url}, (err, res) ->
|
||||||
|
expect(res.statusCode).toBe(405)
|
||||||
|
expect(res.headers.allow).toBe(allowHeader)
|
||||||
|
done()
|
||||||
|
|
||||||
it ' can\'t be requested with HTTP PUT method', (done) ->
|
it ' can\'t be requested with HTTP PUT method', (done) ->
|
||||||
request.put {uri:url}, (err, res) ->
|
request.put {uri:url}, (err, res) ->
|
||||||
expect(res.statusCode).toBe(405)
|
expect(res.statusCode).toBe(405)
|
||||||
|
expect(res.headers.allow).toBe(allowHeader)
|
||||||
done()
|
done()
|
||||||
|
|
||||||
it ' can\'t be requested with HTTP HEAD method', (done) ->
|
it ' can\'t be requested with HTTP HEAD method', (done) ->
|
||||||
request.head {uri:url}, (err, res) ->
|
request.head {uri:url}, (err, res) ->
|
||||||
expect(res.statusCode).toBe(405)
|
expect(res.statusCode).toBe(405)
|
||||||
|
expect(res.headers.allow).toBe(allowHeader)
|
||||||
done()
|
done()
|
||||||
|
|
||||||
it ' can\'t be requested with HTTP DEL method', (done) ->
|
it ' can\'t be requested with HTTP DEL method', (done) ->
|
||||||
request.del {uri:url}, (err, res) ->
|
request.del {uri:url}, (err, res) ->
|
||||||
expect(res.statusCode).toBe(405)
|
expect(res.statusCode).toBe(405)
|
||||||
|
expect(res.headers.allow).toBe(allowHeader)
|
||||||
done()
|
done()
|
||||||
|
|
||||||
# TODO: test server errors, see what they do
|
# TODO: test server errors, see what they do
|
||||||
|
|
|
@ -130,17 +130,17 @@ describe 'LevelComponent', ->
|
||||||
|
|
||||||
xit ' can\'t be requested with HTTP PUT method', (done) ->
|
xit ' can\'t be requested with HTTP PUT method', (done) ->
|
||||||
request.put {uri:url+'/'+components[0]._id}, (err, res) ->
|
request.put {uri:url+'/'+components[0]._id}, (err, res) ->
|
||||||
expect(res.statusCode).toBe(404)
|
expect(res.statusCode).toBe(405)
|
||||||
done()
|
done()
|
||||||
|
|
||||||
it ' can\'t be requested with HTTP HEAD method', (done) ->
|
it ' can\'t be requested with HTTP HEAD method', (done) ->
|
||||||
request.head {uri:url+'/'+components[0]._id}, (err, res) ->
|
request.head {uri:url+'/'+components[0]._id}, (err, res) ->
|
||||||
expect(res.statusCode).toBe(404)
|
expect(res.statusCode).toBe(405)
|
||||||
done()
|
done()
|
||||||
|
|
||||||
it ' can\'t be requested with HTTP DEL method', (done) ->
|
it ' can\'t be requested with HTTP DEL method', (done) ->
|
||||||
request.del {uri:url+'/'+components[0]._id}, (err, res) ->
|
request.del {uri:url+'/'+components[0]._id}, (err, res) ->
|
||||||
expect(res.statusCode).toBe(404)
|
expect(res.statusCode).toBe(405)
|
||||||
done()
|
done()
|
||||||
|
|
||||||
it 'get schema', (done) ->
|
it 'get schema', (done) ->
|
||||||
|
|
|
@ -123,12 +123,12 @@ describe 'LevelSystem', ->
|
||||||
|
|
||||||
it ' can\'t be requested with HTTP HEAD method', (done) ->
|
it ' can\'t be requested with HTTP HEAD method', (done) ->
|
||||||
request.head {uri:url+'/'+systems[0]._id}, (err, res) ->
|
request.head {uri:url+'/'+systems[0]._id}, (err, res) ->
|
||||||
expect(res.statusCode).toBe(404)
|
expect(res.statusCode).toBe(405)
|
||||||
done()
|
done()
|
||||||
|
|
||||||
it ' can\'t be requested with HTTP DEL method', (done) ->
|
it ' can\'t be requested with HTTP DEL method', (done) ->
|
||||||
request.del {uri:url+'/'+systems[0]._id}, (err, res) ->
|
request.del {uri:url+'/'+systems[0]._id}, (err, res) ->
|
||||||
expect(res.statusCode).toBe(404)
|
expect(res.statusCode).toBe(405)
|
||||||
done()
|
done()
|
||||||
|
|
||||||
it 'get schema', (done) ->
|
it 'get schema', (done) ->
|
||||||
|
|
Loading…
Reference in a new issue