From: David ‘Bombe’ Roden Date: Mon, 20 Apr 2026 15:52:47 +0000 (+0200) Subject: ✨ Always send email when first state arrives X-Git-Url: https://git.pterodactylus.net/?a=commitdiff_plain;h=4a863faadfc5c4593ddc1b08f189715b05ec1cc4;p=rhynodge.git ✨ Always send email when first state arrives --- diff --git a/src/main/java/net/pterodactylus/rhynodge/engine/ReactionRunner.java b/src/main/java/net/pterodactylus/rhynodge/engine/ReactionRunner.java index bff7a33..a2cc0c4 100644 --- a/src/main/java/net/pterodactylus/rhynodge/engine/ReactionRunner.java +++ b/src/main/java/net/pterodactylus/rhynodge/engine/ReactionRunner.java @@ -58,6 +58,7 @@ public class ReactionRunner implements Runnable { if (!lastSuccessfulState.isPresent()) { logger.info(format("No last state for %s.", reaction.name())); reactionState.saveState(state); + reaction.action().execute(state.output(reaction)); return; } Merger merger = reaction.merger(); diff --git a/src/test/kotlin/net/pterodactylus/rhynodge/engine/ReactionRunnerTest.kt b/src/test/kotlin/net/pterodactylus/rhynodge/engine/ReactionRunnerTest.kt index c68278e..50ecb22 100644 --- a/src/test/kotlin/net/pterodactylus/rhynodge/engine/ReactionRunnerTest.kt +++ b/src/test/kotlin/net/pterodactylus/rhynodge/engine/ReactionRunnerTest.kt @@ -20,6 +20,7 @@ import java.util.Optional.empty import java.util.Optional.of import java.util.concurrent.atomic.AtomicBoolean import java.util.concurrent.atomic.AtomicReference +import net.pterodactylus.rhynodge.Action import org.mockito.Mockito.mock /** @@ -71,6 +72,16 @@ class ReactionRunnerTest { } @Test + fun `reaction runner triggers mail when last state does not exist and current state is successful`() { + val reactionState = createReactionState() + val emailSent = AtomicReference() + val reaction = createReaction { emailSent.set(it.text("text/plain")) } + val reactionRunner = ReactionRunner(reaction, reactionState, nullEmailAction) + reactionRunner.run() + assertThat(emailSent.get(), equalTo("Test Output")) + } + + @Test fun `reaction runner saves state when unsuccessful and last state is failed`() { val savedState = AtomicReference() val failedState = FailedState().apply { setFailCount(12) } @@ -91,6 +102,14 @@ class ReactionRunnerTest { override fun execute(output: Output) = action() } + private fun createReaction(action: (output: Output) -> Unit = {}) = object : Reaction("Test", mock(), mock(), Action { output, _ -> action(output) }) { + override fun query() = Query { + object : AbstractState(true, false) { + override fun plainText() = "Test Output" + } + } + } + private val reactionState = createReactionState() private val failingReaction = object : Reaction("Test", mock(), mock(), mock()) { override fun query() = Query { FailedState() }