mirror of
https://github.com/HabitRPG/habitica.git
synced 2025-12-17 22:57:21 +01:00
Merge branch 'develop' into hairlessbear-quest_invite_modal_on_user_sync
This commit is contained in:
100
test/api/chat.coffee
Normal file
100
test/api/chat.coffee
Normal file
@@ -0,0 +1,100 @@
|
||||
'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()
|
||||
@@ -5,560 +5,314 @@ diff = require("deep-diff")
|
||||
Group = require("../../website/src/models/group").model
|
||||
app = require("../../website/src/server")
|
||||
|
||||
describe "Groups", ->
|
||||
|
||||
describe "Guilds", ->
|
||||
|
||||
describe "Guilds", ->
|
||||
context "creating groups", ->
|
||||
before (done) ->
|
||||
registerNewUser ->
|
||||
User.findByIdAndUpdate user._id,
|
||||
$set:
|
||||
"balance": 4
|
||||
"balance": 10
|
||||
, (err, _user) ->
|
||||
done()
|
||||
, true
|
||||
|
||||
describe "Private Guilds", ->
|
||||
guild = undefined
|
||||
before (done) ->
|
||||
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: "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)
|
||||
name: "TestGroup"
|
||||
type: "guild",
|
||||
)
|
||||
.set("X-API-User", user_with_0_gems._id)
|
||||
.set("X-API-Key", user_with_0_gems.apiToken)
|
||||
.end (res) ->
|
||||
g = res.body
|
||||
userInGroup = _.find g.members, (member) -> return member._id == user._id
|
||||
expect(userInGroup).to.exist
|
||||
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 "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", ->
|
||||
guild = undefined
|
||||
before (done) ->
|
||||
request.post(baseURL + "/groups").send(
|
||||
name: "TestPublicGroup"
|
||||
type: "guild"
|
||||
privacy: "public"
|
||||
).end (res) ->
|
||||
it "transforms members array to an arrray of user objects", (done) ->
|
||||
request.get(baseURL + "/groups/" + guild._id)
|
||||
.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 = 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()
|
||||
|
||||
(_members, cb) ->
|
||||
members = _members
|
||||
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()
|
||||
|
||||
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)
|
||||
it "can list guilds", (done) ->
|
||||
request.get(baseURL + "/groups").send()
|
||||
.end (res) ->
|
||||
expectCode res, 200
|
||||
guild = res.body[0]
|
||||
expect(guild).to.exist
|
||||
done()
|
||||
|
||||
async.map members, joinGuild, (err, results) -> cb()
|
||||
], 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()
|
||||
|
||||
context "is a member", ->
|
||||
before (done) ->
|
||||
registerNewUser ->
|
||||
request.post(baseURL + "/groups/" + guild._id + "/join")
|
||||
.end ->
|
||||
done()
|
||||
, true
|
||||
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 "includes user in public group member list", (done) ->
|
||||
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()
|
||||
|
||||
request.get(baseURL + "/groups/" + guild._id)
|
||||
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()
|
||||
|
||||
context "removing users groups", ->
|
||||
it "allows guild leaders to remove a member", (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=" + userToRemove._id)
|
||||
.send().end (res) ->
|
||||
expectCode res, 204
|
||||
cb()
|
||||
|
||||
(cb) ->
|
||||
request.get(baseURL + "/groups/" + guildToRemoveMember._id)
|
||||
.send()
|
||||
.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.be.ok
|
||||
done()
|
||||
userInGroup = _.find g.members, (member) -> return member._id == userToRemove._id
|
||||
expect(userInGroup).to.not.exist
|
||||
cb()
|
||||
|
||||
], done
|
||||
|
||||
context "is not a member", ->
|
||||
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
|
||||
|
||||
before (done) ->
|
||||
registerNewUser done, true
|
||||
(_members, cb) ->
|
||||
members = _members
|
||||
|
||||
it "excludes user in public group member list", (done) ->
|
||||
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) ->
|
||||
g = res.body
|
||||
expect(g.members.length).to.equal 15
|
||||
userInGroup = _.find g.members, (member) -> return member._id == user._id
|
||||
expect(userInGroup).to.not.be.ok
|
||||
done()
|
||||
.end (res) ->
|
||||
expect res, 404
|
||||
done()
|
||||
|
||||
describe "Party", ->
|
||||
|
||||
group = undefined
|
||||
describe "Public Guilds", ->
|
||||
guild = undefined
|
||||
before (done) ->
|
||||
async.waterfall [
|
||||
(cb) ->
|
||||
registerNewUser(cb, true)
|
||||
, (user, cb) ->
|
||||
registerNewUser ->
|
||||
User.findByIdAndUpdate user._id, {$set: { "balance": 10 } }, (err, _user) ->
|
||||
cb()
|
||||
, true
|
||||
(cb) ->
|
||||
request.post(baseURL + "/groups").send(
|
||||
name: "TestGroup"
|
||||
type: "party"
|
||||
name: "TestPublicGroup"
|
||||
type: "guild"
|
||||
privacy: "public"
|
||||
).end (res) ->
|
||||
expectCode res, 200
|
||||
group = res.body
|
||||
expect(group.members.length).to.equal 1
|
||||
expect(group.leader).to.equal user._id
|
||||
done()
|
||||
]
|
||||
guild = res.body
|
||||
expect(guild.members.length).to.equal 1
|
||||
expect(guild.leader).to.equal user._id
|
||||
#Add members to guild
|
||||
cb()
|
||||
|
||||
it "can be found by querying for party", (done) ->
|
||||
request.get(baseURL + "/groups/").send(
|
||||
type: "party"
|
||||
).end (res) ->
|
||||
expectCode res, 200
|
||||
(cb) ->
|
||||
registerManyUsers 15, cb
|
||||
|
||||
party = res.body[0]
|
||||
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()
|
||||
(_members, cb) ->
|
||||
members = _members
|
||||
|
||||
describe "Chat", ->
|
||||
chat = undefined
|
||||
it "Posts a message to party chat", (done) ->
|
||||
msg = "TestMsg"
|
||||
request.post(baseURL + "/groups/" + group._id + "/chat?message=" + msg).send(
|
||||
).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.ok
|
||||
expect(chat.likes).to.be.empty
|
||||
expect(chat.flags).to.be.empty
|
||||
expect(chat.flagCount).to.equal 0
|
||||
expect(chat.uuid).to.be.ok
|
||||
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()
|
||||
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)
|
||||
|
||||
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()
|
||||
async.map members, joinGuild, (err, results) -> cb()
|
||||
|
||||
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()
|
||||
], 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()
|
||||
|
||||
describe "Quests", ->
|
||||
party = undefined
|
||||
participating = []
|
||||
notParticipating = []
|
||||
context "is a member", ->
|
||||
before (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()
|
||||
registerNewUser ->
|
||||
request.post(baseURL + "/groups/" + guild._id + "/join")
|
||||
.end (res)->
|
||||
done()
|
||||
, true
|
||||
|
||||
# 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) ->
|
||||
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
|
||||
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()
|
||||
|
||||
# Invite some members
|
||||
async.waterfall [
|
||||
|
||||
# Register new users
|
||||
(cb) ->
|
||||
registerManyUsers 3, cb
|
||||
context "is not a member", ->
|
||||
before (done) ->
|
||||
registerNewUser done, true
|
||||
|
||||
# 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()
|
||||
|
||||
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
|
||||
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()
|
||||
|
||||
464
test/api/party.coffee
Normal file
464
test/api/party.coffee
Normal file
@@ -0,0 +1,464 @@
|
||||
'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 = []
|
||||
before (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()
|
||||
|
||||
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,4 +1,7 @@
|
||||
'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')
|
||||
@@ -78,7 +81,6 @@ describe "Push-Notifications", ->
|
||||
recipient = null
|
||||
|
||||
groups = rewire("../../website/src/controllers/groups")
|
||||
groups.__set__('questStart', -> true)
|
||||
groups.__set__('pushNotify', pushSpy)
|
||||
|
||||
before (done) ->
|
||||
@@ -152,6 +154,7 @@ describe "Push-Notifications", ->
|
||||
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' }
|
||||
@@ -173,6 +176,51 @@ describe "Push-Notifications", ->
|
||||
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) ->
|
||||
cb(null, user)
|
||||
}
|
||||
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
|
||||
|
||||
@@ -97,6 +97,27 @@ describe "Todos", ->
|
||||
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(
|
||||
|
||||
Reference in New Issue
Block a user