From 34981c30a78e8bbd7791131059a9210f9928b62c Mon Sep 17 00:00:00 2001
From: 刘光辉 <347230014@qq.com>
Date: 星期四, 17 九月 2026 09:24:09 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master' into master

---
 jnpf-lims/jnpf-lims-biz/src/test/java/jnpf/limsService/impl/LimsMessageFailurePolicyChecks.java |   74 +++++++++++++++++++++++++++++++++++++
 1 files changed, 74 insertions(+), 0 deletions(-)

diff --git a/jnpf-lims/jnpf-lims-biz/src/test/java/jnpf/limsService/impl/LimsMessageFailurePolicyChecks.java b/jnpf-lims/jnpf-lims-biz/src/test/java/jnpf/limsService/impl/LimsMessageFailurePolicyChecks.java
new file mode 100644
index 0000000..5444ddb
--- /dev/null
+++ b/jnpf-lims/jnpf-lims-biz/src/test/java/jnpf/limsService/impl/LimsMessageFailurePolicyChecks.java
@@ -0,0 +1,74 @@
+package jnpf.limsService.impl;
+
+import jnpf.limsEntity.LimsMessageConfigRow;
+
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.Arrays;
+import java.util.Collections;
+
+/** Lightweight checks for message precondition failures in environments without a test runner. */
+public class LimsMessageFailurePolicyChecks {
+    public static void main(String[] args) throws Exception {
+        require(!LimsMessageConfigValidator.validateRows(Collections.emptyList()).isValid(),
+                "missing config must be rejected");
+
+        LimsMessageConfigRow valid = validRow();
+        require(LimsMessageConfigValidator.validateRows(Collections.singletonList(valid)).isValid(),
+                "one enabled in-site template must be accepted");
+
+        valid.setConfigEnabled(0);
+        require(!LimsMessageConfigValidator.validateRows(Collections.singletonList(valid)).isValid(),
+                "disabled config must be rejected");
+        valid.setConfigEnabled(1);
+
+        LimsMessageConfigRow secondRelation = validRow();
+        secondRelation.setRelationId("relation-2");
+        require(!LimsMessageConfigValidator.validateRows(Arrays.asList(valid, secondRelation)).isValid(),
+                "multiple template relations must be rejected");
+
+        valid.setMenuUrl(" ");
+        require(!LimsMessageConfigValidator.validateRows(Collections.singletonList(valid)).isValid(),
+                "empty menu URL must be rejected");
+
+        String service = read("jnpf-lims/jnpf-lims-biz/src/main/java/jnpf/limsService/impl/"
+                + "LimsMessageServiceImpl.java");
+        require(service.contains("ready ? recipients : Collections.emptyList()"),
+                "precondition failures must not create delivery rows");
+        require(service.contains("RECIPIENT_NOT_FOUND: no active user resolved"),
+                "zero-recipient failure reason must be recorded");
+        require(service.contains("if (!config.isValid())"),
+                "invalid configuration must stop before platform sending");
+        require(service.contains("int sendable = config.isValid() ? recipients.size() : 0"),
+                "dry-run must not report invalid configuration as sendable");
+    }
+
+    private static LimsMessageConfigRow validRow() {
+        LimsMessageConfigRow row = new LimsMessageConfigRow();
+        row.setConfigId("config-1");
+        row.setConfigEnabled(1);
+        row.setConfigSource("6");
+        row.setRelationId("relation-1");
+        row.setRelationEnabled(1);
+        row.setRelationMessageType("1");
+        row.setTemplateId("template-1");
+        row.setTemplateEnabled(1);
+        row.setTemplateMessageType("1");
+        row.setTemplateSource("6");
+        row.setMenuUrl("/lims/detail?id={bizId}");
+        return row;
+    }
+
+    private static String read(String path) throws Exception {
+        Path root = Paths.get(System.getProperty("user.dir"));
+        return new String(Files.readAllBytes(root.resolve(path)), StandardCharsets.UTF_8);
+    }
+
+    private static void require(boolean value, String message) {
+        if (!value) {
+            throw new AssertionError(message);
+        }
+    }
+}

--
Gitblit v1.8.0