diff --git a/src/main/java/com/titi/titi_user/adapter/in/web/api/CheckUsernameController.java b/src/main/java/com/titi/titi_auth/adapter/in/web/api/CheckUsernameController.java similarity index 84% rename from src/main/java/com/titi/titi_user/adapter/in/web/api/CheckUsernameController.java rename to src/main/java/com/titi/titi_auth/adapter/in/web/api/CheckUsernameController.java index 8f42be8..78a1b8a 100644 --- a/src/main/java/com/titi/titi_user/adapter/in/web/api/CheckUsernameController.java +++ b/src/main/java/com/titi/titi_auth/adapter/in/web/api/CheckUsernameController.java @@ -1,4 +1,4 @@ -package com.titi.titi_user.adapter.in.web.api; +package com.titi.titi_auth.adapter.in.web.api; import org.hibernate.validator.constraints.Length; import org.springframework.http.MediaType; @@ -16,13 +16,13 @@ import lombok.Builder; import lombok.RequiredArgsConstructor; -import com.titi.titi_user.application.port.in.CheckUsernameUseCase; -import com.titi.titi_user.common.TiTiUserBusinessCodes; +import com.titi.titi_auth.application.port.in.CheckUsernameUseCase; +import com.titi.titi_auth.common.TiTiAuthBusinessCodes; @Validated @RestController @RequiredArgsConstructor -class CheckUsernameController implements UserApi { +public class CheckUsernameController implements AuthApi { private final CheckUsernameUseCase checkUsernameUseCase; @@ -31,7 +31,7 @@ class CheckUsernameController implements UserApi { @GetMapping(value = "/members/check", produces = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity checkUsername(@NotBlank @Email @Length(max = 30) @RequestParam String username) { final CheckUsernameUseCase.Result result = this.checkUsernameUseCase.invoke(CheckUsernameUseCase.Command.builder().username(username).build()); - final TiTiUserBusinessCodes businessCodes = result.isPresent() ? TiTiUserBusinessCodes.ALREADY_EXISTS_USERNAME : TiTiUserBusinessCodes.DOES_NOT_EXIST_USERNAME; + final TiTiAuthBusinessCodes businessCodes = result.isPresent() ? TiTiAuthBusinessCodes.ALREADY_EXISTS_USERNAME : TiTiAuthBusinessCodes.DOES_NOT_EXIST_USERNAME; return ResponseEntity.status(businessCodes.getStatus()) .body( CheckUsernameResponseBody.builder() diff --git a/src/main/java/com/titi/titi_auth/adapter/out/persistence/FindAccountPortAdapter.java b/src/main/java/com/titi/titi_auth/adapter/out/persistence/FindAccountPortAdapter.java new file mode 100644 index 0000000..448ec5d --- /dev/null +++ b/src/main/java/com/titi/titi_auth/adapter/out/persistence/FindAccountPortAdapter.java @@ -0,0 +1,26 @@ +package com.titi.titi_auth.adapter.out.persistence; + +import java.util.Optional; + +import org.springframework.stereotype.Component; + +import lombok.RequiredArgsConstructor; + +import com.titi.titi_auth.application.port.out.persistence.FindAccountPort; +import com.titi.titi_auth.data.jpa.entity.mapper.EntityMapper; +import com.titi.titi_auth.data.jpa.repository.AccountEntityRepository; +import com.titi.titi_auth.domain.Account; + +@Component +@RequiredArgsConstructor +public class FindAccountPortAdapter implements FindAccountPort { + + private final AccountEntityRepository accountEntityRepository; + + @Override + public Optional invoke(Account account) { + return this.accountEntityRepository.findByEntity(EntityMapper.INSTANCE.toEntity(account)) + .map(EntityMapper.INSTANCE::toDomain); + } + +} diff --git a/src/main/java/com/titi/titi_user/application/port/in/CheckUsernameUseCase.java b/src/main/java/com/titi/titi_auth/application/port/in/CheckUsernameUseCase.java similarity index 80% rename from src/main/java/com/titi/titi_user/application/port/in/CheckUsernameUseCase.java rename to src/main/java/com/titi/titi_auth/application/port/in/CheckUsernameUseCase.java index cff0193..96ecf65 100644 --- a/src/main/java/com/titi/titi_user/application/port/in/CheckUsernameUseCase.java +++ b/src/main/java/com/titi/titi_auth/application/port/in/CheckUsernameUseCase.java @@ -1,4 +1,4 @@ -package com.titi.titi_user.application.port.in; +package com.titi.titi_auth.application.port.in; import lombok.Builder; @@ -20,4 +20,4 @@ record Result( } -} +} \ No newline at end of file diff --git a/src/main/java/com/titi/titi_auth/application/port/out/persistence/FindAccountPort.java b/src/main/java/com/titi/titi_auth/application/port/out/persistence/FindAccountPort.java new file mode 100644 index 0000000..6102b09 --- /dev/null +++ b/src/main/java/com/titi/titi_auth/application/port/out/persistence/FindAccountPort.java @@ -0,0 +1,11 @@ +package com.titi.titi_auth.application.port.out.persistence; + +import java.util.Optional; + +import com.titi.titi_auth.domain.Account; + +public interface FindAccountPort { + + Optional invoke(Account account); + +} diff --git a/src/main/java/com/titi/titi_auth/application/service/CheckUsernameService.java b/src/main/java/com/titi/titi_auth/application/service/CheckUsernameService.java new file mode 100644 index 0000000..a0948f5 --- /dev/null +++ b/src/main/java/com/titi/titi_auth/application/service/CheckUsernameService.java @@ -0,0 +1,25 @@ +package com.titi.titi_auth.application.service; + +import org.springframework.stereotype.Service; + +import lombok.RequiredArgsConstructor; + +import com.titi.titi_auth.application.port.in.CheckUsernameUseCase; +import com.titi.titi_auth.application.port.out.persistence.FindAccountPort; +import com.titi.titi_auth.domain.Account; + +@Service +@RequiredArgsConstructor +public class CheckUsernameService implements CheckUsernameUseCase { + + private final FindAccountPort findAccountPort; + + @Override + public Result invoke(Command command) { + final Account account = Account.builder().username(command.username()).build(); + return CheckUsernameUseCase.Result.builder() + .isPresent(this.findAccountPort.invoke(account).isPresent()) + .build(); + } + +} diff --git a/src/main/java/com/titi/titi_auth/common/TiTiAuthBusinessCodes.java b/src/main/java/com/titi/titi_auth/common/TiTiAuthBusinessCodes.java index 241ff4f..2d1d77c 100644 --- a/src/main/java/com/titi/titi_auth/common/TiTiAuthBusinessCodes.java +++ b/src/main/java/com/titi/titi_auth/common/TiTiAuthBusinessCodes.java @@ -13,6 +13,8 @@ public enum TiTiAuthBusinessCodes { MISMATCHED_AUTH_CODE(200, "AU1003", "The authentication code does not match."), REISSUE_ACCESS_TOKEN_SUCCESS(200, "AU1004", "Successfully reissued the Access Token."), REISSUE_ACCESS_TOKEN_FAILURE_INVALID_REFRESH_TOKEN(200, "AU1005", "The Refresh Token is invalid, so the reissuance of the Access Token has failed."), + DOES_NOT_EXIST_USERNAME(200, "AU1006", "The username does not exist."), + ALREADY_EXISTS_USERNAME(200, "AU1007", "The username already exists."), GENERATE_AUTH_CODE_FAILURE(500, "AU7000", "Failed to generate and transmit the authentication code. Please try again later."), VERIFY_AUTH_CODE_FAILURE(500, "AU7001", "Authentication code verification failed. Please try again later."), diff --git a/src/main/java/com/titi/titi_auth/data/jpa/entity/AccountEntity.java b/src/main/java/com/titi/titi_auth/data/jpa/entity/AccountEntity.java new file mode 100644 index 0000000..4b959c0 --- /dev/null +++ b/src/main/java/com/titi/titi_auth/data/jpa/entity/AccountEntity.java @@ -0,0 +1,45 @@ +package com.titi.titi_auth.data.jpa.entity; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import com.titi.infrastructure.persistence.jpa.entity.BaseEntity; +import com.titi.titi_auth.domain.AccountStatus; +import com.titi.titi_auth.domain.Authority; + +@Entity(name = "accounts") +@Getter +@Builder(toBuilder = true) +@AllArgsConstructor(access = AccessLevel.PROTECTED) +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class AccountEntity extends BaseEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(nullable = false) + private String username; + + @Column(nullable = false) + private String password; + + @Enumerated(value = EnumType.STRING) + @Column(nullable = false) + private Authority authority; + + @Enumerated(value = EnumType.STRING) + @Column(nullable = false) + private AccountStatus accountStatus; + +} diff --git a/src/main/java/com/titi/titi_auth/data/jpa/entity/mapper/EntityMapper.java b/src/main/java/com/titi/titi_auth/data/jpa/entity/mapper/EntityMapper.java new file mode 100644 index 0000000..62897d9 --- /dev/null +++ b/src/main/java/com/titi/titi_auth/data/jpa/entity/mapper/EntityMapper.java @@ -0,0 +1,18 @@ +package com.titi.titi_auth.data.jpa.entity.mapper; + +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import com.titi.titi_auth.data.jpa.entity.AccountEntity; +import com.titi.titi_auth.domain.Account; + +@Mapper +public interface EntityMapper { + + EntityMapper INSTANCE = Mappers.getMapper(EntityMapper.class); + + AccountEntity toEntity(Account account); + + Account toDomain(AccountEntity accountEntity); + +} diff --git a/src/main/java/com/titi/titi_auth/data/jpa/repository/AccountEntityRepository.java b/src/main/java/com/titi/titi_auth/data/jpa/repository/AccountEntityRepository.java new file mode 100644 index 0000000..28c2887 --- /dev/null +++ b/src/main/java/com/titi/titi_auth/data/jpa/repository/AccountEntityRepository.java @@ -0,0 +1,10 @@ +package com.titi.titi_auth.data.jpa.repository; + +import org.springframework.data.jpa.repository.JpaRepository; + +import com.titi.titi_auth.data.jpa.entity.AccountEntity; +import com.titi.titi_auth.data.jpa.repository.querydsl.AccountEntityQuerydsl; + +public interface AccountEntityRepository extends JpaRepository, AccountEntityQuerydsl { + +} diff --git a/src/main/java/com/titi/titi_auth/data/jpa/repository/querydsl/AccountEntityQuerydsl.java b/src/main/java/com/titi/titi_auth/data/jpa/repository/querydsl/AccountEntityQuerydsl.java new file mode 100644 index 0000000..e322600 --- /dev/null +++ b/src/main/java/com/titi/titi_auth/data/jpa/repository/querydsl/AccountEntityQuerydsl.java @@ -0,0 +1,11 @@ +package com.titi.titi_auth.data.jpa.repository.querydsl; + +import java.util.Optional; + +import com.titi.titi_auth.data.jpa.entity.AccountEntity; + +public interface AccountEntityQuerydsl { + + Optional findByEntity(AccountEntity accountEntity); + +} diff --git a/src/main/java/com/titi/titi_auth/data/jpa/repository/querydsl/AccountEntityQuerydslImpl.java b/src/main/java/com/titi/titi_auth/data/jpa/repository/querydsl/AccountEntityQuerydslImpl.java new file mode 100644 index 0000000..be06732 --- /dev/null +++ b/src/main/java/com/titi/titi_auth/data/jpa/repository/querydsl/AccountEntityQuerydslImpl.java @@ -0,0 +1,52 @@ +package com.titi.titi_auth.data.jpa.repository.querydsl; + +import static com.titi.titi_auth.data.jpa.entity.QAccountEntity.*; + +import java.util.Optional; + +import org.springframework.stereotype.Repository; + +import com.querydsl.core.types.dsl.BooleanExpression; +import com.querydsl.jpa.impl.JPAQueryFactory; +import lombok.RequiredArgsConstructor; + +import com.titi.titi_auth.data.jpa.entity.AccountEntity; + +@Repository +@RequiredArgsConstructor +public class AccountEntityQuerydslImpl implements AccountEntityQuerydsl { + + private final JPAQueryFactory jpaQueryFactory; + + @Override + public Optional findByEntity(AccountEntity entity) { + return Optional.ofNullable( + jpaQueryFactory + .selectFrom(accountEntity) + .where( + idEq(entity), + usernameEq(entity), + authorityEq(entity), + accountStatusEq(entity) + ) + .fetchOne() + ); + } + + private BooleanExpression idEq(AccountEntity entity) { + return entity.getId() != null ? accountEntity.id.eq(entity.getId()) : null; + } + + private BooleanExpression usernameEq(AccountEntity entity) { + return entity.getUsername() != null ? accountEntity.username.eq(entity.getUsername()) : null; + } + + private BooleanExpression authorityEq(AccountEntity entity) { + return entity.getAuthority() != null ? accountEntity.authority.eq(entity.getAuthority()) : null; + } + + private BooleanExpression accountStatusEq(AccountEntity entity) { + return entity.getAccountStatus() != null ? accountEntity.accountStatus.eq(entity.getAccountStatus()) : null; + } + +} diff --git a/src/main/java/com/titi/titi_auth/domain/Account.java b/src/main/java/com/titi/titi_auth/domain/Account.java new file mode 100644 index 0000000..c190b22 --- /dev/null +++ b/src/main/java/com/titi/titi_auth/domain/Account.java @@ -0,0 +1,14 @@ +package com.titi.titi_auth.domain; + +import lombok.Builder; + +@Builder +public record Account( + Long id, + String username, + String password, + Authority authority, + AccountStatus accountStatus +) { + +} diff --git a/src/main/java/com/titi/titi_auth/domain/AccountStatus.java b/src/main/java/com/titi/titi_auth/domain/AccountStatus.java new file mode 100644 index 0000000..2ef61d1 --- /dev/null +++ b/src/main/java/com/titi/titi_auth/domain/AccountStatus.java @@ -0,0 +1,33 @@ +package com.titi.titi_auth.domain; + +public enum AccountStatus { + /** + * The account is in a normal and usable state.
+ * The account owner can log in and access the application. + */ + ACTIVATED, + /** + * An account exists but is in an unusable state.
+ * This could be a temporary condition, or it might occur when the account owner deactivates the account without deleting it.
+ * Inactive accounts are typically eligible for reactivation. + */ + DEACTIVATED, + /** + * The account is temporarily suspended.
+ * This can occur due to security issues, payment problems, or transitions to a dormant state.
+ * In this state, the account owner cannot access the application. + */ + SUSPENDED, + /** + * The account is permanently suspended.
+ * This can occur due to violations of the terms of service, among other reasons.
+ * In this state, the account owner cannot access the application. + */ + BLOCKED, + /** + * The account has been permanently deleted.
+ * This typically occurs when the account owner initiates the deletion or when an administrator removes the account.
+ * Deleted accounts cannot be reactivated. + */ + DELETED +} diff --git a/src/main/java/com/titi/titi_auth/domain/Authority.java b/src/main/java/com/titi/titi_auth/domain/Authority.java new file mode 100644 index 0000000..6287eb7 --- /dev/null +++ b/src/main/java/com/titi/titi_auth/domain/Authority.java @@ -0,0 +1,5 @@ +package com.titi.titi_auth.domain; + +public enum Authority { + MEMBER, ADMIN +} diff --git a/src/main/java/com/titi/titi_user/application/service/CheckUsernameService.java b/src/main/java/com/titi/titi_user/application/service/CheckUsernameService.java deleted file mode 100644 index c19d8af..0000000 --- a/src/main/java/com/titi/titi_user/application/service/CheckUsernameService.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.titi.titi_user.application.service; - -import org.springframework.stereotype.Service; - -import lombok.RequiredArgsConstructor; - -import com.titi.titi_user.application.port.in.CheckUsernameUseCase; -import com.titi.titi_user.application.port.out.persistence.FindMemberPort; -import com.titi.titi_user.domain.member.Member; - -@Service -@RequiredArgsConstructor -class CheckUsernameService implements CheckUsernameUseCase { - - private final FindMemberPort findMemberPort; - - @Override - public Result invoke(Command command) { - final Member member = Member.builder().username(command.username()).build(); - return Result.builder() - .isPresent(this.findMemberPort.invoke(member).isPresent()) - .build(); - } - -} diff --git a/src/main/java/com/titi/titi_user/common/TiTiUserBusinessCodes.java b/src/main/java/com/titi/titi_user/common/TiTiUserBusinessCodes.java index 25661ec..cfb0a08 100644 --- a/src/main/java/com/titi/titi_user/common/TiTiUserBusinessCodes.java +++ b/src/main/java/com/titi/titi_user/common/TiTiUserBusinessCodes.java @@ -7,8 +7,6 @@ @AllArgsConstructor public enum TiTiUserBusinessCodes { - DOES_NOT_EXIST_USERNAME(200, "USR1000", "The username does not exist."), - ALREADY_EXISTS_USERNAME(200, "USR1001", "The username already exists."), REGISTER_MEMBER_SUCCESS(200, "USR1002", "Successfully completed the regular membership registration."), REGISTER_MEMBER_FAILURE_INVALID_AUTH_TOKEN(200, "USR1003", "The registration has failed due to an invalid Auth Token."), REGISTER_MEMBER_FAILURE_ALREADY_EXISTS_USERNAME(200, "USR1004", "The registration has failed as the username already exists."), diff --git a/src/test/java/com/titi/titi_user/adapter/in/web/api/CheckUsernameControllerTest.java b/src/test/java/com/titi/titi_auth/adapter/in/web/api/CheckUsernameControllerTest.java similarity index 83% rename from src/test/java/com/titi/titi_user/adapter/in/web/api/CheckUsernameControllerTest.java rename to src/test/java/com/titi/titi_auth/adapter/in/web/api/CheckUsernameControllerTest.java index 01d9f47..52112c9 100644 --- a/src/test/java/com/titi/titi_user/adapter/in/web/api/CheckUsernameControllerTest.java +++ b/src/test/java/com/titi/titi_auth/adapter/in/web/api/CheckUsernameControllerTest.java @@ -1,4 +1,4 @@ -package com.titi.titi_user.adapter.in.web.api; +package com.titi.titi_auth.adapter.in.web.api; import static org.mockito.ArgumentMatchers.*; import static org.mockito.BDDMockito.*; @@ -19,8 +19,8 @@ import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.ResultActions; -import com.titi.titi_user.application.port.in.CheckUsernameUseCase; -import com.titi.titi_user.common.TiTiUserBusinessCodes; +import com.titi.titi_auth.application.port.in.CheckUsernameUseCase; +import com.titi.titi_auth.common.TiTiAuthBusinessCodes; @WebMvcTest(controllers = CheckUsernameController.class) class CheckUsernameControllerTest { @@ -33,13 +33,13 @@ class CheckUsernameControllerTest { private static Stream whenSuccessToCheckUsername() { return Stream.of( - Arguments.of(false, TiTiUserBusinessCodes.DOES_NOT_EXIST_USERNAME), - Arguments.of(true, TiTiUserBusinessCodes.ALREADY_EXISTS_USERNAME) + Arguments.of(false, TiTiAuthBusinessCodes.DOES_NOT_EXIST_USERNAME), + Arguments.of(true, TiTiAuthBusinessCodes.ALREADY_EXISTS_USERNAME) ); } private ResultActions mockCheckUsername(String username) throws Exception { - return mockMvc.perform(get("/api/user/members/check") + return mockMvc.perform(get("/api/auth/members/check") .queryParam("username", username) .accept(MediaType.APPLICATION_JSON) .with(csrf())); @@ -48,7 +48,7 @@ private ResultActions mockCheckUsername(String username) throws Exception { @ParameterizedTest @MethodSource @WithMockUser - void whenSuccessToCheckUsername(boolean isPresent, TiTiUserBusinessCodes businessCodes) throws Exception { + void whenSuccessToCheckUsername(boolean isPresent, TiTiAuthBusinessCodes businessCodes) throws Exception { // given given(checkUsernameUseCase.invoke(any())).willReturn(CheckUsernameUseCase.Result.builder().isPresent(isPresent).build()); final String username = "test@gmail.com"; diff --git a/src/test/java/com/titi/titi_auth/adapter/out/persistence/FindAccountPortAdapterTest.java b/src/test/java/com/titi/titi_auth/adapter/out/persistence/FindAccountPortAdapterTest.java new file mode 100644 index 0000000..2a0f974 --- /dev/null +++ b/src/test/java/com/titi/titi_auth/adapter/out/persistence/FindAccountPortAdapterTest.java @@ -0,0 +1,65 @@ +package com.titi.titi_auth.adapter.out.persistence; + +import static org.assertj.core.api.Assertions.*; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.BDDMockito.*; + +import java.util.Optional; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import com.titi.titi_auth.data.jpa.entity.AccountEntity; +import com.titi.titi_auth.data.jpa.repository.AccountEntityRepository; +import com.titi.titi_auth.domain.Account; +import com.titi.titi_auth.domain.AccountStatus; +import com.titi.titi_auth.domain.Authority; + +@ExtendWith(MockitoExtension.class) +class FindAccountPortAdapterTest { + + @Mock + private AccountEntityRepository accountEntityRepository; + + @InjectMocks + private FindAccountPortAdapter findAccountPortAdapter; + + @Test + void whenAccountEntityIsPresent() { + // given + final String username = "test@gmail.com"; + final AccountEntity mockAccountEntity = AccountEntity.builder() + .id(1L) + .username(username) + .password("password") + .accountStatus(AccountStatus.ACTIVATED) + .authority(Authority.MEMBER) + .build(); + given(accountEntityRepository.findByEntity(any())).willReturn(Optional.of(mockAccountEntity)); + + // when + final Account account = Account.builder().username(username).build(); + final Optional result = findAccountPortAdapter.invoke(account); + + // then + assertThat(result.isPresent()).isTrue(); + } + + @Test + void whenAccountEntityIsEmpty() { + // given + final String username = "test@gmail.com"; + given(accountEntityRepository.findByEntity(any())).willReturn(Optional.empty()); + + // when + final Account account = Account.builder().username(username).build(); + final Optional result = findAccountPortAdapter.invoke(account); + + // then + assertThat(result.isEmpty()).isTrue(); + } + +} \ No newline at end of file diff --git a/src/test/java/com/titi/titi_auth/adapter/out/persistence/querydsl/AccountEntityQuerydslImplTest.java b/src/test/java/com/titi/titi_auth/adapter/out/persistence/querydsl/AccountEntityQuerydslImplTest.java new file mode 100644 index 0000000..8bad52d --- /dev/null +++ b/src/test/java/com/titi/titi_auth/adapter/out/persistence/querydsl/AccountEntityQuerydslImplTest.java @@ -0,0 +1,72 @@ +package com.titi.titi_auth.adapter.out.persistence.querydsl; + +import static org.assertj.core.api.Assertions.*; + +import java.util.Optional; + +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +import com.titi.JpaTestBase; +import com.titi.titi_auth.data.jpa.entity.AccountEntity; +import com.titi.titi_auth.data.jpa.repository.AccountEntityRepository; +import com.titi.titi_auth.data.jpa.repository.querydsl.AccountEntityQuerydslImpl; +import com.titi.titi_auth.domain.AccountStatus; +import com.titi.titi_auth.domain.Authority; + +class AccountEntityQuerydslImplTest extends JpaTestBase { + + @Autowired + private AccountEntityRepository accountEntityRepository; + + @Autowired + private AccountEntityQuerydslImpl accountEntityQuerydsl; + + @Nested + class FindByEntity { + + @Test + void success() { + // given + final AccountEntity savedEntity = accountEntityRepository.save( + AccountEntity.builder() + .username("test@gmail.com") + .password("password") + .accountStatus(AccountStatus.ACTIVATED) + .authority(Authority.MEMBER) + .build() + ); + + // when + final AccountEntity entity = AccountEntity.builder() + .id(savedEntity.getId()) + .username(savedEntity.getUsername()) + .authority(savedEntity.getAuthority()) + .build(); + final Optional result = accountEntityQuerydsl.findByEntity(entity); + + // then + assertThat(result.isPresent()).isTrue(); + } + + @Test + void fail() { + // given + final AccountEntity entity = AccountEntity.builder() + .id(1L) + .username("test@gmail.com") + .accountStatus(AccountStatus.ACTIVATED) + .authority(Authority.MEMBER) + .build(); + + // when + final Optional result = accountEntityQuerydsl.findByEntity(entity); + + // then + assertThat(result.isEmpty()).isTrue(); + } + + } + +} \ No newline at end of file diff --git a/src/test/java/com/titi/titi_user/application/service/CheckUsernameServiceTest.java b/src/test/java/com/titi/titi_auth/application/service/CheckUsernameServiceTest.java similarity index 64% rename from src/test/java/com/titi/titi_user/application/service/CheckUsernameServiceTest.java rename to src/test/java/com/titi/titi_auth/application/service/CheckUsernameServiceTest.java index 38c7218..2256aa8 100644 --- a/src/test/java/com/titi/titi_user/application/service/CheckUsernameServiceTest.java +++ b/src/test/java/com/titi/titi_auth/application/service/CheckUsernameServiceTest.java @@ -1,7 +1,9 @@ -package com.titi.titi_user.application.service; +package com.titi.titi_auth.application.service; import static org.assertj.core.api.Assertions.*; +import static org.mockito.ArgumentMatchers.*; import static org.mockito.BDDMockito.*; +import static org.mockito.Mockito.*; import java.util.Optional; @@ -11,26 +13,25 @@ import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -import com.titi.titi_user.application.port.in.CheckUsernameUseCase; -import com.titi.titi_user.application.port.out.persistence.FindMemberPort; -import com.titi.titi_user.domain.member.Member; +import com.titi.titi_auth.application.port.in.CheckUsernameUseCase; +import com.titi.titi_auth.application.port.out.persistence.FindAccountPort; +import com.titi.titi_auth.domain.Account; @ExtendWith(MockitoExtension.class) class CheckUsernameServiceTest { - @Mock - private FindMemberPort findMemberPort; + private FindAccountPort findAccountPort; @InjectMocks private CheckUsernameService checkUsernameService; @Test - void whenMemberIsPresentWithUsernameThenReturnTrue() { - // given + void whenAccountIsPresentWithUsernameThenReturnTrue() { + // given final String username = "test@gmail.com"; - given(findMemberPort.invoke(any())).willReturn(Optional.of(mock(Member.class))); + given(findAccountPort.invoke(any())).willReturn(Optional.of(mock(Account.class))); - // when + // when final CheckUsernameUseCase.Result result = checkUsernameService.invoke(CheckUsernameUseCase.Command.builder().username(username).build()); // then @@ -40,16 +41,15 @@ void whenMemberIsPresentWithUsernameThenReturnTrue() { @Test void whenMemberIsNotPresentWithUsernameThenReturnFalse() { - // given + // given final String username = "test@gmail.com"; - given(findMemberPort.invoke(any())).willReturn(Optional.empty()); + given(findAccountPort.invoke(any())).willReturn(Optional.empty()); - // when + // when final CheckUsernameUseCase.Result result = checkUsernameService.invoke(CheckUsernameUseCase.Command.builder().username(username).build()); // then assertThat(result).isNotNull(); assertThat(result.isPresent()).isFalse(); } - } \ No newline at end of file