From ebdac0b3882a6992705f1c187356ed53132ad77e Mon Sep 17 00:00:00 2001 From: Phillip Thelen Date: Mon, 10 Jun 2024 14:24:59 +0200 Subject: [PATCH] allow hatching potions to have a release date --- test/content/hatching-potions.test.js | 56 +++++++++++++------ test/content/schedule.test.js | 8 +-- test/content/stable.test.js | 2 +- .../script/content/constants/release_dates.js | 4 ++ website/common/script/content/eggs.js | 4 ++ .../common/script/content/hatching-potions.js | 26 +++++++-- website/common/script/content/index.js | 5 +- website/common/script/content/stable.js | 18 ++---- website/common/script/fns/firstDrops.js | 4 +- 9 files changed, 83 insertions(+), 44 deletions(-) diff --git a/test/content/hatching-potions.test.js b/test/content/hatching-potions.test.js index a4e31d7b91..5d1d37bf65 100644 --- a/test/content/hatching-potions.test.js +++ b/test/content/hatching-potions.test.js @@ -5,28 +5,50 @@ import { expectValidTranslationString, } from '../helpers/content.helper'; -import * as hatchingPotions from '../../website/common/script/content/hatching-potions'; +import hatchingPotions from '../../website/common/script/content/hatching-potions'; describe('hatchingPotions', () => { - describe('all', () => { - it('is a combination of drop, premium, and wacky potions', () => { - const dropNumber = Object.keys(hatchingPotions.drops).length; - const premiumNumber = Object.keys(hatchingPotions.premium).length; - const wackyNumber = Object.keys(hatchingPotions.wacky).length; - const allNumber = Object.keys(hatchingPotions.all).length; + let clock; - expect(allNumber).to.be.greaterThan(0); - expect(allNumber).to.equal(dropNumber + premiumNumber + wackyNumber); - }); + afterEach(() => { + if (clock) { + clock.restore(); + } + }); - it('contains basic information about each potion', () => { - each(hatchingPotions.all, (potion, key) => { - expectValidTranslationString(potion.text); - expectValidTranslationString(potion.notes); - expect(potion.canBuy).to.be.a('function'); - expect(potion.value).to.be.a('number'); - expect(potion.key).to.equal(key); + const potionTypes = [ + 'drops', + 'quests', + 'premium', + 'wacky', + ]; + potionTypes.forEach(potionType => { + describe(potionType, () => { + it('contains basic information about each potion', () => { + each(hatchingPotions.all, (potion, key) => { + expectValidTranslationString(potion.text); + expectValidTranslationString(potion.notes); + expect(potion.canBuy).to.be.a('function'); + expect(potion.value).to.be.a('number'); + expect(potion.key).to.equal(key); + }); }); }); }); + + it('does not contain unreleased potions', () => { + clock = sinon.useFakeTimers(new Date('2024-05-20')); + const premiumPotions = hatchingPotions.premium; + expect(premiumPotions.Koi).to.not.exist; + }); + + it('Releases potions when appropriate without needing restarting', () => { + clock = sinon.useFakeTimers(new Date('2024-05-20')); + const mayPotions = hatchingPotions.premium; + clock.restore(); + clock = sinon.useFakeTimers(new Date('2024-06-20')); + const junePotions = hatchingPotions.premium; + expect(junePotions.Koi).to.exist; + expect(Object.keys(mayPotions).length).to.equal(Object.keys(junePotions).length - 1); + }); }); diff --git a/test/content/schedule.test.js b/test/content/schedule.test.js index 270fc7d582..139fbe8bf2 100644 --- a/test/content/schedule.test.js +++ b/test/content/schedule.test.js @@ -7,7 +7,7 @@ import { import QUEST_PETS from '../../website/common/script/content/quests/pets'; import QUEST_HATCHINGPOTIONS from '../../website/common/script/content/quests/potions'; import QUEST_BUNDLES from '../../website/common/script/content/bundles'; -import { premium } from '../../website/common/script/content/hatching-potions'; +import potions from '../../website/common/script/content/hatching-potions'; import SPELLS from '../../website/common/script/content/spells'; import QUEST_SEASONAL from '../../website/common/script/content/quests/seasonal'; @@ -167,10 +167,10 @@ describe('Content Schedule', () => { }); it('premium hatching potions', () => { - const potionKeys = Object.keys(premium); + const potionKeys = Object.keys(potions.premium); Object.keys(MONTHLY_SCHEDULE).forEach(key => { - const potions = MONTHLY_SCHEDULE[key][21].find(item => item.type === 'premiumHatchingPotions'); - for (const potion of potions.items) { + const monthlyPotions = MONTHLY_SCHEDULE[key][21].find(item => item.type === 'premiumHatchingPotions'); + for (const potion of monthlyPotions.items) { expect(potion).to.be.a('string'); expect(potionKeys).to.include(potion); } diff --git a/test/content/stable.test.js b/test/content/stable.test.js index ca1475d631..218e340e78 100644 --- a/test/content/stable.test.js +++ b/test/content/stable.test.js @@ -8,7 +8,7 @@ import t from '../../website/common/script/content/translation'; import * as stable from '../../website/common/script/content/stable'; import eggs from '../../website/common/script/content/eggs'; -import * as potions from '../../website/common/script/content/hatching-potions'; +import potions from '../../website/common/script/content/hatching-potions'; describe('stable', () => { describe('dropPets', () => { diff --git a/website/common/script/content/constants/release_dates.js b/website/common/script/content/constants/release_dates.js index e7edd2b9c8..46fd821d55 100644 --- a/website/common/script/content/constants/release_dates.js +++ b/website/common/script/content/constants/release_dates.js @@ -13,3 +13,7 @@ export const ARMOIRE_RELEASE_DATES = { export const EGGS_RELEASE_DATES = { Giraffe: { year: 2024, month: 6, day: 1 }, }; + +export const HATCHING_POTIONS_RELEASE_DATES = { + Koi: { year: 2024, month: 6, day: 1 }, +}; diff --git a/website/common/script/content/eggs.js b/website/common/script/content/eggs.js index 65e346dd85..7952530017 100644 --- a/website/common/script/content/eggs.js +++ b/website/common/script/content/eggs.js @@ -1,5 +1,6 @@ import defaults from 'lodash/defaults'; import each from 'lodash/each'; +import assign from 'lodash/assign'; import t from './translation'; import { filterReleased } from './is_released'; import { EGGS_RELEASE_DATES } from './constants/release_dates'; @@ -425,4 +426,7 @@ export default { get quests () { return memoizedFilter({ memoizeConfig: true, identifier: 'quests' }, quests); }, + get all () { + return assign({}, this.drops, this.quests); + }, }; diff --git a/website/common/script/content/hatching-potions.js b/website/common/script/content/hatching-potions.js index 0dcfe0c83e..ed7498c007 100644 --- a/website/common/script/content/hatching-potions.js +++ b/website/common/script/content/hatching-potions.js @@ -1,7 +1,10 @@ -import assign from 'lodash/assign'; import defaults from 'lodash/defaults'; import each from 'lodash/each'; +import { assign } from 'lodash'; import t from './translation'; +import datedMemoize from '../fns/datedMemoize'; +import { filterReleased } from './is_released'; +import { HATCHING_POTIONS_RELEASE_DATES } from './constants/release_dates'; function hasQuestAchievementFunction (key) { return user => user.achievements.quests && user.achievements.quests[key] > 0; @@ -193,8 +196,23 @@ each(wacky, (pot, key) => { }); }); -const all = assign({}, drops, premium, wacky); +function filterEggs (eggs) { + return filterReleased(eggs, 'key', HATCHING_POTIONS_RELEASE_DATES); +} -export { - drops, premium, wacky, all, +const memoizedFilter = datedMemoize(filterEggs); + +export default { + get drops () { + return memoizedFilter({ memoizeConfig: true, identifier: 'drops' }, drops); + }, + get premium () { + return memoizedFilter({ memoizeConfig: true, identifier: 'premium' }, premium); + }, + get wacky () { + return memoizedFilter({ memoizeConfig: true, identifier: 'wacky' }, wacky); + }, + get all () { + return assign({}, this.drops, this.premium, this.wacky); + }, }; diff --git a/website/common/script/content/index.js b/website/common/script/content/index.js index f6ba549919..af344f4264 100644 --- a/website/common/script/content/index.js +++ b/website/common/script/content/index.js @@ -1,6 +1,5 @@ import defaults from 'lodash/defaults'; import each from 'lodash/each'; -import assign from 'lodash/assign'; import moment from 'moment'; import t from './translation'; import { tasksByCategory } from './tasks'; @@ -20,7 +19,7 @@ import { import achievements from './achievements'; import eggs from './eggs'; -import * as hatchingPotions from './hatching-potions'; +import hatchingPotions from './hatching-potions'; import * as stable from './stable'; import gear from './gear'; import { quests, questsByLevel, userCanOwnQuestCategories } from './quests'; @@ -168,7 +167,7 @@ api.special = api.spells.special; api.dropEggs = eggs.drops; api.questEggs = eggs.quests; -api.eggs = assign({}, eggs.drops, eggs.quests); +api.eggs = eggs.all; api.timeTravelStable = { pets: { diff --git a/website/common/script/content/stable.js b/website/common/script/content/stable.js index 93d72d482f..1f08886df3 100644 --- a/website/common/script/content/stable.js +++ b/website/common/script/content/stable.js @@ -2,17 +2,9 @@ import each from 'lodash/each'; import moment from 'moment'; import { EVENTS } from './constants/events'; import allEggs from './eggs'; -import { - drops as dropPotions, - premium as premiumPotions, - wacky as wackyPotions, -} from './hatching-potions'; +import allPotions from './hatching-potions'; import t from './translation'; -const STABLE_RELEASE_DATES = { - -}; - const petInfo = {}; const mountInfo = {}; @@ -131,10 +123,10 @@ const canFindSpecial = { }, }; -const [dropPets, dropMounts] = constructSet('drop', allEggs.drops, dropPotions); -const [premiumPets, premiumMounts] = constructSet('premium', allEggs.drops, premiumPotions); -const [questPets, questMounts] = constructSet('quest', allEggs.quests, dropPotions); -const wackyPets = constructSet('wacky', allEggs.drops, wackyPotions, false); +const [dropPets, dropMounts] = constructSet('drop', allEggs.drops, allPotions.drops); +const [premiumPets, premiumMounts] = constructSet('premium', allEggs.drops, allPotions.premium); +const [questPets, questMounts] = constructSet('quest', allEggs.quests, allPotions.drops); +const wackyPets = constructSet('wacky', allEggs.drops, allPotions.wacky, false); const specialPets = { 'Wolf-Veteran': 'veteranWolf', diff --git a/website/common/script/fns/firstDrops.js b/website/common/script/fns/firstDrops.js index 7a2413cb97..5272dcc72e 100644 --- a/website/common/script/fns/firstDrops.js +++ b/website/common/script/fns/firstDrops.js @@ -1,10 +1,10 @@ import allEggs from '../content/eggs'; -import { drops as hatchingPotions } from '../content/hatching-potions'; +import allPotions from '../content/hatching-potions'; import randomVal from '../libs/randomVal'; export default function firstDrops (user) { const eggDrop = randomVal(allEggs.drops); - const potionDrop = randomVal(hatchingPotions); + const potionDrop = randomVal(allPotions.drops); user.items.eggs = { ...user.items.eggs,