✨ Allow sending emails to multiple addresses again
authorDavid Roden <bombe@pterodactylus.net>
Fri, 20 Dec 2024 11:14:48 +0000 (12:14 +0100)
committerDavid Roden <bombe@pterodactylus.net>
Fri, 20 Dec 2024 11:14:48 +0000 (12:14 +0100)
src/main/java/net/pterodactylus/rhynodge/loader/Chain.java
src/main/java/net/pterodactylus/rhynodge/loader/ReactionLoader.java
src/test/kotlin/net/pterodactylus/rhynodge/loader/ReactionLoaderTest.kt
src/test/resources/net/pterodactylus/rhynodge/loader/chain-with-email-action-and-runtime-arguments.json [new file with mode: 0644]

index 3d6fbfe..516d0b0 100644 (file)
@@ -105,6 +105,10 @@ public class Chain {
                @JsonProperty
                private List<Parameter> parameters = new ArrayList<Parameter>();
 
+               /** Runtime arguments for the part. */
+               @JsonProperty
+               private List<Parameter> runtimeArguments = new ArrayList<>();
+
                /**
                 * Returns the name of the part’s class.
                 *
@@ -123,6 +127,10 @@ public class Chain {
                        return parameters;
                }
 
+               public List<Parameter> getRuntimeArguments() {
+                       return runtimeArguments;
+               }
+
                /**
                 * {@inheritDoc}
                 */
@@ -133,6 +141,9 @@ public class Chain {
                        for (Parameter parameter : parameters) {
                                hashCode ^= parameter.hashCode();
                        }
+                       for (Parameter runtimeArgument : runtimeArguments) {
+                               hashCode ^= runtimeArgument.hashCode();
+                       }
                        return hashCode;
                }
 
@@ -144,18 +155,7 @@ public class Chain {
                        if (!(object instanceof Part part)) {
                                return false;
                        }
-                       if (!name.equals(part.name)) {
-                               return false;
-                       }
-                       if (parameters.size() != part.parameters.size()) {
-                               return false;
-                       }
-                       for (int parameterIndex = 0; parameterIndex < parameters.size(); ++parameterIndex) {
-                               if (!parameters.get(parameterIndex).equals(part.parameters.get(parameterIndex))) {
-                                       return false;
-                               }
-                       }
-                       return true;
+                       return name.equals(part.name) && parameters.equals(part.parameters) && runtimeArguments.equals(part.runtimeArguments);
                }
 
        }
index 44fa217..5632187 100644 (file)
@@ -33,6 +33,7 @@ import net.pterodactylus.rhynodge.Watcher;
 import net.pterodactylus.rhynodge.loader.Chain.Parameter;
 import net.pterodactylus.rhynodge.loader.Chain.Part;
 import net.pterodactylus.rhynodge.Merger;
+import net.pterodactylus.rhynodge.output.Output;
 
 /**
  * Creates {@link Reaction}s from {@link Chain}s.
@@ -66,6 +67,9 @@ public class ReactionLoader {
 
                /* create action. */
                Action action = createObject(chain.action().name(), "net.pterodactylus.rhynodge.actions", extractParameters(chain.action().parameters()));
+               if ((action == emailAction) && !chain.action().getRuntimeArguments().isEmpty()) {
+                       action = (output, arguments) -> emailAction.execute(output, chain.action().getRuntimeArguments().stream().map(Parameter::value).toArray(String[]::new));
+               }
 
                /* do we have a reaction defined? */
                if (chain.watcher() != null) {
index 767bf33..b96850c 100644 (file)
@@ -10,6 +10,7 @@ import net.pterodactylus.rhynodge.Query
 import net.pterodactylus.rhynodge.State
 import net.pterodactylus.rhynodge.Watcher
 import net.pterodactylus.rhynodge.actions.EmailAction
+import net.pterodactylus.rhynodge.output.DefaultOutput
 import net.pterodactylus.rhynodge.output.Output
 import net.pterodactylus.rhynodge.states.AbstractState
 import net.pterodactylus.util.inject.ObjectBinding
@@ -17,6 +18,7 @@ import org.hamcrest.Matcher
 import org.hamcrest.MatcherAssert.assertThat
 import org.hamcrest.Matchers.contains
 import org.hamcrest.Matchers.equalTo
+import org.hamcrest.Matchers.hasItem
 import org.hamcrest.Matchers.instanceOf
 import org.hamcrest.Matchers.sameInstance
 import org.junit.jupiter.api.Test
@@ -114,7 +116,15 @@ class ReactionLoaderTest {
                assertThat(reaction.action(), sameInstance(emailAction))
        }
 
-       private val emailAction = EmailAction("local.host", "send@r", "recipi@nt")
+       @Test
+       fun `loader augments email action when runtime arguments are given`() {
+               val chain = objectMapper.readValue<Chain>(javaClass.getResourceAsStream("chain-with-email-action-and-runtime-arguments.json")!!)
+               val reaction = reactionLoader.loadReaction(chain)
+               reaction.action().execute(DefaultOutput(""))
+               assertThat(emailAction.sentEmails, hasItem("test1@test.com"))
+       }
+
+       private val emailAction = TestEmailAction("local.host", "send@r", "recipi@nt")
        private val reactionLoader = ReactionLoader(emailAction)
 
 }
@@ -161,4 +171,14 @@ class TestWatcher3(val one: String, val two: String, val three: String) : Watche
        override fun merger() = TestMerger1(three)
 }
 
+class TestEmailAction(hostname: String, sender: String, recipient: String) : EmailAction(hostname, sender, recipient) {
+
+       override fun execute(output: Output, vararg additionalRecipients: String) {
+               additionalRecipients.forEach((sentEmails as MutableList<String>)::add)
+       }
+
+       val sentEmails: List<String> = mutableListOf()
+
+}
+
 private val objectMapper = ObjectMapper()
diff --git a/src/test/resources/net/pterodactylus/rhynodge/loader/chain-with-email-action-and-runtime-arguments.json b/src/test/resources/net/pterodactylus/rhynodge/loader/chain-with-email-action-and-runtime-arguments.json
new file mode 100644 (file)
index 0000000..bb63899
--- /dev/null
@@ -0,0 +1,17 @@
+{
+  "enabled": true,
+  "name": "Test Watcher",
+  "watcher": {
+    "class": "net.pterodactylus.rhynodge.loader.TestWatcher0"
+  },
+  "action": {
+    "class": "EmailAction",
+    "runtimeArguments": [
+      {
+        "name": "email",
+        "value": "test1@test.com"
+      }
+    ]
+  },
+  "updateInterval": 7200
+}