diff --git a/common/script/fns/handleTwoHanded.js b/common/script/fns/handleTwoHanded.js index 44537a1cac..a861a10e68 100644 --- a/common/script/fns/handleTwoHanded.js +++ b/common/script/fns/handleTwoHanded.js @@ -1,7 +1,7 @@ import content from '../content/index'; import i18n from '../i18n'; -module.exports = function handleTwoHanded (user, item, type = 'equipped', req) { +module.exports = function handleTwoHanded (user, item, type = 'equipped', req = {}) { let currentShield = content.gear.flat[user.items.gear[type].shield]; let currentWeapon = content.gear.flat[user.items.gear[type].weapon]; diff --git a/common/script/fns/ultimateGear.js b/common/script/fns/ultimateGear.js index 729d11001a..be5553201d 100644 --- a/common/script/fns/ultimateGear.js +++ b/common/script/fns/ultimateGear.js @@ -2,16 +2,7 @@ import content from '../content/index'; import _ from 'lodash'; module.exports = function ultimateGear (user) { - let owned = window ? user.items.gear.owned : user.items.gear.owned.toObject(); - - if (!user.achievements.ultimateGearSets) { - user.achievements.ultimateGearSets = { - healer: false, - wizard: false, - rogue: false, - warrior: false, - }; - } + let owned = typeof window !== 'undefined' ? user.items.gear.owned : user.items.gear.owned.toObject(); content.classes.forEach((klass) => { if (user.achievements.ultimateGearSets[klass] !== true) { @@ -24,9 +15,6 @@ module.exports = function ultimateGear (user) { } }); - // TODO - if (user.markModified) user.markModified('achievements.ultimateGearSets'); - if (_.contains(user.achievements.ultimateGearSets, true) && user.flags.armoireEnabled !== true) { user.flags.armoireEnabled = true; } diff --git a/common/script/index.js b/common/script/index.js index a7bdf6e3d1..a6dcd73f97 100644 --- a/common/script/index.js +++ b/common/script/index.js @@ -155,6 +155,12 @@ api.wrap = function wrapUser (user, main = true) { if (user._wrapped) return; user._wrapped = true; + // Make markModified available on the client side as a noop function + // TODO move to client? + if (!user.markModified) { + user.markModified = function noopMarkModified () {}; + } + if (main) { user.ops = { update: _.partial(importedOps.update, user), @@ -183,14 +189,10 @@ api.wrap = function wrapUser (user, main = true) { deletePM: _.partial(importedOps.deletePM, user), blockUser: _.partial(importedOps.blockUser, user), feed: _.partial(importedOps.feed, user), - buySpecialSpell: _.partial(importedOps.buySpecialSpell, user), purchase: _.partial(importedOps.purchase, user), releasePets: _.partial(importedOps.releasePets, user), releaseMounts: _.partial(importedOps.releaseMounts, user), releaseBoth: _.partial(importedOps.releaseBoth, user), - buy: _.partial(importedOps.buy, user), - buyQuest: _.partial(importedOps.buyQuest, user), - buyMysterySet: _.partial(importedOps.buyMysterySet, user), hourglassPurchase: _.partial(importedOps.hourglassPurchase, user), sell: _.partial(importedOps.sell, user), equip: _.partial(importedOps.equip, user), @@ -207,10 +209,7 @@ api.wrap = function wrapUser (user, main = true) { user.fns = { getItem: _.partial(importedFns.getItem, user), - handleTwoHanded: _.partial(importedFns.handleTwoHanded, user), - predictableRandom: _.partial(importedFns.predictableRandom, user), crit: _.partial(importedFns.crit, user), - randomVal: _.partial(importedFns.randomVal, user), dotSet: _.partial(importedFns.dotSet, user), dotGet: _.partial(importedFns.dotGet, user), randomDrop: _.partial(importedFns.randomDrop, user), @@ -218,7 +217,6 @@ api.wrap = function wrapUser (user, main = true) { updateStats: _.partial(importedFns.updateStats, user), cron: _.partial(importedFns.cron, user), preenUserHistory: _.partial(importedFns.preenUserHistory, user), - ultimateGear: _.partial(importedFns.ultimateGear, user), nullify: _.partial(importedFns.nullify, user), }; diff --git a/common/script/ops/buy.js b/common/script/ops/buy.js index d90d07b0cb..d99917a358 100644 --- a/common/script/ops/buy.js +++ b/common/script/ops/buy.js @@ -102,7 +102,7 @@ module.exports = function buy (user, req = {}, analytics) { } else { if (user.preferences.autoEquip) { user.items.gear.equipped[item.type] = item.key; - message = handleTwoHanded(user, item, null, req); + message = handleTwoHanded(user, item, undefined, req); } user.items.gear.owned[item.key] = true; diff --git a/common/script/ops/buyMysterySet.js b/common/script/ops/buyMysterySet.js index c43b925358..91c5b3f5d9 100644 --- a/common/script/ops/buyMysterySet.js +++ b/common/script/ops/buyMysterySet.js @@ -23,7 +23,7 @@ module.exports = function buyMysterySet (user, req = {}, analytics) { throw new NotFound(i18n.t('mysterySetNotFound', req.language)); } - if (window && window.confirm) { // TODO move to client + if (typeof window !== 'undefined' && window.confirm) { // TODO move to client if (!window.confirm(i18n.t('hourglassBuyEquipSetConfirm'))) return; } diff --git a/test/common/fns/handleTwoHanded.js b/test/common/fns/handleTwoHanded.js new file mode 100644 index 0000000000..8d191ff114 --- /dev/null +++ b/test/common/fns/handleTwoHanded.js @@ -0,0 +1,38 @@ +import handleTwoHanded from '../../../common/script/fns/handleTwoHanded'; +import content from '../../../common/script/content/index'; +import i18n from '../../../common/script/i18n'; +import { + generateUser, +} from '../../helpers/common.helper'; + +describe('shared.fns.handleTwoHanded', () => { + let user; + + beforeEach(() => { + user = generateUser(); + }); + + it('uses "messageTwoHandedUnequip" message if item is a shield and current weapon is two handed (and sets the user\'s weapon to the base one)', () => { + let item = content.gear.tree.shield.warrior['2']; + let currentWeapon = content.gear.tree.weapon.armoire.rancherLasso; + user.items.gear.equipped.weapon = 'weapon_armoire_rancherLasso'; + + let message = handleTwoHanded(user, item); + expect(message).to.equal(i18n.t('messageTwoHandedUnequip', { + twoHandedText: currentWeapon.text(), offHandedText: item.text(), + })); + expect(user.items.gear.equipped.weapon).to.equal('weapon_base_0'); + }); + + it('uses "messageTwoHandedEquip" message if item is two handed and currentShield exists but is not "shield_base_0" (and sets the user\'s shield to the base one)', () => { + let item = content.gear.tree.weapon.armoire.rancherLasso; + let currentShield = content.gear.tree.shield.armoire.gladiatorShield; + user.items.gear.equipped.shield = 'shield_armoire_gladiatorShield'; + + let message = handleTwoHanded(user, item); + expect(message).to.equal(i18n.t('messageTwoHandedEquip', { + twoHandedText: item.text(), offHandedText: currentShield.text(), + })); + expect(user.items.gear.equipped.shield).to.equal('shield_base_0'); + }); +}); diff --git a/test/common/fns/predictableRandom.js b/test/common/fns/predictableRandom.js new file mode 100644 index 0000000000..1cd47fc426 --- /dev/null +++ b/test/common/fns/predictableRandom.js @@ -0,0 +1,51 @@ +import predictableRandom from '../../../common/script/fns/predictableRandom'; +import { + generateUser, +} from '../../helpers/common.helper'; + +describe('shared.fns.predictableRandom', () => { + let user; + + beforeEach(() => { + user = generateUser(); + }); + + it('returns a number', () => { + expect(predictableRandom(user)).to.be.a('number'); + }); + + it('returns the same value when user.stats is the same and no seed is passed', () => { + user.stats.hp = 43; + user.stats.gp = 34; + + let val1 = predictableRandom(user); + let val2 = predictableRandom(user); + + expect(val2).to.equal(val1); + }); + + it('returns a different value when user.stats is not the same and no seed is passed', () => { + user.stats.hp = 43; + user.stats.gp = 34; + let val1 = predictableRandom(user); + + user.stats.gp = 35; + let val2 = predictableRandom(user); + + expect(val2).to.not.equal(val1); + }); + + it('returns the same value when the same seed is passed', () => { + let val1 = predictableRandom(user, 4452673762); + let val2 = predictableRandom(user, 4452673762); + + expect(val2).to.equal(val1); + }); + + it('returns a different value when a different seed is passed', () => { + let val1 = predictableRandom(user, 4452673761); + let val2 = predictableRandom(user, 4452673762); + + expect(val2).to.not.equal(val1); + }); +}); diff --git a/test/common/fns/randomVal.js b/test/common/fns/randomVal.js new file mode 100644 index 0000000000..b4b8e377d3 --- /dev/null +++ b/test/common/fns/randomVal.js @@ -0,0 +1,119 @@ +import randomVal from '../../../common/script/fns/randomVal'; +import { + generateUser, +} from '../../helpers/common.helper'; + +describe('shared.fns.randomVal', () => { + let user; + let obj = { + a: 1, + b: 2, + c: 3, + d: 4, + }; + + beforeEach(() => { + user = generateUser(); + }); + + describe('returns a random property value from an object', () => { + it('returns the same value when the seed is the same', () => { + let val1 = randomVal(user, obj, { + seed: 222, + }); + + let val2 = randomVal(user, obj, { + seed: 222, + }); + + expect(val2).to.equal(val1); + }); + + it('returns the same value when user.stats is the same', () => { + user.stats.gp = 34; + let val1 = randomVal(user, obj); + let val2 = randomVal(user, obj); + + expect(val2).to.equal(val1); + }); + + it('returns a different value when the seed is different', () => { + let val1 = randomVal(user, obj, { + seed: 222, + }); + + let val2 = randomVal(user, obj, { + seed: 333, + }); + + expect(val2).to.not.equal(val1); + }); + + it('returns a different value when user.stats is different', () => { + user.stats.gp = 34; + let val1 = randomVal(user, obj); + user.stats.gp = 343; + let val2 = randomVal(user, obj); + + expect(val2).to.not.equal(val1); + }); + }); + + describe('returns a random key from an object', () => { + it('returns the same key when the seed is the same', () => { + let key1 = randomVal(user, obj, { + key: true, + seed: 222, + }); + + let key2 = randomVal(user, obj, { + key: true, + seed: 222, + }); + + expect(key2).to.equal(key1); + }); + + it('returns the same key when user.stats is the same', () => { + user.stats.gp = 45; + let key1 = randomVal(user, obj, { + key: true, + }); + + let key2 = randomVal(user, obj, { + key: true, + }); + + expect(key2).to.equal(key1); + }); + + it('returns a different key when the seed is different', () => { + let key1 = randomVal(user, obj, { + key: true, + seed: 222, + }); + + let key2 = randomVal(user, obj, { + key: true, + seed: 333, + }); + + expect(key2).to.not.equal(key1); + }); + + it('returns a different key when user.stats is different', () => { + user.stats.gp = 45; + let key1 = randomVal(user, obj, { + key: true, + }); + + user.stats.gp = 43; + + let key2 = randomVal(user, obj, { + key: true, + }); + + expect(key2).to.not.equal(key1); + }); + }); +}); diff --git a/test/common/fns/ultimateGear.js b/test/common/fns/ultimateGear.js new file mode 100644 index 0000000000..8da991b565 --- /dev/null +++ b/test/common/fns/ultimateGear.js @@ -0,0 +1,33 @@ +import ultimateGear from '../../../common/script/fns/ultimateGear'; +import { + generateUser, +} from '../../helpers/common.helper'; + +describe('shared.fns.ultimateGear', () => { + let user; + + beforeEach(() => { + user = generateUser(); + }); + + it('sets armoirEnabled when partial achievement already achieved', () => { + let items = { + gear: { + owned: { + toObject: () => { + return { + armor_warrior_5: true, // eslint-disable-line camelcase + shield_warrior_5: true, // eslint-disable-line camelcase + head_warrior_5: true, // eslint-disable-line camelcase + weapon_warrior_6: true, // eslint-disable-line camelcase + }; + }, + }, + }, + }; + + user.items = items; + ultimateGear(user); + expect(user.flags.armoireEnabled).to.equal(true); + }); +}); diff --git a/test/common_old/user.fns.buy.test.js b/test/common/ops/buy.js similarity index 58% rename from test/common_old/user.fns.buy.test.js rename to test/common/ops/buy.js index 0cf39c1eb0..b218cfa941 100644 --- a/test/common_old/user.fns.buy.test.js +++ b/test/common/ops/buy.js @@ -1,14 +1,28 @@ /* eslint-disable camelcase */ import sinon from 'sinon'; // eslint-disable-line no-shadow +import { + generateUser, +} from '../../helpers/common.helper'; +import count from '../../../common/script/count'; +import buy from '../../../common/script/ops/buy'; +import predictableRandom from '../../../common/script/fns/predictableRandom'; +import randomVal from '../../../common/script/fns/randomVal'; +import content from '../../../common/script/content/index'; +import { + NotAuthorized, +} from '../../../common/script/libs/errors'; +import i18n from '../../../common/script/i18n'; -let shared = require('../../common/script/index.js'); - -describe('user.fns.buy', () => { +describe.only('shared.ops.buy', () => { let user; + let fns = { + predictableRandom, + randomVal, + }; beforeEach(() => { - user = { + user = generateUser({ items: { gear: { owned: { @@ -19,39 +33,34 @@ describe('user.fns.buy', () => { }, }, }, - preferences: {}, stats: { gp: 200 }, - achievements: { }, - flags: { }, - }; + }); - shared.wrap(user); - - sinon.stub(user.fns, 'randomVal'); - sinon.stub(user.fns, 'predictableRandom'); + sinon.stub(fns, 'randomVal'); + sinon.stub(fns, 'predictableRandom'); }); afterEach(() => { - user.fns.randomVal.restore(); - user.fns.predictableRandom.restore(); + fns.randomVal.restore(); + fns.predictableRandom.restore(); }); context('Potion', () => { it('recovers 15 hp', () => { user.stats.hp = 30; - user.ops.buy({params: {key: 'potion'}}); + buy(user, {params: {key: 'potion'}}); expect(user.stats.hp).to.eql(45); }); it('does not increase hp above 50', () => { user.stats.hp = 45; - user.ops.buy({params: {key: 'potion'}}); + buy(user, {params: {key: 'potion'}}); expect(user.stats.hp).to.eql(50); }); it('deducts 25 gp', () => { user.stats.hp = 45; - user.ops.buy({params: {key: 'potion'}}); + buy(user, {params: {key: 'potion'}}); expect(user.stats.gp).to.eql(175); }); @@ -59,7 +68,11 @@ describe('user.fns.buy', () => { it('does not purchase if not enough gp', () => { user.stats.hp = 45; user.stats.gp = 5; - user.ops.buy({params: {key: 'potion'}}); + try { + expect(buy(user, {params: {key: 'potion'}})).to.throw(NotAuthorized); + } catch (err) { + expect(err.message).to.equal(i18n.t('messageNotEnoughGold')); + } expect(user.stats.hp).to.eql(45); expect(user.stats.gp).to.eql(5); @@ -70,7 +83,7 @@ describe('user.fns.buy', () => { it('adds equipment to inventory', () => { user.stats.gp = 31; - user.ops.buy({params: {key: 'armor_warrior_1'}}); + buy(user, {params: {key: 'armor_warrior_1'}}); expect(user.items.gear.owned).to.eql({ weapon_warrior_0: true, armor_warrior_1: true }); }); @@ -78,7 +91,7 @@ describe('user.fns.buy', () => { it('deducts gold from user', () => { user.stats.gp = 31; - user.ops.buy({params: {key: 'armor_warrior_1'}}); + buy(user, {params: {key: 'armor_warrior_1'}}); expect(user.stats.gp).to.eql(1); }); @@ -87,7 +100,7 @@ describe('user.fns.buy', () => { user.stats.gp = 31; user.preferences.autoEquip = true; - user.ops.buy({params: {key: 'armor_warrior_1'}}); + buy(user, {params: {key: 'armor_warrior_1'}}); expect(user.items.gear.equipped).to.have.property('armor', 'armor_warrior_1'); }); @@ -96,34 +109,36 @@ describe('user.fns.buy', () => { user.stats.gp = 31; user.preferences.autoEquip = false; - user.ops.buy({params: {key: 'armor_warrior_1'}}); + buy(user, {params: {key: 'armor_warrior_1'}}); - expect(user.items.gear.equipped).to.not.have.property('armor'); + expect(user.items.gear.equipped.property).to.not.equal('armor_warrior_1'); }); - it('removes one-handed weapon and shield if auto-equip is on and a two-hander is bought', () => { + // TODO after user.ops.equip is done + xit('removes one-handed weapon and shield if auto-equip is on and a two-hander is bought', () => { user.stats.gp = 100; user.preferences.autoEquip = true; - user.ops.buy({params: {key: 'shield_warrior_1'}}); + buy(user, {params: {key: 'shield_warrior_1'}}); user.ops.equip({params: {key: 'shield_warrior_1'}}); - user.ops.buy({params: {key: 'weapon_warrior_1'}}); + buy(user, {params: {key: 'weapon_warrior_1'}}); user.ops.equip({params: {key: 'weapon_warrior_1'}}); - user.ops.buy({params: {key: 'weapon_wizard_1'}}); + buy(user, {params: {key: 'weapon_wizard_1'}}); expect(user.items.gear.equipped).to.have.property('shield', 'shield_base_0'); expect(user.items.gear.equipped).to.have.property('weapon', 'weapon_wizard_1'); }); - it('buys two-handed equipment but does not automatically remove sword or shield', () => { + // TODO after user.ops.equip is done + xit('buys two-handed equipment but does not automatically remove sword or shield', () => { user.stats.gp = 100; user.preferences.autoEquip = false; - user.ops.buy({params: {key: 'shield_warrior_1'}}); + buy(user, {params: {key: 'shield_warrior_1'}}); user.ops.equip({params: {key: 'shield_warrior_1'}}); - user.ops.buy({params: {key: 'weapon_warrior_1'}}); + buy(user, {params: {key: 'weapon_warrior_1'}}); user.ops.equip({params: {key: 'weapon_warrior_1'}}); - user.ops.buy({params: {key: 'weapon_wizard_1'}}); + buy(user, {params: {key: 'weapon_wizard_1'}}); expect(user.items.gear.equipped).to.have.property('shield', 'shield_warrior_1'); expect(user.items.gear.equipped).to.have.property('weapon', 'weapon_warrior_1'); @@ -132,22 +147,16 @@ describe('user.fns.buy', () => { it('does not buy equipment without enough Gold', () => { user.stats.gp = 20; - user.ops.buy({params: {key: 'armor_warrior_1'}}); + try { + expect(buy(user, {params: {key: 'armor_warrior_1'}})).to.throw(NotAuthorized); + } catch (err) { + expect(err.message).to.equal(i18n.t('messageNotEnoughGold')); + } expect(user.items.gear.owned).to.not.have.property('armor_warrior_1'); }); }); - context('Quests', () => { - it('buys a Quest scroll'); - - it('does not buy Quests without enough Gold'); - - it('does not buy nonexistent Quests'); - - it('does not buy Gem-premium Quests'); - }); - context('Enchanted Armoire', () => { let YIELD_EQUIPMENT = 0.5; let YIELD_FOOD = 0.7; @@ -155,8 +164,8 @@ describe('user.fns.buy', () => { let fullArmoire = {}; - _(shared.content.gearTypes).each((type) => { - _(shared.content.gear.tree[type].armoire).each((gearObject) => { + _(content.gearTypes).each((type) => { + _(content.gear.tree[type].armoire).each((gearObject) => { let armoireKey = gearObject.key; fullArmoire[armoireKey] = true; @@ -171,38 +180,40 @@ describe('user.fns.buy', () => { }); context('failure conditions', () => { - it('does not open if user does not have enough gold', (done) => { - user.fns.predictableRandom.returns(YIELD_EQUIPMENT); + it('does not open if user does not have enough gold', () => { + fns.predictableRandom.returns(YIELD_EQUIPMENT); user.stats.gp = 50; - user.ops.buy({params: {key: 'armoire'}}, (response) => { - expect(response.message).to.eql('Not Enough Gold'); + try { + expect(buy(user, {params: {key: 'armoire'}})).to.throw(NotAuthorized); + } catch (err) { + expect(err.message).to.equal(i18n.t('messageNotEnoughGold')); expect(user.items.gear.owned).to.eql({weapon_warrior_0: true}); expect(user.items.food).to.be.empty; expect(user.stats.exp).to.eql(0); - done(); - }); + } }); - it('does not open without Ultimate Gear achievement', (done) => { - user.fns.predictableRandom.returns(YIELD_EQUIPMENT); + it('does not open without Ultimate Gear achievement', () => { + fns.predictableRandom.returns(YIELD_EQUIPMENT); user.achievements.ultimateGearSets = {healer: false, wizard: false, rogue: false, warrior: false}; - user.ops.buy({params: {key: 'armoire'}}, (response) => { - expect(response.message).to.eql('You can\'t buy this item'); + try { + expect(buy(user, {params: {key: 'armoire'}})).to.throw(NotAuthorized); + } catch (err) { + expect(err.message).to.equal(i18n.t('cannoyBuyItem')); expect(user.items.gear.owned).to.eql({weapon_warrior_0: true}); expect(user.items.food).to.be.empty; expect(user.stats.exp).to.eql(0); - done(); - }); + } }); }); context('non-gear awards', () => { it('gives Experience', () => { - user.fns.predictableRandom.returns(YIELD_EXP); + fns.predictableRandom.returns(YIELD_EXP); - user.ops.buy({params: {key: 'armoire'}}); + buy(user, {params: {key: 'armoire'}}); expect(user.items.gear.owned).to.eql({weapon_warrior_0: true}); expect(user.items.food).to.be.empty; @@ -211,12 +222,12 @@ describe('user.fns.buy', () => { }); it('gives food', () => { - let honey = shared.content.food.Honey; + let honey = content.food.Honey; - user.fns.randomVal.returns(honey); - user.fns.predictableRandom.returns(YIELD_FOOD); + fns.randomVal.returns(honey); + fns.predictableRandom.returns(YIELD_FOOD); - user.ops.buy({params: {key: 'armoire'}}); + buy(user, {params: {key: 'armoire'}}); expect(user.items.gear.owned).to.eql({weapon_warrior_0: true}); expect(user.items.food).to.eql({Honey: 1}); @@ -225,14 +236,14 @@ describe('user.fns.buy', () => { }); it('does not give equipment if all equipment has been found', () => { - user.fns.predictableRandom.returns(YIELD_EQUIPMENT); + fns.predictableRandom.returns(YIELD_EQUIPMENT); user.items.gear.owned = fullArmoire; user.stats.gp = 150; - user.ops.buy({params: {key: 'armoire'}}); + buy(user, {params: {key: 'armoire'}}); expect(user.items.gear.owned).to.eql(fullArmoire); - let armoireCount = shared.count.remainingGearInSet(user.items.gear.owned, 'armoire'); + let armoireCount = count.remainingGearInSet(user.items.gear.owned, 'armoire'); expect(armoireCount).to.eql(0); @@ -243,23 +254,23 @@ describe('user.fns.buy', () => { context('gear awards', () => { beforeEach(() => { - let shield = shared.content.gear.tree.shield.armoire.gladiatorShield; + let shield = content.gear.tree.shield.armoire.gladiatorShield; - user.fns.randomVal.returns(shield); + fns.randomVal.returns(shield); }); it('always drops equipment the first time', () => { delete user.flags.armoireOpened; - user.fns.predictableRandom.returns(YIELD_EXP); + fns.predictableRandom.returns(YIELD_EXP); - user.ops.buy({params: {key: 'armoire'}}); + buy(user, {params: {key: 'armoire'}}); expect(user.items.gear.owned).to.eql({ weapon_warrior_0: true, shield_armoire_gladiatorShield: true, }); - let armoireCount = shared.count.remainingGearInSet(user.items.gear.owned, 'armoire'); + let armoireCount = count.remainingGearInSet(user.items.gear.owned, 'armoire'); expect(armoireCount).to.eql(_.size(fullArmoire) - 1); expect(user.items.food).to.be.empty; @@ -268,17 +279,17 @@ describe('user.fns.buy', () => { }); it('gives more equipment', () => { - user.fns.predictableRandom.returns(YIELD_EQUIPMENT); + fns.predictableRandom.returns(YIELD_EQUIPMENT); user.items.gear.owned = { weapon_warrior_0: true, head_armoire_hornedIronHelm: true, }; user.stats.gp = 200; - user.ops.buy({params: {key: 'armoire'}}); + buy(user, {params: {key: 'armoire'}}); expect(user.items.gear.owned).to.eql({weapon_warrior_0: true, shield_armoire_gladiatorShield: true, head_armoire_hornedIronHelm: true}); - let armoireCount = shared.count.remainingGearInSet(user.items.gear.owned, 'armoire'); + let armoireCount = count.remainingGearInSet(user.items.gear.owned, 'armoire'); expect(armoireCount).to.eql(_.size(fullArmoire) - 2); expect(user.stats.gp).to.eql(100); diff --git a/test/common_old/user.fns.ultimateGear.test.js b/test/common_old/user.fns.ultimateGear.test.js deleted file mode 100644 index d1fba030bc..0000000000 --- a/test/common_old/user.fns.ultimateGear.test.js +++ /dev/null @@ -1,37 +0,0 @@ -/* eslint-disable camelcase */ - -let shared = require('../../common/script/index.js'); - -shared.i18n.translations = require('../../website/src/libs/api-v2/i18n.js').translations; - -require('./test_helper'); - -describe('User.fns.ultimateGear', () => { - it('sets armoirEnabled when partial achievement already achieved', () => { - let items = { - gear: { - owned: { - toObject: () => { - return { - armor_warrior_5: true, - shield_warrior_5: true, - head_warrior_5: true, - weapon_warrior_6: true, - }; - }, - }, - }, - }; - - let user = shared.wrap({ - items, - achievements: { - ultimateGearSets: {}, - }, - flags: {}, - }); - - user.fns.ultimateGear(); - expect(user.flags.armoireEnabled).to.equal(true); - }); -}); diff --git a/website/src/models/user.js b/website/src/models/user.js index 12398fa261..2aa9e568eb 100644 --- a/website/src/models/user.js +++ b/website/src/models/user.js @@ -51,9 +51,12 @@ export let schema = new Schema({ achievements: { originalUser: Boolean, habitSurveys: Number, - ultimateGearSets: {type: Schema.Types.Mixed, default: () => { - return {}; - }}, + ultimateGearSets: { + healer: {type: Boolean, default: false}, + wizard: {type: Boolean, default: false}, + rogue: {type: Boolean, default: false}, + warrior: {type: Boolean, default: false}, + }, beastMaster: Boolean, beastMasterCount: Number, mountMaster: Boolean,