Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,12 @@ public List<AclRuleVO> listRules(String clusterId, String principal) {

public AclRuleVO createRule(AclRuleVO rule) {
log.info("Creating ACL rule for principal={}", rule.getPrincipal());
if (isBlank(rule.getPrincipal())) {
throw new BusinessException(400, "ACL principal is required");
}
if (isBlank(rule.getResource())) {
throw new BusinessException(400, "ACL resource is required");
}
rule.setId(UUID.randomUUID().toString());
rule.setCreatedAt(LocalDateTime.now());
return aclRepository.saveRule(rule);
Expand Down Expand Up @@ -71,6 +77,9 @@ public List<AclUserVO> listUsers() {

public AclUserVO createUser(AclUserVO user) {
log.info("Creating ACL user username={}", user.getUsername());
if (isBlank(user.getUsername())) {
throw new BusinessException(400, "ACL username is required");
}
user.setId(UUID.randomUUID().toString());
user.setAccessKey(UUID.randomUUID().toString().replace("-", ""));
user.setSecretKey(UUID.randomUUID().toString().replace("-", ""));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@

package com.rocketmq.studio.instance.acl;

import com.rocketmq.studio.common.exception.BusinessException;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
Expand All @@ -28,6 +29,7 @@
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;

Expand Down Expand Up @@ -85,6 +87,34 @@ void createRuleShouldSetIdAndTimestamp() {
verify(aclRepository).saveRule(any(AclRuleVO.class));
}

@Test
void createRuleShouldRequirePrincipal() {
AclRuleVO input = AclRuleVO.builder()
.principal(" ")
.resource("topic-1")
.build();

assertThatThrownBy(() -> aclService.createRule(input))
.isInstanceOf(BusinessException.class)
.satisfies(ex -> assertThat(((BusinessException) ex).getCode()).isEqualTo(400))
.hasMessage("ACL principal is required");
verify(aclRepository, never()).saveRule(any(AclRuleVO.class));
}

@Test
void createRuleShouldRequireResource() {
AclRuleVO input = AclRuleVO.builder()
.principal("user1")
.resource(" ")
.build();

assertThatThrownBy(() -> aclService.createRule(input))
.isInstanceOf(BusinessException.class)
.satisfies(ex -> assertThat(((BusinessException) ex).getCode()).isEqualTo(400))
.hasMessage("ACL resource is required");
verify(aclRepository, never()).saveRule(any(AclRuleVO.class));
}

@Test
void deleteRuleShouldDelegateToRepository() {
aclService.deleteRule("rule-1");
Expand Down Expand Up @@ -158,6 +188,20 @@ void createUserShouldGenerateKeysAndSetTimestamp() {
verify(aclRepository).saveUser(any(AclUserVO.class));
}

@Test
void createUserShouldRequireUsername() {
AclUserVO input = AclUserVO.builder()
.username(" ")
.admin(false)
.build();

assertThatThrownBy(() -> aclService.createUser(input))
.isInstanceOf(BusinessException.class)
.satisfies(ex -> assertThat(((BusinessException) ex).getCode()).isEqualTo(400))
.hasMessage("ACL username is required");
verify(aclRepository, never()).saveUser(any(AclUserVO.class));
}

@Test
void deleteUserShouldDelegateToRepository() {
aclService.deleteUser("user-1");
Expand Down
Loading