diff --git a/src/main/java/com/syncd/adapter/out/openai/ChatGPTAdapter.java b/src/main/java/com/syncd/adapter/out/openai/ChatGPTAdapter.java index b7c9cfb..3aba68c 100644 --- a/src/main/java/com/syncd/adapter/out/openai/ChatGPTAdapter.java +++ b/src/main/java/com/syncd/adapter/out/openai/ChatGPTAdapter.java @@ -4,6 +4,7 @@ import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import com.syncd.application.port.out.openai.ChatGPTPort; +import com.syncd.configs.ChatGPTConfig; import com.syncd.dto.ChatRequestDto; import com.syncd.dto.MakeUserStoryResponseDto; import com.syncd.dto.OpenAIToken; diff --git a/src/main/java/com/syncd/application/service/LoginService.java b/src/main/java/com/syncd/application/service/LoginService.java index f5209ea..fe6ba17 100644 --- a/src/main/java/com/syncd/application/service/LoginService.java +++ b/src/main/java/com/syncd/application/service/LoginService.java @@ -80,7 +80,13 @@ private String getAccessToken(String authorizationCode, String registrationId, S System.out.print(tokenUri); ResponseEntity responseNode = restTemplate.exchange(tokenUri, HttpMethod.POST, entity, JsonNode.class); +// if (responseNode.getStatusCode() != HttpStatus.OK) { +// throw new RuntimeException("Failed to get access token"); +// } JsonNode accessTokenNode = responseNode.getBody(); +// if (accessTokenNode == null || !accessTokenNode.has("access_token")) { +// throw new RuntimeException("Access token is missing in the response"); +// } return accessTokenNode.get("access_token").asText(); } private JsonNode getUserResource(String accessToken, String registrationId) { diff --git a/src/main/java/com/syncd/application/service/UserService.java b/src/main/java/com/syncd/application/service/UserService.java index c4298c7..4ee31bd 100644 --- a/src/main/java/com/syncd/application/service/UserService.java +++ b/src/main/java/com/syncd/application/service/UserService.java @@ -2,24 +2,24 @@ import com.syncd.application.port.in.GetAllRoomsByUserIdUsecase; import com.syncd.application.port.in.GetUserInfoUsecase; -import com.syncd.application.port.in.RegitsterUserUsecase; +//import com.syncd.application.port.in.RegitsterUserUsecase; import com.syncd.application.port.out.autentication.AuthenticationPort; import com.syncd.application.port.out.persistence.user.ReadUserPort; import com.syncd.application.port.out.persistence.user.WriteUserPort; import com.syncd.domain.user.User; -import com.syncd.dto.TokenDto; -import com.syncd.dto.UserForTokenDto; +//import com.syncd.dto.TokenDto; +//import com.syncd.dto.UserForTokenDto; import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Primary; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.core.userdetails.UsernameNotFoundException; +//import org.springframework.security.core.userdetails.UserDetails; +//import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Service; @Service @Primary @RequiredArgsConstructor -public class UserService implements RegitsterUserUsecase, GetUserInfoUsecase { +public class UserService implements GetUserInfoUsecase { private final ReadUserPort readUserPort; private final WriteUserPort writeUserPort; @@ -27,17 +27,21 @@ public class UserService implements RegitsterUserUsecase, GetUserInfoUsecase { private final GetAllRoomsByUserIdUsecase getAllRoomsByUserIdUsecase; - @Override - public RegisterUserResponseDto registerUser(RegisterUserRequestDto registerDto){ - String userId = writeUserPort.createUser(registerDto.name(), registerDto.email(),"").value(); - TokenDto tokens = authenticationPort.GetJwtTokens(new UserForTokenDto(userId)); - return new RegisterUserResponseDto(tokens.accessToken(), tokens.refreshToken()); - } +// @Override +// public RegisterUserResponseDto registerUser(RegisterUserRequestDto registerDto){ +// String userId = writeUserPort.createUser(registerDto.name(), registerDto.email(),"").value(); +// TokenDto tokens = authenticationPort.GetJwtTokens(new UserForTokenDto(userId)); +// return new RegisterUserResponseDto(tokens.accessToken(), tokens.refreshToken()); +// } @Override public GetUserInfoResponseDto getUserInfo(String userId) { User user = readUserPort.findByUserId(userId); + if (user == null) { + throw new RuntimeException("User not found with ID: " + userId); + } + GetAllRoomsByUserIdUsecase.GetAllRoomsByUserIdResponseDto projects = getAllRoomsByUserIdUsecase.getAllRoomsByUserId(userId); return new GetUserInfoResponseDto(userId, user.getName(), user.getProfileImg(), user.getEmail(), projects.projects()); diff --git a/src/main/java/com/syncd/adapter/out/liveblock/AppConfig.java b/src/main/java/com/syncd/configs/AppConfig.java similarity index 88% rename from src/main/java/com/syncd/adapter/out/liveblock/AppConfig.java rename to src/main/java/com/syncd/configs/AppConfig.java index b10b0ed..853d56f 100644 --- a/src/main/java/com/syncd/adapter/out/liveblock/AppConfig.java +++ b/src/main/java/com/syncd/configs/AppConfig.java @@ -1,4 +1,4 @@ -package com.syncd.adapter.out.liveblock; +package com.syncd.configs; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/src/main/java/com/syncd/adapter/out/openai/ChatGPTConfig.java b/src/main/java/com/syncd/configs/ChatGPTConfig.java similarity index 94% rename from src/main/java/com/syncd/adapter/out/openai/ChatGPTConfig.java rename to src/main/java/com/syncd/configs/ChatGPTConfig.java index e2ca912..dbe54c1 100644 --- a/src/main/java/com/syncd/adapter/out/openai/ChatGPTConfig.java +++ b/src/main/java/com/syncd/configs/ChatGPTConfig.java @@ -1,4 +1,4 @@ -package com.syncd.adapter.out.openai; +package com.syncd.configs; import org.springframework.beans.factory.annotation.Value; diff --git a/src/main/java/com/syncd/adapter/out/persistence/MongoConfig.java b/src/main/java/com/syncd/configs/MongoConfig.java similarity index 90% rename from src/main/java/com/syncd/adapter/out/persistence/MongoConfig.java rename to src/main/java/com/syncd/configs/MongoConfig.java index 71c2e6f..873b3c9 100644 --- a/src/main/java/com/syncd/adapter/out/persistence/MongoConfig.java +++ b/src/main/java/com/syncd/configs/MongoConfig.java @@ -1,4 +1,4 @@ -package com.syncd.adapter.out.persistence; +package com.syncd.configs; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/src/main/java/com/syncd/adapter/out/s3/S3Config.java b/src/main/java/com/syncd/configs/S3Config.java similarity index 96% rename from src/main/java/com/syncd/adapter/out/s3/S3Config.java rename to src/main/java/com/syncd/configs/S3Config.java index 45d38d0..c86218d 100644 --- a/src/main/java/com/syncd/adapter/out/s3/S3Config.java +++ b/src/main/java/com/syncd/configs/S3Config.java @@ -1,4 +1,4 @@ -package com.syncd.adapter.out.s3; +package com.syncd.configs; import com.amazonaws.auth.AWSStaticCredentialsProvider; import com.amazonaws.auth.BasicAWSCredentials; diff --git a/src/main/java/com/syncd/adapter/in/web/WebConfig.java b/src/main/java/com/syncd/configs/WebConfig.java similarity index 94% rename from src/main/java/com/syncd/adapter/in/web/WebConfig.java rename to src/main/java/com/syncd/configs/WebConfig.java index c2afa53..694b010 100644 --- a/src/main/java/com/syncd/adapter/in/web/WebConfig.java +++ b/src/main/java/com/syncd/configs/WebConfig.java @@ -1,4 +1,4 @@ -package com.syncd.adapter.in.web; +package com.syncd.configs; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.CorsRegistry; diff --git a/src/main/java/com/syncd/adapter/in/web/WebSecurityConfig.java b/src/main/java/com/syncd/configs/WebSecurityConfig.java similarity index 97% rename from src/main/java/com/syncd/adapter/in/web/WebSecurityConfig.java rename to src/main/java/com/syncd/configs/WebSecurityConfig.java index 1feb5f2..3bd1d65 100644 --- a/src/main/java/com/syncd/adapter/in/web/WebSecurityConfig.java +++ b/src/main/java/com/syncd/configs/WebSecurityConfig.java @@ -1,4 +1,4 @@ -package com.syncd.adapter.in.web; +package com.syncd.configs; import com.syncd.application.port.in.JwtAuthenticationFilterUsecase; import com.syncd.application.port.in.ResolveTokenUsecase; diff --git a/src/test/java/application/service/LoginServiceTest.java b/src/test/java/application/service/LoginServiceTest.java new file mode 100644 index 0000000..a820a53 --- /dev/null +++ b/src/test/java/application/service/LoginServiceTest.java @@ -0,0 +1,65 @@ +package application.service; + +import com.syncd.application.port.in.GenerateTokenUsecase; +import com.syncd.application.port.out.persistence.user.ReadUserPort; +import com.syncd.application.port.out.persistence.user.WriteUserPort; +import com.syncd.application.service.LoginService; +import com.syncd.dto.TokenDto; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.springframework.web.client.RestTemplate; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.when; + +public class LoginServiceTest { + + @Mock + private RestTemplate restTemplate; + + @Mock + private WriteUserPort writeUserPort; + + @Mock + private GenerateTokenUsecase generateTokenUsecase; + + @Mock + private ReadUserPort readUserPort; + + @InjectMocks + private LoginService loginService; + + @BeforeEach + void setUp() { + MockitoAnnotations.initMocks(this); + } + + @Test + void testSocialLoginWithGoogleRegistrationId() { + // Given + String authorizationCode = "sample_authorization_code"; + String registrationId = "google"; + + // Mocking the behavior of restTemplate.exchange(...) method + // Here you should mock the behavior to return a proper response entity + // For simplicity, let's assume it returns a valid response node + // when calling with the given parameters + // For actual implementation, you should define the behavior according to your needs + // For example: + // when(restTemplate.exchange(anyString(), any(), any(), eq(JsonNode.class))) + // .thenReturn(new ResponseEntity<>(mockResponseNode, HttpStatus.OK)); + + // When + TokenDto tokenDto = loginService.socialLogin(authorizationCode, registrationId); + + // Then + // Assert that the returned tokenDto is not null + // Add more assertions based on your actual implementation + // For example, you can assert that the generated access token is not empty + assertEquals("google", registrationId); + // Add more assertions based on your actual implementation + } +} diff --git a/src/test/java/application/service/UserServiceTest.java b/src/test/java/application/service/UserServiceTest.java new file mode 100644 index 0000000..6dba461 --- /dev/null +++ b/src/test/java/application/service/UserServiceTest.java @@ -0,0 +1,85 @@ +package application.service; + +import com.syncd.application.port.in.GetAllRoomsByUserIdUsecase; +import com.syncd.application.port.out.persistence.user.ReadUserPort; +import com.syncd.domain.user.User; +import com.syncd.application.service.UserService; +import com.syncd.enums.Role; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.Mockito.when; + +public class UserServiceTest { + + @Mock + private ReadUserPort readUserPort; + + @Mock + private GetAllRoomsByUserIdUsecase getAllRoomsByUserIdUsecase; + + @InjectMocks + private UserService userService; + + @BeforeEach + public void setUp() { + MockitoAnnotations.openMocks(this); + } + + @Test + public void testGetUserInfo_UserNotFound() { + // Given + String userId = "user123"; + + // When + when(readUserPort.findByUserId(userId)).thenReturn(null); + + // Then + assertThrows(RuntimeException.class, () -> { + userService.getUserInfo(userId); + }); + } + + @Test + public void testGetUserInfo() { + // Given + String userId = "user123"; + User user = new User(); + user.setId(userId); + user.setName("syncd"); + user.setEmail("syncd.doe@example.com"); + user.setProfileImg("profile.jpg"); + + GetAllRoomsByUserIdUsecase.ProjectForGetAllInfoAboutRoomsByUserIdResponseDto project1 = + new GetAllRoomsByUserIdUsecase.ProjectForGetAllInfoAboutRoomsByUserIdResponseDto( + "project1", "1", "description1", Role.HOST, List.of("user1@example.com"), 0, "2024-05-19"); + GetAllRoomsByUserIdUsecase.ProjectForGetAllInfoAboutRoomsByUserIdResponseDto project2 = + new GetAllRoomsByUserIdUsecase.ProjectForGetAllInfoAboutRoomsByUserIdResponseDto( + "project2", "2", "description2", Role.MEMBER, List.of("user2@example.com"), 50, "2024-05-20"); + GetAllRoomsByUserIdUsecase.GetAllRoomsByUserIdResponseDto projects = + new GetAllRoomsByUserIdUsecase.GetAllRoomsByUserIdResponseDto(userId, List.of(project1, project2)); + + // When + when(readUserPort.findByUserId(userId)).thenReturn(user); + when(getAllRoomsByUserIdUsecase.getAllRoomsByUserId(userId)).thenReturn(projects); + + // Act + UserService.GetUserInfoResponseDto response = userService.getUserInfo(userId); + + // Then + assertEquals(userId, response.userId()); + assertEquals("syncd", response.name()); + assertEquals("syncd.doe@example.com", response.email()); + assertEquals("profile.jpg", response.img()); + assertEquals(2, response.projects().size()); + assertEquals("project1", response.projects().get(0).name()); + assertEquals("project2", response.projects().get(1).name()); + } +} diff --git a/src/test/java/domain/user/UserInProjectTest.java b/src/test/java/domain/user/UserInProjectTest.java new file mode 100644 index 0000000..ec444b5 --- /dev/null +++ b/src/test/java/domain/user/UserInProjectTest.java @@ -0,0 +1,52 @@ +package domain.user; + +import com.syncd.domain.user.User; +import com.syncd.enums.Role; +import com.syncd.domain.project.UserInProject; +import org.junit.jupiter.api.Test; +import java.util.Arrays; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class UserInProjectTest { + + @Test + public void testUserInProjectsFromUsers() { + // 호스트 사용자 ID + String hostId = "host123"; + + // 멤버 사용자 리스트 생성 + User user1 = new User(); + user1.setId("1"); + user1.setName("donggni"); + user1.setEmail("donggni@example.com"); + user1.setProfileImg("profile1.jpg"); + + User user2 = new User(); + user2.setId("2"); + user2.setName("jalju"); + user2.setEmail("jalju.smith@example.com"); + user2.setProfileImg("profile2.jpg"); + + List members = Arrays.asList(user1, user2); + + // UserInProject 리스트 생성 + List userInProjects = UserInProject.userInProjectsFromUsers(hostId, members); + + // 예상 결과 + assertEquals(3, userInProjects.size()); + + // 호스트 검증 + assertEquals("host123", userInProjects.get(0).getUserId()); + assertEquals(Role.HOST, userInProjects.get(0).getRole()); + + // 멤버 검증 + assertEquals("1", userInProjects.get(1).getUserId()); + assertEquals(Role.MEMBER, userInProjects.get(1).getRole()); + + assertEquals("2", userInProjects.get(2).getUserId()); + assertEquals(Role.MEMBER, userInProjects.get(2).getRole()); + } +} +