This is an automated email from the ASF dual-hosted git repository.

luigidemasi pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-kit.git

commit 032750a24f3b227f22bab55b383a9c446ed2bcc2
Author: Jinal Sarvaiya <[email protected]>
AuthorDate: Sat Oct 24 08:37:22 2026 +0100

    fix #109: cover server-only and permission-only early-return regressions
---
 .../camelkit/generator/OpenCodeGeneratorTest.java  | 37 ++++++++++++++++++++++
 1 file changed, 37 insertions(+)

diff --git 
a/camel-kit-core/src/test/java/io/github/luigidemasi/camelkit/generator/OpenCodeGeneratorTest.java
 
b/camel-kit-core/src/test/java/io/github/luigidemasi/camelkit/generator/OpenCodeGeneratorTest.java
index cb4a920b..e1b10e99 100644
--- 
a/camel-kit-core/src/test/java/io/github/luigidemasi/camelkit/generator/OpenCodeGeneratorTest.java
+++ 
b/camel-kit-core/src/test/java/io/github/luigidemasi/camelkit/generator/OpenCodeGeneratorTest.java
@@ -907,6 +907,16 @@ class OpenCodeGeneratorTest {
         String noServer = 
current.replaceAll("(?s)\"citrus\"\\s*:\\s*\\{[^}]*\\},?\\s*", "");
         assertFalse(noServer.contains("\"citrus\""), "citrus server must be 
removed manually");
         assertTrue(noServer.contains("\"citrus_*\""), "citrus_* permission 
must still be present");
+
+        // Move citrus_* before camel_* so generated permissions trail at the 
end
+        // and isCurrentAndOrdered returns true — exercising the early-return 
guard.
+        noServer = noServer
+                .replaceFirst("\"camel_\\*\" : \"ask\",", "")
+                .replaceFirst("\"camel-knowledge_\\*\" : \"ask\",", "")
+                .replace("\"citrus_*\" : \"ask\"",
+                        "\"citrus_*\" : \"ask\",\n    \"camel_*\" : \"ask\",\n 
   \"camel-knowledge_*\" : \"ask\"");
+        assertTrue(noServer.indexOf("\"citrus_*\"") < 
noServer.indexOf("\"camel_*\""),
+                "citrus_* must appear before camel_* to exercise 
isCurrentAndOrdered");
         Files.writeString(configFile, noServer);
 
         new OpenCodeGenerator().generate(createContext("camel-kit", false));
@@ -915,4 +925,31 @@ class OpenCodeGeneratorTest {
                 "citrus_* permission must be removed after opt-out 
regeneration");
         assertTrue(result.contains("\"camel\""), "camel mcp must remain");
     }
+
+    @Test
+    void regenerationRemovesCitrusServerWhenOnlyPermissionAlreadyGone() throws 
Exception {
+        new OpenCodeGenerator().generate(createContext("camel-kit", true));
+        Path configFile = tempDir.resolve("opencode.json");
+        String current = Files.readString(configFile);
+        assertTrue(current.contains("\"citrus\""), "citrus server must be 
present");
+
+        // Remove only the citrus_* permission, leave the citrus server in mcp.
+        // Generated permissions (without citrus) trail at the end, so
+        // isCurrentAndOrdered returns true — exercising the early-return 
guard.
+        String noPermission = 
current.replaceFirst(",?\\s*\"citrus_\\*\"\\s*:\\s*\"ask\"", "");
+        assertFalse(noPermission.contains("\"citrus_*\""),
+                "citrus_* permission must be removed manually");
+        assertTrue(noPermission.contains("\"citrus\""),
+                "citrus server must still be present");
+        Files.writeString(configFile, noPermission);
+
+        new OpenCodeGenerator().generate(createContext("camel-kit", false));
+        String result = Files.readString(configFile);
+        assertFalse(result.contains("\"citrus\""),
+                "citrus server must be removed after opt-out regeneration");
+        assertFalse(result.contains("\"citrus_*\""),
+                "citrus_* permission must not reappear");
+        assertTrue(result.contains("\"camel\""), "camel mcp must remain");
+        assertTrue(result.contains("\"camel_*\""), "camel_* permission must 
remain");
+    }
 }

Reply via email to