diff --git a/package.json b/package.json index 3b09aa70af..fc02c18271 100644 --- a/package.json +++ b/package.json @@ -97,7 +97,7 @@ "test:common": "nyc --silent --no-clean mocha test/common --recursive", "test:content": "nyc --silent --no-clean mocha test/content --recursive", "test:nodemon": "gulp test:nodemon", - "coverage": "nyc report --reporter=html --report-dir coverage/results; open coverage.html", + "coverage": "nyc report --reporter=html --report-dir coverage/results; open coverage/results/index.html", "sprites": "gulp sprites:compile", "client:dev": "cd website/client && npm run serve", "client:build": "cd website/client && npm run build", diff --git a/test/common/ops/buy/buy.js b/test/common/ops/buy/buy.test.js similarity index 99% rename from test/common/ops/buy/buy.js rename to test/common/ops/buy/buy.test.js index 2ac5fc6407..ff553f1aac 100644 --- a/test/common/ops/buy/buy.js +++ b/test/common/ops/buy/buy.test.js @@ -49,7 +49,7 @@ describe('shared.ops.buy', () => { } }); - it('recovers 15 hp', async () => { + it('buys health potion', async () => { user.stats.hp = 30; await buy(user, { params: { key: 'potion' } }, analytics); expect(user.stats.hp).to.eql(45); diff --git a/test/common/ops/buy/buyArmoire.js b/test/common/ops/buy/buyArmoire.test.js similarity index 100% rename from test/common/ops/buy/buyArmoire.js rename to test/common/ops/buy/buyArmoire.test.js diff --git a/test/common/ops/buy/buyGem.js b/test/common/ops/buy/buyGem.test.js similarity index 100% rename from test/common/ops/buy/buyGem.js rename to test/common/ops/buy/buyGem.test.js diff --git a/test/common/ops/buy/buyHealthPotion.js b/test/common/ops/buy/buyHealthPotion.test.js similarity index 100% rename from test/common/ops/buy/buyHealthPotion.js rename to test/common/ops/buy/buyHealthPotion.test.js diff --git a/test/common/ops/buy/buyMarketGear.js b/test/common/ops/buy/buyMarketGear.test.js similarity index 81% rename from test/common/ops/buy/buyMarketGear.js rename to test/common/ops/buy/buyMarketGear.test.js index 37725ff1b1..82d9b9ef53 100644 --- a/test/common/ops/buy/buyMarketGear.js +++ b/test/common/ops/buy/buyMarketGear.test.js @@ -22,6 +22,7 @@ async function buyGear (user, req, analytics) { describe('shared.ops.buyMarketGear', () => { let user; const analytics = { track () {} }; + let clock; beforeEach(() => { user = generateUser({ @@ -54,6 +55,10 @@ describe('shared.ops.buyMarketGear', () => { shared.fns.predictableRandom.restore(); shared.onboarding.checkOnboardingStatus.restore(); analytics.track.restore(); + + if (clock) { + clock.restore(); + } }); context('Gear', () => { @@ -184,30 +189,28 @@ describe('shared.ops.buyMarketGear', () => { }); // 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', async () => { + it('removes one-handed weapon and shield if auto-equip is on and a two-hander is bought', async () => { user.stats.gp = 100; user.preferences.autoEquip = true; - await buyGear(user, { params: { key: 'shield_warrior_1' } }); - user.ops.equip({ params: { key: 'shield_warrior_1' } }); - await buyGear(user, { params: { key: 'weapon_warrior_1' } }); - user.ops.equip({ params: { key: 'weapon_warrior_1' } }); + user.items.gear.equipped.weapon = 'weapon_warrior_1'; + user.items.gear.equipped.shield = 'shield_warrior_1'; + user.stats.class = 'wizard'; - await buyGear(user, { params: { key: 'weapon_wizard_1' } }); + await buyGear(user, { params: { key: 'weapon_wizard_0' } }); expect(user.items.gear.equipped).to.have.property('shield', 'shield_base_0'); - expect(user.items.gear.equipped).to.have.property('weapon', 'weapon_wizard_1'); + expect(user.items.gear.equipped).to.have.property('weapon', 'weapon_wizard_0'); }); // TODO after user.ops.equip is done - xit('buyGears two-handed equipment but does not automatically remove sword or shield', async () => { + it('buyGears two-handed equipment but does not automatically remove sword or shield', async () => { user.stats.gp = 100; user.preferences.autoEquip = false; - await buyGear(user, { params: { key: 'shield_warrior_1' } }); - user.ops.equip({ params: { key: 'shield_warrior_1' } }); - await buyGear(user, { params: { key: 'weapon_warrior_1' } }); - user.ops.equip({ params: { key: 'weapon_warrior_1' } }); + user.items.gear.equipped.weapon = 'weapon_warrior_1'; + user.items.gear.equipped.shield = 'shield_warrior_1'; + user.stats.class = 'wizard'; - await buyGear(user, { params: { key: 'weapon_wizard_1' } }); + await buyGear(user, { params: { key: 'weapon_wizard_0' } }); expect(user.items.gear.equipped).to.have.property('shield', 'shield_warrior_1'); expect(user.items.gear.equipped).to.have.property('weapon', 'weapon_warrior_1'); @@ -283,5 +286,40 @@ describe('shared.ops.buyMarketGear', () => { expect(user.items.gear.owned).to.have.property('shield_armoire_ramHornShield', true); }); + + it('buys current seasonal gear', async () => { + user.stats.gp = 200; + clock = sinon.useFakeTimers(new Date('2024-01-01')); + + await buyGear(user, { params: { key: 'armor_special_winter2024Warrior' } }); + + expect(user.items.gear.owned).to.have.property('armor_special_winter2024Warrior', true); + }); + + it('errors when buying past seasonal gear', async () => { + clock = sinon.useFakeTimers(new Date('2024-01-01')); + user.stats.gp = 200; + + try { + await buyGear(user, { params: { key: 'armor_special_winter2023Warrior' } }); + } catch (err) { + expect(err).to.be.an.instanceof(NotAuthorized); + expect(err.message).to.equal(i18n.t('notAvailable')); + expect(user.items.gear.owned).to.not.have.property('armor_special_winter2023Warrior'); + } + }); + + it('errors when buying gear from wrong season', async () => { + clock = sinon.useFakeTimers(new Date('2024-01-01')); + user.stats.gp = 200; + + try { + await buyGear(user, { params: { key: 'weapon_special_spring2024Warrior' } }); + } catch (err) { + expect(err).to.be.an.instanceof(NotAuthorized); + expect(err.message).to.equal(i18n.t('notAvailable')); + expect(user.items.gear.owned).to.not.have.property('weapon_special_spring2024Warrior'); + } + }); }); }); diff --git a/test/common/ops/buy/buyMysterySet.js b/test/common/ops/buy/buyMysterySet.test.js similarity index 71% rename from test/common/ops/buy/buyMysterySet.js rename to test/common/ops/buy/buyMysterySet.test.js index 1a75de3451..f2d74046ba 100644 --- a/test/common/ops/buy/buyMysterySet.js +++ b/test/common/ops/buy/buyMysterySet.test.js @@ -15,6 +15,7 @@ import { errorMessage } from '../../../../website/common/script/libs/errorMessag describe('shared.ops.buyMysterySet', () => { let user; const analytics = { track () {} }; + let clock; beforeEach(() => { user = generateUser({ @@ -31,6 +32,9 @@ describe('shared.ops.buyMysterySet', () => { afterEach(() => { analytics.track.restore(); + if (clock) { + clock.restore(); + } }); context('Mystery Sets', () => { @@ -41,7 +45,7 @@ describe('shared.ops.buyMysterySet', () => { } catch (err) { expect(err).to.be.an.instanceof(NotAuthorized); expect(err.message).to.eql(i18n.t('notEnoughHourglasses')); - expect(user.items.gear.owned).to.have.property('weapon_warrior_0', true); + expect(user.items.gear.owned).to.not.have.property('armor_mystery_201501'); } }); @@ -72,6 +76,18 @@ describe('shared.ops.buyMysterySet', () => { expect(err.message).to.equal(errorMessage('missingKeyParam')); } }); + + it('returns error if the set is not available', async () => { + user.purchased.plan.consecutive.trinkets = 1; + clock = sinon.useFakeTimers(new Date('2024-01-16')); + try { + await buyMysterySet(user, { params: { key: '201501' } }); + } catch (err) { + expect(err).to.be.an.instanceof(NotAuthorized); + expect(err.message).to.eql(i18n.t('notAvailable')); + expect(user.items.gear.owned).to.not.have.property('armor_mystery_201501'); + } + }); }); context('successful purchases', () => { @@ -86,6 +102,16 @@ describe('shared.ops.buyMysterySet', () => { expect(user.items.gear.owned).to.have.property('head_mystery_301404', true); expect(user.items.gear.owned).to.have.property('eyewear_mystery_301404', true); }); + + it('buys mystery set if it is available', async () => { + clock = sinon.useFakeTimers(new Date('2024-01-16')); + user.purchased.plan.consecutive.trinkets = 1; + await buyMysterySet(user, { params: { key: '201601' } }, analytics); + + expect(user.purchased.plan.consecutive.trinkets).to.eql(0); + expect(user.items.gear.owned).to.have.property('shield_mystery_201601', true); + expect(user.items.gear.owned).to.have.property('head_mystery_201601', true); + }); }); }); }); diff --git a/test/common/ops/buy/buyQuestGold.js b/test/common/ops/buy/buyQuestGold.test.js similarity index 100% rename from test/common/ops/buy/buyQuestGold.js rename to test/common/ops/buy/buyQuestGold.test.js diff --git a/test/common/ops/buy/hourglassPurchase.js b/test/common/ops/buy/hourglassPurchase.test.js similarity index 100% rename from test/common/ops/buy/hourglassPurchase.js rename to test/common/ops/buy/hourglassPurchase.test.js diff --git a/test/common/ops/buy/purchase.js b/test/common/ops/buy/purchase.test.js similarity index 100% rename from test/common/ops/buy/purchase.js rename to test/common/ops/buy/purchase.test.js