From 009ca9521044435c013de6c81e5f2c0b7822c853 Mon Sep 17 00:00:00 2001 From: Ben Date: Sun, 19 Jul 2026 16:00:35 -0600 Subject: [PATCH] Restore server-affine offline reward replay --- .../api/user/AdvancedCoreUser.java | 4 +- .../tests/user/AdvancedCoreUserTest.java | 47 ++++++++++++++++++- 2 files changed, 48 insertions(+), 3 deletions(-) diff --git a/AdvancedCore/src/main/java/com/bencodez/advancedcore/api/user/AdvancedCoreUser.java b/AdvancedCore/src/main/java/com/bencodez/advancedcore/api/user/AdvancedCoreUser.java index ddc5366fb..4cb944537 100644 --- a/AdvancedCore/src/main/java/com/bencodez/advancedcore/api/user/AdvancedCoreUser.java +++ b/AdvancedCore/src/main/java/com/bencodez/advancedcore/api/user/AdvancedCoreUser.java @@ -357,8 +357,8 @@ public void checkOfflineRewards() { String rewardName = parts[0]; String placeholderStr = parts.length > 1 ? parts[1] : ""; - RewardOptions options = new RewardOptions().setOnline(false).setGiveOffline(false).forceOffline() - .setCheckTimed(false).withPlaceHolder(ArrayUtils.fromString(placeholderStr)); + RewardOptions options = new RewardOptions().setOnline(false).setCheckTimed(false) + .withPlaceHolder(ArrayUtils.fromString(placeholderStr)); rewardHandler.giveReward(user, rewardName, options); } diff --git a/AdvancedCore/src/test/java/com/bencodez/advancedcore/tests/user/AdvancedCoreUserTest.java b/AdvancedCore/src/test/java/com/bencodez/advancedcore/tests/user/AdvancedCoreUserTest.java index b385b4427..692030ae5 100644 --- a/AdvancedCore/src/test/java/com/bencodez/advancedcore/tests/user/AdvancedCoreUserTest.java +++ b/AdvancedCore/src/test/java/com/bencodez/advancedcore/tests/user/AdvancedCoreUserTest.java @@ -1,6 +1,9 @@ package com.bencodez.advancedcore.tests.user; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -10,11 +13,15 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.mockito.ArgumentCaptor; import com.bencodez.advancedcore.AdvancedCoreConfigOptions; import com.bencodez.advancedcore.AdvancedCorePlugin; +import com.bencodez.advancedcore.api.rewards.RewardHandler; +import com.bencodez.advancedcore.api.rewards.RewardOptions; import com.bencodez.advancedcore.api.user.AdvancedCoreUser; import com.bencodez.advancedcore.api.user.UserData; +import com.bencodez.advancedcore.api.user.UserDataFetchMode; import com.bencodez.advancedcore.api.user.UserManager; import com.bencodez.advancedcore.api.user.UserStorage; import com.bencodez.advancedcore.api.user.usercache.UserDataManager; @@ -25,6 +32,7 @@ public class AdvancedCoreUserTest { private UserManager userManager; private UserDataManager dataManager; private UserData data; + private RewardHandler rewardHandler; private AdvancedCoreUser user; @BeforeEach @@ -33,6 +41,7 @@ public void setUp() { userManager = mock(UserManager.class); dataManager = mock(UserDataManager.class); data = mock(UserData.class); + rewardHandler = mock(RewardHandler.class); MySQL mysql = mock(MySQL.class); AdvancedCoreConfigOptions configOptions = mock(AdvancedCoreConfigOptions.class); @@ -41,13 +50,49 @@ public void setUp() { when(plugin.getMysql()).thenReturn(mysql); when(userManager.getDataManager()).thenReturn(dataManager); when(plugin.getUserManager()).thenReturn(userManager); + when(plugin.getRewardHandler()).thenReturn(rewardHandler); when(plugin.getStorageType()).thenReturn(UserStorage.MYSQL); when(userManager.getOfflineRewardsPath()).thenReturn("offlineRewardsPath"); + when(configOptions.isProcessRewards()).thenReturn(true); user = new AdvancedCoreUser(plugin, UUID.randomUUID(),"Test"); user.setData(data); // Inject the mocked UserData object } + @Test + void checkOfflineRewards_preservesServerRequirementForNormalReplay() { + ArrayList rewards = new ArrayList<>(); + rewards.add("VoteReward%placeholders%Server%pair%server-a"); + when(data.getStringList("offlineRewardsPath", UserDataFetchMode.DEFAULT)).thenReturn(rewards); + + user.checkOfflineRewards(); + + ArgumentCaptor optionsCaptor = ArgumentCaptor.forClass(RewardOptions.class); + verify(rewardHandler).giveReward(eq(user), eq("VoteReward"), optionsCaptor.capture()); + RewardOptions options = optionsCaptor.getValue(); + assertFalse(options.isForceOffline()); + assertTrue(options.isGiveOffline()); + assertFalse(options.isCheckTimed()); + assertEquals("server-a", options.getPlaceholders().get("Server")); + } + + @Test + void forceRunOfflineRewards_stillBypassesNormalReplayChecks() { + ArrayList rewards = new ArrayList<>(); + rewards.add("VoteReward%placeholders%Server%pair%server-a"); + when(data.getStringList("offlineRewardsPath", UserDataFetchMode.DEFAULT)).thenReturn(rewards); + + user.forceRunOfflineRewards(); + + ArgumentCaptor optionsCaptor = ArgumentCaptor.forClass(RewardOptions.class); + verify(rewardHandler).giveReward(eq(user), eq("VoteReward"), optionsCaptor.capture()); + RewardOptions options = optionsCaptor.getValue(); + assertTrue(options.isForceOffline()); + assertFalse(options.isGiveOffline()); + assertFalse(options.isCheckTimed()); + assertEquals("server-a", options.getPlaceholders().get("Server")); + } + @Test void setOfflineRewards_emptyList() { ArrayList rewards = new ArrayList<>(); @@ -93,4 +138,4 @@ void setOfflineRewards_withinLimit() { user.setOfflineRewards(rewards); verify(data).setStringList("offlineRewardsPath", rewards); } -} \ No newline at end of file +}