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());
+ }
}