mirror of
https://github.com/HabitRPG/habitica.git
synced 2025-12-17 22:57:21 +01:00
Remove extraneous anonymous function.
This commit is contained in:
@@ -1,60 +1,32 @@
|
|||||||
(function() {
|
var Challenge, Group, app;
|
||||||
'use strict';
|
|
||||||
var Challenge, Group, app;
|
|
||||||
|
|
||||||
app = require("../../website/src/server");
|
app = require("../../website/src/server");
|
||||||
|
|
||||||
Group = require("../../website/src/models/group").model;
|
Group = require("../../website/src/models/group").model;
|
||||||
|
|
||||||
Challenge = require("../../website/src/models/challenge").model;
|
Challenge = require("../../website/src/models/challenge").model;
|
||||||
|
|
||||||
describe("Challenges", function() {
|
describe("Challenges", function() {
|
||||||
var challenge, group, updateTodo;
|
var challenge, group, updateTodo;
|
||||||
challenge = void 0;
|
challenge = void 0;
|
||||||
updateTodo = void 0;
|
updateTodo = void 0;
|
||||||
group = void 0;
|
group = void 0;
|
||||||
beforeEach(function(done) {
|
beforeEach(function(done) {
|
||||||
return async.waterfall([
|
return async.waterfall([
|
||||||
function(cb) {
|
function(cb) {
|
||||||
return registerNewUser(cb, true);
|
return registerNewUser(cb, true);
|
||||||
}, function(user, cb) {
|
}, function(user, cb) {
|
||||||
return request.post(baseURL + "/groups").send({
|
return request.post(baseURL + "/groups").send({
|
||||||
name: "TestGroup",
|
name: "TestGroup",
|
||||||
type: "party"
|
type: "party"
|
||||||
}).end(function(err, res) {
|
}).end(function(err, res) {
|
||||||
expectCode(res, 200);
|
expectCode(res, 200);
|
||||||
group = res.body;
|
group = res.body;
|
||||||
expect(group.members.length).to.equal(1);
|
expect(group.members.length).to.equal(1);
|
||||||
expect(group.leader).to.equal(user._id);
|
expect(group.leader).to.equal(user._id);
|
||||||
return cb();
|
return cb();
|
||||||
});
|
});
|
||||||
}, function(cb) {
|
}, function(cb) {
|
||||||
return 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(function(err, res) {
|
|
||||||
challenge = res.body;
|
|
||||||
return done();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
]);
|
|
||||||
});
|
|
||||||
describe('POST /challenge', function() {
|
|
||||||
return it("Creates a challenge", function(done) {
|
|
||||||
return request.post(baseURL + "/challenges").send({
|
return request.post(baseURL + "/challenges").send({
|
||||||
group: group._id,
|
group: group._id,
|
||||||
dailys: [
|
dailys: [
|
||||||
@@ -68,343 +40,240 @@
|
|||||||
type: "todo",
|
type: "todo",
|
||||||
text: "Challenge Todo 1",
|
text: "Challenge Todo 1",
|
||||||
notes: "Challenge Notes"
|
notes: "Challenge Notes"
|
||||||
}, {
|
|
||||||
type: "todo",
|
|
||||||
text: "Challenge Todo 2",
|
|
||||||
notes: "Challenge Notes"
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
rewards: [],
|
rewards: [],
|
||||||
habits: [],
|
habits: []
|
||||||
official: true
|
|
||||||
}).end(function(err, res) {
|
}).end(function(err, res) {
|
||||||
expectCode(res, 200);
|
|
||||||
return async.parallel([
|
|
||||||
function(cb) {
|
|
||||||
return User.findById(user._id, cb);
|
|
||||||
}, function(cb) {
|
|
||||||
return Challenge.findById(res.body._id, cb);
|
|
||||||
}
|
|
||||||
], function(err, results) {
|
|
||||||
var user;
|
|
||||||
user = results[0];
|
|
||||||
challenge = results[1];
|
|
||||||
expect(user.dailys[user.dailys.length - 1].text).to.equal("Challenge Daily");
|
|
||||||
expect(challenge.official).to.equal(false);
|
|
||||||
return done();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
describe('POST /challenge/:cid', function() {
|
|
||||||
it("updates the notes on user's version of a challenge task's note without updating the challenge", function(done) {
|
|
||||||
updateTodo = challenge.todos[0];
|
|
||||||
updateTodo.notes = "User overriden notes";
|
|
||||||
return async.waterfall([
|
|
||||||
function(cb) {
|
|
||||||
return request.put(baseURL + "/user/tasks/" + updateTodo.id).send(updateTodo).end(function(err, res) {
|
|
||||||
return cb();
|
|
||||||
});
|
|
||||||
}, function(cb) {
|
|
||||||
return Challenge.findById(challenge._id, cb);
|
|
||||||
}, function(chal, cb) {
|
|
||||||
expect(chal.todos[0].notes).to.eql("Challenge Notes");
|
|
||||||
return cb();
|
|
||||||
}, function(cb) {
|
|
||||||
return request.get(baseURL + "/user/tasks/" + updateTodo.id).end(function(err, res) {
|
|
||||||
expect(res.body.notes).to.eql("User overriden notes");
|
|
||||||
return done();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
]);
|
|
||||||
});
|
|
||||||
it("changes user's copy of challenge tasks when the challenge is updated", function(done) {
|
|
||||||
challenge.dailys[0].text = "Updated Daily";
|
|
||||||
return request.post(baseURL + "/challenges/" + challenge._id).send(challenge).end(function(err, res) {
|
|
||||||
challenge = res.body;
|
challenge = res.body;
|
||||||
expect(challenge.dailys[0].text).to.equal("Updated Daily");
|
return done();
|
||||||
return User.findById(user._id, function(err, _user) {
|
|
||||||
expectCode(res, 200);
|
|
||||||
expect(_user.dailys[_user.dailys.length - 1].text).to.equal("Updated Daily");
|
|
||||||
return done();
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
});
|
}
|
||||||
it("does not changes user's notes on tasks when challenge task notes are updated", function(done) {
|
]);
|
||||||
challenge.todos[0].notes = "Challenge Updated Todo Notes";
|
});
|
||||||
return request.post(baseURL + "/challenges/" + challenge._id).send(challenge).end(function(err, res) {
|
describe('POST /challenge', function() {
|
||||||
challenge = res.body;
|
return it("Creates a challenge", function(done) {
|
||||||
expect(challenge.todos[0].notes).to.equal("Challenge Updated Todo Notes");
|
return request.post(baseURL + "/challenges").send({
|
||||||
return User.findById(user._id, function(err, _user) {
|
group: group._id,
|
||||||
expectCode(res, 200);
|
dailys: [
|
||||||
expect(_user.todos[_user.todos.length - 1].notes).to.equal("Challenge Notes");
|
{
|
||||||
return done();
|
type: "daily",
|
||||||
});
|
text: "Challenge Daily"
|
||||||
});
|
|
||||||
});
|
|
||||||
return it("shows user notes on challenge page", function(done) {
|
|
||||||
updateTodo = challenge.todos[0];
|
|
||||||
updateTodo.notes = "User overriden notes";
|
|
||||||
return async.waterfall([
|
|
||||||
function(cb) {
|
|
||||||
return request.put(baseURL + "/user/tasks/" + updateTodo.id).send(updateTodo).end(function(err, res) {
|
|
||||||
return cb();
|
|
||||||
});
|
|
||||||
}, function(cb) {
|
|
||||||
return Challenge.findById(challenge._id, cb);
|
|
||||||
}, function(chal, cb) {
|
|
||||||
expect(chal.todos[0].notes).to.eql("Challenge Notes");
|
|
||||||
return cb();
|
|
||||||
}, function(cb) {
|
|
||||||
return request.get(baseURL + "/challenges/" + challenge._id + "/member/" + user._id).end(function(err, res) {
|
|
||||||
expect(res.body.todos[res.body.todos.length - 1].notes).to.equal("User overriden notes");
|
|
||||||
return done();
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
]);
|
],
|
||||||
});
|
todos: [
|
||||||
});
|
{
|
||||||
it("Complete To-Dos", function(done) {
|
type: "todo",
|
||||||
return User.findById(user._id, function(err, _user) {
|
text: "Challenge Todo 1",
|
||||||
var numTasks, u;
|
notes: "Challenge Notes"
|
||||||
u = _user;
|
}, {
|
||||||
numTasks = _.size(u.todos);
|
type: "todo",
|
||||||
return request.post(baseURL + "/user/tasks/" + u.todos[0].id + "/up").end(function(err, res) {
|
text: "Challenge Todo 2",
|
||||||
return request.post(baseURL + "/user/tasks/clear-completed").end(function(err, res) {
|
notes: "Challenge Notes"
|
||||||
expect(_.size(res.body)).to.equal(numTasks - 1);
|
}
|
||||||
return done();
|
],
|
||||||
});
|
rewards: [],
|
||||||
});
|
habits: [],
|
||||||
});
|
official: true
|
||||||
});
|
}).end(function(err, res) {
|
||||||
it("Challenge deleted, breaks task link", function(done) {
|
expectCode(res, 200);
|
||||||
var itThis;
|
|
||||||
itThis = this;
|
|
||||||
return request.del(baseURL + "/challenges/" + challenge._id).end(function(err, res) {
|
|
||||||
return User.findById(user._id, function(err, user) {
|
|
||||||
var daily, len, unset;
|
|
||||||
len = user.dailys.length - 1;
|
|
||||||
daily = user.dailys[user.dailys.length - 1];
|
|
||||||
expect(daily.challenge.broken).to.equal("CHALLENGE_DELETED");
|
|
||||||
unset = {
|
|
||||||
$unset: {}
|
|
||||||
};
|
|
||||||
unset["$unset"]["dailys." + len + ".challenge.broken"] = 1;
|
|
||||||
return User.findByIdAndUpdate(user._id, unset, {
|
|
||||||
"new": true
|
|
||||||
}, function(err, user) {
|
|
||||||
expect(err).to.not.exist;
|
|
||||||
expect(user.dailys[len].challenge.broken).to.not.exist;
|
|
||||||
return request.post(baseURL + "/user/tasks/" + daily.id + "/up").end(function(err, res) {
|
|
||||||
return setTimeout((function() {
|
|
||||||
return User.findById(user._id, function(err, user) {
|
|
||||||
expect(user.dailys[len].challenge.broken).to.equal("CHALLENGE_DELETED");
|
|
||||||
return done();
|
|
||||||
});
|
|
||||||
}), 100);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
it("admin creates a challenge", function(done) {
|
|
||||||
return User.findByIdAndUpdate(user._id, {
|
|
||||||
$set: {
|
|
||||||
"contributor.admin": true
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
"new": true
|
|
||||||
}, function(err, _user) {
|
|
||||||
expect(err).to.not.exist;
|
|
||||||
return async.parallel([
|
return async.parallel([
|
||||||
function(cb) {
|
function(cb) {
|
||||||
return request.post(baseURL + "/challenges").send({
|
return User.findById(user._id, cb);
|
||||||
group: group._id,
|
|
||||||
dailys: [],
|
|
||||||
todos: [],
|
|
||||||
rewards: [],
|
|
||||||
habits: [],
|
|
||||||
official: false
|
|
||||||
}).end(function(err, res) {
|
|
||||||
expect(res.body.official).to.equal(false);
|
|
||||||
return cb();
|
|
||||||
});
|
|
||||||
}, function(cb) {
|
}, function(cb) {
|
||||||
return request.post(baseURL + "/challenges").send({
|
return Challenge.findById(res.body._id, cb);
|
||||||
group: group._id,
|
|
||||||
dailys: [],
|
|
||||||
todos: [],
|
|
||||||
rewards: [],
|
|
||||||
habits: [],
|
|
||||||
official: true
|
|
||||||
}).end(function(err, res) {
|
|
||||||
expect(res.body.official).to.equal(true);
|
|
||||||
return cb();
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
], done);
|
], function(err, results) {
|
||||||
|
var user;
|
||||||
|
user = results[0];
|
||||||
|
challenge = results[1];
|
||||||
|
expect(user.dailys[user.dailys.length - 1].text).to.equal("Challenge Daily");
|
||||||
|
expect(challenge.official).to.equal(false);
|
||||||
|
return done();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
it("User creates a non-tavern challenge with prize, deletes it, gets refund", function(done) {
|
});
|
||||||
return User.findByIdAndUpdate(user._id, {
|
describe('POST /challenge/:cid', function() {
|
||||||
$set: {
|
it("updates the notes on user's version of a challenge task's note without updating the challenge", function(done) {
|
||||||
"balance": 8
|
updateTodo = challenge.todos[0];
|
||||||
|
updateTodo.notes = "User overriden notes";
|
||||||
|
return async.waterfall([
|
||||||
|
function(cb) {
|
||||||
|
return request.put(baseURL + "/user/tasks/" + updateTodo.id).send(updateTodo).end(function(err, res) {
|
||||||
|
return cb();
|
||||||
|
});
|
||||||
|
}, function(cb) {
|
||||||
|
return Challenge.findById(challenge._id, cb);
|
||||||
|
}, function(chal, cb) {
|
||||||
|
expect(chal.todos[0].notes).to.eql("Challenge Notes");
|
||||||
|
return cb();
|
||||||
|
}, function(cb) {
|
||||||
|
return request.get(baseURL + "/user/tasks/" + updateTodo.id).end(function(err, res) {
|
||||||
|
expect(res.body.notes).to.eql("User overriden notes");
|
||||||
|
return done();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}, {
|
]);
|
||||||
"new": true
|
});
|
||||||
}, function(err, user) {
|
it("changes user's copy of challenge tasks when the challenge is updated", function(done) {
|
||||||
expect(err).to.not.be.ok;
|
challenge.dailys[0].text = "Updated Daily";
|
||||||
return request.post(baseURL + "/challenges").send({
|
return request.post(baseURL + "/challenges/" + challenge._id).send(challenge).end(function(err, res) {
|
||||||
group: group._id,
|
challenge = res.body;
|
||||||
dailys: [],
|
expect(challenge.dailys[0].text).to.equal("Updated Daily");
|
||||||
todos: [],
|
return User.findById(user._id, function(err, _user) {
|
||||||
rewards: [],
|
expectCode(res, 200);
|
||||||
habits: [],
|
expect(_user.dailys[_user.dailys.length - 1].text).to.equal("Updated Daily");
|
||||||
prize: 10
|
return done();
|
||||||
}).end(function(err, res) {
|
});
|
||||||
expect(res.body.prize).to.equal(10);
|
});
|
||||||
return async.parallel([
|
});
|
||||||
function(cb) {
|
it("does not changes user's notes on tasks when challenge task notes are updated", function(done) {
|
||||||
return User.findById(user._id, cb);
|
challenge.todos[0].notes = "Challenge Updated Todo Notes";
|
||||||
}, function(cb) {
|
return request.post(baseURL + "/challenges/" + challenge._id).send(challenge).end(function(err, res) {
|
||||||
return Challenge.findById(res.body._id, cb);
|
challenge = res.body;
|
||||||
}
|
expect(challenge.todos[0].notes).to.equal("Challenge Updated Todo Notes");
|
||||||
], function(err, results) {
|
return User.findById(user._id, function(err, _user) {
|
||||||
user = results[0];
|
expectCode(res, 200);
|
||||||
challenge = results[1];
|
expect(_user.todos[_user.todos.length - 1].notes).to.equal("Challenge Notes");
|
||||||
expect(user.balance).to.equal(5.5);
|
return done();
|
||||||
return request.del(baseURL + "/challenges/" + challenge._id).end(function(err, res) {
|
});
|
||||||
return User.findById(user._id, function(err, _user) {
|
});
|
||||||
expect(_user.balance).to.equal(8);
|
});
|
||||||
|
return it("shows user notes on challenge page", function(done) {
|
||||||
|
updateTodo = challenge.todos[0];
|
||||||
|
updateTodo.notes = "User overriden notes";
|
||||||
|
return async.waterfall([
|
||||||
|
function(cb) {
|
||||||
|
return request.put(baseURL + "/user/tasks/" + updateTodo.id).send(updateTodo).end(function(err, res) {
|
||||||
|
return cb();
|
||||||
|
});
|
||||||
|
}, function(cb) {
|
||||||
|
return Challenge.findById(challenge._id, cb);
|
||||||
|
}, function(chal, cb) {
|
||||||
|
expect(chal.todos[0].notes).to.eql("Challenge Notes");
|
||||||
|
return cb();
|
||||||
|
}, function(cb) {
|
||||||
|
return request.get(baseURL + "/challenges/" + challenge._id + "/member/" + user._id).end(function(err, res) {
|
||||||
|
expect(res.body.todos[res.body.todos.length - 1].notes).to.equal("User overriden notes");
|
||||||
|
return done();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
]);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
it("Complete To-Dos", function(done) {
|
||||||
|
return User.findById(user._id, function(err, _user) {
|
||||||
|
var numTasks, u;
|
||||||
|
u = _user;
|
||||||
|
numTasks = _.size(u.todos);
|
||||||
|
return request.post(baseURL + "/user/tasks/" + u.todos[0].id + "/up").end(function(err, res) {
|
||||||
|
return request.post(baseURL + "/user/tasks/clear-completed").end(function(err, res) {
|
||||||
|
expect(_.size(res.body)).to.equal(numTasks - 1);
|
||||||
|
return done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
it("Challenge deleted, breaks task link", function(done) {
|
||||||
|
var itThis;
|
||||||
|
itThis = this;
|
||||||
|
return request.del(baseURL + "/challenges/" + challenge._id).end(function(err, res) {
|
||||||
|
return User.findById(user._id, function(err, user) {
|
||||||
|
var daily, len, unset;
|
||||||
|
len = user.dailys.length - 1;
|
||||||
|
daily = user.dailys[user.dailys.length - 1];
|
||||||
|
expect(daily.challenge.broken).to.equal("CHALLENGE_DELETED");
|
||||||
|
unset = {
|
||||||
|
$unset: {}
|
||||||
|
};
|
||||||
|
unset["$unset"]["dailys." + len + ".challenge.broken"] = 1;
|
||||||
|
return User.findByIdAndUpdate(user._id, unset, {
|
||||||
|
"new": true
|
||||||
|
}, function(err, user) {
|
||||||
|
expect(err).to.not.exist;
|
||||||
|
expect(user.dailys[len].challenge.broken).to.not.exist;
|
||||||
|
return request.post(baseURL + "/user/tasks/" + daily.id + "/up").end(function(err, res) {
|
||||||
|
return setTimeout((function() {
|
||||||
|
return User.findById(user._id, function(err, user) {
|
||||||
|
expect(user.dailys[len].challenge.broken).to.equal("CHALLENGE_DELETED");
|
||||||
return done();
|
return done();
|
||||||
});
|
});
|
||||||
});
|
}), 100);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
it("User creates a tavern challenge with prize, deletes it, and does not get refund", function(done) {
|
});
|
||||||
return User.findByIdAndUpdate(user._id, {
|
it("admin creates a challenge", function(done) {
|
||||||
$set: {
|
return User.findByIdAndUpdate(user._id, {
|
||||||
"balance": 8
|
$set: {
|
||||||
}
|
"contributor.admin": true
|
||||||
}, {
|
}
|
||||||
"new": true
|
}, {
|
||||||
}, function(err, user) {
|
"new": true
|
||||||
expect(err).to.not.be.ok;
|
}, function(err, _user) {
|
||||||
return request.post(baseURL + "/challenges").send({
|
expect(err).to.not.exist;
|
||||||
group: 'habitrpg',
|
return async.parallel([
|
||||||
dailys: [],
|
function(cb) {
|
||||||
todos: [],
|
return request.post(baseURL + "/challenges").send({
|
||||||
rewards: [],
|
group: group._id,
|
||||||
habits: [],
|
dailys: [],
|
||||||
prize: 10
|
todos: [],
|
||||||
}).end(function(err, res) {
|
rewards: [],
|
||||||
expect(res.body.prize).to.equal(10);
|
habits: [],
|
||||||
return async.parallel([
|
official: false
|
||||||
function(cb) {
|
}).end(function(err, res) {
|
||||||
return User.findById(user._id, cb);
|
expect(res.body.official).to.equal(false);
|
||||||
}, function(cb) {
|
return cb();
|
||||||
return Challenge.findById(res.body._id, cb);
|
|
||||||
}
|
|
||||||
], function(err, results) {
|
|
||||||
user = results[0];
|
|
||||||
challenge = results[1];
|
|
||||||
expect(user.balance).to.equal(5.5);
|
|
||||||
return request.del(baseURL + "/challenges/" + challenge._id).end(function(err, res) {
|
|
||||||
return User.findById(user._id, function(err, _user) {
|
|
||||||
expect(_user.balance).to.equal(5.5);
|
|
||||||
return done();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
});
|
}, function(cb) {
|
||||||
});
|
return request.post(baseURL + "/challenges").send({
|
||||||
|
group: group._id,
|
||||||
|
dailys: [],
|
||||||
|
todos: [],
|
||||||
|
rewards: [],
|
||||||
|
habits: [],
|
||||||
|
official: true
|
||||||
|
}).end(function(err, res) {
|
||||||
|
expect(res.body.official).to.equal(true);
|
||||||
|
return cb();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
], done);
|
||||||
});
|
});
|
||||||
return describe("non-owner permissions", function() {
|
});
|
||||||
challenge = void 0;
|
it("User creates a non-tavern challenge with prize, deletes it, gets refund", function(done) {
|
||||||
beforeEach(function(done) {
|
return User.findByIdAndUpdate(user._id, {
|
||||||
return async.waterfall([
|
$set: {
|
||||||
|
"balance": 8
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
"new": true
|
||||||
|
}, function(err, user) {
|
||||||
|
expect(err).to.not.be.ok;
|
||||||
|
return request.post(baseURL + "/challenges").send({
|
||||||
|
group: group._id,
|
||||||
|
dailys: [],
|
||||||
|
todos: [],
|
||||||
|
rewards: [],
|
||||||
|
habits: [],
|
||||||
|
prize: 10
|
||||||
|
}).end(function(err, res) {
|
||||||
|
expect(res.body.prize).to.equal(10);
|
||||||
|
return async.parallel([
|
||||||
function(cb) {
|
function(cb) {
|
||||||
return request.post(baseURL + "/challenges").send({
|
return User.findById(user._id, cb);
|
||||||
group: group._id,
|
|
||||||
name: 'challenge name',
|
|
||||||
dailys: [
|
|
||||||
{
|
|
||||||
type: "daily",
|
|
||||||
text: "Challenge Daily"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}).end(function(err, res) {
|
|
||||||
challenge = res.body;
|
|
||||||
return cb();
|
|
||||||
});
|
|
||||||
}, function(cb) {
|
}, function(cb) {
|
||||||
return registerNewUser(done, true);
|
return Challenge.findById(res.body._id, cb);
|
||||||
}
|
}
|
||||||
]);
|
], function(err, results) {
|
||||||
});
|
user = results[0];
|
||||||
context("non-owner", function() {
|
challenge = results[1];
|
||||||
it('can not edit challenge', function(done) {
|
expect(user.balance).to.equal(5.5);
|
||||||
challenge.name = 'foobar';
|
|
||||||
return request.post(baseURL + "/challenges/" + challenge._id).send(challenge).end(function(err, res) {
|
|
||||||
var error;
|
|
||||||
error = res.body.err;
|
|
||||||
expect(error).to.eql("You don't have permissions to edit this challenge");
|
|
||||||
return done();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
it('can not close challenge', function(done) {
|
|
||||||
return request.post(baseURL + "/challenges/" + challenge._id + "/close?uid=" + user._id).end(function(err, res) {
|
|
||||||
var error;
|
|
||||||
error = res.body.err;
|
|
||||||
expect(error).to.eql("You don't have permissions to close this challenge");
|
|
||||||
return done();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
return it('can not delete challenge', function(done) {
|
|
||||||
return request.del(baseURL + "/challenges/" + challenge._id).end(function(err, res) {
|
return request.del(baseURL + "/challenges/" + challenge._id).end(function(err, res) {
|
||||||
var error;
|
return User.findById(user._id, function(err, _user) {
|
||||||
error = res.body.err;
|
expect(_user.balance).to.equal(8);
|
||||||
expect(error).to.eql("You don't have permissions to delete this challenge");
|
|
||||||
return done();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
return context("non-owner that is an admin", function() {
|
|
||||||
beforeEach(function(done) {
|
|
||||||
return User.findByIdAndUpdate(user._id, {
|
|
||||||
'contributor.admin': true
|
|
||||||
}, {
|
|
||||||
"new": true
|
|
||||||
}, done);
|
|
||||||
});
|
|
||||||
it('can edit challenge', function(done) {
|
|
||||||
challenge.name = 'foobar';
|
|
||||||
return request.post(baseURL + "/challenges/" + challenge._id).send(challenge).end(function(err, res) {
|
|
||||||
expect(res.body.err).to.not.exist;
|
|
||||||
return Challenge.findById(challenge._id, function(err, chal) {
|
|
||||||
expect(chal.name).to.eql('foobar');
|
|
||||||
return done();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
it('can close challenge', function(done) {
|
|
||||||
return request.post(baseURL + "/challenges/" + challenge._id + "/close?uid=" + user._id).end(function(err, res) {
|
|
||||||
expect(res.body.err).to.not.exist;
|
|
||||||
return User.findById(user._id, function(err, usr) {
|
|
||||||
expect(usr.achievements.challenges[0]).to.eql(challenge.name);
|
|
||||||
return done();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
return it('can delete challenge', function(done) {
|
|
||||||
return request.del(baseURL + "/challenges/" + challenge._id).end(function(err, res) {
|
|
||||||
expect(res.body.err).to.not.exist;
|
|
||||||
return request.get(baseURL + "/challenges/" + challenge._id).end(function(err, res) {
|
|
||||||
var error;
|
|
||||||
error = res.body.err;
|
|
||||||
expect(error).to.eql("Challenge " + challenge._id + " not found");
|
|
||||||
return done();
|
return done();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -412,5 +281,132 @@
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
it("User creates a tavern challenge with prize, deletes it, and does not get refund", function(done) {
|
||||||
}).call(this);
|
return User.findByIdAndUpdate(user._id, {
|
||||||
|
$set: {
|
||||||
|
"balance": 8
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
"new": true
|
||||||
|
}, function(err, user) {
|
||||||
|
expect(err).to.not.be.ok;
|
||||||
|
return request.post(baseURL + "/challenges").send({
|
||||||
|
group: 'habitrpg',
|
||||||
|
dailys: [],
|
||||||
|
todos: [],
|
||||||
|
rewards: [],
|
||||||
|
habits: [],
|
||||||
|
prize: 10
|
||||||
|
}).end(function(err, res) {
|
||||||
|
expect(res.body.prize).to.equal(10);
|
||||||
|
return async.parallel([
|
||||||
|
function(cb) {
|
||||||
|
return User.findById(user._id, cb);
|
||||||
|
}, function(cb) {
|
||||||
|
return Challenge.findById(res.body._id, cb);
|
||||||
|
}
|
||||||
|
], function(err, results) {
|
||||||
|
user = results[0];
|
||||||
|
challenge = results[1];
|
||||||
|
expect(user.balance).to.equal(5.5);
|
||||||
|
return request.del(baseURL + "/challenges/" + challenge._id).end(function(err, res) {
|
||||||
|
return User.findById(user._id, function(err, _user) {
|
||||||
|
expect(_user.balance).to.equal(5.5);
|
||||||
|
return done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
return describe("non-owner permissions", function() {
|
||||||
|
challenge = void 0;
|
||||||
|
beforeEach(function(done) {
|
||||||
|
return async.waterfall([
|
||||||
|
function(cb) {
|
||||||
|
return request.post(baseURL + "/challenges").send({
|
||||||
|
group: group._id,
|
||||||
|
name: 'challenge name',
|
||||||
|
dailys: [
|
||||||
|
{
|
||||||
|
type: "daily",
|
||||||
|
text: "Challenge Daily"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}).end(function(err, res) {
|
||||||
|
challenge = res.body;
|
||||||
|
return cb();
|
||||||
|
});
|
||||||
|
}, function(cb) {
|
||||||
|
return registerNewUser(done, true);
|
||||||
|
}
|
||||||
|
]);
|
||||||
|
});
|
||||||
|
context("non-owner", function() {
|
||||||
|
it('can not edit challenge', function(done) {
|
||||||
|
challenge.name = 'foobar';
|
||||||
|
return request.post(baseURL + "/challenges/" + challenge._id).send(challenge).end(function(err, res) {
|
||||||
|
var error;
|
||||||
|
error = res.body.err;
|
||||||
|
expect(error).to.eql("You don't have permissions to edit this challenge");
|
||||||
|
return done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
it('can not close challenge', function(done) {
|
||||||
|
return request.post(baseURL + "/challenges/" + challenge._id + "/close?uid=" + user._id).end(function(err, res) {
|
||||||
|
var error;
|
||||||
|
error = res.body.err;
|
||||||
|
expect(error).to.eql("You don't have permissions to close this challenge");
|
||||||
|
return done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
return it('can not delete challenge', function(done) {
|
||||||
|
return request.del(baseURL + "/challenges/" + challenge._id).end(function(err, res) {
|
||||||
|
var error;
|
||||||
|
error = res.body.err;
|
||||||
|
expect(error).to.eql("You don't have permissions to delete this challenge");
|
||||||
|
return done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
return context("non-owner that is an admin", function() {
|
||||||
|
beforeEach(function(done) {
|
||||||
|
return User.findByIdAndUpdate(user._id, {
|
||||||
|
'contributor.admin': true
|
||||||
|
}, {
|
||||||
|
"new": true
|
||||||
|
}, done);
|
||||||
|
});
|
||||||
|
it('can edit challenge', function(done) {
|
||||||
|
challenge.name = 'foobar';
|
||||||
|
return request.post(baseURL + "/challenges/" + challenge._id).send(challenge).end(function(err, res) {
|
||||||
|
expect(res.body.err).to.not.exist;
|
||||||
|
return Challenge.findById(challenge._id, function(err, chal) {
|
||||||
|
expect(chal.name).to.eql('foobar');
|
||||||
|
return done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
it('can close challenge', function(done) {
|
||||||
|
return request.post(baseURL + "/challenges/" + challenge._id + "/close?uid=" + user._id).end(function(err, res) {
|
||||||
|
expect(res.body.err).to.not.exist;
|
||||||
|
return User.findById(user._id, function(err, usr) {
|
||||||
|
expect(usr.achievements.challenges[0]).to.eql(challenge.name);
|
||||||
|
return done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
return it('can delete challenge', function(done) {
|
||||||
|
return request.del(baseURL + "/challenges/" + challenge._id).end(function(err, res) {
|
||||||
|
expect(res.body.err).to.not.exist;
|
||||||
|
return request.get(baseURL + "/challenges/" + challenge._id).end(function(err, res) {
|
||||||
|
var error;
|
||||||
|
error = res.body.err;
|
||||||
|
expect(error).to.eql("Challenge " + challenge._id + " not found");
|
||||||
|
return done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|||||||
@@ -1,75 +1,71 @@
|
|||||||
(function() {
|
var Group, app, diff;
|
||||||
'use strict';
|
|
||||||
var Group, app, diff;
|
|
||||||
|
|
||||||
diff = require("deep-diff");
|
diff = require("deep-diff");
|
||||||
|
|
||||||
Group = require("../../website/src/models/group").model;
|
Group = require("../../website/src/models/group").model;
|
||||||
|
|
||||||
app = require("../../website/src/server");
|
app = require("../../website/src/server");
|
||||||
|
|
||||||
describe("Chat", function() {
|
describe("Chat", function() {
|
||||||
var chat, group;
|
var chat, group;
|
||||||
group = void 0;
|
group = void 0;
|
||||||
before(function(done) {
|
before(function(done) {
|
||||||
return async.waterfall([
|
return async.waterfall([
|
||||||
function(cb) {
|
function(cb) {
|
||||||
return registerNewUser(cb, true);
|
return registerNewUser(cb, true);
|
||||||
}, function(user, cb) {
|
}, function(user, cb) {
|
||||||
return request.post(baseURL + "/groups").send({
|
return request.post(baseURL + "/groups").send({
|
||||||
name: "TestGroup",
|
name: "TestGroup",
|
||||||
type: "party"
|
type: "party"
|
||||||
}).end(function(err, res) {
|
}).end(function(err, res) {
|
||||||
expectCode(res, 200);
|
expectCode(res, 200);
|
||||||
group = res.body;
|
group = res.body;
|
||||||
expect(group.members.length).to.equal(1);
|
expect(group.members.length).to.equal(1);
|
||||||
expect(group.leader).to.equal(user._id);
|
expect(group.leader).to.equal(user._id);
|
||||||
return cb();
|
return cb();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
], done);
|
], done);
|
||||||
});
|
|
||||||
chat = void 0;
|
|
||||||
return it("removes a user's chat notifications when user is kicked", function(done) {
|
|
||||||
var userToRemove;
|
|
||||||
userToRemove = null;
|
|
||||||
return async.waterfall([
|
|
||||||
function(cb) {
|
|
||||||
return registerManyUsers(1, cb);
|
|
||||||
}, function(members, cb) {
|
|
||||||
userToRemove = members[0];
|
|
||||||
return request.post(baseURL + "/groups/" + group._id + "/invite").send({
|
|
||||||
uuids: [userToRemove._id]
|
|
||||||
}).end(function() {
|
|
||||||
return cb();
|
|
||||||
});
|
|
||||||
}, function(cb) {
|
|
||||||
return request.post(baseURL + "/groups/" + group._id + "/join").set("X-API-User", userToRemove._id).set("X-API-Key", userToRemove.apiToken).end(function(err, res) {
|
|
||||||
return cb();
|
|
||||||
});
|
|
||||||
}, function(cb) {
|
|
||||||
var msg;
|
|
||||||
msg = "TestMsg";
|
|
||||||
return request.post(baseURL + "/groups/" + group._id + "/chat?message=" + msg).end(function(err, res) {
|
|
||||||
return cb();
|
|
||||||
});
|
|
||||||
}, function(cb) {
|
|
||||||
return request.get(baseURL + "/user").set("X-API-User", userToRemove._id).set("X-API-Key", userToRemove.apiToken).end(function(err, res) {
|
|
||||||
expect(res.body.newMessages[group._id]).to.exist;
|
|
||||||
return cb();
|
|
||||||
});
|
|
||||||
}, function(cb) {
|
|
||||||
return request.post(baseURL + "/groups/" + group._id + "/removeMember?uuid=" + userToRemove._id).end(function(err, res) {
|
|
||||||
return cb();
|
|
||||||
});
|
|
||||||
}, function(cb) {
|
|
||||||
return request.get(baseURL + "/user").set("X-API-User", userToRemove._id).set("X-API-Key", userToRemove.apiToken).end(function(err, res) {
|
|
||||||
expect(res.body.newMessages[group._id]).to.not.exist;
|
|
||||||
return cb();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
], done);
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
chat = void 0;
|
||||||
}).call(this);
|
return it("removes a user's chat notifications when user is kicked", function(done) {
|
||||||
|
var userToRemove;
|
||||||
|
userToRemove = null;
|
||||||
|
return async.waterfall([
|
||||||
|
function(cb) {
|
||||||
|
return registerManyUsers(1, cb);
|
||||||
|
}, function(members, cb) {
|
||||||
|
userToRemove = members[0];
|
||||||
|
return request.post(baseURL + "/groups/" + group._id + "/invite").send({
|
||||||
|
uuids: [userToRemove._id]
|
||||||
|
}).end(function() {
|
||||||
|
return cb();
|
||||||
|
});
|
||||||
|
}, function(cb) {
|
||||||
|
return request.post(baseURL + "/groups/" + group._id + "/join").set("X-API-User", userToRemove._id).set("X-API-Key", userToRemove.apiToken).end(function(err, res) {
|
||||||
|
return cb();
|
||||||
|
});
|
||||||
|
}, function(cb) {
|
||||||
|
var msg;
|
||||||
|
msg = "TestMsg";
|
||||||
|
return request.post(baseURL + "/groups/" + group._id + "/chat?message=" + msg).end(function(err, res) {
|
||||||
|
return cb();
|
||||||
|
});
|
||||||
|
}, function(cb) {
|
||||||
|
return request.get(baseURL + "/user").set("X-API-User", userToRemove._id).set("X-API-Key", userToRemove.apiToken).end(function(err, res) {
|
||||||
|
expect(res.body.newMessages[group._id]).to.exist;
|
||||||
|
return cb();
|
||||||
|
});
|
||||||
|
}, function(cb) {
|
||||||
|
return request.post(baseURL + "/groups/" + group._id + "/removeMember?uuid=" + userToRemove._id).end(function(err, res) {
|
||||||
|
return cb();
|
||||||
|
});
|
||||||
|
}, function(cb) {
|
||||||
|
return request.get(baseURL + "/user").set("X-API-User", userToRemove._id).set("X-API-Key", userToRemove.apiToken).end(function(err, res) {
|
||||||
|
expect(res.body.newMessages[group._id]).to.not.exist;
|
||||||
|
return cb();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
], done);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|||||||
@@ -1,222 +1,218 @@
|
|||||||
(function() {
|
var Coupon, app, makeSudoUser;
|
||||||
'use strict';
|
|
||||||
var Coupon, app, makeSudoUser;
|
|
||||||
|
|
||||||
app = require("../../website/src/server");
|
app = require("../../website/src/server");
|
||||||
|
|
||||||
Coupon = require("../../website/src/models/coupon").model;
|
Coupon = require("../../website/src/models/coupon").model;
|
||||||
|
|
||||||
makeSudoUser = function(usr, cb) {
|
makeSudoUser = function(usr, cb) {
|
||||||
return registerNewUser(function() {
|
return registerNewUser(function() {
|
||||||
var sudoUpdate;
|
var sudoUpdate;
|
||||||
sudoUpdate = {
|
sudoUpdate = {
|
||||||
"$set": {
|
"$set": {
|
||||||
"contributor.sudo": true
|
"contributor.sudo": true
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
return User.findByIdAndUpdate(user._id, sudoUpdate, {
|
return User.findByIdAndUpdate(user._id, sudoUpdate, {
|
||||||
"new": true
|
"new": true
|
||||||
}, function(err, _user) {
|
}, function(err, _user) {
|
||||||
usr = _user;
|
usr = _user;
|
||||||
return cb();
|
return cb();
|
||||||
});
|
|
||||||
}, true);
|
|
||||||
};
|
|
||||||
|
|
||||||
describe("Coupons", function() {
|
|
||||||
var coupons;
|
|
||||||
before(function(done) {
|
|
||||||
return async.parallel([
|
|
||||||
function(cb) {
|
|
||||||
return mongoose.connection.collections['coupons'].drop(function(err) {
|
|
||||||
return cb();
|
|
||||||
});
|
|
||||||
}, function(cb) {
|
|
||||||
return mongoose.connection.collections['users'].drop(function(err) {
|
|
||||||
return cb();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
], done);
|
|
||||||
});
|
});
|
||||||
coupons = null;
|
}, true);
|
||||||
describe("POST /api/v2/coupons/generate/:event", function() {
|
};
|
||||||
context("while sudo user", function() {
|
|
||||||
before(function(done) {
|
describe("Coupons", function() {
|
||||||
return makeSudoUser(user, done);
|
var coupons;
|
||||||
|
before(function(done) {
|
||||||
|
return async.parallel([
|
||||||
|
function(cb) {
|
||||||
|
return mongoose.connection.collections['coupons'].drop(function(err) {
|
||||||
|
return cb();
|
||||||
});
|
});
|
||||||
return it("generates coupons", function(done) {
|
}, function(cb) {
|
||||||
var queries;
|
return mongoose.connection.collections['users'].drop(function(err) {
|
||||||
queries = '?count=10';
|
return cb();
|
||||||
return request.post(baseURL + '/coupons/generate/wondercon' + queries).end(function(err, res) {
|
|
||||||
expectCode(res, 200);
|
|
||||||
return Coupon.find({
|
|
||||||
event: 'wondercon'
|
|
||||||
}, function(err, _coupons) {
|
|
||||||
coupons = _coupons;
|
|
||||||
expect(coupons.length).to.equal(10);
|
|
||||||
_(coupons).each(function(c) {
|
|
||||||
return expect(c.event).to.equal('wondercon');
|
|
||||||
});
|
|
||||||
return done();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
], done);
|
||||||
|
});
|
||||||
|
coupons = null;
|
||||||
|
describe("POST /api/v2/coupons/generate/:event", function() {
|
||||||
|
context("while sudo user", function() {
|
||||||
|
before(function(done) {
|
||||||
|
return makeSudoUser(user, done);
|
||||||
});
|
});
|
||||||
return context("while regular user", function() {
|
return it("generates coupons", function(done) {
|
||||||
before(function(done) {
|
var queries;
|
||||||
return registerNewUser(done, true);
|
queries = '?count=10';
|
||||||
});
|
return request.post(baseURL + '/coupons/generate/wondercon' + queries).end(function(err, res) {
|
||||||
return it("does not generate coupons", function(done) {
|
expectCode(res, 200);
|
||||||
var queries;
|
return Coupon.find({
|
||||||
queries = '?count=10';
|
event: 'wondercon'
|
||||||
return request.post(baseURL + '/coupons/generate/wondercon' + queries).end(function(err, res) {
|
}, function(err, _coupons) {
|
||||||
expectCode(res, 401);
|
coupons = _coupons;
|
||||||
expect(res.body.err).to.equal('You don\'t have admin access');
|
expect(coupons.length).to.equal(10);
|
||||||
return done();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
describe("GET /api/v2/coupons", function() {
|
|
||||||
context("while sudo user", function() {
|
|
||||||
before(function(done) {
|
|
||||||
return makeSudoUser(user, done);
|
|
||||||
});
|
|
||||||
it("gets coupons", function(done) {
|
|
||||||
var queries;
|
|
||||||
queries = '?_id=' + user._id + '&apiToken=' + user.apiToken;
|
|
||||||
return request.get(baseURL + '/coupons' + queries).end(function(err, res) {
|
|
||||||
var codes;
|
|
||||||
expectCode(res, 200);
|
|
||||||
codes = res.text;
|
|
||||||
expect(codes).to.contain('code');
|
|
||||||
_(coupons).each(function(c) {
|
_(coupons).each(function(c) {
|
||||||
return expect(codes).to.contain(c._id);
|
return expect(c.event).to.equal('wondercon');
|
||||||
});
|
});
|
||||||
return done();
|
return done();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
it("gets first 5 coupons out of 10 when a limit of 5 is set", function(done) {
|
|
||||||
var queries;
|
|
||||||
queries = '?_id=' + user._id + '&apiToken=' + user.apiToken + '&limit=5';
|
|
||||||
return request.get(baseURL + '/coupons' + queries).end(function(err, res) {
|
|
||||||
var codes, firstHalf, secondHalf, sortedCoupons;
|
|
||||||
expectCode(res, 200);
|
|
||||||
codes = res.text;
|
|
||||||
sortedCoupons = _.sortBy(coupons, 'seq');
|
|
||||||
firstHalf = sortedCoupons.slice(0, 5);
|
|
||||||
secondHalf = sortedCoupons.slice(5, 10);
|
|
||||||
_(firstHalf).each(function(c) {
|
|
||||||
return expect(codes).to.contain(c._id);
|
|
||||||
});
|
|
||||||
_(secondHalf).each(function(c) {
|
|
||||||
return expect(codes).to.not.contain(c._id);
|
|
||||||
});
|
|
||||||
return done();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
return it("gets last 5 coupons out of 10 when a limit of 5 is set", function(done) {
|
|
||||||
var queries;
|
|
||||||
queries = '?_id=' + user._id + '&apiToken=' + user.apiToken + '&skip=5';
|
|
||||||
return request.get(baseURL + '/coupons' + queries).end(function(err, res) {
|
|
||||||
var codes, firstHalf, secondHalf, sortedCoupons;
|
|
||||||
expectCode(res, 200);
|
|
||||||
codes = res.text;
|
|
||||||
sortedCoupons = _.sortBy(coupons, 'seq');
|
|
||||||
firstHalf = sortedCoupons.slice(0, 5);
|
|
||||||
secondHalf = sortedCoupons.slice(5, 10);
|
|
||||||
_(firstHalf).each(function(c) {
|
|
||||||
return expect(codes).to.not.contain(c._id);
|
|
||||||
});
|
|
||||||
_(secondHalf).each(function(c) {
|
|
||||||
return expect(codes).to.contain(c._id);
|
|
||||||
});
|
|
||||||
return done();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
return context("while regular user", function() {
|
|
||||||
before(function(done) {
|
|
||||||
return registerNewUser(done, true);
|
|
||||||
});
|
|
||||||
return it("does not get coupons", function(done) {
|
|
||||||
var queries;
|
|
||||||
queries = '?_id=' + user._id + '&apiToken=' + user.apiToken;
|
|
||||||
return request.get(baseURL + '/coupons' + queries).end(function(err, res) {
|
|
||||||
expectCode(res, 401);
|
|
||||||
expect(res.body.err).to.equal('You don\'t have admin access');
|
|
||||||
return done();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
return describe("POST /api/v2/user/coupon/:code", function() {
|
return context("while regular user", function() {
|
||||||
var specialGear;
|
before(function(done) {
|
||||||
specialGear = function(gear, has) {
|
return registerNewUser(done, true);
|
||||||
var items;
|
|
||||||
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'];
|
|
||||||
return _(items).each(function(i) {
|
|
||||||
if (has) {
|
|
||||||
return expect(gear[i]).to.exist;
|
|
||||||
} else {
|
|
||||||
return expect(gear[i]).to.not.exist;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
};
|
|
||||||
beforeEach(function(done) {
|
|
||||||
return registerNewUser(function() {
|
|
||||||
var gear;
|
|
||||||
gear = user.items.gear.owned;
|
|
||||||
specialGear(gear, false);
|
|
||||||
return done();
|
|
||||||
}, true);
|
|
||||||
});
|
});
|
||||||
context("unused coupon", function() {
|
return it("does not generate coupons", function(done) {
|
||||||
return it("applies coupon and awards equipment", function(done) {
|
var queries;
|
||||||
var code;
|
queries = '?count=10';
|
||||||
code = coupons[0]._id;
|
return request.post(baseURL + '/coupons/generate/wondercon' + queries).end(function(err, res) {
|
||||||
return request.post(baseURL + '/user/coupon/' + code).end(function(err, res) {
|
expectCode(res, 401);
|
||||||
|
expect(res.body.err).to.equal('You don\'t have admin access');
|
||||||
|
return done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
describe("GET /api/v2/coupons", function() {
|
||||||
|
context("while sudo user", function() {
|
||||||
|
before(function(done) {
|
||||||
|
return makeSudoUser(user, done);
|
||||||
|
});
|
||||||
|
it("gets coupons", function(done) {
|
||||||
|
var queries;
|
||||||
|
queries = '?_id=' + user._id + '&apiToken=' + user.apiToken;
|
||||||
|
return request.get(baseURL + '/coupons' + queries).end(function(err, res) {
|
||||||
|
var codes;
|
||||||
|
expectCode(res, 200);
|
||||||
|
codes = res.text;
|
||||||
|
expect(codes).to.contain('code');
|
||||||
|
_(coupons).each(function(c) {
|
||||||
|
return expect(codes).to.contain(c._id);
|
||||||
|
});
|
||||||
|
return done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
it("gets first 5 coupons out of 10 when a limit of 5 is set", function(done) {
|
||||||
|
var queries;
|
||||||
|
queries = '?_id=' + user._id + '&apiToken=' + user.apiToken + '&limit=5';
|
||||||
|
return request.get(baseURL + '/coupons' + queries).end(function(err, res) {
|
||||||
|
var codes, firstHalf, secondHalf, sortedCoupons;
|
||||||
|
expectCode(res, 200);
|
||||||
|
codes = res.text;
|
||||||
|
sortedCoupons = _.sortBy(coupons, 'seq');
|
||||||
|
firstHalf = sortedCoupons.slice(0, 5);
|
||||||
|
secondHalf = sortedCoupons.slice(5, 10);
|
||||||
|
_(firstHalf).each(function(c) {
|
||||||
|
return expect(codes).to.contain(c._id);
|
||||||
|
});
|
||||||
|
_(secondHalf).each(function(c) {
|
||||||
|
return expect(codes).to.not.contain(c._id);
|
||||||
|
});
|
||||||
|
return done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
return it("gets last 5 coupons out of 10 when a limit of 5 is set", function(done) {
|
||||||
|
var queries;
|
||||||
|
queries = '?_id=' + user._id + '&apiToken=' + user.apiToken + '&skip=5';
|
||||||
|
return request.get(baseURL + '/coupons' + queries).end(function(err, res) {
|
||||||
|
var codes, firstHalf, secondHalf, sortedCoupons;
|
||||||
|
expectCode(res, 200);
|
||||||
|
codes = res.text;
|
||||||
|
sortedCoupons = _.sortBy(coupons, 'seq');
|
||||||
|
firstHalf = sortedCoupons.slice(0, 5);
|
||||||
|
secondHalf = sortedCoupons.slice(5, 10);
|
||||||
|
_(firstHalf).each(function(c) {
|
||||||
|
return expect(codes).to.not.contain(c._id);
|
||||||
|
});
|
||||||
|
_(secondHalf).each(function(c) {
|
||||||
|
return expect(codes).to.contain(c._id);
|
||||||
|
});
|
||||||
|
return done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
return context("while regular user", function() {
|
||||||
|
before(function(done) {
|
||||||
|
return registerNewUser(done, true);
|
||||||
|
});
|
||||||
|
return it("does not get coupons", function(done) {
|
||||||
|
var queries;
|
||||||
|
queries = '?_id=' + user._id + '&apiToken=' + user.apiToken;
|
||||||
|
return request.get(baseURL + '/coupons' + queries).end(function(err, res) {
|
||||||
|
expectCode(res, 401);
|
||||||
|
expect(res.body.err).to.equal('You don\'t have admin access');
|
||||||
|
return done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
return describe("POST /api/v2/user/coupon/:code", function() {
|
||||||
|
var specialGear;
|
||||||
|
specialGear = function(gear, has) {
|
||||||
|
var items;
|
||||||
|
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'];
|
||||||
|
return _(items).each(function(i) {
|
||||||
|
if (has) {
|
||||||
|
return expect(gear[i]).to.exist;
|
||||||
|
} else {
|
||||||
|
return expect(gear[i]).to.not.exist;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
beforeEach(function(done) {
|
||||||
|
return registerNewUser(function() {
|
||||||
|
var gear;
|
||||||
|
gear = user.items.gear.owned;
|
||||||
|
specialGear(gear, false);
|
||||||
|
return done();
|
||||||
|
}, true);
|
||||||
|
});
|
||||||
|
context("unused coupon", function() {
|
||||||
|
return it("applies coupon and awards equipment", function(done) {
|
||||||
|
var code;
|
||||||
|
code = coupons[0]._id;
|
||||||
|
return request.post(baseURL + '/user/coupon/' + code).end(function(err, res) {
|
||||||
|
var gear;
|
||||||
|
expectCode(res, 200);
|
||||||
|
gear = res.body.items.gear.owned;
|
||||||
|
specialGear(gear, true);
|
||||||
|
return done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
context("already used coupon", function() {
|
||||||
|
return it("does not apply coupon and does not award equipment", function(done) {
|
||||||
|
var code;
|
||||||
|
code = coupons[0]._id;
|
||||||
|
return request.post(baseURL + '/user/coupon/' + code).end(function(err, res) {
|
||||||
|
expectCode(res, 400);
|
||||||
|
expect(res.body.err).to.equal("Coupon already used");
|
||||||
|
return User.findById(user._id, function(err, _user) {
|
||||||
var gear;
|
var gear;
|
||||||
expectCode(res, 200);
|
gear = _user.items.gear.owned;
|
||||||
gear = res.body.items.gear.owned;
|
specialGear(gear, false);
|
||||||
specialGear(gear, true);
|
|
||||||
return done();
|
return done();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
context("already used coupon", function() {
|
});
|
||||||
return it("does not apply coupon and does not award equipment", function(done) {
|
return context("invalid coupon", function() {
|
||||||
var code;
|
return it("does not apply coupon and does not award equipment", function(done) {
|
||||||
code = coupons[0]._id;
|
var code;
|
||||||
return request.post(baseURL + '/user/coupon/' + code).end(function(err, res) {
|
code = "not-a-real-coupon";
|
||||||
expectCode(res, 400);
|
return request.post(baseURL + '/user/coupon/' + code).end(function(err, res) {
|
||||||
expect(res.body.err).to.equal("Coupon already used");
|
expectCode(res, 400);
|
||||||
return User.findById(user._id, function(err, _user) {
|
expect(res.body.err).to.equal("Invalid coupon code");
|
||||||
var gear;
|
return User.findById(user._id, function(err, _user) {
|
||||||
gear = _user.items.gear.owned;
|
var gear;
|
||||||
specialGear(gear, false);
|
gear = _user.items.gear.owned;
|
||||||
return done();
|
specialGear(gear, false);
|
||||||
});
|
return done();
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
return context("invalid coupon", function() {
|
|
||||||
return it("does not apply coupon and does not award equipment", function(done) {
|
|
||||||
var code;
|
|
||||||
code = "not-a-real-coupon";
|
|
||||||
return request.post(baseURL + '/user/coupon/' + code).end(function(err, res) {
|
|
||||||
expectCode(res, 400);
|
|
||||||
expect(res.body.err).to.equal("Invalid coupon code");
|
|
||||||
return User.findById(user._id, function(err, _user) {
|
|
||||||
var gear;
|
|
||||||
gear = _user.items.gear.owned;
|
|
||||||
specialGear(gear, false);
|
|
||||||
return done();
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
});
|
||||||
}).call(this);
|
|
||||||
|
|||||||
@@ -1,370 +1,366 @@
|
|||||||
(function() {
|
var app, iapMock, inApp, rewire, sinon;
|
||||||
'use strict';
|
|
||||||
var app, iapMock, inApp, rewire, sinon;
|
|
||||||
|
|
||||||
app = require('../../website/src/server');
|
app = require('../../website/src/server');
|
||||||
|
|
||||||
rewire = require('rewire');
|
rewire = require('rewire');
|
||||||
|
|
||||||
sinon = require('sinon');
|
sinon = require('sinon');
|
||||||
|
|
||||||
inApp = rewire('../../website/src/controllers/payments/iap');
|
inApp = rewire('../../website/src/controllers/payments/iap');
|
||||||
|
|
||||||
iapMock = {};
|
iapMock = {};
|
||||||
|
|
||||||
inApp.__set__('iap', iapMock);
|
inApp.__set__('iap', iapMock);
|
||||||
|
|
||||||
describe('In-App Purchases', function() {
|
describe('In-App Purchases', function() {
|
||||||
describe('Android', function() {
|
describe('Android', function() {
|
||||||
var next, paymentSpy, req, res;
|
var next, paymentSpy, req, res;
|
||||||
req = {
|
req = {
|
||||||
body: {
|
body: {
|
||||||
transaction: {
|
transaction: {
|
||||||
reciept: 'foo',
|
reciept: 'foo',
|
||||||
signature: 'sig'
|
signature: 'sig'
|
||||||
}
|
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
res = {
|
};
|
||||||
locals: {
|
res = {
|
||||||
user: {
|
locals: {
|
||||||
_id: 'user'
|
user: {
|
||||||
}
|
_id: 'user'
|
||||||
},
|
}
|
||||||
json: sinon.spy()
|
},
|
||||||
};
|
json: sinon.spy()
|
||||||
next = function() {
|
};
|
||||||
return true;
|
next = function() {
|
||||||
};
|
return true;
|
||||||
paymentSpy = sinon.spy();
|
};
|
||||||
|
paymentSpy = sinon.spy();
|
||||||
|
before(function() {
|
||||||
|
return inApp.__set__('payments.buyGems', paymentSpy);
|
||||||
|
});
|
||||||
|
afterEach(function() {
|
||||||
|
paymentSpy.reset();
|
||||||
|
return res.json.reset();
|
||||||
|
});
|
||||||
|
context('successful app purchase', function() {
|
||||||
before(function() {
|
before(function() {
|
||||||
return inApp.__set__('payments.buyGems', paymentSpy);
|
iapMock.setup = function(cb) {
|
||||||
|
return cb(null);
|
||||||
|
};
|
||||||
|
iapMock.validate = function(iapGoogle, iapBodyReciept, cb) {
|
||||||
|
return cb(null, true);
|
||||||
|
};
|
||||||
|
iapMock.isValidated = function(googleRes) {
|
||||||
|
return googleRes;
|
||||||
|
};
|
||||||
|
return iapMock.GOOGLE = 'google';
|
||||||
});
|
});
|
||||||
afterEach(function() {
|
it('calls res.json with succesful result object', function() {
|
||||||
paymentSpy.reset();
|
var expectedResObj;
|
||||||
return res.json.reset();
|
expectedResObj = {
|
||||||
|
ok: true,
|
||||||
|
data: true
|
||||||
|
};
|
||||||
|
inApp.androidVerify(req, res, next);
|
||||||
|
expect(res.json).to.be.calledOnce;
|
||||||
|
return expect(res.json).to.be.calledWith(expectedResObj);
|
||||||
});
|
});
|
||||||
context('successful app purchase', function() {
|
return it('calls payments.buyGems function', function() {
|
||||||
before(function() {
|
inApp.androidVerify(req, res, next);
|
||||||
iapMock.setup = function(cb) {
|
expect(paymentSpy).to.be.calledOnce;
|
||||||
return cb(null);
|
return expect(paymentSpy).to.be.calledWith({
|
||||||
};
|
user: res.locals.user,
|
||||||
iapMock.validate = function(iapGoogle, iapBodyReciept, cb) {
|
paymentMethod: 'IAP GooglePlay'
|
||||||
return cb(null, true);
|
|
||||||
};
|
|
||||||
iapMock.isValidated = function(googleRes) {
|
|
||||||
return googleRes;
|
|
||||||
};
|
|
||||||
return iapMock.GOOGLE = 'google';
|
|
||||||
});
|
|
||||||
it('calls res.json with succesful result object', function() {
|
|
||||||
var expectedResObj;
|
|
||||||
expectedResObj = {
|
|
||||||
ok: true,
|
|
||||||
data: true
|
|
||||||
};
|
|
||||||
inApp.androidVerify(req, res, next);
|
|
||||||
expect(res.json).to.be.calledOnce;
|
|
||||||
return expect(res.json).to.be.calledWith(expectedResObj);
|
|
||||||
});
|
|
||||||
return it('calls payments.buyGems function', function() {
|
|
||||||
inApp.androidVerify(req, res, next);
|
|
||||||
expect(paymentSpy).to.be.calledOnce;
|
|
||||||
return expect(paymentSpy).to.be.calledWith({
|
|
||||||
user: res.locals.user,
|
|
||||||
paymentMethod: 'IAP GooglePlay'
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
context('error in setup', function() {
|
|
||||||
before(function() {
|
|
||||||
return iapMock.setup = function(cb) {
|
|
||||||
return cb("error in setup");
|
|
||||||
};
|
|
||||||
});
|
|
||||||
it('calls res.json with setup error object', function() {
|
|
||||||
var expectedResObj;
|
|
||||||
expectedResObj = {
|
|
||||||
ok: false,
|
|
||||||
data: 'IAP Error'
|
|
||||||
};
|
|
||||||
inApp.androidVerify(req, res, next);
|
|
||||||
expect(res.json).to.be.calledOnce;
|
|
||||||
return expect(res.json).to.be.calledWith(expectedResObj);
|
|
||||||
});
|
|
||||||
return it('does not calls payments.buyGems function', function() {
|
|
||||||
inApp.androidVerify(req, res, next);
|
|
||||||
return expect(paymentSpy).to.not.be.called;
|
|
||||||
});
|
|
||||||
});
|
|
||||||
context('error in validation', function() {
|
|
||||||
before(function() {
|
|
||||||
iapMock.setup = function(cb) {
|
|
||||||
return cb(null);
|
|
||||||
};
|
|
||||||
return iapMock.validate = function(iapGoogle, iapBodyReciept, cb) {
|
|
||||||
return cb('error in validation', true);
|
|
||||||
};
|
|
||||||
});
|
|
||||||
it('calls res.json with validation error object', function() {
|
|
||||||
var expectedResObj;
|
|
||||||
expectedResObj = {
|
|
||||||
ok: false,
|
|
||||||
data: {
|
|
||||||
code: 6778001,
|
|
||||||
message: 'error in validation'
|
|
||||||
}
|
|
||||||
};
|
|
||||||
inApp.androidVerify(req, res, next);
|
|
||||||
expect(res.json).to.be.calledOnce;
|
|
||||||
return expect(res.json).to.be.calledWith(expectedResObj);
|
|
||||||
});
|
|
||||||
return it('does not calls payments.buyGems function', function() {
|
|
||||||
inApp.androidVerify(req, res, next);
|
|
||||||
return expect(paymentSpy).to.not.be.called;
|
|
||||||
});
|
|
||||||
});
|
|
||||||
return context('iap is not valid', function() {
|
|
||||||
before(function() {
|
|
||||||
iapMock.setup = function(cb) {
|
|
||||||
return cb(null);
|
|
||||||
};
|
|
||||||
iapMock.validate = function(iapGoogle, iapBodyReciept, cb) {
|
|
||||||
return cb(null, false);
|
|
||||||
};
|
|
||||||
return iapMock.isValidated = function(googleRes) {
|
|
||||||
return googleRes;
|
|
||||||
};
|
|
||||||
});
|
|
||||||
it('does not call res.json', function() {
|
|
||||||
inApp.androidVerify(req, res, next);
|
|
||||||
return expect(res.json).to.not.be.called;
|
|
||||||
});
|
|
||||||
return it('does not calls payments.buyGems function', function() {
|
|
||||||
inApp.androidVerify(req, res, next);
|
|
||||||
return expect(paymentSpy).to.not.be.called;
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
return describe('iOS', function() {
|
context('error in setup', function() {
|
||||||
var next, paymentSpy, req, res;
|
|
||||||
req = {
|
|
||||||
body: {
|
|
||||||
transaction: {
|
|
||||||
reciept: 'foo'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
res = {
|
|
||||||
locals: {
|
|
||||||
user: {
|
|
||||||
_id: 'user'
|
|
||||||
}
|
|
||||||
},
|
|
||||||
json: sinon.spy()
|
|
||||||
};
|
|
||||||
next = function() {
|
|
||||||
return true;
|
|
||||||
};
|
|
||||||
paymentSpy = sinon.spy();
|
|
||||||
before(function() {
|
before(function() {
|
||||||
return inApp.__set__('payments.buyGems', paymentSpy);
|
return iapMock.setup = function(cb) {
|
||||||
|
return cb("error in setup");
|
||||||
|
};
|
||||||
});
|
});
|
||||||
afterEach(function() {
|
it('calls res.json with setup error object', function() {
|
||||||
paymentSpy.reset();
|
var expectedResObj;
|
||||||
return res.json.reset();
|
expectedResObj = {
|
||||||
|
ok: false,
|
||||||
|
data: 'IAP Error'
|
||||||
|
};
|
||||||
|
inApp.androidVerify(req, res, next);
|
||||||
|
expect(res.json).to.be.calledOnce;
|
||||||
|
return expect(res.json).to.be.calledWith(expectedResObj);
|
||||||
});
|
});
|
||||||
context('successful app purchase', function() {
|
return it('does not calls payments.buyGems function', function() {
|
||||||
before(function() {
|
inApp.androidVerify(req, res, next);
|
||||||
iapMock.setup = function(cb) {
|
return expect(paymentSpy).to.not.be.called;
|
||||||
return cb(null);
|
|
||||||
};
|
|
||||||
iapMock.validate = function(iapApple, iapBodyReciept, cb) {
|
|
||||||
return cb(null, true);
|
|
||||||
};
|
|
||||||
iapMock.isValidated = function(appleRes) {
|
|
||||||
return appleRes;
|
|
||||||
};
|
|
||||||
iapMock.getPurchaseData = function(appleRes) {
|
|
||||||
return [
|
|
||||||
{
|
|
||||||
productId: 'com.habitrpg.ios.Habitica.20gems'
|
|
||||||
}
|
|
||||||
];
|
|
||||||
};
|
|
||||||
return iapMock.APPLE = 'apple';
|
|
||||||
});
|
|
||||||
it('calls res.json with succesful result object', function() {
|
|
||||||
var expectedResObj;
|
|
||||||
expectedResObj = {
|
|
||||||
ok: true,
|
|
||||||
data: true
|
|
||||||
};
|
|
||||||
inApp.iosVerify(req, res, next);
|
|
||||||
expect(res.json).to.be.calledOnce;
|
|
||||||
return expect(res.json).to.be.calledWith(expectedResObj);
|
|
||||||
});
|
|
||||||
return it('calls payments.buyGems function', function() {
|
|
||||||
inApp.iosVerify(req, res, next);
|
|
||||||
expect(paymentSpy).to.be.calledOnce;
|
|
||||||
return expect(paymentSpy).to.be.calledWith({
|
|
||||||
user: res.locals.user,
|
|
||||||
paymentMethod: 'IAP AppleStore',
|
|
||||||
amount: 5.25
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
context('error in setup', function() {
|
});
|
||||||
before(function() {
|
context('error in validation', function() {
|
||||||
return iapMock.setup = function(cb) {
|
before(function() {
|
||||||
return cb("error in setup");
|
iapMock.setup = function(cb) {
|
||||||
};
|
return cb(null);
|
||||||
});
|
};
|
||||||
it('calls res.json with setup error object', function() {
|
return iapMock.validate = function(iapGoogle, iapBodyReciept, cb) {
|
||||||
var expectedResObj;
|
return cb('error in validation', true);
|
||||||
expectedResObj = {
|
};
|
||||||
ok: false,
|
|
||||||
data: 'IAP Error'
|
|
||||||
};
|
|
||||||
inApp.iosVerify(req, res, next);
|
|
||||||
expect(res.json).to.be.calledOnce;
|
|
||||||
return expect(res.json).to.be.calledWith(expectedResObj);
|
|
||||||
});
|
|
||||||
return it('does not calls payments.buyGems function', function() {
|
|
||||||
inApp.iosVerify(req, res, next);
|
|
||||||
return expect(paymentSpy).to.not.be.called;
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
context('error in validation', function() {
|
it('calls res.json with validation error object', function() {
|
||||||
before(function() {
|
var expectedResObj;
|
||||||
iapMock.setup = function(cb) {
|
expectedResObj = {
|
||||||
return cb(null);
|
ok: false,
|
||||||
};
|
data: {
|
||||||
return iapMock.validate = function(iapApple, iapBodyReciept, cb) {
|
code: 6778001,
|
||||||
return cb('error in validation', true);
|
message: 'error in validation'
|
||||||
};
|
}
|
||||||
});
|
};
|
||||||
it('calls res.json with validation error object', function() {
|
inApp.androidVerify(req, res, next);
|
||||||
var expectedResObj;
|
expect(res.json).to.be.calledOnce;
|
||||||
expectedResObj = {
|
return expect(res.json).to.be.calledWith(expectedResObj);
|
||||||
ok: false,
|
|
||||||
data: {
|
|
||||||
code: 6778001,
|
|
||||||
message: 'error in validation'
|
|
||||||
}
|
|
||||||
};
|
|
||||||
inApp.iosVerify(req, res, next);
|
|
||||||
expect(res.json).to.be.calledOnce;
|
|
||||||
return expect(res.json).to.be.calledWith(expectedResObj);
|
|
||||||
});
|
|
||||||
return it('does not calls payments.buyGems function', function() {
|
|
||||||
inApp.iosVerify(req, res, next);
|
|
||||||
return expect(paymentSpy).to.not.be.called;
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
context('iap is not valid', function() {
|
return it('does not calls payments.buyGems function', function() {
|
||||||
before(function() {
|
inApp.androidVerify(req, res, next);
|
||||||
iapMock.setup = function(cb) {
|
return expect(paymentSpy).to.not.be.called;
|
||||||
return cb(null);
|
|
||||||
};
|
|
||||||
iapMock.validate = function(iapApple, iapBodyReciept, cb) {
|
|
||||||
return cb(null, false);
|
|
||||||
};
|
|
||||||
return iapMock.isValidated = function(appleRes) {
|
|
||||||
return appleRes;
|
|
||||||
};
|
|
||||||
});
|
|
||||||
it('does not call res.json', function() {
|
|
||||||
var expectedResObj;
|
|
||||||
inApp.iosVerify(req, res, next);
|
|
||||||
expectedResObj = {
|
|
||||||
ok: false,
|
|
||||||
data: {
|
|
||||||
code: 6778001,
|
|
||||||
message: 'Invalid receipt'
|
|
||||||
}
|
|
||||||
};
|
|
||||||
expect(res.json).to.be.calledOnce;
|
|
||||||
return expect(res.json).to.be.calledWith(expectedResObj);
|
|
||||||
});
|
|
||||||
return it('does not calls payments.buyGems function', function() {
|
|
||||||
inApp.iosVerify(req, res, next);
|
|
||||||
return expect(paymentSpy).to.not.be.called;
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
context('iap is valid but has no purchaseDataList', function() {
|
});
|
||||||
before(function() {
|
return context('iap is not valid', function() {
|
||||||
iapMock.setup = function(cb) {
|
before(function() {
|
||||||
return cb(null);
|
iapMock.setup = function(cb) {
|
||||||
};
|
return cb(null);
|
||||||
iapMock.validate = function(iapApple, iapBodyReciept, cb) {
|
};
|
||||||
return cb(null, true);
|
iapMock.validate = function(iapGoogle, iapBodyReciept, cb) {
|
||||||
};
|
return cb(null, false);
|
||||||
iapMock.isValidated = function(appleRes) {
|
};
|
||||||
return appleRes;
|
return iapMock.isValidated = function(googleRes) {
|
||||||
};
|
return googleRes;
|
||||||
iapMock.getPurchaseData = function(appleRes) {
|
};
|
||||||
return [];
|
|
||||||
};
|
|
||||||
return iapMock.APPLE = 'apple';
|
|
||||||
});
|
|
||||||
it('calls res.json with succesful result object', function() {
|
|
||||||
var expectedResObj;
|
|
||||||
expectedResObj = {
|
|
||||||
ok: false,
|
|
||||||
data: {
|
|
||||||
code: 6778001,
|
|
||||||
message: 'Incorrect receipt content'
|
|
||||||
}
|
|
||||||
};
|
|
||||||
inApp.iosVerify(req, res, next);
|
|
||||||
expect(res.json).to.be.calledOnce;
|
|
||||||
return expect(res.json).to.be.calledWith(expectedResObj);
|
|
||||||
});
|
|
||||||
return it('does not calls payments.buyGems function', function() {
|
|
||||||
inApp.iosVerify(req, res, next);
|
|
||||||
return expect(paymentSpy).to.not.be.called;
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
return context('iap is valid, has purchaseDataList, but productId does not match', function() {
|
it('does not call res.json', function() {
|
||||||
before(function() {
|
inApp.androidVerify(req, res, next);
|
||||||
iapMock.setup = function(cb) {
|
return expect(res.json).to.not.be.called;
|
||||||
return cb(null);
|
});
|
||||||
};
|
return it('does not calls payments.buyGems function', function() {
|
||||||
iapMock.validate = function(iapApple, iapBodyReciept, cb) {
|
inApp.androidVerify(req, res, next);
|
||||||
return cb(null, true);
|
return expect(paymentSpy).to.not.be.called;
|
||||||
};
|
|
||||||
iapMock.isValidated = function(appleRes) {
|
|
||||||
return appleRes;
|
|
||||||
};
|
|
||||||
iapMock.getPurchaseData = function(appleRes) {
|
|
||||||
return [
|
|
||||||
{
|
|
||||||
productId: 'com.another.company'
|
|
||||||
}
|
|
||||||
];
|
|
||||||
};
|
|
||||||
return iapMock.APPLE = 'apple';
|
|
||||||
});
|
|
||||||
it('calls res.json with incorrect reciept obj', function() {
|
|
||||||
var expectedResObj;
|
|
||||||
expectedResObj = {
|
|
||||||
ok: false,
|
|
||||||
data: {
|
|
||||||
code: 6778001,
|
|
||||||
message: 'Incorrect receipt content'
|
|
||||||
}
|
|
||||||
};
|
|
||||||
inApp.iosVerify(req, res, next);
|
|
||||||
expect(res.json).to.be.calledOnce;
|
|
||||||
return expect(res.json).to.be.calledWith(expectedResObj);
|
|
||||||
});
|
|
||||||
return it('does not calls payments.buyGems function', function() {
|
|
||||||
inApp.iosVerify(req, res, next);
|
|
||||||
return expect(paymentSpy).to.not.be.called;
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
return describe('iOS', function() {
|
||||||
}).call(this);
|
var next, paymentSpy, req, res;
|
||||||
|
req = {
|
||||||
|
body: {
|
||||||
|
transaction: {
|
||||||
|
reciept: 'foo'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
res = {
|
||||||
|
locals: {
|
||||||
|
user: {
|
||||||
|
_id: 'user'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
json: sinon.spy()
|
||||||
|
};
|
||||||
|
next = function() {
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
paymentSpy = sinon.spy();
|
||||||
|
before(function() {
|
||||||
|
return inApp.__set__('payments.buyGems', paymentSpy);
|
||||||
|
});
|
||||||
|
afterEach(function() {
|
||||||
|
paymentSpy.reset();
|
||||||
|
return res.json.reset();
|
||||||
|
});
|
||||||
|
context('successful app purchase', function() {
|
||||||
|
before(function() {
|
||||||
|
iapMock.setup = function(cb) {
|
||||||
|
return cb(null);
|
||||||
|
};
|
||||||
|
iapMock.validate = function(iapApple, iapBodyReciept, cb) {
|
||||||
|
return cb(null, true);
|
||||||
|
};
|
||||||
|
iapMock.isValidated = function(appleRes) {
|
||||||
|
return appleRes;
|
||||||
|
};
|
||||||
|
iapMock.getPurchaseData = function(appleRes) {
|
||||||
|
return [
|
||||||
|
{
|
||||||
|
productId: 'com.habitrpg.ios.Habitica.20gems'
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
return iapMock.APPLE = 'apple';
|
||||||
|
});
|
||||||
|
it('calls res.json with succesful result object', function() {
|
||||||
|
var expectedResObj;
|
||||||
|
expectedResObj = {
|
||||||
|
ok: true,
|
||||||
|
data: true
|
||||||
|
};
|
||||||
|
inApp.iosVerify(req, res, next);
|
||||||
|
expect(res.json).to.be.calledOnce;
|
||||||
|
return expect(res.json).to.be.calledWith(expectedResObj);
|
||||||
|
});
|
||||||
|
return it('calls payments.buyGems function', function() {
|
||||||
|
inApp.iosVerify(req, res, next);
|
||||||
|
expect(paymentSpy).to.be.calledOnce;
|
||||||
|
return expect(paymentSpy).to.be.calledWith({
|
||||||
|
user: res.locals.user,
|
||||||
|
paymentMethod: 'IAP AppleStore',
|
||||||
|
amount: 5.25
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
context('error in setup', function() {
|
||||||
|
before(function() {
|
||||||
|
return iapMock.setup = function(cb) {
|
||||||
|
return cb("error in setup");
|
||||||
|
};
|
||||||
|
});
|
||||||
|
it('calls res.json with setup error object', function() {
|
||||||
|
var expectedResObj;
|
||||||
|
expectedResObj = {
|
||||||
|
ok: false,
|
||||||
|
data: 'IAP Error'
|
||||||
|
};
|
||||||
|
inApp.iosVerify(req, res, next);
|
||||||
|
expect(res.json).to.be.calledOnce;
|
||||||
|
return expect(res.json).to.be.calledWith(expectedResObj);
|
||||||
|
});
|
||||||
|
return it('does not calls payments.buyGems function', function() {
|
||||||
|
inApp.iosVerify(req, res, next);
|
||||||
|
return expect(paymentSpy).to.not.be.called;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
context('error in validation', function() {
|
||||||
|
before(function() {
|
||||||
|
iapMock.setup = function(cb) {
|
||||||
|
return cb(null);
|
||||||
|
};
|
||||||
|
return iapMock.validate = function(iapApple, iapBodyReciept, cb) {
|
||||||
|
return cb('error in validation', true);
|
||||||
|
};
|
||||||
|
});
|
||||||
|
it('calls res.json with validation error object', function() {
|
||||||
|
var expectedResObj;
|
||||||
|
expectedResObj = {
|
||||||
|
ok: false,
|
||||||
|
data: {
|
||||||
|
code: 6778001,
|
||||||
|
message: 'error in validation'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
inApp.iosVerify(req, res, next);
|
||||||
|
expect(res.json).to.be.calledOnce;
|
||||||
|
return expect(res.json).to.be.calledWith(expectedResObj);
|
||||||
|
});
|
||||||
|
return it('does not calls payments.buyGems function', function() {
|
||||||
|
inApp.iosVerify(req, res, next);
|
||||||
|
return expect(paymentSpy).to.not.be.called;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
context('iap is not valid', function() {
|
||||||
|
before(function() {
|
||||||
|
iapMock.setup = function(cb) {
|
||||||
|
return cb(null);
|
||||||
|
};
|
||||||
|
iapMock.validate = function(iapApple, iapBodyReciept, cb) {
|
||||||
|
return cb(null, false);
|
||||||
|
};
|
||||||
|
return iapMock.isValidated = function(appleRes) {
|
||||||
|
return appleRes;
|
||||||
|
};
|
||||||
|
});
|
||||||
|
it('does not call res.json', function() {
|
||||||
|
var expectedResObj;
|
||||||
|
inApp.iosVerify(req, res, next);
|
||||||
|
expectedResObj = {
|
||||||
|
ok: false,
|
||||||
|
data: {
|
||||||
|
code: 6778001,
|
||||||
|
message: 'Invalid receipt'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
expect(res.json).to.be.calledOnce;
|
||||||
|
return expect(res.json).to.be.calledWith(expectedResObj);
|
||||||
|
});
|
||||||
|
return it('does not calls payments.buyGems function', function() {
|
||||||
|
inApp.iosVerify(req, res, next);
|
||||||
|
return expect(paymentSpy).to.not.be.called;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
context('iap is valid but has no purchaseDataList', function() {
|
||||||
|
before(function() {
|
||||||
|
iapMock.setup = function(cb) {
|
||||||
|
return cb(null);
|
||||||
|
};
|
||||||
|
iapMock.validate = function(iapApple, iapBodyReciept, cb) {
|
||||||
|
return cb(null, true);
|
||||||
|
};
|
||||||
|
iapMock.isValidated = function(appleRes) {
|
||||||
|
return appleRes;
|
||||||
|
};
|
||||||
|
iapMock.getPurchaseData = function(appleRes) {
|
||||||
|
return [];
|
||||||
|
};
|
||||||
|
return iapMock.APPLE = 'apple';
|
||||||
|
});
|
||||||
|
it('calls res.json with succesful result object', function() {
|
||||||
|
var expectedResObj;
|
||||||
|
expectedResObj = {
|
||||||
|
ok: false,
|
||||||
|
data: {
|
||||||
|
code: 6778001,
|
||||||
|
message: 'Incorrect receipt content'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
inApp.iosVerify(req, res, next);
|
||||||
|
expect(res.json).to.be.calledOnce;
|
||||||
|
return expect(res.json).to.be.calledWith(expectedResObj);
|
||||||
|
});
|
||||||
|
return it('does not calls payments.buyGems function', function() {
|
||||||
|
inApp.iosVerify(req, res, next);
|
||||||
|
return expect(paymentSpy).to.not.be.called;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
return context('iap is valid, has purchaseDataList, but productId does not match', function() {
|
||||||
|
before(function() {
|
||||||
|
iapMock.setup = function(cb) {
|
||||||
|
return cb(null);
|
||||||
|
};
|
||||||
|
iapMock.validate = function(iapApple, iapBodyReciept, cb) {
|
||||||
|
return cb(null, true);
|
||||||
|
};
|
||||||
|
iapMock.isValidated = function(appleRes) {
|
||||||
|
return appleRes;
|
||||||
|
};
|
||||||
|
iapMock.getPurchaseData = function(appleRes) {
|
||||||
|
return [
|
||||||
|
{
|
||||||
|
productId: 'com.another.company'
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
return iapMock.APPLE = 'apple';
|
||||||
|
});
|
||||||
|
it('calls res.json with incorrect reciept obj', function() {
|
||||||
|
var expectedResObj;
|
||||||
|
expectedResObj = {
|
||||||
|
ok: false,
|
||||||
|
data: {
|
||||||
|
code: 6778001,
|
||||||
|
message: 'Incorrect receipt content'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
inApp.iosVerify(req, res, next);
|
||||||
|
expect(res.json).to.be.calledOnce;
|
||||||
|
return expect(res.json).to.be.calledWith(expectedResObj);
|
||||||
|
});
|
||||||
|
return it('does not calls payments.buyGems function', function() {
|
||||||
|
inApp.iosVerify(req, res, next);
|
||||||
|
return expect(paymentSpy).to.not.be.called;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|||||||
@@ -1,237 +1,74 @@
|
|||||||
(function() {
|
var Group, app, diff;
|
||||||
'use strict';
|
|
||||||
var Group, app, diff;
|
|
||||||
|
|
||||||
diff = require("deep-diff");
|
diff = require("deep-diff");
|
||||||
|
|
||||||
Group = require("../../website/src/models/group").model;
|
Group = require("../../website/src/models/group").model;
|
||||||
|
|
||||||
app = require("../../website/src/server");
|
app = require("../../website/src/server");
|
||||||
|
|
||||||
describe("Party", function() {
|
describe("Party", function() {
|
||||||
return context("Quests", function() {
|
return context("Quests", function() {
|
||||||
var group, notParticipating, participating, party;
|
var group, notParticipating, participating, party;
|
||||||
party = void 0;
|
party = void 0;
|
||||||
group = void 0;
|
group = void 0;
|
||||||
participating = [];
|
participating = [];
|
||||||
notParticipating = [];
|
notParticipating = [];
|
||||||
beforeEach(function(done) {
|
beforeEach(function(done) {
|
||||||
Group.update({
|
Group.update({
|
||||||
_id: "habitrpg"
|
_id: "habitrpg"
|
||||||
}, {
|
}, {
|
||||||
$set: {
|
$set: {
|
||||||
quest: {
|
quest: {
|
||||||
key: "dilatory",
|
key: "dilatory",
|
||||||
active: true,
|
active: true,
|
||||||
progress: {
|
progress: {
|
||||||
hp: shared.content.quests.dilatory.boss.hp,
|
hp: shared.content.quests.dilatory.boss.hp,
|
||||||
rage: 0
|
rage: 0
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}).exec();
|
}
|
||||||
return async.waterfall([
|
}).exec();
|
||||||
function(cb) {
|
return async.waterfall([
|
||||||
return registerNewUser(cb, true);
|
function(cb) {
|
||||||
}, function(user, cb) {
|
return registerNewUser(cb, true);
|
||||||
return request.post(baseURL + "/groups").send({
|
}, function(user, cb) {
|
||||||
name: "TestGroup",
|
return request.post(baseURL + "/groups").send({
|
||||||
type: "party"
|
name: "TestGroup",
|
||||||
}).end(function(err, res) {
|
type: "party"
|
||||||
expectCode(res, 200);
|
}).end(function(err, res) {
|
||||||
group = res.body;
|
expectCode(res, 200);
|
||||||
expect(group.members.length).to.equal(1);
|
group = res.body;
|
||||||
expect(group.leader).to.equal(user._id);
|
expect(group.members.length).to.equal(1);
|
||||||
return cb();
|
expect(group.leader).to.equal(user._id);
|
||||||
});
|
return cb();
|
||||||
}, function(cb) {
|
|
||||||
return request.post(baseURL + '/user/tasks').send({
|
|
||||||
type: 'daily',
|
|
||||||
text: 'daily one'
|
|
||||||
}).end(function(err, res) {
|
|
||||||
return cb();
|
|
||||||
});
|
|
||||||
}, function(cb) {
|
|
||||||
return request.post(baseURL + '/user/tasks').send({
|
|
||||||
type: 'daily',
|
|
||||||
text: 'daily two'
|
|
||||||
}).end(function(err, res) {
|
|
||||||
return cb();
|
|
||||||
});
|
|
||||||
}, function(cb) {
|
|
||||||
return User.findByIdAndUpdate(user._id, {
|
|
||||||
$set: {
|
|
||||||
"stats.lvl": 50
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
"new": true
|
|
||||||
}, function(err, _user) {
|
|
||||||
return cb(null, _user);
|
|
||||||
});
|
|
||||||
}, function(_user, cb) {
|
|
||||||
var user;
|
|
||||||
user = _user;
|
|
||||||
return 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(function(err, res) {
|
|
||||||
user = res.body;
|
|
||||||
expect(user.party.quest.progress.up).to.be.above(0);
|
|
||||||
return async.waterfall([
|
|
||||||
function(cb) {
|
|
||||||
return registerManyUsers(3, cb);
|
|
||||||
}, function(_party, cb) {
|
|
||||||
var inviteURL;
|
|
||||||
party = _party;
|
|
||||||
inviteURL = baseURL + "/groups/" + group._id + "/invite";
|
|
||||||
return async.parallel([
|
|
||||||
function(cb2) {
|
|
||||||
return request.post(inviteURL).send({
|
|
||||||
uuids: [party[0]._id]
|
|
||||||
}).end(function() {
|
|
||||||
return cb2();
|
|
||||||
});
|
|
||||||
}, function(cb2) {
|
|
||||||
return request.post(inviteURL).send({
|
|
||||||
uuids: [party[1]._id]
|
|
||||||
}).end(function() {
|
|
||||||
return cb2();
|
|
||||||
});
|
|
||||||
}, function(cb2) {
|
|
||||||
return request.post(inviteURL).send({
|
|
||||||
uuids: [party[2]._id]
|
|
||||||
}).end(function(err, res) {
|
|
||||||
return cb2();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
], cb);
|
|
||||||
}, function(results, cb) {
|
|
||||||
var series;
|
|
||||||
series = _.reduce(party, function(m, v, i) {
|
|
||||||
m.push(function(cb2) {
|
|
||||||
return request.post(baseURL + "/groups/" + group._id + "/join").set("X-API-User", party[i]._id).set("X-API-Key", party[i].apiToken).end(function() {
|
|
||||||
return cb2();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
return m;
|
|
||||||
}, []);
|
|
||||||
return async.series(series, cb);
|
|
||||||
}, function(whatever, cb) {
|
|
||||||
return Group.findById(group._id, function(err, g) {
|
|
||||||
group = g;
|
|
||||||
expect(g.members.length).to.equal(4);
|
|
||||||
return cb();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
], function() {
|
|
||||||
return async.waterfall([
|
|
||||||
function(cb) {
|
|
||||||
return request.post(baseURL + "/groups/" + group._id + "/questAccept?key=vice3").end(function(err, res) {
|
|
||||||
expectCode(res, 400);
|
|
||||||
return User.findByIdAndUpdate(user._id, {
|
|
||||||
$set: {
|
|
||||||
"items.quests.vice3": 1
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
"new": true
|
|
||||||
}, cb);
|
|
||||||
});
|
|
||||||
}, function(_user, cb) {
|
|
||||||
return request.post(baseURL + "/groups/" + group._id + "/questAccept?key=vice3").end(function(err, res) {
|
|
||||||
expectCode(res, 200);
|
|
||||||
return Group.findById(group._id, cb);
|
|
||||||
});
|
|
||||||
}, function(_group, cb) {
|
|
||||||
expect(_group.quest.key).to.equal("vice3");
|
|
||||||
expect(_group.quest.active).to.equal(false);
|
|
||||||
return request.post(baseURL + "/groups/" + group._id + "/questAccept").set("X-API-User", party[0]._id).set("X-API-Key", party[0].apiToken).end(function() {
|
|
||||||
return request.post(baseURL + "/groups/" + group._id + "/questAccept").set("X-API-User", party[1]._id).set("X-API-Key", party[1].apiToken).end(function(err, res) {
|
|
||||||
return request.post(baseURL + "/groups/" + group._id + "/questReject").set("X-API-User", party[2]._id).set("X-API-Key", party[2].apiToken).end(function(err, res) {
|
|
||||||
group = res.body;
|
|
||||||
expect(group.quest.active).to.equal(true);
|
|
||||||
return cb();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
], done);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
]);
|
|
||||||
});
|
|
||||||
it("Casts a spell", function(done) {
|
|
||||||
var mp;
|
|
||||||
mp = user.stats.mp;
|
|
||||||
return request.get(baseURL + "/members/" + party[0]._id).end(function(err, res) {
|
|
||||||
party[0] = res.body;
|
|
||||||
return request.post(baseURL + "/user/class/cast/snowball?targetType=user&targetId=" + party[0]._id).end(function(err, res) {
|
|
||||||
return request.get(baseURL + "/members/" + party[0]._id).end(function(err, res) {
|
|
||||||
var difference, member;
|
|
||||||
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);
|
|
||||||
return request.put(baseURL + "/user").send({
|
|
||||||
"stats.lvl": 5
|
|
||||||
}).end(function(err, res) {
|
|
||||||
return request.put(baseURL + "/user").send({
|
|
||||||
"stats.mp": 100
|
|
||||||
}).end(function(err, res) {
|
|
||||||
return request.post(baseURL + "/user/class/cast/valorousPresence?targetType=party").end(function(err, res) {
|
|
||||||
return request.get(baseURL + "/members/" + member._id).end(function(err, res) {
|
|
||||||
expect(res.body.stats.buffs.str).to.be.above(0);
|
|
||||||
expect(diff(res.body, member).length).to.equal(1);
|
|
||||||
return done();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
});
|
}, function(cb) {
|
||||||
});
|
return request.post(baseURL + '/user/tasks').send({
|
||||||
it("Doesn't include people who aren't participating", function(done) {
|
type: 'daily',
|
||||||
return request.get(baseURL + "/groups/" + group._id).end(function(err, res) {
|
text: 'daily one'
|
||||||
expect(_.size(res.body.quest.members)).to.equal(3);
|
}).end(function(err, res) {
|
||||||
return done();
|
return cb();
|
||||||
});
|
|
||||||
});
|
|
||||||
it("allows quest participants to leave quest", function(done) {
|
|
||||||
var leavingMember;
|
|
||||||
leavingMember = party[1];
|
|
||||||
expect(group.quest.members[leavingMember._id]).to.eql(true);
|
|
||||||
return request.post(baseURL + "/groups/" + group._id + "/questLeave").set("X-API-User", leavingMember._id).set("X-API-Key", leavingMember.apiToken).end(function(err, res) {
|
|
||||||
expectCode(res, 204);
|
|
||||||
return request.get(baseURL + '/groups/party').end(function(err, res) {
|
|
||||||
expect(res.body.quest.members[leavingMember._id]).to.not.be.ok;
|
|
||||||
return done();
|
|
||||||
});
|
});
|
||||||
});
|
}, function(cb) {
|
||||||
});
|
return request.post(baseURL + '/user/tasks').send({
|
||||||
return xit("Hurts the boss", function(done) {
|
type: 'daily',
|
||||||
return request.post(baseURL + "/user/batch-update").end(function(err, res) {
|
text: 'daily two'
|
||||||
var up, user;
|
}).end(function(err, res) {
|
||||||
user = res.body;
|
return cb();
|
||||||
up = user.party.quest.progress.up;
|
});
|
||||||
expect(up).to.be.above(0);
|
}, function(cb) {
|
||||||
|
return User.findByIdAndUpdate(user._id, {
|
||||||
|
$set: {
|
||||||
|
"stats.lvl": 50
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
"new": true
|
||||||
|
}, function(err, _user) {
|
||||||
|
return cb(null, _user);
|
||||||
|
});
|
||||||
|
}, function(_user, cb) {
|
||||||
|
var user;
|
||||||
|
user = _user;
|
||||||
return request.post(baseURL + "/user/batch-update").send([
|
return request.post(baseURL + "/user/batch-update").send([
|
||||||
{
|
{
|
||||||
op: "score",
|
op: "score",
|
||||||
@@ -239,138 +76,297 @@
|
|||||||
direction: "up",
|
direction: "up",
|
||||||
id: user.dailys[0].id
|
id: user.dailys[0].id
|
||||||
}
|
}
|
||||||
|
}, {
|
||||||
|
op: "score",
|
||||||
|
params: {
|
||||||
|
direction: "up",
|
||||||
|
id: user.dailys[0].id
|
||||||
|
}
|
||||||
}, {
|
}, {
|
||||||
op: "update",
|
op: "update",
|
||||||
body: {
|
body: {
|
||||||
lastCron: moment().subtract(1, "days")
|
"stats.lvl": 50
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]).end(function(err, res) {
|
]).end(function(err, res) {
|
||||||
expect(res.body.party.quest.progress.up).to.be.above(up);
|
user = res.body;
|
||||||
return request.post(baseURL + "/user/batch-update").end(function() {
|
expect(user.party.quest.progress.up).to.be.above(0);
|
||||||
return request.get(baseURL + "/groups/party").end(function(err, res) {
|
return async.waterfall([
|
||||||
return async.waterfall([
|
function(cb) {
|
||||||
function(cb) {
|
return registerManyUsers(3, cb);
|
||||||
return async.parallel([
|
}, function(_party, cb) {
|
||||||
function(cb2) {
|
var inviteURL;
|
||||||
return Group.findById("habitrpg", {
|
party = _party;
|
||||||
quest: 1
|
inviteURL = baseURL + "/groups/" + group._id + "/invite";
|
||||||
}, function(err, tavern) {
|
return async.parallel([
|
||||||
expect(tavern.quest.progress.hp).to.be.below(shared.content.quests.dilatory.boss.hp);
|
function(cb2) {
|
||||||
expect(tavern.quest.progress.rage).to.be.above(0);
|
return request.post(inviteURL).send({
|
||||||
return cb2();
|
uuids: [party[0]._id]
|
||||||
});
|
}).end(function() {
|
||||||
}, function(cb2) {
|
return cb2();
|
||||||
var _party;
|
|
||||||
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);
|
|
||||||
return cb2();
|
|
||||||
}
|
|
||||||
], cb);
|
|
||||||
}, function(whatever, cb) {
|
|
||||||
return async.waterfall([
|
|
||||||
function(cb2) {
|
|
||||||
expect(user.items.pets["MantisShrimp-Base"]).to.not.be.ok();
|
|
||||||
return Group.update({
|
|
||||||
_id: "habitrpg"
|
|
||||||
}, {
|
|
||||||
$set: {
|
|
||||||
"quest.progress.hp": 0
|
|
||||||
}
|
|
||||||
}, cb2);
|
|
||||||
}, function(arg1, arg2, cb2) {
|
|
||||||
expect(user.items.gear.owned.weapon_special_2).to.not.be.ok();
|
|
||||||
return Group.findByIdAndUpdate(group._id, {
|
|
||||||
$set: {
|
|
||||||
"quest.progress.hp": 0
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
"new": true
|
|
||||||
}, cb2);
|
|
||||||
}
|
|
||||||
], cb);
|
|
||||||
}, function(_group, cb) {
|
|
||||||
return 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(function() {
|
|
||||||
return cb();
|
|
||||||
});
|
});
|
||||||
}, function(cb) {
|
}, function(cb2) {
|
||||||
return request.post(baseURL + "/user/batch-update").end(function(err, res) {
|
return request.post(inviteURL).send({
|
||||||
return cb(null, res.body);
|
uuids: [party[1]._id]
|
||||||
|
}).end(function() {
|
||||||
|
return cb2();
|
||||||
|
});
|
||||||
|
}, function(cb2) {
|
||||||
|
return request.post(inviteURL).send({
|
||||||
|
uuids: [party[2]._id]
|
||||||
|
}).end(function(err, res) {
|
||||||
|
return cb2();
|
||||||
});
|
});
|
||||||
}, function(_user, cb) {
|
|
||||||
return User.findById(_user._id, cb);
|
|
||||||
}, function(_user, cb) {
|
|
||||||
user = _user;
|
|
||||||
return Group.findById(group._id, cb);
|
|
||||||
}, function(_group, cb) {
|
|
||||||
var cummExp, cummGp;
|
|
||||||
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;
|
|
||||||
return async.parallel([
|
|
||||||
function(cb2) {
|
|
||||||
return Group.findById("habitrpg", function(err, tavern) {
|
|
||||||
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);
|
|
||||||
return cb2();
|
|
||||||
});
|
|
||||||
}, function(cb2) {
|
|
||||||
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);
|
|
||||||
return async.parallel([
|
|
||||||
function(cb3) {
|
|
||||||
return User.findById(party[0].id, function(err, mbr) {
|
|
||||||
expect(mbr.items.gear.owned.weapon_special_2).to.equal(true);
|
|
||||||
return cb3();
|
|
||||||
});
|
|
||||||
}, function(cb3) {
|
|
||||||
return User.findById(party[1].id, function(err, mbr) {
|
|
||||||
expect(mbr.items.gear.owned.weapon_special_2).to.equal(true);
|
|
||||||
return cb3();
|
|
||||||
});
|
|
||||||
}, function(cb3) {
|
|
||||||
return User.findById(party[2].id, function(err, mbr) {
|
|
||||||
expect(mbr.items.gear.owned.weapon_special_2).to.not.be.ok();
|
|
||||||
return cb3();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
], cb2);
|
|
||||||
}
|
|
||||||
], cb);
|
|
||||||
}
|
}
|
||||||
], done);
|
], cb);
|
||||||
|
}, function(results, cb) {
|
||||||
|
var series;
|
||||||
|
series = _.reduce(party, function(m, v, i) {
|
||||||
|
m.push(function(cb2) {
|
||||||
|
return request.post(baseURL + "/groups/" + group._id + "/join").set("X-API-User", party[i]._id).set("X-API-Key", party[i].apiToken).end(function() {
|
||||||
|
return cb2();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
return m;
|
||||||
|
}, []);
|
||||||
|
return async.series(series, cb);
|
||||||
|
}, function(whatever, cb) {
|
||||||
|
return Group.findById(group._id, function(err, g) {
|
||||||
|
group = g;
|
||||||
|
expect(g.members.length).to.equal(4);
|
||||||
|
return cb();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
], function() {
|
||||||
|
return async.waterfall([
|
||||||
|
function(cb) {
|
||||||
|
return request.post(baseURL + "/groups/" + group._id + "/questAccept?key=vice3").end(function(err, res) {
|
||||||
|
expectCode(res, 400);
|
||||||
|
return User.findByIdAndUpdate(user._id, {
|
||||||
|
$set: {
|
||||||
|
"items.quests.vice3": 1
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
"new": true
|
||||||
|
}, cb);
|
||||||
|
});
|
||||||
|
}, function(_user, cb) {
|
||||||
|
return request.post(baseURL + "/groups/" + group._id + "/questAccept?key=vice3").end(function(err, res) {
|
||||||
|
expectCode(res, 200);
|
||||||
|
return Group.findById(group._id, cb);
|
||||||
|
});
|
||||||
|
}, function(_group, cb) {
|
||||||
|
expect(_group.quest.key).to.equal("vice3");
|
||||||
|
expect(_group.quest.active).to.equal(false);
|
||||||
|
return request.post(baseURL + "/groups/" + group._id + "/questAccept").set("X-API-User", party[0]._id).set("X-API-Key", party[0].apiToken).end(function() {
|
||||||
|
return request.post(baseURL + "/groups/" + group._id + "/questAccept").set("X-API-User", party[1]._id).set("X-API-Key", party[1].apiToken).end(function(err, res) {
|
||||||
|
return request.post(baseURL + "/groups/" + group._id + "/questReject").set("X-API-User", party[2]._id).set("X-API-Key", party[2].apiToken).end(function(err, res) {
|
||||||
|
group = res.body;
|
||||||
|
expect(group.quest.active).to.equal(true);
|
||||||
|
return cb();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
], done);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
]);
|
||||||
|
});
|
||||||
|
it("Casts a spell", function(done) {
|
||||||
|
var mp;
|
||||||
|
mp = user.stats.mp;
|
||||||
|
return request.get(baseURL + "/members/" + party[0]._id).end(function(err, res) {
|
||||||
|
party[0] = res.body;
|
||||||
|
return request.post(baseURL + "/user/class/cast/snowball?targetType=user&targetId=" + party[0]._id).end(function(err, res) {
|
||||||
|
return request.get(baseURL + "/members/" + party[0]._id).end(function(err, res) {
|
||||||
|
var difference, member;
|
||||||
|
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);
|
||||||
|
return request.put(baseURL + "/user").send({
|
||||||
|
"stats.lvl": 5
|
||||||
|
}).end(function(err, res) {
|
||||||
|
return request.put(baseURL + "/user").send({
|
||||||
|
"stats.mp": 100
|
||||||
|
}).end(function(err, res) {
|
||||||
|
return request.post(baseURL + "/user/class/cast/valorousPresence?targetType=party").end(function(err, res) {
|
||||||
|
return request.get(baseURL + "/members/" + member._id).end(function(err, res) {
|
||||||
|
expect(res.body.stats.buffs.str).to.be.above(0);
|
||||||
|
expect(diff(res.body, member).length).to.equal(1);
|
||||||
|
return done();
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
it("Doesn't include people who aren't participating", function(done) {
|
||||||
|
return request.get(baseURL + "/groups/" + group._id).end(function(err, res) {
|
||||||
|
expect(_.size(res.body.quest.members)).to.equal(3);
|
||||||
|
return done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
it("allows quest participants to leave quest", function(done) {
|
||||||
|
var leavingMember;
|
||||||
|
leavingMember = party[1];
|
||||||
|
expect(group.quest.members[leavingMember._id]).to.eql(true);
|
||||||
|
return request.post(baseURL + "/groups/" + group._id + "/questLeave").set("X-API-User", leavingMember._id).set("X-API-Key", leavingMember.apiToken).end(function(err, res) {
|
||||||
|
expectCode(res, 204);
|
||||||
|
return request.get(baseURL + '/groups/party').end(function(err, res) {
|
||||||
|
expect(res.body.quest.members[leavingMember._id]).to.not.be.ok;
|
||||||
|
return done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
return xit("Hurts the boss", function(done) {
|
||||||
|
return request.post(baseURL + "/user/batch-update").end(function(err, res) {
|
||||||
|
var up, user;
|
||||||
|
user = res.body;
|
||||||
|
up = user.party.quest.progress.up;
|
||||||
|
expect(up).to.be.above(0);
|
||||||
|
return 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(function(err, res) {
|
||||||
|
expect(res.body.party.quest.progress.up).to.be.above(up);
|
||||||
|
return request.post(baseURL + "/user/batch-update").end(function() {
|
||||||
|
return request.get(baseURL + "/groups/party").end(function(err, res) {
|
||||||
|
return async.waterfall([
|
||||||
|
function(cb) {
|
||||||
|
return async.parallel([
|
||||||
|
function(cb2) {
|
||||||
|
return Group.findById("habitrpg", {
|
||||||
|
quest: 1
|
||||||
|
}, function(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);
|
||||||
|
return cb2();
|
||||||
|
});
|
||||||
|
}, function(cb2) {
|
||||||
|
var _party;
|
||||||
|
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);
|
||||||
|
return cb2();
|
||||||
|
}
|
||||||
|
], cb);
|
||||||
|
}, function(whatever, cb) {
|
||||||
|
return async.waterfall([
|
||||||
|
function(cb2) {
|
||||||
|
expect(user.items.pets["MantisShrimp-Base"]).to.not.be.ok();
|
||||||
|
return Group.update({
|
||||||
|
_id: "habitrpg"
|
||||||
|
}, {
|
||||||
|
$set: {
|
||||||
|
"quest.progress.hp": 0
|
||||||
|
}
|
||||||
|
}, cb2);
|
||||||
|
}, function(arg1, arg2, cb2) {
|
||||||
|
expect(user.items.gear.owned.weapon_special_2).to.not.be.ok();
|
||||||
|
return Group.findByIdAndUpdate(group._id, {
|
||||||
|
$set: {
|
||||||
|
"quest.progress.hp": 0
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
"new": true
|
||||||
|
}, cb2);
|
||||||
|
}
|
||||||
|
], cb);
|
||||||
|
}, function(_group, cb) {
|
||||||
|
return 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(function() {
|
||||||
|
return cb();
|
||||||
|
});
|
||||||
|
}, function(cb) {
|
||||||
|
return request.post(baseURL + "/user/batch-update").end(function(err, res) {
|
||||||
|
return cb(null, res.body);
|
||||||
|
});
|
||||||
|
}, function(_user, cb) {
|
||||||
|
return User.findById(_user._id, cb);
|
||||||
|
}, function(_user, cb) {
|
||||||
|
user = _user;
|
||||||
|
return Group.findById(group._id, cb);
|
||||||
|
}, function(_group, cb) {
|
||||||
|
var cummExp, cummGp;
|
||||||
|
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;
|
||||||
|
return async.parallel([
|
||||||
|
function(cb2) {
|
||||||
|
return Group.findById("habitrpg", function(err, tavern) {
|
||||||
|
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);
|
||||||
|
return cb2();
|
||||||
|
});
|
||||||
|
}, function(cb2) {
|
||||||
|
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);
|
||||||
|
return async.parallel([
|
||||||
|
function(cb3) {
|
||||||
|
return User.findById(party[0].id, function(err, mbr) {
|
||||||
|
expect(mbr.items.gear.owned.weapon_special_2).to.equal(true);
|
||||||
|
return cb3();
|
||||||
|
});
|
||||||
|
}, function(cb3) {
|
||||||
|
return User.findById(party[1].id, function(err, mbr) {
|
||||||
|
expect(mbr.items.gear.owned.weapon_special_2).to.equal(true);
|
||||||
|
return cb3();
|
||||||
|
});
|
||||||
|
}, function(cb3) {
|
||||||
|
return User.findById(party[2].id, function(err, mbr) {
|
||||||
|
expect(mbr.items.gear.owned.weapon_special_2).to.not.be.ok();
|
||||||
|
return cb3();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
], cb2);
|
||||||
|
}
|
||||||
|
], cb);
|
||||||
|
}
|
||||||
|
], done);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
});
|
||||||
}).call(this);
|
|
||||||
|
|||||||
@@ -1,434 +1,430 @@
|
|||||||
(function() {
|
var app, rewire, sinon;
|
||||||
'use strict';
|
|
||||||
var app, rewire, sinon;
|
|
||||||
|
|
||||||
app = require("../../website/src/server");
|
app = require("../../website/src/server");
|
||||||
|
|
||||||
rewire = require('rewire');
|
rewire = require('rewire');
|
||||||
|
|
||||||
sinon = require('sinon');
|
sinon = require('sinon');
|
||||||
|
|
||||||
describe("Push-Notifications", function() {
|
describe("Push-Notifications", function() {
|
||||||
before(function(done) {
|
before(function(done) {
|
||||||
return registerNewUser(done, true);
|
return registerNewUser(done, true);
|
||||||
|
});
|
||||||
|
return describe("Events that send push notifications", function() {
|
||||||
|
var pushSpy;
|
||||||
|
pushSpy = {
|
||||||
|
sendNotify: sinon.spy()
|
||||||
|
};
|
||||||
|
afterEach(function(done) {
|
||||||
|
pushSpy.sendNotify.reset();
|
||||||
|
return done();
|
||||||
});
|
});
|
||||||
return describe("Events that send push notifications", function() {
|
context("Challenges", function() {
|
||||||
var pushSpy;
|
var challengeMock, challenges, userMock;
|
||||||
pushSpy = {
|
challenges = rewire("../../website/src/controllers/api-v2/challenges");
|
||||||
sendNotify: sinon.spy()
|
challenges.__set__('pushNotify', pushSpy);
|
||||||
|
challengeMock = {
|
||||||
|
findById: function(arg, cb) {
|
||||||
|
return cb(null, {
|
||||||
|
leader: user._id,
|
||||||
|
name: 'challenge-name'
|
||||||
|
});
|
||||||
|
}
|
||||||
};
|
};
|
||||||
afterEach(function(done) {
|
userMock = {
|
||||||
pushSpy.sendNotify.reset();
|
findById: function(arg, cb) {
|
||||||
return done();
|
return cb(null, user);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
challenges.__set__('Challenge', challengeMock);
|
||||||
|
challenges.__set__('User', userMock);
|
||||||
|
challenges.__set__('closeChal', function() {
|
||||||
|
return true;
|
||||||
});
|
});
|
||||||
context("Challenges", function() {
|
beforeEach(function(done) {
|
||||||
var challengeMock, challenges, userMock;
|
return registerNewUser(function() {
|
||||||
challenges = rewire("../../website/src/controllers/api-v2/challenges");
|
user.preferences.emailNotifications.wonChallenge = false;
|
||||||
challenges.__set__('pushNotify', pushSpy);
|
user.save = function(cb) {
|
||||||
challengeMock = {
|
|
||||||
findById: function(arg, cb) {
|
|
||||||
return cb(null, {
|
|
||||||
leader: user._id,
|
|
||||||
name: 'challenge-name'
|
|
||||||
});
|
|
||||||
}
|
|
||||||
};
|
|
||||||
userMock = {
|
|
||||||
findById: function(arg, cb) {
|
|
||||||
return cb(null, user);
|
return cb(null, user);
|
||||||
|
};
|
||||||
|
return done();
|
||||||
|
}, true);
|
||||||
|
});
|
||||||
|
return it("sends a push notification when you win a challenge", function(done) {
|
||||||
|
var req, res;
|
||||||
|
req = {
|
||||||
|
params: {
|
||||||
|
cid: 'challenge-id'
|
||||||
|
},
|
||||||
|
query: {
|
||||||
|
uid: 'user-id'
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
challenges.__set__('Challenge', challengeMock);
|
res = {
|
||||||
challenges.__set__('User', userMock);
|
locals: {
|
||||||
challenges.__set__('closeChal', function() {
|
user: user
|
||||||
return true;
|
}
|
||||||
});
|
};
|
||||||
beforeEach(function(done) {
|
challenges.selectWinner(req, res);
|
||||||
return registerNewUser(function() {
|
return setTimeout(function() {
|
||||||
user.preferences.emailNotifications.wonChallenge = false;
|
expect(pushSpy.sendNotify).to.have.been.calledOnce;
|
||||||
user.save = function(cb) {
|
expect(pushSpy.sendNotify).to.have.been.calledWith(user, 'You won a Challenge!', 'challenge-name');
|
||||||
return cb(null, user);
|
return done();
|
||||||
};
|
}, 100);
|
||||||
return done();
|
|
||||||
}, true);
|
|
||||||
});
|
|
||||||
return it("sends a push notification when you win a challenge", function(done) {
|
|
||||||
var req, res;
|
|
||||||
req = {
|
|
||||||
params: {
|
|
||||||
cid: 'challenge-id'
|
|
||||||
},
|
|
||||||
query: {
|
|
||||||
uid: 'user-id'
|
|
||||||
}
|
|
||||||
};
|
|
||||||
res = {
|
|
||||||
locals: {
|
|
||||||
user: user
|
|
||||||
}
|
|
||||||
};
|
|
||||||
challenges.selectWinner(req, res);
|
|
||||||
return setTimeout(function() {
|
|
||||||
expect(pushSpy.sendNotify).to.have.been.calledOnce;
|
|
||||||
expect(pushSpy.sendNotify).to.have.been.calledWith(user, 'You won a Challenge!', 'challenge-name');
|
|
||||||
return done();
|
|
||||||
}, 100);
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
context("Groups", function() {
|
});
|
||||||
var groups, recipient;
|
context("Groups", function() {
|
||||||
recipient = null;
|
var groups, recipient;
|
||||||
groups = rewire("../../website/src/controllers/api-v2/groups");
|
recipient = null;
|
||||||
groups.__set__('pushNotify', pushSpy);
|
groups = rewire("../../website/src/controllers/api-v2/groups");
|
||||||
before(function(done) {
|
groups.__set__('pushNotify', pushSpy);
|
||||||
return registerNewUser(function(err, _user) {
|
before(function(done) {
|
||||||
var userMock;
|
return registerNewUser(function(err, _user) {
|
||||||
recipient = _user;
|
var userMock;
|
||||||
recipient.invitations.guilds = [];
|
recipient = _user;
|
||||||
recipient.save = function(cb) {
|
recipient.invitations.guilds = [];
|
||||||
return cb(null, recipient);
|
recipient.save = function(cb) {
|
||||||
};
|
return cb(null, recipient);
|
||||||
recipient.preferences.emailNotifications.invitedGuild = false;
|
|
||||||
recipient.preferences.emailNotifications.invitedParty = false;
|
|
||||||
recipient.preferences.emailNotifications.invitedQuest = false;
|
|
||||||
userMock = {
|
|
||||||
findById: function(arg, cb) {
|
|
||||||
return cb(null, recipient);
|
|
||||||
},
|
|
||||||
find: function(arg, arg2, cb) {
|
|
||||||
return cb(null, [recipient]);
|
|
||||||
},
|
|
||||||
update: function(arg, arg2) {
|
|
||||||
return {
|
|
||||||
exec: function() {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
};
|
|
||||||
groups.__set__('User', userMock);
|
|
||||||
return done();
|
|
||||||
}, false);
|
|
||||||
});
|
|
||||||
it("sends a push notification when invited to a guild", function(done) {
|
|
||||||
var group, req, res;
|
|
||||||
group = {
|
|
||||||
_id: 'guild-id',
|
|
||||||
name: 'guild-name',
|
|
||||||
type: 'guild',
|
|
||||||
members: [user._id],
|
|
||||||
invites: []
|
|
||||||
};
|
|
||||||
group.save = function(cb) {
|
|
||||||
return cb(null, group);
|
|
||||||
};
|
|
||||||
req = {
|
|
||||||
body: {
|
|
||||||
uuids: [recipient._id]
|
|
||||||
}
|
|
||||||
};
|
|
||||||
res = {
|
|
||||||
locals: {
|
|
||||||
group: group,
|
|
||||||
user: user
|
|
||||||
},
|
|
||||||
json: function() {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
groups.invite(req, res);
|
|
||||||
return setTimeout(function() {
|
|
||||||
expect(pushSpy.sendNotify).to.have.been.calledOnce;
|
|
||||||
expect(pushSpy.sendNotify).to.have.been.calledWith(recipient, 'Invited To Guild', group.name);
|
|
||||||
return done();
|
|
||||||
}, 100);
|
|
||||||
});
|
|
||||||
it("sends a push notification when invited to a party", function(done) {
|
|
||||||
var group, req, res;
|
|
||||||
group = {
|
|
||||||
_id: 'party-id',
|
|
||||||
name: 'party-name',
|
|
||||||
type: 'party',
|
|
||||||
members: [user._id],
|
|
||||||
invites: []
|
|
||||||
};
|
|
||||||
group.save = function(cb) {
|
|
||||||
return cb(null, group);
|
|
||||||
};
|
|
||||||
req = {
|
|
||||||
body: {
|
|
||||||
uuids: [recipient._id]
|
|
||||||
}
|
|
||||||
};
|
|
||||||
res = {
|
|
||||||
locals: {
|
|
||||||
group: group,
|
|
||||||
user: user
|
|
||||||
},
|
|
||||||
json: function() {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
groups.invite(req, res);
|
|
||||||
return setTimeout(function() {
|
|
||||||
expect(pushSpy.sendNotify).to.have.been.calledOnce;
|
|
||||||
expect(pushSpy.sendNotify).to.have.been.calledWith(recipient, 'Invited To Party', group.name);
|
|
||||||
return done();
|
|
||||||
}, 100);
|
|
||||||
});
|
|
||||||
it("sends a push notification when invited to a quest", function(done) {
|
|
||||||
var group, req, res;
|
|
||||||
group = {
|
|
||||||
_id: 'party-id',
|
|
||||||
name: 'party-name',
|
|
||||||
type: 'party',
|
|
||||||
members: [user._id, recipient._id],
|
|
||||||
invites: [],
|
|
||||||
quest: {}
|
|
||||||
};
|
|
||||||
user.items.quests.hedgehog = 5;
|
|
||||||
group.save = function(cb) {
|
|
||||||
return cb(null, group);
|
|
||||||
};
|
|
||||||
group.markModified = function() {
|
|
||||||
return true;
|
|
||||||
};
|
|
||||||
req = {
|
|
||||||
body: {
|
|
||||||
uuids: [recipient._id]
|
|
||||||
},
|
|
||||||
query: {
|
|
||||||
key: 'hedgehog'
|
|
||||||
}
|
|
||||||
};
|
|
||||||
res = {
|
|
||||||
locals: {
|
|
||||||
group: group,
|
|
||||||
user: user
|
|
||||||
},
|
|
||||||
json: function() {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
groups.questAccept(req, res);
|
|
||||||
return setTimeout(function() {
|
|
||||||
expect(pushSpy.sendNotify).to.have.been.calledOnce;
|
|
||||||
expect(pushSpy.sendNotify).to.have.been.calledWith(recipient, 'Quest Invitation', 'Invitation for the Quest The Hedgebeast');
|
|
||||||
return done();
|
|
||||||
}, 100);
|
|
||||||
});
|
|
||||||
return it("sends a push notification to participating members when quest starts", function(done) {
|
|
||||||
var group, req, res, userMock;
|
|
||||||
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 = function(cb) {
|
|
||||||
return cb(null, group);
|
|
||||||
};
|
|
||||||
group.markModified = function() {
|
|
||||||
return true;
|
|
||||||
};
|
|
||||||
req = {
|
|
||||||
body: {
|
|
||||||
uuids: [recipient._id]
|
|
||||||
},
|
|
||||||
query: {}
|
|
||||||
};
|
|
||||||
res = {
|
|
||||||
locals: {
|
|
||||||
group: group,
|
|
||||||
user: user
|
|
||||||
},
|
|
||||||
json: function() {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
recipient.preferences.emailNotifications.invitedGuild = false;
|
||||||
|
recipient.preferences.emailNotifications.invitedParty = false;
|
||||||
|
recipient.preferences.emailNotifications.invitedQuest = false;
|
||||||
userMock = {
|
userMock = {
|
||||||
findOne: function(arg, arg2, cb) {
|
findById: function(arg, cb) {
|
||||||
return cb(null, recipient);
|
return cb(null, recipient);
|
||||||
},
|
},
|
||||||
update: function(arg, arg2, cb) {
|
find: function(arg, arg2, cb) {
|
||||||
if (cb) {
|
return cb(null, [recipient]);
|
||||||
return cb(null, user);
|
},
|
||||||
} else {
|
update: function(arg, arg2) {
|
||||||
return {
|
return {
|
||||||
exec: function() {
|
exec: function() {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
groups.__set__('User', userMock);
|
groups.__set__('User', userMock);
|
||||||
groups.__set__('populateQuery', function(arg, arg2, arg3) {
|
return done();
|
||||||
return {
|
}, false);
|
||||||
exec: function() {
|
});
|
||||||
return group.members;
|
it("sends a push notification when invited to a guild", function(done) {
|
||||||
|
var group, req, res;
|
||||||
|
group = {
|
||||||
|
_id: 'guild-id',
|
||||||
|
name: 'guild-name',
|
||||||
|
type: 'guild',
|
||||||
|
members: [user._id],
|
||||||
|
invites: []
|
||||||
|
};
|
||||||
|
group.save = function(cb) {
|
||||||
|
return cb(null, group);
|
||||||
|
};
|
||||||
|
req = {
|
||||||
|
body: {
|
||||||
|
uuids: [recipient._id]
|
||||||
|
}
|
||||||
|
};
|
||||||
|
res = {
|
||||||
|
locals: {
|
||||||
|
group: group,
|
||||||
|
user: user
|
||||||
|
},
|
||||||
|
json: function() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
groups.invite(req, res);
|
||||||
|
return setTimeout(function() {
|
||||||
|
expect(pushSpy.sendNotify).to.have.been.calledOnce;
|
||||||
|
expect(pushSpy.sendNotify).to.have.been.calledWith(recipient, 'Invited To Guild', group.name);
|
||||||
|
return done();
|
||||||
|
}, 100);
|
||||||
|
});
|
||||||
|
it("sends a push notification when invited to a party", function(done) {
|
||||||
|
var group, req, res;
|
||||||
|
group = {
|
||||||
|
_id: 'party-id',
|
||||||
|
name: 'party-name',
|
||||||
|
type: 'party',
|
||||||
|
members: [user._id],
|
||||||
|
invites: []
|
||||||
|
};
|
||||||
|
group.save = function(cb) {
|
||||||
|
return cb(null, group);
|
||||||
|
};
|
||||||
|
req = {
|
||||||
|
body: {
|
||||||
|
uuids: [recipient._id]
|
||||||
|
}
|
||||||
|
};
|
||||||
|
res = {
|
||||||
|
locals: {
|
||||||
|
group: group,
|
||||||
|
user: user
|
||||||
|
},
|
||||||
|
json: function() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
groups.invite(req, res);
|
||||||
|
return setTimeout(function() {
|
||||||
|
expect(pushSpy.sendNotify).to.have.been.calledOnce;
|
||||||
|
expect(pushSpy.sendNotify).to.have.been.calledWith(recipient, 'Invited To Party', group.name);
|
||||||
|
return done();
|
||||||
|
}, 100);
|
||||||
|
});
|
||||||
|
it("sends a push notification when invited to a quest", function(done) {
|
||||||
|
var group, req, res;
|
||||||
|
group = {
|
||||||
|
_id: 'party-id',
|
||||||
|
name: 'party-name',
|
||||||
|
type: 'party',
|
||||||
|
members: [user._id, recipient._id],
|
||||||
|
invites: [],
|
||||||
|
quest: {}
|
||||||
|
};
|
||||||
|
user.items.quests.hedgehog = 5;
|
||||||
|
group.save = function(cb) {
|
||||||
|
return cb(null, group);
|
||||||
|
};
|
||||||
|
group.markModified = function() {
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
req = {
|
||||||
|
body: {
|
||||||
|
uuids: [recipient._id]
|
||||||
|
},
|
||||||
|
query: {
|
||||||
|
key: 'hedgehog'
|
||||||
|
}
|
||||||
|
};
|
||||||
|
res = {
|
||||||
|
locals: {
|
||||||
|
group: group,
|
||||||
|
user: user
|
||||||
|
},
|
||||||
|
json: function() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
groups.questAccept(req, res);
|
||||||
|
return setTimeout(function() {
|
||||||
|
expect(pushSpy.sendNotify).to.have.been.calledOnce;
|
||||||
|
expect(pushSpy.sendNotify).to.have.been.calledWith(recipient, 'Quest Invitation', 'Invitation for the Quest The Hedgebeast');
|
||||||
|
return done();
|
||||||
|
}, 100);
|
||||||
|
});
|
||||||
|
return it("sends a push notification to participating members when quest starts", function(done) {
|
||||||
|
var group, req, res, userMock;
|
||||||
|
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 = function(cb) {
|
||||||
|
return cb(null, group);
|
||||||
|
};
|
||||||
|
group.markModified = function() {
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
req = {
|
||||||
|
body: {
|
||||||
|
uuids: [recipient._id]
|
||||||
|
},
|
||||||
|
query: {}
|
||||||
|
};
|
||||||
|
res = {
|
||||||
|
locals: {
|
||||||
|
group: group,
|
||||||
|
user: user
|
||||||
|
},
|
||||||
|
json: function() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
userMock = {
|
||||||
|
findOne: function(arg, arg2, cb) {
|
||||||
|
return cb(null, recipient);
|
||||||
|
},
|
||||||
|
update: function(arg, arg2, cb) {
|
||||||
|
if (cb) {
|
||||||
|
return cb(null, user);
|
||||||
|
} else {
|
||||||
|
return {
|
||||||
|
exec: function() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
groups.__set__('User', userMock);
|
||||||
|
groups.__set__('populateQuery', function(arg, arg2, arg3) {
|
||||||
|
return {
|
||||||
|
exec: function() {
|
||||||
|
return group.members;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
});
|
||||||
|
groups.questAccept(req, res);
|
||||||
|
return setTimeout(function() {
|
||||||
|
expect(pushSpy.sendNotify).to.have.been.calledTwice;
|
||||||
|
expect(pushSpy.sendNotify).to.have.been.calledWith(recipient, 'HabitRPG', 'Your Quest has Begun: The Hedgebeast');
|
||||||
|
return done();
|
||||||
|
}, 100);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
return describe("Gifts", function() {
|
||||||
|
var recipient;
|
||||||
|
recipient = null;
|
||||||
|
before(function(done) {
|
||||||
|
return registerNewUser(function(err, _user) {
|
||||||
|
recipient = _user;
|
||||||
|
recipient.preferences.emailNotifications.giftedGems = false;
|
||||||
|
user.balance = 4;
|
||||||
|
user.save = function() {
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
recipient.save = function() {
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
return done();
|
||||||
|
}, false);
|
||||||
|
});
|
||||||
|
context("sending gems from balance", function() {
|
||||||
|
var members;
|
||||||
|
members = rewire("../../website/src/controllers/api-v2/members");
|
||||||
|
members.sendMessage = function() {
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
members.__set__('pushNotify', pushSpy);
|
||||||
|
members.__set__('fetchMember', function(id) {
|
||||||
|
return function(cb) {
|
||||||
|
return cb(null, recipient);
|
||||||
|
};
|
||||||
|
});
|
||||||
|
return it("sends a push notification", function(done) {
|
||||||
|
var req, res;
|
||||||
|
req = {
|
||||||
|
params: {
|
||||||
|
uuid: "uuid"
|
||||||
|
},
|
||||||
|
body: {
|
||||||
|
type: 'gems',
|
||||||
|
gems: {
|
||||||
|
amount: 1
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
});
|
};
|
||||||
groups.questAccept(req, res);
|
res = {
|
||||||
|
locals: {
|
||||||
|
user: user
|
||||||
|
}
|
||||||
|
};
|
||||||
|
members.sendGift(req, res);
|
||||||
return setTimeout(function() {
|
return setTimeout(function() {
|
||||||
expect(pushSpy.sendNotify).to.have.been.calledTwice;
|
expect(pushSpy.sendNotify).to.have.been.calledOnce;
|
||||||
expect(pushSpy.sendNotify).to.have.been.calledWith(recipient, 'HabitRPG', 'Your Quest has Begun: The Hedgebeast');
|
expect(pushSpy.sendNotify).to.have.been.calledWith(recipient, 'Gifted Gems', '1 Gems - by ' + user.profile.name);
|
||||||
return done();
|
return done();
|
||||||
}, 100);
|
}, 100);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
return describe("Gifts", function() {
|
return describe("Purchases", function() {
|
||||||
var recipient;
|
var membersMock, payments;
|
||||||
recipient = null;
|
payments = rewire("../../website/src/controllers/payments");
|
||||||
before(function(done) {
|
payments.__set__('pushNotify', pushSpy);
|
||||||
return registerNewUser(function(err, _user) {
|
membersMock = {
|
||||||
recipient = _user;
|
sendMessage: function() {
|
||||||
recipient.preferences.emailNotifications.giftedGems = false;
|
|
||||||
user.balance = 4;
|
|
||||||
user.save = function() {
|
|
||||||
return true;
|
|
||||||
};
|
|
||||||
recipient.save = function() {
|
|
||||||
return true;
|
|
||||||
};
|
|
||||||
return done();
|
|
||||||
}, false);
|
|
||||||
});
|
|
||||||
context("sending gems from balance", function() {
|
|
||||||
var members;
|
|
||||||
members = rewire("../../website/src/controllers/api-v2/members");
|
|
||||||
members.sendMessage = function() {
|
|
||||||
return true;
|
return true;
|
||||||
};
|
}
|
||||||
members.__set__('pushNotify', pushSpy);
|
};
|
||||||
members.__set__('fetchMember', function(id) {
|
payments.__set__('members', membersMock);
|
||||||
return function(cb) {
|
context("buying gems as a purchased gift", function() {
|
||||||
return cb(null, recipient);
|
it("sends a push notification", function(done) {
|
||||||
};
|
var data;
|
||||||
});
|
data = {
|
||||||
return it("sends a push notification", function(done) {
|
user: user,
|
||||||
var req, res;
|
gift: {
|
||||||
req = {
|
member: recipient,
|
||||||
params: {
|
|
||||||
uuid: "uuid"
|
|
||||||
},
|
|
||||||
body: {
|
|
||||||
type: 'gems',
|
|
||||||
gems: {
|
gems: {
|
||||||
amount: 1
|
amount: 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
res = {
|
payments.buyGems(data);
|
||||||
locals: {
|
|
||||||
user: user
|
|
||||||
}
|
|
||||||
};
|
|
||||||
members.sendGift(req, res);
|
|
||||||
return setTimeout(function() {
|
return setTimeout(function() {
|
||||||
expect(pushSpy.sendNotify).to.have.been.calledOnce;
|
expect(pushSpy.sendNotify).to.have.been.calledOnce;
|
||||||
expect(pushSpy.sendNotify).to.have.been.calledWith(recipient, 'Gifted Gems', '1 Gems - by ' + user.profile.name);
|
expect(pushSpy.sendNotify).to.have.been.calledWith(recipient, 'Gifted Gems', '1 Gems - by ' + user.profile.name);
|
||||||
return done();
|
return done();
|
||||||
}, 100);
|
}, 100);
|
||||||
});
|
});
|
||||||
});
|
return it("does not send a push notification if buying gems for self", function(done) {
|
||||||
return describe("Purchases", function() {
|
var data;
|
||||||
var membersMock, payments;
|
data = {
|
||||||
payments = rewire("../../website/src/controllers/payments");
|
user: user,
|
||||||
payments.__set__('pushNotify', pushSpy);
|
gift: {
|
||||||
membersMock = {
|
member: user,
|
||||||
sendMessage: function() {
|
gems: {
|
||||||
return true;
|
amount: 1
|
||||||
}
|
|
||||||
};
|
|
||||||
payments.__set__('members', membersMock);
|
|
||||||
context("buying gems as a purchased gift", function() {
|
|
||||||
it("sends a push notification", function(done) {
|
|
||||||
var data;
|
|
||||||
data = {
|
|
||||||
user: user,
|
|
||||||
gift: {
|
|
||||||
member: recipient,
|
|
||||||
gems: {
|
|
||||||
amount: 1
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
payments.buyGems(data);
|
};
|
||||||
return setTimeout(function() {
|
payments.buyGems(data);
|
||||||
expect(pushSpy.sendNotify).to.have.been.calledOnce;
|
return setTimeout(function() {
|
||||||
expect(pushSpy.sendNotify).to.have.been.calledWith(recipient, 'Gifted Gems', '1 Gems - by ' + user.profile.name);
|
expect(pushSpy.sendNotify).to.not.have.been.called;
|
||||||
return done();
|
return done();
|
||||||
}, 100);
|
}, 100);
|
||||||
});
|
|
||||||
return it("does not send a push notification if buying gems for self", function(done) {
|
|
||||||
var data;
|
|
||||||
data = {
|
|
||||||
user: user,
|
|
||||||
gift: {
|
|
||||||
member: user,
|
|
||||||
gems: {
|
|
||||||
amount: 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
payments.buyGems(data);
|
|
||||||
return setTimeout(function() {
|
|
||||||
expect(pushSpy.sendNotify).to.not.have.been.called;
|
|
||||||
return done();
|
|
||||||
}, 100);
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
return context("sending a subscription as a purchased gift", function() {
|
});
|
||||||
it("sends a push notification", function(done) {
|
return context("sending a subscription as a purchased gift", function() {
|
||||||
var data;
|
it("sends a push notification", function(done) {
|
||||||
data = {
|
var data;
|
||||||
user: user,
|
data = {
|
||||||
gift: {
|
user: user,
|
||||||
member: recipient,
|
gift: {
|
||||||
subscription: {
|
member: recipient,
|
||||||
key: 'basic_6mo'
|
subscription: {
|
||||||
}
|
key: 'basic_6mo'
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
payments.createSubscription(data);
|
};
|
||||||
return setTimeout(function() {
|
payments.createSubscription(data);
|
||||||
expect(pushSpy.sendNotify).to.have.been.calledOnce;
|
return setTimeout(function() {
|
||||||
expect(pushSpy.sendNotify).to.have.been.calledWith(recipient, 'Gifted Subscription', '6 months - by ' + user.profile.name);
|
expect(pushSpy.sendNotify).to.have.been.calledOnce;
|
||||||
return done();
|
expect(pushSpy.sendNotify).to.have.been.calledWith(recipient, 'Gifted Subscription', '6 months - by ' + user.profile.name);
|
||||||
}, 100);
|
return done();
|
||||||
});
|
}, 100);
|
||||||
return it("does not send a push notification if buying subscription for self", function(done) {
|
});
|
||||||
var data;
|
return it("does not send a push notification if buying subscription for self", function(done) {
|
||||||
data = {
|
var data;
|
||||||
user: user,
|
data = {
|
||||||
gift: {
|
user: user,
|
||||||
member: user,
|
gift: {
|
||||||
subscription: {
|
member: user,
|
||||||
key: 'basic_6mo'
|
subscription: {
|
||||||
}
|
key: 'basic_6mo'
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
payments.createSubscription(data);
|
};
|
||||||
return setTimeout(function() {
|
payments.createSubscription(data);
|
||||||
expect(pushSpy.sendNotify).to.not.have.been.called;
|
return setTimeout(function() {
|
||||||
return done();
|
expect(pushSpy.sendNotify).to.not.have.been.called;
|
||||||
}, 100);
|
return done();
|
||||||
});
|
}, 100);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
});
|
||||||
}).call(this);
|
|
||||||
|
|||||||
@@ -1,146 +1,142 @@
|
|||||||
(function() {
|
require("../../website/src/server");
|
||||||
'use strict';
|
|
||||||
require("../../website/src/server");
|
|
||||||
|
|
||||||
describe("Score", function() {
|
describe("Score", function() {
|
||||||
before(function(done) {
|
before(function(done) {
|
||||||
return registerNewUser(done, true);
|
return registerNewUser(done, true);
|
||||||
});
|
});
|
||||||
context("Todos that did not previously exist", function() {
|
context("Todos that did not previously exist", function() {
|
||||||
it("creates a completed a todo when using up url", function(done) {
|
it("creates a completed a todo when using up url", function(done) {
|
||||||
return request.post(baseURL + "/user/tasks/withUp/up").send({
|
return request.post(baseURL + "/user/tasks/withUp/up").send({
|
||||||
type: "todo",
|
type: "todo",
|
||||||
text: "withUp"
|
text: "withUp"
|
||||||
}).end(function(err, res) {
|
|
||||||
expectCode(res, 200);
|
|
||||||
request.get(baseURL + "/user/tasks/withUp").end(function(err, res) {
|
|
||||||
var upTodo;
|
|
||||||
upTodo = res.body;
|
|
||||||
return expect(upTodo.completed).to.equal(true);
|
|
||||||
});
|
|
||||||
return done();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
it("creates an uncompleted todo when using down url", function(done) {
|
|
||||||
return request.post(baseURL + "/user/tasks/withDown/down").send({
|
|
||||||
type: "todo",
|
|
||||||
text: "withDown"
|
|
||||||
}).end(function(err, res) {
|
|
||||||
expectCode(res, 200);
|
|
||||||
return request.get(baseURL + "/user/tasks/withDown").end(function(err, res) {
|
|
||||||
var downTodo;
|
|
||||||
downTodo = res.body;
|
|
||||||
expect(downTodo.completed).to.equal(false);
|
|
||||||
return done();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
it("creates a completed a todo overriding the complete parameter when using up url", function(done) {
|
|
||||||
return request.post(baseURL + "/user/tasks/withUpWithComplete/up").send({
|
|
||||||
type: "todo",
|
|
||||||
text: "withUpWithComplete",
|
|
||||||
completed: false
|
|
||||||
}).end(function(err, res) {
|
|
||||||
expectCode(res, 200);
|
|
||||||
return request.get(baseURL + "/user/tasks/withUpWithComplete").end(function(err, res) {
|
|
||||||
var upTodo;
|
|
||||||
upTodo = res.body;
|
|
||||||
expect(upTodo.completed).to.equal(true);
|
|
||||||
return done();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
return it("Creates an uncompleted todo overriding the completed parameter when using down url", function(done) {
|
|
||||||
return request.post(baseURL + "/user/tasks/withDownWithUncomplete/down").send({
|
|
||||||
type: "todo",
|
|
||||||
text: "withDownWithUncomplete",
|
|
||||||
completed: true
|
|
||||||
}).end(function(err, res) {
|
|
||||||
expectCode(res, 200);
|
|
||||||
return request.get(baseURL + "/user/tasks/withDownWithUncomplete").end(function(err, res) {
|
|
||||||
var downTodo;
|
|
||||||
downTodo = res.body;
|
|
||||||
expect(downTodo.completed).to.equal(false);
|
|
||||||
return done();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
context("Todo that already exists", function() {
|
|
||||||
it("It completes a todo when using up url", function(done) {
|
|
||||||
return request.post(baseURL + "/user/tasks").send({
|
|
||||||
type: "todo",
|
|
||||||
text: "Sample Todo"
|
|
||||||
}).end(function(err, res) {
|
|
||||||
var unCompletedTodo;
|
|
||||||
expectCode(res, 200);
|
|
||||||
unCompletedTodo = res.body;
|
|
||||||
expect(unCompletedTodo.completed).to.equal(false);
|
|
||||||
return request.post(baseURL + "/user/tasks/" + unCompletedTodo._id + "/up").end(function(err, res) {
|
|
||||||
expectCode(res, 200);
|
|
||||||
return request.get(baseURL + "/user/tasks/" + unCompletedTodo._id).end(function(err, res) {
|
|
||||||
unCompletedTodo = res.body;
|
|
||||||
expect(unCompletedTodo.completed).to.equal(true);
|
|
||||||
return done();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
return it("It uncompletes a todo when using down url", function(done) {
|
|
||||||
return request.post(baseURL + "/user/tasks").send({
|
|
||||||
type: "todo",
|
|
||||||
text: "Sample Todo",
|
|
||||||
completed: true
|
|
||||||
}).end(function(err, res) {
|
|
||||||
var completedTodo;
|
|
||||||
expectCode(res, 200);
|
|
||||||
completedTodo = res.body;
|
|
||||||
expect(completedTodo.completed).to.equal(true);
|
|
||||||
return request.post(baseURL + "/user/tasks/" + completedTodo._id + "/down").end(function(err, res) {
|
|
||||||
expectCode(res, 200);
|
|
||||||
return request.get(baseURL + "/user/tasks/" + completedTodo._id).end(function(err, res) {
|
|
||||||
completedTodo = res.body;
|
|
||||||
expect(completedTodo.completed).to.equal(false);
|
|
||||||
return done();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
it("Creates and scores up a habit when using up url", function(done) {
|
|
||||||
var upHabit;
|
|
||||||
upHabit = void 0;
|
|
||||||
return request.post(baseURL + "/user/tasks/habitWithUp/up").send({
|
|
||||||
type: "habit",
|
|
||||||
text: "testTitle",
|
|
||||||
completed: true
|
|
||||||
}).end(function(err, res) {
|
}).end(function(err, res) {
|
||||||
expectCode(res, 200);
|
expectCode(res, 200);
|
||||||
return request.get(baseURL + "/user/tasks/habitWithUp").end(function(err, res) {
|
request.get(baseURL + "/user/tasks/withUp").end(function(err, res) {
|
||||||
upHabit = res.body;
|
var upTodo;
|
||||||
expect(upHabit.value).to.be.at.least(1);
|
upTodo = res.body;
|
||||||
expect(upHabit.type).to.equal("habit");
|
return expect(upTodo.completed).to.equal(true);
|
||||||
|
});
|
||||||
|
return done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
it("creates an uncompleted todo when using down url", function(done) {
|
||||||
|
return request.post(baseURL + "/user/tasks/withDown/down").send({
|
||||||
|
type: "todo",
|
||||||
|
text: "withDown"
|
||||||
|
}).end(function(err, res) {
|
||||||
|
expectCode(res, 200);
|
||||||
|
return request.get(baseURL + "/user/tasks/withDown").end(function(err, res) {
|
||||||
|
var downTodo;
|
||||||
|
downTodo = res.body;
|
||||||
|
expect(downTodo.completed).to.equal(false);
|
||||||
return done();
|
return done();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
return it("Creates and scores down a habit when using down url", function(done) {
|
it("creates a completed a todo overriding the complete parameter when using up url", function(done) {
|
||||||
var downHabit;
|
return request.post(baseURL + "/user/tasks/withUpWithComplete/up").send({
|
||||||
downHabit = void 0;
|
type: "todo",
|
||||||
return request.post(baseURL + "/user/tasks/habitWithDown/down").send({
|
text: "withUpWithComplete",
|
||||||
type: "habit",
|
completed: false
|
||||||
text: "testTitle",
|
}).end(function(err, res) {
|
||||||
|
expectCode(res, 200);
|
||||||
|
return request.get(baseURL + "/user/tasks/withUpWithComplete").end(function(err, res) {
|
||||||
|
var upTodo;
|
||||||
|
upTodo = res.body;
|
||||||
|
expect(upTodo.completed).to.equal(true);
|
||||||
|
return done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
return it("Creates an uncompleted todo overriding the completed parameter when using down url", function(done) {
|
||||||
|
return request.post(baseURL + "/user/tasks/withDownWithUncomplete/down").send({
|
||||||
|
type: "todo",
|
||||||
|
text: "withDownWithUncomplete",
|
||||||
completed: true
|
completed: true
|
||||||
}).end(function(err, res) {
|
}).end(function(err, res) {
|
||||||
expectCode(res, 200);
|
expectCode(res, 200);
|
||||||
return request.get(baseURL + "/user/tasks/habitWithDown").end(function(err, res) {
|
return request.get(baseURL + "/user/tasks/withDownWithUncomplete").end(function(err, res) {
|
||||||
downHabit = res.body;
|
var downTodo;
|
||||||
expect(downHabit.value).to.have.at.most(-1);
|
downTodo = res.body;
|
||||||
expect(downHabit.type).to.equal("habit");
|
expect(downTodo.completed).to.equal(false);
|
||||||
return done();
|
return done();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
context("Todo that already exists", function() {
|
||||||
}).call(this);
|
it("It completes a todo when using up url", function(done) {
|
||||||
|
return request.post(baseURL + "/user/tasks").send({
|
||||||
|
type: "todo",
|
||||||
|
text: "Sample Todo"
|
||||||
|
}).end(function(err, res) {
|
||||||
|
var unCompletedTodo;
|
||||||
|
expectCode(res, 200);
|
||||||
|
unCompletedTodo = res.body;
|
||||||
|
expect(unCompletedTodo.completed).to.equal(false);
|
||||||
|
return request.post(baseURL + "/user/tasks/" + unCompletedTodo._id + "/up").end(function(err, res) {
|
||||||
|
expectCode(res, 200);
|
||||||
|
return request.get(baseURL + "/user/tasks/" + unCompletedTodo._id).end(function(err, res) {
|
||||||
|
unCompletedTodo = res.body;
|
||||||
|
expect(unCompletedTodo.completed).to.equal(true);
|
||||||
|
return done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
return it("It uncompletes a todo when using down url", function(done) {
|
||||||
|
return request.post(baseURL + "/user/tasks").send({
|
||||||
|
type: "todo",
|
||||||
|
text: "Sample Todo",
|
||||||
|
completed: true
|
||||||
|
}).end(function(err, res) {
|
||||||
|
var completedTodo;
|
||||||
|
expectCode(res, 200);
|
||||||
|
completedTodo = res.body;
|
||||||
|
expect(completedTodo.completed).to.equal(true);
|
||||||
|
return request.post(baseURL + "/user/tasks/" + completedTodo._id + "/down").end(function(err, res) {
|
||||||
|
expectCode(res, 200);
|
||||||
|
return request.get(baseURL + "/user/tasks/" + completedTodo._id).end(function(err, res) {
|
||||||
|
completedTodo = res.body;
|
||||||
|
expect(completedTodo.completed).to.equal(false);
|
||||||
|
return done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
it("Creates and scores up a habit when using up url", function(done) {
|
||||||
|
var upHabit;
|
||||||
|
upHabit = void 0;
|
||||||
|
return request.post(baseURL + "/user/tasks/habitWithUp/up").send({
|
||||||
|
type: "habit",
|
||||||
|
text: "testTitle",
|
||||||
|
completed: true
|
||||||
|
}).end(function(err, res) {
|
||||||
|
expectCode(res, 200);
|
||||||
|
return request.get(baseURL + "/user/tasks/habitWithUp").end(function(err, res) {
|
||||||
|
upHabit = res.body;
|
||||||
|
expect(upHabit.value).to.be.at.least(1);
|
||||||
|
expect(upHabit.type).to.equal("habit");
|
||||||
|
return done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
return it("Creates and scores down a habit when using down url", function(done) {
|
||||||
|
var downHabit;
|
||||||
|
downHabit = void 0;
|
||||||
|
return request.post(baseURL + "/user/tasks/habitWithDown/down").send({
|
||||||
|
type: "habit",
|
||||||
|
text: "testTitle",
|
||||||
|
completed: true
|
||||||
|
}).end(function(err, res) {
|
||||||
|
expectCode(res, 200);
|
||||||
|
return request.get(baseURL + "/user/tasks/habitWithDown").end(function(err, res) {
|
||||||
|
downHabit = res.body;
|
||||||
|
expect(downHabit.value).to.have.at.most(-1);
|
||||||
|
expect(downHabit.type).to.equal("habit");
|
||||||
|
return done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|||||||
@@ -1,54 +1,50 @@
|
|||||||
(function() {
|
var app, payments;
|
||||||
'use strict';
|
|
||||||
var app, payments;
|
|
||||||
|
|
||||||
payments = require("../../website/src/controllers/payments");
|
payments = require("../../website/src/controllers/payments");
|
||||||
|
|
||||||
app = require("../../website/src/server");
|
app = require("../../website/src/server");
|
||||||
|
|
||||||
describe("Subscriptions", function() {
|
describe("Subscriptions", function() {
|
||||||
before(function(done) {
|
before(function(done) {
|
||||||
return registerNewUser(done, true);
|
return registerNewUser(done, true);
|
||||||
});
|
|
||||||
return it("Handles unsubscription", function(done) {
|
|
||||||
var cron;
|
|
||||||
cron = function() {
|
|
||||||
user.lastCron = moment().subtract(1, "d");
|
|
||||||
return 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;
|
|
||||||
return done();
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
return it("Handles unsubscription", function(done) {
|
||||||
}).call(this);
|
var cron;
|
||||||
|
cron = function() {
|
||||||
|
user.lastCron = moment().subtract(1, "d");
|
||||||
|
return 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;
|
||||||
|
return done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|||||||
@@ -1,91 +1,87 @@
|
|||||||
(function() {
|
require("../../website/src/server");
|
||||||
'use strict';
|
|
||||||
require("../../website/src/server");
|
|
||||||
|
|
||||||
describe("Todos", function() {
|
describe("Todos", function() {
|
||||||
before(function(done) {
|
before(function(done) {
|
||||||
return registerNewUser(done, true);
|
return registerNewUser(done, true);
|
||||||
|
});
|
||||||
|
beforeEach(function(done) {
|
||||||
|
return User.findById(user._id, function(err, _user) {
|
||||||
|
var user;
|
||||||
|
user = _user;
|
||||||
|
shared.wrap(user);
|
||||||
|
return done();
|
||||||
});
|
});
|
||||||
beforeEach(function(done) {
|
});
|
||||||
return User.findById(user._id, function(err, _user) {
|
return it("Archives old todos", function(done) {
|
||||||
var user;
|
var numTasks;
|
||||||
user = _user;
|
numTasks = _.size(user.todos);
|
||||||
shared.wrap(user);
|
return request.post(baseURL + "/user/batch-update?_v=999").send([
|
||||||
return done();
|
{
|
||||||
});
|
op: "addTask",
|
||||||
});
|
body: {
|
||||||
return it("Archives old todos", function(done) {
|
type: "todo"
|
||||||
var numTasks;
|
}
|
||||||
numTasks = _.size(user.todos);
|
}, {
|
||||||
return request.post(baseURL + "/user/batch-update?_v=999").send([
|
op: "addTask",
|
||||||
|
body: {
|
||||||
|
type: "todo"
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
op: "addTask",
|
||||||
|
body: {
|
||||||
|
type: "todo"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]).end(function(err, res) {
|
||||||
|
expectCode(res, 200);
|
||||||
|
expect(_.size(res.body.todos)).to.equal(numTasks + 3);
|
||||||
|
numTasks += 3;
|
||||||
|
return request.post(baseURL + "/user/batch-update?_v=998").send([
|
||||||
{
|
{
|
||||||
op: "addTask",
|
op: "score",
|
||||||
body: {
|
params: {
|
||||||
type: "todo"
|
direction: "up",
|
||||||
|
id: res.body.todos[0].id
|
||||||
}
|
}
|
||||||
}, {
|
}, {
|
||||||
op: "addTask",
|
op: "score",
|
||||||
body: {
|
params: {
|
||||||
type: "todo"
|
direction: "up",
|
||||||
|
id: res.body.todos[1].id
|
||||||
}
|
}
|
||||||
}, {
|
}, {
|
||||||
op: "addTask",
|
op: "score",
|
||||||
body: {
|
params: {
|
||||||
type: "todo"
|
direction: "up",
|
||||||
|
id: res.body.todos[2].id
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]).end(function(err, res) {
|
]).end(function(err, res) {
|
||||||
expectCode(res, 200);
|
expectCode(res, 200);
|
||||||
expect(_.size(res.body.todos)).to.equal(numTasks + 3);
|
expect(_.size(res.body.todos)).to.equal(numTasks);
|
||||||
numTasks += 3;
|
return request.post(baseURL + "/user/batch-update?_v=997").send([
|
||||||
return request.post(baseURL + "/user/batch-update?_v=998").send([
|
|
||||||
{
|
{
|
||||||
op: "score",
|
op: "updateTask",
|
||||||
params: {
|
params: {
|
||||||
direction: "up",
|
|
||||||
id: res.body.todos[0].id
|
id: res.body.todos[0].id
|
||||||
|
},
|
||||||
|
body: {
|
||||||
|
dateCompleted: moment().subtract(4, "days")
|
||||||
}
|
}
|
||||||
}, {
|
}, {
|
||||||
op: "score",
|
op: "updateTask",
|
||||||
params: {
|
params: {
|
||||||
direction: "up",
|
|
||||||
id: res.body.todos[1].id
|
id: res.body.todos[1].id
|
||||||
}
|
},
|
||||||
}, {
|
body: {
|
||||||
op: "score",
|
dateCompleted: moment().subtract(4, "days")
|
||||||
params: {
|
|
||||||
direction: "up",
|
|
||||||
id: res.body.todos[2].id
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]).end(function(err, res) {
|
]).end(function(err, res) {
|
||||||
expectCode(res, 200);
|
expect(_.size(res.body.todos)).to.equal(numTasks - 2);
|
||||||
expect(_.size(res.body.todos)).to.equal(numTasks);
|
return done();
|
||||||
return 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(function(err, res) {
|
|
||||||
expect(_.size(res.body.todos)).to.equal(numTasks - 2);
|
|
||||||
return done();
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
});
|
||||||
}).call(this);
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -1,164 +1,161 @@
|
|||||||
(function() {
|
var $w, _, id, modes, shared, user;
|
||||||
var $w, _, id, modes, shared, user;
|
|
||||||
|
|
||||||
shared = require('../../../common/script/index.js');
|
shared = require('../../../common/script/index.js');
|
||||||
|
|
||||||
_ = require('lodash');
|
_ = require('lodash');
|
||||||
|
|
||||||
$w = function(s) {
|
$w = function(s) {
|
||||||
return s.split(' ');
|
return s.split(' ');
|
||||||
};
|
};
|
||||||
|
|
||||||
id = shared.uuid();
|
id = shared.uuid();
|
||||||
|
|
||||||
user = {
|
user = {
|
||||||
stats: {
|
stats: {
|
||||||
"class": 'warrior',
|
"class": 'warrior',
|
||||||
lvl: 1,
|
lvl: 1,
|
||||||
hp: 50,
|
hp: 50,
|
||||||
gp: 0,
|
gp: 0,
|
||||||
exp: 10,
|
exp: 10,
|
||||||
|
per: 0,
|
||||||
|
int: 0,
|
||||||
|
con: 0,
|
||||||
|
str: 0,
|
||||||
|
buffs: {
|
||||||
per: 0,
|
per: 0,
|
||||||
int: 0,
|
int: 0,
|
||||||
con: 0,
|
con: 0,
|
||||||
str: 0,
|
str: 0
|
||||||
buffs: {
|
},
|
||||||
|
training: {
|
||||||
|
int: 0,
|
||||||
|
con: 0,
|
||||||
|
per: 0,
|
||||||
|
str: 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
preferences: {
|
||||||
|
automaticAllocation: false
|
||||||
|
},
|
||||||
|
party: {
|
||||||
|
quest: {
|
||||||
|
key: 'evilsanta',
|
||||||
|
progress: {
|
||||||
|
up: 0,
|
||||||
|
down: 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
achievements: {},
|
||||||
|
items: {
|
||||||
|
eggs: {},
|
||||||
|
hatchingPotions: {},
|
||||||
|
food: {},
|
||||||
|
gear: {
|
||||||
|
equipped: {
|
||||||
|
weapon: 'weapon_warrior_4',
|
||||||
|
armor: 'armor_warrior_4',
|
||||||
|
shield: 'shield_warrior_4',
|
||||||
|
head: 'head_warrior_4'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
habits: [
|
||||||
|
{
|
||||||
|
id: 'a',
|
||||||
|
value: 1,
|
||||||
|
type: 'habit',
|
||||||
|
attribute: 'str'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
dailys: [
|
||||||
|
{
|
||||||
|
id: 'b',
|
||||||
|
value: 1,
|
||||||
|
type: 'daily',
|
||||||
|
attribute: 'str'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
todos: [
|
||||||
|
{
|
||||||
|
id: 'c',
|
||||||
|
value: 1,
|
||||||
|
type: 'todo',
|
||||||
|
attribute: 'con'
|
||||||
|
}, {
|
||||||
|
id: 'd',
|
||||||
|
value: 1,
|
||||||
|
type: 'todo',
|
||||||
|
attribute: 'per'
|
||||||
|
}, {
|
||||||
|
id: 'e',
|
||||||
|
value: 1,
|
||||||
|
type: 'todo',
|
||||||
|
attribute: 'int'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
rewards: []
|
||||||
|
};
|
||||||
|
|
||||||
|
modes = {
|
||||||
|
flat: _.cloneDeep(user),
|
||||||
|
classbased_warrior: _.cloneDeep(user),
|
||||||
|
classbased_rogue: _.cloneDeep(user),
|
||||||
|
classbased_wizard: _.cloneDeep(user),
|
||||||
|
classbased_healer: _.cloneDeep(user),
|
||||||
|
taskbased: _.cloneDeep(user)
|
||||||
|
};
|
||||||
|
|
||||||
|
modes.classbased_warrior.stats["class"] = 'warrior';
|
||||||
|
|
||||||
|
modes.classbased_rogue.stats["class"] = 'rogue';
|
||||||
|
|
||||||
|
modes.classbased_wizard.stats["class"] = 'wizard';
|
||||||
|
|
||||||
|
modes.classbased_healer.stats["class"] = 'healer';
|
||||||
|
|
||||||
|
_.each($w('flat classbased_warrior classbased_rogue classbased_wizard classbased_healer taskbased'), function(mode) {
|
||||||
|
_.merge(modes[mode].preferences, {
|
||||||
|
automaticAllocation: true,
|
||||||
|
allocationMode: mode.indexOf('classbased') === 0 ? 'classbased' : mode
|
||||||
|
});
|
||||||
|
return shared.wrap(modes[mode]);
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log("\n\n================================================");
|
||||||
|
|
||||||
|
console.log("New Simulation");
|
||||||
|
|
||||||
|
console.log("================================================\n\n");
|
||||||
|
|
||||||
|
_.times([20], function(lvl) {
|
||||||
|
console.log("[lvl " + lvl + "]\n--------------\n");
|
||||||
|
return _.each($w('flat classbased_warrior classbased_rogue classbased_wizard classbased_healer taskbased'), function(mode) {
|
||||||
|
var str, u;
|
||||||
|
u = modes[mode];
|
||||||
|
u.stats.exp = shared.tnl(lvl) + 1;
|
||||||
|
if (mode === 'taskbased') {
|
||||||
|
_.merge(u.stats, {
|
||||||
per: 0,
|
per: 0,
|
||||||
int: 0,
|
|
||||||
con: 0,
|
con: 0,
|
||||||
|
int: 0,
|
||||||
str: 0
|
str: 0
|
||||||
|
});
|
||||||
|
}
|
||||||
|
u.habits[0].attribute = u.fns.randomVal({
|
||||||
|
str: 'str',
|
||||||
|
int: 'int',
|
||||||
|
per: 'per',
|
||||||
|
con: 'con'
|
||||||
|
});
|
||||||
|
u.ops.score({
|
||||||
|
params: {
|
||||||
|
id: u.habits[0].id
|
||||||
},
|
},
|
||||||
training: {
|
direction: 'up'
|
||||||
int: 0,
|
|
||||||
con: 0,
|
|
||||||
per: 0,
|
|
||||||
str: 0
|
|
||||||
}
|
|
||||||
},
|
|
||||||
preferences: {
|
|
||||||
automaticAllocation: false
|
|
||||||
},
|
|
||||||
party: {
|
|
||||||
quest: {
|
|
||||||
key: 'evilsanta',
|
|
||||||
progress: {
|
|
||||||
up: 0,
|
|
||||||
down: 0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
achievements: {},
|
|
||||||
items: {
|
|
||||||
eggs: {},
|
|
||||||
hatchingPotions: {},
|
|
||||||
food: {},
|
|
||||||
gear: {
|
|
||||||
equipped: {
|
|
||||||
weapon: 'weapon_warrior_4',
|
|
||||||
armor: 'armor_warrior_4',
|
|
||||||
shield: 'shield_warrior_4',
|
|
||||||
head: 'head_warrior_4'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
habits: [
|
|
||||||
{
|
|
||||||
id: 'a',
|
|
||||||
value: 1,
|
|
||||||
type: 'habit',
|
|
||||||
attribute: 'str'
|
|
||||||
}
|
|
||||||
],
|
|
||||||
dailys: [
|
|
||||||
{
|
|
||||||
id: 'b',
|
|
||||||
value: 1,
|
|
||||||
type: 'daily',
|
|
||||||
attribute: 'str'
|
|
||||||
}
|
|
||||||
],
|
|
||||||
todos: [
|
|
||||||
{
|
|
||||||
id: 'c',
|
|
||||||
value: 1,
|
|
||||||
type: 'todo',
|
|
||||||
attribute: 'con'
|
|
||||||
}, {
|
|
||||||
id: 'd',
|
|
||||||
value: 1,
|
|
||||||
type: 'todo',
|
|
||||||
attribute: 'per'
|
|
||||||
}, {
|
|
||||||
id: 'e',
|
|
||||||
value: 1,
|
|
||||||
type: 'todo',
|
|
||||||
attribute: 'int'
|
|
||||||
}
|
|
||||||
],
|
|
||||||
rewards: []
|
|
||||||
};
|
|
||||||
|
|
||||||
modes = {
|
|
||||||
flat: _.cloneDeep(user),
|
|
||||||
classbased_warrior: _.cloneDeep(user),
|
|
||||||
classbased_rogue: _.cloneDeep(user),
|
|
||||||
classbased_wizard: _.cloneDeep(user),
|
|
||||||
classbased_healer: _.cloneDeep(user),
|
|
||||||
taskbased: _.cloneDeep(user)
|
|
||||||
};
|
|
||||||
|
|
||||||
modes.classbased_warrior.stats["class"] = 'warrior';
|
|
||||||
|
|
||||||
modes.classbased_rogue.stats["class"] = 'rogue';
|
|
||||||
|
|
||||||
modes.classbased_wizard.stats["class"] = 'wizard';
|
|
||||||
|
|
||||||
modes.classbased_healer.stats["class"] = 'healer';
|
|
||||||
|
|
||||||
_.each($w('flat classbased_warrior classbased_rogue classbased_wizard classbased_healer taskbased'), function(mode) {
|
|
||||||
_.merge(modes[mode].preferences, {
|
|
||||||
automaticAllocation: true,
|
|
||||||
allocationMode: mode.indexOf('classbased') === 0 ? 'classbased' : mode
|
|
||||||
});
|
});
|
||||||
return shared.wrap(modes[mode]);
|
u.fns.updateStats(u.stats);
|
||||||
|
str = mode + (mode === 'taskbased' ? " (" + u.habits[0].attribute + ")" : "");
|
||||||
|
return console.log(str, _.pick(u.stats, $w('per int con str')));
|
||||||
});
|
});
|
||||||
|
});
|
||||||
console.log("\n\n================================================");
|
|
||||||
|
|
||||||
console.log("New Simulation");
|
|
||||||
|
|
||||||
console.log("================================================\n\n");
|
|
||||||
|
|
||||||
_.times([20], function(lvl) {
|
|
||||||
console.log("[lvl " + lvl + "]\n--------------\n");
|
|
||||||
return _.each($w('flat classbased_warrior classbased_rogue classbased_wizard classbased_healer taskbased'), function(mode) {
|
|
||||||
var str, u;
|
|
||||||
u = modes[mode];
|
|
||||||
u.stats.exp = shared.tnl(lvl) + 1;
|
|
||||||
if (mode === 'taskbased') {
|
|
||||||
_.merge(u.stats, {
|
|
||||||
per: 0,
|
|
||||||
con: 0,
|
|
||||||
int: 0,
|
|
||||||
str: 0
|
|
||||||
});
|
|
||||||
}
|
|
||||||
u.habits[0].attribute = u.fns.randomVal({
|
|
||||||
str: 'str',
|
|
||||||
int: 'int',
|
|
||||||
per: 'per',
|
|
||||||
con: 'con'
|
|
||||||
});
|
|
||||||
u.ops.score({
|
|
||||||
params: {
|
|
||||||
id: u.habits[0].id
|
|
||||||
},
|
|
||||||
direction: 'up'
|
|
||||||
});
|
|
||||||
u.fns.updateStats(u.stats);
|
|
||||||
str = mode + (mode === 'taskbased' ? " (" + u.habits[0].attribute + ")" : "");
|
|
||||||
return console.log(str, _.pick(u.stats, $w('per int con str')));
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
}).call(this);
|
|
||||||
|
|||||||
@@ -1,294 +1,291 @@
|
|||||||
(function() {
|
var _, clearUser, id, party, s, shared, task, user;
|
||||||
var _, clearUser, id, party, s, shared, task, user;
|
|
||||||
|
|
||||||
shared = require('../../../common/script/index.js');
|
shared = require('../../../common/script/index.js');
|
||||||
|
|
||||||
_ = require('lodash');
|
_ = require('lodash');
|
||||||
|
|
||||||
id = shared.uuid();
|
id = shared.uuid();
|
||||||
|
|
||||||
user = {
|
user = {
|
||||||
stats: {
|
stats: {
|
||||||
"class": 'warrior',
|
"class": 'warrior',
|
||||||
buffs: {
|
buffs: {
|
||||||
per: 0,
|
per: 0,
|
||||||
int: 0,
|
|
||||||
con: 0,
|
|
||||||
str: 0
|
|
||||||
}
|
|
||||||
},
|
|
||||||
party: {
|
|
||||||
quest: {
|
|
||||||
key: 'evilsanta',
|
|
||||||
progress: {
|
|
||||||
up: 0,
|
|
||||||
down: 0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
preferences: {
|
|
||||||
automaticAllocation: false
|
|
||||||
},
|
|
||||||
achievements: {},
|
|
||||||
flags: {
|
|
||||||
levelDrops: {}
|
|
||||||
},
|
|
||||||
items: {
|
|
||||||
eggs: {},
|
|
||||||
hatchingPotions: {},
|
|
||||||
food: {},
|
|
||||||
quests: {},
|
|
||||||
gear: {
|
|
||||||
equipped: {
|
|
||||||
weapon: 'weapon_warrior_4',
|
|
||||||
armor: 'armor_warrior_4',
|
|
||||||
shield: 'shield_warrior_4',
|
|
||||||
head: 'head_warrior_4'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
habits: [
|
|
||||||
shared.taskDefaults({
|
|
||||||
id: id,
|
|
||||||
value: 0
|
|
||||||
})
|
|
||||||
],
|
|
||||||
dailys: [
|
|
||||||
{
|
|
||||||
"text": "1"
|
|
||||||
}, {
|
|
||||||
"text": "1"
|
|
||||||
}, {
|
|
||||||
"text": "1"
|
|
||||||
}, {
|
|
||||||
"text": "1"
|
|
||||||
}, {
|
|
||||||
"text": "1"
|
|
||||||
}, {
|
|
||||||
"text": "1"
|
|
||||||
}, {
|
|
||||||
"text": "1"
|
|
||||||
}, {
|
|
||||||
"text": "1"
|
|
||||||
}, {
|
|
||||||
"text": "1"
|
|
||||||
}, {
|
|
||||||
"text": "1"
|
|
||||||
}, {
|
|
||||||
"text": "1"
|
|
||||||
}, {
|
|
||||||
"text": "1"
|
|
||||||
}, {
|
|
||||||
"text": "1"
|
|
||||||
}, {
|
|
||||||
"text": "1"
|
|
||||||
}, {
|
|
||||||
"text": "1"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
todos: [],
|
|
||||||
rewards: []
|
|
||||||
};
|
|
||||||
|
|
||||||
shared.wrap(user);
|
|
||||||
|
|
||||||
s = user.stats;
|
|
||||||
|
|
||||||
task = user.tasks[id];
|
|
||||||
|
|
||||||
party = [user];
|
|
||||||
|
|
||||||
console.log("\n\n================================================");
|
|
||||||
|
|
||||||
console.log("New Simulation");
|
|
||||||
|
|
||||||
console.log("================================================\n\n");
|
|
||||||
|
|
||||||
clearUser = function(lvl) {
|
|
||||||
if (lvl == null) {
|
|
||||||
lvl = 1;
|
|
||||||
}
|
|
||||||
_.merge(user.stats, {
|
|
||||||
exp: 0,
|
|
||||||
gp: 0,
|
|
||||||
hp: 50,
|
|
||||||
lvl: lvl,
|
|
||||||
str: lvl * 1.5,
|
|
||||||
con: lvl * 1.5,
|
|
||||||
per: lvl * 1.5,
|
|
||||||
int: lvl * 1.5,
|
|
||||||
mp: 100
|
|
||||||
});
|
|
||||||
_.merge(s.buffs, {
|
|
||||||
str: 0,
|
|
||||||
con: 0,
|
|
||||||
int: 0,
|
int: 0,
|
||||||
per: 0
|
con: 0,
|
||||||
});
|
str: 0
|
||||||
_.merge(user.party.quest.progress, {
|
}
|
||||||
up: 0,
|
},
|
||||||
down: 0
|
party: {
|
||||||
});
|
quest: {
|
||||||
return user.items.lastDrop = {
|
key: 'evilsanta',
|
||||||
count: 0
|
progress: {
|
||||||
};
|
up: 0,
|
||||||
};
|
down: 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
preferences: {
|
||||||
|
automaticAllocation: false
|
||||||
|
},
|
||||||
|
achievements: {},
|
||||||
|
flags: {
|
||||||
|
levelDrops: {}
|
||||||
|
},
|
||||||
|
items: {
|
||||||
|
eggs: {},
|
||||||
|
hatchingPotions: {},
|
||||||
|
food: {},
|
||||||
|
quests: {},
|
||||||
|
gear: {
|
||||||
|
equipped: {
|
||||||
|
weapon: 'weapon_warrior_4',
|
||||||
|
armor: 'armor_warrior_4',
|
||||||
|
shield: 'shield_warrior_4',
|
||||||
|
head: 'head_warrior_4'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
habits: [
|
||||||
|
shared.taskDefaults({
|
||||||
|
id: id,
|
||||||
|
value: 0
|
||||||
|
})
|
||||||
|
],
|
||||||
|
dailys: [
|
||||||
|
{
|
||||||
|
"text": "1"
|
||||||
|
}, {
|
||||||
|
"text": "1"
|
||||||
|
}, {
|
||||||
|
"text": "1"
|
||||||
|
}, {
|
||||||
|
"text": "1"
|
||||||
|
}, {
|
||||||
|
"text": "1"
|
||||||
|
}, {
|
||||||
|
"text": "1"
|
||||||
|
}, {
|
||||||
|
"text": "1"
|
||||||
|
}, {
|
||||||
|
"text": "1"
|
||||||
|
}, {
|
||||||
|
"text": "1"
|
||||||
|
}, {
|
||||||
|
"text": "1"
|
||||||
|
}, {
|
||||||
|
"text": "1"
|
||||||
|
}, {
|
||||||
|
"text": "1"
|
||||||
|
}, {
|
||||||
|
"text": "1"
|
||||||
|
}, {
|
||||||
|
"text": "1"
|
||||||
|
}, {
|
||||||
|
"text": "1"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
todos: [],
|
||||||
|
rewards: []
|
||||||
|
};
|
||||||
|
|
||||||
_.each([1, 25, 50, 75, 100], function(lvl) {
|
shared.wrap(user);
|
||||||
console.log("[LEVEL " + lvl + "] (" + (lvl * 2) + " points total in every attr)\n\n");
|
|
||||||
_.each({
|
s = user.stats;
|
||||||
red: -25,
|
|
||||||
yellow: 0,
|
task = user.tasks[id];
|
||||||
green: 35
|
|
||||||
}, function(taskVal, color) {
|
party = [user];
|
||||||
var _party, b4, str;
|
|
||||||
console.log("[task.value = " + taskVal + " (" + color + ")]");
|
console.log("\n\n================================================");
|
||||||
console.log("direction\texpΔ\t\thpΔ\tgpΔ\ttask.valΔ\ttask.valΔ bonus\t\tboss-hit");
|
|
||||||
_.each(['up', 'down'], function(direction) {
|
console.log("New Simulation");
|
||||||
var b4, delta;
|
|
||||||
clearUser(lvl);
|
console.log("================================================\n\n");
|
||||||
b4 = {
|
|
||||||
hp: s.hp,
|
clearUser = function(lvl) {
|
||||||
taskVal: taskVal
|
if (lvl == null) {
|
||||||
};
|
lvl = 1;
|
||||||
task.value = taskVal;
|
}
|
||||||
if (direction === 'up') {
|
_.merge(user.stats, {
|
||||||
task.type = 'daily';
|
exp: 0,
|
||||||
}
|
gp: 0,
|
||||||
delta = user.ops.score({
|
hp: 50,
|
||||||
params: {
|
lvl: lvl,
|
||||||
id: id,
|
str: lvl * 1.5,
|
||||||
direction: direction
|
con: lvl * 1.5,
|
||||||
}
|
per: lvl * 1.5,
|
||||||
});
|
int: lvl * 1.5,
|
||||||
return console.log((direction === 'up' ? '↑' : '↓') + "\t\t" + s.exp + "/" + (shared.tnl(s.lvl)) + "\t\t" + ((b4.hp - s.hp).toFixed(1)) + "\t" + (s.gp.toFixed(1)) + "\t" + (delta.toFixed(1)) + "\t\t" + ((task.value - b4.taskVal - delta).toFixed(1)) + "\t\t\t" + (user.party.quest.progress.up.toFixed(1)));
|
mp: 100
|
||||||
});
|
|
||||||
str = '- [Wizard]';
|
|
||||||
task.value = taskVal;
|
|
||||||
clearUser(lvl);
|
|
||||||
b4 = {
|
|
||||||
taskVal: taskVal
|
|
||||||
};
|
|
||||||
shared.content.spells.wizard.fireball.cast(user, task);
|
|
||||||
str += "\tfireball(task.valΔ:" + ((task.value - taskVal).toFixed(1)) + " exp:" + (s.exp.toFixed(1)) + " bossHit:" + (user.party.quest.progress.up.toFixed(2)) + ")";
|
|
||||||
task.value = taskVal;
|
|
||||||
clearUser(lvl);
|
|
||||||
_party = [
|
|
||||||
user, {
|
|
||||||
stats: {
|
|
||||||
mp: 0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
];
|
|
||||||
shared.content.spells.wizard.mpheal.cast(user, _party);
|
|
||||||
str += "\t| mpheal(mp:" + _party[1].stats.mp + ")";
|
|
||||||
task.value = taskVal;
|
|
||||||
clearUser(lvl);
|
|
||||||
shared.content.spells.wizard.earth.cast(user, party);
|
|
||||||
str += "\t\t\t\t| earth(buffs.int:" + s.buffs.int + ")";
|
|
||||||
s.buffs.int = 0;
|
|
||||||
task.value = taskVal;
|
|
||||||
clearUser(lvl);
|
|
||||||
shared.content.spells.wizard.frost.cast(user, {});
|
|
||||||
str += "\t\t\t| frost(N/A)";
|
|
||||||
console.log(str);
|
|
||||||
str = '- [Warrior]';
|
|
||||||
task.value = taskVal;
|
|
||||||
clearUser(lvl);
|
|
||||||
shared.content.spells.warrior.smash.cast(user, task);
|
|
||||||
b4 = {
|
|
||||||
taskVal: taskVal
|
|
||||||
};
|
|
||||||
str += "\tsmash(task.valΔ:" + ((task.value - taskVal).toFixed(1)) + ")";
|
|
||||||
task.value = taskVal;
|
|
||||||
clearUser(lvl);
|
|
||||||
shared.content.spells.warrior.defensiveStance.cast(user, {});
|
|
||||||
str += "\t\t| defensiveStance(buffs.con:" + s.buffs.con + ")";
|
|
||||||
s.buffs.con = 0;
|
|
||||||
task.value = taskVal;
|
|
||||||
clearUser(lvl);
|
|
||||||
shared.content.spells.warrior.valorousPresence.cast(user, party);
|
|
||||||
str += "\t\t\t| valorousPresence(buffs.str:" + s.buffs.str + ")";
|
|
||||||
s.buffs.str = 0;
|
|
||||||
task.value = taskVal;
|
|
||||||
clearUser(lvl);
|
|
||||||
shared.content.spells.warrior.intimidate.cast(user, party);
|
|
||||||
str += "\t\t| intimidate(buffs.con:" + s.buffs.con + ")";
|
|
||||||
s.buffs.con = 0;
|
|
||||||
console.log(str);
|
|
||||||
str = '- [Rogue]';
|
|
||||||
task.value = taskVal;
|
|
||||||
clearUser(lvl);
|
|
||||||
shared.content.spells.rogue.pickPocket.cast(user, task);
|
|
||||||
str += "\tpickPocket(gp:" + (s.gp.toFixed(1)) + ")";
|
|
||||||
task.value = taskVal;
|
|
||||||
clearUser(lvl);
|
|
||||||
shared.content.spells.rogue.backStab.cast(user, task);
|
|
||||||
b4 = {
|
|
||||||
taskVal: taskVal
|
|
||||||
};
|
|
||||||
str += "\t\t| backStab(task.valΔ:" + ((task.value - b4.taskVal).toFixed(1)) + " exp:" + (s.exp.toFixed(1)) + " gp:" + (s.gp.toFixed(1)) + ")";
|
|
||||||
task.value = taskVal;
|
|
||||||
clearUser(lvl);
|
|
||||||
shared.content.spells.rogue.toolsOfTrade.cast(user, party);
|
|
||||||
str += "\t| toolsOfTrade(buffs.per:" + s.buffs.per + ")";
|
|
||||||
s.buffs.per = 0;
|
|
||||||
task.value = taskVal;
|
|
||||||
clearUser(lvl);
|
|
||||||
shared.content.spells.rogue.stealth.cast(user, {});
|
|
||||||
str += "\t\t| stealth(avoiding " + user.stats.buffs.stealth + " tasks)";
|
|
||||||
user.stats.buffs.stealth = 0;
|
|
||||||
console.log(str);
|
|
||||||
str = '- [Healer]';
|
|
||||||
task.value = taskVal;
|
|
||||||
clearUser(lvl);
|
|
||||||
s.hp = 0;
|
|
||||||
shared.content.spells.healer.heal.cast(user, {});
|
|
||||||
str += "\theal(hp:" + (s.hp.toFixed(1)) + ")";
|
|
||||||
task.value = taskVal;
|
|
||||||
clearUser(lvl);
|
|
||||||
shared.content.spells.healer.brightness.cast(user, {});
|
|
||||||
b4 = {
|
|
||||||
taskVal: taskVal
|
|
||||||
};
|
|
||||||
str += "\t\t\t| brightness(task.valΔ:" + ((task.value - b4.taskVal).toFixed(1)) + ")";
|
|
||||||
task.value = taskVal;
|
|
||||||
clearUser(lvl);
|
|
||||||
shared.content.spells.healer.protectAura.cast(user, party);
|
|
||||||
str += "\t\t\t| protectAura(buffs.con:" + s.buffs.con + ")";
|
|
||||||
s.buffs.con = 0;
|
|
||||||
task.value = taskVal;
|
|
||||||
clearUser(lvl);
|
|
||||||
s.hp = 0;
|
|
||||||
shared.content.spells.healer.heallAll.cast(user, party);
|
|
||||||
str += "\t\t| heallAll(hp:" + (s.hp.toFixed(1)) + ")";
|
|
||||||
console.log(str);
|
|
||||||
return console.log('\n');
|
|
||||||
});
|
|
||||||
return console.log('------------------------------------------------------------');
|
|
||||||
});
|
});
|
||||||
|
_.merge(s.buffs, {
|
||||||
|
str: 0,
|
||||||
|
con: 0,
|
||||||
|
int: 0,
|
||||||
|
per: 0
|
||||||
|
});
|
||||||
|
_.merge(user.party.quest.progress, {
|
||||||
|
up: 0,
|
||||||
|
down: 0
|
||||||
|
});
|
||||||
|
return user.items.lastDrop = {
|
||||||
|
count: 0
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
_.each([1, 25, 50, 75, 100], function(lvl) {
|
||||||
|
console.log("[LEVEL " + lvl + "] (" + (lvl * 2) + " points total in every attr)\n\n");
|
||||||
|
_.each({
|
||||||
|
red: -25,
|
||||||
|
yellow: 0,
|
||||||
|
green: 35
|
||||||
|
}, function(taskVal, color) {
|
||||||
|
var _party, b4, str;
|
||||||
|
console.log("[task.value = " + taskVal + " (" + color + ")]");
|
||||||
|
console.log("direction\texpΔ\t\thpΔ\tgpΔ\ttask.valΔ\ttask.valΔ bonus\t\tboss-hit");
|
||||||
|
_.each(['up', 'down'], function(direction) {
|
||||||
|
var b4, delta;
|
||||||
|
clearUser(lvl);
|
||||||
|
b4 = {
|
||||||
|
hp: s.hp,
|
||||||
|
taskVal: taskVal
|
||||||
|
};
|
||||||
|
task.value = taskVal;
|
||||||
|
if (direction === 'up') {
|
||||||
|
task.type = 'daily';
|
||||||
|
}
|
||||||
|
delta = user.ops.score({
|
||||||
|
params: {
|
||||||
|
id: id,
|
||||||
|
direction: direction
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return console.log((direction === 'up' ? '↑' : '↓') + "\t\t" + s.exp + "/" + (shared.tnl(s.lvl)) + "\t\t" + ((b4.hp - s.hp).toFixed(1)) + "\t" + (s.gp.toFixed(1)) + "\t" + (delta.toFixed(1)) + "\t\t" + ((task.value - b4.taskVal - delta).toFixed(1)) + "\t\t\t" + (user.party.quest.progress.up.toFixed(1)));
|
||||||
|
});
|
||||||
|
str = '- [Wizard]';
|
||||||
|
task.value = taskVal;
|
||||||
|
clearUser(lvl);
|
||||||
|
b4 = {
|
||||||
|
taskVal: taskVal
|
||||||
|
};
|
||||||
|
shared.content.spells.wizard.fireball.cast(user, task);
|
||||||
|
str += "\tfireball(task.valΔ:" + ((task.value - taskVal).toFixed(1)) + " exp:" + (s.exp.toFixed(1)) + " bossHit:" + (user.party.quest.progress.up.toFixed(2)) + ")";
|
||||||
|
task.value = taskVal;
|
||||||
|
clearUser(lvl);
|
||||||
|
_party = [
|
||||||
|
user, {
|
||||||
|
stats: {
|
||||||
|
mp: 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
];
|
||||||
|
shared.content.spells.wizard.mpheal.cast(user, _party);
|
||||||
|
str += "\t| mpheal(mp:" + _party[1].stats.mp + ")";
|
||||||
|
task.value = taskVal;
|
||||||
|
clearUser(lvl);
|
||||||
|
shared.content.spells.wizard.earth.cast(user, party);
|
||||||
|
str += "\t\t\t\t| earth(buffs.int:" + s.buffs.int + ")";
|
||||||
|
s.buffs.int = 0;
|
||||||
|
task.value = taskVal;
|
||||||
|
clearUser(lvl);
|
||||||
|
shared.content.spells.wizard.frost.cast(user, {});
|
||||||
|
str += "\t\t\t| frost(N/A)";
|
||||||
|
console.log(str);
|
||||||
|
str = '- [Warrior]';
|
||||||
|
task.value = taskVal;
|
||||||
|
clearUser(lvl);
|
||||||
|
shared.content.spells.warrior.smash.cast(user, task);
|
||||||
|
b4 = {
|
||||||
|
taskVal: taskVal
|
||||||
|
};
|
||||||
|
str += "\tsmash(task.valΔ:" + ((task.value - taskVal).toFixed(1)) + ")";
|
||||||
|
task.value = taskVal;
|
||||||
|
clearUser(lvl);
|
||||||
|
shared.content.spells.warrior.defensiveStance.cast(user, {});
|
||||||
|
str += "\t\t| defensiveStance(buffs.con:" + s.buffs.con + ")";
|
||||||
|
s.buffs.con = 0;
|
||||||
|
task.value = taskVal;
|
||||||
|
clearUser(lvl);
|
||||||
|
shared.content.spells.warrior.valorousPresence.cast(user, party);
|
||||||
|
str += "\t\t\t| valorousPresence(buffs.str:" + s.buffs.str + ")";
|
||||||
|
s.buffs.str = 0;
|
||||||
|
task.value = taskVal;
|
||||||
|
clearUser(lvl);
|
||||||
|
shared.content.spells.warrior.intimidate.cast(user, party);
|
||||||
|
str += "\t\t| intimidate(buffs.con:" + s.buffs.con + ")";
|
||||||
|
s.buffs.con = 0;
|
||||||
|
console.log(str);
|
||||||
|
str = '- [Rogue]';
|
||||||
|
task.value = taskVal;
|
||||||
|
clearUser(lvl);
|
||||||
|
shared.content.spells.rogue.pickPocket.cast(user, task);
|
||||||
|
str += "\tpickPocket(gp:" + (s.gp.toFixed(1)) + ")";
|
||||||
|
task.value = taskVal;
|
||||||
|
clearUser(lvl);
|
||||||
|
shared.content.spells.rogue.backStab.cast(user, task);
|
||||||
|
b4 = {
|
||||||
|
taskVal: taskVal
|
||||||
|
};
|
||||||
|
str += "\t\t| backStab(task.valΔ:" + ((task.value - b4.taskVal).toFixed(1)) + " exp:" + (s.exp.toFixed(1)) + " gp:" + (s.gp.toFixed(1)) + ")";
|
||||||
|
task.value = taskVal;
|
||||||
|
clearUser(lvl);
|
||||||
|
shared.content.spells.rogue.toolsOfTrade.cast(user, party);
|
||||||
|
str += "\t| toolsOfTrade(buffs.per:" + s.buffs.per + ")";
|
||||||
|
s.buffs.per = 0;
|
||||||
|
task.value = taskVal;
|
||||||
|
clearUser(lvl);
|
||||||
|
shared.content.spells.rogue.stealth.cast(user, {});
|
||||||
|
str += "\t\t| stealth(avoiding " + user.stats.buffs.stealth + " tasks)";
|
||||||
|
user.stats.buffs.stealth = 0;
|
||||||
|
console.log(str);
|
||||||
|
str = '- [Healer]';
|
||||||
|
task.value = taskVal;
|
||||||
|
clearUser(lvl);
|
||||||
|
s.hp = 0;
|
||||||
|
shared.content.spells.healer.heal.cast(user, {});
|
||||||
|
str += "\theal(hp:" + (s.hp.toFixed(1)) + ")";
|
||||||
|
task.value = taskVal;
|
||||||
|
clearUser(lvl);
|
||||||
|
shared.content.spells.healer.brightness.cast(user, {});
|
||||||
|
b4 = {
|
||||||
|
taskVal: taskVal
|
||||||
|
};
|
||||||
|
str += "\t\t\t| brightness(task.valΔ:" + ((task.value - b4.taskVal).toFixed(1)) + ")";
|
||||||
|
task.value = taskVal;
|
||||||
|
clearUser(lvl);
|
||||||
|
shared.content.spells.healer.protectAura.cast(user, party);
|
||||||
|
str += "\t\t\t| protectAura(buffs.con:" + s.buffs.con + ")";
|
||||||
|
s.buffs.con = 0;
|
||||||
|
task.value = taskVal;
|
||||||
|
clearUser(lvl);
|
||||||
|
s.hp = 0;
|
||||||
|
shared.content.spells.healer.heallAll.cast(user, party);
|
||||||
|
str += "\t\t| heallAll(hp:" + (s.hp.toFixed(1)) + ")";
|
||||||
|
console.log(str);
|
||||||
|
return console.log('\n');
|
||||||
|
});
|
||||||
|
return console.log('------------------------------------------------------------');
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
_.each [1,25,50,75,100,125], (lvl) ->
|
_.each [1,25,50,75,100,125], (lvl) ->
|
||||||
console.log "[LEVEL #{lvl}] (#{lvl*2} points in every attr)\n\n"
|
console.log "[LEVEL #{lvl}] (#{lvl*2} points in every attr)\n\n"
|
||||||
_.each {red:-25,yellow:0,green:35}, (taskVal, color) ->
|
_.each {red:-25,yellow:0,green:35}, (taskVal, color) ->
|
||||||
console.log "[task.value = #{taskVal} (#{color})]"
|
console.log "[task.value = #{taskVal} (#{color})]"
|
||||||
console.log "direction\texpΔ\t\thpΔ\tgpΔ\ttask.valΔ\ttask.valΔ bonus\t\tboss-hit"
|
console.log "direction\texpΔ\t\thpΔ\tgpΔ\ttask.valΔ\ttask.valΔ bonus\t\tboss-hit"
|
||||||
_.each ['up','down'], (direction) ->
|
_.each ['up','down'], (direction) ->
|
||||||
clearUser(lvl)
|
clearUser(lvl)
|
||||||
b4 = {hp:s.hp, taskVal}
|
b4 = {hp:s.hp, taskVal}
|
||||||
task.value = taskVal
|
task.value = taskVal
|
||||||
task.type = 'daily' if direction is 'up'
|
task.type = 'daily' if direction is 'up'
|
||||||
delta = user.ops.score params:{id, direction}
|
delta = user.ops.score params:{id, direction}
|
||||||
console.log "#{if direction is 'up' then '↑' else '↓'}\t\t#{s.exp}/#{shared.tnl(s.lvl)}\t\t#{(b4.hp-s.hp).toFixed(1)}\t#{s.gp.toFixed(1)}\t#{delta.toFixed(1)}\t\t#{(task.value-b4.taskVal-delta).toFixed(1)}\t\t\t#{user.party.quest.progress.up.toFixed(1)}"
|
console.log "#{if direction is 'up' then '↑' else '↓'}\t\t#{s.exp}/#{shared.tnl(s.lvl)}\t\t#{(b4.hp-s.hp).toFixed(1)}\t#{s.gp.toFixed(1)}\t#{delta.toFixed(1)}\t\t#{(task.value-b4.taskVal-delta).toFixed(1)}\t\t\t#{user.party.quest.progress.up.toFixed(1)}"
|
||||||
|
|
||||||
task.value = taskVal;clearUser(lvl)
|
task.value = taskVal;clearUser(lvl)
|
||||||
shared.content.spells.rogue.stealth.cast(user,{})
|
shared.content.spells.rogue.stealth.cast(user,{})
|
||||||
console.log "\t\t| stealth(avoiding #{user.stats.buffs.stealth} tasks)"
|
console.log "\t\t| stealth(avoiding #{user.stats.buffs.stealth} tasks)"
|
||||||
user.stats.buffs.stealth = 0
|
user.stats.buffs.stealth = 0
|
||||||
|
|
||||||
console.log user.dailys.length
|
console.log user.dailys.length
|
||||||
*/
|
*/
|
||||||
|
|
||||||
}).call(this);
|
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
'use strict';
|
|
||||||
|
|
||||||
var shared = require('../../common/script/index.js');
|
var shared = require('../../common/script/index.js');
|
||||||
shared.i18n.translations = require('../../website/src/libs/i18n.js').translations
|
shared.i18n.translations = require('../../website/src/libs/i18n.js').translations
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user