fix: harden campaign resume UX and flow verification

This commit is contained in:
2026-07-21 09:59:48 +09:00
parent be5fe3e880
commit c810f95d00
11 changed files with 1815 additions and 125 deletions

View File

@@ -29,9 +29,11 @@ try {
acknowledgeCampaignVictoryReward,
campaignVictoryRewardPresentation,
campaignStorageKey,
dismissCampaignVictoryRewardNotice,
applyCampBondExp,
applyCampVisitReward,
getCampaignState,
getPendingCampaignVictoryRewardNoticeReport,
getPendingCampaignVictoryRewardReport,
hasCampaignSave,
loadCampaignState,
@@ -1087,9 +1089,23 @@ try {
assert(
pendingVictoryRewardReport?.battleId === firstScenario.id &&
pendingVictoryRewardReport.rewardGold === firstBattleReport.rewardGold &&
pendingVictoryRewardReport.campaignRewards?.equipment[0] === firstBattleReport.campaignRewards.equipment[0],
pendingVictoryRewardReport.campaignRewards?.equipment[0] === firstBattleReport.campaignRewards.equipment[0] &&
getPendingCampaignVictoryRewardNoticeReport()?.battleId === firstScenario.id,
`Expected an unacknowledged victory to expose its persisted reward report: ${JSON.stringify(pendingVictoryRewardReport)}`
);
const dismissedVictoryRewardNotice = dismissCampaignVictoryRewardNotice(firstScenario.id);
const repeatedVictoryRewardNoticeDismissal = dismissCampaignVictoryRewardNotice(firstScenario.id);
const dismissedVictoryRewardNoticeSave = JSON.parse(storage.get(campaignStorageKey));
const dismissedVictoryRewardNoticeSlotSave = JSON.parse(storage.get(`${campaignStorageKey}:slot-1`));
assert(
JSON.stringify(dismissedVictoryRewardNotice.dismissedVictoryRewardNoticeBattleIds) === JSON.stringify([firstScenario.id]) &&
JSON.stringify(repeatedVictoryRewardNoticeDismissal.dismissedVictoryRewardNoticeBattleIds) === JSON.stringify([firstScenario.id]) &&
dismissedVictoryRewardNoticeSave.dismissedVictoryRewardNoticeBattleIds.includes(firstScenario.id) &&
dismissedVictoryRewardNoticeSlotSave.dismissedVictoryRewardNoticeBattleIds.includes(firstScenario.id) &&
getPendingCampaignVictoryRewardReport()?.battleId === firstScenario.id &&
getPendingCampaignVictoryRewardNoticeReport() === undefined,
`Expected notice dismissal to persist idempotently without consuming the underlying reward categories: ${JSON.stringify({ dismissedVictoryRewardNotice, dismissedVictoryRewardNoticeSave })}`
);
const acknowledgedVictoryReward = acknowledgeCampaignVictoryReward(firstScenario.id);
const repeatedVictoryRewardAcknowledgement = acknowledgeCampaignVictoryReward(firstScenario.id);
const acknowledgedVictoryRewardSave = JSON.parse(storage.get(campaignStorageKey));
@@ -1102,12 +1118,18 @@ try {
);
const corruptedFutureAcknowledgementSave = JSON.parse(storage.get(campaignStorageKey));
corruptedFutureAcknowledgementSave.acknowledgedVictoryRewardBattleIds.push('second-battle-yellow-turban-pursuit');
corruptedFutureAcknowledgementSave.dismissedVictoryRewardNoticeBattleIds.push(
firstScenario.id,
'second-battle-yellow-turban-pursuit',
'unknown-battle'
);
storage.set(campaignStorageKey, JSON.stringify(corruptedFutureAcknowledgementSave));
const normalizedFutureAcknowledgementSave = loadCampaignState();
assert(
normalizedFutureAcknowledgementSave.acknowledgedVictoryRewardBattleIds.includes(firstScenario.id) &&
!normalizedFutureAcknowledgementSave.acknowledgedVictoryRewardBattleIds.includes('second-battle-yellow-turban-pursuit'),
`Expected acknowledgement normalization to retain recorded victories while rejecting future known battle ids without a victory: ${JSON.stringify(normalizedFutureAcknowledgementSave.acknowledgedVictoryRewardBattleIds)}`
!normalizedFutureAcknowledgementSave.acknowledgedVictoryRewardBattleIds.includes('second-battle-yellow-turban-pursuit') &&
JSON.stringify(normalizedFutureAcknowledgementSave.dismissedVictoryRewardNoticeBattleIds) === JSON.stringify([firstScenario.id]),
`Expected acknowledgement normalization to retain recorded victories while rejecting duplicate, unknown, and future notice dismissals: ${JSON.stringify(normalizedFutureAcknowledgementSave)}`
);
setFirstBattleReport({
...firstBattleReport,