Rename existing api tests to api-legacy
This commit is contained in:
@@ -1,32 +0,0 @@
|
||||
# API Tests
|
||||
|
||||
Our API tests are written in [coffeescript](http://coffeescript.org/) using the [Mocha testing framework](http://mochajs.org/).
|
||||
|
||||
There's a variety of ways to run the tests:
|
||||
|
||||
```bash
|
||||
# Individually
|
||||
mocha test/api/name_of_test.coffee
|
||||
# The entire collection of api tests
|
||||
mocha test/api
|
||||
# As part of the whole test suite
|
||||
npm test
|
||||
```
|
||||
|
||||
### Modules
|
||||
|
||||
Some modules are declared in the [api-helper.coffee](api-helper.coffee) file for use in any of the api tests:
|
||||
|
||||
* `moment` - time manipulation
|
||||
* `async` - run async processes, good for before blocks
|
||||
* `lodash (_)` - many utilities
|
||||
* `shared` - generate uuids
|
||||
* `expect` - making assertions
|
||||
* `User` - look up a User in the db
|
||||
|
||||
### Helper Methods
|
||||
|
||||
There are helper methods declared in the [api-helper.coffee](api-helper.coffee) file. Some useful methods contained there:
|
||||
|
||||
* `registerNewUser(callback, main)` - Theres a global user variable that gets overwritten with the new user whenever you call `registerNewUser` unless you pass false in as the second argument.
|
||||
* `registerManyUsers(number, callback)` - Good for testing things that require many users. The callback function returns new users as and array in the second argument.
|
||||
@@ -1,62 +0,0 @@
|
||||
'use strict'
|
||||
|
||||
app = require("../../website/src/server")
|
||||
|
||||
describe "GET /api/v2/user/anonymized", ->
|
||||
|
||||
anon = null
|
||||
|
||||
before (done) ->
|
||||
# TODO: Seed user with messages, rewards, dailys, checklists, webhooks, etc
|
||||
registerNewUser ->
|
||||
request.get(baseURL + "/user/anonymized")
|
||||
.end (res) ->
|
||||
anon = res.body
|
||||
done()
|
||||
, true
|
||||
|
||||
it 'retains user id', (done) ->
|
||||
expect(anon._id).to.equal user._id
|
||||
done()
|
||||
|
||||
it 'removes credentials and financial information', (done) ->
|
||||
expect(anon.apiToken).to.not.exist
|
||||
expect(anon.auth.local).to.not.exist
|
||||
expect(anon.auth.facebook).to.not.exist
|
||||
expect(anon.purchased.plan).to.not.exist
|
||||
done()
|
||||
|
||||
it 'removes profile information', (done) ->
|
||||
expect(anon.profile).to.not.exist
|
||||
expect(anon.contributor).to.not.exist
|
||||
expect(anon.achievements.challenges).to.not.exist
|
||||
done()
|
||||
|
||||
it 'removes social information', (done) ->
|
||||
expect(anon.newMessages).to.not.exist
|
||||
expect(anon.invitations).to.not.exist
|
||||
expect(anon.items.special.nyeReceived).to.not.exist
|
||||
expect(anon.items.special.valentineReceived).to.not.exist
|
||||
_(anon.inbox.messages).each (msg) ->
|
||||
expect(msg).to.equal 'inbox message text'
|
||||
done()
|
||||
|
||||
it 'removes webhooks', (done) ->
|
||||
expect(anon.webhooks).to.not.exist
|
||||
done()
|
||||
|
||||
it 'anonymizes task info', (done) ->
|
||||
_(['habits', 'todos', 'dailys', 'rewards']).each (tasks) ->
|
||||
_(anon[tasks]).each (task) ->
|
||||
expect(task.text).to.equal 'task text'
|
||||
expect(task.notes).to.equal 'task notes'
|
||||
checklist_count = 0
|
||||
_(task.checklist).each (box) ->
|
||||
box.text = 'item' + checklist_count++
|
||||
done()
|
||||
|
||||
it 'anonymizes tags', (done) ->
|
||||
_(anon.tags).each (tag) ->
|
||||
expect(tag.name).to.equal 'tag'
|
||||
expect(tag.challenge).to.equal 'challenge'
|
||||
done()
|
||||
@@ -1,76 +0,0 @@
|
||||
##############################
|
||||
# Global modules
|
||||
##############################
|
||||
superagentDefaults = require("superagent-defaults")
|
||||
global.request = superagentDefaults()
|
||||
|
||||
global.mongoose = require("mongoose")
|
||||
global.moment = require("moment")
|
||||
global.async = require("async")
|
||||
global._ = require("lodash")
|
||||
global.shared = require("../../common")
|
||||
global.User = require("../../website/src/models/user").model
|
||||
|
||||
global.chai = require("chai")
|
||||
chai.use(require("sinon-chai"))
|
||||
global.expect = chai.expect
|
||||
|
||||
##############################
|
||||
# Nconf config
|
||||
##############################
|
||||
path = require("path")
|
||||
global.conf = require("nconf")
|
||||
conf.argv().env().file(file: path.join(__dirname, "../config.json")).defaults()
|
||||
conf.set "PORT", "1337"
|
||||
|
||||
##############################
|
||||
# Node ENV and global variables
|
||||
##############################
|
||||
process.env.NODE_DB_URI = "mongodb://localhost/habitrpg_test"
|
||||
global.baseURL = "http://localhost:" + conf.get("PORT") + "/api/v2"
|
||||
global.user = undefined
|
||||
|
||||
##############################
|
||||
# Helper Methods
|
||||
##############################
|
||||
global.expectCode = (res, code) ->
|
||||
expect(res.body.err).to.not.exist if code is 200
|
||||
expect(res.statusCode).to.equal code
|
||||
|
||||
global.registerNewUser = (cb, main) ->
|
||||
main = true unless main?
|
||||
randomID = shared.uuid()
|
||||
username = password = randomID if main
|
||||
request
|
||||
.post(baseURL + "/register")
|
||||
.set("Accept", "application/json")
|
||||
.set("X-API-User", null)
|
||||
.set("X-API-Key", null)
|
||||
.send
|
||||
username: randomID
|
||||
password: randomID
|
||||
confirmPassword: randomID
|
||||
email: randomID + "@gmail.com"
|
||||
.end (res) ->
|
||||
return cb(null, res.body) unless main
|
||||
_id = res.body._id
|
||||
apiToken = res.body.apiToken
|
||||
User.findOne
|
||||
_id: _id
|
||||
apiToken: apiToken
|
||||
, (err, _user) ->
|
||||
expect(err).to.not.be.ok
|
||||
global.user = _user
|
||||
request
|
||||
.set("Accept", "application/json")
|
||||
.set("X-API-User", _id)
|
||||
.set("X-API-Key", apiToken)
|
||||
cb null, res.body
|
||||
|
||||
global.registerManyUsers = (number, callback) ->
|
||||
async.times number, (n, next) ->
|
||||
registerNewUser (err, user) ->
|
||||
next(err, user)
|
||||
, false
|
||||
, (err, users) ->
|
||||
callback(err, users)
|
||||
@@ -1,343 +0,0 @@
|
||||
'use strict'
|
||||
|
||||
app = require("../../website/src/server")
|
||||
Group = require("../../website/src/models/group").model
|
||||
Challenge = require("../../website/src/models/challenge").model
|
||||
|
||||
describe "Challenges", ->
|
||||
|
||||
challenge = undefined
|
||||
updateTodo = undefined
|
||||
group = undefined
|
||||
|
||||
beforeEach (done) ->
|
||||
async.waterfall [
|
||||
(cb) ->
|
||||
registerNewUser(cb, true)
|
||||
, (user, cb) ->
|
||||
request.post(baseURL + "/groups").send(
|
||||
name: "TestGroup"
|
||||
type: "party"
|
||||
).end (res) ->
|
||||
expectCode res, 200
|
||||
group = res.body
|
||||
expect(group.members.length).to.equal 1
|
||||
expect(group.leader).to.equal user._id
|
||||
cb()
|
||||
, (cb) ->
|
||||
request.post(baseURL + "/challenges").send(
|
||||
group: group._id
|
||||
dailys: [
|
||||
type: "daily"
|
||||
text: "Challenge Daily"
|
||||
]
|
||||
todos: [{
|
||||
type: "todo"
|
||||
text: "Challenge Todo 1"
|
||||
notes: "Challenge Notes"
|
||||
}]
|
||||
rewards: []
|
||||
habits: []
|
||||
).end (res) ->
|
||||
challenge = res.body
|
||||
done()
|
||||
]
|
||||
|
||||
describe 'POST /challenge', ->
|
||||
|
||||
it "Creates a challenge", (done) ->
|
||||
request.post(baseURL + "/challenges").send(
|
||||
group: group._id
|
||||
dailys: [
|
||||
type: "daily"
|
||||
text: "Challenge Daily"
|
||||
]
|
||||
todos: [{
|
||||
type: "todo"
|
||||
text: "Challenge Todo 1"
|
||||
notes: "Challenge Notes"
|
||||
}, {
|
||||
type: "todo"
|
||||
text: "Challenge Todo 2"
|
||||
notes: "Challenge Notes"
|
||||
}]
|
||||
rewards: []
|
||||
habits: []
|
||||
official: true
|
||||
).end (res) ->
|
||||
expectCode res, 200
|
||||
async.parallel [
|
||||
(cb) ->
|
||||
User.findById user._id, cb
|
||||
(cb) ->
|
||||
Challenge.findById res.body._id, cb
|
||||
], (err, results) ->
|
||||
user = results[0]
|
||||
challenge = results[1]
|
||||
expect(user.dailys[user.dailys.length - 1].text).to.equal "Challenge Daily"
|
||||
expect(challenge.official).to.equal false
|
||||
done()
|
||||
|
||||
describe 'POST /challenge/:cid', ->
|
||||
it "updates the notes on user's version of a challenge task's note without updating the challenge", (done) ->
|
||||
updateTodo = challenge.todos[0]
|
||||
updateTodo.notes = "User overriden notes"
|
||||
async.waterfall [
|
||||
(cb) ->
|
||||
request.put(baseURL + "/user/tasks/" + updateTodo.id).send(updateTodo).end (res) ->
|
||||
cb()
|
||||
, (cb) ->
|
||||
Challenge.findById challenge._id, cb
|
||||
, (chal, cb) ->
|
||||
expect(chal.todos[0].notes).to.eql("Challenge Notes")
|
||||
cb()
|
||||
, (cb) ->
|
||||
request.get(baseURL + "/user/tasks/" + updateTodo.id)
|
||||
.end (res) ->
|
||||
expect(res.body.notes).to.eql("User overriden notes")
|
||||
done()
|
||||
]
|
||||
|
||||
it "changes user's copy of challenge tasks when the challenge is updated", (done) ->
|
||||
challenge.dailys[0].text = "Updated Daily"
|
||||
request.post(baseURL + "/challenges/" + challenge._id)
|
||||
.send(challenge)
|
||||
.end (res) ->
|
||||
challenge = res.body
|
||||
expect(challenge.dailys[0].text).to.equal "Updated Daily"
|
||||
User.findById user._id, (err, _user) ->
|
||||
expectCode res, 200
|
||||
expect(_user.dailys[_user.dailys.length - 1].text).to.equal "Updated Daily"
|
||||
done()
|
||||
|
||||
it "does not changes user's notes on tasks when challenge task notes are updated", (done) ->
|
||||
challenge.todos[0].notes = "Challenge Updated Todo Notes"
|
||||
request.post(baseURL + "/challenges/" + challenge._id)
|
||||
.send(challenge)
|
||||
.end (res) ->
|
||||
challenge = res.body
|
||||
expect(challenge.todos[0].notes).to.equal "Challenge Updated Todo Notes"
|
||||
User.findById user._id, (err, _user) ->
|
||||
expectCode res, 200
|
||||
expect(_user.todos[_user.todos.length - 1].notes).to.equal "Challenge Notes"
|
||||
done()
|
||||
|
||||
|
||||
it "shows user notes on challenge page", (done) ->
|
||||
updateTodo = challenge.todos[0]
|
||||
updateTodo.notes = "User overriden notes"
|
||||
async.waterfall [
|
||||
(cb) ->
|
||||
request.put(baseURL + "/user/tasks/" + updateTodo.id).send(updateTodo).end (res) ->
|
||||
cb()
|
||||
, (cb) ->
|
||||
Challenge.findById challenge._id, cb
|
||||
, (chal, cb) ->
|
||||
expect(chal.todos[0].notes).to.eql("Challenge Notes")
|
||||
cb()
|
||||
, (cb) ->
|
||||
request.get(baseURL + "/challenges/" + challenge._id + "/member/" + user._id).end (res) ->
|
||||
expect(res.body.todos[res.body.todos.length - 1].notes).to.equal "User overriden notes"
|
||||
done()
|
||||
]
|
||||
|
||||
it "Complete To-Dos", (done) ->
|
||||
User.findById user._id, (err, _user) ->
|
||||
u = _user
|
||||
numTasks = (_.size(u.todos))
|
||||
request.post(baseURL + "/user/tasks/" + u.todos[0].id + "/up").end (res) ->
|
||||
request.post(baseURL + "/user/tasks/clear-completed").end (res) ->
|
||||
expect(_.size(res.body)).to.equal numTasks - 1
|
||||
done()
|
||||
|
||||
it "Challenge deleted, breaks task link", (done) ->
|
||||
itThis = this
|
||||
request.del(baseURL + "/challenges/" + challenge._id).end (res) ->
|
||||
User.findById user._id, (err, user) ->
|
||||
len = user.dailys.length - 1
|
||||
daily = user.dailys[user.dailys.length - 1]
|
||||
expect(daily.challenge.broken).to.equal "CHALLENGE_DELETED"
|
||||
|
||||
# Now let's handle if challenge was deleted, but didn't get to update all the users (an error)
|
||||
unset = $unset: {}
|
||||
unset["$unset"]["dailys." + len + ".challenge.broken"] = 1
|
||||
User.findByIdAndUpdate user._id, unset, (err, user) ->
|
||||
expect(err).to.not.exist
|
||||
expect(user.dailys[len].challenge.broken).to.not.exist
|
||||
request.post(baseURL + "/user/tasks/" + daily.id + "/up").end (res) ->
|
||||
setTimeout (->
|
||||
User.findById user._id, (err, user) ->
|
||||
expect(user.dailys[len].challenge.broken).to.equal "CHALLENGE_DELETED"
|
||||
done()
|
||||
), 100 # we need to wait for challenge to update user, it's a background job for perf reasons
|
||||
|
||||
it "admin creates a challenge", (done) ->
|
||||
User.findByIdAndUpdate user._id,
|
||||
$set:
|
||||
"contributor.admin": true
|
||||
, (err, _user) ->
|
||||
expect(err).to.not.exist
|
||||
async.parallel [
|
||||
(cb) ->
|
||||
request.post(baseURL + "/challenges").send(
|
||||
group: group._id
|
||||
dailys: []
|
||||
todos: []
|
||||
rewards: []
|
||||
habits: []
|
||||
official: false
|
||||
).end (res) ->
|
||||
expect(res.body.official).to.equal false
|
||||
cb()
|
||||
(cb) ->
|
||||
request.post(baseURL + "/challenges").send(
|
||||
group: group._id
|
||||
dailys: []
|
||||
todos: []
|
||||
rewards: []
|
||||
habits: []
|
||||
official: true
|
||||
).end (res) ->
|
||||
expect(res.body.official).to.equal true
|
||||
cb()
|
||||
], done
|
||||
|
||||
it "User creates a non-tavern challenge with prize, deletes it, gets refund", (done) ->
|
||||
User.findByIdAndUpdate user._id,
|
||||
$set:
|
||||
"balance": 8
|
||||
, (err, user) ->
|
||||
expect(err).to.not.be.ok
|
||||
request.post(baseURL + "/challenges").send(
|
||||
group: group._id
|
||||
dailys: []
|
||||
todos: []
|
||||
rewards: []
|
||||
habits: []
|
||||
prize: 10
|
||||
).end (res) ->
|
||||
expect(res.body.prize).to.equal 10
|
||||
async.parallel [
|
||||
(cb) ->
|
||||
User.findById user._id, cb
|
||||
(cb) ->
|
||||
Challenge.findById res.body._id, cb
|
||||
], (err, results) ->
|
||||
user = results[0]
|
||||
challenge = results[1]
|
||||
expect(user.balance).to.equal 5.5
|
||||
request.del(baseURL + "/challenges/" + challenge._id).end (res) ->
|
||||
User.findById user._id, (err, _user) ->
|
||||
expect(_user.balance).to.equal 8
|
||||
done()
|
||||
|
||||
it "User creates a tavern challenge with prize, deletes it, and does not get refund", (done) ->
|
||||
User.findByIdAndUpdate user._id,
|
||||
$set:
|
||||
"balance": 8
|
||||
, (err, user) ->
|
||||
expect(err).to.not.be.ok
|
||||
request.post(baseURL + "/challenges").send(
|
||||
group: 'habitrpg'
|
||||
dailys: []
|
||||
todos: []
|
||||
rewards: []
|
||||
habits: []
|
||||
prize: 10
|
||||
).end (res) ->
|
||||
expect(res.body.prize).to.equal 10
|
||||
async.parallel [
|
||||
(cb) ->
|
||||
User.findById user._id, cb
|
||||
(cb) ->
|
||||
Challenge.findById res.body._id, cb
|
||||
], (err, results) ->
|
||||
user = results[0]
|
||||
challenge = results[1]
|
||||
expect(user.balance).to.equal 5.5
|
||||
request.del(baseURL + "/challenges/" + challenge._id).end (res) ->
|
||||
User.findById user._id, (err, _user) ->
|
||||
expect(_user.balance).to.equal 5.5
|
||||
done()
|
||||
|
||||
describe "non-owner permissions", () ->
|
||||
challenge = undefined
|
||||
|
||||
beforeEach (done) ->
|
||||
async.waterfall [
|
||||
(cb) ->
|
||||
request.post(baseURL + "/challenges").send(
|
||||
group: group._id
|
||||
name: 'challenge name'
|
||||
dailys: [
|
||||
type: "daily"
|
||||
text: "Challenge Daily"
|
||||
]
|
||||
).end (res) ->
|
||||
challenge = res.body
|
||||
cb()
|
||||
|
||||
(cb) ->
|
||||
registerNewUser(done, true)
|
||||
]
|
||||
|
||||
context "non-owner", () ->
|
||||
|
||||
it 'can not edit challenge', (done) ->
|
||||
challenge.name = 'foobar'
|
||||
request.post(baseURL + "/challenges/" + challenge._id)
|
||||
.send(challenge)
|
||||
.end (res) ->
|
||||
error = res.body.err
|
||||
|
||||
expect(error).to.eql("You don't have permissions to edit this challenge")
|
||||
done()
|
||||
|
||||
it 'can not close challenge', (done) ->
|
||||
request.post(baseURL + "/challenges/" + challenge._id + "/close?uid=" + user._id)
|
||||
.end (res) ->
|
||||
error = res.body.err
|
||||
|
||||
expect(error).to.eql("You don't have permissions to close this challenge")
|
||||
done()
|
||||
|
||||
it 'can not delete challenge', (done) ->
|
||||
request.del(baseURL + "/challenges/" + challenge._id)
|
||||
.end (res) ->
|
||||
error = res.body.err
|
||||
|
||||
expect(error).to.eql("You don't have permissions to delete this challenge")
|
||||
done()
|
||||
|
||||
context "non-owner that is an admin", () ->
|
||||
|
||||
beforeEach (done) ->
|
||||
User.findByIdAndUpdate(user._id, { 'contributor.admin': true }, done)
|
||||
|
||||
it 'can edit challenge', (done) ->
|
||||
challenge.name = 'foobar'
|
||||
request.post(baseURL + "/challenges/" + challenge._id)
|
||||
.send(challenge)
|
||||
.end (res) ->
|
||||
expect(res.body.err).to.not.exist
|
||||
Challenge.findById challenge._id, (err, chal) ->
|
||||
expect(chal.name).to.eql('foobar')
|
||||
done()
|
||||
|
||||
it 'can close challenge', (done) ->
|
||||
request.post(baseURL + "/challenges/" + challenge._id + "/close?uid=" + user._id)
|
||||
.end (res) ->
|
||||
expect(res.body.err).to.not.exist
|
||||
User.findById user._id, (err, usr) ->
|
||||
expect(usr.achievements.challenges[0]).to.eql(challenge.name)
|
||||
done()
|
||||
|
||||
it 'can delete challenge', (done) ->
|
||||
request.del(baseURL + "/challenges/" + challenge._id)
|
||||
.end (res) ->
|
||||
expect(res.body.err).to.not.exist
|
||||
request.get(baseURL + "/challenges/" + challenge._id)
|
||||
.end (res) ->
|
||||
error = res.body.err
|
||||
expect(error).to.eql("Challenge #{challenge._id} not found")
|
||||
done()
|
||||
@@ -1,145 +0,0 @@
|
||||
'use strict'
|
||||
|
||||
diff = require("deep-diff")
|
||||
|
||||
Group = require("../../website/src/models/group").model
|
||||
app = require("../../website/src/server")
|
||||
|
||||
describe "Chat", ->
|
||||
group = undefined
|
||||
before (done) ->
|
||||
async.waterfall [
|
||||
(cb) ->
|
||||
registerNewUser(cb, true)
|
||||
|
||||
(user, cb) ->
|
||||
request.post(baseURL + "/groups").send(
|
||||
name: "TestGroup"
|
||||
type: "party"
|
||||
).end (res) ->
|
||||
expectCode res, 200
|
||||
group = res.body
|
||||
expect(group.members.length).to.equal 1
|
||||
expect(group.leader).to.equal user._id
|
||||
cb()
|
||||
|
||||
], done
|
||||
|
||||
chat = undefined
|
||||
it "posts a message to party chat", (done) ->
|
||||
msg = "TestMsg"
|
||||
request.post(baseURL + "/groups/" + group._id + "/chat?message=" + msg).end (res) ->
|
||||
expectCode res, 200
|
||||
chat = res.body.message
|
||||
expect(chat.id).to.be.ok
|
||||
expect(chat.text).to.equal msg
|
||||
expect(chat.timestamp).to.be.exist
|
||||
expect(chat.likes).to.be.empty
|
||||
expect(chat.flags).to.be.empty
|
||||
expect(chat.flagCount).to.equal 0
|
||||
expect(chat.uuid).to.be.exist
|
||||
expect(chat.contributor).to.be.empty
|
||||
expect(chat.backer).to.be.empty
|
||||
expect(chat.uuid).to.equal user._id
|
||||
expect(chat.user).to.equal user.profile.name
|
||||
done()
|
||||
|
||||
it "does not post an empty message", (done) ->
|
||||
msg = ""
|
||||
request.post(baseURL + "/groups/" + group._id + "/chat?message=" + msg).send(
|
||||
).end (res) ->
|
||||
expectCode res, 400
|
||||
expect(res.body.err).to.equal 'You cannot send a blank message'
|
||||
done()
|
||||
|
||||
it "can not like own chat message", (done) ->
|
||||
request.post(baseURL + "/groups/" + group._id + "/chat/" + chat.id + "/like").send(
|
||||
).end (res) ->
|
||||
expectCode res, 401
|
||||
body = res.body
|
||||
expect(body.err).to.equal "Can't like your own message. Don't be that person."
|
||||
done()
|
||||
|
||||
it "can not flag own message", (done) ->
|
||||
request.post(baseURL + "/groups/" + group._id + "/chat/" + chat.id + "/flag").send(
|
||||
).end (res) ->
|
||||
expectCode res, 401
|
||||
body = res.body
|
||||
expect(body.err).to.equal "Can't report your own message."
|
||||
done()
|
||||
|
||||
it "gets chat messages from party chat", (done) ->
|
||||
request.get(baseURL + "/groups/" + group._id + "/chat").send(
|
||||
).end (res) ->
|
||||
expectCode res, 200
|
||||
message = res.body[0]
|
||||
expect(message.id).to.equal chat.id
|
||||
expect(message.timestamp).to.equal chat.timestamp
|
||||
expect(message.likes).to.deep.equal chat.likes
|
||||
expect(message.flags).to.deep.equal chat.flags
|
||||
expect(message.flagCount).to.equal chat.flagCount
|
||||
expect(message.uuid).to.equal chat.uuid
|
||||
expect(message.contributor).to.deep.equal chat.contributor
|
||||
expect(message.backer).to.deep.equal chat.backer
|
||||
expect(message.user).to.equal chat.user
|
||||
done()
|
||||
|
||||
it "deletes a chat messages from party chat", (done) ->
|
||||
request.del(baseURL + "/groups/" + group._id + "/chat/" + chat.id).send(
|
||||
).end (res) ->
|
||||
expectCode res, 204
|
||||
expect(res.body).to.be.empty
|
||||
done()
|
||||
|
||||
it "can not delete already deleted message", (done) ->
|
||||
request.del(baseURL + "/groups/" + group._id + "/chat/" + chat.id).send(
|
||||
).end (res) ->
|
||||
expectCode res, 404
|
||||
body = res.body
|
||||
expect(body.err).to.equal "Message not found!"
|
||||
done()
|
||||
|
||||
it "removes a user's chat notifications when user is kicked", (done) ->
|
||||
userToRemove = null
|
||||
async.waterfall [
|
||||
(cb) ->
|
||||
registerManyUsers 1, cb
|
||||
|
||||
(members, cb) ->
|
||||
userToRemove = members[0]
|
||||
request.post(baseURL + "/groups/" + group._id + "/invite").send(
|
||||
uuids: [userToRemove._id]
|
||||
)
|
||||
.end -> cb()
|
||||
|
||||
(cb) ->
|
||||
request.post(baseURL + "/groups/" + group._id + "/join")
|
||||
.set("X-API-User", userToRemove._id)
|
||||
.set("X-API-Key", userToRemove.apiToken)
|
||||
.end (res) -> cb()
|
||||
|
||||
(cb) ->
|
||||
msg = "TestMsg"
|
||||
request.post(baseURL + "/groups/" + group._id + "/chat?message=" + msg)
|
||||
.end (res) -> cb()
|
||||
|
||||
(cb) ->
|
||||
request.get(baseURL + "/user")
|
||||
.set("X-API-User", userToRemove._id)
|
||||
.set("X-API-Key", userToRemove.apiToken)
|
||||
.end (res) ->
|
||||
expect(res.body.newMessages[group._id]).to.exist
|
||||
cb()
|
||||
|
||||
(cb) ->
|
||||
request.post(baseURL + "/groups/" + group._id + "/removeMember?uuid=" + userToRemove._id)
|
||||
.end (res) -> cb()
|
||||
|
||||
(cb) ->
|
||||
request.get(baseURL + "/user")
|
||||
.set("X-API-User", userToRemove._id)
|
||||
.set("X-API-Key", userToRemove.apiToken)
|
||||
.end (res) ->
|
||||
expect(res.body.newMessages[group._id]).to.not.exist
|
||||
cb()
|
||||
], done
|
||||
@@ -1,191 +0,0 @@
|
||||
'use strict'
|
||||
|
||||
app = require("../../website/src/server")
|
||||
Coupon = require("../../website/src/models/coupon").model
|
||||
|
||||
makeSudoUser = (usr, cb) ->
|
||||
registerNewUser ->
|
||||
sudoUpdate = { "$set" : { "contributor.sudo" : true } }
|
||||
User.findByIdAndUpdate user._id, sudoUpdate, (err, _user) ->
|
||||
usr = _user
|
||||
cb()
|
||||
, true
|
||||
|
||||
describe "Coupons", ->
|
||||
before (done) ->
|
||||
async.parallel [
|
||||
(cb) ->
|
||||
mongoose.connection.collections['coupons'].drop (err) ->
|
||||
cb()
|
||||
(cb) ->
|
||||
mongoose.connection.collections['users'].drop (err) ->
|
||||
cb()
|
||||
], done
|
||||
|
||||
coupons = null
|
||||
|
||||
describe "POST /api/v2/coupons/generate/:event", ->
|
||||
|
||||
context "while sudo user", ->
|
||||
before (done) ->
|
||||
makeSudoUser(user, done)
|
||||
|
||||
it "generates coupons", (done) ->
|
||||
queries = '?count=10'
|
||||
request
|
||||
.post(baseURL + '/coupons/generate/wondercon' + queries)
|
||||
.end (res) ->
|
||||
expectCode res, 200
|
||||
Coupon.find { event: 'wondercon' }, (err, _coupons) ->
|
||||
coupons = _coupons
|
||||
expect(coupons.length).to.equal 10
|
||||
_(coupons).each (c)->
|
||||
expect(c.event).to.equal 'wondercon'
|
||||
done()
|
||||
|
||||
context "while regular user", ->
|
||||
|
||||
before (done) ->
|
||||
registerNewUser(done, true)
|
||||
|
||||
it "does not generate coupons", (done) ->
|
||||
queries = '?count=10'
|
||||
request
|
||||
.post(baseURL + '/coupons/generate/wondercon' + queries)
|
||||
.end (res) ->
|
||||
expectCode res, 401
|
||||
expect(res.body.err).to.equal 'You don\'t have admin access'
|
||||
done()
|
||||
|
||||
describe "GET /api/v2/coupons", ->
|
||||
|
||||
context "while sudo user", ->
|
||||
|
||||
before (done) ->
|
||||
makeSudoUser(user, done)
|
||||
|
||||
it "gets coupons", (done) ->
|
||||
queries = '?_id=' + user._id + '&apiToken=' + user.apiToken
|
||||
request
|
||||
.get(baseURL + '/coupons' + queries)
|
||||
.end (res) ->
|
||||
expectCode res, 200
|
||||
codes = res.text
|
||||
expect(codes).to.contain('code')
|
||||
# Expect each coupon code _id to exist in response
|
||||
_(coupons).each (c) -> expect(codes).to.contain(c._id)
|
||||
|
||||
done()
|
||||
|
||||
it "gets first 5 coupons out of 10 when a limit of 5 is set", (done) ->
|
||||
queries = '?_id=' + user._id + '&apiToken=' + user.apiToken + '&limit=5'
|
||||
request
|
||||
.get(baseURL + '/coupons' + queries)
|
||||
.end (res) ->
|
||||
expectCode res, 200
|
||||
codes = res.text
|
||||
sortedCoupons = _.sortBy(coupons, 'seq')
|
||||
firstHalf = sortedCoupons[0..4]
|
||||
secondHalf = sortedCoupons[5..9]
|
||||
|
||||
# First five coupons should be present in codes
|
||||
_(firstHalf).each (c) -> expect(codes).to.contain(c._id)
|
||||
# Second five coupons should not be present in codes
|
||||
_(secondHalf).each (c) -> expect(codes).to.not.contain(c._id)
|
||||
done()
|
||||
|
||||
it "gets last 5 coupons out of 10 when a limit of 5 is set", (done) ->
|
||||
queries = '?_id=' + user._id + '&apiToken=' + user.apiToken + '&skip=5'
|
||||
request
|
||||
.get(baseURL + '/coupons' + queries)
|
||||
.end (res) ->
|
||||
expectCode res, 200
|
||||
codes = res.text
|
||||
sortedCoupons = _.sortBy(coupons, 'seq')
|
||||
firstHalf = sortedCoupons[0..4]
|
||||
secondHalf = sortedCoupons[5..9]
|
||||
|
||||
# First five coupons should not be present in codes
|
||||
_(firstHalf).each (c) -> expect(codes).to.not.contain(c._id)
|
||||
# Second five coupons should be present in codes
|
||||
_(secondHalf).each (c) -> expect(codes).to.contain(c._id)
|
||||
done()
|
||||
|
||||
context "while regular user", ->
|
||||
|
||||
before (done) ->
|
||||
registerNewUser(done, true)
|
||||
|
||||
it "does not get coupons", (done) ->
|
||||
|
||||
queries = '?_id=' + user._id + '&apiToken=' + user.apiToken
|
||||
request
|
||||
.get(baseURL + '/coupons' + queries)
|
||||
.end (res) ->
|
||||
expectCode res, 401
|
||||
expect(res.body.err).to.equal 'You don\'t have admin access'
|
||||
done()
|
||||
|
||||
describe "POST /api/v2/user/coupon/:code", ->
|
||||
specialGear = (gear, has) ->
|
||||
items = ['body_special_wondercon_gold'
|
||||
'body_special_wondercon_black'
|
||||
'body_special_wondercon_red'
|
||||
'back_special_wondercon_red'
|
||||
'back_special_wondercon_black'
|
||||
'back_special_wondercon_red'
|
||||
'eyewear_special_wondercon_black'
|
||||
'eyewear_special_wondercon_red']
|
||||
|
||||
_(items).each (i) ->
|
||||
if(has)
|
||||
expect(gear[i]).to.exist
|
||||
else
|
||||
expect(gear[i]).to.not.exist
|
||||
|
||||
beforeEach (done) ->
|
||||
registerNewUser ->
|
||||
gear = user.items.gear.owned
|
||||
specialGear(gear, false)
|
||||
done()
|
||||
, true
|
||||
|
||||
context "unused coupon", ->
|
||||
it "applies coupon and awards equipment", (done) ->
|
||||
|
||||
code = coupons[0]._id
|
||||
request
|
||||
.post(baseURL + '/user/coupon/' + code)
|
||||
.end (res) ->
|
||||
expectCode res, 200
|
||||
gear = res.body.items.gear.owned
|
||||
specialGear(gear, true)
|
||||
done()
|
||||
|
||||
context "already used coupon", ->
|
||||
it "does not apply coupon and does not award equipment", (done) ->
|
||||
|
||||
code = coupons[0]._id
|
||||
request
|
||||
.post(baseURL + '/user/coupon/' + code)
|
||||
.end (res) ->
|
||||
expectCode res, 400
|
||||
expect(res.body.err).to.equal "Coupon already used"
|
||||
User.findById user._id, (err, _user) ->
|
||||
gear = _user.items.gear.owned
|
||||
specialGear(gear, false)
|
||||
done()
|
||||
|
||||
context "invalid coupon", ->
|
||||
it "does not apply coupon and does not award equipment", (done) ->
|
||||
|
||||
code = "not-a-real-coupon"
|
||||
request
|
||||
.post(baseURL + '/user/coupon/' + code)
|
||||
.end (res) ->
|
||||
expectCode res, 400
|
||||
expect(res.body.err).to.equal "Invalid coupon code"
|
||||
User.findById user._id, (err, _user) ->
|
||||
gear = _user.items.gear.owned
|
||||
specialGear(gear, false)
|
||||
done()
|
||||
@@ -1,25 +0,0 @@
|
||||
'use strict'
|
||||
|
||||
require('../../website/src/server')
|
||||
|
||||
describe 'User', ->
|
||||
|
||||
before (done) ->
|
||||
registerNewUser done, true
|
||||
|
||||
describe 'GET /user', ->
|
||||
it 'removes password from user object', (done) ->
|
||||
request.get(baseURL + '/user')
|
||||
.end (err, res) ->
|
||||
expectCode res, 200
|
||||
localAuth = res.body.auth.local
|
||||
expect(localAuth.hashed_password).to.not.exist
|
||||
expect(localAuth.salt).to.not.exist
|
||||
done()
|
||||
|
||||
it 'removes apiToken from user object', (done) ->
|
||||
request.get(baseURL + '/user')
|
||||
.end (err, res) ->
|
||||
expectCode res, 200
|
||||
expect(res.body.apiToken).to.not.exist
|
||||
done()
|
||||
@@ -1,500 +0,0 @@
|
||||
'use strict'
|
||||
|
||||
diff = require("deep-diff")
|
||||
|
||||
Group = require("../../website/src/models/group").model
|
||||
app = require("../../website/src/server")
|
||||
|
||||
describe "Guilds", ->
|
||||
context "creating groups", ->
|
||||
before (done) ->
|
||||
registerNewUser ->
|
||||
User.findByIdAndUpdate user._id,
|
||||
$set:
|
||||
"balance": 40
|
||||
, (err, _user) ->
|
||||
done()
|
||||
, true
|
||||
|
||||
it "can create a public guild", (done) ->
|
||||
request.post(baseURL + "/groups").send(
|
||||
name: "TestGroup"
|
||||
type: "guild",
|
||||
privacy: "public"
|
||||
).end (res) ->
|
||||
expectCode res, 200
|
||||
guild = res.body
|
||||
expect(guild.members.length).to.equal 1
|
||||
expect(guild.leader).to.equal user._id
|
||||
done()
|
||||
|
||||
it "can create a private guild", (done) ->
|
||||
request.post(baseURL + "/groups").send(
|
||||
name: "TestGroup"
|
||||
type: "guild",
|
||||
privacy: "private"
|
||||
).end (res) ->
|
||||
expectCode res, 200
|
||||
guild = res.body
|
||||
expect(guild.members.length).to.equal 1
|
||||
expect(guild.leader).to.equal user._id
|
||||
done()
|
||||
|
||||
it "prevents user from creating a guild when the user has 0 gems", (done) ->
|
||||
registerNewUser (err, user_with_0_gems) ->
|
||||
request.post(baseURL + "/groups").send(
|
||||
name: "TestGroup"
|
||||
type: "guild",
|
||||
)
|
||||
.set("X-API-User", user_with_0_gems._id)
|
||||
.set("X-API-Key", user_with_0_gems.apiToken)
|
||||
.end (res) ->
|
||||
expectCode res, 401
|
||||
done()
|
||||
, false
|
||||
|
||||
context "get guilds", ->
|
||||
guild = undefined
|
||||
|
||||
beforeEach (done)->
|
||||
request.post(baseURL + "/groups").send(
|
||||
name: "TestGroup2"
|
||||
type: "guild"
|
||||
).end (res) ->
|
||||
guild = res.body
|
||||
done()
|
||||
|
||||
it "can find a guild", (done) ->
|
||||
request.get(baseURL + "/groups/" + guild._id)
|
||||
.end (res) ->
|
||||
expectCode res, 200
|
||||
expect(res.body._id).to.equal res.body._id
|
||||
done()
|
||||
|
||||
it "transforms members array to an arrray of user objects", (done) ->
|
||||
request.get(baseURL + "/groups/" + guild._id)
|
||||
.end (res) ->
|
||||
expectCode res, 200
|
||||
members = res.body.members
|
||||
# @TODO: would be more instructive if it had more members in guild :(
|
||||
_(members).each (member) ->
|
||||
expect(member).to.be.an 'object'
|
||||
expect(member.profile.name).to.exist
|
||||
done()
|
||||
|
||||
it "transforms leader id to a user object", (done) ->
|
||||
request.get(baseURL + "/groups/" + guild._id)
|
||||
.end (res) ->
|
||||
expectCode res, 200
|
||||
leader = res.body.leader
|
||||
expect(leader).to.be.an 'object'
|
||||
expect(leader.profile.name).to.exist
|
||||
done()
|
||||
|
||||
it "can list guilds", (done) ->
|
||||
request.get(baseURL + "/groups").send()
|
||||
.end (res) ->
|
||||
expectCode res, 200
|
||||
guild = res.body[0]
|
||||
expect(guild).to.exist
|
||||
done()
|
||||
|
||||
context "updating groups", ->
|
||||
groupToUpdate = undefined
|
||||
before (done) ->
|
||||
request.post(baseURL + "/groups").send(
|
||||
name: "TestGroup"
|
||||
type: "guild"
|
||||
description: "notUpdatedDesc"
|
||||
).end (res) ->
|
||||
groupToUpdate = res.body
|
||||
done()
|
||||
|
||||
it "prevents user from updating a party when they aren't the leader", (done) ->
|
||||
registerNewUser (err, tmpUser) ->
|
||||
request.post(baseURL + "/groups/" + groupToUpdate._id).send(
|
||||
name: "TestGroupName"
|
||||
description: "updatedDesc"
|
||||
)
|
||||
.set("X-API-User", tmpUser._id)
|
||||
.set("X-API-Key", tmpUser.apiToken)
|
||||
.end (res) ->
|
||||
expectCode res, 401
|
||||
expect(res.body.err).to.equal "Only the group leader can update the group!"
|
||||
done()
|
||||
, false
|
||||
|
||||
it "allows user to update a group", (done) ->
|
||||
request.post(baseURL + "/groups/" + groupToUpdate._id).send(
|
||||
description: "updatedDesc"
|
||||
)
|
||||
.end (res) ->
|
||||
expectCode res, 204
|
||||
request.get(baseURL + "/groups/" + groupToUpdate._id).send()
|
||||
.end (res) ->
|
||||
updatedGroup = res.body
|
||||
expect(updatedGroup.description).to.equal "updatedDesc"
|
||||
done()
|
||||
|
||||
context "leaving groups", ->
|
||||
it "can leave a guild", (done) ->
|
||||
guildToLeave = undefined
|
||||
request.post(baseURL + "/groups").send(
|
||||
name: "TestGroupToLeave"
|
||||
type: "guild"
|
||||
).end (res) ->
|
||||
guildToLeave = res.body
|
||||
request.post(baseURL + "/groups/" + guildToLeave._id + "/leave")
|
||||
.send()
|
||||
.end (res) ->
|
||||
expectCode res, 204
|
||||
done()
|
||||
|
||||
it "deletes a group when the last member leaves", (done) ->
|
||||
groupToDeleteAfterLeave = undefined
|
||||
request.post(baseURL + "/groups").send(
|
||||
name: "TestGroupToDeleteAfteLeave"
|
||||
type: "guild"
|
||||
privacy: "private"
|
||||
).end (res) ->
|
||||
groupToDeleteAfterLeave = res.body
|
||||
async.waterfall [
|
||||
(cb) ->
|
||||
request.post(baseURL + "/groups/" + groupToDeleteAfterLeave._id + "/leave")
|
||||
.end (res) ->
|
||||
expectCode res, 204
|
||||
cb()
|
||||
|
||||
(cb) ->
|
||||
request.post(baseURL + "/groups/" + groupToDeleteAfterLeave._id)
|
||||
.end (res) ->
|
||||
expectCode res, 404
|
||||
cb()
|
||||
], done
|
||||
|
||||
it "deletes all invites to a group (guild) when the last member leaves", (done) ->
|
||||
groupToDeleteAfterLeave = undefined
|
||||
userToRemoveInvite = undefined
|
||||
request.post(baseURL + "/groups").send(
|
||||
name: "TestGroupToDeleteAfterLeave"
|
||||
type: "guild"
|
||||
privacy: "private"
|
||||
).end (res) ->
|
||||
groupToDeleteAfterLeave = res.body
|
||||
async.waterfall [
|
||||
(cb) ->
|
||||
registerManyUsers 1, cb
|
||||
|
||||
(_members, cb) ->
|
||||
userToRemoveInvite = _members[0]
|
||||
inviteURL = baseURL + "/groups/" + groupToDeleteAfterLeave._id + "/invite"
|
||||
request.post(inviteURL).send(
|
||||
uuids: [userToRemoveInvite._id]
|
||||
)
|
||||
.end ->
|
||||
cb()
|
||||
|
||||
(cb) ->
|
||||
request.post(baseURL + "/groups/" + groupToDeleteAfterLeave._id + "/leave")
|
||||
.end (res) ->
|
||||
expectCode res, 204
|
||||
cb()
|
||||
|
||||
(cb) ->
|
||||
request.get(baseURL + '/user')
|
||||
.set("X-API-User", userToRemoveInvite._id)
|
||||
.set("X-API-Key", userToRemoveInvite.apiToken)
|
||||
.end (err, res) ->
|
||||
expectCode res, 200
|
||||
groupInvitation = _.find(res.body.invitations.guilds, {id: groupToDeleteAfterLeave._id})
|
||||
expect(groupInvitation).to.not.exist
|
||||
cb()
|
||||
|
||||
(cb) ->
|
||||
request.post(baseURL + "/groups/" + groupToDeleteAfterLeave._id)
|
||||
.end (res) ->
|
||||
expectCode res, 404
|
||||
cb()
|
||||
], done
|
||||
|
||||
it "deletes all invites to a group (party) when the last member leaves", (done) ->
|
||||
partyToDeleteAfterLeave = undefined
|
||||
userToRemovePartyInvite = undefined
|
||||
request.post(baseURL + "/groups").send(
|
||||
name: "TestPartyToDeleteAfterLeave"
|
||||
type: "party"
|
||||
).end (res) ->
|
||||
partyToDeleteAfterLeave = res.body
|
||||
async.waterfall [
|
||||
(cb) ->
|
||||
registerManyUsers 1, cb
|
||||
|
||||
(_members, cb) ->
|
||||
userToRemovePartyInvite = _members[0]
|
||||
inviteURL = baseURL + "/groups/" + partyToDeleteAfterLeave._id + "/invite"
|
||||
request.post(inviteURL).send(
|
||||
uuids: [userToRemovePartyInvite._id]
|
||||
)
|
||||
.end ->
|
||||
cb()
|
||||
|
||||
(cb) ->
|
||||
request.post(baseURL + "/groups/" + partyToDeleteAfterLeave._id + "/leave")
|
||||
.end (res) ->
|
||||
expectCode res, 204
|
||||
cb()
|
||||
|
||||
(cb) ->
|
||||
request.get(baseURL + '/user')
|
||||
.set("X-API-User", userToRemovePartyInvite._id)
|
||||
.set("X-API-Key", userToRemovePartyInvite.apiToken)
|
||||
.end (err, res) ->
|
||||
expectCode res, 200
|
||||
party = partyToDeleteAfterLeave
|
||||
partyInvitation = _.find(res.body.invitations.party, (invite) ->
|
||||
return invite == party._id
|
||||
)
|
||||
expect(partyInvitation).to.not.exist
|
||||
cb()
|
||||
|
||||
(cb) ->
|
||||
request.post(baseURL + "/groups/" + partyToDeleteAfterLeave._id)
|
||||
.end (res) ->
|
||||
expectCode res, 404
|
||||
cb()
|
||||
], done
|
||||
|
||||
context "removing users groups", ->
|
||||
it "allows guild leaders to remove a member (but not themselves)", (done) ->
|
||||
guildToRemoveMember = undefined
|
||||
members = undefined
|
||||
userToRemove = undefined
|
||||
request.post(baseURL + "/groups").send(
|
||||
name: "TestGuildToRemoveMember"
|
||||
type: "guild"
|
||||
).end (res) ->
|
||||
guildToRemoveMember = res.body
|
||||
#Add members to guild
|
||||
async.waterfall [
|
||||
(cb) ->
|
||||
registerManyUsers 1, cb
|
||||
|
||||
(_members, cb) ->
|
||||
userToRemove = _members[0]
|
||||
members = _members
|
||||
inviteURL = baseURL + "/groups/" + guildToRemoveMember._id + "/invite"
|
||||
request.post(inviteURL).send(
|
||||
uuids: [userToRemove._id]
|
||||
)
|
||||
.end ->
|
||||
cb()
|
||||
|
||||
(cb) ->
|
||||
request.post(baseURL + "/groups/" + guildToRemoveMember._id + "/join")
|
||||
.set("X-API-User", userToRemove._id)
|
||||
.set("X-API-Key", userToRemove.apiToken)
|
||||
.end (res) ->
|
||||
cb()
|
||||
(cb) ->
|
||||
request.post(baseURL + "/groups/" + guildToRemoveMember._id + "/removeMember?uuid=" + guildToRemoveMember.leader)
|
||||
.send().end (res) ->
|
||||
expectCode res, 401
|
||||
cb()
|
||||
|
||||
(cb) ->
|
||||
request.post(baseURL + "/groups/" + guildToRemoveMember._id + "/removeMember?uuid=" + userToRemove._id)
|
||||
.send().end (res) ->
|
||||
expectCode res, 204
|
||||
cb()
|
||||
|
||||
(cb) ->
|
||||
request.get(baseURL + "/groups/" + guildToRemoveMember._id)
|
||||
.send()
|
||||
.end (res) ->
|
||||
g = res.body
|
||||
userInGroup = _.find g.members, (member) -> return member._id == userToRemove._id
|
||||
expect(userInGroup).to.not.exist
|
||||
cb()
|
||||
|
||||
], done
|
||||
|
||||
describe "Private Guilds", ->
|
||||
guild = undefined
|
||||
before (done) ->
|
||||
request.post(baseURL + "/groups").send(
|
||||
name: "TestPrivateGroup"
|
||||
type: "guild"
|
||||
privacy: "private"
|
||||
).end (res) ->
|
||||
expectCode res, 200
|
||||
guild = res.body
|
||||
expect(guild.members.length).to.equal 1
|
||||
expect(guild.leader).to.equal user._id
|
||||
#Add members to guild
|
||||
async.waterfall [
|
||||
(cb) ->
|
||||
registerManyUsers 15, cb
|
||||
|
||||
(_members, cb) ->
|
||||
members = _members
|
||||
|
||||
joinGuild = (member, callback) ->
|
||||
request.post(baseURL + "/groups/" + guild._id + "/join")
|
||||
.set("X-API-User", member._id)
|
||||
.set("X-API-Key", member.apiToken)
|
||||
.end ->
|
||||
callback(null, null)
|
||||
|
||||
async.map members, joinGuild, (err, results) -> cb()
|
||||
|
||||
], done
|
||||
|
||||
it "includes user in private group member list when user is a member", (done) ->
|
||||
|
||||
request.get(baseURL + "/groups/" + guild._id)
|
||||
.end (res) ->
|
||||
g = res.body
|
||||
userInGroup = _.find g.members, (member) -> return member._id == user._id
|
||||
expect(userInGroup).to.exist
|
||||
done()
|
||||
|
||||
it "excludes user from viewing private group member list when user is not a member", (done) ->
|
||||
|
||||
request.post(baseURL + "/groups/" + guild._id + "/leave")
|
||||
.end (res) ->
|
||||
request.get(baseURL + "/groups/" + guild._id)
|
||||
.end (res) ->
|
||||
expect res, 404
|
||||
done()
|
||||
|
||||
describe "Public Guilds", ->
|
||||
before (done) ->
|
||||
async.waterfall [
|
||||
(cb) ->
|
||||
registerNewUser ->
|
||||
User.findByIdAndUpdate user._id, {$set: { "balance": 10 } }, (err, _user) ->
|
||||
cb()
|
||||
, true
|
||||
], done
|
||||
|
||||
context "joining groups", ->
|
||||
it "makes user a group leader when group is empty", (done) ->
|
||||
guildToEmptyAndAssignLeader = undefined
|
||||
members = undefined
|
||||
userToBecomeLeader = undefined
|
||||
request.post(baseURL + "/groups").send(
|
||||
name: "TestGuildToEmptyAndAssignLeader"
|
||||
type: "guild",
|
||||
privacy: "public"
|
||||
).end (res) ->
|
||||
guildToEmptyAndAssignLeader = res.body
|
||||
#Add members to guild
|
||||
async.waterfall [
|
||||
(cb) ->
|
||||
registerManyUsers 1, cb
|
||||
|
||||
(_members, cb) ->
|
||||
userToBecomeLeader = _members[0]
|
||||
members = _members
|
||||
inviteURL = baseURL + "/groups/" + guildToEmptyAndAssignLeader._id + "/invite"
|
||||
request.post(inviteURL).send(
|
||||
uuids: [userToBecomeLeader._id]
|
||||
)
|
||||
.end ->
|
||||
cb()
|
||||
|
||||
(cb) ->
|
||||
request.post(baseURL + "/groups/" + guildToEmptyAndAssignLeader._id + "/leave")
|
||||
.send()
|
||||
.end (res) ->
|
||||
expectCode res, 204
|
||||
cb()
|
||||
|
||||
(cb) ->
|
||||
request.post(baseURL + "/groups/" + guildToEmptyAndAssignLeader._id + "/join")
|
||||
.set("X-API-User", userToBecomeLeader._id)
|
||||
.set("X-API-Key", userToBecomeLeader.apiToken)
|
||||
.end (res) ->
|
||||
expectCode res, 200
|
||||
cb()
|
||||
|
||||
(cb) ->
|
||||
request.get(baseURL + "/groups/" + guildToEmptyAndAssignLeader._id)
|
||||
.set("X-API-User", userToBecomeLeader._id)
|
||||
.set("X-API-Key", userToBecomeLeader.apiToken)
|
||||
.send()
|
||||
.end (res) ->
|
||||
expectCode res, 200
|
||||
g = res.body
|
||||
expect(g.leader._id).to.equal(userToBecomeLeader._id)
|
||||
cb()
|
||||
|
||||
], done
|
||||
|
||||
context "viewing", ->
|
||||
guild = undefined
|
||||
before (done) ->
|
||||
async.waterfall [
|
||||
(cb) ->
|
||||
registerNewUser ->
|
||||
User.findByIdAndUpdate user._id, {$set: { "balance": 10 } }, (err, _user) ->
|
||||
cb()
|
||||
, true
|
||||
(cb) ->
|
||||
request.post(baseURL + "/groups").send(
|
||||
name: "TestPublicGroup"
|
||||
type: "guild"
|
||||
privacy: "public"
|
||||
).end (res) ->
|
||||
guild = res.body
|
||||
expect(guild.members.length).to.equal 1
|
||||
expect(guild.leader).to.equal user._id
|
||||
#Add members to guild
|
||||
cb()
|
||||
|
||||
(cb) ->
|
||||
registerManyUsers 15, cb
|
||||
|
||||
(_members, cb) ->
|
||||
members = _members
|
||||
|
||||
joinGuild = (member, callback) ->
|
||||
request.post(baseURL + "/groups/" + guild._id + "/join")
|
||||
.set("X-API-User", member._id)
|
||||
.set("X-API-Key", member.apiToken)
|
||||
.end ->
|
||||
callback(null, null)
|
||||
|
||||
async.map members, joinGuild, (err, results) -> cb()
|
||||
|
||||
], done
|
||||
|
||||
context "is a member", ->
|
||||
before (done) ->
|
||||
registerNewUser ->
|
||||
request.post(baseURL + "/groups/" + guild._id + "/join")
|
||||
.end (res)->
|
||||
done()
|
||||
, true
|
||||
|
||||
it "includes user in public group member list", (done) ->
|
||||
request.get(baseURL + "/groups/" + guild._id)
|
||||
.end (res) ->
|
||||
g = res.body
|
||||
expect(g.members.length).to.equal 15
|
||||
userInGroup = _.find g.members, (member) -> return member._id == user._id
|
||||
expect(userInGroup).to.exist
|
||||
done()
|
||||
|
||||
context "is not a member", ->
|
||||
before (done) ->
|
||||
registerNewUser done, true
|
||||
|
||||
it "excludes user in public group member list", (done) ->
|
||||
request.get(baseURL + "/groups/" + guild._id)
|
||||
.end (res) ->
|
||||
g = res.body
|
||||
expect(g.members.length).to.equal 15
|
||||
userInGroup = _.find g.members, (member) -> return member._id == user._id
|
||||
expect(userInGroup).to.not.exist
|
||||
done()
|
||||
@@ -1,281 +0,0 @@
|
||||
'use strict'
|
||||
|
||||
app = require('../../website/src/server')
|
||||
rewire = require('rewire')
|
||||
sinon = require('sinon')
|
||||
inApp = rewire('../../website/src/controllers/payments/iap')
|
||||
iapMock = { }
|
||||
inApp.__set__('iap', iapMock)
|
||||
|
||||
describe 'In-App Purchases', ->
|
||||
describe 'Android', ->
|
||||
req = {
|
||||
body: {
|
||||
transaction: {
|
||||
reciept: 'foo'
|
||||
signature: 'sig'
|
||||
}
|
||||
}
|
||||
}
|
||||
res = {
|
||||
locals: { user: { _id: 'user' } }
|
||||
json: sinon.spy()
|
||||
}
|
||||
next = -> true
|
||||
paymentSpy = sinon.spy()
|
||||
|
||||
before ->
|
||||
inApp.__set__('payments.buyGems', paymentSpy)
|
||||
|
||||
afterEach ->
|
||||
paymentSpy.reset()
|
||||
res.json.reset()
|
||||
|
||||
context 'successful app purchase', ->
|
||||
before ->
|
||||
iapMock.setup = (cb)-> return cb(null)
|
||||
iapMock.validate = (iapGoogle, iapBodyReciept, cb)-> return cb(null, true)
|
||||
iapMock.isValidated = (googleRes)-> return googleRes
|
||||
iapMock.GOOGLE = 'google'
|
||||
|
||||
it 'calls res.json with succesful result object', ->
|
||||
expectedResObj = {
|
||||
ok: true
|
||||
data: true
|
||||
}
|
||||
|
||||
inApp.androidVerify(req, res, next)
|
||||
|
||||
expect(res.json).to.be.calledOnce
|
||||
expect(res.json).to.be.calledWith(expectedResObj)
|
||||
|
||||
it 'calls payments.buyGems function', ->
|
||||
inApp.androidVerify(req, res, next)
|
||||
|
||||
expect(paymentSpy).to.be.calledOnce
|
||||
expect(paymentSpy).to.be.calledWith({user: res.locals.user, paymentMethod:'IAP GooglePlay'})
|
||||
|
||||
context 'error in setup', ->
|
||||
before ->
|
||||
iapMock.setup = (cb)-> return cb("error in setup")
|
||||
|
||||
it 'calls res.json with setup error object', ->
|
||||
expectedResObj = {
|
||||
ok: false
|
||||
data: 'IAP Error'
|
||||
}
|
||||
|
||||
inApp.androidVerify(req, res, next)
|
||||
|
||||
expect(res.json).to.be.calledOnce
|
||||
expect(res.json).to.be.calledWith(expectedResObj)
|
||||
|
||||
it 'does not calls payments.buyGems function', ->
|
||||
inApp.androidVerify(req, res, next)
|
||||
|
||||
expect(paymentSpy).to.not.be.called
|
||||
|
||||
context 'error in validation', ->
|
||||
before ->
|
||||
iapMock.setup = (cb)-> return cb(null)
|
||||
iapMock.validate = (iapGoogle, iapBodyReciept, cb)-> return cb('error in validation', true)
|
||||
|
||||
it 'calls res.json with validation error object', ->
|
||||
expectedResObj = {
|
||||
ok: false
|
||||
data: {
|
||||
code: 6778001
|
||||
message: 'error in validation'
|
||||
}
|
||||
}
|
||||
|
||||
inApp.androidVerify(req, res, next)
|
||||
|
||||
expect(res.json).to.be.calledOnce
|
||||
expect(res.json).to.be.calledWith(expectedResObj)
|
||||
|
||||
it 'does not calls payments.buyGems function', ->
|
||||
inApp.androidVerify(req, res, next)
|
||||
|
||||
expect(paymentSpy).to.not.be.called
|
||||
|
||||
context 'iap is not valid', ->
|
||||
before ->
|
||||
iapMock.setup = (cb)-> return cb(null)
|
||||
iapMock.validate = (iapGoogle, iapBodyReciept, cb)-> return cb(null, false)
|
||||
iapMock.isValidated = (googleRes)-> return googleRes
|
||||
|
||||
it 'does not call res.json', ->
|
||||
inApp.androidVerify(req, res, next)
|
||||
|
||||
expect(res.json).to.not.be.called
|
||||
|
||||
it 'does not calls payments.buyGems function', ->
|
||||
inApp.androidVerify(req, res, next)
|
||||
|
||||
expect(paymentSpy).to.not.be.called
|
||||
|
||||
describe 'iOS', ->
|
||||
req = { body: { transaction: { reciept: 'foo' } } }
|
||||
res = {
|
||||
locals: { user: { _id: 'user' } }
|
||||
json: sinon.spy()
|
||||
}
|
||||
next = -> true
|
||||
paymentSpy = sinon.spy()
|
||||
|
||||
before ->
|
||||
inApp.__set__('payments.buyGems', paymentSpy)
|
||||
|
||||
afterEach ->
|
||||
paymentSpy.reset()
|
||||
res.json.reset()
|
||||
|
||||
context 'successful app purchase', ->
|
||||
before ->
|
||||
iapMock.setup = (cb)-> return cb(null)
|
||||
iapMock.validate = (iapApple, iapBodyReciept, cb)-> return cb(null, true)
|
||||
iapMock.isValidated = (appleRes)-> return appleRes
|
||||
iapMock.getPurchaseData = (appleRes)->
|
||||
return [{ productId: 'com.habitrpg.ios.Habitica.20gems' }]
|
||||
iapMock.APPLE = 'apple'
|
||||
|
||||
it 'calls res.json with succesful result object', ->
|
||||
expectedResObj = {
|
||||
ok: true
|
||||
data: true
|
||||
}
|
||||
|
||||
inApp.iosVerify(req, res, next)
|
||||
|
||||
expect(res.json).to.be.calledOnce
|
||||
expect(res.json).to.be.calledWith(expectedResObj)
|
||||
|
||||
it 'calls payments.buyGems function', ->
|
||||
inApp.iosVerify(req, res, next)
|
||||
|
||||
expect(paymentSpy).to.be.calledOnce
|
||||
expect(paymentSpy).to.be.calledWith({user: res.locals.user, paymentMethod:'IAP AppleStore'})
|
||||
|
||||
context 'error in setup', ->
|
||||
before ->
|
||||
iapMock.setup = (cb)-> return cb("error in setup")
|
||||
|
||||
it 'calls res.json with setup error object', ->
|
||||
expectedResObj = {
|
||||
ok: false
|
||||
data: 'IAP Error'
|
||||
}
|
||||
|
||||
inApp.iosVerify(req, res, next)
|
||||
|
||||
expect(res.json).to.be.calledOnce
|
||||
expect(res.json).to.be.calledWith(expectedResObj)
|
||||
|
||||
it 'does not calls payments.buyGems function', ->
|
||||
inApp.iosVerify(req, res, next)
|
||||
|
||||
expect(paymentSpy).to.not.be.called
|
||||
|
||||
context 'error in validation', ->
|
||||
before ->
|
||||
iapMock.setup = (cb)-> return cb(null)
|
||||
iapMock.validate = (iapApple, iapBodyReciept, cb)-> return cb('error in validation', true)
|
||||
|
||||
it 'calls res.json with validation error object', ->
|
||||
expectedResObj = {
|
||||
ok: false
|
||||
data: {
|
||||
code: 6778001
|
||||
message: 'error in validation'
|
||||
}
|
||||
}
|
||||
|
||||
inApp.iosVerify(req, res, next)
|
||||
|
||||
expect(res.json).to.be.calledOnce
|
||||
expect(res.json).to.be.calledWith(expectedResObj)
|
||||
|
||||
it 'does not calls payments.buyGems function', ->
|
||||
inApp.iosVerify(req, res, next)
|
||||
|
||||
expect(paymentSpy).to.not.be.called
|
||||
|
||||
context 'iap is not valid', ->
|
||||
before ->
|
||||
iapMock.setup = (cb)-> return cb(null)
|
||||
iapMock.validate = (iapApple, iapBodyReciept, cb)-> return cb(null, false)
|
||||
iapMock.isValidated = (appleRes)-> return appleRes
|
||||
|
||||
it 'does not call res.json', ->
|
||||
inApp.iosVerify(req, res, next)
|
||||
expectedResObj = {
|
||||
ok: false
|
||||
data: {
|
||||
code: 6778001
|
||||
message: 'Invalid receipt'
|
||||
}
|
||||
}
|
||||
expect(res.json).to.be.calledOnce
|
||||
expect(res.json).to.be.calledWith(expectedResObj)
|
||||
|
||||
it 'does not calls payments.buyGems function', ->
|
||||
inApp.iosVerify(req, res, next)
|
||||
|
||||
expect(paymentSpy).to.not.be.called
|
||||
|
||||
context 'iap is valid but has no purchaseDataList', ->
|
||||
before ->
|
||||
iapMock.setup = (cb)-> return cb(null)
|
||||
iapMock.validate = (iapApple, iapBodyReciept, cb)-> return cb(null, true)
|
||||
iapMock.isValidated = (appleRes)-> return appleRes
|
||||
iapMock.getPurchaseData = (appleRes)->
|
||||
return []
|
||||
iapMock.APPLE = 'apple'
|
||||
|
||||
it 'calls res.json with succesful result object', ->
|
||||
expectedResObj = {
|
||||
ok: false
|
||||
data: {
|
||||
code: 6778001
|
||||
message: 'Incorrect receipt content'
|
||||
}
|
||||
}
|
||||
|
||||
inApp.iosVerify(req, res, next)
|
||||
|
||||
expect(res.json).to.be.calledOnce
|
||||
expect(res.json).to.be.calledWith(expectedResObj)
|
||||
|
||||
it 'does not calls payments.buyGems function', ->
|
||||
inApp.iosVerify(req, res, next)
|
||||
|
||||
expect(paymentSpy).to.not.be.called
|
||||
|
||||
context 'iap is valid, has purchaseDataList, but productId does not match', ->
|
||||
before ->
|
||||
iapMock.setup = (cb)-> return cb(null)
|
||||
iapMock.validate = (iapApple, iapBodyReciept, cb)-> return cb(null, true)
|
||||
iapMock.isValidated = (appleRes)-> return appleRes
|
||||
iapMock.getPurchaseData = (appleRes)->
|
||||
return [{ productId: 'com.another.company' }]
|
||||
iapMock.APPLE = 'apple'
|
||||
|
||||
it 'calls res.json with incorrect reciept obj', ->
|
||||
expectedResObj = {
|
||||
ok: false
|
||||
data: {
|
||||
code: 6778001
|
||||
message: 'Incorrect receipt content'
|
||||
}
|
||||
}
|
||||
|
||||
inApp.iosVerify(req, res, next)
|
||||
|
||||
expect(res.json).to.be.calledOnce
|
||||
expect(res.json).to.be.calledWith(expectedResObj)
|
||||
|
||||
it 'does not calls payments.buyGems function', ->
|
||||
inApp.iosVerify(req, res, next)
|
||||
|
||||
expect(paymentSpy).to.not.be.called
|
||||
@@ -1,478 +0,0 @@
|
||||
'use strict'
|
||||
|
||||
diff = require("deep-diff")
|
||||
|
||||
Group = require("../../website/src/models/group").model
|
||||
app = require("../../website/src/server")
|
||||
|
||||
describe "Party", ->
|
||||
context "creating a party", ->
|
||||
it "creates a party", (done) ->
|
||||
async.waterfall [
|
||||
(cb) ->
|
||||
registerNewUser(cb, true)
|
||||
|
||||
(user, cb) ->
|
||||
request.post(baseURL + "/groups").send(
|
||||
name: "TestGroup"
|
||||
type: "party"
|
||||
).end (res) ->
|
||||
expectCode res, 200
|
||||
group = res.body
|
||||
expect(group.members.length).to.equal 1
|
||||
expect(group.leader).to.equal user._id
|
||||
cb()
|
||||
], done
|
||||
|
||||
it "prevents user from creating a second party", (done) ->
|
||||
request.post(baseURL + "/groups").send(
|
||||
name: "TestGroup"
|
||||
type: "party"
|
||||
).end (res) ->
|
||||
expectCode res, 400
|
||||
expect(res.body.err).to.equal "Already in a party, try refreshing."
|
||||
done()
|
||||
|
||||
context "Searching for a party", ->
|
||||
group = undefined
|
||||
beforeEach (done) ->
|
||||
async.waterfall [
|
||||
(cb) ->
|
||||
registerNewUser(cb, true)
|
||||
|
||||
(user, cb) ->
|
||||
request.post(baseURL + "/groups").send(
|
||||
name: "TestGroup"
|
||||
type: "party"
|
||||
).end (res) ->
|
||||
expectCode res, 200
|
||||
group = res.body
|
||||
expect(group.members.length).to.equal 1
|
||||
expect(group.leader).to.equal user._id
|
||||
cb()
|
||||
], done
|
||||
|
||||
it "can be found by querying for group type party", (done) ->
|
||||
request.get(baseURL + "/groups/").send(
|
||||
type: "party"
|
||||
).end (res) ->
|
||||
expectCode res, 200
|
||||
party = _.find res.body, (g) -> return g._id == group._id
|
||||
expect(party._id).to.equal group._id
|
||||
expect(party.leader).to.equal user._id
|
||||
expect(party.name).to.equal group.name
|
||||
expect(party.quest).to.deep.equal { progress: {} }
|
||||
expect(party.memberCount).to.equal group.memberCount
|
||||
done()
|
||||
|
||||
context "joining a party", ->
|
||||
group = undefined
|
||||
beforeEach (done) ->
|
||||
async.waterfall [
|
||||
(cb) ->
|
||||
registerNewUser(cb, true)
|
||||
|
||||
(user, cb) ->
|
||||
request.post(baseURL + "/groups").send(
|
||||
name: "TestGroup"
|
||||
type: "party"
|
||||
).end (res) ->
|
||||
expectCode res, 200
|
||||
group = res.body
|
||||
expect(group.members.length).to.equal 1
|
||||
expect(group.leader).to.equal user._id
|
||||
cb()
|
||||
], done
|
||||
|
||||
it "prevents user from joining a party when they haven't been invited", (done) ->
|
||||
registerNewUser (err, user) ->
|
||||
request.post(baseURL + "/groups/" + group._id + "/join").send()
|
||||
.set("X-API-User", user._id)
|
||||
.set("X-API-Key", user.apiToken)
|
||||
.end (res) ->
|
||||
expectCode res, 401
|
||||
expect(res.body.err).to.equal "Can't join a group you're not invited to."
|
||||
done()
|
||||
, false
|
||||
|
||||
it "allows users to join a party when they have been invited", (done) ->
|
||||
tmpUser = undefined
|
||||
async.waterfall [
|
||||
(cb) ->
|
||||
registerNewUser(cb, false)
|
||||
|
||||
(user, cb) ->
|
||||
tmpUser = user
|
||||
inviteURL = baseURL + "/groups/" + group._id + "/invite"
|
||||
request.post(inviteURL).send(
|
||||
uuids: [tmpUser._id]
|
||||
)
|
||||
.end ->
|
||||
cb()
|
||||
|
||||
(cb) ->
|
||||
request.post(baseURL + "/groups/" + group._id + "/join")
|
||||
.set("X-API-User", tmpUser._id)
|
||||
.set("X-API-Key", tmpUser.apiToken)
|
||||
.end (res) ->
|
||||
expectCode res, 200
|
||||
cb()
|
||||
|
||||
(cb) ->
|
||||
Group.findById group._id, (err, grp) ->
|
||||
expect(grp.members).to.include(tmpUser._id)
|
||||
cb()
|
||||
], done
|
||||
|
||||
context "Quests", ->
|
||||
party = undefined
|
||||
group = undefined
|
||||
participating = []
|
||||
notParticipating = []
|
||||
beforeEach (done) ->
|
||||
# Tavern boss, side-by-side
|
||||
Group.update(
|
||||
_id: "habitrpg"
|
||||
,
|
||||
$set:
|
||||
quest:
|
||||
key: "dilatory"
|
||||
active: true
|
||||
progress:
|
||||
hp: shared.content.quests.dilatory.boss.hp
|
||||
rage: 0
|
||||
).exec()
|
||||
|
||||
# Tally some progress for later. Later we want to test that progress made before the quest began gets
|
||||
# counted after the quest starts
|
||||
async.waterfall [
|
||||
(cb) ->
|
||||
registerNewUser(cb, true)
|
||||
|
||||
(user, cb) ->
|
||||
request.post(baseURL + "/groups").send(
|
||||
name: "TestGroup"
|
||||
type: "party"
|
||||
).end (res) ->
|
||||
expectCode res, 200
|
||||
group = res.body
|
||||
expect(group.members.length).to.equal 1
|
||||
expect(group.leader).to.equal user._id
|
||||
cb()
|
||||
|
||||
(cb) ->
|
||||
request.post(baseURL + '/user/tasks').send({
|
||||
type: 'daily'
|
||||
text: 'daily one'
|
||||
}).end (res) ->
|
||||
cb()
|
||||
(cb) ->
|
||||
request.post(baseURL + '/user/tasks').send({
|
||||
type: 'daily'
|
||||
text: 'daily two'
|
||||
}).end (res) ->
|
||||
cb()
|
||||
(cb) ->
|
||||
User.findByIdAndUpdate user._id,
|
||||
$set:
|
||||
"stats.lvl": 50
|
||||
, (err, _user) ->
|
||||
cb(null, _user)
|
||||
(_user, cb) ->
|
||||
user = _user
|
||||
request.post(baseURL + "/user/batch-update").send([
|
||||
{
|
||||
op: "score"
|
||||
params:
|
||||
direction: "up"
|
||||
id: user.dailys[0].id
|
||||
}
|
||||
{
|
||||
op: "score"
|
||||
params:
|
||||
direction: "up"
|
||||
id: user.dailys[0].id
|
||||
}
|
||||
{
|
||||
op: "update"
|
||||
body:
|
||||
"stats.lvl": 50
|
||||
}
|
||||
]).end (res) ->
|
||||
user = res.body
|
||||
expect(user.party.quest.progress.up).to.be.above 0
|
||||
|
||||
# Invite some members
|
||||
async.waterfall [
|
||||
|
||||
# Register new users
|
||||
(cb) ->
|
||||
registerManyUsers 3, cb
|
||||
|
||||
# Send them invitations
|
||||
(_party, cb) ->
|
||||
party = _party
|
||||
inviteURL = baseURL + "/groups/" + group._id + "/invite"
|
||||
async.parallel [
|
||||
(cb2) ->
|
||||
request.post(inviteURL).send(
|
||||
uuids: [party[0]._id]
|
||||
).end ->
|
||||
cb2()
|
||||
(cb2) ->
|
||||
request.post(inviteURL).send(
|
||||
uuids: [party[1]._id]
|
||||
).end ->
|
||||
cb2()
|
||||
(cb2) ->
|
||||
request.post(inviteURL).send(
|
||||
uuids: [party[2]._id]
|
||||
).end (res)->
|
||||
cb2()
|
||||
], cb
|
||||
|
||||
# Accept / Reject
|
||||
(results, cb) ->
|
||||
|
||||
# series since they'll be modifying the same group record
|
||||
series = _.reduce(party, (m, v, i) ->
|
||||
m.push (cb2) ->
|
||||
request.post(baseURL + "/groups/" + group._id + "/join").set("X-API-User", party[i]._id).set("X-API-Key", party[i].apiToken).end ->
|
||||
cb2()
|
||||
m
|
||||
, [])
|
||||
async.series series, cb
|
||||
|
||||
# Make sure the invites stuck
|
||||
(whatever, cb) ->
|
||||
Group.findById group._id, (err, g) ->
|
||||
group = g
|
||||
expect(g.members.length).to.equal 4
|
||||
cb()
|
||||
|
||||
], ->
|
||||
|
||||
# Start the quest
|
||||
async.waterfall [
|
||||
(cb) ->
|
||||
request.post(baseURL + "/groups/" + group._id + "/questAccept?key=vice3").end (res) ->
|
||||
expectCode res, 400
|
||||
User.findByIdAndUpdate user._id,
|
||||
$set:
|
||||
"items.quests.vice3": 1
|
||||
, cb
|
||||
|
||||
(_user, cb) ->
|
||||
request.post(baseURL + "/groups/" + group._id + "/questAccept?key=vice3").end (res) ->
|
||||
expectCode res, 200
|
||||
Group.findById group._id, cb
|
||||
|
||||
(_group, cb) ->
|
||||
expect(_group.quest.key).to.equal "vice3"
|
||||
expect(_group.quest.active).to.equal false
|
||||
request.post(baseURL + "/groups/" + group._id + "/questAccept").set("X-API-User", party[0]._id).set("X-API-Key", party[0].apiToken).end ->
|
||||
request.post(baseURL + "/groups/" + group._id + "/questAccept").set("X-API-User", party[1]._id).set("X-API-Key", party[1].apiToken).end (res) ->
|
||||
request.post(baseURL + "/groups/" + group._id + "/questReject").set("X-API-User", party[2]._id).set("X-API-Key", party[2].apiToken).end (res) ->
|
||||
group = res.body
|
||||
expect(group.quest.active).to.equal true
|
||||
cb()
|
||||
|
||||
], done
|
||||
]
|
||||
|
||||
it "Casts a spell", (done) ->
|
||||
mp = user.stats.mp
|
||||
request.get(baseURL + "/members/" + party[0]._id).end (res) ->
|
||||
party[0] = res.body
|
||||
request.post(baseURL + "/user/class/cast/snowball?targetType=user&targetId=" + party[0]._id).end (res) ->
|
||||
|
||||
#expect(res.body.stats.mp).to.be.below(mp);
|
||||
request.get(baseURL + "/members/" + party[0]._id).end (res) ->
|
||||
member = res.body
|
||||
expect(member.achievements.snowball).to.equal 1
|
||||
expect(member.stats.buffs.snowball).to.exist
|
||||
difference = diff(member, party[0])
|
||||
expect(_.size(difference)).to.equal 2
|
||||
|
||||
# level up user so str is > 0
|
||||
request.put(baseURL + "/user").send("stats.lvl": 5).end (res) ->
|
||||
|
||||
# Refill mana so user can cast
|
||||
request.put(baseURL + "/user").send("stats.mp": 100).end (res) ->
|
||||
request.post(baseURL + "/user/class/cast/valorousPresence?targetType=party").end (res) ->
|
||||
request.get(baseURL + "/members/" + member._id).end (res) ->
|
||||
expect(res.body.stats.buffs.str).to.be.above 0
|
||||
expect(diff(res.body, member).length).to.equal 1
|
||||
done()
|
||||
|
||||
it "Doesn't include people who aren't participating", (done) ->
|
||||
request.get(baseURL + "/groups/" + group._id).end (res) ->
|
||||
expect(_.size(res.body.quest.members)).to.equal 3
|
||||
done()
|
||||
|
||||
it "allows quest participants to leave quest", (done) ->
|
||||
leavingMember = party[1]
|
||||
expect(group.quest.members[leavingMember._id]).to.eql(true)
|
||||
|
||||
request.post(baseURL + "/groups/" + group._id + "/questLeave")
|
||||
.set("X-API-User", leavingMember._id)
|
||||
.set("X-API-Key", leavingMember.apiToken)
|
||||
.end (err, res) ->
|
||||
expectCode res, 204
|
||||
request.get(baseURL + '/groups/party')
|
||||
.end (err, res) ->
|
||||
expect(res.body.quest.members[leavingMember._id]).to.not.be.ok
|
||||
done()
|
||||
|
||||
xit "Hurts the boss", (done) ->
|
||||
request.post(baseURL + "/user/batch-update").end (res) ->
|
||||
user = res.body
|
||||
up = user.party.quest.progress.up
|
||||
expect(up).to.be.above 0
|
||||
|
||||
#{op:'score',params:{direction:'up',id:user.dailys[3].id}}, // leave one daily undone so Trapper hurts party
|
||||
# set day to yesterday, cron will then be triggered on next action
|
||||
request.post(baseURL + "/user/batch-update").send([
|
||||
{
|
||||
op: "score"
|
||||
params:
|
||||
direction: "up"
|
||||
id: user.dailys[0].id
|
||||
}
|
||||
{
|
||||
op: "update"
|
||||
body:
|
||||
lastCron: moment().subtract(1, "days")
|
||||
}
|
||||
]).end (res) ->
|
||||
expect(res.body.party.quest.progress.up).to.be.above up
|
||||
request.post(baseURL + "/user/batch-update").end ->
|
||||
request.get(baseURL + "/groups/party").end (res) ->
|
||||
|
||||
# Check boss damage
|
||||
async.waterfall [
|
||||
(cb) ->
|
||||
async.parallel [
|
||||
|
||||
#tavern boss
|
||||
(cb2) ->
|
||||
Group.findById "habitrpg",
|
||||
quest: 1
|
||||
, (err, tavern) ->
|
||||
expect(tavern.quest.progress.hp).to.be.below shared.content.quests.dilatory.boss.hp
|
||||
expect(tavern.quest.progress.rage).to.be.above 0
|
||||
cb2()
|
||||
|
||||
# party boss
|
||||
(cb2) ->
|
||||
expect(res.body.quest.progress.hp).to.be.below shared.content.quests.vice3.boss.hp
|
||||
_party = res.body.members
|
||||
expect(_.find(_party,
|
||||
_id: party[0]._id
|
||||
).stats.hp).to.be.below 50
|
||||
expect(_.find(_party,
|
||||
_id: party[1]._id
|
||||
).stats.hp).to.be.below 50
|
||||
expect(_.find(_party,
|
||||
_id: party[2]._id
|
||||
).stats.hp).to.be 50
|
||||
cb2()
|
||||
], cb
|
||||
|
||||
# Kill the boss
|
||||
(whatever, cb) ->
|
||||
async.waterfall [
|
||||
|
||||
# tavern boss
|
||||
(cb2) ->
|
||||
expect(user.items.pets["MantisShrimp-Base"]).to.not.be.ok()
|
||||
Group.update
|
||||
_id: "habitrpg"
|
||||
,
|
||||
$set:
|
||||
"quest.progress.hp": 0
|
||||
, cb2
|
||||
|
||||
# party boss
|
||||
(arg1, arg2, cb2) ->
|
||||
expect(user.items.gear.owned.weapon_special_2).to.not.be.ok()
|
||||
Group.findByIdAndUpdate group._id,
|
||||
$set:
|
||||
"quest.progress.hp": 0
|
||||
, cb2
|
||||
], cb
|
||||
(_group, cb) ->
|
||||
# set day to yesterday, cron will then be triggered on next action
|
||||
request.post(baseURL + "/user/batch-update").send([
|
||||
{
|
||||
op: "score"
|
||||
params:
|
||||
direction: "up"
|
||||
id: user.dailys[1].id
|
||||
}
|
||||
{
|
||||
op: "update"
|
||||
body:
|
||||
lastCron: moment().subtract(1, "days")
|
||||
}
|
||||
]).end ->
|
||||
cb()
|
||||
|
||||
(cb) ->
|
||||
request.post(baseURL + "/user/batch-update").end (res) ->
|
||||
cb null, res.body
|
||||
|
||||
(_user, cb) ->
|
||||
|
||||
# need to load the user again, since tavern boss does update after user's cron
|
||||
User.findById _user._id, cb
|
||||
(_user, cb) ->
|
||||
user = _user
|
||||
Group.findById group._id, cb
|
||||
(_group, cb) ->
|
||||
cummExp = shared.content.quests.vice3.drop.exp + shared.content.quests.dilatory.drop.exp
|
||||
cummGp = shared.content.quests.vice3.drop.gp + shared.content.quests.dilatory.drop.gp
|
||||
|
||||
#//FIXME check that user got exp, but user is leveling up making the exp check difficult
|
||||
# expect(user.stats.exp).to.be.above(cummExp);
|
||||
# expect(user.stats.gp).to.be.above(cummGp);
|
||||
async.parallel [
|
||||
|
||||
# Tavern Boss
|
||||
(cb2) ->
|
||||
Group.findById "habitrpg", (err, tavern) ->
|
||||
|
||||
#use an explicit get because mongoose wraps the null in an object
|
||||
expect(_.isEmpty(tavern.get("quest"))).to.equal true
|
||||
expect(user.items.pets["MantisShrimp-Base"]).to.equal 5
|
||||
expect(user.items.mounts["MantisShrimp-Base"]).to.equal true
|
||||
expect(user.items.eggs.Dragon).to.equal 2
|
||||
expect(user.items.hatchingPotions.Shade).to.equal 2
|
||||
cb2()
|
||||
|
||||
# Party Boss
|
||||
(cb2) ->
|
||||
|
||||
#use an explicit get because mongoose wraps the null in an object
|
||||
expect(_.isEmpty(_group.get("quest"))).to.equal true
|
||||
expect(user.items.gear.owned.weapon_special_2).to.equal true
|
||||
expect(user.items.eggs.Dragon).to.equal 2
|
||||
expect(user.items.hatchingPotions.Shade).to.equal 2
|
||||
|
||||
# need to fetch users to get updated data
|
||||
async.parallel [
|
||||
(cb3) ->
|
||||
User.findById party[0].id, (err, mbr) ->
|
||||
expect(mbr.items.gear.owned.weapon_special_2).to.equal true
|
||||
cb3()
|
||||
(cb3) ->
|
||||
User.findById party[1].id, (err, mbr) ->
|
||||
expect(mbr.items.gear.owned.weapon_special_2).to.equal true
|
||||
cb3()
|
||||
(cb3) ->
|
||||
User.findById party[2].id, (err, mbr) ->
|
||||
expect(mbr.items.gear.owned.weapon_special_2).to.not.be.ok()
|
||||
cb3()
|
||||
], cb2
|
||||
], cb
|
||||
], done
|
||||
@@ -1,361 +0,0 @@
|
||||
'use strict'
|
||||
#@TODO: Have to mock most things to get to the parts that
|
||||
#call pushNotify. Consider refactoring group controller
|
||||
#so things are easier to test
|
||||
|
||||
app = require("../../website/src/server")
|
||||
rewire = require('rewire')
|
||||
sinon = require('sinon')
|
||||
|
||||
describe "Push-Notifications", ->
|
||||
before (done) ->
|
||||
registerNewUser(done, true)
|
||||
|
||||
describe "POST /user/pushDevice", ->
|
||||
it "Registers a DeviceID", (done) ->
|
||||
request.post(baseURL + "/user/pushDevice").send(
|
||||
{ regId: "123123", type: "android"}
|
||||
).end (res) ->
|
||||
expectCode res, 200
|
||||
|
||||
User.findOne
|
||||
_id: global.user._id
|
||||
, (err, _user) ->
|
||||
expect(_user.pushDevices.length).to.equal 1
|
||||
expect(_user.pushDevices[0].regId).to.equal "123123"
|
||||
|
||||
done()
|
||||
|
||||
describe "Events that send push notifications", ->
|
||||
pushSpy = { sendNotify: sinon.spy() }
|
||||
|
||||
afterEach (done) ->
|
||||
pushSpy.sendNotify.reset()
|
||||
done()
|
||||
|
||||
context "Challenges", ->
|
||||
challenges = rewire("../../website/src/controllers/challenges")
|
||||
challenges.__set__('pushNotify', pushSpy)
|
||||
challengeMock = {
|
||||
findById: (arg, cb) ->
|
||||
cb(null, {leader: user._id, name: 'challenge-name'})
|
||||
}
|
||||
userMock = {
|
||||
findById: (arg, cb) ->
|
||||
cb(null, user)
|
||||
}
|
||||
|
||||
challenges.__set__('Challenge', challengeMock)
|
||||
challenges.__set__('User', userMock)
|
||||
challenges.__set__('closeChal', -> true)
|
||||
|
||||
beforeEach (done) ->
|
||||
registerNewUser ->
|
||||
user.preferences.emailNotifications.wonChallenge = false
|
||||
user.save = (cb) -> cb(null, user)
|
||||
done()
|
||||
, true
|
||||
|
||||
it "sends a push notification when you win a challenge", (done) ->
|
||||
req = {
|
||||
params: { cid: 'challenge-id' }
|
||||
query: {uid: 'user-id'}
|
||||
}
|
||||
res = {
|
||||
locals: { user: user }
|
||||
}
|
||||
challenges.selectWinner req, res
|
||||
|
||||
setTimeout -> # Allow selectWinner to finish
|
||||
expect(pushSpy.sendNotify).to.have.been.calledOnce
|
||||
expect(pushSpy.sendNotify).to.have.been.calledWith(
|
||||
user,
|
||||
'You Won a Challenge',
|
||||
'challenge-name'
|
||||
)
|
||||
done()
|
||||
, 100
|
||||
|
||||
context "Groups", ->
|
||||
|
||||
recipient = null
|
||||
|
||||
groups = rewire("../../website/src/controllers/groups")
|
||||
groups.__set__('pushNotify', pushSpy)
|
||||
|
||||
before (done) ->
|
||||
registerNewUser (err,_user)->
|
||||
recipient = _user
|
||||
recipient.invitations.guilds = []
|
||||
recipient.save = (cb) -> cb(null, recipient)
|
||||
recipient.preferences.emailNotifications.invitedGuild = false
|
||||
recipient.preferences.emailNotifications.invitedParty = false
|
||||
recipient.preferences.emailNotifications.invitedQuest = false
|
||||
userMock = {
|
||||
findById: (arg, cb) ->
|
||||
cb(null, recipient)
|
||||
find: (arg, arg2, cb) ->
|
||||
cb(null, [recipient])
|
||||
update: (arg, arg2) ->
|
||||
{ exec: -> true}
|
||||
}
|
||||
groups.__set__('User', userMock)
|
||||
done()
|
||||
|
||||
, false
|
||||
|
||||
it "sends a push notification when invited to a guild", (done) ->
|
||||
group = { _id: 'guild-id', name: 'guild-name', type: 'guild', members: [user._id], invites: [] }
|
||||
group.save = (cb) -> cb(null, group)
|
||||
req = {
|
||||
body: { uuids: [recipient._id] }
|
||||
}
|
||||
res = {
|
||||
locals: { group: group, user: user }
|
||||
json: -> return true
|
||||
}
|
||||
|
||||
groups.invite req, res
|
||||
|
||||
setTimeout -> # Allow invite to finish
|
||||
expect(pushSpy.sendNotify).to.have.been.calledOnce
|
||||
expect(pushSpy.sendNotify).to.have.been.calledWith(
|
||||
recipient,
|
||||
'Invited To Guild',
|
||||
group.name
|
||||
)
|
||||
done()
|
||||
, 100
|
||||
|
||||
it "sends a push notification when invited to a party", (done) ->
|
||||
group = { _id: 'party-id', name: 'party-name', type: 'party', members: [user._id], invites: [] }
|
||||
group.save = (cb) -> cb(null, group)
|
||||
req = {
|
||||
body: { uuids: [recipient._id] }
|
||||
}
|
||||
res = {
|
||||
locals: { group: group, user: user }
|
||||
json: -> return true
|
||||
}
|
||||
|
||||
groups.invite req, res
|
||||
|
||||
setTimeout -> # Allow invite to finish
|
||||
expect(pushSpy.sendNotify).to.have.been.calledOnce
|
||||
expect(pushSpy.sendNotify).to.have.been.calledWith(
|
||||
recipient,
|
||||
'Invited To Party',
|
||||
group.name
|
||||
)
|
||||
done()
|
||||
, 100
|
||||
|
||||
it "sends a push notification when invited to a quest", (done) ->
|
||||
group = { _id: 'party-id', name: 'party-name', type: 'party', members: [user._id, recipient._id], invites: [], quest: {}}
|
||||
user.items.quests.hedgehog = 5
|
||||
group.save = (cb) -> cb(null, group)
|
||||
group.markModified = -> true
|
||||
req = {
|
||||
body: { uuids: [recipient._id] }
|
||||
query: { key: 'hedgehog' }
|
||||
}
|
||||
res = {
|
||||
locals: { group: group, user: user }
|
||||
json: -> return true
|
||||
}
|
||||
|
||||
groups.questAccept req, res
|
||||
|
||||
setTimeout -> # Allow questAccept to finish
|
||||
expect(pushSpy.sendNotify).to.have.been.calledOnce
|
||||
expect(pushSpy.sendNotify).to.have.been.calledWith(
|
||||
recipient,
|
||||
'Quest Invitation',
|
||||
'Invitation for the Quest The Hedgebeast'
|
||||
)
|
||||
done()
|
||||
, 100
|
||||
|
||||
it "sends a push notification to participating members when quest starts", (done) ->
|
||||
group = { _id: 'party-id', name: 'party-name', type: 'party', members: [user._id, recipient._id], invites: []}
|
||||
group.quest = {
|
||||
key: 'hedgehog'
|
||||
progress: { hp: 100 }
|
||||
members: {}
|
||||
}
|
||||
group.quest.members[recipient._id] = true
|
||||
group.save = (cb) -> cb(null, group)
|
||||
group.markModified = -> true
|
||||
req = {
|
||||
body: { uuids: [recipient._id] }
|
||||
query: { }
|
||||
# force: true
|
||||
}
|
||||
res = {
|
||||
locals: { group: group, user: user }
|
||||
json: -> return true
|
||||
}
|
||||
userMock = {
|
||||
findOne: (arg, arg2, cb) ->
|
||||
cb(null, recipient)
|
||||
update: (arg, arg2, cb) ->
|
||||
if (cb)
|
||||
return cb(null, user)
|
||||
else
|
||||
return {
|
||||
exec: -> true
|
||||
}
|
||||
}
|
||||
groups.__set__('User', userMock)
|
||||
groups.__set__('populateQuery',
|
||||
(arg, arg2, arg3) ->
|
||||
return {
|
||||
exec: -> group.members
|
||||
}
|
||||
)
|
||||
|
||||
groups.questAccept req, res
|
||||
|
||||
setTimeout -> # Allow questAccept to finish
|
||||
expect(pushSpy.sendNotify).to.have.been.calledTwice
|
||||
expect(pushSpy.sendNotify).to.have.been.calledWith(
|
||||
recipient,
|
||||
'HabitRPG',
|
||||
'Your Quest has Begun: The Hedgebeast'
|
||||
)
|
||||
done()
|
||||
, 100
|
||||
|
||||
describe "Gifts", ->
|
||||
|
||||
recipient = null
|
||||
|
||||
before (done) ->
|
||||
registerNewUser (err, _user) ->
|
||||
recipient = _user
|
||||
recipient.preferences.emailNotifications.giftedGems = false
|
||||
user.balance = 4
|
||||
user.save = -> return true
|
||||
recipient.save = -> return true
|
||||
done()
|
||||
, false
|
||||
|
||||
context "sending gems from balance", ->
|
||||
members = rewire("../../website/src/controllers/members")
|
||||
members.sendMessage = -> true
|
||||
|
||||
members.__set__('pushNotify', pushSpy)
|
||||
members.__set__ 'fetchMember', (id) ->
|
||||
return (cb) -> cb(null, recipient)
|
||||
|
||||
it "sends a push notification", (done) ->
|
||||
req = {
|
||||
params: { uuid: "uuid" },
|
||||
body: {
|
||||
type: 'gems',
|
||||
gems: { amount: 1 }
|
||||
}
|
||||
}
|
||||
res = { locals: { user: user } }
|
||||
|
||||
members.sendGift req, res
|
||||
|
||||
setTimeout -> # Allow sendGift to finish
|
||||
expect(pushSpy.sendNotify).to.have.been.calledOnce
|
||||
expect(pushSpy.sendNotify).to.have.been.calledWith(
|
||||
recipient,
|
||||
'Gifted Gems',
|
||||
'1 Gems - by ' + user.profile.name
|
||||
)
|
||||
done()
|
||||
, 100
|
||||
|
||||
describe "Purchases", ->
|
||||
|
||||
payments = rewire("../../website/src/controllers/payments")
|
||||
|
||||
payments.__set__('pushNotify', pushSpy)
|
||||
membersMock = { sendMessage: -> true }
|
||||
payments.__set__('members', membersMock)
|
||||
|
||||
context "buying gems as a purchased gift", ->
|
||||
|
||||
it "sends a push notification", (done) ->
|
||||
data = {
|
||||
user: user,
|
||||
gift: {
|
||||
member: recipient,
|
||||
gems: { amount: 1 }
|
||||
}
|
||||
}
|
||||
|
||||
payments.buyGems data
|
||||
|
||||
setTimeout -> # Allow buyGems to finish
|
||||
expect(pushSpy.sendNotify).to.have.been.calledOnce
|
||||
expect(pushSpy.sendNotify).to.have.been.calledWith(
|
||||
recipient,
|
||||
'Gifted Gems',
|
||||
'1 Gems - by ' + user.profile.name
|
||||
)
|
||||
|
||||
done()
|
||||
, 100
|
||||
|
||||
it "does not send a push notification if buying gems for self", (done) ->
|
||||
data = {
|
||||
user: user,
|
||||
gift: {
|
||||
member: user
|
||||
gems: { amount: 1 }
|
||||
}
|
||||
}
|
||||
|
||||
payments.buyGems data
|
||||
|
||||
setTimeout -> # Allow buyGems to finish
|
||||
expect(pushSpy.sendNotify).to.not.have.been.called
|
||||
|
||||
done()
|
||||
, 100
|
||||
|
||||
context "sending a subscription as a purchased gift", ->
|
||||
|
||||
it "sends a push notification", (done) ->
|
||||
data = {
|
||||
user: user,
|
||||
gift: {
|
||||
member: recipient
|
||||
subscription: { key: 'basic_6mo' }
|
||||
}
|
||||
}
|
||||
|
||||
payments.createSubscription data
|
||||
|
||||
setTimeout -> # Allow createSubscription to finish
|
||||
expect(pushSpy.sendNotify).to.have.been.calledOnce
|
||||
expect(pushSpy.sendNotify).to.have.been.calledWith(
|
||||
recipient,
|
||||
'Gifted Subscription',
|
||||
'6 months - by ' + user.profile.name
|
||||
)
|
||||
|
||||
done()
|
||||
, 100
|
||||
|
||||
it "does not send a push notification if buying subscription for self", (done) ->
|
||||
data = {
|
||||
user: user,
|
||||
gift: {
|
||||
member: user
|
||||
subscription: { key: 'basic_6mo' }
|
||||
}
|
||||
}
|
||||
|
||||
payments.createSubscription data
|
||||
|
||||
setTimeout -> # Allow buyGems to finish
|
||||
expect(pushSpy.sendNotify).to.not.have.been.called
|
||||
|
||||
done()
|
||||
, 100
|
||||
@@ -1,114 +0,0 @@
|
||||
'use strict'
|
||||
|
||||
require("../../website/src/server")
|
||||
|
||||
describe "Score", ->
|
||||
before (done) ->
|
||||
registerNewUser done, true
|
||||
|
||||
context "Todos that did not previously exist", ->
|
||||
it "creates a completed a todo when using up url", (done) ->
|
||||
request.post(baseURL + "/user/tasks/withUp/up").send(
|
||||
type: "todo"
|
||||
text: "withUp"
|
||||
).end (res) ->
|
||||
expectCode res, 200
|
||||
request.get(baseURL + "/user/tasks/withUp").end (res) ->
|
||||
upTodo = res.body
|
||||
expect(upTodo.completed).to.equal true
|
||||
done()
|
||||
|
||||
it "creates an uncompleted todo when using down url", (done) ->
|
||||
request.post(baseURL + "/user/tasks/withDown/down").send(
|
||||
type: "todo"
|
||||
text: "withDown"
|
||||
).end (res) ->
|
||||
expectCode res, 200
|
||||
request.get(baseURL + "/user/tasks/withDown").end (res) ->
|
||||
downTodo = res.body
|
||||
expect(downTodo.completed).to.equal false
|
||||
done()
|
||||
|
||||
it "creates a completed a todo overriding the complete parameter when using up url", (done) ->
|
||||
request.post(baseURL + "/user/tasks/withUpWithComplete/up").send(
|
||||
type: "todo"
|
||||
text: "withUpWithComplete"
|
||||
completed: false
|
||||
).end (res) ->
|
||||
expectCode res, 200
|
||||
request.get(baseURL + "/user/tasks/withUpWithComplete").end (res) ->
|
||||
upTodo = res.body
|
||||
expect(upTodo.completed).to.equal true
|
||||
done()
|
||||
|
||||
it "Creates an uncompleted todo overriding the completed parameter when using down url", (done) ->
|
||||
request.post(baseURL + "/user/tasks/withDownWithUncomplete/down").send(
|
||||
type: "todo"
|
||||
text: "withDownWithUncomplete"
|
||||
completed: true
|
||||
).end (res) ->
|
||||
expectCode res, 200
|
||||
request.get(baseURL + "/user/tasks/withDownWithUncomplete").end (res) ->
|
||||
downTodo = res.body
|
||||
expect(downTodo.completed).to.equal false
|
||||
done()
|
||||
|
||||
context "Todo that already exists", ->
|
||||
it "It completes a todo when using up url", (done) ->
|
||||
request.post(baseURL + "/user/tasks").send(
|
||||
type: "todo"
|
||||
text: "Sample Todo"
|
||||
).end (res) ->
|
||||
expectCode res, 200
|
||||
unCompletedTodo = res.body
|
||||
expect(unCompletedTodo.completed).to.equal false
|
||||
request.post(baseURL + "/user/tasks/"+unCompletedTodo._id+"/up").end (res) ->
|
||||
expectCode res, 200
|
||||
request.get(baseURL + "/user/tasks/"+unCompletedTodo._id).end (res) ->
|
||||
unCompletedTodo = res.body
|
||||
expect(unCompletedTodo.completed).to.equal true
|
||||
done()
|
||||
|
||||
it "It uncompletes a todo when using down url", (done) ->
|
||||
request.post(baseURL + "/user/tasks").send(
|
||||
type: "todo"
|
||||
text: "Sample Todo"
|
||||
completed: true
|
||||
).end (res) ->
|
||||
expectCode res, 200
|
||||
completedTodo = res.body
|
||||
expect(completedTodo.completed).to.equal true
|
||||
request.post(baseURL + "/user/tasks/"+completedTodo._id+"/down").end (res) ->
|
||||
expectCode res, 200
|
||||
request.get(baseURL + "/user/tasks/"+completedTodo._id).end (res) ->
|
||||
completedTodo = res.body
|
||||
expect(completedTodo.completed).to.equal false
|
||||
done()
|
||||
|
||||
it "Creates and scores up a habit when using up url", (done) ->
|
||||
upHabit = undefined
|
||||
request.post(baseURL + "/user/tasks/habitWithUp/up").send(
|
||||
type: "habit"
|
||||
text: "testTitle"
|
||||
completed: true
|
||||
).end (res) ->
|
||||
expectCode res, 200
|
||||
request.get(baseURL + "/user/tasks/habitWithUp").end (res) ->
|
||||
upHabit = res.body
|
||||
expect(upHabit.value).to.be.at.least(1)
|
||||
expect(upHabit.type).to.equal("habit")
|
||||
done()
|
||||
|
||||
it "Creates and scores down a habit when using down url", (done) ->
|
||||
downHabit = undefined
|
||||
request.post(baseURL + "/user/tasks/habitWithDown/down").send(
|
||||
type: "habit"
|
||||
text: "testTitle"
|
||||
completed: true
|
||||
).end (res) ->
|
||||
expectCode res, 200
|
||||
request.get(baseURL + "/user/tasks/habitWithDown").end (res) ->
|
||||
downHabit = res.body
|
||||
expect(downHabit.value).to.have.at.most(-1)
|
||||
expect(downHabit.type).to.equal("habit")
|
||||
done()
|
||||
@@ -1,41 +0,0 @@
|
||||
'use strict'
|
||||
|
||||
app = require("../../website/src/server")
|
||||
|
||||
describe "Site Status", ->
|
||||
|
||||
describe "Without token or user id", ->
|
||||
|
||||
it "/api/v2/status", (done) ->
|
||||
request.get(baseURL + "/status").set("Accept", "application/json").end (res) ->
|
||||
expect(res.statusCode).to.equal 200
|
||||
expect(res.body.status).to.equal "up"
|
||||
done()
|
||||
|
||||
it "/api/v2/user", (done) ->
|
||||
request
|
||||
.get(baseURL + "/user")
|
||||
.set("Accept", "application/json")
|
||||
.set("X-API-User", '')
|
||||
.set("X-API-Key", '')
|
||||
.end (res) ->
|
||||
expect(res.statusCode).to.equal 401
|
||||
expect(res.body.err).to.equal "You must include a token and uid (user id) in your request"
|
||||
done()
|
||||
|
||||
describe "With token or user id", ->
|
||||
|
||||
before (done) ->
|
||||
registerNewUser(done, true)
|
||||
|
||||
it "/api/v2/status", (done) ->
|
||||
request.get(baseURL + "/status").set("Accept", "application/json").end (res) ->
|
||||
expect(res.statusCode).to.equal 200
|
||||
expect(res.body.status).to.equal "up"
|
||||
done()
|
||||
|
||||
it "/api/v2/user", (done) ->
|
||||
request.get(baseURL + "/user").set("Accept", "application/json").end (res) ->
|
||||
expect(res.statusCode).to.equal 200
|
||||
expect(res.body._id).to.equal user._id
|
||||
done()
|
||||
@@ -1,41 +0,0 @@
|
||||
'use strict'
|
||||
|
||||
payments = require("../../website/src/controllers/payments")
|
||||
app = require("../../website/src/server")
|
||||
|
||||
describe "Subscriptions", ->
|
||||
|
||||
before (done) ->
|
||||
registerNewUser(done, true)
|
||||
|
||||
it "Handles unsubscription", (done) ->
|
||||
cron = ->
|
||||
user.lastCron = moment().subtract(1, "d")
|
||||
user.fns.cron()
|
||||
|
||||
expect(user.purchased.plan.customerId).to.not.exist
|
||||
payments.createSubscription
|
||||
user: user
|
||||
customerId: "123"
|
||||
paymentMethod: "Stripe"
|
||||
sub: {key: 'basic_6mo'}
|
||||
|
||||
expect(user.purchased.plan.customerId).to.exist
|
||||
shared.wrap user
|
||||
cron()
|
||||
expect(user.purchased.plan.customerId).to.exist
|
||||
payments.cancelSubscription user: user
|
||||
cron()
|
||||
expect(user.purchased.plan.customerId).to.exist
|
||||
expect(user.purchased.plan.dateTerminated).to.exist
|
||||
user.purchased.plan.dateTerminated = moment().subtract(2, "d")
|
||||
cron()
|
||||
expect(user.purchased.plan.customerId).to.not.exist
|
||||
payments.createSubscription
|
||||
user: user
|
||||
customerId: "123"
|
||||
paymentMethod: "Stripe"
|
||||
sub: {key: 'basic_6mo'}
|
||||
|
||||
expect(user.purchased.plan.dateTerminated).to.not.exist
|
||||
done()
|
||||
@@ -1,185 +0,0 @@
|
||||
'use strict'
|
||||
|
||||
require("../../website/src/server")
|
||||
|
||||
describe "Todos", ->
|
||||
|
||||
before (done) ->
|
||||
registerNewUser done, true
|
||||
|
||||
beforeEach (done) ->
|
||||
User.findById user._id, (err, _user) ->
|
||||
user = _user
|
||||
shared.wrap user
|
||||
done()
|
||||
|
||||
it "Archives old todos", (done) ->
|
||||
numTasks = _.size(user.todos)
|
||||
request.post(baseURL + "/user/batch-update?_v=999").send([
|
||||
{
|
||||
op: "addTask"
|
||||
body:
|
||||
type: "todo"
|
||||
}
|
||||
{
|
||||
op: "addTask"
|
||||
body:
|
||||
type: "todo"
|
||||
}
|
||||
{
|
||||
op: "addTask"
|
||||
body:
|
||||
type: "todo"
|
||||
}
|
||||
]).end (res) ->
|
||||
expectCode res, 200
|
||||
# Expect number of todos to be 3 greater than the number the user started with
|
||||
expect(_.size(res.body.todos)).to.equal numTasks + 3
|
||||
# Assign new number to numTasks variable
|
||||
numTasks += 3
|
||||
request.post(baseURL + "/user/batch-update?_v=998").send([
|
||||
{
|
||||
op: "score"
|
||||
params:
|
||||
direction: "up"
|
||||
id: res.body.todos[0].id
|
||||
}
|
||||
{
|
||||
op: "score"
|
||||
params:
|
||||
direction: "up"
|
||||
id: res.body.todos[1].id
|
||||
}
|
||||
{
|
||||
op: "score"
|
||||
params:
|
||||
direction: "up"
|
||||
id: res.body.todos[2].id
|
||||
}
|
||||
]).end (res) ->
|
||||
expectCode res, 200
|
||||
expect(_.size(res.body.todos)).to.equal numTasks
|
||||
request.post(baseURL + "/user/batch-update?_v=997").send([
|
||||
{
|
||||
op: "updateTask"
|
||||
params:
|
||||
id: res.body.todos[0].id
|
||||
|
||||
body:
|
||||
dateCompleted: moment().subtract(4, "days")
|
||||
}
|
||||
{
|
||||
op: "updateTask"
|
||||
params:
|
||||
id: res.body.todos[1].id
|
||||
|
||||
body:
|
||||
dateCompleted: moment().subtract(4, "days")
|
||||
}
|
||||
]).end (res) ->
|
||||
# Expect todos to be 2 less than the total count
|
||||
expect(_.size(res.body.todos)).to.equal numTasks - 2
|
||||
done()
|
||||
|
||||
describe "Creating, Updating, Deleting Todos", ->
|
||||
todo = undefined
|
||||
updateTodo = undefined
|
||||
describe "Creating todos", ->
|
||||
it "Creates a todo", (done) ->
|
||||
request.post(baseURL + "/user/tasks").send(
|
||||
type: "todo"
|
||||
text: "Sample Todo"
|
||||
).end (res) ->
|
||||
expectCode res, 200
|
||||
todo = res.body
|
||||
expect(todo.text).to.equal "Sample Todo"
|
||||
expect(todo.id).to.be.ok
|
||||
expect(todo.value).to.equal 0
|
||||
done()
|
||||
|
||||
it "Does not create a todo with an id that already exists", (done) ->
|
||||
original_todo = {
|
||||
type: "todo"
|
||||
text: "original todo"
|
||||
id: "custom-id"
|
||||
}
|
||||
duplicate_id_todo = {
|
||||
type: "todo"
|
||||
text: "not original todo"
|
||||
id: "custom-id"
|
||||
}
|
||||
request.post(baseURL + "/user/tasks").send(
|
||||
original_todo
|
||||
).end (res) ->
|
||||
request.post(baseURL + "/user/tasks").send(
|
||||
duplicate_id_todo
|
||||
).end (res) ->
|
||||
expectCode res, 409
|
||||
expect(res.body.err).to.eql('A task with that ID already exists.')
|
||||
done()
|
||||
|
||||
describe "Updating todos", ->
|
||||
it "Does not update id of todo", (done) ->
|
||||
request.put(baseURL + "/user/tasks/" + todo.id).send(
|
||||
id: "a-new-id"
|
||||
).end (res) ->
|
||||
expectCode res, 200
|
||||
updateTodo = res.body
|
||||
expect(updateTodo.id).to.equal todo.id
|
||||
done()
|
||||
|
||||
it "Does not update type of todo", (done) ->
|
||||
request.put(baseURL + "/user/tasks/" + todo.id).send(
|
||||
type: "habit"
|
||||
).end (res) ->
|
||||
expectCode res, 200
|
||||
updateTodo = res.body
|
||||
expect(updateTodo.type).to.equal todo.type
|
||||
done()
|
||||
|
||||
it "Does update text, attribute, priority, value, notes", (done) ->
|
||||
request.put(baseURL + "/user/tasks/" + todo.id).send(
|
||||
text: "Changed Title"
|
||||
attribute: "int"
|
||||
priority: 1.5
|
||||
value: 5
|
||||
notes: "Some notes"
|
||||
).end (res) ->
|
||||
expectCode res, 200
|
||||
todo = res.body
|
||||
expect(todo.text).to.equal "Changed Title"
|
||||
expect(todo.attribute).to.equal "int"
|
||||
expect(todo.priority).to.equal 1.5
|
||||
expect(todo.value).to.equal 5
|
||||
expect(todo.notes).to.equal "Some notes"
|
||||
done()
|
||||
|
||||
describe "Deleting todos", ->
|
||||
it "Does delete todo", (done) ->
|
||||
request.del(baseURL + "/user/tasks/" + todo.id).send(
|
||||
).end (res) ->
|
||||
expectCode res, 200
|
||||
body = res.body
|
||||
expect(body).to.be.empty
|
||||
done()
|
||||
|
||||
it "Does not delete already deleted todo", (done) ->
|
||||
request.del(baseURL + "/user/tasks/" + todo.id).send(
|
||||
).end (res) ->
|
||||
expectCode res, 404
|
||||
body = res.body
|
||||
expect(body.err).to.equal "Task not found."
|
||||
done()
|
||||
|
||||
it "Does not update text, attribute, priority, value, notes if task is already deleted", (done) ->
|
||||
request.put(baseURL + "/user/tasks/" + todo.id).send(
|
||||
text: "New Title"
|
||||
attribute: "str"
|
||||
priority: 1
|
||||
value: 4
|
||||
notes: "Other notes"
|
||||
).end (res) ->
|
||||
expectCode res, 404
|
||||
body = res.body
|
||||
expect(body.err).to.equal "Task not found."
|
||||
done()
|
||||
@@ -1,194 +0,0 @@
|
||||
'use strict'
|
||||
|
||||
User = require("../../website/src/models/user").model
|
||||
app = require("../../website/src/server")
|
||||
|
||||
describe "Users", ->
|
||||
|
||||
describe "Deleting Users", ->
|
||||
|
||||
before (done) ->
|
||||
registerNewUser ->
|
||||
done()
|
||||
, true
|
||||
|
||||
it 'Should delete a user', (done) ->
|
||||
async.waterfall [
|
||||
(cb) ->
|
||||
registerManyUsers 1, cb
|
||||
|
||||
(_userToDelete, cb) ->
|
||||
userToDelete = _userToDelete[0]
|
||||
request.del(baseURL + "/user")
|
||||
.set("X-API-User", userToDelete._id)
|
||||
.set("X-API-Key", userToDelete.apiToken)
|
||||
.end (res) ->
|
||||
expectCode res, 200
|
||||
request.get(baseURL + "/user/" + userToDelete._id)
|
||||
.end (res) ->
|
||||
expectCode res, 404
|
||||
cb()
|
||||
|
||||
], done
|
||||
|
||||
it "Should choose a new group leader when deleting a user", (done) ->
|
||||
userToDelete = undefined
|
||||
userToBecomeLeader = undefined
|
||||
guildToHaveNewLeader = undefined
|
||||
async.waterfall [
|
||||
(cb) ->
|
||||
registerManyUsers 2, cb
|
||||
|
||||
(_users, cb) ->
|
||||
userToDelete = _users[0]
|
||||
userToBecomeLeader = _users[1]
|
||||
User.findByIdAndUpdate userToDelete._id,
|
||||
$set:
|
||||
"balance": 4
|
||||
, (err, _user) ->
|
||||
cb()
|
||||
|
||||
(cb) ->
|
||||
request.post(baseURL + "/groups").send(
|
||||
name: "GuildToGainNewLeader"
|
||||
type: "guild"
|
||||
)
|
||||
.set("X-API-User", userToDelete._id)
|
||||
.set("X-API-Key", userToDelete.apiToken)
|
||||
.end (res) ->
|
||||
expectCode res, 200
|
||||
guildToHaveNewLeader = res.body
|
||||
expect(guildToHaveNewLeader.leader).to.eql(userToDelete._id)
|
||||
cb()
|
||||
|
||||
(cb) ->
|
||||
inviteURL = baseURL + "/groups/" + guildToHaveNewLeader._id + "/invite"
|
||||
request.post(inviteURL)
|
||||
.send( uuids: [userToBecomeLeader._id])
|
||||
.end (res) ->
|
||||
expectCode res, 200
|
||||
cb()
|
||||
|
||||
(cb) ->
|
||||
request.post(baseURL + "/groups/" + guildToHaveNewLeader._id + "/join")
|
||||
.set("X-API-User", userToBecomeLeader._id)
|
||||
.set("X-API-Key", userToBecomeLeader.apiToken)
|
||||
.end (res) ->
|
||||
expectCode res, 200
|
||||
cb()
|
||||
|
||||
(cb) ->
|
||||
request.del(baseURL + "/user")
|
||||
.set("X-API-User", userToDelete._id)
|
||||
.set("X-API-Key", userToDelete.apiToken)
|
||||
.end (res) ->
|
||||
expectCode res, 200
|
||||
cb()
|
||||
|
||||
(cb) ->
|
||||
request.get(baseURL + "/groups/" + guildToHaveNewLeader._id)
|
||||
.set("X-API-User", userToBecomeLeader._id)
|
||||
.set("X-API-Key", userToBecomeLeader.apiToken)
|
||||
.end (res) ->
|
||||
expectCode res, 200
|
||||
g = res.body
|
||||
userInGroup = _.find(g.members, (member) -> return member._id == userToDelete._id; )
|
||||
expect(userInGroup).to.equal(undefined)
|
||||
expect(g.leader._id).to.equal(userToBecomeLeader._id)
|
||||
cb()
|
||||
|
||||
], done
|
||||
|
||||
it 'Should remove a user from a group when deleting a user', (done) ->
|
||||
userToDelete = undefined
|
||||
guild = undefined
|
||||
party = undefined
|
||||
User.findByIdAndUpdate user._id,
|
||||
$set:
|
||||
"balance": 4
|
||||
, (err, _user) ->
|
||||
async.waterfall [
|
||||
(cb) ->
|
||||
request.post(baseURL + "/groups").send(
|
||||
name: "TestPrivateGroup"
|
||||
type: "party"
|
||||
)
|
||||
.end (res) ->
|
||||
expectCode res, 200
|
||||
party = res.body
|
||||
cb()
|
||||
|
||||
(cb) ->
|
||||
request.post(baseURL + "/groups").send(
|
||||
name: "TestPrivateGroup"
|
||||
type: "guild"
|
||||
)
|
||||
.end (res) ->
|
||||
expectCode res, 200
|
||||
guild = res.body
|
||||
cb()
|
||||
|
||||
(cb) ->
|
||||
registerManyUsers 1, cb
|
||||
|
||||
# Send them invitations
|
||||
(_users, cb) ->
|
||||
userToDelete = _users[0]
|
||||
inviteURL = baseURL + "/groups/" + party._id + "/invite"
|
||||
request.post(inviteURL)
|
||||
.send( uuids: [userToDelete._id])
|
||||
.end (res) ->
|
||||
expectCode res, 200
|
||||
cb()
|
||||
|
||||
(cb) ->
|
||||
inviteURL = baseURL + "/groups/" + guild._id + "/invite"
|
||||
request.post(inviteURL)
|
||||
.send( uuids: [userToDelete._id])
|
||||
.end (res) ->
|
||||
expectCode res, 200
|
||||
cb()
|
||||
|
||||
(cb) ->
|
||||
request.post(baseURL + "/groups/" + party._id + "/join")
|
||||
.set("X-API-User", userToDelete._id)
|
||||
.set("X-API-Key", userToDelete.apiToken)
|
||||
.end (res) ->
|
||||
expectCode res, 200
|
||||
cb()
|
||||
|
||||
(cb) ->
|
||||
request.post(baseURL + "/groups/" + guild._id + "/join")
|
||||
.set("X-API-User", userToDelete._id)
|
||||
.set("X-API-Key", userToDelete.apiToken)
|
||||
.end (res) ->
|
||||
expectCode res, 200
|
||||
cb()
|
||||
|
||||
(cb) ->
|
||||
request.del(baseURL + "/user")
|
||||
.set("X-API-User", userToDelete._id)
|
||||
.set("X-API-Key", userToDelete.apiToken)
|
||||
.end (res) ->
|
||||
expectCode res, 200
|
||||
cb()
|
||||
|
||||
(cb) ->
|
||||
request.get(baseURL + "/groups/" + party._id)
|
||||
.end (res) ->
|
||||
expectCode res, 200
|
||||
g = res.body
|
||||
userInGroup = _.find(g.members, (member) -> return member._id == userToDelete._id; )
|
||||
expect(userInGroup).to.equal(undefined)
|
||||
cb()
|
||||
|
||||
(cb) ->
|
||||
request.get(baseURL + "/groups/" + guild._id)
|
||||
.end (res) ->
|
||||
expectCode res, 200
|
||||
g = res.body
|
||||
userInGroup = _.find(g.members, (member) -> return member._id == userToDelete._id; );
|
||||
expect(userInGroup).to.equal(undefined)
|
||||
cb()
|
||||
|
||||
], done
|
||||
Reference in New Issue
Block a user