From 4a863faadfc5c4593ddc1b08f189715b05ec1cc4 Mon Sep 17 00:00:00 2001 From: =?utf8?q?David=20=E2=80=98Bombe=E2=80=99=20Roden?= Date: Mon, 20 Apr 2026 17:52:47 +0200 Subject: [PATCH] =?utf8?q?=E2=9C=A8=20Always=20send=20email=20when=20first?= =?utf8?q?=20state=20arrives?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../pterodactylus/rhynodge/engine/ReactionRunner.java | 1 + .../rhynodge/engine/ReactionRunnerTest.kt | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+) 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() } -- 2.7.4