diff --git a/test/api/v3/integration/user/POST-user_release_both.test.js b/test/api/v3/integration/user/POST-user_release_both.test.js index 8c47d95dfe..047ea5a2c9 100644 --- a/test/api/v3/integration/user/POST-user_release_both.test.js +++ b/test/api/v3/integration/user/POST-user_release_both.test.js @@ -2,17 +2,34 @@ import { generateUser, translate as t, } from '../../../../helpers/api-integration/v3'; +import content from '../../../../../website/common/script/content/index'; describe('POST /user/release-both', () => { let user; let animal = 'Wolf-Base'; + const loadPets = () => { + let pets = {}; + for (let p in content.pets) { + pets[p] = content.pets[p]; + pets[p] = 5; + } + return pets; + }; + const loadMounts = () => { + let mounts = {}; + for (let m in content.pets) { + mounts[m] = content.pets[m]; + mounts[m] = true; + } + return mounts; + }; beforeEach(async () => { user = await generateUser({ 'items.currentMount': animal, 'items.currentPet': animal, - 'items.pets': {animal: 5}, - 'items.mounts': {animal: true}, + 'items.pets': loadPets(), + 'items.mounts': loadMounts(), }); }); diff --git a/test/api/v3/integration/user/POST-user_release_mounts.test.js b/test/api/v3/integration/user/POST-user_release_mounts.test.js index 86391599f0..728aa99c8c 100644 --- a/test/api/v3/integration/user/POST-user_release_mounts.test.js +++ b/test/api/v3/integration/user/POST-user_release_mounts.test.js @@ -2,15 +2,25 @@ import { generateUser, translate as t, } from '../../../../helpers/api-integration/v3'; +import content from '../../../../../website/common/script/content/index'; describe('POST /user/release-mounts', () => { let user; let animal = 'Wolf-Base'; + const loadMounts = () => { + let mounts = {}; + for (let m in content.pets) { + mounts[m] = content.pets[m]; + mounts[m] = true; + } + return mounts; + }; + beforeEach(async () => { user = await generateUser({ 'items.currentMount': animal, - 'items.mounts': {animal: true}, + 'items.mounts': loadMounts(), }); }); diff --git a/test/api/v3/integration/user/POST-user_release_pets.test.js b/test/api/v3/integration/user/POST-user_release_pets.test.js index a7f7b9b66f..35b8126a82 100644 --- a/test/api/v3/integration/user/POST-user_release_pets.test.js +++ b/test/api/v3/integration/user/POST-user_release_pets.test.js @@ -2,15 +2,25 @@ import { generateUser, translate as t, } from '../../../../helpers/api-integration/v3'; +import content from '../../../../../website/common/script/content/index'; describe('POST /user/release-pets', () => { let user; let animal = 'Wolf-Base'; + const loadPets = () => { + let pets = {}; + for (let p in content.pets) { + pets[p] = content.pets[p]; + pets[p] = 5; + } + return pets; + }; + beforeEach(async () => { user = await generateUser({ 'items.currentPet': animal, - 'items.pets': {animal: 5}, + 'items.pets': loadPets(), }); }); diff --git a/test/common/ops/releaseBoth.js b/test/common/ops/releaseBoth.js index dab22cae60..880f62a316 100644 --- a/test/common/ops/releaseBoth.js +++ b/test/common/ops/releaseBoth.js @@ -14,10 +14,18 @@ describe('shared.ops.releaseBoth', () => { beforeEach(() => { user = generateUser(); + for (let p in content.pets) { + user.items.pets[p] = content.pets[p]; + user.items.pets[p] = 5; + } + + for (let m in content.pets) { + user.items.mounts[m] = content.pets[m]; + user.items.mounts[m] = true; + } + user.items.currentMount = animal; user.items.currentPet = animal; - user.items.pets[animal] = 5; - user.items.mounts[animal] = true; user.balance = 1.5; }); @@ -34,7 +42,7 @@ describe('shared.ops.releaseBoth', () => { }); it('grants triad bingo with gems', () => { - let [, message] = releaseBoth(user); + let message = releaseBoth(user)[1]; expect(message).to.equal(i18n.t('mountsAndPetsReleased')); expect(user.achievements.triadBingoCount).to.equal(1); @@ -45,27 +53,79 @@ describe('shared.ops.releaseBoth', () => { user.achievements.triadBingo = 1; user.achievements.triadBingoCount = 1; - let [, message] = releaseBoth(user); + let message = releaseBoth(user)[1]; expect(message).to.equal(i18n.t('mountsAndPetsReleased')); expect(user.achievements.triadBingoCount).to.equal(2); }); + it('does not grant triad bingo if any pet has not been previously found', () => { + let triadBingoCountBeforeRelease = user.achievements.triadBingoCount; + user.items.pets[animal] = -1; + let message = releaseBoth(user)[1]; + + expect(message).to.equal(i18n.t('mountsAndPetsReleased')); + expect(user.achievements.triadBingoCount).to.equal(triadBingoCountBeforeRelease); + }); + it('releases pets', () => { - let [, message] = releaseBoth(user); + let message = releaseBoth(user)[1]; expect(message).to.equal(i18n.t('mountsAndPetsReleased')); expect(user.items.pets[animal]).to.be.empty; expect(user.items.mounts[animal]).to.equal(null); }); + it('does not increment beastMasterCount if any pet is level 0 (released)', () => { + let beastMasterCountBeforeRelease = user.achievements.beastMasterCount; + user.items.pets[animal] = 0; + + releaseBoth(user); + + expect(user.achievements.beastMasterCount).to.equal(beastMasterCountBeforeRelease); + }); + + it('does not increment beastMasterCount if any pet is missing (null)', () => { + let beastMasterCountBeforeRelease = user.achievements.beastMasterCount; + user.items.pets[animal] = null; + releaseBoth(user); + + expect(user.achievements.beastMasterCount).to.equal(beastMasterCountBeforeRelease); + }); + + it('does not increment beastMasterCount if any pet is missing (undefined)', () => { + let beastMasterCountBeforeRelease = user.achievements.beastMasterCount; + delete user.items.pets[animal]; + releaseBoth(user); + + expect(user.achievements.beastMasterCount).to.equal(beastMasterCountBeforeRelease); + }); + it('releases mounts', () => { - let [, message] = releaseBoth(user); + let message = releaseBoth(user)[1]; expect(message).to.equal(i18n.t('mountsAndPetsReleased')); expect(user.items.mounts[animal]).to.equal(null); }); + it('does not increase mountMasterCount achievement if mount is missing (null)', () => { + let mountMasterCountBeforeRelease = user.achievements.mountMasterCount; + user.items.mounts[animal] = null; + + releaseBoth(user); + + expect(user.achievements.mountMasterCount).to.equal(mountMasterCountBeforeRelease); + }); + + it('does not increase mountMasterCount achievement if mount is missing (undefined)', () => { + let mountMasterCountBeforeRelease = user.achievements.mountMasterCount; + delete user.items.mounts[animal]; + + releaseBoth(user); + + expect(user.achievements.mountMasterCount).to.equal(mountMasterCountBeforeRelease); + }); + it('removes drop currentPet', () => { let petInfo = content.petInfo[user.items.currentPet]; expect(petInfo.type).to.equal('drop'); diff --git a/test/common/ops/releaseMounts.js b/test/common/ops/releaseMounts.js index fd67eeff68..dc8fbae7b4 100644 --- a/test/common/ops/releaseMounts.js +++ b/test/common/ops/releaseMounts.js @@ -14,8 +14,12 @@ describe('shared.ops.releaseMounts', () => { beforeEach(() => { user = generateUser(); + for (let k in content.pets) { + user.items.mounts[k] = content.pets[k]; + user.items.mounts[k] = true; + } + user.items.currentMount = animal; - user.items.mounts[animal] = true; user.balance = 1; }); @@ -32,7 +36,7 @@ describe('shared.ops.releaseMounts', () => { }); it('releases mounts', () => { - let [, message] = releaseMounts(user); + let message = releaseMounts(user)[1]; expect(message).to.equal(i18n.t('mountsReleased')); expect(user.items.mounts[animal]).to.equal(null); @@ -60,10 +64,27 @@ describe('shared.ops.releaseMounts', () => { it('increases mountMasterCount achievement', () => { releaseMounts(user); - expect(user.achievements.mountMasterCount).to.equal(1); }); + it('does not increase mountMasterCount achievement if mount is missing (null)', () => { + let mountMasterCountBeforeRelease = user.achievements.mountMasterCount; + user.items.mounts[animal] = null; + + releaseMounts(user); + + expect(user.achievements.mountMasterCount).to.equal(mountMasterCountBeforeRelease); + }); + + it('does not increase mountMasterCount achievement if mount is missing (undefined)', () => { + let mountMasterCountBeforeRelease = user.achievements.mountMasterCount; + delete user.items.mounts[animal]; + + releaseMounts(user); + + expect(user.achievements.mountMasterCount).to.equal(mountMasterCountBeforeRelease); + }); + it('subtracts gems from balance', () => { releaseMounts(user); diff --git a/test/common/ops/releasePets.js b/test/common/ops/releasePets.js index 549916b147..62ab66c540 100644 --- a/test/common/ops/releasePets.js +++ b/test/common/ops/releasePets.js @@ -14,8 +14,12 @@ describe('shared.ops.releasePets', () => { beforeEach(() => { user = generateUser(); + for (let k in content.pets) { + user.items.pets[k] = content.pets[k]; + user.items.pets[k] = 5; + } + user.items.currentPet = animal; - user.items.pets[animal] = 5; user.balance = 1; }); @@ -32,7 +36,7 @@ describe('shared.ops.releasePets', () => { }); it('releases pets', () => { - let [, message] = releasePets(user); + let message = releasePets(user)[1]; expect(message).to.equal(i18n.t('petsReleased')); expect(user.items.pets[animal]).to.equal(0); @@ -69,4 +73,29 @@ describe('shared.ops.releasePets', () => { expect(user.achievements.beastMasterCount).to.equal(1); }); + + it('does not increment beastMasterCount if any pet is level 0 (released)', () => { + let beastMasterCountBeforeRelease = user.achievements.beastMasterCount; + + user.items.pets[animal] = 0; + releasePets(user); + + expect(user.achievements.beastMasterCount).to.equal(beastMasterCountBeforeRelease); + }); + + it('does not increment beastMasterCount if any pet is missing (null)', () => { + let beastMasterCountBeforeRelease = user.achievements.beastMasterCount; + user.items.pets[animal] = null; + releasePets(user); + + expect(user.achievements.beastMasterCount).to.equal(beastMasterCountBeforeRelease); + }); + + it('does not increment beastMasterCount if any pet is missing (undefined)', () => { + let beastMasterCountBeforeRelease = user.achievements.beastMasterCount; + delete user.items.pets[animal]; + releasePets(user); + + expect(user.achievements.beastMasterCount).to.equal(beastMasterCountBeforeRelease); + }); }); diff --git a/website/common/script/ops/releaseBoth.js b/website/common/script/ops/releaseBoth.js index 541c6d2e24..39b27e8926 100644 --- a/website/common/script/ops/releaseBoth.js +++ b/website/common/script/ops/releaseBoth.js @@ -14,6 +14,8 @@ module.exports = function releaseBoth (user, req = {}, analytics) { } let giveTriadBingo = true; + let giveBeastMasterAchievement = true; + let giveMountMasterAchievement = true; if (!user.achievements.triadBingo) { if (analytics) { @@ -44,21 +46,30 @@ module.exports = function releaseBoth (user, req = {}, analytics) { for (animal in content.pets) { if (user.items.pets[animal] === -1) { giveTriadBingo = false; + } else if (!user.items.pets[animal]) { + giveBeastMasterAchievement = false; + } + if (user.items.mounts[animal] === null || user.items.mounts[animal] === undefined) { + giveMountMasterAchievement = false; } user.items.pets[animal] = 0; user.items.mounts[animal] = null; } - if (!user.achievements.beastMasterCount) { - user.achievements.beastMasterCount = 0; + if (giveBeastMasterAchievement) { + if (!user.achievements.beastMasterCount) { + user.achievements.beastMasterCount = 0; + } + user.achievements.beastMasterCount++; } - user.achievements.beastMasterCount++; - if (!user.achievements.mountMasterCount) { - user.achievements.mountMasterCount = 0; + if (giveMountMasterAchievement) { + if (!user.achievements.mountMasterCount) { + user.achievements.mountMasterCount = 0; + } + user.achievements.mountMasterCount++; } - user.achievements.mountMasterCount++; if (giveTriadBingo) { if (!user.achievements.triadBingoCount) { diff --git a/website/common/script/ops/releaseMounts.js b/website/common/script/ops/releaseMounts.js index a4b2e5dee1..0f7159502e 100644 --- a/website/common/script/ops/releaseMounts.js +++ b/website/common/script/ops/releaseMounts.js @@ -11,6 +11,8 @@ module.exports = function releaseMounts (user, req = {}, analytics) { user.balance -= 1; + let giveMountMasterAchievement = true; + let mountInfo = content.mountInfo[user.items.currentMount]; if (mountInfo && mountInfo.type === 'drop') { @@ -18,13 +20,18 @@ module.exports = function releaseMounts (user, req = {}, analytics) { } for (let mount in content.pets) { + if (user.items.mounts[mount] === null || user.items.mounts[mount] === undefined) { + giveMountMasterAchievement = false; + } user.items.mounts[mount] = null; } - if (!user.achievements.mountMasterCount) { - user.achievements.mountMasterCount = 0; + if (giveMountMasterAchievement) { + if (!user.achievements.mountMasterCount) { + user.achievements.mountMasterCount = 0; + } + user.achievements.mountMasterCount++; } - user.achievements.mountMasterCount++; if (analytics) { analytics.track('release mounts', { diff --git a/website/common/script/ops/releasePets.js b/website/common/script/ops/releasePets.js index c84e7c9959..6a356b8629 100644 --- a/website/common/script/ops/releasePets.js +++ b/website/common/script/ops/releasePets.js @@ -11,6 +11,8 @@ module.exports = function releasePets (user, req = {}, analytics) { user.balance -= 1; + let giveBeastMasterAchievement = true; + let petInfo = content.petInfo[user.items.currentPet]; if (petInfo && petInfo.type === 'drop') { @@ -18,13 +20,18 @@ module.exports = function releasePets (user, req = {}, analytics) { } for (let pet in content.pets) { + if (!user.items.pets[pet]) { + giveBeastMasterAchievement = false; + } user.items.pets[pet] = 0; } - if (!user.achievements.beastMasterCount) { - user.achievements.beastMasterCount = 0; + if (giveBeastMasterAchievement) { + if (!user.achievements.beastMasterCount) { + user.achievements.beastMasterCount = 0; + } + user.achievements.beastMasterCount++; } - user.achievements.beastMasterCount++; if (analytics) { analytics.track('release pets', {