invalid class change throws error (#8496) (#8531)

* invalid class-change throws error

minor fixes

indentation fixes

indentation fixes

indentation fixes

* minor fixes
This commit is contained in:
Lulock
2017-03-16 22:38:24 +04:00
committed by Sabe Jones
parent 05d75a4d5c
commit cc9bca5f63
3 changed files with 43 additions and 17 deletions
+14
View File
@@ -1,6 +1,7 @@
import changeClass from '../../../website/common/script/ops/changeClass';
import {
NotAuthorized,
BadRequest,
} from '../../../website/common/script/libs/errors';
import i18n from '../../../website/common/script/i18n';
import {
@@ -27,6 +28,19 @@ describe('shared.ops.changeClass', () => {
}
});
it('req.query.class is an invalid class', (done) => {
user.flags.classSelected = false;
user.preferences.disableClasses = false;
try {
changeClass(user, {query: {class: 'cellist'}});
} catch (err) {
expect(err).to.be.an.instanceof(BadRequest);
expect(err.message).to.equal(i18n.t('invalidClass'));
done();
}
});
context('req.query.class is a valid class', () => {
it('errors if user.stats.flagSelected is true and user.balance < 0.75', (done) => {
user.flags.classSelected = true;
+1
View File
@@ -112,6 +112,7 @@
"mystery": "Mystery",
"changeClass": "Change Class, Refund Attribute Points",
"lvl10ChangeClass": "To change class you must be at least level 10.",
"invalidClass":"Invalid class. Please specify 'warrior', 'rogue', 'wizard', or 'healer'.",
"levelPopover": "Each level earns you one point to assign to an attribute of your choice. You can do so manually, or let the game decide for you using one of the Automatic Allocation options.",
"unallocated": "Unallocated Attribute Points",
"haveUnallocated": "You have <%= points %> unallocated Attribute Point(s)",
+28 -17
View File
@@ -7,15 +7,39 @@ import splitWhitespace from '../libs/splitWhitespace';
import { capByLevel } from '../statHelpers';
import {
NotAuthorized,
BadRequest,
} from '../libs/errors';
function resetClass (user, req = {}) {
if (user.preferences.disableClasses) {
user.preferences.disableClasses = false;
user.preferences.autoAllocate = false;
} else {
if (user.balance < 0.75) throw new NotAuthorized(i18n.t('notEnoughGems', req.language));
user.balance -= 0.75;
}
user.stats.str = 0;
user.stats.con = 0;
user.stats.per = 0;
user.stats.int = 0;
user.stats.points = capByLevel(user.stats.lvl);
user.flags.classSelected = false;
}
module.exports = function changeClass (user, req = {}, analytics) {
let klass = get(req, 'query.class');
// user.flags.classSelected is set to false after the user paid the 3 gems
if (user.stats.lvl < 10) {
throw new NotAuthorized(i18n.t('lvl10ChangeClass', req.language));
} else if (!user.flags.classSelected && (klass === 'warrior' || klass === 'rogue' || klass === 'wizard' || klass === 'healer')) {
} else if (!klass) {
// if no class is specified, reset points and set user.flags.classSelected to false. User will have paid 3 gems and will be prompted to select class.
resetClass(user, req);
} else if (klass === 'warrior' || klass === 'rogue' || klass === 'wizard' || klass === 'healer') {
if (user.flags.classSelected) {
resetClass(user, req);
}
user.stats.class = klass;
user.flags.classSelected = true;
@@ -56,22 +80,9 @@ module.exports = function changeClass (user, req = {}, analytics) {
});
}
} else {
if (user.preferences.disableClasses) {
user.preferences.disableClasses = false;
user.preferences.autoAllocate = false;
} else {
if (user.balance < 0.75) throw new NotAuthorized(i18n.t('notEnoughGems', req.language));
user.balance -= 0.75;
}
user.stats.str = 0;
user.stats.con = 0;
user.stats.per = 0;
user.stats.int = 0;
user.stats.points = capByLevel(user.stats.lvl);
user.flags.classSelected = false;
// if invalid class is specified, throw an error.
throw new BadRequest(i18n.t('invalidClass', req.language));
}
return [
pick(user, splitWhitespace('stats flags items preferences')),
];