This is an automated email from the ASF dual-hosted git repository.
lizhimins pushed a commit to branch rocketmq-studio
in repository https://gitbox.apache.org/repos/asf/rocketmq-dashboard.git
The following commit(s) were added to refs/heads/rocketmq-studio by this push:
new faa48b75 fix: validate instance updates (#615)
faa48b75 is described below
commit faa48b75e87a442740146a02ad2bfcbda0df3977
Author: yx9o <[email protected]>
AuthorDate: Wed Jul 29 10:11:41 2026 +0800
fix: validate instance updates (#615)
---
.../rocketmq/studio/instance/InstanceService.java | 7 ++++
.../studio/instance/InstanceServiceTest.java | 45 ++++++++++++++++++++++
2 files changed, 52 insertions(+)
diff --git
a/server/src/main/java/org/apache/rocketmq/studio/instance/InstanceService.java
b/server/src/main/java/org/apache/rocketmq/studio/instance/InstanceService.java
index eb4c5aec..4269c9d9 100644
---
a/server/src/main/java/org/apache/rocketmq/studio/instance/InstanceService.java
+++
b/server/src/main/java/org/apache/rocketmq/studio/instance/InstanceService.java
@@ -74,6 +74,13 @@ public class InstanceService {
InstanceVO existing = instanceRepository.findById(instance.getId())
.orElseThrow(() -> new BusinessException(404, "InstanceVO not
found: " + instance.getId()));
+ if (instance.getName() != null && instance.getName().isBlank()) {
+ throw new BusinessException(400, "InstanceVO name is required");
+ }
+ if (instance.getEndpoint() != null &&
instance.getEndpoint().isBlank()) {
+ throw new BusinessException(400, "InstanceVO endpoint is
required");
+ }
+
if (instance.getName() != null) {
existing.setName(instance.getName());
}
diff --git
a/server/src/test/java/org/apache/rocketmq/studio/instance/InstanceServiceTest.java
b/server/src/test/java/org/apache/rocketmq/studio/instance/InstanceServiceTest.java
index c59644fd..63dcf377 100644
---
a/server/src/test/java/org/apache/rocketmq/studio/instance/InstanceServiceTest.java
+++
b/server/src/test/java/org/apache/rocketmq/studio/instance/InstanceServiceTest.java
@@ -31,6 +31,7 @@ import java.util.Optional;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -260,6 +261,50 @@ class InstanceServiceTest {
.hasMessage("InstanceVO not found: nonexistent");
}
+ @Test
+ void updateInstanceShouldRejectBlankName() {
+ InstanceVO existing = InstanceVO.builder()
+ .name("existing-name")
+ .endpoint("10.0.1.1:8080")
+ .build();
+ existing.setId("inst-1");
+ InstanceVO update = InstanceVO.builder().name(" ").build();
+ update.setId("inst-1");
+
+
when(instanceRepository.findById("inst-1")).thenReturn(Optional.of(existing));
+
+ assertThatThrownBy(() -> instanceService.updateInstance(update))
+ .isInstanceOf(BusinessException.class)
+ .hasMessage("InstanceVO name is required")
+ .satisfies(ex -> assertThat(((BusinessException)
ex).getCode()).isEqualTo(400));
+ assertThat(existing.getName()).isEqualTo("existing-name");
+ verify(instanceRepository, never()).save(any(InstanceVO.class));
+ }
+
+ @Test
+ void
updateInstanceShouldRejectBlankEndpointWithoutMutatingExistingFields() {
+ InstanceVO existing = InstanceVO.builder()
+ .name("existing-name")
+ .endpoint("10.0.1.1:8080")
+ .build();
+ existing.setId("inst-1");
+ InstanceVO update = InstanceVO.builder()
+ .name("new-name")
+ .endpoint(" ")
+ .build();
+ update.setId("inst-1");
+
+
when(instanceRepository.findById("inst-1")).thenReturn(Optional.of(existing));
+
+ assertThatThrownBy(() -> instanceService.updateInstance(update))
+ .isInstanceOf(BusinessException.class)
+ .hasMessage("InstanceVO endpoint is required")
+ .satisfies(ex -> assertThat(((BusinessException)
ex).getCode()).isEqualTo(400));
+ assertThat(existing.getName()).isEqualTo("existing-name");
+ assertThat(existing.getEndpoint()).isEqualTo("10.0.1.1:8080");
+ verify(instanceRepository, never()).save(any(InstanceVO.class));
+ }
+
@Test
void deleteInstanceShouldRemoveExistingInstance() {
InstanceVO existing = InstanceVO.builder().name("to-delete").build();