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

Aias00 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shenyu.git


The following commit(s) were added to refs/heads/master by this push:
     new 5ba72ffe61   fix: enable bean validation for AI proxy API key updates 
(#6712) (#7027)
5ba72ffe61 is described below

commit 5ba72ffe618a63c6540e6d822b1d33c2f315d895
Author: Southern <[email protected]>
AuthorDate: Thu Sep 3 16:08:01 2026 +0800

      fix: enable bean validation for AI proxy API key updates (#6712) (#7027)
    
    Add @Valid to the update request body in AiProxyApiKeyController so 
existing ProxyApiKeyDTO constraints, including
      @NotBlank namespaceId, are enforced. Extend controller tests to cover 
successful updates, missing mappings, annotation
      presence, and blank namespace validation.
    
    Co-authored-by: aias00 <[email protected]>
---
 .../admin/controller/AiProxyApiKeyController.java  |  2 +-
 .../controller/AiProxyApiKeyControllerTest.java    | 54 ++++++++++++++++++++++
 2 files changed, 55 insertions(+), 1 deletion(-)

diff --git 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/controller/AiProxyApiKeyController.java
 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/controller/AiProxyApiKeyController.java
index 08957589c5..2970de671c 100644
--- 
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/controller/AiProxyApiKeyController.java
+++ 
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/controller/AiProxyApiKeyController.java
@@ -133,7 +133,7 @@ public class AiProxyApiKeyController implements 
PagedController<ProxyApiKeyQuery
     @RequiresPermissions("system:aiProxyApiKey:edit")
     public ShenyuAdminResult update(
             @PathVariable("selectorId") final String selectorId,
-            @PathVariable("id") final String id, @RequestBody final 
ProxyApiKeyDTO dto) {
+            @PathVariable("id") final String id, @Valid @RequestBody final 
ProxyApiKeyDTO dto) {
         final ProxyApiKeyVO exist = aiProxyApiKeyService.findById(id);
         if (Objects.isNull(exist)) {
             return ShenyuAdminResult.error(AdminConstants.ID_NOT_EXIST);
diff --git 
a/shenyu-admin/src/test/java/org/apache/shenyu/admin/controller/AiProxyApiKeyControllerTest.java
 
b/shenyu-admin/src/test/java/org/apache/shenyu/admin/controller/AiProxyApiKeyControllerTest.java
index 300f363897..7989dc5a1d 100644
--- 
a/shenyu-admin/src/test/java/org/apache/shenyu/admin/controller/AiProxyApiKeyControllerTest.java
+++ 
b/shenyu-admin/src/test/java/org/apache/shenyu/admin/controller/AiProxyApiKeyControllerTest.java
@@ -17,11 +17,16 @@
 
 package org.apache.shenyu.admin.controller;
 
+import jakarta.validation.Valid;
+import jakarta.validation.Validation;
+import jakarta.validation.Validator;
 import org.apache.shenyu.admin.mapper.SelectorMapper;
 import org.apache.shenyu.admin.model.dto.ProxyApiKeyDTO;
 import org.apache.shenyu.admin.model.entity.SelectorDO;
 import org.apache.shenyu.admin.model.result.ShenyuAdminResult;
+import org.apache.shenyu.admin.model.vo.ProxyApiKeyVO;
 import org.apache.shenyu.admin.service.AiProxyApiKeyService;
+import org.apache.shenyu.admin.utils.ShenyuResultMessage;
 import org.apache.shenyu.common.constant.AdminConstants;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
@@ -29,7 +34,12 @@ import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.junit.jupiter.MockitoExtension;
 
+import java.lang.reflect.Method;
+import java.lang.reflect.Parameter;
+
 import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.never;
@@ -77,4 +87,48 @@ public final class AiProxyApiKeyControllerTest {
         assertEquals("selector-namespace", dto.getNamespaceId());
         verify(aiProxyApiKeyService).create(eq(dto), eq("selector-1"));
     }
+
+    @Test
+    public void shouldDelegateUpdateWhenMappingBelongsToSelector() {
+        final ProxyApiKeyDTO dto = new ProxyApiKeyDTO();
+        final ProxyApiKeyVO exist = new ProxyApiKeyVO();
+        exist.setSelectorId("selector-1");
+        when(aiProxyApiKeyService.findById("key-1")).thenReturn(exist);
+        when(aiProxyApiKeyService.update(dto)).thenReturn(1);
+
+        final ShenyuAdminResult result = controller.update("selector-1", 
"key-1", dto);
+
+        assertEquals(ShenyuResultMessage.UPDATE_SUCCESS, result.getMessage());
+        assertEquals("key-1", dto.getId());
+        verify(aiProxyApiKeyService).update(dto);
+    }
+
+    @Test
+    public void shouldRejectUpdateWhenMappingDoesNotExist() {
+        final ProxyApiKeyDTO dto = new ProxyApiKeyDTO();
+        when(aiProxyApiKeyService.findById("missing-key")).thenReturn(null);
+
+        final ShenyuAdminResult result = controller.update("selector-1", 
"missing-key", dto);
+
+        assertEquals(AdminConstants.ID_NOT_EXIST, result.getMessage());
+        verify(aiProxyApiKeyService, 
never()).update(any(ProxyApiKeyDTO.class));
+    }
+
+    @Test
+    public void shouldValidateUpdateRequestBody() throws NoSuchMethodException 
{
+        final Method update = 
AiProxyApiKeyController.class.getMethod("update", String.class, String.class,
+                ProxyApiKeyDTO.class);
+        final Parameter requestBody = update.getParameters()[2];
+
+        assertTrue(requestBody.isAnnotationPresent(Valid.class));
+    }
+
+    @Test
+    public void shouldRejectBlankNamespaceIdDuringValidation() {
+        final ProxyApiKeyDTO dto = new ProxyApiKeyDTO();
+        dto.setNamespaceId(" ");
+        final Validator validator = 
Validation.buildDefaultValidatorFactory().getValidator();
+
+        assertFalse(validator.validate(dto).isEmpty());
+    }
 }

Reply via email to