Pull in client side changes for quest routes

This commit is contained in:
Blade Barringer
2015-09-15 09:32:24 -05:00
parent 38e07246da
commit b32e521c56
9 changed files with 620 additions and 292 deletions

View File

@@ -1,7 +1,7 @@
'use strict';
describe('Quests Service', function() {
var scope, rootScope, groupsService, quest, questsService, user, content;
var groupsService, quest, questsService, user, content, resolveSpy, rejectSpy;
beforeEach(function() {
user = specHelper.newUser();
@@ -16,105 +16,365 @@ describe('Quests Service', function() {
$provide.value('User', {user: user});
});
inject(function($rootScope, $controller, Quests, Groups, Content) {
scope = $rootScope.$new();
rootScope = $rootScope;
$controller('RootCtrl', {$scope: scope, User: {user: user}});
inject(function(Quests, Groups, Content) {
questsService = Quests;
groupsService = Groups;
content = Content;
});
sandbox.stub(groupsService, 'inviteOrStartParty');
sandbox.stub(rootScope, 'openModal');
sandbox.stub(window,'confirm',function(){return true});
sandbox.stub(window,'confirm');
sandbox.stub(window,'alert');
resolveSpy = sandbox.spy();
rejectSpy = sandbox.spy();
});
context('functions', function() {
describe('#lockQuest', function() {
describe('lock quest', function() {
it('locks quest when user does not meet level requirement', function() {
user.stats.lvl = 15;
it('locks quest when user does not meet level requirement', function() {
user.stats.lvl = 15;
expect(questsService.lockQuest(quest)).to.be.ok;
});
expect(questsService.lockQuest(quest)).to.be.ok;
});
it('does not lock quest if we ignore level requirement', function() {
user.stats.lvl = 15;
it('does not lock quest if we ignore level requirement', function() {
user.stats.lvl = 15;
expect(questsService.lockQuest(quest,true)).to.not.be.ok;
});
expect(questsService.lockQuest(quest,true)).to.not.be.ok;
});
it('does not lock quest if user meets level requirement', function() {
user.stats.lvl = 20;
it('does not lock quest if user meets level requirement', function() {
user.stats.lvl = 20;
expect(questsService.lockQuest(quest)).to.not.be.ok;
});
expect(questsService.lockQuest(quest)).to.not.be.ok;
});
it('locks quest if user has not completed previous quest in series', function() {
quest.previous = 'priorQuest';
user.stats.lvl = 25;
it('locks quest if user has not completed previous quest in series', function() {
quest.previous = 'priorQuest';
user.stats.lvl = 25;
expect(questsService.lockQuest(quest)).to.be.ok;
});
expect(questsService.lockQuest(quest)).to.be.ok;
});
it('does not lock quest if user has completed previous quest in series', function() {
quest.previous = 'priorQuest';
user.stats.lvl = 25;
user.achievements.quests.priorQuest = 1;
it('does not lock quest if user has completed previous quest in series', function() {
quest.previous = 'priorQuest';
user.stats.lvl = 25;
user.achievements.quests.priorQuest = 1;
expect(questsService.lockQuest(quest)).to.not.be.ok;
});
});
expect(questsService.lockQuest(quest)).to.not.be.ok;
describe('#buyQuest', function() {
var scope;
beforeEach(inject(function($rootScope) {
scope = $rootScope.$new();
}));
it('returns a promise', function() {
var promise = questsService.buyQuest('whale');
expect(promise).to.respondTo('then');
});
context('Quest key does not exist', function() {
it('rejects with message that quest is not found', function(done) {
questsService.buyQuest('foo')
.then(resolveSpy, function(rej) {
expect(rej).to.eql('No quest with that key found');
expect(resolveSpy).to.not.be.called;
done();
});
scope.$apply();
});
});
describe('buy quest', function() {
context('invite friends', function() {
it('prompts user to invite friends to party for invite reward quests', function() {
questsService.buyQuest('basilist');
expect(window.confirm).to.have.been.calledOnce;
expect(groupsService.inviteOrStartParty).to.have.been.calledOnce;
expect(rootScope.openModal).to.have.been.notCalled;
expect(window.confirm).to.be.calledOnce;
expect(window.confirm).to.be.calledWith(env.t('mustInviteFriend'));
});
it('does not allow user to buy quests whose previous quests are incomplete', function() {
it('rejects promise if confirm is cancelled', function(done) {
window.confirm.returns(false);
questsService.buyQuest('basilist')
.then(resolveSpy, function(rej) {
expect(rej).to.eql('Did not want to invite friends');
expect(window.confirm).to.be.calledOnce;
expect(groupsService.inviteOrStartParty).to.not.be.called;
done();
});
scope.$apply();
});
it('rejects promise if confirm is cofirmed and calls groups service', function(done) {
window.confirm.returns(true);
questsService.buyQuest('basilist')
.then(resolveSpy, function(rej) {
expect(rej).to.eql('Invite or start party');
expect(window.confirm).to.be.calledOnce;
expect(groupsService.inviteOrStartParty).to.be.calledOnce;
done();
});
scope.$apply();
});
});
context('quests in a series', function() {
it('does not allow user to buy subsquent quests in a series if user has no quest achievements', function(done) {
user.stats.lvl = 100;
user.achievements.quests = undefined;
questsService.buyQuest('goldenknight2');
questsService.buyQuest('goldenknight2')
.then(resolveSpy, function(res) {
expect(window.alert).to.have.been.calledOnce;
expect(res).to.eql('unlockByQuesting');
expect(resolveSpy).to.not.be.called;
done();
});
expect(window.alert).to.have.been.calledOnce;
expect(rootScope.openModal).to.have.been.notCalled;
scope.$apply();
});
it('does not allow user to buy quests beyond their level', function() {
it('does not allow user to buy quests whose previous quests are incomplete', function(done) {
user.stats.lvl = 100;
user.achievements.quests = {
'atom1': 1
};
questsService.buyQuest('goldenknight2')
.then(resolveSpy, function(res) {
expect(window.alert).to.have.been.calledOnce;
expect(resolveSpy).to.not.be.called;
done();
});
scope.$apply();
});
});
context('quests with level requirement', function() {
it('does not allow user to buy quests beyond their level', function(done) {
user.stats.lvl = 1;
questsService.buyQuest('vice1');
questsService.buyQuest('vice1')
.then(resolveSpy, function(res) {
expect(window.alert).to.have.been.calledOnce;
expect(res).to.eql('mustLvlQuest');
done();
});
expect(window.alert).to.have.been.calledOnce;
expect(rootScope.openModal).to.have.been.notCalled;
scope.$apply();
});
it('opens purchase modal if Gem quest prerequisites are met', function() {
user.stats.lvl = 100;
user.achievements.quests.atom1 = 2;
it('allows user to buy quest if they meet level requirement', function(done) {
user.stats.lvl = 30;
questsService.buyQuest('atom2');
questsService.buyQuest('vice1')
.then(function(res) {
expect(res).to.eql(content.quests.vice1);
expect(window.alert).to.not.be.called;
expect(rejectSpy).to.not.be.called;
done();
}, rejectSpy);
expect(scope.selectedQuest).to.eql(content.quests.atom2);
expect(rootScope.openModal).to.have.been.calledOnce;
expect(rootScope.openModal).to.have.been.calledWith('buyQuest');
scope.$apply();
});
});
it('opens purchase modal if quest is Gold-purchasable', function() {
questsService.buyQuest('dilatoryDistress1');
context('gold purchasable quests', function() {
it('sends quest object', function(done) {
questsService.buyQuest('dilatoryDistress1')
.then(function(res) {
expect(res).to.eql(content.quests.dilatoryDistress1);
expect(window.alert).to.not.be.called;
expect(rejectSpy).to.not.be.called;
done();
}, rejectSpy);
expect(scope.selectedQuest).to.eql(content.quests.dilatoryDistress1);
expect(rootScope.openModal).to.have.been.calledOnce;
expect(rootScope.openModal).to.have.been.calledWith('buyQuest');
scope.$apply();
});
});
context('all other quests', function() {
it('sends quest object', function(done) {
questsService.buyQuest('whale')
.then(function(res) {
expect(res).to.eql(content.quests.whale);
expect(window.alert).to.not.be.called;
expect(rejectSpy).to.not.be.called;
done();
}, rejectSpy);
scope.$apply();
});
});
});
describe('#showQuest', function() {
var scope;
beforeEach(inject(function($rootScope) {
scope = $rootScope.$new();
}));
it('returns a promise', function() {
var promise = questsService.showQuest('whale');
expect(promise).to.respondTo('then');
});
context('Quest key does not exist', function() {
it('rejects with message that quest is not found', function(done) {
questsService.showQuest('foo')
.then(resolveSpy, function(rej) {
expect(rej).to.eql('No quest with that key found');
expect(resolveSpy).to.not.be.called;
done();
});
scope.$apply();
});
});
context('quests in a series', function() {
it('does not allow user to buy subsquent quests in a series if user has no quest achievements', function(done) {
user.stats.lvl = 100;
user.achievements.quests = undefined;
questsService.showQuest('goldenknight2')
.then(resolveSpy, function(res) {
expect(window.alert).to.have.been.calledOnce;
expect(res).to.eql('unlockByQuesting');
expect(resolveSpy).to.not.be.called;
done();
});
scope.$apply();
});
it('does not allow user to buy quests whose previous quests are incomplete', function(done) {
user.stats.lvl = 100;
user.achievements.quests = {
'atom1': 1
};
questsService.showQuest('goldenknight2')
.then(resolveSpy, function(res) {
expect(window.alert).to.have.been.calledOnce;
expect(resolveSpy).to.not.be.called;
done();
});
scope.$apply();
});
});
context('quests with level requirement', function() {
it('does not allow user to buy quests beyond their level', function(done) {
user.stats.lvl = 1;
questsService.showQuest('vice1')
.then(resolveSpy, function(res) {
expect(window.alert).to.have.been.calledOnce;
expect(res).to.eql('mustLvlQuest');
done();
});
scope.$apply();
});
it('allows user to buy quest if they meet level requirement', function(done) {
user.stats.lvl = 30;
questsService.showQuest('vice1')
.then(function(res) {
expect(res).to.eql(content.quests.vice1);
expect(window.alert).to.not.be.called;
expect(rejectSpy).to.not.be.called;
done();
}, rejectSpy);
scope.$apply();
});
});
context('gold purchasable quests', function() {
it('sends quest object', function(done) {
questsService.showQuest('dilatoryDistress1')
.then(function(res) {
expect(res).to.eql(content.quests.dilatoryDistress1);
expect(window.alert).to.not.be.called;
expect(rejectSpy).to.not.be.called;
done();
}, rejectSpy);
scope.$apply();
});
});
context('all other quests', function() {
it('sends quest object', function(done) {
questsService.showQuest('whale')
.then(function(res) {
expect(res).to.eql(content.quests.whale);
expect(window.alert).to.not.be.called;
expect(rejectSpy).to.not.be.called;
done();
}, rejectSpy);
scope.$apply();
});
});
});
describe('#initQuest', function() {
it('returns a promise', function() {
var promise = questsService.initQuest('whale');
expect(promise).to.respondTo('then');
});
it('accepts quest');
it('brings user to party page');
});
describe('#sendAction', function() {
var fakeBackend, scope;
beforeEach(inject(function($httpBackend, $rootScope) {
scope = $rootScope.$new();
fakeBackend = $httpBackend;
fakeBackend.when('GET', 'partials/main.html').respond({});
fakeBackend.when('GET', '/api/v2/groups/party').respond({_id: 'party-id'});
fakeBackend.when('POST', '/api/v2/groups/party-id/questReject').respond({quest: { key: 'whale' } });
fakeBackend.flush();
}));
it('returns a promise', function() {
var promise = questsService.sendAction('questReject');
expect(promise).to.respondTo('then');
});
it('calls specified endpoint endpoint', function(done) {
fakeBackend.expectPOST('/api/v2/groups/party-id/questReject');
questsService.sendAction('questReject')
.then(function(res) {
expect(res.key).to.eql('whale');
done();
});
fakeBackend.flush();
scope.$apply();
});
});
});