diff --git a/VotingPlugin/src/test/java/com/bencodez/votingplugin/tests/timequeue/TimeQueueHandlerRejectionTest.java b/VotingPlugin/src/test/java/com/bencodez/votingplugin/tests/timequeue/TimeQueueHandlerRejectionTest.java index 37ba7a49a..5f5618348 100644 --- a/VotingPlugin/src/test/java/com/bencodez/votingplugin/tests/timequeue/TimeQueueHandlerRejectionTest.java +++ b/VotingPlugin/src/test/java/com/bencodez/votingplugin/tests/timequeue/TimeQueueHandlerRejectionTest.java @@ -2,6 +2,7 @@ import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.anyString; @@ -19,13 +20,16 @@ import java.util.concurrent.TimeUnit; import java.util.logging.Logger; +import org.bukkit.Server; import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.plugin.PluginManager; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import com.bencodez.advancedcore.api.time.events.DateChangedEvent; import com.bencodez.votingplugin.VotingPluginMain; import com.bencodez.votingplugin.data.ServerData; +import com.bencodez.votingplugin.events.PlayerVoteEvent; import com.bencodez.votingplugin.timequeue.TimeQueueHandler; class TimeQueueHandlerRejectionTest { @@ -73,6 +77,23 @@ void dateChangeRejectionDoesNotEscapeBukkitEventHandler() { verify(logger, org.mockito.Mockito.atLeastOnce()).warning(anyString()); } + @Test + void queuedVoteRestoresOriginalTimestampOnReplay() { + TimeQueueHandler handler = new TimeQueueHandler(plugin); + Server server = mock(Server.class); + PluginManager manager = mock(PluginManager.class); + when(plugin.getServer()).thenReturn(server); + when(server.getPluginManager()).thenReturn(manager); + when(plugin.getVoteSiteManager().getVoteSiteName(true, "example.org")).thenReturn("example.org"); + org.mockito.ArgumentCaptor event = org.mockito.ArgumentCaptor.forClass(PlayerVoteEvent.class); + + handler.processQueue(); + + verify(manager).callEvent(event.capture()); + assertNotNull(event.getValue()); + assertEquals(123L, event.getValue().getTime()); + } + @Test void rejectedProcessingSchedulesOneBoundedRetry() { TimeQueueHandler handler = new TimeQueueHandler(plugin); diff --git a/VotingPlugin/src/test/java/com/bencodez/votingplugin/user/VotingPluginUserOfflineVoteReplayTest.java b/VotingPlugin/src/test/java/com/bencodez/votingplugin/user/VotingPluginUserOfflineVoteReplayTest.java new file mode 100644 index 000000000..ce29c31ce --- /dev/null +++ b/VotingPlugin/src/test/java/com/bencodez/votingplugin/user/VotingPluginUserOfflineVoteReplayTest.java @@ -0,0 +1,53 @@ +package com.bencodez.votingplugin.user; + +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.doThrow; +import static org.mockito.Mockito.inOrder; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.when; + +import java.util.ArrayList; +import java.util.List; + +import org.junit.jupiter.api.Test; +import org.mockito.InOrder; + +import com.bencodez.advancedcore.api.user.AdvancedCoreUser; +import com.bencodez.advancedcore.api.user.UserData; +import com.bencodez.votingplugin.VotingPluginMain; +import com.bencodez.votingplugin.votesites.VoteSite; +import com.bencodez.votingplugin.votesites.VoteSiteManager; + +class VotingPluginUserOfflineVoteReplayTest { + @Test + void clearsOfflineVotesBeforeStartingRewardsSoPermanentFailuresDoNotReplayForever() { + VotingPluginMain plugin = mock(VotingPluginMain.class, org.mockito.Mockito.RETURNS_DEEP_STUBS); + when(plugin.getOptions().isProcessRewards()).thenReturn(true); + AdvancedCoreUser base = mock(AdvancedCoreUser.class); + UserData data = mock(UserData.class); + when(base.getUserData()).thenReturn(data); + when(base.getUUID()).thenReturn("00000000-0000-0000-0000-000000000001"); + when(base.getPlayerName()).thenReturn("Player"); + VotingPluginUser user = spy(new VotingPluginUser(plugin, base)); + VoteSiteManager manager = mock(VoteSiteManager.class); + VoteSite site = mock(VoteSite.class); + when(plugin.getVoteSiteManager()).thenReturn(manager); + when(manager.hasVoteSite("Site1")).thenReturn(true); + when(manager.getVoteSite("Site1", true)).thenReturn(site); + doReturn(false).when(user).isTopVoterIgnore(); + doReturn(new ArrayList<>(List.of("Site1"))).when(user).getOfflineVotes(); + doNothing().when(user).sendVoteEffects(false); + doNothing().when(user).setOfflineVotes(org.mockito.ArgumentMatchers.any()); + doThrow(new IllegalStateException("reward failed")).when(user).playerVote(site, false, false); + + assertThrows(IllegalStateException.class, + () -> user.offVoteWithCapturedTopVoterIgnore(false)); + + InOrder order = inOrder(user); + order.verify(user).setOfflineVotes(org.mockito.ArgumentMatchers.argThat(List::isEmpty)); + order.verify(user).playerVote(site, false, false); + } +}