mirror of
https://github.com/codeninjasllc/codecombat.git
synced 2024-11-23 23:58:02 -05:00
fec3ac38e9
Admins can generate a prepaid code, which a user can use to subscribe for free via the account/subscription page. The subscription will be identical to the normal monthly subscription (e.g. 3500 gems per month), except they won’t be charged. Does not require the recipient to enter billing information. Can be applied to an existing subscription, which will be converted to free. Prepaid code can only be used once. Prepaid subscription cannot be unsubscribed via the UI.
207 lines
6.2 KiB
CoffeeScript
207 lines
6.2 KiB
CoffeeScript
# import this at the top of every file so we're not juggling connections
|
|
# and common libraries are available
|
|
|
|
console.log 'IT BEGINS'
|
|
|
|
require 'jasmine-spec-reporter'
|
|
jasmine.getEnv().defaultTimeoutInterval = 300000
|
|
jasmine.getEnv().reporter.subReporters_ = []
|
|
jasmine.getEnv().addReporter(new jasmine.SpecReporter({
|
|
displaySuccessfulSpec: true,
|
|
displayFailedSpec: true
|
|
}))
|
|
|
|
rep = new jasmine.JsApiReporter()
|
|
jasmine.getEnv().addReporter(rep)
|
|
|
|
GLOBAL._ = require 'lodash'
|
|
_.str = require 'underscore.string'
|
|
_.mixin(_.str.exports())
|
|
GLOBAL.mongoose = require 'mongoose'
|
|
mongoose.connect('mongodb://localhost/coco_unittest')
|
|
path = require 'path'
|
|
GLOBAL.testing = true
|
|
GLOBAL.tv4 = require 'tv4' # required for TreemaUtils to work
|
|
|
|
models_path = [
|
|
'../../server/analytics/AnalyticsUsersActive'
|
|
'../../server/articles/Article'
|
|
'../../server/campaigns/Campaign'
|
|
'../../server/levels/Level'
|
|
'../../server/levels/components/LevelComponent'
|
|
'../../server/levels/systems/LevelSystem'
|
|
'../../server/levels/sessions/LevelSession'
|
|
'../../server/levels/thangs/LevelThangType'
|
|
'../../server/users/User'
|
|
'../../server/patches/Patch'
|
|
'../../server/achievements/Achievement'
|
|
'../../server/achievements/EarnedAchievement'
|
|
'../../server/payments/Payment'
|
|
'../../server/prepaids/Prepaid'
|
|
]
|
|
|
|
for m in models_path
|
|
model = path.basename(m)
|
|
#console.log('model=' + model)
|
|
GLOBAL[model] = require m
|
|
|
|
async = require 'async'
|
|
|
|
GLOBAL.clearModels = (models, done) ->
|
|
|
|
funcs = []
|
|
for model in models
|
|
if model is User
|
|
unittest.users = {}
|
|
wrapped = (m) -> (callback) ->
|
|
m.remove {}, (err) ->
|
|
callback(err, true)
|
|
funcs.push(wrapped(model))
|
|
|
|
async.parallel funcs, (err, results) ->
|
|
done(err)
|
|
|
|
GLOBAL.saveModels = (models, done) ->
|
|
|
|
funcs = []
|
|
for model in models
|
|
wrapped = (m) -> (callback) ->
|
|
m.save (err) ->
|
|
callback(err, true)
|
|
funcs.push(wrapped(model))
|
|
|
|
async.parallel funcs, (err, results) ->
|
|
done(err)
|
|
|
|
GLOBAL.simplePermissions = [target: 'public', access: 'owner']
|
|
GLOBAL.ObjectId = mongoose.Types.ObjectId
|
|
GLOBAL.request = require 'request'
|
|
|
|
GLOBAL.unittest = {}
|
|
unittest.users = unittest.users or {}
|
|
|
|
unittest.getNormalJoe = (done, force) ->
|
|
unittest.getUser('Joe', 'normal@jo.com', 'food', done, force)
|
|
unittest.getOtherSam = (done, force) ->
|
|
unittest.getUser('Sam', 'other@sam.com', 'beer', done, force)
|
|
unittest.getAdmin = (done, force) ->
|
|
unittest.getUser('Admin', 'admin@afc.com', '80yqxpb38j', done, force)
|
|
|
|
unittest.getUser = (name, email, password, done, force) ->
|
|
# Creates the user if it doesn't already exist.
|
|
|
|
return done(unittest.users[email]) if unittest.users[email] and not force
|
|
request = require 'request'
|
|
request.post getURL('/auth/logout'), ->
|
|
request.get getURL('/auth/whoami'), ->
|
|
req = request.post(getURL('/db/user'), (err, response, body) ->
|
|
throw err if err
|
|
User.findOne({email: email}).exec((err, user) ->
|
|
user.set('permissions', if password is '80yqxpb38j' then ['admin'] else [])
|
|
user.set('name', name)
|
|
user.save (err) ->
|
|
wrapUpGetUser(email, user, done)
|
|
)
|
|
)
|
|
form = req.form()
|
|
form.append('email', email)
|
|
form.append('password', password)
|
|
|
|
wrapUpGetUser = (email, user, done) ->
|
|
unittest.users[email] = user
|
|
return done(unittest.users[email])
|
|
|
|
GLOBAL.getURL = (path) ->
|
|
return 'http://localhost:3001' + path
|
|
|
|
GLOBAL.createPrepaid = (type, done) ->
|
|
options = uri: GLOBAL.getURL('/db/prepaid/-/create')
|
|
options.json = type: type if type?
|
|
request.post options, done
|
|
|
|
newUserCount = 0
|
|
GLOBAL.createNewUser = (done) ->
|
|
name = password = "user#{newUserCount++}"
|
|
email = "#{name}@foo.bar"
|
|
unittest.getUser name, email, password, done, true
|
|
GLOBAL.loginNewUser = (done) ->
|
|
name = password = "user#{newUserCount++}"
|
|
email = "#{name}@me.com"
|
|
request.post getURL('/auth/logout'), ->
|
|
unittest.getUser name, email, password, (user) ->
|
|
req = request.post(getURL('/auth/login'), (error, response) ->
|
|
expect(response.statusCode).toBe(200)
|
|
done(user)
|
|
)
|
|
form = req.form()
|
|
form.append('username', email)
|
|
form.append('password', password)
|
|
, true
|
|
|
|
GLOBAL.loginJoe = (done) ->
|
|
request.post getURL('/auth/logout'), ->
|
|
unittest.getNormalJoe (user) ->
|
|
req = request.post(getURL('/auth/login'), (error, response) ->
|
|
expect(response.statusCode).toBe(200)
|
|
done(user)
|
|
)
|
|
form = req.form()
|
|
form.append('username', 'normal@jo.com')
|
|
form.append('password', 'food')
|
|
|
|
GLOBAL.loginSam = (done) ->
|
|
request.post getURL('/auth/logout'), ->
|
|
unittest.getOtherSam (user) ->
|
|
req = request.post(getURL('/auth/login'), (error, response) ->
|
|
expect(response.statusCode).toBe(200)
|
|
done(user)
|
|
)
|
|
form = req.form()
|
|
form.append('username', 'other@sam.com')
|
|
form.append('password', 'beer')
|
|
|
|
GLOBAL.loginAdmin = (done) ->
|
|
request.post getURL('/auth/logout'), ->
|
|
unittest.getAdmin (user) ->
|
|
req = request.post(getURL('/auth/login'), (error, response) ->
|
|
expect(response.statusCode).toBe(200)
|
|
done(user)
|
|
)
|
|
form = req.form()
|
|
form.append('username', 'admin@afc.com')
|
|
form.append('password', '80yqxpb38j')
|
|
# find some other way to make the admin object an admin... maybe directly?
|
|
|
|
GLOBAL.loginUser = (user, done) ->
|
|
request.post getURL('/auth/logout'), ->
|
|
req = request.post(getURL('/auth/login'), (error, response) ->
|
|
expect(response.statusCode).toBe(200)
|
|
done(user)
|
|
)
|
|
form = req.form()
|
|
form.append('username', user.get('email'))
|
|
form.append('password', user.get('name'))
|
|
|
|
GLOBAL.dropGridFS = (done) ->
|
|
if mongoose.connection.readyState is 2
|
|
mongoose.connection.once 'open', ->
|
|
_drop(done)
|
|
else
|
|
_drop(done)
|
|
|
|
_drop = (done) ->
|
|
files = mongoose.connection.db.collection('media.files')
|
|
files.remove {}, ->
|
|
chunks = mongoose.connection.db.collection('media.chunks')
|
|
chunks.remove {}, ->
|
|
done()
|
|
|
|
tickInterval = null
|
|
tick = ->
|
|
# When you want jasmine-node to exit after running the tests,
|
|
# you have to close the connection first.
|
|
if rep.finished
|
|
mongoose.disconnect()
|
|
clearTimeout tickInterval
|
|
|
|
tickInterval = setInterval tick, 1000
|