관리자 권한 동시 추가 기능 및 테스트 코드

This commit is contained in:
geonhos 2024-05-16 15:55:36 +09:00
parent 8b3a827ba0
commit 7faf94a8c9
13 changed files with 189 additions and 65 deletions

View File

@ -1,6 +1,7 @@
package com.bpgroup.poc.admin.domain.entity.administrator;
import com.bpgroup.poc.admin.domain.entity.BaseEntity;
import com.bpgroup.poc.admin.domain.entity.role.Role;
import jakarta.persistence.*;
import lombok.Builder;
import lombok.Getter;
@ -26,7 +27,7 @@ public class Administrator extends BaseEntity {
@Column(name = "name", length = 100, nullable = false)
private String name;
@OneToOne(mappedBy = "administrator", fetch = FetchType.LAZY)
@OneToOne(mappedBy = "administrator", fetch = FetchType.LAZY, orphanRemoval = true)
private AdministratorRole administratorRole;
@Builder
@ -45,4 +46,7 @@ public class Administrator extends BaseEntity {
this.name = administrator.name;
}
public void setAdministratorRole(Role role) {
this.administratorRole = AdministratorRole.of(this, role);
}
}

View File

@ -3,6 +3,7 @@ package com.bpgroup.poc.admin.domain.entity.administrator;
import com.bpgroup.poc.admin.domain.entity.BaseEntity;
import com.bpgroup.poc.admin.domain.entity.role.Role;
import jakarta.persistence.*;
import lombok.Builder;
import lombok.Getter;
@Getter
@ -14,12 +15,23 @@ public class AdministratorRole extends BaseEntity {
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "administrator_id", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
private Administrator administrator;
@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "role_id", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
private Role role;
@Builder
public static AdministratorRole of(Administrator administrator, Role role) {
AdministratorRole administratorRole = new AdministratorRole();
administratorRole.administrator = administrator;
administratorRole.role = role;
return administratorRole;
}
public void update(Role findRole) {
this.role = findRole;
}
}

View File

@ -0,0 +1,6 @@
package com.bpgroup.poc.admin.domain.entity.administrator;
import org.springframework.data.jpa.repository.JpaRepository;
public interface AdministratorRoleRepository extends JpaRepository<AdministratorRole, Long> {
}

View File

@ -40,10 +40,6 @@ public class Role extends BaseEntity {
this.description = updateRole.description;
}
public void addRoleMenu(RoleMenu roleMenu) {
this.roleMenus.add(roleMenu);
}
public void deleteRoleMenus() {
this.roleMenus.clear();
}

View File

@ -84,6 +84,7 @@ public class AdministratorManagementRestController {
.password(passwordEncoder.encode(request.getPassword()))
.name(request.getName())
.email(request.getEmail())
.roleId(request.getRoleId())
.build()
);
@ -93,7 +94,7 @@ public class AdministratorManagementRestController {
/**
* 관리자 삭제
*
* @param request 요청
* @param request 요청
* @param bindingResult Validation 결과
* @return 응답
*/

View File

@ -13,15 +13,14 @@ public class AdministratorCreate {
public static class Request {
@NotBlank
private String loginId;
@NotBlank
private String password;
@NotBlank
private String email;
@NotBlank
private String name;
@NotBlank
private String roleId;
}
@Getter

View File

@ -14,15 +14,14 @@ public class AdministratorUpdate {
public static class Request {
@NotNull
private Long id;
@NotBlank
private String password;
@NotBlank
private String email;
@NotBlank
private String name;
@NotNull
private Long roleId;
}
@Getter

View File

@ -2,6 +2,7 @@ package com.bpgroup.poc.admin.web.main.admin.management.service;
import com.bpgroup.poc.admin.domain.entity.administrator.Administrator;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Builder;
import lombok.Getter;
import lombok.ToString;
@ -9,26 +10,25 @@ import lombok.ToString;
@Getter
@ToString
public class AdministratorCreateCommand {
@NotBlank
private String loginId;
@NotBlank
private String password;
@NotBlank
private String email;
@NotBlank
private String name;
@NotNull
private Long roleId;
@Builder
public static AdministratorCreateCommand of(String loginId, String password, String email, String name) {
public static AdministratorCreateCommand of(String loginId, String password, String email, String name, Long roleId) {
AdministratorCreateCommand command = new AdministratorCreateCommand();
command.loginId = loginId;
command.password = password;
command.email = email;
command.name = name;
command.roleId = roleId;
return command;
}

View File

@ -2,6 +2,10 @@ package com.bpgroup.poc.admin.web.main.admin.management.service;
import com.bpgroup.poc.admin.domain.entity.administrator.Administrator;
import com.bpgroup.poc.admin.domain.entity.administrator.AdministratorRepository;
import com.bpgroup.poc.admin.domain.entity.administrator.AdministratorRole;
import com.bpgroup.poc.admin.domain.entity.administrator.AdministratorRoleRepository;
import com.bpgroup.poc.admin.domain.entity.role.Role;
import com.bpgroup.poc.admin.domain.entity.role.RoleRepository;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotNull;
import lombok.RequiredArgsConstructor;
@ -17,12 +21,26 @@ import java.util.Optional;
@Transactional
public class AdministratorManagementService {
private final AdministratorRepository repository;
private final AdministratorRepository administratorRepository;
private final AdministratorRoleRepository administratorRoleRepository;
private final RoleRepository roleRepository;
public AdministratorCreateResult create(
@NotNull @Valid AdministratorCreateCommand command
) {
Administrator admin = repository.save(command.toEntity());
Optional<Role> findRole = roleRepository.findById(command.getRoleId());
if (findRole.isEmpty()) {
throw new IllegalArgumentException("Not found role");
}
Administrator admin = administratorRepository.save(command.toEntity());
AdministratorRole administratorRole = AdministratorRole.builder()
.administrator(admin)
.role(findRole.get())
.build();
administratorRoleRepository.save(administratorRole);
return AdministratorCreateResult.builder()
.id(admin.getId())
@ -32,21 +50,29 @@ public class AdministratorManagementService {
public void update(
@NotNull @Valid AdministratorUpdateCommand command
) {
Optional<Administrator> findAdministrator = repository.findById(command.getId());
Optional<Administrator> findAdministrator = administratorRepository.findById(command.getId());
if (findAdministrator.isEmpty()) {
throw new IllegalArgumentException("Not found administrator");
}
Administrator administrator = findAdministrator.get();
administrator.update(command.toEntity());
Optional<Role> findRole = roleRepository.findById(command.getRoleId());
if (findRole.isEmpty()) {
throw new IllegalArgumentException("Not found role");
}
Role role = findRole.get();
administrator.getAdministratorRole().update(role);
}
public void delete(@NotNull Long id) {
Optional<Administrator> findAdministrator = repository.findById(id);
Optional<Administrator> findAdministrator = administratorRepository.findById(id);
if (findAdministrator.isEmpty()) {
throw new IllegalArgumentException("Not found administrator");
}
repository.deleteById(id);
administratorRepository.deleteById(id);
}
}

View File

@ -10,26 +10,25 @@ import lombok.ToString;
@Getter
@ToString
public class AdministratorUpdateCommand {
@NotNull
private Long id;
@NotBlank
private String password;
@NotBlank
private String email;
@NotBlank
private String name;
@NotNull
private Long roleId;
@Builder
public static AdministratorUpdateCommand of(Long id, String password, String email, String name) {
public static AdministratorUpdateCommand of(Long id, String password, String email, String name, Long roleId) {
AdministratorUpdateCommand command = new AdministratorUpdateCommand();
command.id = id;
command.password = password;
command.email = email;
command.name = name;
command.roleId = roleId;
return command;
}

View File

@ -82,8 +82,6 @@ public class RoleService {
Menu menu = findMenu.get();
RoleMenu roleMenu = RoleMenu.of(role, menu);
role.addRoleMenu(roleMenu);
roleMenuRepository.save(roleMenu);
});

View File

@ -2,6 +2,10 @@ package com.bpgroup.poc.admin.web.main.admin.administrator;
import com.bpgroup.poc.admin.domain.entity.administrator.Administrator;
import com.bpgroup.poc.admin.domain.entity.administrator.AdministratorRepository;
import com.bpgroup.poc.admin.domain.entity.administrator.AdministratorRole;
import com.bpgroup.poc.admin.domain.entity.administrator.AdministratorRoleRepository;
import com.bpgroup.poc.admin.domain.entity.role.Role;
import com.bpgroup.poc.admin.domain.entity.role.RoleRepository;
import com.bpgroup.poc.admin.env.MariaDBTestEnv;
import com.bpgroup.poc.admin.web.main.admin.management.service.AdministratorCreateCommand;
import com.bpgroup.poc.admin.web.main.admin.management.service.AdministratorCreateResult;
@ -20,23 +24,38 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy;
@Transactional
@DisplayName("AdministratorService 테스트")
public class AdministratorServiceTest extends MariaDBTestEnv {
class AdministratorServiceTest extends MariaDBTestEnv {
@Autowired
private AdministratorManagementService service;
@Autowired
private AdministratorRepository repository;
private AdministratorRepository administratorRepository;
@Autowired
private AdministratorRoleRepository administratorRoleRepository;
@Autowired
private RoleRepository roleRepository;
@BeforeEach
void setUp() {
repository.deleteAll();
administratorRepository.deleteAll();
administratorRoleRepository.deleteAll();
roleRepository.deleteAll();
}
@DisplayName("Administrator 등록 테스트")
@Test
public void createAdministratorTest() {
void createAdministratorTest() {
Role role = roleRepository.save(
Role.builder()
.name("test")
.description("test")
.build()
);
flushAndClear();
// when
AdministratorCreateResult createResult = service.create(
AdministratorCreateCommand.builder()
@ -44,20 +63,49 @@ public class AdministratorServiceTest extends MariaDBTestEnv {
.password("test")
.email("test")
.name("test")
.roleId(role.getId())
.build()
);
flushAndClear();
// then
assertThat(createResult.getId()).isNotNull();
Administrator findAdministrator = administratorRepository.findById(createResult.getId()).orElseThrow();
assertThat(findAdministrator.getAdministratorRole().getRole().getName()).isEqualTo("test");
}
@DisplayName("Administrator 수정 테스트")
@Test
public void updateAdministratorTest() {
void updateAdministratorTest() {
// given
Administrator saveAdministrator = createAdministrator();
flushAndClear();
Role saveRole = roleRepository.save(
Role.builder()
.name("test")
.description("test")
.build()
);
flushAndClear();
Role updateRole = roleRepository.save(
Role.builder()
.name("test2")
.description("test2")
.build()
);
flushAndClear();
administratorRoleRepository.save(
AdministratorRole.builder()
.administrator(saveAdministrator)
.role(saveRole)
.build()
);
flushAndClear();
// when
service.update(
AdministratorUpdateCommand.builder()
@ -65,20 +113,23 @@ public class AdministratorServiceTest extends MariaDBTestEnv {
.password("test2")
.email("test2")
.name("test2")
.roleId(updateRole.getId())
.build()
);
flushAndClear();
// then
Administrator findAdministrator = repository.findById(saveAdministrator.getId()).orElseThrow();
Administrator findAdministrator = administratorRepository.findById(saveAdministrator.getId()).orElseThrow();
assertThat(findAdministrator.getPassword()).isEqualTo("test2");
assertThat(findAdministrator.getEmail()).isEqualTo("test2");
assertThat(findAdministrator.getName()).isEqualTo("test2");
assertThat(findAdministrator.getAdministratorRole().getRole().getName()).isEqualTo("test2");
}
@DisplayName("Administrator 삭제 테스트")
@Test
public void deleteAdministratorTest() {
void deleteAdministratorTest() {
// given
Administrator saveAdministrator = createAdministrator();
flushAndClear();
@ -88,42 +139,75 @@ public class AdministratorServiceTest extends MariaDBTestEnv {
flushAndClear();
// then
assertThat(repository.findById(saveAdministrator.getId())).isEmpty();
assertThat(administratorRepository.findById(saveAdministrator.getId())).isEmpty();
}
@DisplayName("Administrator 삭제 시 Administrator 동시 삭제 테스트")
@Test
void deleteAdministratorAndAdministratorRoleTest() {
// given
Administrator saveAdministrator = createAdministrator();
flushAndClear();
Role saveRole = roleRepository.save(
Role.builder()
.name("test")
.description("test")
.build()
);
flushAndClear();
administratorRoleRepository.save(
AdministratorRole.builder()
.administrator(saveAdministrator)
.role(saveRole)
.build()
);
flushAndClear();
// when
service.delete(saveAdministrator.getId());
flushAndClear();
// then
assertThat(administratorRepository.findById(saveAdministrator.getId())).isEmpty();
assertThat(administratorRoleRepository.findAll()).isEmpty();
}
@NotNull
private Administrator createAdministrator() {
return repository.save(
Administrator.builder()
.loginId("test2")
.password("test2")
.email("test2")
.name("test2")
.build()
);
Administrator administrator = Administrator.builder()
.loginId("test2")
.password("test2")
.email("test2")
.name("test2")
.build();
return administratorRepository.save(administrator);
}
@Test
@DisplayName("AdministratorService method 호출 유효성 검사 테스트")
void validationTest() {
// create
assertThatThrownBy(() -> service.create(AdministratorCreateCommand.builder().loginId(null).password("password").email("email").name("name").build())).isInstanceOf(ConstraintViolationException.class);
assertThatThrownBy(() -> service.create(AdministratorCreateCommand.builder().loginId("").password("password").email("email").name("name").build())).isInstanceOf(ConstraintViolationException.class);
assertThatThrownBy(() -> service.create(AdministratorCreateCommand.builder().loginId("loginId").password(null).email("email").name("name").build())).isInstanceOf(ConstraintViolationException.class);
assertThatThrownBy(() -> service.create(AdministratorCreateCommand.builder().loginId("loginId").password("").email("email").name("name").build())).isInstanceOf(ConstraintViolationException.class);
assertThatThrownBy(() -> service.create(AdministratorCreateCommand.builder().loginId("loginId").password("password").email(null).name("name").build())).isInstanceOf(ConstraintViolationException.class);
assertThatThrownBy(() -> service.create(AdministratorCreateCommand.builder().loginId("loginId").password("password").email("").name("name").build())).isInstanceOf(ConstraintViolationException.class);
assertThatThrownBy(() -> service.create(AdministratorCreateCommand.builder().loginId("loginId").password("password").email("email").name(null).build())).isInstanceOf(ConstraintViolationException.class);
assertThatThrownBy(() -> service.create(AdministratorCreateCommand.builder().loginId("loginId").password("password").email("email").name("").build())).isInstanceOf(ConstraintViolationException.class);
assertThatThrownBy(() -> service.create(AdministratorCreateCommand.builder().loginId(null).password("password").email("email").name("name").roleId(1L).build())).isInstanceOf(ConstraintViolationException.class);
assertThatThrownBy(() -> service.create(AdministratorCreateCommand.builder().loginId("").password("password").email("email").name("name").roleId(1L).build())).isInstanceOf(ConstraintViolationException.class);
assertThatThrownBy(() -> service.create(AdministratorCreateCommand.builder().loginId("loginId").password(null).email("email").name("name").roleId(1L).build())).isInstanceOf(ConstraintViolationException.class);
assertThatThrownBy(() -> service.create(AdministratorCreateCommand.builder().loginId("loginId").password("").email("email").name("name").roleId(1L).build())).isInstanceOf(ConstraintViolationException.class);
assertThatThrownBy(() -> service.create(AdministratorCreateCommand.builder().loginId("loginId").password("password").email(null).name("name").roleId(1L).build())).isInstanceOf(ConstraintViolationException.class);
assertThatThrownBy(() -> service.create(AdministratorCreateCommand.builder().loginId("loginId").password("password").email("").name("name").roleId(1L).build())).isInstanceOf(ConstraintViolationException.class);
assertThatThrownBy(() -> service.create(AdministratorCreateCommand.builder().loginId("loginId").password("password").email("email").name(null).roleId(1L).build())).isInstanceOf(ConstraintViolationException.class);
assertThatThrownBy(() -> service.create(AdministratorCreateCommand.builder().loginId("loginId").password("password").email("email").name("").roleId(1L).build())).isInstanceOf(ConstraintViolationException.class);
assertThatThrownBy(() -> service.create(AdministratorCreateCommand.builder().loginId("loginId").password("password").email("email").name("name").roleId(null).build())).isInstanceOf(ConstraintViolationException.class);
// uodate
assertThatThrownBy(() -> service.update(AdministratorUpdateCommand.builder().id(null).password("password").email("email").name("name").build())).isInstanceOf(ConstraintViolationException.class);
assertThatThrownBy(() -> service.update(AdministratorUpdateCommand.builder().id(1L).password(null).email("email").name("name").build())).isInstanceOf(ConstraintViolationException.class);
assertThatThrownBy(() -> service.update(AdministratorUpdateCommand.builder().id(1L).password("").email("email").name("name").build())).isInstanceOf(ConstraintViolationException.class);
assertThatThrownBy(() -> service.update(AdministratorUpdateCommand.builder().id(1L).password("password").email(null).name("name").build())).isInstanceOf(ConstraintViolationException.class);
assertThatThrownBy(() -> service.update(AdministratorUpdateCommand.builder().id(1L).password("password").email("").name("name").build())).isInstanceOf(ConstraintViolationException.class);
assertThatThrownBy(() -> service.update(AdministratorUpdateCommand.builder().id(1L).password("password").email("email").name(null).build())).isInstanceOf(ConstraintViolationException.class);
assertThatThrownBy(() -> service.update(AdministratorUpdateCommand.builder().id(1L).password("password").email("email").name("").build())).isInstanceOf(ConstraintViolationException.class);
// update
assertThatThrownBy(() -> service.update(AdministratorUpdateCommand.builder().id(null).password("password").email("email").name("name").roleId(1L).build())).isInstanceOf(ConstraintViolationException.class);
assertThatThrownBy(() -> service.update(AdministratorUpdateCommand.builder().id(1L).password(null).email("email").name("name").roleId(1L).build())).isInstanceOf(ConstraintViolationException.class);
assertThatThrownBy(() -> service.update(AdministratorUpdateCommand.builder().id(1L).password("").email("email").name("name").roleId(1L).build())).isInstanceOf(ConstraintViolationException.class);
assertThatThrownBy(() -> service.update(AdministratorUpdateCommand.builder().id(1L).password("password").email(null).name("name").roleId(1L).build())).isInstanceOf(ConstraintViolationException.class);
assertThatThrownBy(() -> service.update(AdministratorUpdateCommand.builder().id(1L).password("password").email("").name("name").roleId(1L).build())).isInstanceOf(ConstraintViolationException.class);
assertThatThrownBy(() -> service.update(AdministratorUpdateCommand.builder().id(1L).password("password").email("email").name(null).roleId(1L).build())).isInstanceOf(ConstraintViolationException.class);
assertThatThrownBy(() -> service.update(AdministratorUpdateCommand.builder().id(1L).password("password").email("email").name("").roleId(1L).build())).isInstanceOf(ConstraintViolationException.class);
assertThatThrownBy(() -> service.update(AdministratorUpdateCommand.builder().id(1L).password("password").email("email").name("name").roleId(null).build())).isInstanceOf(ConstraintViolationException.class);
// delete
assertThatThrownBy(() -> service.delete(null)).isInstanceOf(ConstraintViolationException.class);

View File

@ -132,7 +132,7 @@ class RoleServiceTest extends MariaDBTestEnv {
flushAndClear();
// then
assertThat(roleMenuRepository.findById(saveRole.getId())).isNotEmpty();
assertThat(roleMenuRepository.findAll()).size().isEqualTo(2);
}
@Test