From f32da42ff0dd16bac220baf223fb81e2dc30e111 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A3=BC=EC=96=B4=EC=A7=84=EC=82=AC=EB=9E=91=28eojinjoo?= =?UTF-8?q?=29?= Date: Tue, 12 Mar 2024 03:09:48 +0900 Subject: [PATCH 001/141] feat: test /poke/new --- build.gradle | 2 + .../app/presentation/poke/PokeController.java | 33 +++++++++------- .../org/sopt/app/AppApplicationTests.java | 8 ++++ .../app/application/FriendServiceTest.java | 21 ++++++++++ .../postgres/FriendRepositoryTest.java | 28 +++++++++++++ .../app/presentation/PokeControllerTest.java | 39 +++++++++++++++++++ src/test/resources/application.yml | 9 +++++ 7 files changed, 127 insertions(+), 13 deletions(-) create mode 100644 src/test/java/org/sopt/app/AppApplicationTests.java create mode 100644 src/test/java/org/sopt/app/application/FriendServiceTest.java create mode 100644 src/test/java/org/sopt/app/interfaces/postgres/FriendRepositoryTest.java create mode 100644 src/test/java/org/sopt/app/presentation/PokeControllerTest.java create mode 100644 src/test/resources/application.yml diff --git a/build.gradle b/build.gradle index 255e60f2..af0b8936 100644 --- a/build.gradle +++ b/build.gradle @@ -86,6 +86,8 @@ dependencies { // test testImplementation 'org.springframework.boot:spring-boot-starter-test' + testImplementation 'org.springframework.security:spring-security-test' + implementation 'com.google.code.gson:gson:2.8.7' // slack implementation 'com.slack.api:slack-api-client:1.30.0' diff --git a/src/main/java/org/sopt/app/presentation/poke/PokeController.java b/src/main/java/org/sopt/app/presentation/poke/PokeController.java index e67dbe85..7823e6d8 100644 --- a/src/main/java/org/sopt/app/presentation/poke/PokeController.java +++ b/src/main/java/org/sopt/app/presentation/poke/PokeController.java @@ -5,26 +5,32 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.security.SecurityRequirement; - +import java.util.List; +import java.util.Objects; import lombok.RequiredArgsConstructor; import lombok.val; import org.sopt.app.application.poke.FriendService; import org.sopt.app.domain.entity.User; import org.sopt.app.domain.enums.Friendship; import org.sopt.app.facade.PokeFacade; -import org.sopt.app.presentation.poke.PokeResponse.*; +import org.sopt.app.presentation.poke.PokeResponse.AllRelationFriendList; +import org.sopt.app.presentation.poke.PokeResponse.Friend; +import org.sopt.app.presentation.poke.PokeResponse.FriendList; +import org.sopt.app.presentation.poke.PokeResponse.PokeMessageList; +import org.sopt.app.presentation.poke.PokeResponse.PokeToMeHistoryList; +import org.sopt.app.presentation.poke.PokeResponse.SimplePokeProfile; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.data.web.PageableDefault; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.security.core.annotation.AuthenticationPrincipal; -import org.springframework.web.bind.annotation.*; -import java.util.List; -import java.util.Objects; - import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController @@ -38,19 +44,20 @@ public class PokeController { @GetMapping("/random-user") public ResponseEntity> getRandomUserForNew( - @AuthenticationPrincipal User user + @AuthenticationPrincipal User user ) { val result = pokeFacade.getRecommendUserForNew( - user.getPlaygroundToken(), - user.getPlaygroundId(), - user.getId() + user.getPlaygroundToken(), + user.getPlaygroundId(), + user.getId() ); return ResponseEntity.ok(result); } + @Operation(summary = "신규 유저인지 조회") @GetMapping("/new") public ResponseEntity getPokeList( - @AuthenticationPrincipal User user + @AuthenticationPrincipal User user ) { val result = friendService.getIsNewUser(user.getId()); val response = PokeResponse.IsNew.of(result); @@ -59,7 +66,7 @@ public ResponseEntity getPokeList( @GetMapping("/friend/random-user") public ResponseEntity> getRandomFriendsOfUsersFriend( - @AuthenticationPrincipal User user + @AuthenticationPrincipal User user ) { val result = pokeFacade.getRecommendFriendsOfUsersFriend(user); return ResponseEntity.ok(result); @@ -134,7 +141,7 @@ public ResponseEntity getAllOfPokeMe( @AuthenticationPrincipal User user, // TODO : Notification List 에서도 기본 Size 요구사항이 25 개면 yaml 에서 속성 관리하기 @PageableDefault(size = 25, sort = "createdAt", direction = Sort.Direction.DESC) Pageable pageable - ) { + ) { val response = pokeFacade.getAllPokeMeHistory(user, pageable); return ResponseEntity.ok(response); } diff --git a/src/test/java/org/sopt/app/AppApplicationTests.java b/src/test/java/org/sopt/app/AppApplicationTests.java new file mode 100644 index 00000000..3902bfb6 --- /dev/null +++ b/src/test/java/org/sopt/app/AppApplicationTests.java @@ -0,0 +1,8 @@ +package org.sopt.app; + +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +public class AppApplicationTests { + +} \ No newline at end of file diff --git a/src/test/java/org/sopt/app/application/FriendServiceTest.java b/src/test/java/org/sopt/app/application/FriendServiceTest.java new file mode 100644 index 00000000..43c74ad9 --- /dev/null +++ b/src/test/java/org/sopt/app/application/FriendServiceTest.java @@ -0,0 +1,21 @@ +package org.sopt.app.application; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.sopt.app.application.poke.FriendService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +public class FriendServiceTest { + + @Autowired + private FriendService friendService; + + @Test + @DisplayName("200 - getIsNewUserSuccess") + void getIsNewUserSuccess() { + Assertions.assertEquals(true, friendService.getIsNewUser(1L)); + } +} \ No newline at end of file diff --git a/src/test/java/org/sopt/app/interfaces/postgres/FriendRepositoryTest.java b/src/test/java/org/sopt/app/interfaces/postgres/FriendRepositoryTest.java new file mode 100644 index 00000000..4be54529 --- /dev/null +++ b/src/test/java/org/sopt/app/interfaces/postgres/FriendRepositoryTest.java @@ -0,0 +1,28 @@ +package org.sopt.app.interfaces.postgres; + +import java.util.List; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +public class FriendRepositoryTest { + + @Autowired + private FriendRepository friendRepository; + + @Test + @DisplayName("200 - findAllByFriendUserId") + void findAllByFriendUserIdSuccess() { + Assertions.assertEquals(List.of(), friendRepository.findAllByFriendUserId(1L)); + } + + @Test + @DisplayName("200 - findAllByUserIdAndFriendUserIdIn") + void findAllByUserIdAndFriendUserIdInSuccess() { + Assertions.assertEquals(List.of(), friendRepository.findAllByUserIdAndFriendUserIdIn(1L, List.of(2L))); + } + +} \ No newline at end of file diff --git a/src/test/java/org/sopt/app/presentation/PokeControllerTest.java b/src/test/java/org/sopt/app/presentation/PokeControllerTest.java new file mode 100644 index 00000000..8007fd0a --- /dev/null +++ b/src/test/java/org/sopt/app/presentation/PokeControllerTest.java @@ -0,0 +1,39 @@ +package org.sopt.app.presentation; + +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import com.google.gson.Gson; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.sopt.app.domain.entity.User; +import org.sopt.app.presentation.poke.PokeResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; +import org.springframework.transaction.annotation.Transactional; + +@Transactional +@AutoConfigureMockMvc +@SpringBootTest +public class PokeControllerTest { + + private final String BASE_URI = "/api/v2/poke"; + @Autowired + private MockMvc mockMvc; + + @Test + @DisplayName("200 - 신규 유저인지 조회") + void getPokeListSuccess() throws Exception { + mockMvc.perform(MockMvcRequestBuilders + .get(BASE_URI + "/new") + .with(SecurityMockMvcRequestPostProcessors.user(new User("주어랑", "주어랑1267", 26L)))) + .andExpect(status().isOk()) + .andExpect(content().string(new Gson().toJson(PokeResponse.IsNew.of(true)))) + .andDo(print()); + } +} diff --git a/src/test/resources/application.yml b/src/test/resources/application.yml new file mode 100644 index 00000000..ac60be24 --- /dev/null +++ b/src/test/resources/application.yml @@ -0,0 +1,9 @@ +spring: + application: + name: app-server + profiles: + active: test + +springdoc: + swagger-ui: + path: /swagger-ui.html \ No newline at end of file From c15df5ed770a72d3166fac4622adb8f1c1fa9040 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A3=BC=EC=96=B4=EC=A7=84=EC=82=AC=EB=9E=91=28eojinjoo?= =?UTF-8?q?=29?= Date: Fri, 15 Mar 2024 01:58:40 +0900 Subject: [PATCH 002/141] feat: test /description/main --- build.gradle | 1 + .../application/DescriptionServiceTest.java | 33 +++++++++++++ .../postgres/MainDescriptionTest.java | 20 ++++++++ .../DescriptionControllerTest.java | 46 +++++++++++++++++++ 4 files changed, 100 insertions(+) create mode 100644 src/test/java/org/sopt/app/application/DescriptionServiceTest.java create mode 100644 src/test/java/org/sopt/app/interfaces/postgres/MainDescriptionTest.java create mode 100644 src/test/java/org/sopt/app/presentation/DescriptionControllerTest.java diff --git a/build.gradle b/build.gradle index af0b8936..e54c4122 100644 --- a/build.gradle +++ b/build.gradle @@ -11,6 +11,7 @@ plugins { //querydsl 추가 id "com.ewerk.gradle.plugins.querydsl" version "1.0.10" id 'java' + id 'jacoco' } group = 'org.sopt' diff --git a/src/test/java/org/sopt/app/application/DescriptionServiceTest.java b/src/test/java/org/sopt/app/application/DescriptionServiceTest.java new file mode 100644 index 00000000..66d07655 --- /dev/null +++ b/src/test/java/org/sopt/app/application/DescriptionServiceTest.java @@ -0,0 +1,33 @@ +package org.sopt.app.application; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.sopt.app.application.description.DescriptionInfo; +import org.sopt.app.application.description.DescriptionService; +import org.sopt.app.domain.enums.UserStatus; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +public class DescriptionServiceTest { + + @Autowired + private DescriptionService descriptionService; + + @Test + @DisplayName("200 - getMainDescriptionSuccessActive") + void getMainDescriptionSuccessActive() { + DescriptionInfo.MainDescription result = descriptionService.getMainDescription(UserStatus.ACTIVE); + Assertions.assertEquals("33기 DO SOPT, 지금 출발합니다!", result.getTopDescription()); + Assertions.assertEquals("벋벋조와 함께하는 도장찍기!", result.getBottomDescription()); + } + + @Test + @DisplayName("200 - getMainDescriptionSuccessInActive") + void getMainDescriptionSuccessInactive() { + DescriptionInfo.MainDescription result = descriptionService.getMainDescription(UserStatus.INACTIVE); + Assertions.assertEquals("더욱 편리해진 SOPT를 이용해보세요!", result.getTopDescription()); + Assertions.assertEquals("SOPT를 알차게 즐기고 싶다면?", result.getBottomDescription()); + } +} diff --git a/src/test/java/org/sopt/app/interfaces/postgres/MainDescriptionTest.java b/src/test/java/org/sopt/app/interfaces/postgres/MainDescriptionTest.java new file mode 100644 index 00000000..a829d28c --- /dev/null +++ b/src/test/java/org/sopt/app/interfaces/postgres/MainDescriptionTest.java @@ -0,0 +1,20 @@ +package org.sopt.app.interfaces.postgres; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +public class MainDescriptionTest { + + @Autowired + private MainDescriptionRepository mainDescriptionRepository; + + @Test + @DisplayName("200 - findAllSuccessWithSizeOne") + void findAllSuccessWithSizeOne() { + Assertions.assertEquals(1, mainDescriptionRepository.findAll().size()); + } +} diff --git a/src/test/java/org/sopt/app/presentation/DescriptionControllerTest.java b/src/test/java/org/sopt/app/presentation/DescriptionControllerTest.java new file mode 100644 index 00000000..75f17eca --- /dev/null +++ b/src/test/java/org/sopt/app/presentation/DescriptionControllerTest.java @@ -0,0 +1,46 @@ +package org.sopt.app.presentation; + +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; +import org.springframework.security.test.context.support.WithUserDetails; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; +import org.springframework.transaction.annotation.Transactional; + +@Transactional +@AutoConfigureMockMvc +@SpringBootTest +public class DescriptionControllerTest { + + private final String BASE_URI = "/api/v2/description"; + @Autowired + private MockMvc mockMvc; + + @Test + @WithUserDetails("1") + @DisplayName("성공 - 메인 정보 조회") + void getMainDescriptionSuccess() throws Exception { + mockMvc.perform(MockMvcRequestBuilders.get(BASE_URI + "/main")) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON)) + .andDo(print()); + } + + @Test + @WithUserDetails("1") + @DisplayName("실패 - 메인 정보 조회 (플그 멤버 프로필)") + void getMainDescriptionFailGetPlaygroundMemberProfile() { + Assertions.assertThatThrownBy(() -> mockMvc.perform(MockMvcRequestBuilders.get(BASE_URI + "/main")) + .andExpect(status().isInternalServerError()) + .andDo(print())); + } +} From dd5b1340c6acd33986dd3ab313f5e09c76521244 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A3=BC=EC=96=B4=EC=A7=84=EC=82=AC=EB=9E=91=28eojinjoo?= =?UTF-8?q?=29?= Date: Fri, 15 Mar 2024 02:00:53 +0900 Subject: [PATCH 003/141] =?UTF-8?q?feat:=20=EC=98=A4=ED=83=80=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/sopt/app/presentation/DescriptionControllerTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/org/sopt/app/presentation/DescriptionControllerTest.java b/src/test/java/org/sopt/app/presentation/DescriptionControllerTest.java index 75f17eca..8337d252 100644 --- a/src/test/java/org/sopt/app/presentation/DescriptionControllerTest.java +++ b/src/test/java/org/sopt/app/presentation/DescriptionControllerTest.java @@ -27,7 +27,7 @@ public class DescriptionControllerTest { @Test @WithUserDetails("1") - @DisplayName("성공 - 메인 정보 조회") + @DisplayName("성공 - 메인 문구 조회") void getMainDescriptionSuccess() throws Exception { mockMvc.perform(MockMvcRequestBuilders.get(BASE_URI + "/main")) .andExpect(status().isOk()) @@ -37,7 +37,7 @@ void getMainDescriptionSuccess() throws Exception { @Test @WithUserDetails("1") - @DisplayName("실패 - 메인 정보 조회 (플그 멤버 프로필)") + @DisplayName("실패 - 메인 문구 조회 (플그 멤버 프로필)") void getMainDescriptionFailGetPlaygroundMemberProfile() { Assertions.assertThatThrownBy(() -> mockMvc.perform(MockMvcRequestBuilders.get(BASE_URI + "/main")) .andExpect(status().isInternalServerError()) From 347ac71eebb2d7967e29ebf0bdaa802a1116d768 Mon Sep 17 00:00:00 2001 From: kseysh Date: Fri, 15 Mar 2024 13:20:28 +0900 Subject: [PATCH 004/141] =?UTF-8?q?refactor:=20size()=20>=200=EB=A5=BC=20i?= =?UTF-8?q?sEmpty()=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/org/sopt/app/facade/SoptampFacade.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/sopt/app/facade/SoptampFacade.java b/src/main/java/org/sopt/app/facade/SoptampFacade.java index 954b2e6c..e406caf9 100644 --- a/src/main/java/org/sopt/app/facade/SoptampFacade.java +++ b/src/main/java/org/sopt/app/facade/SoptampFacade.java @@ -85,7 +85,7 @@ public StampInfo.Stamp getStampInfo(Long missionId, String nickname){ public StampInfo.Stamp editStamp(StampRequest.EditStampRequest editStampRequest, Long userId, Long missionId, List multipartFiles){ val stamp = stampService.editStampContentsDeprecated(editStampRequest, userId, missionId); val imgPaths = s3Service.uploadDeprecated(multipartFiles); - if (imgPaths.size() > 0) { + if (!imgPaths.isEmpty()) { stampService.editStampImagesDeprecated(stamp, imgPaths); } return stamp; From 7977c443023c6f3bbea9588ec8a0190d33ef17ec Mon Sep 17 00:00:00 2001 From: kseysh Date: Fri, 15 Mar 2024 13:24:26 +0900 Subject: [PATCH 005/141] =?UTF-8?q?chore:=20=EC=98=A4=ED=83=80=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20=EB=B0=8F=20=EB=B6=88=ED=95=84=EC=9A=94=ED=95=9C=20?= =?UTF-8?q?=EC=9E=84=EC=8B=9C=20=EB=B3=80=EC=88=98=EB=A5=BC=20=EC=A6=89?= =?UTF-8?q?=EC=8B=9C=20=EB=A6=AC=ED=84=B4=EB=90=98=EB=8A=94=20=EA=B0=92?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sopt/app/application/soptamp/SoptampUserService.java | 7 ++----- src/main/java/org/sopt/app/facade/SoptampFacade.java | 5 ++--- .../org/sopt/app/presentation/user/UserController.java | 8 ++++---- 3 files changed, 8 insertions(+), 12 deletions(-) diff --git a/src/main/java/org/sopt/app/application/soptamp/SoptampUserService.java b/src/main/java/org/sopt/app/application/soptamp/SoptampUserService.java index 6a3305c4..afc69524 100644 --- a/src/main/java/org/sopt/app/application/soptamp/SoptampUserService.java +++ b/src/main/java/org/sopt/app/application/soptamp/SoptampUserService.java @@ -1,6 +1,5 @@ package org.sopt.app.application.soptamp; -import com.sun.xml.bind.v2.runtime.JaxBeanInfo; import java.util.Comparator; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; @@ -13,7 +12,6 @@ import org.sopt.app.common.response.ErrorCode; import org.sopt.app.domain.entity.SoptampUser; import org.sopt.app.interfaces.postgres.SoptampUserRepository; -import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -24,7 +22,7 @@ public class SoptampUserService { private final SoptampUserRepository soptampUserRepository; @Transactional(readOnly = true) - public SoptampUserInfo.SoptampUser getSotampUserInfo(Long userId) { + public SoptampUserInfo.SoptampUser getSoptampUserInfo(Long userId) { val user = soptampUserRepository.findByUserId(userId) .orElseThrow(() -> new BadRequestException(ErrorCode.USER_NOT_FOUND.getMessage())); return SoptampUserInfo.SoptampUser.builder() @@ -129,7 +127,7 @@ private List
getRanking(List userList) { private List
getCurrentRanking(List userList, List soptampPointList) { val rankPoint = new AtomicInteger(1); - val result = soptampPointList.stream().sorted(Comparator.comparing(Point::getPoints).reversed()) + return soptampPointList.stream().sorted(Comparator.comparing(Point::getPoints).reversed()) .map(point -> { val user = userList.stream() .filter(u -> u.getId().equals(point.getSoptampUserId())) @@ -142,7 +140,6 @@ private List
getCurrentRanking(List userList, List sop .profileMessage(user.getProfileMessage()) .build(); }).collect(Collectors.toList()); - return result; } public SoptampUser findRankByNickname(String nickname) { diff --git a/src/main/java/org/sopt/app/facade/SoptampFacade.java b/src/main/java/org/sopt/app/facade/SoptampFacade.java index e406caf9..047f1be6 100644 --- a/src/main/java/org/sopt/app/facade/SoptampFacade.java +++ b/src/main/java/org/sopt/app/facade/SoptampFacade.java @@ -10,7 +10,6 @@ import org.sopt.app.application.soptamp.SoptampUserService; import org.sopt.app.application.stamp.StampInfo; import org.sopt.app.application.stamp.StampService; -import org.sopt.app.domain.entity.Stamp; import org.sopt.app.presentation.stamp.StampRequest; import org.sopt.app.presentation.stamp.StampRequest.RegisterStampRequest; import org.springframework.stereotype.Service; @@ -65,13 +64,13 @@ public void deleteStampAll(Long userId){ @Transactional public SoptampUserInfo.SoptampUser editSoptampUserNickname(Long userId, String nickname){ - val soptampUser = soptampUserService.getSotampUserInfo(userId); + val soptampUser = soptampUserService.getSoptampUserInfo(userId); return soptampUserService.editNickname(soptampUser, nickname); } @Transactional public SoptampUserInfo.SoptampUser editSoptampUserProfileMessage(Long userId, String newProfileMessage){ - val soptampUser = soptampUserService.getSotampUserInfo(userId); + val soptampUser = soptampUserService.getSoptampUserInfo(userId); return soptampUserService.editProfileMessage(soptampUser, newProfileMessage); } diff --git a/src/main/java/org/sopt/app/presentation/user/UserController.java b/src/main/java/org/sopt/app/presentation/user/UserController.java index 8d38d940..4e58eac5 100644 --- a/src/main/java/org/sopt/app/presentation/user/UserController.java +++ b/src/main/java/org/sopt/app/presentation/user/UserController.java @@ -49,11 +49,11 @@ public ResponseEntity getUserInfo(@AuthenticationPrincipal }) @GetMapping(value = "/soptamp") public ResponseEntity getSoptampInfo(@AuthenticationPrincipal User user) { - val SoptampUser = soptampUserService.getSotampUserInfo(user.getId()); + val soptampUser = soptampUserService.getSoptampUserInfo(user.getId()); val response = UserResponse.Soptamp.builder() - .nickname(SoptampUser.getNickname()) - .profileMessage(SoptampUser.getProfileMessage()) - .points(SoptampUser.getTotalPoints()) + .nickname(soptampUser.getNickname()) + .profileMessage(soptampUser.getProfileMessage()) + .points(soptampUser.getTotalPoints()) .build(); return ResponseEntity.status(HttpStatus.OK).body(response); } From 895a5adb0a44309c9f4d987f703551d886b753bf Mon Sep 17 00:00:00 2001 From: kseysh Date: Fri, 15 Mar 2024 17:59:11 +0900 Subject: [PATCH 006/141] =?UTF-8?q?fix:=20response=20DTO=EC=97=90=20?= =?UTF-8?q?=EB=88=84=EB=9D=BD=EB=90=98=EC=97=88=EB=8D=98=20missionId=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20=EB=B0=8F=20=EC=82=AC=EC=9A=A9=EB=90=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20return=20=EA=B0=92=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/application/stamp/StampService.java | 39 +++++++------------ 1 file changed, 14 insertions(+), 25 deletions(-) diff --git a/src/main/java/org/sopt/app/application/stamp/StampService.java b/src/main/java/org/sopt/app/application/stamp/StampService.java index 5b19eeda..905cb9a1 100644 --- a/src/main/java/org/sopt/app/application/stamp/StampService.java +++ b/src/main/java/org/sopt/app/application/stamp/StampService.java @@ -26,14 +26,15 @@ public class StampService { @Transactional(readOnly = true) public StampInfo.Stamp findStamp(Long missionId, Long userId) { val entity = stampRepository.findByUserIdAndMissionId(userId, missionId) - .orElseThrow(() -> new BadRequestException(ErrorCode.STAMP_NOT_FOUND.getMessage())); + .orElseThrow(() -> new BadRequestException(ErrorCode.STAMP_NOT_FOUND.getMessage())); return StampInfo.Stamp.builder() - .id(entity.getId()) - .contents(entity.getContents()) - .images(entity.getImages()) - .createdAt(entity.getCreatedAt()) - .updatedAt(entity.getUpdatedAt()) - .build(); + .id(entity.getId()) + .contents(entity.getContents()) + .images(entity.getImages()) + .createdAt(entity.getCreatedAt()) + .updatedAt(entity.getUpdatedAt()) + .missionId(entity.getMissionId()) + .build(); } @Transactional @@ -51,6 +52,7 @@ public StampInfo.Stamp uploadStampDeprecated( .images(newStamp.getImages()) .createdAt(newStamp.getCreatedAt()) .updatedAt(newStamp.getUpdatedAt()) + .missionId(newStamp.getMissionId()) .build(); } @@ -73,6 +75,7 @@ public StampInfo.Stamp uploadStamp( .images(newStamp.getImages()) .createdAt(newStamp.getCreatedAt()) .updatedAt(newStamp.getUpdatedAt()) + .missionId(newStamp.getMissionId()) .build(); } @@ -92,10 +95,6 @@ public StampInfo.Stamp editStampContentsDeprecated( val newStamp = stampRepository.save(stamp); return StampInfo.Stamp.builder() .id(newStamp.getId()) - .contents(newStamp.getContents()) - .images(newStamp.getImages()) - .createdAt(newStamp.getCreatedAt()) - .updatedAt(newStamp.getUpdatedAt()) .build(); } @@ -104,7 +103,8 @@ public StampInfo.Stamp editStampContents( StampRequest.EditStampRequest editStampRequest, Long userId) { - val stamp = stampRepository.findByUserIdAndMissionId(userId, editStampRequest.getMissionId()) + val stamp = stampRepository.findByUserIdAndMissionId(userId, + editStampRequest.getMissionId()) .orElseThrow(() -> new BadRequestException(ErrorCode.STAMP_NOT_FOUND.getMessage())); if (StringUtils.hasText(editStampRequest.getContents())) { stamp.changeContents(editStampRequest.getContents()); @@ -116,26 +116,15 @@ public StampInfo.Stamp editStampContents( val newStamp = stampRepository.save(stamp); return StampInfo.Stamp.builder() .id(newStamp.getId()) - .contents(newStamp.getContents()) - .images(newStamp.getImages()) - .createdAt(newStamp.getCreatedAt()) - .updatedAt(newStamp.getUpdatedAt()) .build(); } @Transactional - public StampInfo.Stamp editStampImagesDeprecated(StampInfo.Stamp stamp, List imgPaths) { + public void editStampImagesDeprecated(StampInfo.Stamp stamp, List imgPaths) { val oldStamp = stampRepository.findById(stamp.getId()) .orElseThrow(() -> new BadRequestException(ErrorCode.STAMP_NOT_FOUND.getMessage())); oldStamp.changeImages(imgPaths); - val newStamp = stampRepository.save(oldStamp); - return StampInfo.Stamp.builder() - .id(newStamp.getId()) - .contents(newStamp.getContents()) - .images(newStamp.getImages()) - .createdAt(newStamp.getCreatedAt()) - .updatedAt(newStamp.getUpdatedAt()) - .build(); + stampRepository.save(oldStamp); } @Transactional(readOnly = true) From de9f3118701d37d1bf3b6d7c4cc709ec28dd3d47 Mon Sep 17 00:00:00 2001 From: kseysh Date: Fri, 15 Mar 2024 18:00:09 +0900 Subject: [PATCH 007/141] =?UTF-8?q?chore:=20=EC=BD=94=EB=93=9C=20=ED=8F=AC?= =?UTF-8?q?=EB=A7=B7=20=EB=A7=9E=EC=B6=B0=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sopt/app/presentation/stamp/StampController.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/sopt/app/presentation/stamp/StampController.java b/src/main/java/org/sopt/app/presentation/stamp/StampController.java index 61182a0f..65d3a575 100644 --- a/src/main/java/org/sopt/app/presentation/stamp/StampController.java +++ b/src/main/java/org/sopt/app/presentation/stamp/StampController.java @@ -49,7 +49,8 @@ public class StampController { public ResponseEntity findStampByMissionAndUserId( @Valid @ModelAttribute StampRequest.FindStampRequest findStampRequest ) { - val result = soptampFacade.getStampInfo(findStampRequest.getMissionId(), findStampRequest.getNickname()); + val result = soptampFacade.getStampInfo(findStampRequest.getMissionId(), + findStampRequest.getNickname()); val response = stampResponseMapper.of(result); return ResponseEntity.status(HttpStatus.OK).body(response); } @@ -79,7 +80,8 @@ public ResponseEntity registerStampDeprecated( @RequestPart("stampContent") StampRequest.RegisterStampRequest registerStampRequest, @RequestPart(name = "imgUrl", required = false) List multipartFiles ) { - val result = soptampFacade.uploadStampDeprecated(user.getId(), missionId, registerStampRequest, multipartFiles); + val result = soptampFacade.uploadStampDeprecated(user.getId(), missionId, + registerStampRequest, multipartFiles); val response = stampResponseMapper.of(result); return ResponseEntity.status(HttpStatus.OK).body(response); } @@ -92,7 +94,8 @@ public ResponseEntity editStampDeprecated( @RequestPart(value = "stampContent", required = false) StampRequest.EditStampRequest editStampRequest, @RequestPart(name = "imgUrl", required = false) List multipartFiles ) { - val stamp = soptampFacade.editStamp(editStampRequest, user.getId(), missionId, multipartFiles); + val stamp = soptampFacade.editStamp(editStampRequest, user.getId(), missionId, + multipartFiles); val response = stampResponseMapper.of(stamp.getId()); return ResponseEntity.status(HttpStatus.OK).body(response); } @@ -152,7 +155,8 @@ public ResponseEntity deleteStampById( @ApiResponse(responseCode = "500", description = "server error", content = @Content) }) @DeleteMapping("/all") - public ResponseEntity deleteStampByUserId(@AuthenticationPrincipal User user) { + public ResponseEntity deleteStampByUserId( + @AuthenticationPrincipal User user) { soptampFacade.deleteStampAll(user.getId()); return ResponseEntity.status(HttpStatus.OK).body(null); } From e93a165c77c2e4c9af4bdf781862bb64cf274755 Mon Sep 17 00:00:00 2001 From: kseysh Date: Fri, 15 Mar 2024 18:06:18 +0900 Subject: [PATCH 008/141] =?UTF-8?q?refactor:=20=EB=9E=8C=EB=8B=A4=EB=A5=BC?= =?UTF-8?q?=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=B0=B8=EC=A1=B0=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=20=EB=B0=8F=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=EC=BD=94=EB=93=9C=20=EB=8B=A8=EC=88=9C=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/sopt/app/application/stamp/StampService.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/sopt/app/application/stamp/StampService.java b/src/main/java/org/sopt/app/application/stamp/StampService.java index 905cb9a1..e9e6ac76 100644 --- a/src/main/java/org/sopt/app/application/stamp/StampService.java +++ b/src/main/java/org/sopt/app/application/stamp/StampService.java @@ -2,8 +2,8 @@ import java.time.LocalDateTime; import java.util.ArrayList; +import java.util.Collection; import java.util.List; -import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import lombok.val; import org.sopt.app.common.event.Events; @@ -149,7 +149,7 @@ public void deleteAllStamps(Long userId) { stampRepository.deleteAllByUserId(userId); val imageUrls = stampRepository.findAllByUserId(userId).stream().map(Stamp::getImages) - .flatMap(images -> images.stream()).collect(Collectors.toList()); + .flatMap(Collection::stream).toList(); Events.raise(new StampDeletedEvent(imageUrls)); } From 2e007c50e6548d7a48deb683048f6d5c14013f62 Mon Sep 17 00:00:00 2001 From: kseysh Date: Fri, 15 Mar 2024 23:24:33 +0900 Subject: [PATCH 009/141] =?UTF-8?q?chore:=20=EC=BD=94=EB=93=9C=20=ED=8F=AC?= =?UTF-8?q?=EB=A7=A4=ED=84=B0=20=EC=A1=B0=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sopt/app/presentation/stamp/StampController.java | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/sopt/app/presentation/stamp/StampController.java b/src/main/java/org/sopt/app/presentation/stamp/StampController.java index 65d3a575..61182a0f 100644 --- a/src/main/java/org/sopt/app/presentation/stamp/StampController.java +++ b/src/main/java/org/sopt/app/presentation/stamp/StampController.java @@ -49,8 +49,7 @@ public class StampController { public ResponseEntity findStampByMissionAndUserId( @Valid @ModelAttribute StampRequest.FindStampRequest findStampRequest ) { - val result = soptampFacade.getStampInfo(findStampRequest.getMissionId(), - findStampRequest.getNickname()); + val result = soptampFacade.getStampInfo(findStampRequest.getMissionId(), findStampRequest.getNickname()); val response = stampResponseMapper.of(result); return ResponseEntity.status(HttpStatus.OK).body(response); } @@ -80,8 +79,7 @@ public ResponseEntity registerStampDeprecated( @RequestPart("stampContent") StampRequest.RegisterStampRequest registerStampRequest, @RequestPart(name = "imgUrl", required = false) List multipartFiles ) { - val result = soptampFacade.uploadStampDeprecated(user.getId(), missionId, - registerStampRequest, multipartFiles); + val result = soptampFacade.uploadStampDeprecated(user.getId(), missionId, registerStampRequest, multipartFiles); val response = stampResponseMapper.of(result); return ResponseEntity.status(HttpStatus.OK).body(response); } @@ -94,8 +92,7 @@ public ResponseEntity editStampDeprecated( @RequestPart(value = "stampContent", required = false) StampRequest.EditStampRequest editStampRequest, @RequestPart(name = "imgUrl", required = false) List multipartFiles ) { - val stamp = soptampFacade.editStamp(editStampRequest, user.getId(), missionId, - multipartFiles); + val stamp = soptampFacade.editStamp(editStampRequest, user.getId(), missionId, multipartFiles); val response = stampResponseMapper.of(stamp.getId()); return ResponseEntity.status(HttpStatus.OK).body(response); } @@ -155,8 +152,7 @@ public ResponseEntity deleteStampById( @ApiResponse(responseCode = "500", description = "server error", content = @Content) }) @DeleteMapping("/all") - public ResponseEntity deleteStampByUserId( - @AuthenticationPrincipal User user) { + public ResponseEntity deleteStampByUserId(@AuthenticationPrincipal User user) { soptampFacade.deleteStampAll(user.getId()); return ResponseEntity.status(HttpStatus.OK).body(null); } From f27cb51a333f3340fd75b3ebdffa5533a53f3478 Mon Sep 17 00:00:00 2001 From: kseysh Date: Fri, 15 Mar 2024 23:29:42 +0900 Subject: [PATCH 010/141] =?UTF-8?q?chore:=20=EC=BD=94=EB=93=9C=20=ED=8F=AC?= =?UTF-8?q?=EB=A7=A4=ED=84=B0=20=EC=A1=B0=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/org/sopt/app/application/stamp/StampService.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/org/sopt/app/application/stamp/StampService.java b/src/main/java/org/sopt/app/application/stamp/StampService.java index e9e6ac76..a766106c 100644 --- a/src/main/java/org/sopt/app/application/stamp/StampService.java +++ b/src/main/java/org/sopt/app/application/stamp/StampService.java @@ -103,8 +103,7 @@ public StampInfo.Stamp editStampContents( StampRequest.EditStampRequest editStampRequest, Long userId) { - val stamp = stampRepository.findByUserIdAndMissionId(userId, - editStampRequest.getMissionId()) + val stamp = stampRepository.findByUserIdAndMissionId(userId, editStampRequest.getMissionId()) .orElseThrow(() -> new BadRequestException(ErrorCode.STAMP_NOT_FOUND.getMessage())); if (StringUtils.hasText(editStampRequest.getContents())) { stamp.changeContents(editStampRequest.getContents()); From 4fdd000883571be1b20d18464623320e50c561ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A3=BC=EC=96=B4=EC=A7=84=EC=82=AC=EB=9E=91=28eojinjoo?= =?UTF-8?q?=29?= Date: Fri, 15 Mar 2024 23:59:05 +0900 Subject: [PATCH 011/141] =?UTF-8?q?feat:=20DescriptionTest=20=EC=A0=84?= =?UTF-8?q?=EC=B2=B4=20=EC=88=98=EC=A0=95,=20ControllerTest=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 4 +- .../application/DescriptionServiceTest.java | 46 ++++++++++++--- .../app/facade/DescriptionFacadeTest.java | 58 +++++++++++++++++++ ...ava => MainDescriptionRepositoryTest.java} | 9 ++- .../DescriptionControllerTest.java | 46 --------------- .../app/presentation/PokeControllerTest.java | 39 ------------- 6 files changed, 102 insertions(+), 100 deletions(-) create mode 100644 src/test/java/org/sopt/app/facade/DescriptionFacadeTest.java rename src/test/java/org/sopt/app/interfaces/postgres/{MainDescriptionTest.java => MainDescriptionRepositoryTest.java} (59%) delete mode 100644 src/test/java/org/sopt/app/presentation/DescriptionControllerTest.java delete mode 100644 src/test/java/org/sopt/app/presentation/PokeControllerTest.java diff --git a/build.gradle b/build.gradle index e54c4122..ea6e19a0 100644 --- a/build.gradle +++ b/build.gradle @@ -89,7 +89,9 @@ dependencies { testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'org.springframework.security:spring-security-test' implementation 'com.google.code.gson:gson:2.8.7' - + testImplementation 'org.mockito:mockito-core:4.5.1' + testImplementation 'org.mockito:mockito-junit-jupiter:4.5.1' + // slack implementation 'com.slack.api:slack-api-client:1.30.0' } diff --git a/src/test/java/org/sopt/app/application/DescriptionServiceTest.java b/src/test/java/org/sopt/app/application/DescriptionServiceTest.java index 66d07655..756df721 100644 --- a/src/test/java/org/sopt/app/application/DescriptionServiceTest.java +++ b/src/test/java/org/sopt/app/application/DescriptionServiceTest.java @@ -1,33 +1,61 @@ package org.sopt.app.application; +import java.util.List; import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import org.mockito.Mockito; import org.sopt.app.application.description.DescriptionInfo; import org.sopt.app.application.description.DescriptionService; +import org.sopt.app.domain.entity.MainDescription; import org.sopt.app.domain.enums.UserStatus; -import org.springframework.beans.factory.annotation.Autowired; +import org.sopt.app.interfaces.postgres.MainDescriptionRepository; import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest public class DescriptionServiceTest { - @Autowired - private DescriptionService descriptionService; + private static MainDescriptionRepository mainDescriptionRepository = Mockito.mock(MainDescriptionRepository.class); + + private DescriptionService descriptionService = new DescriptionService( + mainDescriptionRepository + ); + + @BeforeAll + private static void beforeTest() { + Mockito.when(mainDescriptionRepository.findAll()).thenReturn(List.of( + MainDescription.builder() + .id(1L) + .activeTopDescription("activeTop") + .activeBottomDescription("activeBottom") + .inactiveTopDescription("inactiveTop") + .inactiveBottomDescription("inactiveBottom") + .build() + )); + } @Test - @DisplayName("200 - getMainDescriptionSuccessActive") + @DisplayName("SUCCESS - getMainDescriptionSuccessActive") void getMainDescriptionSuccessActive() { DescriptionInfo.MainDescription result = descriptionService.getMainDescription(UserStatus.ACTIVE); - Assertions.assertEquals("33기 DO SOPT, 지금 출발합니다!", result.getTopDescription()); - Assertions.assertEquals("벋벋조와 함께하는 도장찍기!", result.getBottomDescription()); + Assertions.assertEquals("activeTop", result.getTopDescription()); + Assertions.assertEquals("activeBottom", result.getBottomDescription()); } @Test - @DisplayName("200 - getMainDescriptionSuccessInActive") + @DisplayName("SUCCESS - getMainDescriptionSuccessInactive") void getMainDescriptionSuccessInactive() { DescriptionInfo.MainDescription result = descriptionService.getMainDescription(UserStatus.INACTIVE); - Assertions.assertEquals("더욱 편리해진 SOPT를 이용해보세요!", result.getTopDescription()); - Assertions.assertEquals("SOPT를 알차게 즐기고 싶다면?", result.getBottomDescription()); + Assertions.assertEquals("inactiveTop", result.getTopDescription()); + Assertions.assertEquals("inactiveBottom", result.getBottomDescription()); + } + + @Test + @DisplayName("SUCCESS - getMainDescriptionSuccessUnauthenticated") + void getMainDescriptionSuccessUnauthenticated() { + DescriptionInfo.MainDescription result = descriptionService.getMainDescription(UserStatus.UNAUTHENTICATED); + Assertions.assertEquals("inactiveTop", result.getTopDescription()); + Assertions.assertEquals("inactiveBottom", result.getBottomDescription()); } } diff --git a/src/test/java/org/sopt/app/facade/DescriptionFacadeTest.java b/src/test/java/org/sopt/app/facade/DescriptionFacadeTest.java new file mode 100644 index 00000000..18af6487 --- /dev/null +++ b/src/test/java/org/sopt/app/facade/DescriptionFacadeTest.java @@ -0,0 +1,58 @@ +package org.sopt.app.facade; + +import static org.mockito.ArgumentMatchers.any; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; +import org.sopt.app.application.auth.PlaygroundAuthInfo.UserActiveInfo; +import org.sopt.app.application.auth.PlaygroundAuthService; +import org.sopt.app.application.description.DescriptionInfo; +import org.sopt.app.application.description.DescriptionInfo.MainDescription; +import org.sopt.app.application.description.DescriptionService; +import org.sopt.app.domain.entity.User; +import org.sopt.app.domain.enums.UserStatus; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +public class DescriptionFacadeTest { + + private static DescriptionService descriptionService = Mockito.mock(DescriptionService.class); + private static PlaygroundAuthService playgroundAuthService = Mockito.mock(PlaygroundAuthService.class); + + private DescriptionFacade descriptionFacade = new DescriptionFacade( + descriptionService, + playgroundAuthService + ); + + @Test + @DisplayName("SUCCESS - getMainDescriptionForUserSuccessActive") + void getMainDescriptionForUserSuccessActive() { + UserStatus userStatus = UserStatus.ACTIVE; + Mockito.when(playgroundAuthService.getPlaygroundUserActiveInfo(any())) + .thenReturn(UserActiveInfo.builder().currentGeneration(34L).status(userStatus).build()); + Mockito.when(descriptionService.getMainDescription(userStatus)) + .thenReturn(DescriptionInfo.MainDescription.builder().topDescription("activeTop") + .bottomDescription("activeBottom").build()); + + MainDescription result = descriptionFacade.getMainDescriptionForUser(new User()); + Assertions.assertEquals("activeTop", result.getTopDescription()); + Assertions.assertEquals("activeBottom", result.getBottomDescription()); + } + + @Test + @DisplayName("SUCCESS - getMainDescriptionForUserSuccessInactive") + void getMainDescriptionForUserSuccessInactive() { + UserStatus userStatus = UserStatus.INACTIVE; + Mockito.when(playgroundAuthService.getPlaygroundUserActiveInfo(any())) + .thenReturn(UserActiveInfo.builder().currentGeneration(29L).status(userStatus).build()); + Mockito.when(descriptionService.getMainDescription(userStatus)) + .thenReturn(DescriptionInfo.MainDescription.builder().topDescription("inactiveTop") + .bottomDescription("inactiveBottom").build()); + + MainDescription result = descriptionFacade.getMainDescriptionForUser(new User()); + Assertions.assertEquals("inactiveTop", result.getTopDescription()); + Assertions.assertEquals("inactiveBottom", result.getBottomDescription()); + } +} diff --git a/src/test/java/org/sopt/app/interfaces/postgres/MainDescriptionTest.java b/src/test/java/org/sopt/app/interfaces/postgres/MainDescriptionRepositoryTest.java similarity index 59% rename from src/test/java/org/sopt/app/interfaces/postgres/MainDescriptionTest.java rename to src/test/java/org/sopt/app/interfaces/postgres/MainDescriptionRepositoryTest.java index a829d28c..0ba481ab 100644 --- a/src/test/java/org/sopt/app/interfaces/postgres/MainDescriptionTest.java +++ b/src/test/java/org/sopt/app/interfaces/postgres/MainDescriptionRepositoryTest.java @@ -1,20 +1,19 @@ package org.sopt.app.interfaces.postgres; -import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest -public class MainDescriptionTest { +public class MainDescriptionRepositoryTest { @Autowired private MainDescriptionRepository mainDescriptionRepository; @Test - @DisplayName("200 - findAllSuccessWithSizeOne") - void findAllSuccessWithSizeOne() { - Assertions.assertEquals(1, mainDescriptionRepository.findAll().size()); + @DisplayName("SUCCESS - findAll") + void findAll() { + System.out.println(mainDescriptionRepository.findAll()); } } diff --git a/src/test/java/org/sopt/app/presentation/DescriptionControllerTest.java b/src/test/java/org/sopt/app/presentation/DescriptionControllerTest.java deleted file mode 100644 index 8337d252..00000000 --- a/src/test/java/org/sopt/app/presentation/DescriptionControllerTest.java +++ /dev/null @@ -1,46 +0,0 @@ -package org.sopt.app.presentation; - -import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -import org.assertj.core.api.Assertions; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.http.MediaType; -import org.springframework.security.test.context.support.WithUserDetails; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; -import org.springframework.transaction.annotation.Transactional; - -@Transactional -@AutoConfigureMockMvc -@SpringBootTest -public class DescriptionControllerTest { - - private final String BASE_URI = "/api/v2/description"; - @Autowired - private MockMvc mockMvc; - - @Test - @WithUserDetails("1") - @DisplayName("성공 - 메인 문구 조회") - void getMainDescriptionSuccess() throws Exception { - mockMvc.perform(MockMvcRequestBuilders.get(BASE_URI + "/main")) - .andExpect(status().isOk()) - .andExpect(content().contentType(MediaType.APPLICATION_JSON)) - .andDo(print()); - } - - @Test - @WithUserDetails("1") - @DisplayName("실패 - 메인 문구 조회 (플그 멤버 프로필)") - void getMainDescriptionFailGetPlaygroundMemberProfile() { - Assertions.assertThatThrownBy(() -> mockMvc.perform(MockMvcRequestBuilders.get(BASE_URI + "/main")) - .andExpect(status().isInternalServerError()) - .andDo(print())); - } -} diff --git a/src/test/java/org/sopt/app/presentation/PokeControllerTest.java b/src/test/java/org/sopt/app/presentation/PokeControllerTest.java deleted file mode 100644 index 8007fd0a..00000000 --- a/src/test/java/org/sopt/app/presentation/PokeControllerTest.java +++ /dev/null @@ -1,39 +0,0 @@ -package org.sopt.app.presentation; - -import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -import com.google.gson.Gson; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.sopt.app.domain.entity.User; -import org.sopt.app.presentation.poke.PokeResponse; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; -import org.springframework.transaction.annotation.Transactional; - -@Transactional -@AutoConfigureMockMvc -@SpringBootTest -public class PokeControllerTest { - - private final String BASE_URI = "/api/v2/poke"; - @Autowired - private MockMvc mockMvc; - - @Test - @DisplayName("200 - 신규 유저인지 조회") - void getPokeListSuccess() throws Exception { - mockMvc.perform(MockMvcRequestBuilders - .get(BASE_URI + "/new") - .with(SecurityMockMvcRequestPostProcessors.user(new User("주어랑", "주어랑1267", 26L)))) - .andExpect(status().isOk()) - .andExpect(content().string(new Gson().toJson(PokeResponse.IsNew.of(true)))) - .andDo(print()); - } -} From fd24111cd041afd2984dad0625ece45712449e0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A3=BC=EC=96=B4=EC=A7=84=EC=82=AC=EB=9E=91=28eojinjoo?= =?UTF-8?q?=29?= Date: Sat, 16 Mar 2024 01:23:19 +0900 Subject: [PATCH 012/141] =?UTF-8?q?feat:=20=EB=84=A4=EC=9D=B4=EB=B0=8D=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/sopt/app/application/DescriptionServiceTest.java | 6 +++--- .../java/org/sopt/app/facade/DescriptionFacadeTest.java | 4 ++-- .../interfaces/postgres/MainDescriptionRepositoryTest.java | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/test/java/org/sopt/app/application/DescriptionServiceTest.java b/src/test/java/org/sopt/app/application/DescriptionServiceTest.java index 756df721..9a2aec83 100644 --- a/src/test/java/org/sopt/app/application/DescriptionServiceTest.java +++ b/src/test/java/org/sopt/app/application/DescriptionServiceTest.java @@ -37,7 +37,7 @@ private static void beforeTest() { @Test @DisplayName("SUCCESS - getMainDescriptionSuccessActive") - void getMainDescriptionSuccessActive() { + void success_getMainDescriptionActive() { DescriptionInfo.MainDescription result = descriptionService.getMainDescription(UserStatus.ACTIVE); Assertions.assertEquals("activeTop", result.getTopDescription()); Assertions.assertEquals("activeBottom", result.getBottomDescription()); @@ -45,7 +45,7 @@ void getMainDescriptionSuccessActive() { @Test @DisplayName("SUCCESS - getMainDescriptionSuccessInactive") - void getMainDescriptionSuccessInactive() { + void success_getMainDescriptionInactive() { DescriptionInfo.MainDescription result = descriptionService.getMainDescription(UserStatus.INACTIVE); Assertions.assertEquals("inactiveTop", result.getTopDescription()); Assertions.assertEquals("inactiveBottom", result.getBottomDescription()); @@ -53,7 +53,7 @@ void getMainDescriptionSuccessInactive() { @Test @DisplayName("SUCCESS - getMainDescriptionSuccessUnauthenticated") - void getMainDescriptionSuccessUnauthenticated() { + void success_getMainDescriptionUnauthenticated() { DescriptionInfo.MainDescription result = descriptionService.getMainDescription(UserStatus.UNAUTHENTICATED); Assertions.assertEquals("inactiveTop", result.getTopDescription()); Assertions.assertEquals("inactiveBottom", result.getBottomDescription()); diff --git a/src/test/java/org/sopt/app/facade/DescriptionFacadeTest.java b/src/test/java/org/sopt/app/facade/DescriptionFacadeTest.java index 18af6487..9c4c6454 100644 --- a/src/test/java/org/sopt/app/facade/DescriptionFacadeTest.java +++ b/src/test/java/org/sopt/app/facade/DescriptionFacadeTest.java @@ -28,7 +28,7 @@ public class DescriptionFacadeTest { @Test @DisplayName("SUCCESS - getMainDescriptionForUserSuccessActive") - void getMainDescriptionForUserSuccessActive() { + void success_getMainDescriptionForUserActive() { UserStatus userStatus = UserStatus.ACTIVE; Mockito.when(playgroundAuthService.getPlaygroundUserActiveInfo(any())) .thenReturn(UserActiveInfo.builder().currentGeneration(34L).status(userStatus).build()); @@ -43,7 +43,7 @@ void getMainDescriptionForUserSuccessActive() { @Test @DisplayName("SUCCESS - getMainDescriptionForUserSuccessInactive") - void getMainDescriptionForUserSuccessInactive() { + void success_getMainDescriptionForUserInactive() { UserStatus userStatus = UserStatus.INACTIVE; Mockito.when(playgroundAuthService.getPlaygroundUserActiveInfo(any())) .thenReturn(UserActiveInfo.builder().currentGeneration(29L).status(userStatus).build()); diff --git a/src/test/java/org/sopt/app/interfaces/postgres/MainDescriptionRepositoryTest.java b/src/test/java/org/sopt/app/interfaces/postgres/MainDescriptionRepositoryTest.java index 0ba481ab..997d5583 100644 --- a/src/test/java/org/sopt/app/interfaces/postgres/MainDescriptionRepositoryTest.java +++ b/src/test/java/org/sopt/app/interfaces/postgres/MainDescriptionRepositoryTest.java @@ -13,7 +13,7 @@ public class MainDescriptionRepositoryTest { @Test @DisplayName("SUCCESS - findAll") - void findAll() { + void success_findAll() { System.out.println(mainDescriptionRepository.findAll()); } } From fd4048cfdc67d237339c22a1a23b2f57f6e611e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A3=BC=EC=96=B4=EC=A7=84=EC=82=AC=EB=9E=91=28eojinjoo?= =?UTF-8?q?=29?= Date: Sat, 16 Mar 2024 01:27:50 +0900 Subject: [PATCH 013/141] =?UTF-8?q?feat:=20=EB=84=A4=EC=9D=B4=EB=B0=8D=20?= =?UTF-8?q?=EC=9E=AC=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sopt/app/application/DescriptionServiceTest.java | 12 ++++++------ .../org/sopt/app/facade/DescriptionFacadeTest.java | 8 ++++---- .../postgres/MainDescriptionRepositoryTest.java | 4 ++-- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/test/java/org/sopt/app/application/DescriptionServiceTest.java b/src/test/java/org/sopt/app/application/DescriptionServiceTest.java index 9a2aec83..f442b38a 100644 --- a/src/test/java/org/sopt/app/application/DescriptionServiceTest.java +++ b/src/test/java/org/sopt/app/application/DescriptionServiceTest.java @@ -36,24 +36,24 @@ private static void beforeTest() { } @Test - @DisplayName("SUCCESS - getMainDescriptionSuccessActive") - void success_getMainDescriptionActive() { + @DisplayName("SUCCESS_getMainDescriptionActive") + void SUCCESS_getMainDescriptionActive() { DescriptionInfo.MainDescription result = descriptionService.getMainDescription(UserStatus.ACTIVE); Assertions.assertEquals("activeTop", result.getTopDescription()); Assertions.assertEquals("activeBottom", result.getBottomDescription()); } @Test - @DisplayName("SUCCESS - getMainDescriptionSuccessInactive") - void success_getMainDescriptionInactive() { + @DisplayName("SUCCESS_getMainDescriptionInactive") + void SUCCESS_getMainDescriptionInactive() { DescriptionInfo.MainDescription result = descriptionService.getMainDescription(UserStatus.INACTIVE); Assertions.assertEquals("inactiveTop", result.getTopDescription()); Assertions.assertEquals("inactiveBottom", result.getBottomDescription()); } @Test - @DisplayName("SUCCESS - getMainDescriptionSuccessUnauthenticated") - void success_getMainDescriptionUnauthenticated() { + @DisplayName("SUCCESS_getMainDescriptionUnauthenticated") + void SUCCESS_getMainDescriptionUnauthenticated() { DescriptionInfo.MainDescription result = descriptionService.getMainDescription(UserStatus.UNAUTHENTICATED); Assertions.assertEquals("inactiveTop", result.getTopDescription()); Assertions.assertEquals("inactiveBottom", result.getBottomDescription()); diff --git a/src/test/java/org/sopt/app/facade/DescriptionFacadeTest.java b/src/test/java/org/sopt/app/facade/DescriptionFacadeTest.java index 9c4c6454..2de864ba 100644 --- a/src/test/java/org/sopt/app/facade/DescriptionFacadeTest.java +++ b/src/test/java/org/sopt/app/facade/DescriptionFacadeTest.java @@ -27,8 +27,8 @@ public class DescriptionFacadeTest { ); @Test - @DisplayName("SUCCESS - getMainDescriptionForUserSuccessActive") - void success_getMainDescriptionForUserActive() { + @DisplayName("SUCCESS_getMainDescriptionForUserActive") + void SUCCESS_getMainDescriptionForUserActive() { UserStatus userStatus = UserStatus.ACTIVE; Mockito.when(playgroundAuthService.getPlaygroundUserActiveInfo(any())) .thenReturn(UserActiveInfo.builder().currentGeneration(34L).status(userStatus).build()); @@ -42,8 +42,8 @@ void success_getMainDescriptionForUserActive() { } @Test - @DisplayName("SUCCESS - getMainDescriptionForUserSuccessInactive") - void success_getMainDescriptionForUserInactive() { + @DisplayName("SUCCESS_getMainDescriptionForUserInactive") + void SUCCESS_getMainDescriptionForUserInactive() { UserStatus userStatus = UserStatus.INACTIVE; Mockito.when(playgroundAuthService.getPlaygroundUserActiveInfo(any())) .thenReturn(UserActiveInfo.builder().currentGeneration(29L).status(userStatus).build()); diff --git a/src/test/java/org/sopt/app/interfaces/postgres/MainDescriptionRepositoryTest.java b/src/test/java/org/sopt/app/interfaces/postgres/MainDescriptionRepositoryTest.java index 997d5583..e678edc4 100644 --- a/src/test/java/org/sopt/app/interfaces/postgres/MainDescriptionRepositoryTest.java +++ b/src/test/java/org/sopt/app/interfaces/postgres/MainDescriptionRepositoryTest.java @@ -12,8 +12,8 @@ public class MainDescriptionRepositoryTest { private MainDescriptionRepository mainDescriptionRepository; @Test - @DisplayName("SUCCESS - findAll") - void success_findAll() { + @DisplayName("SUCCESS_findAll") + void SUCCESS_findAll() { System.out.println(mainDescriptionRepository.findAll()); } } From 1d247de1445a384711626d074fee359905bb7c9b Mon Sep 17 00:00:00 2001 From: kseysh Date: Sat, 16 Mar 2024 16:59:22 +0900 Subject: [PATCH 014/141] =?UTF-8?q?modify:=20=EC=A4=91=EB=B3=B5=EB=90=98?= =?UTF-8?q?=EB=8A=94=20=EC=97=94=ED=8B=B0=ED=8B=B0=20=EC=BB=AC=EB=9F=BC=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/sopt/app/application/stamp/StampService.java | 2 -- src/main/java/org/sopt/app/domain/entity/Stamp.java | 7 ------- 2 files changed, 9 deletions(-) diff --git a/src/main/java/org/sopt/app/application/stamp/StampService.java b/src/main/java/org/sopt/app/application/stamp/StampService.java index a766106c..f12d247c 100644 --- a/src/main/java/org/sopt/app/application/stamp/StampService.java +++ b/src/main/java/org/sopt/app/application/stamp/StampService.java @@ -62,7 +62,6 @@ public StampInfo.Stamp uploadStamp( Long userId) { val stamp = Stamp.builder() .contents(stampRequest.getContents()) - .createdAt(LocalDateTime.now()) .images(List.of(stampRequest.getImage())) .missionId(stampRequest.getMissionId()) .userId(userId) @@ -160,7 +159,6 @@ private Stamp convertStampImgDeprecated( Long missionId) { return Stamp.builder() .contents(stampRequest.getContents()) - .createdAt(LocalDateTime.now()) .images(imgList) .missionId(missionId) .userId(userId) diff --git a/src/main/java/org/sopt/app/domain/entity/Stamp.java b/src/main/java/org/sopt/app/domain/entity/Stamp.java index 8edf82f3..f5743a93 100644 --- a/src/main/java/org/sopt/app/domain/entity/Stamp.java +++ b/src/main/java/org/sopt/app/domain/entity/Stamp.java @@ -2,7 +2,6 @@ import com.vladmihalcea.hibernate.type.array.ListArrayType; -import java.time.LocalDateTime; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; @@ -38,12 +37,6 @@ public class Stamp extends BaseEntity { ) private List images; - @Column - private LocalDateTime createdAt; - - @Column - private LocalDateTime updatedAt; - @Column private Long userId; From 9a4ea257deb154b3542f904817dc4a619183db5d Mon Sep 17 00:00:00 2001 From: kseysh Date: Tue, 19 Mar 2024 18:28:47 +0900 Subject: [PATCH 015/141] =?UTF-8?q?feat:=20application/stamp/findStamp=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20#217?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/application/StampServiceTest.java | 133 ++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 src/test/java/org/sopt/app/application/StampServiceTest.java diff --git a/src/test/java/org/sopt/app/application/StampServiceTest.java b/src/test/java/org/sopt/app/application/StampServiceTest.java new file mode 100644 index 00000000..606469a1 --- /dev/null +++ b/src/test/java/org/sopt/app/application/StampServiceTest.java @@ -0,0 +1,133 @@ +package org.sopt.app.application; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.ArgumentMatchers.any; + +import java.util.Optional; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.jupiter.MockitoExtension; +import org.sopt.app.application.stamp.StampInfo; +import org.sopt.app.application.stamp.StampService; +import org.sopt.app.common.exception.BadRequestException; +import org.sopt.app.domain.entity.Stamp; +import org.sopt.app.interfaces.postgres.StampRepository; + +@ExtendWith(MockitoExtension.class) +class StampServiceTest { + + @Mock + private StampRepository stampRepository; + + @InjectMocks + private StampService stampService; + + @Test + @DisplayName("200 - findStamp Success") + void findStampSuccess() { + //given + final Long stampUserId = 1L; + final Long stampMissionId = 1L; + Stamp stamp = Stamp.builder().id(any(Long.class)).userId(stampUserId).missionId(stampMissionId).build(); + //when + Mockito.when(stampRepository.findByUserIdAndMissionId(stampUserId, stampMissionId)) + .thenReturn(Optional.of(stamp)); + StampInfo.Stamp expected = StampInfo.Stamp.builder() + .id(stamp.getId()) + .contents(stamp.getContents()) + .images(stamp.getImages()) + .createdAt(stamp.getCreatedAt()) + .updatedAt(stamp.getUpdatedAt()) + .build(); + StampInfo.Stamp actual = stampService.findStamp(stampUserId, stampMissionId); + //then + assertThat(actual).isInstanceOf(StampInfo.Stamp.class); + assertThat(actual).usingRecursiveComparison().isEqualTo(expected); + } + + @Test + @DisplayName("400 - 스탬프를 찾지 못하면 BadRequestException을 던진다.") + void findStampBadRequest() { + //when + Mockito.when(stampRepository.findByUserIdAndMissionId(any(Long.class), any(Long.class))) + .thenReturn(Optional.empty()); + //then + assertThrows(BadRequestException.class, () -> { + stampService.findStamp(any(Long.class), any(Long.class)); + }); + } + +/* TODO: Implement the following tests + + @Test + void uploadStampDeprecated() { + // given + + final Long missionId = 1L; + + List imgPaths = new ArrayList<>("requestImage1", "requestImage2"); + final Long requestUserId = 1L; + + final String requestContents = "requestContents"; + final String requestImage = "requestImage"; + final Long requestMissionId = 1L; + RegisterStampRequest stampRequest = new RegisterStampRequest(); + stampRequest.setContents(requestContents); + stampRequest.setImage(requestImage); + stampRequest.setMissionId(requestMissionId); + + //when + val imgList = new ArrayList<>(imgPaths); + val stamp = this.convertStampImgDeprecated(stampRequest, imgList, requestUserId, requestMissionId); + val newStamp = stampRepository.save(stamp); + return StampInfo.Stamp.builder() + .id(newStamp.getId()) + .contents(newStamp.getContents()) + .images(newStamp.getImages()) + .createdAt(newStamp.getCreatedAt()) + .updatedAt(newStamp.getUpdatedAt()) + .build(); + + //then + + + } + @Test + void uploadStamp() { + } + + @Test + void editStampContentsDeprecated() { + } + + @Test + void editStampContents() { + } + + @Test + void editStampImagesDeprecated() { + } + + @Test + void checkDuplicateStamp() { + } + + @Test + void deleteStampById() { + } + + @Test + void deleteAllStamps() { + } + + @Test + void getMissionIdByStampId() { + } + + */ +} \ No newline at end of file From cc42ccf79b09bf1241bc5d87bec594395e51e308 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A3=BC=EC=96=B4=EC=A7=84=EC=82=AC=EB=9E=91=28eojinjoo?= =?UTF-8?q?=29?= Date: Tue, 19 Mar 2024 23:45:21 +0900 Subject: [PATCH 016/141] trigger actions From 00320d1ddab24c83c2b7810d89cfb3279203c0e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A3=BC=EC=96=B4=EC=A7=84=EC=82=AC=EB=9E=91=28eojinjoo?= =?UTF-8?q?=29?= Date: Tue, 19 Mar 2024 23:58:00 +0900 Subject: [PATCH 017/141] trigger actions From 2e649f26df1f752d32494c601d4feffeefe70bb9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A3=BC=EC=96=B4=EC=A7=84=EC=82=AC=EB=9E=91=28eojinjoo?= =?UTF-8?q?=29?= Date: Wed, 20 Mar 2024 00:02:51 +0900 Subject: [PATCH 018/141] trigger actions From 8bab8f5cd9b0497ba3721c8db049bcb6f4126519 Mon Sep 17 00:00:00 2001 From: kseysh Date: Wed, 20 Mar 2024 00:23:41 +0900 Subject: [PATCH 019/141] =?UTF-8?q?feat:=20application/stamp/findStamp,=20?= =?UTF-8?q?uploadStamp=EA=B4=80=EB=A0=A8=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20#217?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/application/StampServiceTest.java | 90 ++++++++++++------- 1 file changed, 56 insertions(+), 34 deletions(-) diff --git a/src/test/java/org/sopt/app/application/StampServiceTest.java b/src/test/java/org/sopt/app/application/StampServiceTest.java index 606469a1..883baa1b 100644 --- a/src/test/java/org/sopt/app/application/StampServiceTest.java +++ b/src/test/java/org/sopt/app/application/StampServiceTest.java @@ -1,10 +1,14 @@ package org.sopt.app.application; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyLong; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; import java.util.Optional; +import lombok.val; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -17,6 +21,7 @@ import org.sopt.app.common.exception.BadRequestException; import org.sopt.app.domain.entity.Stamp; import org.sopt.app.interfaces.postgres.StampRepository; +import org.sopt.app.presentation.stamp.StampRequest.RegisterStampRequest; @ExtendWith(MockitoExtension.class) class StampServiceTest { @@ -28,12 +33,14 @@ class StampServiceTest { private StampService stampService; @Test - @DisplayName("200 - findStamp Success") - void findStampSuccess() { + @DisplayName("SUCCESS_UserId와 MissionId로 스탬프를 찾으면 StampInfo.Stamp DTO 반환") + void SUCCESS_findStamp() { //given - final Long stampUserId = 1L; - final Long stampMissionId = 1L; - Stamp stamp = Stamp.builder().id(any(Long.class)).userId(stampUserId).missionId(stampMissionId).build(); + val stampUserId = anyLong(); + val stampMissionId = anyLong(); + val stampId = 1L; + val stamp = Stamp.builder().id(stampId).userId(stampUserId).missionId(stampMissionId).build(); + //when Mockito.when(stampRepository.findByUserIdAndMissionId(stampUserId, stampMissionId)) .thenReturn(Optional.of(stamp)); @@ -44,48 +51,46 @@ void findStampSuccess() { .createdAt(stamp.getCreatedAt()) .updatedAt(stamp.getUpdatedAt()) .build(); - StampInfo.Stamp actual = stampService.findStamp(stampUserId, stampMissionId); + StampInfo.Stamp result = stampService.findStamp(stampUserId, stampMissionId); + //then - assertThat(actual).isInstanceOf(StampInfo.Stamp.class); - assertThat(actual).usingRecursiveComparison().isEqualTo(expected); + assertThat(result).usingRecursiveComparison().isEqualTo(expected); + Assertions.assertInstanceOf(StampInfo.Stamp.class, result); } @Test - @DisplayName("400 - 스탬프를 찾지 못하면 BadRequestException을 던진다.") - void findStampBadRequest() { + @DisplayName("FAIL_스탬프를 찾지 못하면 BadRequestException 발생") + void FAIL_findStampBadRequest() { + //given + val anyUserId = anyLong(); + val anyMissionId = anyLong(); + //when - Mockito.when(stampRepository.findByUserIdAndMissionId(any(Long.class), any(Long.class))) + Mockito.when(stampRepository.findByUserIdAndMissionId(anyUserId, anyMissionId)) .thenReturn(Optional.empty()); + //then - assertThrows(BadRequestException.class, () -> { - stampService.findStamp(any(Long.class), any(Long.class)); + Assertions.assertThrows(BadRequestException.class, () -> { + stampService.findStamp(anyUserId, anyMissionId); }); } -/* TODO: Implement the following tests - @Test - void uploadStampDeprecated() { + @DisplayName("SUCCESS_스탬프가 request에서 보낸 내용의 이미지와 내용으로 변경되었는지 확인") + void SUCCESS_uploadStampDeprecated() { // given - - final Long missionId = 1L; - - List imgPaths = new ArrayList<>("requestImage1", "requestImage2"); - final Long requestUserId = 1L; - - final String requestContents = "requestContents"; - final String requestImage = "requestImage"; - final Long requestMissionId = 1L; + val requestUserId = 1L; + val requestMissionId = 1L; + val requestContents = "requestContents"; + List imgPaths = List.of("requestImage1", "requestImage2"); RegisterStampRequest stampRequest = new RegisterStampRequest(); stampRequest.setContents(requestContents); - stampRequest.setImage(requestImage); - stampRequest.setMissionId(requestMissionId); + val stamp = this.convertStampImgDeprecated(stampRequest, imgPaths, requestUserId, requestMissionId); //when - val imgList = new ArrayList<>(imgPaths); - val stamp = this.convertStampImgDeprecated(stampRequest, imgList, requestUserId, requestMissionId); + Mockito.when(stampRepository.save(stamp)).thenReturn(stamp); val newStamp = stampRepository.save(stamp); - return StampInfo.Stamp.builder() + StampInfo.Stamp expected = StampInfo.Stamp.builder() .id(newStamp.getId()) .contents(newStamp.getContents()) .images(newStamp.getImages()) @@ -94,11 +99,28 @@ void uploadStampDeprecated() { .build(); //then + Assertions.assertEquals(expected.getId(), stamp.getId()); + Assertions.assertEquals(expected.getImages(), imgPaths); + Assertions.assertEquals(expected.getContents(), requestContents); + } - + private Stamp convertStampImgDeprecated( + RegisterStampRequest stampRequest, + List imgList, + Long userId, + Long missionId) { + return Stamp.builder() + .contents(stampRequest.getContents()) + .createdAt(LocalDateTime.now()) + .images(imgList) + .missionId(missionId) + .userId(userId) + .build(); } + + /* TODO: Implement the following tests @Test - void uploadStamp() { + void SUCCESS_uploadStamp() { } @Test From dff957fe66c51902c6e12f66ccc6dfc1f3c67932 Mon Sep 17 00:00:00 2001 From: kseysh Date: Wed, 20 Mar 2024 01:31:42 +0900 Subject: [PATCH 020/141] =?UTF-8?q?feat:=20application/stamp/uploadStamp?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20#217?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/application/StampServiceTest.java | 90 ++++++++++++------- 1 file changed, 60 insertions(+), 30 deletions(-) diff --git a/src/test/java/org/sopt/app/application/StampServiceTest.java b/src/test/java/org/sopt/app/application/StampServiceTest.java index 883baa1b..6f33a989 100644 --- a/src/test/java/org/sopt/app/application/StampServiceTest.java +++ b/src/test/java/org/sopt/app/application/StampServiceTest.java @@ -1,13 +1,12 @@ package org.sopt.app.application; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyLong; import java.time.LocalDateTime; -import java.util.ArrayList; import java.util.List; import java.util.Optional; -import lombok.val; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -36,10 +35,10 @@ class StampServiceTest { @DisplayName("SUCCESS_UserId와 MissionId로 스탬프를 찾으면 StampInfo.Stamp DTO 반환") void SUCCESS_findStamp() { //given - val stampUserId = anyLong(); - val stampMissionId = anyLong(); - val stampId = 1L; - val stamp = Stamp.builder().id(stampId).userId(stampUserId).missionId(stampMissionId).build(); + final Long stampUserId = anyLong(); + final Long stampMissionId = anyLong(); + final Long stampId = 1L; + final Stamp stamp = Stamp.builder().id(stampId).userId(stampUserId).missionId(stampMissionId).build(); //when Mockito.when(stampRepository.findByUserIdAndMissionId(stampUserId, stampMissionId)) @@ -62,8 +61,8 @@ void SUCCESS_findStamp() { @DisplayName("FAIL_스탬프를 찾지 못하면 BadRequestException 발생") void FAIL_findStampBadRequest() { //given - val anyUserId = anyLong(); - val anyMissionId = anyLong(); + final Long anyUserId = anyLong(); + final Long anyMissionId = anyLong(); //when Mockito.when(stampRepository.findByUserIdAndMissionId(anyUserId, anyMissionId)) @@ -79,17 +78,27 @@ void FAIL_findStampBadRequest() { @DisplayName("SUCCESS_스탬프가 request에서 보낸 내용의 이미지와 내용으로 변경되었는지 확인") void SUCCESS_uploadStampDeprecated() { // given - val requestUserId = 1L; - val requestMissionId = 1L; - val requestContents = "requestContents"; - List imgPaths = List.of("requestImage1", "requestImage2"); + final Long requestUserId = 1L; + final Long requestMissionId = 1L; + final String requestContents = "requestContents"; + final List imgPaths = List.of("requestImage1", "requestImage2"); + RegisterStampRequest stampRequest = new RegisterStampRequest(); stampRequest.setContents(requestContents); - val stamp = this.convertStampImgDeprecated(stampRequest, imgPaths, requestUserId, requestMissionId); + + Stamp stamp = Stamp.builder() + .id(1L) + .contents(stampRequest.getContents()) + .createdAt(LocalDateTime.now()) + .images(imgPaths) + .missionId(requestMissionId) + .userId(requestUserId) + .build(); //when - Mockito.when(stampRepository.save(stamp)).thenReturn(stamp); - val newStamp = stampRepository.save(stamp); + Mockito.when(stampRepository.save(any(Stamp.class))).thenReturn(stamp); + + Stamp newStamp = stampRepository.save(stamp); StampInfo.Stamp expected = StampInfo.Stamp.builder() .id(newStamp.getId()) .contents(newStamp.getContents()) @@ -97,31 +106,52 @@ void SUCCESS_uploadStampDeprecated() { .createdAt(newStamp.getCreatedAt()) .updatedAt(newStamp.getUpdatedAt()) .build(); + StampInfo.Stamp result = stampService.uploadStampDeprecated(stampRequest, imgPaths, requestUserId, requestMissionId); //then - Assertions.assertEquals(expected.getId(), stamp.getId()); - Assertions.assertEquals(expected.getImages(), imgPaths); - Assertions.assertEquals(expected.getContents(), requestContents); + assertThat(result).usingRecursiveComparison().isEqualTo(expected); } - private Stamp convertStampImgDeprecated( - RegisterStampRequest stampRequest, - List imgList, - Long userId, - Long missionId) { - return Stamp.builder() + @Test + @DisplayName("SUCCESS_스탬프가 request에서 보낸 내용의 이미지와 내용으로 변경되었는지 확인") + void SUCCESS_uploadStamp() { + // given + final Long requestUserId = 1L; + final Long requestMissionId = 1L; + final String requestContents = "requestContents"; + final String requestImage = "requestImage"; + + RegisterStampRequest stampRequest = new RegisterStampRequest(); + stampRequest.setContents(requestContents); + stampRequest.setImage(requestImage); + stampRequest.setMissionId(requestMissionId); + + Stamp stamp = Stamp.builder() .contents(stampRequest.getContents()) .createdAt(LocalDateTime.now()) - .images(imgList) - .missionId(missionId) - .userId(userId) + .images(List.of(stampRequest.getImage())) + .missionId(stampRequest.getMissionId()) + .userId(requestUserId) .build(); + + //when + Mockito.when(stampRepository.save(any(Stamp.class))).thenReturn(stamp); + Stamp newStamp = stampRepository.save(stamp); + StampInfo.Stamp expected = StampInfo.Stamp.builder() + .id(newStamp.getId()) + .contents(newStamp.getContents()) + .images(newStamp.getImages()) + .createdAt(newStamp.getCreatedAt()) + .updatedAt(newStamp.getUpdatedAt()) + .build(); + + StampInfo.Stamp result = stampService.uploadStamp(stampRequest, requestUserId); + + //then + assertThat(result).usingRecursiveComparison().isEqualTo(expected); } /* TODO: Implement the following tests - @Test - void SUCCESS_uploadStamp() { - } @Test void editStampContentsDeprecated() { From 3411d1ece70fc8e22b471e582243945b3f401618 Mon Sep 17 00:00:00 2001 From: kseysh Date: Wed, 20 Mar 2024 13:17:30 +0900 Subject: [PATCH 021/141] =?UTF-8?q?chore:=20application/stamp/uploadStamp?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=20displayname=20=EB=B3=80=EA=B2=BD=20#217?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/sopt/app/application/StampServiceTest.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/test/java/org/sopt/app/application/StampServiceTest.java b/src/test/java/org/sopt/app/application/StampServiceTest.java index 6f33a989..7f966a2b 100644 --- a/src/test/java/org/sopt/app/application/StampServiceTest.java +++ b/src/test/java/org/sopt/app/application/StampServiceTest.java @@ -75,7 +75,7 @@ void FAIL_findStampBadRequest() { } @Test - @DisplayName("SUCCESS_스탬프가 request에서 보낸 내용의 이미지와 내용으로 변경되었는지 확인") + @DisplayName("SUCCESS_스탬프가 request에서 보낸 내용의 이미지와 내용으로 등록되었는지 확인") void SUCCESS_uploadStampDeprecated() { // given final Long requestUserId = 1L; @@ -113,7 +113,7 @@ void SUCCESS_uploadStampDeprecated() { } @Test - @DisplayName("SUCCESS_스탬프가 request에서 보낸 내용의 이미지와 내용으로 변경되었는지 확인") + @DisplayName("SUCCESS_스탬프가 request에서 보낸 내용의 이미지와 내용으로 등록되었는지 확인") void SUCCESS_uploadStamp() { // given final Long requestUserId = 1L; @@ -151,11 +151,11 @@ void SUCCESS_uploadStamp() { assertThat(result).usingRecursiveComparison().isEqualTo(expected); } - /* TODO: Implement the following tests - @Test void editStampContentsDeprecated() { + } + /* TODO: Implement the following tests @Test void editStampContents() { From 9c53c475f4b48350afbbd97d9f84ea72ab77f76c Mon Sep 17 00:00:00 2001 From: kseysh Date: Wed, 20 Mar 2024 14:08:06 +0900 Subject: [PATCH 022/141] =?UTF-8?q?feat:=20application/stamp/editStampDepr?= =?UTF-8?q?ecated=EA=B4=80=EB=A0=A8=20=EC=84=B1=EA=B3=B5=20=EC=BC=80?= =?UTF-8?q?=EC=9D=B4=EC=8A=A4=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EA=B0=9C?= =?UTF-8?q?=EB=B0=9C=20#217?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/application/StampServiceTest.java | 65 ++++++++++++++++++- 1 file changed, 63 insertions(+), 2 deletions(-) diff --git a/src/test/java/org/sopt/app/application/StampServiceTest.java b/src/test/java/org/sopt/app/application/StampServiceTest.java index 7f966a2b..e229fe97 100644 --- a/src/test/java/org/sopt/app/application/StampServiceTest.java +++ b/src/test/java/org/sopt/app/application/StampServiceTest.java @@ -20,6 +20,7 @@ import org.sopt.app.common.exception.BadRequestException; import org.sopt.app.domain.entity.Stamp; import org.sopt.app.interfaces.postgres.StampRepository; +import org.sopt.app.presentation.stamp.StampRequest; import org.sopt.app.presentation.stamp.StampRequest.RegisterStampRequest; @ExtendWith(MockitoExtension.class) @@ -106,7 +107,8 @@ void SUCCESS_uploadStampDeprecated() { .createdAt(newStamp.getCreatedAt()) .updatedAt(newStamp.getUpdatedAt()) .build(); - StampInfo.Stamp result = stampService.uploadStampDeprecated(stampRequest, imgPaths, requestUserId, requestMissionId); + StampInfo.Stamp result = stampService.uploadStampDeprecated(stampRequest, imgPaths, requestUserId, + requestMissionId); //then assertThat(result).usingRecursiveComparison().isEqualTo(expected); @@ -152,10 +154,69 @@ void SUCCESS_uploadStamp() { } @Test - void editStampContentsDeprecated() { + @DisplayName("SUCCESS_스탬프가 request에서 보낸 내용의 이미지와 내용으로 변경되었는지 확인") + void SUCCESS_editStampContentsDeprecated() { + // given + final Long requestUserId = anyLong(); + final Long requestMissionId = anyLong(); + final String requestContents = "requestContents"; + final String requestImage = "requestImage"; + + StampRequest.EditStampRequest editStampRequest = new StampRequest.EditStampRequest(); + editStampRequest.setContents(requestContents); + editStampRequest.setImage(requestImage); + + //when + final Long stampId = 1L; + final LocalDateTime createdAt = LocalDateTime.of(2024,1,1,0,0,0); + final LocalDateTime unchangedUpdatedAt = LocalDateTime.of(2024,1,1,0,0,0); + Mockito.when(stampRepository.findByUserIdAndMissionId(requestUserId, requestMissionId)) + .thenReturn(Optional.of(Stamp.builder() + .id(stampId) + .contents("oldContents") + .images(List.of("oldImage")) + .createdAt(createdAt) + .updatedAt(unchangedUpdatedAt) + .missionId(requestMissionId) + .userId(requestUserId) + .build())); + + final LocalDateTime changedUpdatedAt = LocalDateTime.of(2024,2,2,0,0,0); + Mockito.when(stampRepository.save(any(Stamp.class))).thenReturn(Stamp.builder() + .id(stampId) + .contents(editStampRequest.getContents()) + .images(List.of(editStampRequest.getImage())) + .createdAt(createdAt) + .updatedAt(changedUpdatedAt) + .missionId(requestMissionId) + .userId(requestUserId) + .build()); + //then + + StampInfo.Stamp expected = StampInfo.Stamp.builder() + .id(stampId) + .contents(editStampRequest.getContents()) + .images(List.of(editStampRequest.getImage())) + .createdAt(createdAt) + .updatedAt(changedUpdatedAt) + .build(); + StampInfo.Stamp result = stampService.editStampContentsDeprecated(editStampRequest, requestUserId, requestMissionId); + + assertThat(result).usingRecursiveComparison().isEqualTo(expected); } + /* TODO: Implement the following tests + @Test + @DisplayName("SUCCESS_request의 contents가 빈 문자열이면 contents를 변경하지 않음") + void FAIL_editStampContentsDeprecated() { + } + + @Test + @DisplayName("FAIL_스탬프를 찾지 못하면 BadRequestException 발생") + void FAIL_editStampContentsDeprecated() { + } + @Test void editStampContents() { From 430e38aec2a00a20d95281a539e31f6fe3442aac Mon Sep 17 00:00:00 2001 From: kseysh Date: Wed, 20 Mar 2024 14:36:24 +0900 Subject: [PATCH 023/141] =?UTF-8?q?feat:=20editStampDeprecated=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20contents=EC=97=90=20=EB=B9=88=20=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=EB=A7=81=20=EC=A0=9C=EA=B3=B5=EC=8B=9C=20contents=EB=A5=BC=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=ED=95=98=EC=A7=80=20=EC=95=8A=EB=8A=94=20?= =?UTF-8?q?=EC=9A=94=EA=B5=AC=EC=82=AC=ED=95=AD=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EA=B0=9C=EB=B0=9C=20#217?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/application/StampServiceTest.java | 72 +++++++++++++------ 1 file changed, 50 insertions(+), 22 deletions(-) diff --git a/src/test/java/org/sopt/app/application/StampServiceTest.java b/src/test/java/org/sopt/app/application/StampServiceTest.java index e229fe97..421da8c1 100644 --- a/src/test/java/org/sopt/app/application/StampServiceTest.java +++ b/src/test/java/org/sopt/app/application/StampServiceTest.java @@ -22,6 +22,7 @@ import org.sopt.app.interfaces.postgres.StampRepository; import org.sopt.app.presentation.stamp.StampRequest; import org.sopt.app.presentation.stamp.StampRequest.RegisterStampRequest; +import org.springframework.util.StringUtils; @ExtendWith(MockitoExtension.class) class StampServiceTest { @@ -167,22 +168,57 @@ void SUCCESS_editStampContentsDeprecated() { editStampRequest.setImage(requestImage); //when + StampInfo.Stamp expected = getExpectedEditStampDeprecated(editStampRequest, requestUserId, requestMissionId); + StampInfo.Stamp result = stampService.editStampContentsDeprecated(editStampRequest, requestUserId, requestMissionId); + + assertThat(result).usingRecursiveComparison().isEqualTo(expected); + } + + @Test + @DisplayName("SUCCESS_request의 contents가 빈 문자열이면 contents를 변경하지 않음") + void SUCCESS_editStampContentsDeprecatedNoChangeContents() { + // given + final Long requestUserId = anyLong(); + final Long requestMissionId = anyLong(); + + final String requestBlankContents = ""; + final String requestImage = "requestImage"; + StampRequest.EditStampRequest editStampRequest = new StampRequest.EditStampRequest(); + editStampRequest.setContents(requestBlankContents); + editStampRequest.setImage(requestImage); + + //when + StampInfo.Stamp expected = getExpectedEditStampDeprecated(editStampRequest, requestUserId, requestMissionId); + StampInfo.Stamp result = stampService.editStampContentsDeprecated(editStampRequest, requestUserId, requestMissionId); + + //then + assertThat(result).usingRecursiveComparison().isEqualTo(expected); + } + + private StampInfo.Stamp getExpectedEditStampDeprecated(StampRequest.EditStampRequest editStampRequest, Long requestUserId, Long requestMissionId) { final Long stampId = 1L; final LocalDateTime createdAt = LocalDateTime.of(2024,1,1,0,0,0); final LocalDateTime unchangedUpdatedAt = LocalDateTime.of(2024,1,1,0,0,0); - Mockito.when(stampRepository.findByUserIdAndMissionId(requestUserId, requestMissionId)) - .thenReturn(Optional.of(Stamp.builder() - .id(stampId) - .contents("oldContents") - .images(List.of("oldImage")) - .createdAt(createdAt) - .updatedAt(unchangedUpdatedAt) - .missionId(requestMissionId) - .userId(requestUserId) - .build())); + + final Optional oldStamp = Optional.of(Stamp.builder() + .id(stampId) + .contents("oldContents") + .images(List.of("oldImage")) + .createdAt(createdAt) + .updatedAt(unchangedUpdatedAt) + .missionId(requestMissionId) + .userId(requestUserId) + .build()); + + Mockito.when(stampRepository.findByUserIdAndMissionId(requestUserId, requestMissionId)).thenReturn(oldStamp); final LocalDateTime changedUpdatedAt = LocalDateTime.of(2024,2,2,0,0,0); - Mockito.when(stampRepository.save(any(Stamp.class))).thenReturn(Stamp.builder() + + if (!StringUtils.hasText(editStampRequest.getContents())) { + editStampRequest.setContents(oldStamp.get().getContents()); + } + + final Stamp newStamp = Stamp.builder() .id(stampId) .contents(editStampRequest.getContents()) .images(List.of(editStampRequest.getImage())) @@ -190,28 +226,20 @@ void SUCCESS_editStampContentsDeprecated() { .updatedAt(changedUpdatedAt) .missionId(requestMissionId) .userId(requestUserId) - .build()); + .build(); - //then + Mockito.when(stampRepository.save(any(Stamp.class))).thenReturn(newStamp); - StampInfo.Stamp expected = StampInfo.Stamp.builder() + return StampInfo.Stamp.builder() .id(stampId) .contents(editStampRequest.getContents()) .images(List.of(editStampRequest.getImage())) .createdAt(createdAt) .updatedAt(changedUpdatedAt) .build(); - StampInfo.Stamp result = stampService.editStampContentsDeprecated(editStampRequest, requestUserId, requestMissionId); - - assertThat(result).usingRecursiveComparison().isEqualTo(expected); } /* TODO: Implement the following tests - @Test - @DisplayName("SUCCESS_request의 contents가 빈 문자열이면 contents를 변경하지 않음") - void FAIL_editStampContentsDeprecated() { - } - @Test @DisplayName("FAIL_스탬프를 찾지 못하면 BadRequestException 발생") void FAIL_editStampContentsDeprecated() { From 0b8a4029ffd579a7a8f2f36cf2b9c0c7a09a6f0d Mon Sep 17 00:00:00 2001 From: kseysh Date: Wed, 20 Mar 2024 14:42:30 +0900 Subject: [PATCH 024/141] =?UTF-8?q?feat:=20editStampDeprecated=20=EC=8B=A4?= =?UTF-8?q?=ED=8C=A8=20=EC=BC=80=EC=9D=B4=EC=8A=A4=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EA=B0=9C=EB=B0=9C=20#217?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sopt/app/application/StampServiceTest.java | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/test/java/org/sopt/app/application/StampServiceTest.java b/src/test/java/org/sopt/app/application/StampServiceTest.java index 421da8c1..b6ab5da9 100644 --- a/src/test/java/org/sopt/app/application/StampServiceTest.java +++ b/src/test/java/org/sopt/app/application/StampServiceTest.java @@ -239,13 +239,24 @@ private StampInfo.Stamp getExpectedEditStampDeprecated(StampRequest.EditStampReq .build(); } - /* TODO: Implement the following tests @Test @DisplayName("FAIL_스탬프를 찾지 못하면 BadRequestException 발생") void FAIL_editStampContentsDeprecated() { - } + //given + final Long requestUserId = anyLong(); + final Long requestMissionId = anyLong(); + final StampRequest.EditStampRequest editStampRequest = new StampRequest.EditStampRequest(); + + //when + Mockito.when(stampRepository.findByUserIdAndMissionId(requestUserId, requestMissionId)).thenReturn(Optional.empty()); + //then + Assertions.assertThrows(BadRequestException.class, () -> { + stampService.editStampContentsDeprecated(editStampRequest, requestUserId, requestMissionId); + }); + } + /* TODO: Implement the following tests @Test void editStampContents() { } From 9115194612bbc81ed988ec66f5c6789a79eb0267 Mon Sep 17 00:00:00 2001 From: kseysh Date: Wed, 20 Mar 2024 14:46:35 +0900 Subject: [PATCH 025/141] =?UTF-8?q?chore:=20editStampDeprecated=20displayn?= =?UTF-8?q?ame=20=EB=84=A4=EC=9D=B4=EB=B0=8D=EC=97=90=20DEPRECATED=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20#217?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/sopt/app/application/StampServiceTest.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/test/java/org/sopt/app/application/StampServiceTest.java b/src/test/java/org/sopt/app/application/StampServiceTest.java index b6ab5da9..47cdef18 100644 --- a/src/test/java/org/sopt/app/application/StampServiceTest.java +++ b/src/test/java/org/sopt/app/application/StampServiceTest.java @@ -155,7 +155,7 @@ void SUCCESS_uploadStamp() { } @Test - @DisplayName("SUCCESS_스탬프가 request에서 보낸 내용의 이미지와 내용으로 변경되었는지 확인") + @DisplayName("SUCCESS_스탬프가 request에서 보낸 내용의 이미지와 내용으로 변경되었는지 확인_DEPRECATED") void SUCCESS_editStampContentsDeprecated() { // given final Long requestUserId = anyLong(); @@ -175,7 +175,7 @@ void SUCCESS_editStampContentsDeprecated() { } @Test - @DisplayName("SUCCESS_request의 contents가 빈 문자열이면 contents를 변경하지 않음") + @DisplayName("SUCCESS_request의 contents가 빈 문자열이면 contents를 변경하지 않음_DEPRECATED") void SUCCESS_editStampContentsDeprecatedNoChangeContents() { // given final Long requestUserId = anyLong(); @@ -240,7 +240,7 @@ private StampInfo.Stamp getExpectedEditStampDeprecated(StampRequest.EditStampReq } @Test - @DisplayName("FAIL_스탬프를 찾지 못하면 BadRequestException 발생") + @DisplayName("FAIL_스탬프를 찾지 못하면 BadRequestException 발생_DEPRECATED") void FAIL_editStampContentsDeprecated() { //given final Long requestUserId = anyLong(); @@ -256,11 +256,13 @@ void FAIL_editStampContentsDeprecated() { }); } - /* TODO: Implement the following tests + @Test - void editStampContents() { + void SUCCESS_editStampContents() { + } + /* TODO: Implement the following tests @Test void editStampImagesDeprecated() { } From 1c6eeb6046a8798baf2b5b6e3aa19b377aa8a04f Mon Sep 17 00:00:00 2001 From: kseysh Date: Wed, 20 Mar 2024 14:50:19 +0900 Subject: [PATCH 026/141] =?UTF-8?q?chore:=20editStampContentsDeprecated=20?= =?UTF-8?q?displayName=20=EB=84=A4=EC=9D=B4=EB=B0=8D=20=EB=B3=80=EA=B2=BD?= =?UTF-8?q?=20#217?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/org/sopt/app/application/StampServiceTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/test/java/org/sopt/app/application/StampServiceTest.java b/src/test/java/org/sopt/app/application/StampServiceTest.java index 47cdef18..fe2b3b47 100644 --- a/src/test/java/org/sopt/app/application/StampServiceTest.java +++ b/src/test/java/org/sopt/app/application/StampServiceTest.java @@ -155,7 +155,7 @@ void SUCCESS_uploadStamp() { } @Test - @DisplayName("SUCCESS_스탬프가 request에서 보낸 내용의 이미지와 내용으로 변경되었는지 확인_DEPRECATED") + @DisplayName("SUCCESS_request에서 보낸 내용의 이미지와 내용의 스탬프 DTO를 잘 반환하는지 확인_DEPRECATED") void SUCCESS_editStampContentsDeprecated() { // given final Long requestUserId = anyLong(); @@ -258,6 +258,7 @@ void FAIL_editStampContentsDeprecated() { @Test + @DisplayName("SUCCESS_request에서 보낸 내용의 이미지와 내용의 스탬프 DTO를 잘 반환하는지 확인") void SUCCESS_editStampContents() { } From 81ff9bb2c8451102993b6e70dea823539337a9aa Mon Sep 17 00:00:00 2001 From: kseysh Date: Wed, 20 Mar 2024 15:17:54 +0900 Subject: [PATCH 027/141] =?UTF-8?q?feat:=20getExpectedEditStamp=ED=95=A8?= =?UTF-8?q?=EC=88=98=EA=B0=80=20Deprecated=EC=99=80=20=EC=95=84=EB=8B=8C?= =?UTF-8?q?=20editStamp=ED=95=A8=EC=88=98=20=EB=AA=A8=EB=91=90=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=ED=95=A0=20=EC=88=98=20=EC=9E=88=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=20=20#217?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/application/StampServiceTest.java | 52 ++++++++++++++++--- 1 file changed, 46 insertions(+), 6 deletions(-) diff --git a/src/test/java/org/sopt/app/application/StampServiceTest.java b/src/test/java/org/sopt/app/application/StampServiceTest.java index fe2b3b47..da2208ac 100644 --- a/src/test/java/org/sopt/app/application/StampServiceTest.java +++ b/src/test/java/org/sopt/app/application/StampServiceTest.java @@ -166,9 +166,10 @@ void SUCCESS_editStampContentsDeprecated() { StampRequest.EditStampRequest editStampRequest = new StampRequest.EditStampRequest(); editStampRequest.setContents(requestContents); editStampRequest.setImage(requestImage); + editStampRequest.setMissionId(requestMissionId); //when - StampInfo.Stamp expected = getExpectedEditStampDeprecated(editStampRequest, requestUserId, requestMissionId); + StampInfo.Stamp expected = getExpectedEditStamp(editStampRequest, requestUserId, true); StampInfo.Stamp result = stampService.editStampContentsDeprecated(editStampRequest, requestUserId, requestMissionId); assertThat(result).usingRecursiveComparison().isEqualTo(expected); @@ -186,16 +187,17 @@ void SUCCESS_editStampContentsDeprecatedNoChangeContents() { StampRequest.EditStampRequest editStampRequest = new StampRequest.EditStampRequest(); editStampRequest.setContents(requestBlankContents); editStampRequest.setImage(requestImage); + editStampRequest.setMissionId(requestMissionId); //when - StampInfo.Stamp expected = getExpectedEditStampDeprecated(editStampRequest, requestUserId, requestMissionId); + StampInfo.Stamp expected = getExpectedEditStamp(editStampRequest, requestUserId, true); StampInfo.Stamp result = stampService.editStampContentsDeprecated(editStampRequest, requestUserId, requestMissionId); //then assertThat(result).usingRecursiveComparison().isEqualTo(expected); } - private StampInfo.Stamp getExpectedEditStampDeprecated(StampRequest.EditStampRequest editStampRequest, Long requestUserId, Long requestMissionId) { + private StampInfo.Stamp getExpectedEditStamp(StampRequest.EditStampRequest editStampRequest, Long requestUserId, boolean isDeprecated) { final Long stampId = 1L; final LocalDateTime createdAt = LocalDateTime.of(2024,1,1,0,0,0); final LocalDateTime unchangedUpdatedAt = LocalDateTime.of(2024,1,1,0,0,0); @@ -206,11 +208,11 @@ private StampInfo.Stamp getExpectedEditStampDeprecated(StampRequest.EditStampReq .images(List.of("oldImage")) .createdAt(createdAt) .updatedAt(unchangedUpdatedAt) - .missionId(requestMissionId) + .missionId(editStampRequest.getMissionId()) .userId(requestUserId) .build()); - Mockito.when(stampRepository.findByUserIdAndMissionId(requestUserId, requestMissionId)).thenReturn(oldStamp); + Mockito.when(stampRepository.findByUserIdAndMissionId(requestUserId, editStampRequest.getMissionId())).thenReturn(oldStamp); final LocalDateTime changedUpdatedAt = LocalDateTime.of(2024,2,2,0,0,0); @@ -218,13 +220,17 @@ private StampInfo.Stamp getExpectedEditStampDeprecated(StampRequest.EditStampReq editStampRequest.setContents(oldStamp.get().getContents()); } + if (isDeprecated && !StringUtils.hasText(editStampRequest.getImage())) { + editStampRequest.setImage(oldStamp.get().getImages().get(0)); + } + final Stamp newStamp = Stamp.builder() .id(stampId) .contents(editStampRequest.getContents()) .images(List.of(editStampRequest.getImage())) .createdAt(createdAt) .updatedAt(changedUpdatedAt) - .missionId(requestMissionId) + .missionId(editStampRequest.getMissionId()) .userId(requestUserId) .build(); @@ -260,10 +266,44 @@ void FAIL_editStampContentsDeprecated() { @Test @DisplayName("SUCCESS_request에서 보낸 내용의 이미지와 내용의 스탬프 DTO를 잘 반환하는지 확인") void SUCCESS_editStampContents() { +// given + final Long requestUserId = anyLong(); + final Long requestMissionId = anyLong(); + final String requestContents = "requestContents"; + final String requestImage = "requestImage"; + + StampRequest.EditStampRequest editStampRequest = new StampRequest.EditStampRequest(); + editStampRequest.setContents(requestContents); + editStampRequest.setImage(requestImage); + editStampRequest.setMissionId(requestMissionId); + + //when + StampInfo.Stamp expected = getExpectedEditStamp(editStampRequest, requestUserId, false); + StampInfo.Stamp result = stampService.editStampContents(editStampRequest, requestUserId); + + assertThat(result).usingRecursiveComparison().isEqualTo(expected); } /* TODO: Implement the following tests + @Test + @DisplayName("SUCCESS_SUCCESS_request의 contents가 빈 문자열이면 contents를 변경하지 않음") + void SUCCESS_editStampContents() { + + } + + @Test + @DisplayName("SUCCESS_SUCCESS_request의 image가 빈 문자열이면 image를 변경하지 않음") + void SUCCESS_editStampContents() { + + } + + @Test + @DisplayName("FAIL_스탬프를 찾지 못하면 BadRequestException 발생") + void SUCCESS_editStampContents() { + + } + @Test void editStampImagesDeprecated() { } From d98dbecb91b8cd6d1186d1743a02adcf2eb43e70 Mon Sep 17 00:00:00 2001 From: kseysh Date: Wed, 20 Mar 2024 16:45:24 +0900 Subject: [PATCH 028/141] =?UTF-8?q?feat:=20editStampContents=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=EB=B9=88=20=EC=8A=A4=ED=8A=B8=EB=A7=81=EC=9D=B4=20?= =?UTF-8?q?request=EB=A1=9C=20=EC=A0=84=EB=8B=AC=EB=90=98=EC=97=88?= =?UTF-8?q?=EC=9D=84=20=EB=95=8C=EC=9D=98=20=EC=9A=94=EA=B5=AC=EC=82=AC?= =?UTF-8?q?=ED=95=AD=20=EB=B0=98=EC=98=81=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EB=B0=8F=20getExpectedEditStamp=20=ED=95=A8=EC=88=98=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC=20#217?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/application/StampServiceTest.java | 110 +++++++++++++----- 1 file changed, 80 insertions(+), 30 deletions(-) diff --git a/src/test/java/org/sopt/app/application/StampServiceTest.java b/src/test/java/org/sopt/app/application/StampServiceTest.java index da2208ac..062bca5d 100644 --- a/src/test/java/org/sopt/app/application/StampServiceTest.java +++ b/src/test/java/org/sopt/app/application/StampServiceTest.java @@ -108,8 +108,8 @@ void SUCCESS_uploadStampDeprecated() { .createdAt(newStamp.getCreatedAt()) .updatedAt(newStamp.getUpdatedAt()) .build(); - StampInfo.Stamp result = stampService.uploadStampDeprecated(stampRequest, imgPaths, requestUserId, - requestMissionId); + StampInfo.Stamp result = stampService.uploadStampDeprecated( + stampRequest, imgPaths, requestUserId, requestMissionId); //then assertThat(result).usingRecursiveComparison().isEqualTo(expected); @@ -169,8 +169,10 @@ void SUCCESS_editStampContentsDeprecated() { editStampRequest.setMissionId(requestMissionId); //when - StampInfo.Stamp expected = getExpectedEditStamp(editStampRequest, requestUserId, true); - StampInfo.Stamp result = stampService.editStampContentsDeprecated(editStampRequest, requestUserId, requestMissionId); + Stamp oldStamp = getSavedStamp(requestMissionId, requestUserId); + StampInfo.Stamp expected = editStamp(oldStamp, editStampRequest, requestUserId, true); + StampInfo.Stamp result = stampService.editStampContentsDeprecated(editStampRequest, requestUserId, + requestMissionId); assertThat(result).usingRecursiveComparison().isEqualTo(expected); } @@ -190,57 +192,67 @@ void SUCCESS_editStampContentsDeprecatedNoChangeContents() { editStampRequest.setMissionId(requestMissionId); //when - StampInfo.Stamp expected = getExpectedEditStamp(editStampRequest, requestUserId, true); - StampInfo.Stamp result = stampService.editStampContentsDeprecated(editStampRequest, requestUserId, requestMissionId); + Stamp oldStamp = getSavedStamp(requestMissionId, requestUserId); + editStamp(oldStamp, editStampRequest, requestUserId, true); + + StampInfo.Stamp result = stampService.editStampContentsDeprecated(editStampRequest, requestUserId, + requestMissionId); //then - assertThat(result).usingRecursiveComparison().isEqualTo(expected); + Assertions.assertEquals(oldStamp.getContents(), result.getContents()); } - private StampInfo.Stamp getExpectedEditStamp(StampRequest.EditStampRequest editStampRequest, Long requestUserId, boolean isDeprecated) { + private Stamp getSavedStamp(Long missionId, Long requestUserId) { final Long stampId = 1L; - final LocalDateTime createdAt = LocalDateTime.of(2024,1,1,0,0,0); - final LocalDateTime unchangedUpdatedAt = LocalDateTime.of(2024,1,1,0,0,0); + final String contents = "savedContents"; + final List images = List.of("savedImage"); + final LocalDateTime createdAt = LocalDateTime.of(2024, 1, 1, 0, 0, 0); + final LocalDateTime savedUpdatedAt = LocalDateTime.of(2024, 1, 1, 0, 0, 0); - final Optional oldStamp = Optional.of(Stamp.builder() + final Optional savedStamp = Optional.of(Stamp.builder() .id(stampId) - .contents("oldContents") - .images(List.of("oldImage")) + .contents(contents) + .images(images) .createdAt(createdAt) - .updatedAt(unchangedUpdatedAt) - .missionId(editStampRequest.getMissionId()) + .updatedAt(savedUpdatedAt) + .missionId(missionId) .userId(requestUserId) .build()); - Mockito.when(stampRepository.findByUserIdAndMissionId(requestUserId, editStampRequest.getMissionId())).thenReturn(oldStamp); + Mockito.when(stampRepository.findByUserIdAndMissionId(requestUserId, missionId)).thenReturn(savedStamp); - final LocalDateTime changedUpdatedAt = LocalDateTime.of(2024,2,2,0,0,0); + return savedStamp.get(); + } + private StampInfo.Stamp editStamp(Stamp oldStamp, StampRequest.EditStampRequest editStampRequest, + Long requestUserId, boolean isDeprecated) { if (!StringUtils.hasText(editStampRequest.getContents())) { - editStampRequest.setContents(oldStamp.get().getContents()); + editStampRequest.setContents(oldStamp.getContents()); } if (isDeprecated && !StringUtils.hasText(editStampRequest.getImage())) { - editStampRequest.setImage(oldStamp.get().getImages().get(0)); + editStampRequest.setImage(oldStamp.getImages().get(0)); } + final LocalDateTime changedUpdatedAt = LocalDateTime.of(2024, 2, 2, 0, 0, 0); + final Stamp newStamp = Stamp.builder() - .id(stampId) + .id(oldStamp.getId()) .contents(editStampRequest.getContents()) .images(List.of(editStampRequest.getImage())) - .createdAt(createdAt) + .createdAt(oldStamp.getCreatedAt()) .updatedAt(changedUpdatedAt) .missionId(editStampRequest.getMissionId()) .userId(requestUserId) .build(); - Mockito.when(stampRepository.save(any(Stamp.class))).thenReturn(newStamp); + Mockito.when(stampRepository.save(newStamp)).thenReturn(newStamp); return StampInfo.Stamp.builder() - .id(stampId) + .id(oldStamp.getId()) .contents(editStampRequest.getContents()) .images(List.of(editStampRequest.getImage())) - .createdAt(createdAt) + .createdAt(oldStamp.getCreatedAt()) .updatedAt(changedUpdatedAt) .build(); } @@ -254,7 +266,8 @@ void FAIL_editStampContentsDeprecated() { final StampRequest.EditStampRequest editStampRequest = new StampRequest.EditStampRequest(); //when - Mockito.when(stampRepository.findByUserIdAndMissionId(requestUserId, requestMissionId)).thenReturn(Optional.empty()); + Mockito.when(stampRepository.findByUserIdAndMissionId(requestUserId, requestMissionId)) + .thenReturn(Optional.empty()); //then Assertions.assertThrows(BadRequestException.class, () -> { @@ -278,25 +291,62 @@ void SUCCESS_editStampContents() { editStampRequest.setMissionId(requestMissionId); //when - StampInfo.Stamp expected = getExpectedEditStamp(editStampRequest, requestUserId, false); + Stamp oldStamp = getSavedStamp(requestMissionId, requestUserId); + StampInfo.Stamp expected = editStamp(oldStamp, editStampRequest, requestUserId, false); StampInfo.Stamp result = stampService.editStampContents(editStampRequest, requestUserId); + //then assertThat(result).usingRecursiveComparison().isEqualTo(expected); - } - /* TODO: Implement the following tests @Test @DisplayName("SUCCESS_SUCCESS_request의 contents가 빈 문자열이면 contents를 변경하지 않음") - void SUCCESS_editStampContents() { + void SUCCESS_editStampContentsNoContents() { + // given + final Long requestUserId = anyLong(); + final Long requestMissionId = anyLong(); + final String requestBlankContents = ""; + final String requestImage = "requestImage"; + StampRequest.EditStampRequest editStampRequest = new StampRequest.EditStampRequest(); + editStampRequest.setContents(requestBlankContents); + editStampRequest.setImage(requestImage); + editStampRequest.setMissionId(requestMissionId); + + //when + Stamp oldStamp = getSavedStamp(requestMissionId, requestUserId); + StampInfo.Stamp expected = editStamp(oldStamp, editStampRequest, requestUserId, false); + StampInfo.Stamp result = stampService.editStampContents(editStampRequest, requestUserId); + + //then + Assertions.assertEquals(oldStamp.getContents(), result.getContents()); + Assertions.assertEquals(expected.getImages(), result.getImages()); } @Test @DisplayName("SUCCESS_SUCCESS_request의 image가 빈 문자열이면 image를 변경하지 않음") - void SUCCESS_editStampContents() { + void SUCCESS_editStampContentsNoImage() { + // given + final Long requestUserId = anyLong(); + final Long requestMissionId = anyLong(); + + final String requestContents = "requestContents"; + final String requestBlankImage = ""; + StampRequest.EditStampRequest editStampRequest = new StampRequest.EditStampRequest(); + editStampRequest.setContents(requestContents); + editStampRequest.setImage(requestBlankImage); + editStampRequest.setMissionId(requestMissionId); + //when + Stamp oldStamp = getSavedStamp(requestMissionId, requestUserId); + StampInfo.Stamp expected = editStamp(oldStamp, editStampRequest, requestUserId, false); + StampInfo.Stamp result = stampService.editStampContents(editStampRequest, requestUserId); + + //then + Assertions.assertEquals(oldStamp.getImages(), result.getImages()); + Assertions.assertEquals(expected.getContents(), result.getContents()); } + /* TODO: Implement the following tests @Test @DisplayName("FAIL_스탬프를 찾지 못하면 BadRequestException 발생") From ad8e34f47a122b5de892a3e2dc8a9d689e2604b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A3=BC=EC=96=B4=EC=A7=84=EC=82=AC=EB=9E=91=28eojinjoo?= =?UTF-8?q?=29?= Date: Wed, 20 Mar 2024 23:36:09 +0900 Subject: [PATCH 029/141] feat: s3ServiceTest --- .../sopt/app/application/S3ServiceTest.java | 134 ++++++++++++++++++ 1 file changed, 134 insertions(+) create mode 100644 src/test/java/org/sopt/app/application/S3ServiceTest.java diff --git a/src/test/java/org/sopt/app/application/S3ServiceTest.java b/src/test/java/org/sopt/app/application/S3ServiceTest.java new file mode 100644 index 00000000..ac26e95e --- /dev/null +++ b/src/test/java/org/sopt/app/application/S3ServiceTest.java @@ -0,0 +1,134 @@ +package org.sopt.app.application; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.doThrow; +import static org.mockito.Mockito.when; + +import com.amazonaws.AmazonServiceException; +import com.amazonaws.services.s3.AmazonS3; +import com.amazonaws.services.s3.model.PutObjectResult; +import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.util.List; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.sopt.app.application.s3.S3Info; +import org.sopt.app.application.s3.S3Service; +import org.sopt.app.common.exception.BadRequestException; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.mock.web.MockMultipartFile; + +@SpringBootTest +public class S3ServiceTest { + + @Mock + private static AmazonS3 s3Client; + + @InjectMocks + private S3Service s3Service; + + @Test + @DisplayName("SUCCESS_uploadDeprecatedNull") + void SUCCESS_uploadDeprecatedNull() throws MalformedURLException { + when(s3Client.putObject(any())).thenReturn(new PutObjectResult()); + when(s3Client.getUrl(any(), any())).thenReturn(new URL("http://url.com")); + + List result = s3Service.uploadDeprecated(null); + Assertions.assertEquals(0, result.size()); + } + + @Test + @DisplayName("SUCCESS_uploadDeprecatedEmpty") + void SUCCESS_uploadDeprecatedEmpty() throws MalformedURLException { + when(s3Client.putObject(any())).thenReturn(new PutObjectResult()); + when(s3Client.getUrl(any(), any())).thenReturn(new URL("http://url.com")); + + List result = s3Service.uploadDeprecated( + List.of(new MockMultipartFile("name", (byte[]) null)) + ); + Assertions.assertEquals(0, result.size()); + } + + @Test + @DisplayName("SUCCESS_uploadDeprecatedNotNull") + void SUCCESS_uploadDeprecatedNotNull() throws MalformedURLException { + when(s3Client.putObject(any())).thenReturn(new PutObjectResult()); + when(s3Client.getUrl(any(), any())).thenReturn(new URL("http://url.com")); + + List result = s3Service.uploadDeprecated( + List.of(new MockMultipartFile("files", "image.jpg", "text/plain", + "1234".getBytes(StandardCharsets.UTF_8))) + ); + Assertions.assertEquals(1, result.size()); + } + + @Test() + @DisplayName("FAIL_uploadDeprecatedInvalidFilename") + void FAIL_uploadDeprecatedInvalidFilename() throws IOException { + when(s3Client.putObject(any())).thenReturn(new PutObjectResult()); + when(s3Client.getUrl(any(), any())).thenReturn(new URL("http://url.com")); + + Assertions.assertThrows(BadRequestException.class, () -> { + s3Service.uploadDeprecated( + List.of(new MockMultipartFile("files", "", "text/plain", + "1234".getBytes(StandardCharsets.UTF_8)))); + }); + } + + @Test + @DisplayName("FAIL_uploadDeprecatedInvalidExtension") + void FAIL_uploadDeprecatedInvalidExtension() throws IOException { + when(s3Client.putObject(any())).thenReturn(new PutObjectResult()); + when(s3Client.getUrl(any(), any())).thenReturn(new URL("http://url.com")); + + Assertions.assertThrows(BadRequestException.class, () -> { + s3Service.uploadDeprecated( + List.of(new MockMultipartFile("files", "file.csv", "text/plain", + "1234".getBytes(StandardCharsets.UTF_8)))); + }); + } + + @Test + @DisplayName("SUCCESS_getPreSignedUrl") + void SUCCESS_getPreSignedUrl() throws MalformedURLException { + when(s3Client.generatePresignedUrl(any(), any(), any(), any())) + .thenReturn(new URL("http://url.com")); + + S3Info.PreSignedUrl result = s3Service.getPreSignedUrl("FolderName"); + Assertions.assertEquals("http://url.com", result.getPreSignedURL()); + Assertions.assertEquals("nullFolderName", result.getImageURL().substring(0, 14)); + } + + @Test + @DisplayName("FAIL_getPreSignedUrlNullPointerException") + void FAIL_getPreSignedUrlNullPointerException() { + when(s3Client.generatePresignedUrl(any(), any(), any(), any())) + .thenThrow(NullPointerException.class); + + Assertions.assertThrows(BadRequestException.class, () -> { + s3Service.getPreSignedUrl("FolderName"); + }); + } + + @Test + @DisplayName("SUCCESS_deleteFiles") + void SUCCESS_deleteFiles() { + doNothing().when(s3Client).deleteObject(any(), any()); + + s3Service.deleteFiles(List.of("https://url.com"), "folderName"); + } + + @Test + @DisplayName("FAIL_deleteFiles") + void FAIL_deleteFiles() { + doThrow(AmazonServiceException.class).when(s3Client).deleteObject(any(), any()); + + s3Service.deleteFiles(List.of("https://url.com"), "folderName"); + } +} \ No newline at end of file From 43a5f662751520a55df59206b2ea79c03e048278 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A3=BC=EC=96=B4=EC=A7=84=EC=82=AC=EB=9E=91=28eojinjoo?= =?UTF-8?q?=29?= Date: Thu, 21 Mar 2024 00:38:01 +0900 Subject: [PATCH 030/141] =?UTF-8?q?refactor:=20S3,=20Description=20?= =?UTF-8?q?=EB=8F=84=EB=A9=94=EC=9D=B8=20Test=20=ED=98=95=EC=8B=9D=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/DescriptionServiceTest.java | 32 +++++++++++++------ .../sopt/app/application/S3ServiceTest.java | 22 ++++++------- .../app/facade/DescriptionFacadeTest.java | 19 ++++++----- .../MainDescriptionRepositoryTest.java | 2 +- 4 files changed, 45 insertions(+), 30 deletions(-) diff --git a/src/test/java/org/sopt/app/application/DescriptionServiceTest.java b/src/test/java/org/sopt/app/application/DescriptionServiceTest.java index f442b38a..6ebeeed0 100644 --- a/src/test/java/org/sopt/app/application/DescriptionServiceTest.java +++ b/src/test/java/org/sopt/app/application/DescriptionServiceTest.java @@ -1,11 +1,18 @@ package org.sopt.app.application; +import static org.mockito.Mockito.when; + import java.util.List; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import org.mockito.Mockito; +import org.junit.jupiter.api.TestInstance; +import org.junit.jupiter.api.TestInstance.Lifecycle; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; import org.sopt.app.application.description.DescriptionInfo; import org.sopt.app.application.description.DescriptionService; import org.sopt.app.domain.entity.MainDescription; @@ -14,17 +21,19 @@ import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest +@TestInstance(Lifecycle.PER_CLASS) +@ExtendWith(MockitoExtension.class) public class DescriptionServiceTest { - private static MainDescriptionRepository mainDescriptionRepository = Mockito.mock(MainDescriptionRepository.class); + @Mock + private MainDescriptionRepository mainDescriptionRepository; - private DescriptionService descriptionService = new DescriptionService( - mainDescriptionRepository - ); + @InjectMocks + private DescriptionService descriptionService; @BeforeAll - private static void beforeTest() { - Mockito.when(mainDescriptionRepository.findAll()).thenReturn(List.of( + private void beforeTest() { + when(mainDescriptionRepository.findAll()).thenReturn(List.of( MainDescription.builder() .id(1L) .activeTopDescription("activeTop") @@ -36,25 +45,28 @@ private static void beforeTest() { } @Test - @DisplayName("SUCCESS_getMainDescriptionActive") + @DisplayName("SUCCESS_활동 유저 메인 문구 조회") void SUCCESS_getMainDescriptionActive() { DescriptionInfo.MainDescription result = descriptionService.getMainDescription(UserStatus.ACTIVE); + Assertions.assertEquals("activeTop", result.getTopDescription()); Assertions.assertEquals("activeBottom", result.getBottomDescription()); } @Test - @DisplayName("SUCCESS_getMainDescriptionInactive") + @DisplayName("SUCCESS_비활동 유저 메인 문구 조회") void SUCCESS_getMainDescriptionInactive() { DescriptionInfo.MainDescription result = descriptionService.getMainDescription(UserStatus.INACTIVE); + Assertions.assertEquals("inactiveTop", result.getTopDescription()); Assertions.assertEquals("inactiveBottom", result.getBottomDescription()); } @Test - @DisplayName("SUCCESS_getMainDescriptionUnauthenticated") + @DisplayName("SUCCESS_미인증 유저 메인 문구 조회") void SUCCESS_getMainDescriptionUnauthenticated() { DescriptionInfo.MainDescription result = descriptionService.getMainDescription(UserStatus.UNAUTHENTICATED); + Assertions.assertEquals("inactiveTop", result.getTopDescription()); Assertions.assertEquals("inactiveBottom", result.getBottomDescription()); } diff --git a/src/test/java/org/sopt/app/application/S3ServiceTest.java b/src/test/java/org/sopt/app/application/S3ServiceTest.java index ac26e95e..4759aad5 100644 --- a/src/test/java/org/sopt/app/application/S3ServiceTest.java +++ b/src/test/java/org/sopt/app/application/S3ServiceTest.java @@ -28,13 +28,13 @@ public class S3ServiceTest { @Mock - private static AmazonS3 s3Client; + private AmazonS3 s3Client; @InjectMocks private S3Service s3Service; @Test - @DisplayName("SUCCESS_uploadDeprecatedNull") + @DisplayName("SUCCESS_업로드(DEPRECATED) 파일 리스트 null일 때") void SUCCESS_uploadDeprecatedNull() throws MalformedURLException { when(s3Client.putObject(any())).thenReturn(new PutObjectResult()); when(s3Client.getUrl(any(), any())).thenReturn(new URL("http://url.com")); @@ -44,7 +44,7 @@ void SUCCESS_uploadDeprecatedNull() throws MalformedURLException { } @Test - @DisplayName("SUCCESS_uploadDeprecatedEmpty") + @DisplayName("SUCCESS_업로드(DEPRECATED) 파일 리스트 첫 원소 empty일 때") void SUCCESS_uploadDeprecatedEmpty() throws MalformedURLException { when(s3Client.putObject(any())).thenReturn(new PutObjectResult()); when(s3Client.getUrl(any(), any())).thenReturn(new URL("http://url.com")); @@ -56,7 +56,7 @@ void SUCCESS_uploadDeprecatedEmpty() throws MalformedURLException { } @Test - @DisplayName("SUCCESS_uploadDeprecatedNotNull") + @DisplayName("SUCCESS_업로드(DEPRECATED) 파일 리스트 not null일 때") void SUCCESS_uploadDeprecatedNotNull() throws MalformedURLException { when(s3Client.putObject(any())).thenReturn(new PutObjectResult()); when(s3Client.getUrl(any(), any())).thenReturn(new URL("http://url.com")); @@ -69,7 +69,7 @@ void SUCCESS_uploadDeprecatedNotNull() throws MalformedURLException { } @Test() - @DisplayName("FAIL_uploadDeprecatedInvalidFilename") + @DisplayName("FAIL_업로드(DEPRECATED) 잘못된 파일명") void FAIL_uploadDeprecatedInvalidFilename() throws IOException { when(s3Client.putObject(any())).thenReturn(new PutObjectResult()); when(s3Client.getUrl(any(), any())).thenReturn(new URL("http://url.com")); @@ -82,7 +82,7 @@ void FAIL_uploadDeprecatedInvalidFilename() throws IOException { } @Test - @DisplayName("FAIL_uploadDeprecatedInvalidExtension") + @DisplayName("FAIL_업로드(DEPRECATED) 잘못된 파일 확장자") void FAIL_uploadDeprecatedInvalidExtension() throws IOException { when(s3Client.putObject(any())).thenReturn(new PutObjectResult()); when(s3Client.getUrl(any(), any())).thenReturn(new URL("http://url.com")); @@ -95,7 +95,7 @@ void FAIL_uploadDeprecatedInvalidExtension() throws IOException { } @Test - @DisplayName("SUCCESS_getPreSignedUrl") + @DisplayName("SUCCESS_PreSignedUrl 조회 성공") void SUCCESS_getPreSignedUrl() throws MalformedURLException { when(s3Client.generatePresignedUrl(any(), any(), any(), any())) .thenReturn(new URL("http://url.com")); @@ -106,7 +106,7 @@ void SUCCESS_getPreSignedUrl() throws MalformedURLException { } @Test - @DisplayName("FAIL_getPreSignedUrlNullPointerException") + @DisplayName("FAIL_PreSignedUrl 조회 중 NullPointerException 발생") void FAIL_getPreSignedUrlNullPointerException() { when(s3Client.generatePresignedUrl(any(), any(), any(), any())) .thenThrow(NullPointerException.class); @@ -117,7 +117,7 @@ void FAIL_getPreSignedUrlNullPointerException() { } @Test - @DisplayName("SUCCESS_deleteFiles") + @DisplayName("SUCCESS_파일 삭제") void SUCCESS_deleteFiles() { doNothing().when(s3Client).deleteObject(any(), any()); @@ -125,8 +125,8 @@ void SUCCESS_deleteFiles() { } @Test - @DisplayName("FAIL_deleteFiles") - void FAIL_deleteFiles() { + @DisplayName("FAIL_파일 삭제 중 AmazonServiceException 발생") + void FAIL_deleteFilesAmazonServiceException() { doThrow(AmazonServiceException.class).when(s3Client).deleteObject(any(), any()); s3Service.deleteFiles(List.of("https://url.com"), "folderName"); diff --git a/src/test/java/org/sopt/app/facade/DescriptionFacadeTest.java b/src/test/java/org/sopt/app/facade/DescriptionFacadeTest.java index 2de864ba..99cb23e0 100644 --- a/src/test/java/org/sopt/app/facade/DescriptionFacadeTest.java +++ b/src/test/java/org/sopt/app/facade/DescriptionFacadeTest.java @@ -5,6 +5,8 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; import org.mockito.Mockito; import org.sopt.app.application.auth.PlaygroundAuthInfo.UserActiveInfo; import org.sopt.app.application.auth.PlaygroundAuthService; @@ -18,16 +20,17 @@ @SpringBootTest public class DescriptionFacadeTest { - private static DescriptionService descriptionService = Mockito.mock(DescriptionService.class); - private static PlaygroundAuthService playgroundAuthService = Mockito.mock(PlaygroundAuthService.class); + @Mock + private DescriptionService descriptionService; - private DescriptionFacade descriptionFacade = new DescriptionFacade( - descriptionService, - playgroundAuthService - ); + @Mock + private PlaygroundAuthService playgroundAuthService; + + @InjectMocks + private DescriptionFacade descriptionFacade; @Test - @DisplayName("SUCCESS_getMainDescriptionForUserActive") + @DisplayName("SUCCESS_활동 유저 메인 문구 조회") void SUCCESS_getMainDescriptionForUserActive() { UserStatus userStatus = UserStatus.ACTIVE; Mockito.when(playgroundAuthService.getPlaygroundUserActiveInfo(any())) @@ -42,7 +45,7 @@ void SUCCESS_getMainDescriptionForUserActive() { } @Test - @DisplayName("SUCCESS_getMainDescriptionForUserInactive") + @DisplayName("SUCCESS_비활동 유저 메인 문구 조회") void SUCCESS_getMainDescriptionForUserInactive() { UserStatus userStatus = UserStatus.INACTIVE; Mockito.when(playgroundAuthService.getPlaygroundUserActiveInfo(any())) diff --git a/src/test/java/org/sopt/app/interfaces/postgres/MainDescriptionRepositoryTest.java b/src/test/java/org/sopt/app/interfaces/postgres/MainDescriptionRepositoryTest.java index e678edc4..ef6c82dc 100644 --- a/src/test/java/org/sopt/app/interfaces/postgres/MainDescriptionRepositoryTest.java +++ b/src/test/java/org/sopt/app/interfaces/postgres/MainDescriptionRepositoryTest.java @@ -12,7 +12,7 @@ public class MainDescriptionRepositoryTest { private MainDescriptionRepository mainDescriptionRepository; @Test - @DisplayName("SUCCESS_findAll") + @DisplayName("SUCCESS_메인 문구 전체 조회") void SUCCESS_findAll() { System.out.println(mainDescriptionRepository.findAll()); } From 38983ce4d90cbdf019f6c2a9738c1c27b0b1f57c Mon Sep 17 00:00:00 2001 From: kseysh Date: Thu, 21 Mar 2024 01:30:05 +0900 Subject: [PATCH 031/141] =?UTF-8?q?feat:=20editStampContents=20=EC=8B=A4?= =?UTF-8?q?=ED=8C=A8=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BC=80=EC=9D=B4?= =?UTF-8?q?=EC=8A=A4=20=EC=B6=94=EA=B0=80=20#217?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/application/StampServiceTest.java | 28 +++++++++++++------ 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/src/test/java/org/sopt/app/application/StampServiceTest.java b/src/test/java/org/sopt/app/application/StampServiceTest.java index 062bca5d..63160da0 100644 --- a/src/test/java/org/sopt/app/application/StampServiceTest.java +++ b/src/test/java/org/sopt/app/application/StampServiceTest.java @@ -39,12 +39,9 @@ void SUCCESS_findStamp() { //given final Long stampUserId = anyLong(); final Long stampMissionId = anyLong(); - final Long stampId = 1L; - final Stamp stamp = Stamp.builder().id(stampId).userId(stampUserId).missionId(stampMissionId).build(); + final Stamp stamp = getSavedStamp(stampMissionId, stampUserId); //when - Mockito.when(stampRepository.findByUserIdAndMissionId(stampUserId, stampMissionId)) - .thenReturn(Optional.of(stamp)); StampInfo.Stamp expected = StampInfo.Stamp.builder() .id(stamp.getId()) .contents(stamp.getContents()) @@ -56,7 +53,6 @@ void SUCCESS_findStamp() { //then assertThat(result).usingRecursiveComparison().isEqualTo(expected); - Assertions.assertInstanceOf(StampInfo.Stamp.class, result); } @Test @@ -230,8 +226,9 @@ private StampInfo.Stamp editStamp(Stamp oldStamp, StampRequest.EditStampRequest editStampRequest.setContents(oldStamp.getContents()); } - if (isDeprecated && !StringUtils.hasText(editStampRequest.getImage())) { + if (!isDeprecated && !StringUtils.hasText(editStampRequest.getImage())) { editStampRequest.setImage(oldStamp.getImages().get(0)); + } final LocalDateTime changedUpdatedAt = LocalDateTime.of(2024, 2, 2, 0, 0, 0); @@ -246,7 +243,7 @@ private StampInfo.Stamp editStamp(Stamp oldStamp, StampRequest.EditStampRequest .userId(requestUserId) .build(); - Mockito.when(stampRepository.save(newStamp)).thenReturn(newStamp); + Mockito.when(stampRepository.save(any(Stamp.class))).thenReturn(newStamp); return StampInfo.Stamp.builder() .id(oldStamp.getId()) @@ -346,13 +343,26 @@ void SUCCESS_editStampContentsNoImage() { Assertions.assertEquals(oldStamp.getImages(), result.getImages()); Assertions.assertEquals(expected.getContents(), result.getContents()); } - /* TODO: Implement the following tests @Test @DisplayName("FAIL_스탬프를 찾지 못하면 BadRequestException 발생") - void SUCCESS_editStampContents() { + void FAIL_editStampContents() { + //given + final Long requestUserId = anyLong(); + final Long requestMissionId = anyLong(); + final StampRequest.EditStampRequest editStampRequest = new StampRequest.EditStampRequest(); + editStampRequest.setMissionId(requestMissionId); + //when + Mockito.when(stampRepository.findByUserIdAndMissionId(requestUserId, requestMissionId)) + .thenReturn(Optional.empty()); + + //then + Assertions.assertThrows(BadRequestException.class, () -> { + stampService.editStampContents(editStampRequest, requestUserId); + }); } + /* TODO: Implement the following tests @Test void editStampImagesDeprecated() { From bf58be2e971d96dcddd9021d3a392b1b76810337 Mon Sep 17 00:00:00 2001 From: kseysh Date: Thu, 21 Mar 2024 17:33:02 +0900 Subject: [PATCH 032/141] =?UTF-8?q?feat:=20editStampImageDeprecated=20?= =?UTF-8?q?=EC=84=B1=EA=B3=B5=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20#217?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/application/StampServiceTest.java | 57 +++++++++++++++---- 1 file changed, 47 insertions(+), 10 deletions(-) diff --git a/src/test/java/org/sopt/app/application/StampServiceTest.java b/src/test/java/org/sopt/app/application/StampServiceTest.java index 63160da0..e95c36ad 100644 --- a/src/test/java/org/sopt/app/application/StampServiceTest.java +++ b/src/test/java/org/sopt/app/application/StampServiceTest.java @@ -18,6 +18,7 @@ import org.sopt.app.application.stamp.StampInfo; import org.sopt.app.application.stamp.StampService; import org.sopt.app.common.exception.BadRequestException; +import org.sopt.app.common.response.ErrorCode; import org.sopt.app.domain.entity.Stamp; import org.sopt.app.interfaces.postgres.StampRepository; import org.sopt.app.presentation.stamp.StampRequest; @@ -166,7 +167,7 @@ void SUCCESS_editStampContentsDeprecated() { //when Stamp oldStamp = getSavedStamp(requestMissionId, requestUserId); - StampInfo.Stamp expected = editStamp(oldStamp, editStampRequest, requestUserId, true); + StampInfo.Stamp expected = editStamp(oldStamp, editStampRequest, requestUserId, true, false); StampInfo.Stamp result = stampService.editStampContentsDeprecated(editStampRequest, requestUserId, requestMissionId); @@ -189,7 +190,7 @@ void SUCCESS_editStampContentsDeprecatedNoChangeContents() { //when Stamp oldStamp = getSavedStamp(requestMissionId, requestUserId); - editStamp(oldStamp, editStampRequest, requestUserId, true); + editStamp(oldStamp, editStampRequest, requestUserId, true, false); StampInfo.Stamp result = stampService.editStampContentsDeprecated(editStampRequest, requestUserId, requestMissionId); @@ -221,12 +222,12 @@ private Stamp getSavedStamp(Long missionId, Long requestUserId) { } private StampInfo.Stamp editStamp(Stamp oldStamp, StampRequest.EditStampRequest editStampRequest, - Long requestUserId, boolean isDeprecated) { - if (!StringUtils.hasText(editStampRequest.getContents())) { + Long requestUserId, boolean isDeprecatedEditStampContents, boolean isDeprecatedEditStampImages) { + if (!isDeprecatedEditStampImages && !StringUtils.hasText(editStampRequest.getContents())) { editStampRequest.setContents(oldStamp.getContents()); } - if (!isDeprecated && !StringUtils.hasText(editStampRequest.getImage())) { + if (!isDeprecatedEditStampContents && !StringUtils.hasText(editStampRequest.getImage())) { editStampRequest.setImage(oldStamp.getImages().get(0)); } @@ -289,7 +290,7 @@ void SUCCESS_editStampContents() { //when Stamp oldStamp = getSavedStamp(requestMissionId, requestUserId); - StampInfo.Stamp expected = editStamp(oldStamp, editStampRequest, requestUserId, false); + StampInfo.Stamp expected = editStamp(oldStamp, editStampRequest, requestUserId, false, false); StampInfo.Stamp result = stampService.editStampContents(editStampRequest, requestUserId); //then @@ -312,7 +313,7 @@ void SUCCESS_editStampContentsNoContents() { //when Stamp oldStamp = getSavedStamp(requestMissionId, requestUserId); - StampInfo.Stamp expected = editStamp(oldStamp, editStampRequest, requestUserId, false); + StampInfo.Stamp expected = editStamp(oldStamp, editStampRequest, requestUserId, false, false); StampInfo.Stamp result = stampService.editStampContents(editStampRequest, requestUserId); //then @@ -336,7 +337,7 @@ void SUCCESS_editStampContentsNoImage() { //when Stamp oldStamp = getSavedStamp(requestMissionId, requestUserId); - StampInfo.Stamp expected = editStamp(oldStamp, editStampRequest, requestUserId, false); + StampInfo.Stamp expected = editStamp(oldStamp, editStampRequest, requestUserId, false, false); StampInfo.Stamp result = stampService.editStampContents(editStampRequest, requestUserId); //then @@ -362,12 +363,48 @@ void FAIL_editStampContents() { stampService.editStampContents(editStampRequest, requestUserId); }); } - /* TODO: Implement the following tests @Test - void editStampImagesDeprecated() { + @DisplayName("SUCCESS_스탬프 이미지 변경") + void SUCCESS_editStampImagesDeprecated() { + // given + final List imgPaths = List.of("requestImage"); + + Stamp oldStamp = Stamp.builder() + .id(1L) + .contents("oldContents") + .images(List.of("oldImage")) + .createdAt(LocalDateTime.now()) + .updatedAt(LocalDateTime.now()) + .build(); + + StampInfo.Stamp oldStampInfo = StampInfo.Stamp.builder() + .id(oldStamp.getId()) + .contents(oldStamp.getContents()) + .images(oldStamp.getImages()) + .createdAt(oldStamp.getCreatedAt()) + .updatedAt(oldStamp.getUpdatedAt()) + .build(); + + Mockito.when(stampRepository.findById(anyLong())).thenReturn(Optional.of(oldStamp)); + oldStamp.changeImages(imgPaths); + Mockito.when(stampRepository.save(any(Stamp.class))).thenReturn(oldStamp); + + StampInfo.Stamp result = stampService.editStampImagesDeprecated(oldStampInfo, imgPaths); + + assertThat(result.getImages()).usingRecursiveComparison().isEqualTo(imgPaths); } + /* TODO: Implement the following tests + + @Test + @DisplayName("FAIL_스탬프를 찾지 못하면 BadRequestException 발생") + void SUCCESS_editStampImagesDeprecated() { + // given + + + + } @Test void checkDuplicateStamp() { } From 562a3589e1939b7263118fbc08edb1d85d3de933 Mon Sep 17 00:00:00 2001 From: kseysh Date: Thu, 21 Mar 2024 17:39:09 +0900 Subject: [PATCH 033/141] =?UTF-8?q?feat:=20editStampImageDeprecated=20?= =?UTF-8?q?=EC=8B=A4=ED=8C=A8=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20#217?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/application/StampServiceTest.java | 33 ++++++++++++++++--- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/src/test/java/org/sopt/app/application/StampServiceTest.java b/src/test/java/org/sopt/app/application/StampServiceTest.java index e95c36ad..70203159 100644 --- a/src/test/java/org/sopt/app/application/StampServiceTest.java +++ b/src/test/java/org/sopt/app/application/StampServiceTest.java @@ -386,25 +386,48 @@ void SUCCESS_editStampImagesDeprecated() { .updatedAt(oldStamp.getUpdatedAt()) .build(); + //when Mockito.when(stampRepository.findById(anyLong())).thenReturn(Optional.of(oldStamp)); oldStamp.changeImages(imgPaths); Mockito.when(stampRepository.save(any(Stamp.class))).thenReturn(oldStamp); - StampInfo.Stamp result = stampService.editStampImagesDeprecated(oldStampInfo, imgPaths); - - assertThat(result.getImages()).usingRecursiveComparison().isEqualTo(imgPaths); + //then + Assertions.assertEquals(imgPaths, stampService.editStampImagesDeprecated(oldStampInfo, imgPaths).getImages()); } - /* TODO: Implement the following tests @Test @DisplayName("FAIL_스탬프를 찾지 못하면 BadRequestException 발생") - void SUCCESS_editStampImagesDeprecated() { + void FAIL_editStampImagesDeprecated() { // given + final List imgPaths = List.of("requestImage"); + Stamp oldStamp = Stamp.builder() + .id(1L) + .contents("oldContents") + .images(List.of("oldImage")) + .createdAt(LocalDateTime.now()) + .updatedAt(LocalDateTime.now()) + .build(); + StampInfo.Stamp oldStampInfo = StampInfo.Stamp.builder() + .id(oldStamp.getId()) + .contents(oldStamp.getContents()) + .images(oldStamp.getImages()) + .createdAt(oldStamp.getCreatedAt()) + .updatedAt(oldStamp.getUpdatedAt()) + .build(); + //when + Mockito.when(stampRepository.findById(anyLong())).thenReturn(Optional.empty()); + + //then + Assertions.assertThrows(BadRequestException.class, () -> { + stampService.editStampImagesDeprecated(oldStampInfo, imgPaths); + }); } + /* TODO: Implement the following tests + @Test void checkDuplicateStamp() { } From 6c1bc134b03ea44e2b6d493c2da16ebc34401efb Mon Sep 17 00:00:00 2001 From: kseysh Date: Thu, 21 Mar 2024 17:46:54 +0900 Subject: [PATCH 034/141] =?UTF-8?q?feat:=20checkDuplicateStamp=20=EC=84=B1?= =?UTF-8?q?=EA=B3=B5=20=EB=B0=8F=20=EC=8B=A4=ED=8C=A8=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=B6=94=EA=B0=80=20#217?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/application/StampServiceTest.java | 33 +++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/src/test/java/org/sopt/app/application/StampServiceTest.java b/src/test/java/org/sopt/app/application/StampServiceTest.java index 70203159..959a139b 100644 --- a/src/test/java/org/sopt/app/application/StampServiceTest.java +++ b/src/test/java/org/sopt/app/application/StampServiceTest.java @@ -426,12 +426,41 @@ void FAIL_editStampImagesDeprecated() { stampService.editStampImagesDeprecated(oldStampInfo, imgPaths); }); } - /* TODO: Implement the following tests @Test - void checkDuplicateStamp() { + @DisplayName("SUCCESS_중복된 스탬프가 없으면 오류가 발생하지 않음") + void SUCCESS_checkDuplicateStamp() { + //given + final Long anyUserId = anyLong(); + final Long anyMissionId = anyLong(); + + //when + Mockito.when(stampRepository.findByUserIdAndMissionId(anyUserId, anyMissionId)).thenReturn(Optional.empty()); + + //then + Assertions.assertDoesNotThrow(() -> { + stampService.checkDuplicateStamp(anyUserId, anyMissionId); + }); } + @Test + @DisplayName("SUCCESS_중복된 스탬프가 있으면 BadRequestException 발생") + void FAIL_checkDuplicateStamp() { + //given + final Long anyUserId = anyLong(); + final Long anyMissionId = anyLong(); + + //when + Mockito.when(stampRepository.findByUserIdAndMissionId(anyUserId, anyMissionId)).thenReturn(Optional.of(new Stamp())); + + //then + Assertions.assertThrows(BadRequestException.class, () -> { + stampService.checkDuplicateStamp(anyUserId, anyMissionId); + }); + } + + /* TODO: Implement the following tests + @Test void deleteStampById() { } From 6440df2524ff4ca1f9fe7b4c14eb5b13f49247ca Mon Sep 17 00:00:00 2001 From: kseysh Date: Thu, 21 Mar 2024 17:52:46 +0900 Subject: [PATCH 035/141] =?UTF-8?q?feat:=20deleteStampById=20=EC=84=B1?= =?UTF-8?q?=EA=B3=B5=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?#217?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sopt/app/application/StampServiceTest.java | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/test/java/org/sopt/app/application/StampServiceTest.java b/src/test/java/org/sopt/app/application/StampServiceTest.java index 959a139b..959f37e3 100644 --- a/src/test/java/org/sopt/app/application/StampServiceTest.java +++ b/src/test/java/org/sopt/app/application/StampServiceTest.java @@ -459,12 +459,23 @@ void FAIL_checkDuplicateStamp() { }); } - /* TODO: Implement the following tests - @Test - void deleteStampById() { + @DisplayName("SUCCESS_중복된 스탬프가 있으면 BadRequestException 발생") + void SUCCESS_deleteStampById() { + //given + final Long stampId = anyLong(); + + //when + Mockito.when(stampRepository.findById(stampId)).thenReturn(Optional.of(new Stamp())); + + //then + Assertions.assertDoesNotThrow(() -> { + stampService.deleteStampById(stampId); + }); } + /* TODO: Implement the following tests + @Test void deleteAllStamps() { } From 47c372fe6f350a9ad0169ee5e4652d9fd4c81d7c Mon Sep 17 00:00:00 2001 From: kseysh Date: Thu, 21 Mar 2024 17:54:15 +0900 Subject: [PATCH 036/141] =?UTF-8?q?feat:=20deleteStampById=20=EC=8B=A4?= =?UTF-8?q?=ED=8C=A8=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?#217?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sopt/app/application/StampServiceTest.java | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/test/java/org/sopt/app/application/StampServiceTest.java b/src/test/java/org/sopt/app/application/StampServiceTest.java index 959f37e3..dd1b6f10 100644 --- a/src/test/java/org/sopt/app/application/StampServiceTest.java +++ b/src/test/java/org/sopt/app/application/StampServiceTest.java @@ -460,7 +460,7 @@ void FAIL_checkDuplicateStamp() { } @Test - @DisplayName("SUCCESS_중복된 스탬프가 있으면 BadRequestException 발생") + @DisplayName("SUCCESS_스탬프를 찾으면 삭제") void SUCCESS_deleteStampById() { //given final Long stampId = anyLong(); @@ -474,6 +474,21 @@ void SUCCESS_deleteStampById() { }); } + @Test + @DisplayName("FAIL_스탬프를 찾지 못하면 BadRequestException 발생") + void FAIL_deleteStampById() { + //given + final Long stampId = anyLong(); + + //when + Mockito.when(stampRepository.findById(stampId)).thenReturn(Optional.empty()); + + //then + Assertions.assertThrows(BadRequestException.class, () -> { + stampService.deleteStampById(stampId); + }); + } + /* TODO: Implement the following tests @Test From 832b3b62c372e5be5deba2fc23431aeeaf8b1ab2 Mon Sep 17 00:00:00 2001 From: kseysh Date: Fri, 22 Mar 2024 00:07:37 +0900 Subject: [PATCH 037/141] =?UTF-8?q?feat:=20getMissionIdByStampId=20?= =?UTF-8?q?=EC=84=B1=EA=B3=B5=20=EC=8B=A4=ED=8C=A8=20=EC=BC=80=EC=9D=B4?= =?UTF-8?q?=EC=8A=A4=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?#217?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/application/StampServiceTest.java | 33 ++++++++++++++++--- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/src/test/java/org/sopt/app/application/StampServiceTest.java b/src/test/java/org/sopt/app/application/StampServiceTest.java index dd1b6f10..7010f376 100644 --- a/src/test/java/org/sopt/app/application/StampServiceTest.java +++ b/src/test/java/org/sopt/app/application/StampServiceTest.java @@ -489,15 +489,40 @@ void FAIL_deleteStampById() { }); } - /* TODO: Implement the following tests - @Test void deleteAllStamps() { + + } + + @Test + @DisplayName("SUCCESS_스탬프 아이디로 미션 아이디 조회") + void SUCCESS_getMissionIdByStampId() { + //given + final Long anyStampId = anyLong(); + final Long savedMissionId = 1L; + + //when + Stamp savedStamp = Stamp.builder().missionId(savedMissionId).build(); + Mockito.when(stampRepository.findById(anyStampId)).thenReturn(Optional.of(savedStamp)); + + //then + Assertions.assertEquals(savedMissionId, stampService.getMissionIdByStampId(anyStampId)); } @Test - void getMissionIdByStampId() { + @DisplayName("FAIL_스탬프 아이디로 미션 아이디 조회되지 않을 시 BadRequestException 발생") + void FAIL_getMissionIdByStampId() { + //given + final Long anyStampId = anyLong(); + + //when + Mockito.when(stampRepository.findById(anyStampId)).thenReturn(Optional.empty()); + + //then + Assertions.assertThrows(BadRequestException.class, () -> { + stampService.getMissionIdByStampId(anyStampId); + }); } - */ + } \ No newline at end of file From ee99aca1668ae92df0255a69728068c2798de96d Mon Sep 17 00:00:00 2001 From: kseysh Date: Fri, 22 Mar 2024 14:14:03 +0900 Subject: [PATCH 038/141] =?UTF-8?q?feat:=20deleteAllStamps=20=EC=84=B1?= =?UTF-8?q?=EA=B3=B5=20=EC=BC=80=EC=9D=B4=EC=8A=A4=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=B6=94=EA=B0=80=20#217?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/sopt/app/application/StampServiceTest.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/test/java/org/sopt/app/application/StampServiceTest.java b/src/test/java/org/sopt/app/application/StampServiceTest.java index 7010f376..74f12da8 100644 --- a/src/test/java/org/sopt/app/application/StampServiceTest.java +++ b/src/test/java/org/sopt/app/application/StampServiceTest.java @@ -490,8 +490,15 @@ void FAIL_deleteStampById() { } @Test - void deleteAllStamps() { + @DisplayName("SUCCESS_모든 스탬프 삭제") + void SUCCESS_deleteAllStamps() { + //given + final Long anyUserId = anyLong(); + //then + Assertions.assertDoesNotThrow(() -> { + stampService.deleteAllStamps(anyUserId); + }); } @Test From 4f6f4b89381fb29ff0d3f704cc66d7bb9845f159 Mon Sep 17 00:00:00 2001 From: kseysh Date: Fri, 22 Mar 2024 16:10:53 +0900 Subject: [PATCH 039/141] =?UTF-8?q?feat:=20StampRepository=20=EC=84=B1?= =?UTF-8?q?=EA=B3=B5=20=EC=BC=80=EC=9D=B4=EC=8A=A4=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=B6=94=EA=B0=80=20#217?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../postgres/StampRepositoryTest.java | 73 +++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 src/test/java/org/sopt/app/interfaces/postgres/StampRepositoryTest.java diff --git a/src/test/java/org/sopt/app/interfaces/postgres/StampRepositoryTest.java b/src/test/java/org/sopt/app/interfaces/postgres/StampRepositoryTest.java new file mode 100644 index 00000000..a5ff001e --- /dev/null +++ b/src/test/java/org/sopt/app/interfaces/postgres/StampRepositoryTest.java @@ -0,0 +1,73 @@ +package org.sopt.app.interfaces.postgres; + +import java.util.List; +import java.util.Optional; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.sopt.app.common.config.QuerydslConfiguration; +import org.sopt.app.domain.entity.Stamp; +import org.sopt.app.domain.entity.User; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase; +import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase.Replace; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.context.annotation.Import; + + +@DataJpaTest +@AutoConfigureTestDatabase(replace = Replace.NONE) +@Import(QuerydslConfiguration.class) +class StampRepositoryTest { + + @Autowired + private UserRepository userRepository; + + @Autowired + private StampRepository stampRepository; + + @Test + @DisplayName("SUCCESS_유저 아이디를 이용하여 유저의 스탬프 모두 조회") + void SUCCESS_findAllByUserId() { + //given + final User user = userRepository.save(new User()); + + //when + Stamp stamp1 = stampRepository.save(Stamp.builder().userId(user.getId()).contents("stampContents").build()); + Stamp stamp2 = stampRepository.save(Stamp.builder().userId(user.getId()).contents("stampContents").build()); + + //then + Assertions.assertEquals(List.of(stamp1, stamp2), stampRepository.findAllByUserId(user.getId())); + } + + @Test + @DisplayName("SUCCESS_유저 아이디와 미션 아이디를 이용하여 유저의 스탬프 조회") + void SUCCESS_findByUserIdAndMissionIdSuccess() { + //given + final User user = userRepository.save(new User()); + final Long missionId = 1L; + + //when + Stamp stamp = stampRepository.save(Stamp.builder().userId(user.getId()).missionId(missionId).contents("stampContents").build()); + Optional result = stampRepository.findByUserIdAndMissionId(user.getId(), missionId); + + //then + Assertions.assertEquals(Optional.of(stamp), result); + } + + @Test + @DisplayName("SUCCESS_유저 아이디를 이용하여 유저의 스탬프 모두 삭제") + void SUCCESS_deleteAllByUserIdSuccess() { + //given + final User user = userRepository.save(new User()); + stampRepository.save(Stamp.builder().userId(user.getId()).contents("stampContents").build()); + stampRepository.save(Stamp.builder().userId(user.getId()).contents("stampContents").build()); + + //when + stampRepository.deleteAllByUserId(user.getId()); + + //then + Assertions.assertEquals(List.of(), stampRepository.findAllByUserId(user.getId())); + } + +} From a373bcbc48489f88178d795a0b55a34f02d72e81 Mon Sep 17 00:00:00 2001 From: kseysh Date: Fri, 22 Mar 2024 17:35:46 +0900 Subject: [PATCH 040/141] =?UTF-8?q?chore:=20=EC=82=AC=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20import=EB=AC=B8=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0=20(#217)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/org/sopt/app/application/StampServiceTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/java/org/sopt/app/application/StampServiceTest.java b/src/test/java/org/sopt/app/application/StampServiceTest.java index 74f12da8..70c09a1b 100644 --- a/src/test/java/org/sopt/app/application/StampServiceTest.java +++ b/src/test/java/org/sopt/app/application/StampServiceTest.java @@ -18,7 +18,6 @@ import org.sopt.app.application.stamp.StampInfo; import org.sopt.app.application.stamp.StampService; import org.sopt.app.common.exception.BadRequestException; -import org.sopt.app.common.response.ErrorCode; import org.sopt.app.domain.entity.Stamp; import org.sopt.app.interfaces.postgres.StampRepository; import org.sopt.app.presentation.stamp.StampRequest; From 38e2f77a96619d0c4e9fbdab00464aa8fc0b382f Mon Sep 17 00:00:00 2001 From: kseysh Date: Fri, 22 Mar 2024 23:00:03 +0900 Subject: [PATCH 041/141] =?UTF-8?q?feat:=20SoptampFacadeTest=20=EC=B4=88?= =?UTF-8?q?=EA=B8=B0=20=EC=84=A4=EC=A0=95=20(#217)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sopt/app/facade/SoptampFacadeTest.java | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 src/test/java/org/sopt/app/facade/SoptampFacadeTest.java diff --git a/src/test/java/org/sopt/app/facade/SoptampFacadeTest.java b/src/test/java/org/sopt/app/facade/SoptampFacadeTest.java new file mode 100644 index 00000000..ff3ae7e2 --- /dev/null +++ b/src/test/java/org/sopt/app/facade/SoptampFacadeTest.java @@ -0,0 +1,65 @@ +package org.sopt.app.facade; + +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 org.sopt.app.application.mission.MissionService; +import org.sopt.app.application.s3.S3Service; +import org.sopt.app.application.soptamp.SoptampPointService; +import org.sopt.app.application.soptamp.SoptampUserService; +import org.sopt.app.application.stamp.StampService; + +@ExtendWith(MockitoExtension.class) +class SoptampFacadeTest { + + @Mock + private StampService stampService; + @Mock + private S3Service s3Service; + @Mock + private MissionService missionService; + @Mock + private SoptampUserService soptampUserService; + @Mock + private SoptampPointService soptampPointService; + + @InjectMocks + private SoptampFacade soptampFacade; + + /* TODO: 아래 메서드 구현 + @Test + void uploadStampDeprecated() { + } + + @Test + void uploadStamp() { + } + + @Test + void deleteStamp() { + } + + @Test + void deleteStampAll() { + } + + @Test + void editSoptampUserNickname() { + } + + @Test + void editSoptampUserProfileMessage() { + } + + @Test + void getStampInfo() { + } + + @Test + void editStamp() { + } + + */ +} \ No newline at end of file From b6fb2a6d14d52508ae1241ef96979387d557a8dc Mon Sep 17 00:00:00 2001 From: kseysh Date: Fri, 22 Mar 2024 23:05:04 +0900 Subject: [PATCH 042/141] =?UTF-8?q?chore:=20sotamp=20->=20soptamp=EB=A1=9C?= =?UTF-8?q?=20=EB=84=A4=EC=9D=B4=EB=B0=8D=20=EC=88=98=EC=A0=95=20(#217)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/sopt/app/application/soptamp/SoptampUserService.java | 4 +--- src/main/java/org/sopt/app/facade/SoptampFacade.java | 5 ++--- .../java/org/sopt/app/presentation/user/UserController.java | 2 +- 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/sopt/app/application/soptamp/SoptampUserService.java b/src/main/java/org/sopt/app/application/soptamp/SoptampUserService.java index 6a3305c4..e12e3962 100644 --- a/src/main/java/org/sopt/app/application/soptamp/SoptampUserService.java +++ b/src/main/java/org/sopt/app/application/soptamp/SoptampUserService.java @@ -1,6 +1,5 @@ package org.sopt.app.application.soptamp; -import com.sun.xml.bind.v2.runtime.JaxBeanInfo; import java.util.Comparator; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; @@ -13,7 +12,6 @@ import org.sopt.app.common.response.ErrorCode; import org.sopt.app.domain.entity.SoptampUser; import org.sopt.app.interfaces.postgres.SoptampUserRepository; -import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -24,7 +22,7 @@ public class SoptampUserService { private final SoptampUserRepository soptampUserRepository; @Transactional(readOnly = true) - public SoptampUserInfo.SoptampUser getSotampUserInfo(Long userId) { + public SoptampUserInfo.SoptampUser getSoptampUserInfo(Long userId) { val user = soptampUserRepository.findByUserId(userId) .orElseThrow(() -> new BadRequestException(ErrorCode.USER_NOT_FOUND.getMessage())); return SoptampUserInfo.SoptampUser.builder() diff --git a/src/main/java/org/sopt/app/facade/SoptampFacade.java b/src/main/java/org/sopt/app/facade/SoptampFacade.java index 954b2e6c..c22791ae 100644 --- a/src/main/java/org/sopt/app/facade/SoptampFacade.java +++ b/src/main/java/org/sopt/app/facade/SoptampFacade.java @@ -10,7 +10,6 @@ import org.sopt.app.application.soptamp.SoptampUserService; import org.sopt.app.application.stamp.StampInfo; import org.sopt.app.application.stamp.StampService; -import org.sopt.app.domain.entity.Stamp; import org.sopt.app.presentation.stamp.StampRequest; import org.sopt.app.presentation.stamp.StampRequest.RegisterStampRequest; import org.springframework.stereotype.Service; @@ -65,13 +64,13 @@ public void deleteStampAll(Long userId){ @Transactional public SoptampUserInfo.SoptampUser editSoptampUserNickname(Long userId, String nickname){ - val soptampUser = soptampUserService.getSotampUserInfo(userId); + val soptampUser = soptampUserService.getSoptampUserInfo(userId); return soptampUserService.editNickname(soptampUser, nickname); } @Transactional public SoptampUserInfo.SoptampUser editSoptampUserProfileMessage(Long userId, String newProfileMessage){ - val soptampUser = soptampUserService.getSotampUserInfo(userId); + val soptampUser = soptampUserService.getSoptampUserInfo(userId); return soptampUserService.editProfileMessage(soptampUser, newProfileMessage); } diff --git a/src/main/java/org/sopt/app/presentation/user/UserController.java b/src/main/java/org/sopt/app/presentation/user/UserController.java index 8d38d940..8e19f559 100644 --- a/src/main/java/org/sopt/app/presentation/user/UserController.java +++ b/src/main/java/org/sopt/app/presentation/user/UserController.java @@ -49,7 +49,7 @@ public ResponseEntity getUserInfo(@AuthenticationPrincipal }) @GetMapping(value = "/soptamp") public ResponseEntity getSoptampInfo(@AuthenticationPrincipal User user) { - val SoptampUser = soptampUserService.getSotampUserInfo(user.getId()); + val SoptampUser = soptampUserService.getSoptampUserInfo(user.getId()); val response = UserResponse.Soptamp.builder() .nickname(SoptampUser.getNickname()) .profileMessage(SoptampUser.getProfileMessage()) From 0bab197a98b56a445d906d8842b3663a9d4885af Mon Sep 17 00:00:00 2001 From: kseysh Date: Fri, 22 Mar 2024 23:05:53 +0900 Subject: [PATCH 043/141] =?UTF-8?q?refactor:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=EB=B3=80=EC=88=98=EB=A5=BC=20=EC=A0=9C=EA=B1=B0?= =?UTF-8?q?=ED=95=98=EA=B3=A0=20=EC=A6=89=EC=8B=9C=20return=EC=9D=B4=20?= =?UTF-8?q?=EC=A7=84=ED=96=89=EB=90=98=EB=8F=84=EB=A1=9D=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=20(#217)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/sopt/app/application/soptamp/SoptampUserService.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/org/sopt/app/application/soptamp/SoptampUserService.java b/src/main/java/org/sopt/app/application/soptamp/SoptampUserService.java index e12e3962..afc69524 100644 --- a/src/main/java/org/sopt/app/application/soptamp/SoptampUserService.java +++ b/src/main/java/org/sopt/app/application/soptamp/SoptampUserService.java @@ -127,7 +127,7 @@ private List
getRanking(List userList) { private List
getCurrentRanking(List userList, List soptampPointList) { val rankPoint = new AtomicInteger(1); - val result = soptampPointList.stream().sorted(Comparator.comparing(Point::getPoints).reversed()) + return soptampPointList.stream().sorted(Comparator.comparing(Point::getPoints).reversed()) .map(point -> { val user = userList.stream() .filter(u -> u.getId().equals(point.getSoptampUserId())) @@ -140,7 +140,6 @@ private List
getCurrentRanking(List userList, List sop .profileMessage(user.getProfileMessage()) .build(); }).collect(Collectors.toList()); - return result; } public SoptampUser findRankByNickname(String nickname) { From 3c3c53f5a1e1d3dc80c9fb7a53c3623ee18b6609 Mon Sep 17 00:00:00 2001 From: kseysh Date: Fri, 22 Mar 2024 23:18:09 +0900 Subject: [PATCH 044/141] =?UTF-8?q?refactor:=20gitignore=EC=97=90=20DS=5FS?= =?UTF-8?q?tore=20=EB=B0=8F=20application-test.yml=EC=B6=94=EA=B0=80=20(#2?= =?UTF-8?q?17)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 4 ++ .../sopt/app/facade/SoptampFacadeTest.java | 65 ------------------- 2 files changed, 4 insertions(+), 65 deletions(-) delete mode 100644 src/test/java/org/sopt/app/facade/SoptampFacadeTest.java diff --git a/.gitignore b/.gitignore index 05ae6cf1..f0ca791a 100644 --- a/.gitignore +++ b/.gitignore @@ -36,9 +36,13 @@ out/ ### VS Code ### .vscode/ +### macOS ### +.DS_Store + ### application.yml 파일들에 대한 gitignore 처리 application-local.yml application-prod.yml +application-test.yml ### HTTP 관련 http-client.private.env.json diff --git a/src/test/java/org/sopt/app/facade/SoptampFacadeTest.java b/src/test/java/org/sopt/app/facade/SoptampFacadeTest.java deleted file mode 100644 index ff3ae7e2..00000000 --- a/src/test/java/org/sopt/app/facade/SoptampFacadeTest.java +++ /dev/null @@ -1,65 +0,0 @@ -package org.sopt.app.facade; - -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 org.sopt.app.application.mission.MissionService; -import org.sopt.app.application.s3.S3Service; -import org.sopt.app.application.soptamp.SoptampPointService; -import org.sopt.app.application.soptamp.SoptampUserService; -import org.sopt.app.application.stamp.StampService; - -@ExtendWith(MockitoExtension.class) -class SoptampFacadeTest { - - @Mock - private StampService stampService; - @Mock - private S3Service s3Service; - @Mock - private MissionService missionService; - @Mock - private SoptampUserService soptampUserService; - @Mock - private SoptampPointService soptampPointService; - - @InjectMocks - private SoptampFacade soptampFacade; - - /* TODO: 아래 메서드 구현 - @Test - void uploadStampDeprecated() { - } - - @Test - void uploadStamp() { - } - - @Test - void deleteStamp() { - } - - @Test - void deleteStampAll() { - } - - @Test - void editSoptampUserNickname() { - } - - @Test - void editSoptampUserProfileMessage() { - } - - @Test - void getStampInfo() { - } - - @Test - void editStamp() { - } - - */ -} \ No newline at end of file From 0f91458fe7a692c550ebc186af0000aedd8fe0f2 Mon Sep 17 00:00:00 2001 From: kseysh Date: Fri, 22 Mar 2024 23:27:30 +0900 Subject: [PATCH 045/141] fix: remove untracked .DS_Store (#217) --- .DS_Store | Bin 6148 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .DS_Store diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index 123730f7440f9010b325261fba35a4d810d3def3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHK%Wl&^6upzAi9?FWqDb8!Sz;T7&=wG4V?w%M!KOj502JcbDi*FMvYkdKij+0{ z1HZtQFX3NU!MQV2)lO*GAp~=+nKO@b=W#rq@eq;d&w{%|Z6b0I7;D!M{ld7O!-iE% z$u3Z+Hl`HPgu3*B&NkS#z$#!B_}diVZ?{Ebn&Qb2F2CRSX)GsxEPXI|dw7h{{h&)8K8}(wRSr=Qg7W%hlmv3#m$M|ulu;IY!{@?!sAK(1Fy9EPXsvbP6;b5g05_x@PecjEm;F|&qIVVi zlqTgF2v(`cLe|<=1vs;vW&x&i=eC{~6v|17YN zYtS>e(uf+E(5^u3D$Er_Xm^ymhUXbvY1Hl{%;iIvo`t!g2-Q23SWATr0XO7Ky< ckDv^7E+>GV!Iego!0eBJlEFq+fj_FiPrGK%DgXcg From d3c1bf143511f21fd9064b714caa810b82a56a3c Mon Sep 17 00:00:00 2001 From: kseysh Date: Fri, 22 Mar 2024 23:38:09 +0900 Subject: [PATCH 046/141] =?UTF-8?q?chore:=20SoptampFacadeTest=EB=A5=BC=20U?= =?UTF-8?q?serController=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20=ED=9B=84=20=EA=B5=AC=ED=98=84=20=EC=98=88=EC=A0=95?= =?UTF-8?q?=20(#217)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sopt/app/facade/SoptampFacadeTest.java | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 src/test/java/org/sopt/app/facade/SoptampFacadeTest.java diff --git a/src/test/java/org/sopt/app/facade/SoptampFacadeTest.java b/src/test/java/org/sopt/app/facade/SoptampFacadeTest.java new file mode 100644 index 00000000..a75b287e --- /dev/null +++ b/src/test/java/org/sopt/app/facade/SoptampFacadeTest.java @@ -0,0 +1,66 @@ +package org.sopt.app.facade; + +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 org.sopt.app.application.mission.MissionService; +import org.sopt.app.application.s3.S3Service; +import org.sopt.app.application.soptamp.SoptampPointService; +import org.sopt.app.application.soptamp.SoptampUserService; +import org.sopt.app.application.stamp.StampService; + +@ExtendWith(MockitoExtension.class) +class SoptampFacadeTest { + + @Mock + private StampService stampService; + @Mock + private S3Service s3Service; + @Mock + private MissionService missionService; + @Mock + private SoptampUserService soptampUserService; + @Mock + private SoptampPointService soptampPointService; + + @InjectMocks + private SoptampFacade soptampFacade; + + /* TODO: 아래 메서드 구현 + + @Test + void getStampInfo() { + } + + @Test + void uploadStamp() { + } + + @Test + void uploadStampDeprecated() { + } + + @Test + void editStamp() { + } + + @Test + void deleteStamp() { + } + + @Test + void deleteStampAll() { + } + + /* TODO: UserController 테스트 코드 작성하며 작성 + @Test + void editSoptampUserNickname() { + } + + @Test + void editSoptampUserProfileMessage() { + } + */ +} \ No newline at end of file From 449655c9daa62051860a3e8beddce74028d096ab Mon Sep 17 00:00:00 2001 From: kseysh Date: Sat, 23 Mar 2024 00:10:17 +0900 Subject: [PATCH 047/141] =?UTF-8?q?feat:=20getSoptampUserInfo=20=EC=84=B1?= =?UTF-8?q?=EA=B3=B5=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BC=80=EC=9D=B4?= =?UTF-8?q?=EC=8A=A4=20=EC=B6=94=EA=B0=80=20(#217)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../soptamp/SoptampUserServiceTest.java | 106 ++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 src/test/java/org/sopt/app/application/soptamp/SoptampUserServiceTest.java diff --git a/src/test/java/org/sopt/app/application/soptamp/SoptampUserServiceTest.java b/src/test/java/org/sopt/app/application/soptamp/SoptampUserServiceTest.java new file mode 100644 index 00000000..1d23b4b2 --- /dev/null +++ b/src/test/java/org/sopt/app/application/soptamp/SoptampUserServiceTest.java @@ -0,0 +1,106 @@ +package org.sopt.app.application.soptamp; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.anyLong; + +import java.util.Optional; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.jupiter.MockitoExtension; +import org.sopt.app.domain.entity.SoptampUser; +import org.sopt.app.interfaces.postgres.SoptampUserRepository; + +@ExtendWith(MockitoExtension.class) +class SoptampUserServiceTest { + + @Mock + private SoptampUserRepository soptampUserRepository; + + @InjectMocks + private SoptampUserService soptampUserService; + + @Test + @DisplayName("SUCCESS_솝탬프 유저 정보 조회") + void SUCCESS_getSoptampUserInfo() { + //given + final Long id = 1L; + final Long anyUserId = anyLong(); + final String profileMessage = "profileMessage"; + final Long totalPoints = 100L; + final String nickname = "nickname"; + + Optional soptampUser = Optional.of(SoptampUser.builder() + .id(id) + .userId(anyUserId) + .profileMessage(profileMessage) + .totalPoints(totalPoints) + .nickname(nickname) + .build()); + + //when + SoptampUserInfo.SoptampUser expected = SoptampUserInfo.SoptampUser.builder() + .id(id) + .userId(anyUserId) + .profileMessage(profileMessage) + .totalPoints(totalPoints) + .nickname(nickname) + .build(); + + Mockito.when(soptampUserRepository.findByUserId(anyUserId)).thenReturn(soptampUser); + SoptampUserInfo.SoptampUser result = soptampUserService.getSoptampUserInfo(anyUserId); + //then + + assertThat(result).usingRecursiveComparison().isEqualTo(expected); + } + + /* TODO: Implement test cases + @Test + void checkUserNickname() { + } + + @Test + void editNickname() { + } + + @Test + void editProfileMessage() { + } + + @Test + void updateSoptampUser() { + } + + @Test + void findRanks() { + } + + @Test + void findCurrentRanks() { + } + + @Test + void findRankByNickname() { + } + + @Test + void addPoint() { + } + + @Test + void subtractPoint() { + } + + @Test + void findByNickname() { + } + + @Test + void initPoint() { + } + + */ +} \ No newline at end of file From 8109c164c178b7a8ed9f2aa69e27ba30d9aa7d18 Mon Sep 17 00:00:00 2001 From: kseysh Date: Sat, 23 Mar 2024 00:11:55 +0900 Subject: [PATCH 048/141] =?UTF-8?q?feat:=20getSoptampUserInfo=20=EC=8B=A4?= =?UTF-8?q?=ED=8C=A8=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BC=80=EC=9D=B4?= =?UTF-8?q?=EC=8A=A4=20=EC=B6=94=EA=B0=80=20(#217)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../soptamp/SoptampUserServiceTest.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/test/java/org/sopt/app/application/soptamp/SoptampUserServiceTest.java b/src/test/java/org/sopt/app/application/soptamp/SoptampUserServiceTest.java index 1d23b4b2..b93746c7 100644 --- a/src/test/java/org/sopt/app/application/soptamp/SoptampUserServiceTest.java +++ b/src/test/java/org/sopt/app/application/soptamp/SoptampUserServiceTest.java @@ -4,6 +4,7 @@ import static org.mockito.ArgumentMatchers.anyLong; import java.util.Optional; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -11,6 +12,7 @@ import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.junit.jupiter.MockitoExtension; +import org.sopt.app.common.exception.BadRequestException; import org.sopt.app.domain.entity.SoptampUser; import org.sopt.app.interfaces.postgres.SoptampUserRepository; @@ -57,6 +59,21 @@ void SUCCESS_getSoptampUserInfo() { assertThat(result).usingRecursiveComparison().isEqualTo(expected); } + @Test + @DisplayName("FAIL_솝탬프 유저 정보 조회") + void FAIL_getSoptampUserInfo() { + //given + final Long anyUserId = anyLong(); + + //when + Mockito.when(soptampUserRepository.findByUserId(anyUserId)).thenReturn(Optional.empty()); + + //then + Assertions.assertThrows(BadRequestException.class, () -> { + soptampUserService.getSoptampUserInfo(anyUserId); + }); + } + /* TODO: Implement test cases @Test void checkUserNickname() { From afc5684802b701b204168be9b8bb4d32058ab36e Mon Sep 17 00:00:00 2001 From: kseysh Date: Sat, 23 Mar 2024 00:16:33 +0900 Subject: [PATCH 049/141] =?UTF-8?q?feat:=20checkUserNickname=20=EC=84=B1?= =?UTF-8?q?=EA=B3=B5,=20=EC=8B=A4=ED=8C=A8=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=20=EC=BC=80=EC=9D=B4=EC=8A=A4=20=EC=B6=94=EA=B0=80=20(#217)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../soptamp/SoptampUserServiceTest.java | 31 +++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/src/test/java/org/sopt/app/application/soptamp/SoptampUserServiceTest.java b/src/test/java/org/sopt/app/application/soptamp/SoptampUserServiceTest.java index b93746c7..87ff6881 100644 --- a/src/test/java/org/sopt/app/application/soptamp/SoptampUserServiceTest.java +++ b/src/test/java/org/sopt/app/application/soptamp/SoptampUserServiceTest.java @@ -2,6 +2,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.ArgumentMatchers.anyString; import java.util.Optional; import org.junit.jupiter.api.Assertions; @@ -74,11 +75,37 @@ void FAIL_getSoptampUserInfo() { }); } - /* TODO: Implement test cases @Test - void checkUserNickname() { + @DisplayName("SUCCESS_닉네임 중복 검사") + void SUCCESS_checkUserNickname() { + //given + final String anyNickname = anyString(); + + //when + Mockito.when(soptampUserRepository.findUserByNickname(anyNickname)).thenReturn(Optional.empty()); + + //then + Assertions.assertDoesNotThrow(() -> { + soptampUserService.checkUserNickname(anyNickname); + }); + } + + @Test + @DisplayName("FAIL_닉네임 중복 검사") + void FAIL_checkUserNickname() { + //given + final String anyNickname = anyString(); + + //when + Mockito.when(soptampUserRepository.findUserByNickname(anyNickname)).thenReturn(Optional.of(new SoptampUser())); + + //then + Assertions.assertThrows(BadRequestException.class, () -> { + soptampUserService.checkUserNickname(anyNickname); + }); } + /* TODO: Implement test cases @Test void editNickname() { } From 3e69fee2eba2e128195210ecdde80b90f0439d2f Mon Sep 17 00:00:00 2001 From: kseysh Date: Sat, 23 Mar 2024 00:25:06 +0900 Subject: [PATCH 050/141] =?UTF-8?q?feat:=20editNickName=20=EC=84=B1?= =?UTF-8?q?=EA=B3=B5=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BC=80=EC=9D=B4?= =?UTF-8?q?=EC=8A=A4=20=EC=B6=94=EA=B0=80=20(#217)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../soptamp/SoptampUserServiceTest.java | 25 +++++++++++++------ 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/src/test/java/org/sopt/app/application/soptamp/SoptampUserServiceTest.java b/src/test/java/org/sopt/app/application/soptamp/SoptampUserServiceTest.java index 87ff6881..3db5b015 100644 --- a/src/test/java/org/sopt/app/application/soptamp/SoptampUserServiceTest.java +++ b/src/test/java/org/sopt/app/application/soptamp/SoptampUserServiceTest.java @@ -37,12 +37,12 @@ void SUCCESS_getSoptampUserInfo() { final String nickname = "nickname"; Optional soptampUser = Optional.of(SoptampUser.builder() - .id(id) - .userId(anyUserId) - .profileMessage(profileMessage) - .totalPoints(totalPoints) - .nickname(nickname) - .build()); + .id(id) + .userId(anyUserId) + .profileMessage(profileMessage) + .totalPoints(totalPoints) + .nickname(nickname) + .build()); //when SoptampUserInfo.SoptampUser expected = SoptampUserInfo.SoptampUser.builder() @@ -105,11 +105,20 @@ void FAIL_checkUserNickname() { }); } - /* TODO: Implement test cases @Test - void editNickname() { + @DisplayName("SUCCESS_닉네임 변경") + void SUCCESS_editNickname() { + //given + final String newNickname = "newNickname"; + SoptampUserInfo.SoptampUser soptampUser = SoptampUserInfo.SoptampUser.builder() + .nickname("oldNickname") + .build(); + + //then + Assertions.assertEquals(soptampUserService.editNickname(soptampUser, newNickname).getNickname(), newNickname); } + /* TODO: Implement test cases @Test void editProfileMessage() { } From 692fd9b4fbf308bda3120f1099e868d7b95da1a2 Mon Sep 17 00:00:00 2001 From: kseysh Date: Sat, 23 Mar 2024 00:27:10 +0900 Subject: [PATCH 051/141] =?UTF-8?q?feat:=20editProfileMessage=20=EC=84=B1?= =?UTF-8?q?=EA=B3=B5=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BC=80=EC=9D=B4?= =?UTF-8?q?=EC=8A=A4=20=EC=B6=94=EA=B0=80=20(#217)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../soptamp/SoptampUserServiceTest.java | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/test/java/org/sopt/app/application/soptamp/SoptampUserServiceTest.java b/src/test/java/org/sopt/app/application/soptamp/SoptampUserServiceTest.java index 3db5b015..f91d15ec 100644 --- a/src/test/java/org/sopt/app/application/soptamp/SoptampUserServiceTest.java +++ b/src/test/java/org/sopt/app/application/soptamp/SoptampUserServiceTest.java @@ -118,11 +118,22 @@ void SUCCESS_editNickname() { Assertions.assertEquals(soptampUserService.editNickname(soptampUser, newNickname).getNickname(), newNickname); } - /* TODO: Implement test cases @Test - void editProfileMessage() { + @DisplayName("SUCCESS_프로필 메시지 변경") + void SUCCESS_editProfileMessage() { + //given + final String newProfileMessage = "newProfileMessage"; + SoptampUserInfo.SoptampUser soptampUser = SoptampUserInfo.SoptampUser.builder() + .nickname("oldProfileMessage") + .build(); + + //then + Assertions.assertEquals( + soptampUserService.editProfileMessage(soptampUser, newProfileMessage).getProfileMessage(), + newProfileMessage); } + /* TODO: Implement test cases @Test void updateSoptampUser() { } From a9cbfbb941126431f651b6c913ff16d03fd92b2d Mon Sep 17 00:00:00 2001 From: kseysh Date: Sat, 23 Mar 2024 13:48:56 +0900 Subject: [PATCH 052/141] =?UTF-8?q?feat:=20updateSoptampUser=20=EC=84=B1?= =?UTF-8?q?=EA=B3=B5=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BC=80=EC=9D=B4?= =?UTF-8?q?=EC=8A=A4=20=EC=B6=94=EA=B0=80=20(#217)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../soptamp/SoptampUserServiceTest.java | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/test/java/org/sopt/app/application/soptamp/SoptampUserServiceTest.java b/src/test/java/org/sopt/app/application/soptamp/SoptampUserServiceTest.java index f91d15ec..96fa6d0f 100644 --- a/src/test/java/org/sopt/app/application/soptamp/SoptampUserServiceTest.java +++ b/src/test/java/org/sopt/app/application/soptamp/SoptampUserServiceTest.java @@ -133,11 +133,27 @@ void SUCCESS_editProfileMessage() { newProfileMessage); } - /* TODO: Implement test cases @Test + @DisplayName("SUCCESS_프로필 메시지 변경") void updateSoptampUser() { + //given + final Long anyUserId = anyLong(); + final Long id = 1L; + final String name = "newName"; + SoptampUser soptampUser = SoptampUser.builder() + .id(id) + .userId(anyUserId) + .nickname("oldNickName") + .build(); + + //when + Mockito.when(soptampUserRepository.findByUserId(anyUserId)).thenReturn(Optional.of(soptampUser)); + + //then + Assertions.assertEquals(soptampUserService.updateSoptampUser(name, anyUserId), id); } + /* TODO: Implement test cases @Test void findRanks() { } From 543f4af6612141bf73e60fbd17652d021d903845 Mon Sep 17 00:00:00 2001 From: kseysh Date: Sat, 23 Mar 2024 14:05:32 +0900 Subject: [PATCH 053/141] =?UTF-8?q?feat:=20updateSoptampUser=20=EC=84=B1?= =?UTF-8?q?=EA=B3=B5=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BC=80=EC=9D=B4?= =?UTF-8?q?=EC=8A=A4=20=EC=9A=94=EA=B5=AC=EC=82=AC=ED=95=AD=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20(#217)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../soptamp/SoptampUserServiceTest.java | 36 ++++++++++++++++--- 1 file changed, 31 insertions(+), 5 deletions(-) diff --git a/src/test/java/org/sopt/app/application/soptamp/SoptampUserServiceTest.java b/src/test/java/org/sopt/app/application/soptamp/SoptampUserServiceTest.java index 96fa6d0f..322f4489 100644 --- a/src/test/java/org/sopt/app/application/soptamp/SoptampUserServiceTest.java +++ b/src/test/java/org/sopt/app/application/soptamp/SoptampUserServiceTest.java @@ -1,6 +1,7 @@ package org.sopt.app.application.soptamp; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.anyString; @@ -134,12 +135,12 @@ void SUCCESS_editProfileMessage() { } @Test - @DisplayName("SUCCESS_프로필 메시지 변경") - void updateSoptampUser() { + @DisplayName("SUCCESS_등록된 유저이면 이름을 변경하지 않음") + void SUCCESS_updateSoptampUser() { //given - final Long anyUserId = anyLong(); final Long id = 1L; - final String name = "newName"; + final Long anyUserId = anyLong(); + final String newNickname = "newNickname"; SoptampUser soptampUser = SoptampUser.builder() .id(id) .userId(anyUserId) @@ -150,7 +151,32 @@ void updateSoptampUser() { Mockito.when(soptampUserRepository.findByUserId(anyUserId)).thenReturn(Optional.of(soptampUser)); //then - Assertions.assertEquals(soptampUserService.updateSoptampUser(name, anyUserId), id); + Assertions.assertEquals(soptampUserService.updateSoptampUser(newNickname, anyUserId), id); + } + + @Test + @DisplayName("SUCCESS_등록된 유저가 아니면 이름을 생성하여 변경") + void FAIL_updateSoptampUser() { + //given + final Long id = 1L; + final Long anyUserId = anyLong(); + final String newNickname = "newNickname"; + SoptampUser soptampUser = SoptampUser.builder() + .id(id) + .userId(anyUserId) + .nickname(generateNickname(newNickname)) + .build(); + + //when + Mockito.when(soptampUserRepository.findByUserId(anyUserId)).thenReturn(Optional.empty()); + Mockito.when(soptampUserRepository.save(any(SoptampUser.class))).thenReturn(soptampUser); + + //then + Assertions.assertEquals(soptampUserService.updateSoptampUser(newNickname, anyUserId), id); + } + + private String generateNickname(String username) { + return username + Math.round(Math.random() * 10000); } /* TODO: Implement test cases From bf2b29ecdcdfbcf6ef63ccd3359e2c0f7c4adeeb Mon Sep 17 00:00:00 2001 From: kseysh Date: Sat, 23 Mar 2024 14:21:31 +0900 Subject: [PATCH 054/141] =?UTF-8?q?fix:=20soptampUser=20=EB=84=A4=EC=9D=B4?= =?UTF-8?q?=EB=B0=8D=20=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95=20(#217)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/sopt/app/presentation/user/UserController.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/sopt/app/presentation/user/UserController.java b/src/main/java/org/sopt/app/presentation/user/UserController.java index 8e19f559..4e58eac5 100644 --- a/src/main/java/org/sopt/app/presentation/user/UserController.java +++ b/src/main/java/org/sopt/app/presentation/user/UserController.java @@ -49,11 +49,11 @@ public ResponseEntity getUserInfo(@AuthenticationPrincipal }) @GetMapping(value = "/soptamp") public ResponseEntity getSoptampInfo(@AuthenticationPrincipal User user) { - val SoptampUser = soptampUserService.getSoptampUserInfo(user.getId()); + val soptampUser = soptampUserService.getSoptampUserInfo(user.getId()); val response = UserResponse.Soptamp.builder() - .nickname(SoptampUser.getNickname()) - .profileMessage(SoptampUser.getProfileMessage()) - .points(SoptampUser.getTotalPoints()) + .nickname(soptampUser.getNickname()) + .profileMessage(soptampUser.getProfileMessage()) + .points(soptampUser.getTotalPoints()) .build(); return ResponseEntity.status(HttpStatus.OK).body(response); } From 3c1fa240b5ce6709bbf056232eb60b3e1652259d Mon Sep 17 00:00:00 2001 From: kseysh Date: Sat, 23 Mar 2024 14:40:25 +0900 Subject: [PATCH 055/141] =?UTF-8?q?refactor:=20=EC=A4=91=EB=B3=B5=EB=90=98?= =?UTF-8?q?=EB=8A=94=20save=ED=95=A8=EC=88=98=20beforeEach=EB=A1=9C=20?= =?UTF-8?q?=EC=B2=98=EB=A6=AC=20(#217)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../postgres/StampRepositoryTest.java | 31 ++++++++++--------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/src/test/java/org/sopt/app/interfaces/postgres/StampRepositoryTest.java b/src/test/java/org/sopt/app/interfaces/postgres/StampRepositoryTest.java index a5ff001e..02262c9d 100644 --- a/src/test/java/org/sopt/app/interfaces/postgres/StampRepositoryTest.java +++ b/src/test/java/org/sopt/app/interfaces/postgres/StampRepositoryTest.java @@ -3,6 +3,7 @@ import java.util.List; import java.util.Optional; import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.sopt.app.common.config.QuerydslConfiguration; @@ -26,30 +27,33 @@ class StampRepositoryTest { @Autowired private StampRepository stampRepository; + private final User newUser = new User(); + + @BeforeEach + public void beforeTest() { + userRepository.save(newUser); + } + @Test @DisplayName("SUCCESS_유저 아이디를 이용하여 유저의 스탬프 모두 조회") void SUCCESS_findAllByUserId() { - //given - final User user = userRepository.save(new User()); - //when - Stamp stamp1 = stampRepository.save(Stamp.builder().userId(user.getId()).contents("stampContents").build()); - Stamp stamp2 = stampRepository.save(Stamp.builder().userId(user.getId()).contents("stampContents").build()); + Stamp stamp1 = stampRepository.save(Stamp.builder().userId(newUser.getId()).contents("stampContents").build()); + Stamp stamp2 = stampRepository.save(Stamp.builder().userId(newUser.getId()).contents("stampContents").build()); //then - Assertions.assertEquals(List.of(stamp1, stamp2), stampRepository.findAllByUserId(user.getId())); + Assertions.assertEquals(List.of(stamp1, stamp2), stampRepository.findAllByUserId(newUser.getId())); } @Test @DisplayName("SUCCESS_유저 아이디와 미션 아이디를 이용하여 유저의 스탬프 조회") void SUCCESS_findByUserIdAndMissionIdSuccess() { //given - final User user = userRepository.save(new User()); final Long missionId = 1L; //when - Stamp stamp = stampRepository.save(Stamp.builder().userId(user.getId()).missionId(missionId).contents("stampContents").build()); - Optional result = stampRepository.findByUserIdAndMissionId(user.getId(), missionId); + Stamp stamp = stampRepository.save(Stamp.builder().userId(newUser.getId()).missionId(missionId).contents("stampContents").build()); + Optional result = stampRepository.findByUserIdAndMissionId(newUser.getId(), missionId); //then Assertions.assertEquals(Optional.of(stamp), result); @@ -59,15 +63,14 @@ void SUCCESS_findByUserIdAndMissionIdSuccess() { @DisplayName("SUCCESS_유저 아이디를 이용하여 유저의 스탬프 모두 삭제") void SUCCESS_deleteAllByUserIdSuccess() { //given - final User user = userRepository.save(new User()); - stampRepository.save(Stamp.builder().userId(user.getId()).contents("stampContents").build()); - stampRepository.save(Stamp.builder().userId(user.getId()).contents("stampContents").build()); + stampRepository.save(Stamp.builder().userId(newUser.getId()).contents("stampContents").build()); + stampRepository.save(Stamp.builder().userId(newUser.getId()).contents("stampContents").build()); //when - stampRepository.deleteAllByUserId(user.getId()); + stampRepository.deleteAllByUserId(newUser.getId()); //then - Assertions.assertEquals(List.of(), stampRepository.findAllByUserId(user.getId())); + Assertions.assertEquals(List.of(), stampRepository.findAllByUserId(newUser.getId())); } } From 3f9e5390526f22944ac937fd462774dda070efeb Mon Sep 17 00:00:00 2001 From: kseysh Date: Sat, 23 Mar 2024 14:46:59 +0900 Subject: [PATCH 056/141] =?UTF-8?q?chore:=20spring0/#219=EC=99=80=20merge?= =?UTF-8?q?=20(#217)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/application/stamp/StampService.java | 42 ++---- .../org/sopt/app/domain/entity/Stamp.java | 7 - .../org/sopt/app/facade/SoptampFacade.java | 2 +- .../application/DescriptionServiceTest.java | 32 +++-- .../sopt/app/application/S3ServiceTest.java | 134 ++++++++++++++++++ .../app/facade/DescriptionFacadeTest.java | 19 +-- .../MainDescriptionRepositoryTest.java | 2 +- 7 files changed, 183 insertions(+), 55 deletions(-) create mode 100644 src/test/java/org/sopt/app/application/S3ServiceTest.java diff --git a/src/main/java/org/sopt/app/application/stamp/StampService.java b/src/main/java/org/sopt/app/application/stamp/StampService.java index 5b19eeda..f12d247c 100644 --- a/src/main/java/org/sopt/app/application/stamp/StampService.java +++ b/src/main/java/org/sopt/app/application/stamp/StampService.java @@ -2,8 +2,8 @@ import java.time.LocalDateTime; import java.util.ArrayList; +import java.util.Collection; import java.util.List; -import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import lombok.val; import org.sopt.app.common.event.Events; @@ -26,14 +26,15 @@ public class StampService { @Transactional(readOnly = true) public StampInfo.Stamp findStamp(Long missionId, Long userId) { val entity = stampRepository.findByUserIdAndMissionId(userId, missionId) - .orElseThrow(() -> new BadRequestException(ErrorCode.STAMP_NOT_FOUND.getMessage())); + .orElseThrow(() -> new BadRequestException(ErrorCode.STAMP_NOT_FOUND.getMessage())); return StampInfo.Stamp.builder() - .id(entity.getId()) - .contents(entity.getContents()) - .images(entity.getImages()) - .createdAt(entity.getCreatedAt()) - .updatedAt(entity.getUpdatedAt()) - .build(); + .id(entity.getId()) + .contents(entity.getContents()) + .images(entity.getImages()) + .createdAt(entity.getCreatedAt()) + .updatedAt(entity.getUpdatedAt()) + .missionId(entity.getMissionId()) + .build(); } @Transactional @@ -51,6 +52,7 @@ public StampInfo.Stamp uploadStampDeprecated( .images(newStamp.getImages()) .createdAt(newStamp.getCreatedAt()) .updatedAt(newStamp.getUpdatedAt()) + .missionId(newStamp.getMissionId()) .build(); } @@ -60,7 +62,6 @@ public StampInfo.Stamp uploadStamp( Long userId) { val stamp = Stamp.builder() .contents(stampRequest.getContents()) - .createdAt(LocalDateTime.now()) .images(List.of(stampRequest.getImage())) .missionId(stampRequest.getMissionId()) .userId(userId) @@ -73,6 +74,7 @@ public StampInfo.Stamp uploadStamp( .images(newStamp.getImages()) .createdAt(newStamp.getCreatedAt()) .updatedAt(newStamp.getUpdatedAt()) + .missionId(newStamp.getMissionId()) .build(); } @@ -92,10 +94,6 @@ public StampInfo.Stamp editStampContentsDeprecated( val newStamp = stampRepository.save(stamp); return StampInfo.Stamp.builder() .id(newStamp.getId()) - .contents(newStamp.getContents()) - .images(newStamp.getImages()) - .createdAt(newStamp.getCreatedAt()) - .updatedAt(newStamp.getUpdatedAt()) .build(); } @@ -116,26 +114,15 @@ public StampInfo.Stamp editStampContents( val newStamp = stampRepository.save(stamp); return StampInfo.Stamp.builder() .id(newStamp.getId()) - .contents(newStamp.getContents()) - .images(newStamp.getImages()) - .createdAt(newStamp.getCreatedAt()) - .updatedAt(newStamp.getUpdatedAt()) .build(); } @Transactional - public StampInfo.Stamp editStampImagesDeprecated(StampInfo.Stamp stamp, List imgPaths) { + public void editStampImagesDeprecated(StampInfo.Stamp stamp, List imgPaths) { val oldStamp = stampRepository.findById(stamp.getId()) .orElseThrow(() -> new BadRequestException(ErrorCode.STAMP_NOT_FOUND.getMessage())); oldStamp.changeImages(imgPaths); - val newStamp = stampRepository.save(oldStamp); - return StampInfo.Stamp.builder() - .id(newStamp.getId()) - .contents(newStamp.getContents()) - .images(newStamp.getImages()) - .createdAt(newStamp.getCreatedAt()) - .updatedAt(newStamp.getUpdatedAt()) - .build(); + stampRepository.save(oldStamp); } @Transactional(readOnly = true) @@ -160,7 +147,7 @@ public void deleteAllStamps(Long userId) { stampRepository.deleteAllByUserId(userId); val imageUrls = stampRepository.findAllByUserId(userId).stream().map(Stamp::getImages) - .flatMap(images -> images.stream()).collect(Collectors.toList()); + .flatMap(Collection::stream).toList(); Events.raise(new StampDeletedEvent(imageUrls)); } @@ -172,7 +159,6 @@ private Stamp convertStampImgDeprecated( Long missionId) { return Stamp.builder() .contents(stampRequest.getContents()) - .createdAt(LocalDateTime.now()) .images(imgList) .missionId(missionId) .userId(userId) diff --git a/src/main/java/org/sopt/app/domain/entity/Stamp.java b/src/main/java/org/sopt/app/domain/entity/Stamp.java index 8edf82f3..f5743a93 100644 --- a/src/main/java/org/sopt/app/domain/entity/Stamp.java +++ b/src/main/java/org/sopt/app/domain/entity/Stamp.java @@ -2,7 +2,6 @@ import com.vladmihalcea.hibernate.type.array.ListArrayType; -import java.time.LocalDateTime; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; @@ -38,12 +37,6 @@ public class Stamp extends BaseEntity { ) private List images; - @Column - private LocalDateTime createdAt; - - @Column - private LocalDateTime updatedAt; - @Column private Long userId; diff --git a/src/main/java/org/sopt/app/facade/SoptampFacade.java b/src/main/java/org/sopt/app/facade/SoptampFacade.java index c22791ae..047f1be6 100644 --- a/src/main/java/org/sopt/app/facade/SoptampFacade.java +++ b/src/main/java/org/sopt/app/facade/SoptampFacade.java @@ -84,7 +84,7 @@ public StampInfo.Stamp getStampInfo(Long missionId, String nickname){ public StampInfo.Stamp editStamp(StampRequest.EditStampRequest editStampRequest, Long userId, Long missionId, List multipartFiles){ val stamp = stampService.editStampContentsDeprecated(editStampRequest, userId, missionId); val imgPaths = s3Service.uploadDeprecated(multipartFiles); - if (imgPaths.size() > 0) { + if (!imgPaths.isEmpty()) { stampService.editStampImagesDeprecated(stamp, imgPaths); } return stamp; diff --git a/src/test/java/org/sopt/app/application/DescriptionServiceTest.java b/src/test/java/org/sopt/app/application/DescriptionServiceTest.java index f442b38a..6ebeeed0 100644 --- a/src/test/java/org/sopt/app/application/DescriptionServiceTest.java +++ b/src/test/java/org/sopt/app/application/DescriptionServiceTest.java @@ -1,11 +1,18 @@ package org.sopt.app.application; +import static org.mockito.Mockito.when; + import java.util.List; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import org.mockito.Mockito; +import org.junit.jupiter.api.TestInstance; +import org.junit.jupiter.api.TestInstance.Lifecycle; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; import org.sopt.app.application.description.DescriptionInfo; import org.sopt.app.application.description.DescriptionService; import org.sopt.app.domain.entity.MainDescription; @@ -14,17 +21,19 @@ import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest +@TestInstance(Lifecycle.PER_CLASS) +@ExtendWith(MockitoExtension.class) public class DescriptionServiceTest { - private static MainDescriptionRepository mainDescriptionRepository = Mockito.mock(MainDescriptionRepository.class); + @Mock + private MainDescriptionRepository mainDescriptionRepository; - private DescriptionService descriptionService = new DescriptionService( - mainDescriptionRepository - ); + @InjectMocks + private DescriptionService descriptionService; @BeforeAll - private static void beforeTest() { - Mockito.when(mainDescriptionRepository.findAll()).thenReturn(List.of( + private void beforeTest() { + when(mainDescriptionRepository.findAll()).thenReturn(List.of( MainDescription.builder() .id(1L) .activeTopDescription("activeTop") @@ -36,25 +45,28 @@ private static void beforeTest() { } @Test - @DisplayName("SUCCESS_getMainDescriptionActive") + @DisplayName("SUCCESS_활동 유저 메인 문구 조회") void SUCCESS_getMainDescriptionActive() { DescriptionInfo.MainDescription result = descriptionService.getMainDescription(UserStatus.ACTIVE); + Assertions.assertEquals("activeTop", result.getTopDescription()); Assertions.assertEquals("activeBottom", result.getBottomDescription()); } @Test - @DisplayName("SUCCESS_getMainDescriptionInactive") + @DisplayName("SUCCESS_비활동 유저 메인 문구 조회") void SUCCESS_getMainDescriptionInactive() { DescriptionInfo.MainDescription result = descriptionService.getMainDescription(UserStatus.INACTIVE); + Assertions.assertEquals("inactiveTop", result.getTopDescription()); Assertions.assertEquals("inactiveBottom", result.getBottomDescription()); } @Test - @DisplayName("SUCCESS_getMainDescriptionUnauthenticated") + @DisplayName("SUCCESS_미인증 유저 메인 문구 조회") void SUCCESS_getMainDescriptionUnauthenticated() { DescriptionInfo.MainDescription result = descriptionService.getMainDescription(UserStatus.UNAUTHENTICATED); + Assertions.assertEquals("inactiveTop", result.getTopDescription()); Assertions.assertEquals("inactiveBottom", result.getBottomDescription()); } diff --git a/src/test/java/org/sopt/app/application/S3ServiceTest.java b/src/test/java/org/sopt/app/application/S3ServiceTest.java new file mode 100644 index 00000000..4759aad5 --- /dev/null +++ b/src/test/java/org/sopt/app/application/S3ServiceTest.java @@ -0,0 +1,134 @@ +package org.sopt.app.application; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.doThrow; +import static org.mockito.Mockito.when; + +import com.amazonaws.AmazonServiceException; +import com.amazonaws.services.s3.AmazonS3; +import com.amazonaws.services.s3.model.PutObjectResult; +import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.util.List; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.sopt.app.application.s3.S3Info; +import org.sopt.app.application.s3.S3Service; +import org.sopt.app.common.exception.BadRequestException; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.mock.web.MockMultipartFile; + +@SpringBootTest +public class S3ServiceTest { + + @Mock + private AmazonS3 s3Client; + + @InjectMocks + private S3Service s3Service; + + @Test + @DisplayName("SUCCESS_업로드(DEPRECATED) 파일 리스트 null일 때") + void SUCCESS_uploadDeprecatedNull() throws MalformedURLException { + when(s3Client.putObject(any())).thenReturn(new PutObjectResult()); + when(s3Client.getUrl(any(), any())).thenReturn(new URL("http://url.com")); + + List result = s3Service.uploadDeprecated(null); + Assertions.assertEquals(0, result.size()); + } + + @Test + @DisplayName("SUCCESS_업로드(DEPRECATED) 파일 리스트 첫 원소 empty일 때") + void SUCCESS_uploadDeprecatedEmpty() throws MalformedURLException { + when(s3Client.putObject(any())).thenReturn(new PutObjectResult()); + when(s3Client.getUrl(any(), any())).thenReturn(new URL("http://url.com")); + + List result = s3Service.uploadDeprecated( + List.of(new MockMultipartFile("name", (byte[]) null)) + ); + Assertions.assertEquals(0, result.size()); + } + + @Test + @DisplayName("SUCCESS_업로드(DEPRECATED) 파일 리스트 not null일 때") + void SUCCESS_uploadDeprecatedNotNull() throws MalformedURLException { + when(s3Client.putObject(any())).thenReturn(new PutObjectResult()); + when(s3Client.getUrl(any(), any())).thenReturn(new URL("http://url.com")); + + List result = s3Service.uploadDeprecated( + List.of(new MockMultipartFile("files", "image.jpg", "text/plain", + "1234".getBytes(StandardCharsets.UTF_8))) + ); + Assertions.assertEquals(1, result.size()); + } + + @Test() + @DisplayName("FAIL_업로드(DEPRECATED) 잘못된 파일명") + void FAIL_uploadDeprecatedInvalidFilename() throws IOException { + when(s3Client.putObject(any())).thenReturn(new PutObjectResult()); + when(s3Client.getUrl(any(), any())).thenReturn(new URL("http://url.com")); + + Assertions.assertThrows(BadRequestException.class, () -> { + s3Service.uploadDeprecated( + List.of(new MockMultipartFile("files", "", "text/plain", + "1234".getBytes(StandardCharsets.UTF_8)))); + }); + } + + @Test + @DisplayName("FAIL_업로드(DEPRECATED) 잘못된 파일 확장자") + void FAIL_uploadDeprecatedInvalidExtension() throws IOException { + when(s3Client.putObject(any())).thenReturn(new PutObjectResult()); + when(s3Client.getUrl(any(), any())).thenReturn(new URL("http://url.com")); + + Assertions.assertThrows(BadRequestException.class, () -> { + s3Service.uploadDeprecated( + List.of(new MockMultipartFile("files", "file.csv", "text/plain", + "1234".getBytes(StandardCharsets.UTF_8)))); + }); + } + + @Test + @DisplayName("SUCCESS_PreSignedUrl 조회 성공") + void SUCCESS_getPreSignedUrl() throws MalformedURLException { + when(s3Client.generatePresignedUrl(any(), any(), any(), any())) + .thenReturn(new URL("http://url.com")); + + S3Info.PreSignedUrl result = s3Service.getPreSignedUrl("FolderName"); + Assertions.assertEquals("http://url.com", result.getPreSignedURL()); + Assertions.assertEquals("nullFolderName", result.getImageURL().substring(0, 14)); + } + + @Test + @DisplayName("FAIL_PreSignedUrl 조회 중 NullPointerException 발생") + void FAIL_getPreSignedUrlNullPointerException() { + when(s3Client.generatePresignedUrl(any(), any(), any(), any())) + .thenThrow(NullPointerException.class); + + Assertions.assertThrows(BadRequestException.class, () -> { + s3Service.getPreSignedUrl("FolderName"); + }); + } + + @Test + @DisplayName("SUCCESS_파일 삭제") + void SUCCESS_deleteFiles() { + doNothing().when(s3Client).deleteObject(any(), any()); + + s3Service.deleteFiles(List.of("https://url.com"), "folderName"); + } + + @Test + @DisplayName("FAIL_파일 삭제 중 AmazonServiceException 발생") + void FAIL_deleteFilesAmazonServiceException() { + doThrow(AmazonServiceException.class).when(s3Client).deleteObject(any(), any()); + + s3Service.deleteFiles(List.of("https://url.com"), "folderName"); + } +} \ No newline at end of file diff --git a/src/test/java/org/sopt/app/facade/DescriptionFacadeTest.java b/src/test/java/org/sopt/app/facade/DescriptionFacadeTest.java index 2de864ba..99cb23e0 100644 --- a/src/test/java/org/sopt/app/facade/DescriptionFacadeTest.java +++ b/src/test/java/org/sopt/app/facade/DescriptionFacadeTest.java @@ -5,6 +5,8 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; import org.mockito.Mockito; import org.sopt.app.application.auth.PlaygroundAuthInfo.UserActiveInfo; import org.sopt.app.application.auth.PlaygroundAuthService; @@ -18,16 +20,17 @@ @SpringBootTest public class DescriptionFacadeTest { - private static DescriptionService descriptionService = Mockito.mock(DescriptionService.class); - private static PlaygroundAuthService playgroundAuthService = Mockito.mock(PlaygroundAuthService.class); + @Mock + private DescriptionService descriptionService; - private DescriptionFacade descriptionFacade = new DescriptionFacade( - descriptionService, - playgroundAuthService - ); + @Mock + private PlaygroundAuthService playgroundAuthService; + + @InjectMocks + private DescriptionFacade descriptionFacade; @Test - @DisplayName("SUCCESS_getMainDescriptionForUserActive") + @DisplayName("SUCCESS_활동 유저 메인 문구 조회") void SUCCESS_getMainDescriptionForUserActive() { UserStatus userStatus = UserStatus.ACTIVE; Mockito.when(playgroundAuthService.getPlaygroundUserActiveInfo(any())) @@ -42,7 +45,7 @@ void SUCCESS_getMainDescriptionForUserActive() { } @Test - @DisplayName("SUCCESS_getMainDescriptionForUserInactive") + @DisplayName("SUCCESS_비활동 유저 메인 문구 조회") void SUCCESS_getMainDescriptionForUserInactive() { UserStatus userStatus = UserStatus.INACTIVE; Mockito.when(playgroundAuthService.getPlaygroundUserActiveInfo(any())) diff --git a/src/test/java/org/sopt/app/interfaces/postgres/MainDescriptionRepositoryTest.java b/src/test/java/org/sopt/app/interfaces/postgres/MainDescriptionRepositoryTest.java index e678edc4..ef6c82dc 100644 --- a/src/test/java/org/sopt/app/interfaces/postgres/MainDescriptionRepositoryTest.java +++ b/src/test/java/org/sopt/app/interfaces/postgres/MainDescriptionRepositoryTest.java @@ -12,7 +12,7 @@ public class MainDescriptionRepositoryTest { private MainDescriptionRepository mainDescriptionRepository; @Test - @DisplayName("SUCCESS_findAll") + @DisplayName("SUCCESS_메인 문구 전체 조회") void SUCCESS_findAll() { System.out.println(mainDescriptionRepository.findAll()); } From 3d849cc7788fa4ec91a39f76891ac22112807744 Mon Sep 17 00:00:00 2001 From: kseysh Date: Sat, 23 Mar 2024 16:13:49 +0900 Subject: [PATCH 057/141] =?UTF-8?q?fix:=20=EB=A8=B8=EC=A7=80=EB=A5=BC=20?= =?UTF-8?q?=EC=A7=84=ED=96=89=ED=95=98=EB=A9=B0=20=EA=B9=A8=EC=A7=84=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BC=80=EC=9D=B4=EC=8A=A4=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20(#217)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/application/StampServiceTest.java | 70 ++++++++----------- 1 file changed, 31 insertions(+), 39 deletions(-) diff --git a/src/test/java/org/sopt/app/application/StampServiceTest.java b/src/test/java/org/sopt/app/application/StampServiceTest.java index 70c09a1b..eaf83082 100644 --- a/src/test/java/org/sopt/app/application/StampServiceTest.java +++ b/src/test/java/org/sopt/app/application/StampServiceTest.java @@ -48,6 +48,7 @@ void SUCCESS_findStamp() { .images(stamp.getImages()) .createdAt(stamp.getCreatedAt()) .updatedAt(stamp.getUpdatedAt()) + .missionId(stamp.getMissionId()) .build(); StampInfo.Stamp result = stampService.findStamp(stampUserId, stampMissionId); @@ -87,7 +88,6 @@ void SUCCESS_uploadStampDeprecated() { Stamp stamp = Stamp.builder() .id(1L) .contents(stampRequest.getContents()) - .createdAt(LocalDateTime.now()) .images(imgPaths) .missionId(requestMissionId) .userId(requestUserId) @@ -99,6 +99,7 @@ void SUCCESS_uploadStampDeprecated() { Stamp newStamp = stampRepository.save(stamp); StampInfo.Stamp expected = StampInfo.Stamp.builder() .id(newStamp.getId()) + .missionId(newStamp.getMissionId()) .contents(newStamp.getContents()) .images(newStamp.getImages()) .createdAt(newStamp.getCreatedAt()) @@ -127,7 +128,6 @@ void SUCCESS_uploadStamp() { Stamp stamp = Stamp.builder() .contents(stampRequest.getContents()) - .createdAt(LocalDateTime.now()) .images(List.of(stampRequest.getImage())) .missionId(stampRequest.getMissionId()) .userId(requestUserId) @@ -138,6 +138,7 @@ void SUCCESS_uploadStamp() { Stamp newStamp = stampRepository.save(stamp); StampInfo.Stamp expected = StampInfo.Stamp.builder() .id(newStamp.getId()) + .missionId(newStamp.getMissionId()) .contents(newStamp.getContents()) .images(newStamp.getImages()) .createdAt(newStamp.getCreatedAt()) @@ -166,11 +167,12 @@ void SUCCESS_editStampContentsDeprecated() { //when Stamp oldStamp = getSavedStamp(requestMissionId, requestUserId); - StampInfo.Stamp expected = editStamp(oldStamp, editStampRequest, requestUserId, true, false); + StampInfo.Stamp expected = editStamp(oldStamp, editStampRequest, true); StampInfo.Stamp result = stampService.editStampContentsDeprecated(editStampRequest, requestUserId, requestMissionId); - assertThat(result).usingRecursiveComparison().isEqualTo(expected); + //then + Assertions.assertEquals(expected.getId(), result.getId()); } @Test @@ -189,28 +191,24 @@ void SUCCESS_editStampContentsDeprecatedNoChangeContents() { //when Stamp oldStamp = getSavedStamp(requestMissionId, requestUserId); - editStamp(oldStamp, editStampRequest, requestUserId, true, false); + editStamp(oldStamp, editStampRequest, true); StampInfo.Stamp result = stampService.editStampContentsDeprecated(editStampRequest, requestUserId, requestMissionId); //then - Assertions.assertEquals(oldStamp.getContents(), result.getContents()); + Assertions.assertEquals(oldStamp.getId(), result.getId()); } private Stamp getSavedStamp(Long missionId, Long requestUserId) { final Long stampId = 1L; final String contents = "savedContents"; final List images = List.of("savedImage"); - final LocalDateTime createdAt = LocalDateTime.of(2024, 1, 1, 0, 0, 0); - final LocalDateTime savedUpdatedAt = LocalDateTime.of(2024, 1, 1, 0, 0, 0); final Optional savedStamp = Optional.of(Stamp.builder() .id(stampId) .contents(contents) .images(images) - .createdAt(createdAt) - .updatedAt(savedUpdatedAt) .missionId(missionId) .userId(requestUserId) .build()); @@ -220,14 +218,13 @@ private Stamp getSavedStamp(Long missionId, Long requestUserId) { return savedStamp.get(); } - private StampInfo.Stamp editStamp(Stamp oldStamp, StampRequest.EditStampRequest editStampRequest, - Long requestUserId, boolean isDeprecatedEditStampContents, boolean isDeprecatedEditStampImages) { - if (!isDeprecatedEditStampImages && !StringUtils.hasText(editStampRequest.getContents())) { - editStampRequest.setContents(oldStamp.getContents()); + private StampInfo.Stamp editStamp(Stamp oldStamp, StampRequest.EditStampRequest editStampRequest, boolean isDeprecatedEditStampContents) { + if (!isDeprecatedEditStampContents && StringUtils.hasText(editStampRequest.getContents())) { + oldStamp.changeContents(editStampRequest.getContents()); } - if (!isDeprecatedEditStampContents && !StringUtils.hasText(editStampRequest.getImage())) { - editStampRequest.setImage(oldStamp.getImages().get(0)); + if (StringUtils.hasText(editStampRequest.getImage())) { + oldStamp.changeImages(List.of(editStampRequest.getImage())); } @@ -235,21 +232,20 @@ private StampInfo.Stamp editStamp(Stamp oldStamp, StampRequest.EditStampRequest final Stamp newStamp = Stamp.builder() .id(oldStamp.getId()) - .contents(editStampRequest.getContents()) - .images(List.of(editStampRequest.getImage())) - .createdAt(oldStamp.getCreatedAt()) - .updatedAt(changedUpdatedAt) - .missionId(editStampRequest.getMissionId()) - .userId(requestUserId) + .contents(oldStamp.getContents()) + .images(oldStamp.getImages()) + .missionId(oldStamp.getMissionId()) + .userId(oldStamp.getUserId()) .build(); Mockito.when(stampRepository.save(any(Stamp.class))).thenReturn(newStamp); return StampInfo.Stamp.builder() - .id(oldStamp.getId()) - .contents(editStampRequest.getContents()) - .images(List.of(editStampRequest.getImage())) - .createdAt(oldStamp.getCreatedAt()) + .id(newStamp.getId()) + .missionId(newStamp.getMissionId()) + .contents(newStamp.getContents()) + .images(newStamp.getImages()) + .createdAt(newStamp.getCreatedAt()) .updatedAt(changedUpdatedAt) .build(); } @@ -289,11 +285,11 @@ void SUCCESS_editStampContents() { //when Stamp oldStamp = getSavedStamp(requestMissionId, requestUserId); - StampInfo.Stamp expected = editStamp(oldStamp, editStampRequest, requestUserId, false, false); + editStamp(oldStamp, editStampRequest,false); StampInfo.Stamp result = stampService.editStampContents(editStampRequest, requestUserId); //then - assertThat(result).usingRecursiveComparison().isEqualTo(expected); + Assertions.assertEquals(oldStamp.getId(), result.getId()); } @Test @@ -312,12 +308,11 @@ void SUCCESS_editStampContentsNoContents() { //when Stamp oldStamp = getSavedStamp(requestMissionId, requestUserId); - StampInfo.Stamp expected = editStamp(oldStamp, editStampRequest, requestUserId, false, false); + StampInfo.Stamp expected = editStamp(oldStamp, editStampRequest, false); StampInfo.Stamp result = stampService.editStampContents(editStampRequest, requestUserId); //then - Assertions.assertEquals(oldStamp.getContents(), result.getContents()); - Assertions.assertEquals(expected.getImages(), result.getImages()); + Assertions.assertEquals(expected.getId(), result.getId()); } @Test @@ -336,12 +331,11 @@ void SUCCESS_editStampContentsNoImage() { //when Stamp oldStamp = getSavedStamp(requestMissionId, requestUserId); - StampInfo.Stamp expected = editStamp(oldStamp, editStampRequest, requestUserId, false, false); + editStamp(oldStamp, editStampRequest, false); StampInfo.Stamp result = stampService.editStampContents(editStampRequest, requestUserId); //then - Assertions.assertEquals(oldStamp.getImages(), result.getImages()); - Assertions.assertEquals(expected.getContents(), result.getContents()); + Assertions.assertEquals(oldStamp.getId(), result.getId()); } @Test @@ -373,8 +367,6 @@ void SUCCESS_editStampImagesDeprecated() { .id(1L) .contents("oldContents") .images(List.of("oldImage")) - .createdAt(LocalDateTime.now()) - .updatedAt(LocalDateTime.now()) .build(); StampInfo.Stamp oldStampInfo = StampInfo.Stamp.builder() @@ -391,7 +383,9 @@ void SUCCESS_editStampImagesDeprecated() { Mockito.when(stampRepository.save(any(Stamp.class))).thenReturn(oldStamp); //then - Assertions.assertEquals(imgPaths, stampService.editStampImagesDeprecated(oldStampInfo, imgPaths).getImages()); + Assertions.assertDoesNotThrow(() -> { + stampService.editStampImagesDeprecated(oldStampInfo, imgPaths); + }); } @@ -405,8 +399,6 @@ void FAIL_editStampImagesDeprecated() { .id(1L) .contents("oldContents") .images(List.of("oldImage")) - .createdAt(LocalDateTime.now()) - .updatedAt(LocalDateTime.now()) .build(); StampInfo.Stamp oldStampInfo = StampInfo.Stamp.builder() From 7919e197ccaae6b3ecadcf6370ef7ea89731d20b Mon Sep 17 00:00:00 2001 From: kseysh Date: Sat, 23 Mar 2024 16:17:01 +0900 Subject: [PATCH 058/141] =?UTF-8?q?chore:=20SoptampUserServiceTest=20?= =?UTF-8?q?=EB=94=94=EB=A0=89=ED=84=B0=EB=A6=AC=20=EC=9C=84=EC=B9=98=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=20(#217)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/application/{soptamp => }/SoptampUserServiceTest.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) rename src/test/java/org/sopt/app/application/{soptamp => }/SoptampUserServiceTest.java (97%) diff --git a/src/test/java/org/sopt/app/application/soptamp/SoptampUserServiceTest.java b/src/test/java/org/sopt/app/application/SoptampUserServiceTest.java similarity index 97% rename from src/test/java/org/sopt/app/application/soptamp/SoptampUserServiceTest.java rename to src/test/java/org/sopt/app/application/SoptampUserServiceTest.java index 322f4489..814b4cfe 100644 --- a/src/test/java/org/sopt/app/application/soptamp/SoptampUserServiceTest.java +++ b/src/test/java/org/sopt/app/application/SoptampUserServiceTest.java @@ -1,4 +1,4 @@ -package org.sopt.app.application.soptamp; +package org.sopt.app.application; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.any; @@ -14,6 +14,8 @@ import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.junit.jupiter.MockitoExtension; +import org.sopt.app.application.soptamp.SoptampUserInfo; +import org.sopt.app.application.soptamp.SoptampUserService; import org.sopt.app.common.exception.BadRequestException; import org.sopt.app.domain.entity.SoptampUser; import org.sopt.app.interfaces.postgres.SoptampUserRepository; From 4ff4cafd0b29cd771f90ca43c8a266ebeebde7ff Mon Sep 17 00:00:00 2001 From: kseysh Date: Sat, 23 Mar 2024 16:54:42 +0900 Subject: [PATCH 059/141] =?UTF-8?q?chore:=20findRanks=20=EC=84=B1=EA=B3=B5?= =?UTF-8?q?=20=EC=BC=80=EC=9D=B4=EC=8A=A4=20=EC=B6=94=EA=B0=80=20(#217)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/SoptampUserServiceTest.java | 42 ++++++++++++++++--- 1 file changed, 37 insertions(+), 5 deletions(-) diff --git a/src/test/java/org/sopt/app/application/SoptampUserServiceTest.java b/src/test/java/org/sopt/app/application/SoptampUserServiceTest.java index 814b4cfe..6446be53 100644 --- a/src/test/java/org/sopt/app/application/SoptampUserServiceTest.java +++ b/src/test/java/org/sopt/app/application/SoptampUserServiceTest.java @@ -1,11 +1,16 @@ -package org.sopt.app.application; +package org.sopt.app.application.soptamp; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.anyString; +import java.util.Comparator; +import java.util.List; import java.util.Optional; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.stream.Collectors; +import java.util.stream.Stream; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -14,8 +19,7 @@ import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.junit.jupiter.MockitoExtension; -import org.sopt.app.application.soptamp.SoptampUserInfo; -import org.sopt.app.application.soptamp.SoptampUserService; +import org.sopt.app.application.soptamp.SoptampPointInfo.Main; import org.sopt.app.common.exception.BadRequestException; import org.sopt.app.domain.entity.SoptampUser; import org.sopt.app.interfaces.postgres.SoptampUserRepository; @@ -181,11 +185,39 @@ private String generateNickname(String username) { return username + Math.round(Math.random() * 10000); } - /* TODO: Implement test cases + @Test - void findRanks() { + @DisplayName("SUCCESS_랭크 조회") + void SUCCESS_findRanks() { + //given + final SoptampUser soptampUser1 = SoptampUser.builder().nickname("1stUser").totalPoints(100L).build(); + final SoptampUser soptampUser2 = SoptampUser.builder().nickname("2stUser").totalPoints(200L).build(); + final SoptampUser soptampUser3 = SoptampUser.builder().nickname("3stUser").totalPoints(300L).build(); + List soptampUserList = List.of(soptampUser1, soptampUser2, soptampUser3); + + //when + Mockito.when(soptampUserRepository.findAll()).thenReturn(soptampUserList); + List
result = soptampUserService.findRanks(); + List
expected = getRanking(soptampUserList); + + //then + assertThat(result).usingRecursiveComparison().isEqualTo(expected); } + private List
getRanking(List userList) { + AtomicInteger rankPoint = new AtomicInteger(1); + return userList.stream().sorted( + Comparator.comparing(SoptampUser::getTotalPoints).reversed()) + .map(user -> Main.builder() + .rank(rankPoint.getAndIncrement()) + .nickname(user.getNickname()) + .point(user.getTotalPoints()) + .profileMessage(user.getProfileMessage()) + .build()) + .collect(Collectors.toList()); + } + + /* TODO: Implement test cases @Test void findCurrentRanks() { } From 2e9fd9ebdc64f79182326b22aa6a02fa01168264 Mon Sep 17 00:00:00 2001 From: kseysh Date: Sat, 23 Mar 2024 17:30:37 +0900 Subject: [PATCH 060/141] =?UTF-8?q?chore:=20findCurrentRanks=20=EC=84=B1?= =?UTF-8?q?=EA=B3=B5=20=EC=BC=80=EC=9D=B4=EC=8A=A4=20=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?(#217)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/SoptampUserServiceTest.java | 69 ++++++++++++------- 1 file changed, 44 insertions(+), 25 deletions(-) diff --git a/src/test/java/org/sopt/app/application/SoptampUserServiceTest.java b/src/test/java/org/sopt/app/application/SoptampUserServiceTest.java index 6446be53..55c3be28 100644 --- a/src/test/java/org/sopt/app/application/SoptampUserServiceTest.java +++ b/src/test/java/org/sopt/app/application/SoptampUserServiceTest.java @@ -1,4 +1,4 @@ -package org.sopt.app.application.soptamp; +package org.sopt.app.application; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.any; @@ -20,7 +20,11 @@ import org.mockito.Mockito; import org.mockito.junit.jupiter.MockitoExtension; import org.sopt.app.application.soptamp.SoptampPointInfo.Main; +import org.sopt.app.application.soptamp.SoptampPointInfo.Point; +import org.sopt.app.application.soptamp.SoptampUserInfo; +import org.sopt.app.application.soptamp.SoptampUserService; import org.sopt.app.common.exception.BadRequestException; +import org.sopt.app.common.response.ErrorCode; import org.sopt.app.domain.entity.SoptampUser; import org.sopt.app.interfaces.postgres.SoptampUserRepository; @@ -170,7 +174,7 @@ void FAIL_updateSoptampUser() { SoptampUser soptampUser = SoptampUser.builder() .id(id) .userId(anyUserId) - .nickname(generateNickname(newNickname)) + .nickname(newNickname) .build(); //when @@ -181,47 +185,62 @@ void FAIL_updateSoptampUser() { Assertions.assertEquals(soptampUserService.updateSoptampUser(newNickname, anyUserId), id); } - private String generateNickname(String username) { - return username + Math.round(Math.random() * 10000); - } - - @Test - @DisplayName("SUCCESS_랭크 조회") + @DisplayName("SUCCESS_솝탬프 유저 리스트를 받아 랭크 조회") void SUCCESS_findRanks() { //given final SoptampUser soptampUser1 = SoptampUser.builder().nickname("1stUser").totalPoints(100L).build(); final SoptampUser soptampUser2 = SoptampUser.builder().nickname("2stUser").totalPoints(200L).build(); final SoptampUser soptampUser3 = SoptampUser.builder().nickname("3stUser").totalPoints(300L).build(); - List soptampUserList = List.of(soptampUser1, soptampUser2, soptampUser3); + final List soptampUserList = List.of(soptampUser1, soptampUser2, soptampUser3); //when + List
expected = List.of( + Main.builder().rank(1).point(300L).nickname("3stUser").build(), + Main.builder().rank(2).point(200L).nickname("2stUser").build(), + Main.builder().rank(3).point(100L).nickname("1stUser").build() + ); + Mockito.when(soptampUserRepository.findAll()).thenReturn(soptampUserList); List
result = soptampUserService.findRanks(); - List
expected = getRanking(soptampUserList); //then assertThat(result).usingRecursiveComparison().isEqualTo(expected); } - private List
getRanking(List userList) { - AtomicInteger rankPoint = new AtomicInteger(1); - return userList.stream().sorted( - Comparator.comparing(SoptampUser::getTotalPoints).reversed()) - .map(user -> Main.builder() - .rank(rankPoint.getAndIncrement()) - .nickname(user.getNickname()) - .point(user.getTotalPoints()) - .profileMessage(user.getProfileMessage()) - .build()) - .collect(Collectors.toList()); - } - - /* TODO: Implement test cases @Test - void findCurrentRanks() { + @DisplayName("SUCCESS_솝탬프 포인트 리스트를 받아 랭크를 조회") + void SUCCESS_findCurrentRanks() { + //given + List soptampPointList = Stream.of( + Point.of(1L, 1L, 1L, 100L), + Point.of(2L, 1L, 2L, 200L), + Point.of(3L, 1L, 3L, 300L) + ).collect(Collectors.toList()); + + List soptampUserIdList = soptampPointList.stream() + .map(Point::getSoptampUserId).toList(); + + //when + List
expected = List.of( + Main.builder().rank(1).point(300L).build(), + Main.builder().rank(2).point(200L).build(), + Main.builder().rank(3).point(100L).build() + ); + + Mockito.when(soptampUserRepository.findAllById(soptampUserIdList)).thenReturn( + List.of( + SoptampUser.builder().id(1L).build(), + SoptampUser.builder().id(2L).build(), + SoptampUser.builder().id(3L).build() + )); + List
result = soptampUserService.findCurrentRanks(soptampPointList); + + //then + assertThat(result).usingRecursiveComparison().isEqualTo(expected); } + /* TODO: Implement test cases @Test void findRankByNickname() { } From 3b964fc2418b373cc646d4fdfe2a89f357b2f8f1 Mon Sep 17 00:00:00 2001 From: kseysh Date: Sat, 23 Mar 2024 17:35:39 +0900 Subject: [PATCH 061/141] =?UTF-8?q?feat:=20findCurrentRanks=20=EC=8B=A4?= =?UTF-8?q?=ED=8C=A8=20=EC=BC=80=EC=9D=B4=EC=8A=A4=20=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?(#217)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/SoptampUserServiceTest.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/test/java/org/sopt/app/application/SoptampUserServiceTest.java b/src/test/java/org/sopt/app/application/SoptampUserServiceTest.java index 55c3be28..9bbcf175 100644 --- a/src/test/java/org/sopt/app/application/SoptampUserServiceTest.java +++ b/src/test/java/org/sopt/app/application/SoptampUserServiceTest.java @@ -240,6 +240,34 @@ void SUCCESS_findCurrentRanks() { assertThat(result).usingRecursiveComparison().isEqualTo(expected); } + @Test + @DisplayName("FAIL_솝탬프 포인트 리스트를 받았을 때 유저를 찾지 못하면 BadRequestException 발생") + void FAIL_findCurrentRanks() { + //given + List soptampPointList = Stream.of( + Point.of(1L, 1L, 1L, 100L), + Point.of(2L, 1L, 2L, 200L), + Point.of(3L, 1L, 3L, 300L) + ).collect(Collectors.toList()); + + List soptampUserIdList = soptampPointList.stream() + .map(Point::getSoptampUserId).toList(); + + //when + List
expected = List.of( + Main.builder().rank(1).point(300L).build(), + Main.builder().rank(2).point(200L).build(), + Main.builder().rank(3).point(100L).build() + ); + + Mockito.when(soptampUserRepository.findAllById(soptampUserIdList)).thenReturn(List.of()); + + //then + Assertions.assertThrows(BadRequestException.class, () -> { + soptampUserService.findCurrentRanks(soptampPointList); + }); + } + /* TODO: Implement test cases @Test void findRankByNickname() { From 6616906bfaa195032ecd793cb55538c0a37c18eb Mon Sep 17 00:00:00 2001 From: kseysh Date: Sat, 23 Mar 2024 18:10:36 +0900 Subject: [PATCH 062/141] =?UTF-8?q?feat:=20findRankByNickname=20=EC=84=B1?= =?UTF-8?q?=EA=B3=B5,=20=EC=8B=A4=ED=8C=A8=20=EC=BC=80=EC=9D=B4=EC=8A=A4?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80=20(#217)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/SoptampUserServiceTest.java | 33 +++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/src/test/java/org/sopt/app/application/SoptampUserServiceTest.java b/src/test/java/org/sopt/app/application/SoptampUserServiceTest.java index 9bbcf175..6b159f36 100644 --- a/src/test/java/org/sopt/app/application/SoptampUserServiceTest.java +++ b/src/test/java/org/sopt/app/application/SoptampUserServiceTest.java @@ -268,11 +268,40 @@ void FAIL_findCurrentRanks() { }); } - /* TODO: Implement test cases + + @Test + @DisplayName("SUCCESS_닉네임으로 랭킹 조회") + void SUCCESS_findRankByNickname() { + // given + final String anyNickname = anyString(); + final SoptampUser soptampUser = SoptampUser.builder().nickname(anyNickname).build(); + + //when + Mockito.when(soptampUserRepository.findUserByNickname(anyNickname)).thenReturn(Optional.of(soptampUser)); + Optional result = soptampUserRepository.findUserByNickname(anyNickname); + + //then + assertThat(result).usingRecursiveComparison().isEqualTo(Optional.of(soptampUser)); + } + @Test - void findRankByNickname() { + @DisplayName("FAIL_닉네임으로 랭킹 조회") + void FAIL_findRankByNickname() { + // given + final String anyNickname = anyString(); + final SoptampUser soptampUser = SoptampUser.builder().nickname(anyNickname).build(); + + //when + Mockito.when(soptampUserRepository.findUserByNickname(anyNickname)).thenReturn(Optional.empty()); + + //then + Assertions.assertThrows(BadRequestException.class, () -> { + soptampUserService.findRankByNickname(anyNickname); + }); + } + /* TODO: Implement test cases @Test void addPoint() { } From 7d504d7af9b98c87b001a0c4694521c95d9e8d83 Mon Sep 17 00:00:00 2001 From: kseysh Date: Sat, 23 Mar 2024 18:11:05 +0900 Subject: [PATCH 063/141] =?UTF-8?q?chore:=20findRankByNickname=20=EC=8B=A4?= =?UTF-8?q?=ED=8C=A8=20=EC=BC=80=EC=9D=B4=EC=8A=A4=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=ED=95=98=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EB=B3=80=EC=88=98=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C=20(#217)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/sopt/app/application/SoptampUserServiceTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/java/org/sopt/app/application/SoptampUserServiceTest.java b/src/test/java/org/sopt/app/application/SoptampUserServiceTest.java index 6b159f36..1cad9b7e 100644 --- a/src/test/java/org/sopt/app/application/SoptampUserServiceTest.java +++ b/src/test/java/org/sopt/app/application/SoptampUserServiceTest.java @@ -289,7 +289,6 @@ void SUCCESS_findRankByNickname() { void FAIL_findRankByNickname() { // given final String anyNickname = anyString(); - final SoptampUser soptampUser = SoptampUser.builder().nickname(anyNickname).build(); //when Mockito.when(soptampUserRepository.findUserByNickname(anyNickname)).thenReturn(Optional.empty()); From 6853015a8ef66388994298c8d2ad0773e3e70584 Mon Sep 17 00:00:00 2001 From: kseysh Date: Sat, 23 Mar 2024 18:23:45 +0900 Subject: [PATCH 064/141] =?UTF-8?q?feat:=20addPoint=20=EC=84=B1=EA=B3=B5,?= =?UTF-8?q?=20=EC=8B=A4=ED=8C=A8=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BC=80?= =?UTF-8?q?=EC=9D=B4=EC=8A=A4=20=EC=B6=94=EA=B0=80=20(#217)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/SoptampUserServiceTest.java | 47 ++++++++++++++++++- 1 file changed, 45 insertions(+), 2 deletions(-) diff --git a/src/test/java/org/sopt/app/application/SoptampUserServiceTest.java b/src/test/java/org/sopt/app/application/SoptampUserServiceTest.java index 1cad9b7e..161262ba 100644 --- a/src/test/java/org/sopt/app/application/SoptampUserServiceTest.java +++ b/src/test/java/org/sopt/app/application/SoptampUserServiceTest.java @@ -300,11 +300,54 @@ void FAIL_findRankByNickname() { } - /* TODO: Implement test cases @Test - void addPoint() { + @DisplayName("SUCCESS_미션 레벨별로 유저의 포인트 추가") + void SUCCESS_addPoint() { + //given + final Long anyUserId = anyLong(); + final Integer level = 1; + final Long soptampUserTotalPoints = 100L; + final SoptampUser oldSoptampUser = SoptampUser.builder() + .userId(anyUserId) + .totalPoints(soptampUserTotalPoints) + .build(); + final SoptampUser newSoptampUser = SoptampUser.builder() + .userId(anyUserId) + .totalPoints(soptampUserTotalPoints + level) + .build(); + + //when + SoptampUserInfo.SoptampUser result = SoptampUserInfo.SoptampUser.builder() + .id(newSoptampUser.getId()) + .userId(newSoptampUser.getUserId()) + .profileMessage(newSoptampUser.getProfileMessage()) + .totalPoints(newSoptampUser.getTotalPoints()) + .nickname(newSoptampUser.getNickname()) + .build(); + + Mockito.when(soptampUserRepository.findByUserId(anyUserId)).thenReturn(Optional.of(oldSoptampUser)); + Mockito.when(soptampUserRepository.save(any(SoptampUser.class))).thenReturn(newSoptampUser); + + //then + assertThat(soptampUserService.addPoint(anyUserId, level)).usingRecursiveComparison().isEqualTo(result); + } + + @Test + @DisplayName("FAIL_유저를 찾지 못하면 BadRequestException 발생") + void FAIL_addPoint() { + //given + final Long anyUserId = anyLong(); + + //when + Mockito.when(soptampUserRepository.findByUserId(anyUserId)).thenReturn(Optional.empty()); + + //then + Assertions.assertThrows(BadRequestException.class, () -> { + soptampUserService.addPoint(anyUserId, 1); + }); } + /* TODO: Implement test cases @Test void subtractPoint() { } From 1e7f0ec0765467a7b66440f136dab439af390d65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A3=BC=EC=96=B4=EC=A7=84=EC=82=AC=EB=9E=91=28eojinjoo?= =?UTF-8?q?=29?= Date: Sat, 23 Mar 2024 18:24:40 +0900 Subject: [PATCH 065/141] feat: AuthFacadeTest, S3ServiceTest --- .../sopt/app/application/S3ServiceTest.java | 4 +- .../org/sopt/app/facade/AuthFacadeTest.java | 117 ++++++++++++++++++ 2 files changed, 120 insertions(+), 1 deletion(-) create mode 100644 src/test/java/org/sopt/app/facade/AuthFacadeTest.java diff --git a/src/test/java/org/sopt/app/application/S3ServiceTest.java b/src/test/java/org/sopt/app/application/S3ServiceTest.java index 4759aad5..b8c5f32e 100644 --- a/src/test/java/org/sopt/app/application/S3ServiceTest.java +++ b/src/test/java/org/sopt/app/application/S3ServiceTest.java @@ -121,7 +121,9 @@ void FAIL_getPreSignedUrlNullPointerException() { void SUCCESS_deleteFiles() { doNothing().when(s3Client).deleteObject(any(), any()); - s3Service.deleteFiles(List.of("https://url.com"), "folderName"); + Assertions.assertDoesNotThrow(() -> + s3Service.deleteFiles(List.of("https://url.com"), "folderName") + ); } @Test diff --git a/src/test/java/org/sopt/app/facade/AuthFacadeTest.java b/src/test/java/org/sopt/app/facade/AuthFacadeTest.java new file mode 100644 index 00000000..15b43c48 --- /dev/null +++ b/src/test/java/org/sopt/app/facade/AuthFacadeTest.java @@ -0,0 +1,117 @@ +package org.sopt.app.facade; + +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.when; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.sopt.app.application.auth.JwtTokenService; +import org.sopt.app.application.auth.PlaygroundAuthInfo.AppToken; +import org.sopt.app.application.auth.PlaygroundAuthInfo.PlaygroundMain; +import org.sopt.app.application.auth.PlaygroundAuthInfo.RefreshedToken; +import org.sopt.app.application.auth.PlaygroundAuthService; +import org.sopt.app.application.soptamp.SoptampPointService; +import org.sopt.app.application.soptamp.SoptampUserService; +import org.sopt.app.application.user.UserInfo.Id; +import org.sopt.app.application.user.UserService; +import org.sopt.app.domain.enums.UserStatus; +import org.sopt.app.presentation.auth.AppAuthRequest.AccessTokenRequest; +import org.sopt.app.presentation.auth.AppAuthRequest.CodeRequest; +import org.sopt.app.presentation.auth.AppAuthRequest.RefreshRequest; +import org.sopt.app.presentation.auth.AppAuthResponse.Token; +import org.sopt.app.presentation.auth.AppAuthResponseMapper; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +public class AuthFacadeTest { + + @Mock + private AppAuthResponseMapper appAuthResponseMapper; + @Mock + private JwtTokenService jwtTokenService; + @Mock + private UserService userService; + @Mock + private PlaygroundAuthService playgroundAuthService = Mockito.mock(PlaygroundAuthService.class); + @Mock + private SoptampUserService soptampUserService; + @Mock + private SoptampPointService soptampPointService; + + @InjectMocks + private AuthFacade authFacade; + + @Test + @DisplayName("SUCCESS_인증 회원 플그로 로그인") + void SUCCESS_loginWithPlaygroundActive() { + CodeRequest codeRequest = new CodeRequest(); + codeRequest.setCode("code"); + AccessTokenRequest accessTokenRequest = new AccessTokenRequest(); + accessTokenRequest.setAccessToken("accessToken"); + RefreshedToken refreshedToken = new RefreshedToken(); + refreshedToken.setAccessToken("refreshedToken"); + PlaygroundMain playgroundMain = new PlaygroundMain(); + playgroundMain.setName("name"); + playgroundMain.setStatus(UserStatus.ACTIVE); + Id userId = Id.builder().id(21L).build(); + Long soptampUserId = 5L; + AppToken appToken = AppToken.builder().accessToken("appAccessToken").refreshToken("appRefreshToken").build(); + Token token = new Token(); + token.setAccessToken("appAccessToken"); + token.setRefreshToken("appRefreshToken"); + + when(playgroundAuthService.getPlaygroundAccessToken(codeRequest)).thenReturn(accessTokenRequest); + when(playgroundAuthService.refreshPlaygroundToken(accessTokenRequest)).thenReturn(refreshedToken); + when(playgroundAuthService.getPlaygroundInfo(refreshedToken.getAccessToken())) + .thenReturn(playgroundMain); + when(userService.loginWithUserPlaygroundId(playgroundMain)).thenReturn(userId); + when(soptampUserService.updateSoptampUser(playgroundMain.getName(), userId.getId())) + .thenReturn(soptampUserId); + doNothing().when(soptampPointService).upsertSoptampPoint(playgroundMain.getStatus(), soptampUserId); + when(jwtTokenService.issueNewTokens(userId, playgroundMain)).thenReturn(appToken); + when(appAuthResponseMapper.of(appToken.getAccessToken(), appToken.getRefreshToken(), + playgroundMain.getAccessToken(), playgroundMain.getStatus())).thenReturn(token); + + Token result = authFacade.loginWithPlayground(codeRequest); + Assertions.assertEquals(appToken.getAccessToken(), result.getAccessToken()); + Assertions.assertEquals(appToken.getRefreshToken(), result.getRefreshToken()); + } + + @Test + @DisplayName("SUCCESS_인증 회원 토큰 리프레시") + void SUCCESS_getRefreshToken() { + RefreshRequest refreshRequest = new RefreshRequest(); + refreshRequest.setRefreshToken("refreshToken"); + AccessTokenRequest accessTokenRequest = new AccessTokenRequest(); + accessTokenRequest.setAccessToken("accessToken"); + RefreshedToken refreshedToken = new RefreshedToken(); + refreshedToken.setAccessToken("refreshedToken"); + PlaygroundMain playgroundMain = new PlaygroundMain(); + playgroundMain.setAccessToken("accessToken"); + playgroundMain.setStatus(UserStatus.ACTIVE); + Id userId = Id.builder().id(21L).build(); + AppToken newAppToken = AppToken.builder().accessToken("newAppAccessToken").refreshToken("newAppRefreshToken") + .build(); + Token token = new Token(); + token.setAccessToken("newAppAccessToken"); + token.setRefreshToken("newAppRefreshToken"); + + when(jwtTokenService.getUserIdFromJwtToken(refreshRequest.getRefreshToken())).thenReturn(userId); + when(userService.getPlaygroundToken(userId)).thenReturn(accessTokenRequest); + when(playgroundAuthService.refreshPlaygroundToken(accessTokenRequest)).thenReturn(refreshedToken); + when(playgroundAuthService.getPlaygroundInfo(refreshedToken.getAccessToken())) + .thenReturn(playgroundMain); + doNothing().when(userService).updatePlaygroundToken(userId, refreshedToken.getAccessToken()); + when(jwtTokenService.issueNewTokens(userId, playgroundMain)).thenReturn(newAppToken); + when(appAuthResponseMapper.of(newAppToken.getAccessToken(), newAppToken.getRefreshToken(), + refreshedToken.getAccessToken(), playgroundMain.getStatus())).thenReturn(token); + + Token result = authFacade.getRefreshToken(refreshRequest); + Assertions.assertEquals(newAppToken.getAccessToken(), result.getAccessToken()); + Assertions.assertEquals(newAppToken.getRefreshToken(), result.getRefreshToken()); + } +} From 036a786a113c385153a6da5c900b72f10bec7ea9 Mon Sep 17 00:00:00 2001 From: kseysh Date: Sat, 23 Mar 2024 18:25:58 +0900 Subject: [PATCH 066/141] =?UTF-8?q?feat:=20subtractPoint=20=EC=84=B1?= =?UTF-8?q?=EA=B3=B5,=20=EC=8B=A4=ED=8C=A8=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=20=EC=BC=80=EC=9D=B4=EC=8A=A4=20=EC=B6=94=EA=B0=80=20(#217)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/SoptampUserServiceTest.java | 47 ++++++++++++++++++- 1 file changed, 45 insertions(+), 2 deletions(-) diff --git a/src/test/java/org/sopt/app/application/SoptampUserServiceTest.java b/src/test/java/org/sopt/app/application/SoptampUserServiceTest.java index 161262ba..cf13812c 100644 --- a/src/test/java/org/sopt/app/application/SoptampUserServiceTest.java +++ b/src/test/java/org/sopt/app/application/SoptampUserServiceTest.java @@ -347,11 +347,54 @@ void FAIL_addPoint() { }); } - /* TODO: Implement test cases @Test - void subtractPoint() { + @DisplayName("SUCCESS_미션 레벨별로 유저의 포인트 감소") + void SUCCESS_subtractPoint() { + //given + final Long anyUserId = anyLong(); + final Integer level = 1; + final Long soptampUserTotalPoints = 100L; + final SoptampUser oldSoptampUser = SoptampUser.builder() + .userId(anyUserId) + .totalPoints(soptampUserTotalPoints) + .build(); + final SoptampUser newSoptampUser = SoptampUser.builder() + .userId(anyUserId) + .totalPoints(soptampUserTotalPoints - level) + .build(); + + //when + SoptampUserInfo.SoptampUser result = SoptampUserInfo.SoptampUser.builder() + .id(newSoptampUser.getId()) + .userId(newSoptampUser.getUserId()) + .profileMessage(newSoptampUser.getProfileMessage()) + .totalPoints(newSoptampUser.getTotalPoints()) + .nickname(newSoptampUser.getNickname()) + .build(); + + Mockito.when(soptampUserRepository.findByUserId(anyUserId)).thenReturn(Optional.of(oldSoptampUser)); + Mockito.when(soptampUserRepository.save(any(SoptampUser.class))).thenReturn(newSoptampUser); + + //then + assertThat(soptampUserService.subtractPoint(anyUserId, level)).usingRecursiveComparison().isEqualTo(result); + } + + @Test + @DisplayName("FAIL_유저를 찾지 못하면 BadRequestException 발생") + void FAIL_subtractPoint() { + //given + final Long anyUserId = anyLong(); + + //when + Mockito.when(soptampUserRepository.findByUserId(anyUserId)).thenReturn(Optional.empty()); + + //then + Assertions.assertThrows(BadRequestException.class, () -> { + soptampUserService.subtractPoint(anyUserId, 1); + }); } + /* TODO: Implement test cases @Test void findByNickname() { } From e2797e3f86521f09d7249a99b27aac9f24013fa9 Mon Sep 17 00:00:00 2001 From: kseysh Date: Sat, 23 Mar 2024 18:34:14 +0900 Subject: [PATCH 067/141] =?UTF-8?q?feat:=20findByNickname=20=EC=84=B1?= =?UTF-8?q?=EA=B3=B5,=20=EC=8B=A4=ED=8C=A8=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=20=EC=BC=80=EC=9D=B4=EC=8A=A4=20=EC=B6=94=EA=B0=80=20(#217)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/SoptampUserServiceTest.java | 46 ++++++++++++++++++- 1 file changed, 44 insertions(+), 2 deletions(-) diff --git a/src/test/java/org/sopt/app/application/SoptampUserServiceTest.java b/src/test/java/org/sopt/app/application/SoptampUserServiceTest.java index cf13812c..48ad3d1c 100644 --- a/src/test/java/org/sopt/app/application/SoptampUserServiceTest.java +++ b/src/test/java/org/sopt/app/application/SoptampUserServiceTest.java @@ -394,11 +394,53 @@ void FAIL_subtractPoint() { }); } - /* TODO: Implement test cases @Test - void findByNickname() { + @DisplayName("SUCCESS_닉네임으로 유저 조회") + void SUCCESS_findByNickname() { + //given + final Long id = 1L; + final Long userId = 1L; + final String profileMessage = "profileMessage"; + final Long totalPoints = 100L; + final String anyNickname = anyString(); + + final SoptampUser soptampUser = SoptampUser.builder() + .id(id) + .userId(userId) + .profileMessage(profileMessage) + .totalPoints(totalPoints) + .nickname(anyNickname) + .build(); + //when + Mockito.when(soptampUserRepository.findUserByNickname(anyNickname)).thenReturn(Optional.of(soptampUser)); + SoptampUserInfo.SoptampUser expected = SoptampUserInfo.SoptampUser.builder() + .id(id) + .userId(userId) + .profileMessage(profileMessage) + .totalPoints(totalPoints) + .nickname(anyNickname) + .build(); + + //then + assertThat(soptampUserService.findByNickname(anyNickname)).usingRecursiveComparison().isEqualTo(expected); + } + + @Test + @DisplayName("FAIL_닉네임으로 유저 조회 실패시 BadRequestException 발생") + void FAIL_findByNickname() { + //given + final String anyNickname = anyString(); + + //when + Mockito.when(soptampUserRepository.findUserByNickname(anyNickname)).thenReturn(Optional.empty()); + + //then + Assertions.assertThrows(BadRequestException.class, () -> { + soptampUserService.findByNickname(anyNickname); + }); } + /* TODO: Implement test cases @Test void initPoint() { } From b0256e78d2dc34ed33bbb2d4246964b2dbf6c7a6 Mon Sep 17 00:00:00 2001 From: kseysh Date: Sat, 23 Mar 2024 18:39:06 +0900 Subject: [PATCH 068/141] =?UTF-8?q?feat:=20initPoint=20=EC=84=B1=EA=B3=B5,?= =?UTF-8?q?=20=EC=8B=A4=ED=8C=A8=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BC=80?= =?UTF-8?q?=EC=9D=B4=EC=8A=A4=20=EC=B6=94=EA=B0=80=20(#217)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/SoptampUserServiceTest.java | 34 +++++++++++++++++-- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/src/test/java/org/sopt/app/application/SoptampUserServiceTest.java b/src/test/java/org/sopt/app/application/SoptampUserServiceTest.java index 48ad3d1c..46e2ce32 100644 --- a/src/test/java/org/sopt/app/application/SoptampUserServiceTest.java +++ b/src/test/java/org/sopt/app/application/SoptampUserServiceTest.java @@ -440,10 +440,38 @@ void FAIL_findByNickname() { }); } - /* TODO: Implement test cases @Test - void initPoint() { + @DisplayName("SUCCESS_포인트 초기화") + void SUCCESS_initPoint() { + //given + final Long anyUserId = anyLong(); + final SoptampUser soptampUser = SoptampUser.builder() + .userId(anyUserId) + .build(); + + //when + Mockito.when(soptampUserRepository.findByUserId(anyUserId)).thenReturn(Optional.of(soptampUser)); + Mockito.when(soptampUserRepository.save(any(SoptampUser.class))).thenReturn(soptampUser); + + //then + Assertions.assertDoesNotThrow(() -> { + soptampUserService.initPoint(anyUserId); + }); + } + + @Test + @DisplayName("FAIL_포인트 초기화") + void FAIL_initPoint() { + //given + final Long anyUserId = anyLong(); + + //when + Mockito.when(soptampUserRepository.findByUserId(anyUserId)).thenReturn(Optional.empty()); + + //then + Assertions.assertThrows(BadRequestException.class, () -> { + soptampUserService.initPoint(anyUserId); + }); } - */ } \ No newline at end of file From a2d5e69f3fecd3699d07db5c657903a41afdd83a Mon Sep 17 00:00:00 2001 From: kseysh Date: Sat, 23 Mar 2024 18:39:39 +0900 Subject: [PATCH 069/141] =?UTF-8?q?chore:=20=EC=82=AC=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20import=EB=AC=B8=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0=20(#217)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/sopt/app/application/SoptampUserServiceTest.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/test/java/org/sopt/app/application/SoptampUserServiceTest.java b/src/test/java/org/sopt/app/application/SoptampUserServiceTest.java index 46e2ce32..54edfb55 100644 --- a/src/test/java/org/sopt/app/application/SoptampUserServiceTest.java +++ b/src/test/java/org/sopt/app/application/SoptampUserServiceTest.java @@ -5,10 +5,8 @@ import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.anyString; -import java.util.Comparator; import java.util.List; import java.util.Optional; -import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; import java.util.stream.Stream; import org.junit.jupiter.api.Assertions; @@ -24,7 +22,6 @@ import org.sopt.app.application.soptamp.SoptampUserInfo; import org.sopt.app.application.soptamp.SoptampUserService; import org.sopt.app.common.exception.BadRequestException; -import org.sopt.app.common.response.ErrorCode; import org.sopt.app.domain.entity.SoptampUser; import org.sopt.app.interfaces.postgres.SoptampUserRepository; From f36d051d20a78da4a963746f33ad27e692aa40d0 Mon Sep 17 00:00:00 2001 From: kseysh Date: Sat, 23 Mar 2024 18:40:11 +0900 Subject: [PATCH 070/141] =?UTF-8?q?chore:=20=EC=BD=94=EB=93=9C=20=ED=8F=AC?= =?UTF-8?q?=EB=A7=A4=ED=8C=85=20(#217)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/sopt/app/application/SoptampUserServiceTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/org/sopt/app/application/SoptampUserServiceTest.java b/src/test/java/org/sopt/app/application/SoptampUserServiceTest.java index 54edfb55..e9654ca4 100644 --- a/src/test/java/org/sopt/app/application/SoptampUserServiceTest.java +++ b/src/test/java/org/sopt/app/application/SoptampUserServiceTest.java @@ -302,7 +302,7 @@ void FAIL_findRankByNickname() { void SUCCESS_addPoint() { //given final Long anyUserId = anyLong(); - final Integer level = 1; + final Integer level = 1; final Long soptampUserTotalPoints = 100L; final SoptampUser oldSoptampUser = SoptampUser.builder() .userId(anyUserId) @@ -349,7 +349,7 @@ void FAIL_addPoint() { void SUCCESS_subtractPoint() { //given final Long anyUserId = anyLong(); - final Integer level = 1; + final Integer level = 1; final Long soptampUserTotalPoints = 100L; final SoptampUser oldSoptampUser = SoptampUser.builder() .userId(anyUserId) From ebfa1d0265650c811571ede32c3fcff6a083ecff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A3=BC=EC=96=B4=EC=A7=84=EC=82=AC=EB=9E=91=28eojinjoo?= =?UTF-8?q?=29?= Date: Sun, 24 Mar 2024 01:31:56 +0900 Subject: [PATCH 071/141] feat: PlaygroundAuthServiceTest --- .../application/auth/PlaygroundAuthInfo.java | 12 +- .../PlaygroundAuthServiceTest.java | 341 ++++++++++++++++++ 2 files changed, 350 insertions(+), 3 deletions(-) create mode 100644 src/test/java/org/sopt/app/application/PlaygroundAuthServiceTest.java diff --git a/src/main/java/org/sopt/app/application/auth/PlaygroundAuthInfo.java b/src/main/java/org/sopt/app/application/auth/PlaygroundAuthInfo.java index 915718e8..81604311 100644 --- a/src/main/java/org/sopt/app/application/auth/PlaygroundAuthInfo.java +++ b/src/main/java/org/sopt/app/application/auth/PlaygroundAuthInfo.java @@ -2,13 +2,13 @@ import com.fasterxml.jackson.annotation.JsonProperty; import java.util.List; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; +import lombok.NoArgsConstructor; import lombok.Setter; import lombok.ToString; -import lombok.NoArgsConstructor; -import lombok.AllArgsConstructor; -import lombok.AccessLevel; import org.sopt.app.domain.enums.UserStatus; public class PlaygroundAuthInfo { @@ -115,6 +115,7 @@ public static class RefreshedToken { @Setter @ToString public static class ActiveUserIds { + @JsonProperty("memberIds") private List userIds; } @@ -124,15 +125,18 @@ public static class ActiveUserIds { @Builder @ToString public static class UserActiveInfo { + private Long currentGeneration; private UserStatus status; } @Getter + @Builder @ToString @NoArgsConstructor(access = AccessLevel.PRIVATE) @AllArgsConstructor(access = AccessLevel.PRIVATE) public static class MemberProfile { + @JsonProperty("memberId") private Long id; private String profileImage; @@ -149,11 +153,13 @@ public ActivityCardinalInfo getLatestActivity() { @NoArgsConstructor(access = AccessLevel.PRIVATE) @AllArgsConstructor(access = AccessLevel.PRIVATE) public static class ActivityCardinalInfo { + private String cardinalInfo; public String getGeneration() { return cardinalInfo.split(",")[0]; } + public String getPart() { return cardinalInfo.split(",")[1]; } diff --git a/src/test/java/org/sopt/app/application/PlaygroundAuthServiceTest.java b/src/test/java/org/sopt/app/application/PlaygroundAuthServiceTest.java new file mode 100644 index 00000000..87fa1559 --- /dev/null +++ b/src/test/java/org/sopt/app/application/PlaygroundAuthServiceTest.java @@ -0,0 +1,341 @@ +package org.sopt.app.application; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.when; + +import io.jsonwebtoken.ExpiredJwtException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.sopt.app.application.auth.PlaygroundAuthInfo; +import org.sopt.app.application.auth.PlaygroundAuthInfo.ActiveUserIds; +import org.sopt.app.application.auth.PlaygroundAuthInfo.MainView; +import org.sopt.app.application.auth.PlaygroundAuthInfo.MainViewUser; +import org.sopt.app.application.auth.PlaygroundAuthInfo.MemberProfile; +import org.sopt.app.application.auth.PlaygroundAuthInfo.PlaygroundActivity; +import org.sopt.app.application.auth.PlaygroundAuthInfo.PlaygroundCardinalActivity; +import org.sopt.app.application.auth.PlaygroundAuthInfo.PlaygroundMain; +import org.sopt.app.application.auth.PlaygroundAuthInfo.PlaygroundProfile; +import org.sopt.app.application.auth.PlaygroundAuthInfo.RefreshedToken; +import org.sopt.app.application.auth.PlaygroundAuthInfo.UserActiveInfo; +import org.sopt.app.application.auth.PlaygroundAuthService; +import org.sopt.app.common.exception.BadRequestException; +import org.sopt.app.common.exception.UnauthorizedException; +import org.sopt.app.domain.enums.UserStatus; +import org.sopt.app.interfaces.external.PlaygroundClient; +import org.sopt.app.presentation.auth.AppAuthRequest.AccessTokenRequest; +import org.sopt.app.presentation.auth.AppAuthRequest.CodeRequest; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.web.client.HttpClientErrorException.BadRequest; + +@SpringBootTest +public class PlaygroundAuthServiceTest { + + @Mock + private PlaygroundClient playgroundClient; + + @InjectMocks + private PlaygroundAuthService playgroundAuthService; + private String token = "header.payload.signature"; + + private Map createDefaultHeader() { + return new HashMap<>(Map.of("content-type", "application/json;charset=UTF-8")); + } + + // getPlaygroundInfo + @Test + @DisplayName("SUCCESS_플레이그라운드 정보 조회") + void SUCCESS_getPlaygroundInfo() { + String token = "token"; + PlaygroundCardinalActivity playgroundCardinalActivity = new PlaygroundCardinalActivity(); + PlaygroundActivity playgroundActivity = new PlaygroundActivity(); + playgroundActivity.setCardinalActivities(List.of(playgroundCardinalActivity)); + PlaygroundAuthInfo.PlaygroundProfile playgroundProfile = new PlaygroundProfile(); + playgroundProfile.setActivities(List.of(playgroundActivity)); + playgroundProfile.setProfileImage("profileImage"); + playgroundProfile.setName("name"); + PlaygroundMain playgroundMain = new PlaygroundMain(); + playgroundMain.setName("name"); + + when(playgroundClient.getPlaygroundMember(any())).thenReturn(playgroundMain); + when(playgroundClient.getPlaygroundMemberProfile(any())).thenReturn(playgroundProfile); + + PlaygroundMain result = playgroundAuthService.getPlaygroundInfo(token); + Assertions.assertEquals(token, result.getAccessToken()); + Assertions.assertEquals(playgroundMain.getName(), result.getName()); + Assertions.assertEquals(UserStatus.ACTIVE, result.getStatus()); + } + + @Test + @DisplayName("FAIL_플레이그라운드 정보 조회 BadRequestException") + void FAIL_getPlaygroundInfoBadRequestException() { + when(playgroundClient.getPlaygroundMember(any())).thenThrow(BadRequest.class); + + Assertions.assertThrows(BadRequestException.class, () -> { + playgroundAuthService.getPlaygroundInfo(token); + }); + } + + @Test + @DisplayName("FAIL_플레이그라운드 정보 조회 UnauthorizedException") + void FAIL_getPlaygroundInfoExpiredJwtUnauthorizedException() { + when(playgroundClient.getPlaygroundMember(any())).thenThrow(ExpiredJwtException.class); + + Assertions.assertThrows(UnauthorizedException.class, () -> { + playgroundAuthService.getPlaygroundInfo(token); + }); + } + + // getPlaygroundAccessToken + @Test + @DisplayName("SUCCESS_플레이그라운드 어세스 토큰 발급") + void SUCCESS_getPlaygroundAccessToken() { + CodeRequest codeRequest = new CodeRequest(); + codeRequest.setCode("code"); + AccessTokenRequest accessTokenRequest = new AccessTokenRequest(); + accessTokenRequest.setAccessToken("accessToken"); + + when(playgroundClient.getAccessToken(any(), any())).thenReturn(accessTokenRequest); + + AccessTokenRequest result = playgroundAuthService.getPlaygroundAccessToken(codeRequest); + Assertions.assertEquals(accessTokenRequest.getAccessToken(), result.getAccessToken()); + } + + @Test + @DisplayName("FAIL_플레이그라운드 어세스 토큰 발 BadRequestException") + void FAIL_getPlaygroundAccessTokenBadRequestException() { + CodeRequest codeRequest = new CodeRequest(); + + when(playgroundClient.getAccessToken(any(), any())).thenThrow(BadRequest.class); + + Assertions.assertThrows(BadRequestException.class, () -> { + playgroundAuthService.getPlaygroundAccessToken(codeRequest); + }); + } + + // refreshPlaygroundToken + @Test + @DisplayName("SUCCESS_플레이그라운드 토큰 리프레시") + void SUCCESS_refreshPlaygroundToken() { + AccessTokenRequest accessTokenRequest = new AccessTokenRequest(); + accessTokenRequest.setAccessToken("accessToken"); + RefreshedToken refreshedToken = new RefreshedToken(); + refreshedToken.setAccessToken("refreshedToken"); + + when(playgroundClient.refreshPlaygroundToken(any(), any())).thenReturn(refreshedToken); + + RefreshedToken result = playgroundAuthService.refreshPlaygroundToken(accessTokenRequest); + Assertions.assertEquals(refreshedToken.getAccessToken(), result.getAccessToken()); + } + + @Test + @DisplayName("FAIL_플레이그라운드 토큰 리프레시 UnauthorizedException") + void FAIL_refreshPlaygroundTokenUnauthorizedException() { + AccessTokenRequest accessTokenRequest = new AccessTokenRequest(); + + when(playgroundClient.refreshPlaygroundToken(any(), any())).thenThrow(BadRequest.class); + + Assertions.assertThrows(UnauthorizedException.class, () -> { + playgroundAuthService.refreshPlaygroundToken(accessTokenRequest); + }); + } + + @Test + @DisplayName("FAIL_플레이그라운드 토큰 리프레시 UnauthorizedException") + void FAIL_refreshPlaygroundTokenExpiredJwtUnauthorizedException() { + AccessTokenRequest accessTokenRequest = new AccessTokenRequest(); + + when(playgroundClient.refreshPlaygroundToken(any(), any())).thenThrow(ExpiredJwtException.class); + + Assertions.assertThrows(UnauthorizedException.class, () -> { + playgroundAuthService.refreshPlaygroundToken(accessTokenRequest); + }); + } + + // getPlaygroundUserForMainView + @Test + @DisplayName("SUCCESS_플레이그라운드 이미지 있는 유저 메인 뷰 조회") + void SUCCESS_getPlaygroundUserForMainViewWithProfileImage() { + PlaygroundCardinalActivity playgroundCardinalActivity = new PlaygroundCardinalActivity(); + playgroundCardinalActivity.setGeneration(null); + PlaygroundActivity playgroundActivity = new PlaygroundActivity(); + playgroundActivity.setCardinalActivities(List.of(playgroundCardinalActivity)); + PlaygroundAuthInfo.PlaygroundProfile playgroundProfile = new PlaygroundProfile(); + playgroundProfile.setActivities(List.of(playgroundActivity)); + playgroundProfile.setProfileImage("profileImage"); + playgroundProfile.setName("name"); + MainViewUser mainViewUser = MainViewUser.builder().name("name").profileImage("profileImage").build(); + MainView mainView = MainView.builder().user(mainViewUser).build(); + + when(playgroundClient.getPlaygroundMemberProfile(any())).thenReturn(playgroundProfile); + + MainView result = playgroundAuthService.getPlaygroundUserForMainView(token); + Assertions.assertEquals(mainView.getUser().getName(), result.getUser().getName()); + } + + @Test + @DisplayName("SUCCESS_플레이그라운드 이미지 없는 유저 메인 뷰 조회") + void SUCCESS_getPlaygroundUserForMainViewWithoutProfileImage() { + PlaygroundCardinalActivity playgroundCardinalActivity = new PlaygroundCardinalActivity(); + playgroundCardinalActivity.setGeneration(null); + PlaygroundActivity playgroundActivity = new PlaygroundActivity(); + playgroundActivity.setCardinalActivities(List.of(playgroundCardinalActivity)); + PlaygroundAuthInfo.PlaygroundProfile playgroundProfile = new PlaygroundProfile(); + playgroundProfile.setActivities(List.of(playgroundActivity)); + playgroundProfile.setProfileImage(null); + playgroundProfile.setName("name"); + MainViewUser mainViewUser = MainViewUser.builder().name("name").profileImage("").build(); + MainView mainView = MainView.builder().user(mainViewUser).build(); + + when(playgroundClient.getPlaygroundMemberProfile(any())).thenReturn(playgroundProfile); + + MainView result = playgroundAuthService.getPlaygroundUserForMainView(token); + Assertions.assertEquals(mainView.getUser().getName(), result.getUser().getName()); + Assertions.assertEquals(mainView.getUser().getProfileImage(), result.getUser().getProfileImage()); + } + + // getPlaygroundUserActiveInfo + @Test + @DisplayName("SUCCESS_플레이그라운드 활동 유저 활동 정보 조회") + void SUCCESS_getPlaygroundUserActiveInfoActive() { + PlaygroundCardinalActivity playgroundCardinalActivity = new PlaygroundCardinalActivity(); + playgroundCardinalActivity.setGeneration(null); + PlaygroundActivity playgroundActivity = new PlaygroundActivity(); + playgroundActivity.setCardinalActivities(List.of(playgroundCardinalActivity)); + PlaygroundAuthInfo.PlaygroundProfile playgroundProfile = new PlaygroundProfile(); + playgroundProfile.setActivities(List.of(playgroundActivity)); + + when(playgroundClient.getPlaygroundMemberProfile(any())).thenReturn(playgroundProfile); + + UserActiveInfo result = playgroundAuthService.getPlaygroundUserActiveInfo(token); + Assertions.assertEquals(UserStatus.ACTIVE, result.getStatus()); + } + + @Test + @DisplayName("SUCCESS_플레이그라운드 비활동 유저 활동 정보 조회") + void SUCCESS_getPlaygroundUserActiveInfoInactive() { + PlaygroundCardinalActivity playgroundCardinalActivity = new PlaygroundCardinalActivity(); + playgroundCardinalActivity.setGeneration(0L); + PlaygroundActivity playgroundActivity = new PlaygroundActivity(); + playgroundActivity.setCardinalActivities(List.of(playgroundCardinalActivity)); + PlaygroundAuthInfo.PlaygroundProfile playgroundProfile = new PlaygroundProfile(); + playgroundProfile.setActivities(List.of()); + + when(playgroundClient.getPlaygroundMemberProfile(any())).thenReturn(playgroundProfile); + + UserActiveInfo result = playgroundAuthService.getPlaygroundUserActiveInfo(token); + Assertions.assertEquals(UserStatus.INACTIVE, result.getStatus()); + } + + @Test + @DisplayName("SUCCESS_플레이그라운드 엠티 유저 활동 정보 조회") + void SUCCESS_getPlaygroundUserActiveInfoEmptyList() { + PlaygroundActivity playgroundActivity = new PlaygroundActivity(); + playgroundActivity.setCardinalActivities(List.of()); + PlaygroundAuthInfo.PlaygroundProfile playgroundProfile = new PlaygroundProfile(); + playgroundProfile.setActivities(List.of()); + + when(playgroundClient.getPlaygroundMemberProfile(any())).thenReturn(playgroundProfile); + + UserActiveInfo result = playgroundAuthService.getPlaygroundUserActiveInfo(token); + Assertions.assertEquals(UserStatus.INACTIVE, result.getStatus()); + } + + @Test + @DisplayName("FAIL_플레이그라운드 프로필을 등록하지 않은 유저 활동 정보 조회 BadRequestException") + void FAIL_getPlaygroundUserActiveInfoNotRegisteredBadRequestException() { + when(playgroundClient.getPlaygroundMemberProfile(any())).thenThrow(BadRequest.class); + + Assertions.assertThrows(BadRequestException.class, () -> { + playgroundAuthService.getPlaygroundUserActiveInfo(token); + }); + } + + @Test + @DisplayName("FAIL_플레이그라운드 토큰이 만료된 유저 활동 정보 조회 UnauthorizedException") + void FAIL_getPlaygroundUserActiveInfoExpiredJwtUnauthorizedException() { + when(playgroundClient.getPlaygroundMemberProfile(any())).thenThrow(ExpiredJwtException.class); + + Assertions.assertThrows(UnauthorizedException.class, () -> { + playgroundAuthService.getPlaygroundUserActiveInfo(token); + }); + } + + // getPlayGroundUserIds + @Test + @DisplayName("SUCCESS_플레이그라운드 유저 아이디 조회") + void SUCCESS_getPlayGroundUserIds() { + PlaygroundAuthInfo.ActiveUserIds userIds = new ActiveUserIds(); + userIds.setUserIds(List.of(1L)); + + when(playgroundClient.getPlaygroundUserIds(any(), any())).thenReturn(userIds); + + ActiveUserIds result = playgroundAuthService.getPlayGroundUserIds(token); + Assertions.assertEquals(1, result.getUserIds().size()); + Assertions.assertEquals(1L, result.getUserIds().get(0)); + } + + @Test + @DisplayName("FAIL_플레이그라운드 프로필을 등록하지 않은 유저 아이디 조회 BadRequestException") + void FAIL_getPlayGroundUserIdsNotRegisteredBadRequestException() { + PlaygroundAuthInfo.ActiveUserIds userIds = new ActiveUserIds(); + userIds.setUserIds(List.of(1L)); + + when(playgroundClient.getPlaygroundUserIds(any(), any())).thenThrow(BadRequest.class); + + Assertions.assertThrows(BadRequestException.class, () -> { + playgroundAuthService.getPlayGroundUserIds(token); + }); + } + + @Test + @DisplayName("FAIL_플레이그라운드 토큰이 만료된 유저 아이디 조회 UnauthorizedException") + void FAIL_getPlayGroundUserIdsExpiredJwtUnauthorizedException() { + PlaygroundAuthInfo.ActiveUserIds userIds = new ActiveUserIds(); + userIds.setUserIds(List.of(1L)); + + when(playgroundClient.getPlaygroundUserIds(any(), any())).thenThrow(ExpiredJwtException.class); + + Assertions.assertThrows(UnauthorizedException.class, () -> { + playgroundAuthService.getPlayGroundUserIds(token); + }); + } + + // getPlaygroundMemberProfiles + @Test + @DisplayName("SUCCESS_플레이그라운드 멤버 프로필 조회") + void SUCCESS_getPlaygroundMemberProfiles() { + PlaygroundAuthInfo.MemberProfile memberProfile = MemberProfile.builder().name("name").build(); + + when(playgroundClient.getMemberProfiles(any(), any())).thenReturn(List.of(memberProfile)); + + List result = playgroundAuthService.getPlaygroundMemberProfiles(token, List.of()); + Assertions.assertEquals(1, result.size()); + Assertions.assertEquals("name", result.get(0).getName()); + } + + @Test + @DisplayName("FAIL_플레이그라운드 프로필을 등록하지 않은 유저 프로필 조회 BadRequestException") + void FAIL_getPlaygroundMemberProfilesNotRegisteredBadRequestException() { + when(playgroundClient.getMemberProfiles(any(), any())).thenThrow(BadRequest.class); + + Assertions.assertThrows(BadRequestException.class, () -> { + playgroundAuthService.getPlaygroundMemberProfiles(token, List.of()); + }); + } + + @Test + @DisplayName("FAIL_플레이그라운드 토큰이 만료된 유저 프로필 조회 UnauthorizedException") + void FAIL_getPlaygroundMemberProfilesExpiredJwtUnauthorizedException() { + when(playgroundClient.getMemberProfiles(any(), any())).thenThrow(ExpiredJwtException.class); + + Assertions.assertThrows(UnauthorizedException.class, () -> { + playgroundAuthService.getPlaygroundMemberProfiles(token, List.of()); + }); + } +} From d084647bff88a012baa27e4af6bc5d6300c7a217 Mon Sep 17 00:00:00 2001 From: kseysh Date: Sun, 24 Mar 2024 14:30:23 +0900 Subject: [PATCH 072/141] =?UTF-8?q?chore:=20=EC=82=AC=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EB=B3=80=EC=88=98=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=20(#217)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/sopt/app/application/SoptampUserServiceTest.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/test/java/org/sopt/app/application/SoptampUserServiceTest.java b/src/test/java/org/sopt/app/application/SoptampUserServiceTest.java index e9654ca4..bdb830fe 100644 --- a/src/test/java/org/sopt/app/application/SoptampUserServiceTest.java +++ b/src/test/java/org/sopt/app/application/SoptampUserServiceTest.java @@ -251,11 +251,6 @@ void FAIL_findCurrentRanks() { .map(Point::getSoptampUserId).toList(); //when - List
expected = List.of( - Main.builder().rank(1).point(300L).build(), - Main.builder().rank(2).point(200L).build(), - Main.builder().rank(3).point(100L).build() - ); Mockito.when(soptampUserRepository.findAllById(soptampUserIdList)).thenReturn(List.of()); From 178bec65871a35e32c5d9732c3c35104f4a14c2e Mon Sep 17 00:00:00 2001 From: kseysh Date: Sun, 24 Mar 2024 14:33:22 +0900 Subject: [PATCH 073/141] =?UTF-8?q?refactor:=20=EC=82=AC=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20=ED=95=84=EB=93=9C=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=20(#217)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/org/sopt/app/application/user/UserService.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/org/sopt/app/application/user/UserService.java b/src/main/java/org/sopt/app/application/user/UserService.java index b90ce86e..92f4755e 100644 --- a/src/main/java/org/sopt/app/application/user/UserService.java +++ b/src/main/java/org/sopt/app/application/user/UserService.java @@ -1,6 +1,5 @@ package org.sopt.app.application.user; -import com.querydsl.jpa.impl.JPAQueryFactory; import java.util.List; import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; @@ -21,7 +20,6 @@ public class UserService { private final UserRepository userRepository; - private final JPAQueryFactory queryFactory; @Transactional public UserInfo.Id loginWithUserPlaygroundId( From 29339768528ed49fb4a70f3a2cb12a28958300f3 Mon Sep 17 00:00:00 2001 From: kseysh Date: Sun, 24 Mar 2024 14:38:47 +0900 Subject: [PATCH 074/141] =?UTF-8?q?chore:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20else=EB=AC=B8=20=EC=82=AD=EC=A0=9C=20(#217)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/application/user/UserService.java | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/sopt/app/application/user/UserService.java b/src/main/java/org/sopt/app/application/user/UserService.java index 92f4755e..7eca9b42 100644 --- a/src/main/java/org/sopt/app/application/user/UserService.java +++ b/src/main/java/org/sopt/app/application/user/UserService.java @@ -38,17 +38,18 @@ public UserInfo.Id loginWithUserPlaygroundId( return UserInfo.Id.builder() .id(registeredUser.get().getId()).build(); - } else { - val newUser = this.registerNewUser( - playgroundMemberResponse.getName(), - playgroundMemberResponse.getId(), - playgroundMemberResponse.getAccessToken() - ); - userRepository.save(newUser); - - return UserInfo.Id.builder() - .id(newUser.getId()).build(); } + + val newUser = this.registerNewUser( + playgroundMemberResponse.getName(), + playgroundMemberResponse.getId(), + playgroundMemberResponse.getAccessToken() + ); + userRepository.save(newUser); + + return UserInfo.Id.builder() + .id(newUser.getId()).build(); + } private User registerNewUser(String username, Long playgroundId, String playgroundToken) { From 6b2bf98e0a56da6a789b8511d624c05e0cd75967 Mon Sep 17 00:00:00 2001 From: kseysh Date: Sun, 24 Mar 2024 15:16:08 +0900 Subject: [PATCH 075/141] =?UTF-8?q?fix:=20loginWithUserPlaygroundId?= =?UTF-8?q?=EB=A5=BC=20=EC=9D=B4=EC=9A=A9=ED=95=B4=20=ED=9A=8C=EC=9B=90?= =?UTF-8?q?=EA=B0=80=EC=9E=85=20=EC=8B=9C=EC=97=90=20userId=EA=B0=80=20nul?= =?UTF-8?q?l=EB=A1=9C=20=EB=93=A4=EC=96=B4=EA=B0=80=EB=8A=94=20=EC=97=90?= =?UTF-8?q?=EB=9F=AC=20=ED=95=B4=EA=B2=B0=20(#217)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/application/user/UserService.java | 25 +++++++++---------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/src/main/java/org/sopt/app/application/user/UserService.java b/src/main/java/org/sopt/app/application/user/UserService.java index 7eca9b42..a981ff50 100644 --- a/src/main/java/org/sopt/app/application/user/UserService.java +++ b/src/main/java/org/sopt/app/application/user/UserService.java @@ -23,33 +23,32 @@ public class UserService { @Transactional public UserInfo.Id loginWithUserPlaygroundId( - PlaygroundAuthInfo.PlaygroundMain playgroundMemberResponse + PlaygroundAuthInfo.PlaygroundMain playgroundMemberResponse ) { val registeredUser = userRepository.findUserByPlaygroundId( - playgroundMemberResponse.getId()); + playgroundMemberResponse.getId()); // 기존에 로그인/가입한 이력이 있으면 if (registeredUser.isPresent()) { registeredUser.get().updatePlaygroundUserInfo( - playgroundMemberResponse.getName(), - playgroundMemberResponse.getAccessToken() + playgroundMemberResponse.getName(), + playgroundMemberResponse.getAccessToken() ); userRepository.save(registeredUser.get()); return UserInfo.Id.builder() - .id(registeredUser.get().getId()).build(); + .id(registeredUser.get().getId()).build(); } - val newUser = this.registerNewUser( - playgroundMemberResponse.getName(), - playgroundMemberResponse.getId(), - playgroundMemberResponse.getAccessToken() - ); - userRepository.save(newUser); + val newUser = userRepository.save( + this.registerNewUser( + playgroundMemberResponse.getName(), + playgroundMemberResponse.getId(), + playgroundMemberResponse.getAccessToken() + )); return UserInfo.Id.builder() - .id(newUser.getId()).build(); - + .id(newUser.getId()).build(); } private User registerNewUser(String username, Long playgroundId, String playgroundToken) { From 8fb04024af5007f127a0047ff45dca967aa37b09 Mon Sep 17 00:00:00 2001 From: kseysh Date: Sun, 24 Mar 2024 15:17:53 +0900 Subject: [PATCH 076/141] =?UTF-8?q?feat:=20loginWithUserPlaygroundId?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=EB=93=B1=EB=A1=9D=EB=90=9C=20=EC=9C=A0?= =?UTF-8?q?=EC=A0=80=EA=B0=80=20=EC=97=86=EC=9D=84=20=EB=95=8C=EC=9D=98=20?= =?UTF-8?q?=EC=84=B1=EA=B3=B5=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BC=80?= =?UTF-8?q?=EC=9D=B4=EC=8A=A4=20=EC=B6=94=EA=B0=80=20(#217)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sopt/app/application/UserServiceTest.java | 75 +++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 src/test/java/org/sopt/app/application/UserServiceTest.java diff --git a/src/test/java/org/sopt/app/application/UserServiceTest.java b/src/test/java/org/sopt/app/application/UserServiceTest.java new file mode 100644 index 00000000..b9391f0b --- /dev/null +++ b/src/test/java/org/sopt/app/application/UserServiceTest.java @@ -0,0 +1,75 @@ +package org.sopt.app.application; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.Mockito.when; + +import java.util.Optional; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.DisplayName; +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 org.sopt.app.application.auth.PlaygroundAuthInfo.PlaygroundMain; +import org.sopt.app.application.user.UserInfo; +import org.sopt.app.application.user.UserService; +import org.sopt.app.domain.entity.User; +import org.sopt.app.interfaces.postgres.UserRepository; + +@ExtendWith(MockitoExtension.class) +class UserServiceTest { + + @Mock + private UserRepository userRepository; + + @InjectMocks + private UserService userService; + + @Test + @DisplayName("SUCCESS_등록된 유저가 없으면 플레이그라운드 아이디로 회원가입") + void SUCCESS_loginWithUserPlaygroundIdWithNoRegisteredUser() { + //given + final Long anyUserId = anyLong(); + PlaygroundMain playgroundMemberResponse = new PlaygroundMain(); + playgroundMemberResponse.setId(anyUserId); + + //when + when(userRepository.findUserByPlaygroundId(anyUserId)).thenReturn(Optional.empty()); + when(userRepository.save(any(User.class))).thenReturn(User.builder().id(playgroundMemberResponse.getId()).build()); + + UserInfo.Id expected = UserInfo.Id.builder().id(playgroundMemberResponse.getId()).build(); + UserInfo.Id result = userService.loginWithUserPlaygroundId(playgroundMemberResponse); + + //then + Assertions.assertEquals(expected.getId(), result.getId()); + } + + /* TODO: Implement following test cases + @Test + void deleteUser() { + } + + @Test + void getPlaygroundToken() { + } + + @Test + void updatePlaygroundToken() { + } + + @Test + void getUserProfile() { + } + + @Test + void getUserProfilesByPlaygroundIds() { + } + + @Test + void getUserProfileByUserId() { + } + + */ +} \ No newline at end of file From 898f0e044c278b60065f0be77b01d0bd86fa6b0d Mon Sep 17 00:00:00 2001 From: kseysh Date: Sun, 24 Mar 2024 15:24:23 +0900 Subject: [PATCH 077/141] =?UTF-8?q?feat:=20loginWithUserPlaygroundId?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=EB=93=B1=EB=A1=9D=EB=90=9C=20=EC=9C=A0?= =?UTF-8?q?=EC=A0=80=EA=B0=80=20=EC=9E=88=EC=9D=84=20=EB=95=8C=EC=9D=98=20?= =?UTF-8?q?=EC=84=B1=EA=B3=B5=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BC=80?= =?UTF-8?q?=EC=9D=B4=EC=8A=A4=20=EC=B6=94=EA=B0=80=20(#217)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sopt/app/application/UserServiceTest.java | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/test/java/org/sopt/app/application/UserServiceTest.java b/src/test/java/org/sopt/app/application/UserServiceTest.java index b9391f0b..bd4b7113 100644 --- a/src/test/java/org/sopt/app/application/UserServiceTest.java +++ b/src/test/java/org/sopt/app/application/UserServiceTest.java @@ -46,6 +46,27 @@ void SUCCESS_loginWithUserPlaygroundIdWithNoRegisteredUser() { Assertions.assertEquals(expected.getId(), result.getId()); } + @Test + @DisplayName("SUCCESS_등록된 유저가 있으면 플레이그라운드 아이디로 로그인") + void SUCCESS_loginWithUserPlaygroundIdWithRegisteredUser() { + //given + final Long anyUserId = anyLong(); + PlaygroundMain playgroundMemberResponse = new PlaygroundMain(); + playgroundMemberResponse.setId(anyUserId); + + User registeredUser = User.builder().id(anyUserId).build(); + + //when + when(userRepository.findUserByPlaygroundId(anyUserId)).thenReturn(Optional.of(registeredUser)); + when(userRepository.save(any(User.class))).thenReturn(registeredUser); + + UserInfo.Id expected = UserInfo.Id.builder().id(anyUserId).build(); + UserInfo.Id result = userService.loginWithUserPlaygroundId(playgroundMemberResponse); + + //then + Assertions.assertEquals(expected.getId(), result.getId()); + } + /* TODO: Implement following test cases @Test void deleteUser() { From 98af54c10ac4efecf892432b1d6145c0b9882d80 Mon Sep 17 00:00:00 2001 From: kseysh Date: Sun, 24 Mar 2024 15:27:40 +0900 Subject: [PATCH 078/141] =?UTF-8?q?feat:=20deleteUser=20=EC=84=B1=EA=B3=B5?= =?UTF-8?q?=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BC=80=EC=9D=B4=EC=8A=A4=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20(#217)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/sopt/app/application/UserServiceTest.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/test/java/org/sopt/app/application/UserServiceTest.java b/src/test/java/org/sopt/app/application/UserServiceTest.java index bd4b7113..cf2c1d1e 100644 --- a/src/test/java/org/sopt/app/application/UserServiceTest.java +++ b/src/test/java/org/sopt/app/application/UserServiceTest.java @@ -67,15 +67,23 @@ void SUCCESS_loginWithUserPlaygroundIdWithRegisteredUser() { Assertions.assertEquals(expected.getId(), result.getId()); } - /* TODO: Implement following test cases + @Test - void deleteUser() { + @DisplayName("SUCCESS_유저 삭제") + void SUCCESS_deleteUser() { + //given + User user = new User(); + + //then + Assertions.assertDoesNotThrow(() -> userService.deleteUser(user)); } + @Test void getPlaygroundToken() { } + /* TODO: Implement following test cases @Test void updatePlaygroundToken() { } From 2c7c1e1847c91bc217b96d31feb8ad2217f9f9a2 Mon Sep 17 00:00:00 2001 From: kseysh Date: Sun, 24 Mar 2024 15:34:40 +0900 Subject: [PATCH 079/141] =?UTF-8?q?feat:=20getPlaygroundToken=20=EC=84=B1?= =?UTF-8?q?=EA=B3=B5,=EC=8B=A4=ED=8C=A8=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=BC=80=EC=9D=B4=EC=8A=A4=20=EC=B6=94=EA=B0=80=20(#217)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sopt/app/application/UserServiceTest.java | 29 +++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/src/test/java/org/sopt/app/application/UserServiceTest.java b/src/test/java/org/sopt/app/application/UserServiceTest.java index cf2c1d1e..ef1a294c 100644 --- a/src/test/java/org/sopt/app/application/UserServiceTest.java +++ b/src/test/java/org/sopt/app/application/UserServiceTest.java @@ -15,6 +15,7 @@ import org.sopt.app.application.auth.PlaygroundAuthInfo.PlaygroundMain; import org.sopt.app.application.user.UserInfo; import org.sopt.app.application.user.UserService; +import org.sopt.app.common.exception.UnauthorizedException; import org.sopt.app.domain.entity.User; import org.sopt.app.interfaces.postgres.UserRepository; @@ -67,7 +68,6 @@ void SUCCESS_loginWithUserPlaygroundIdWithRegisteredUser() { Assertions.assertEquals(expected.getId(), result.getId()); } - @Test @DisplayName("SUCCESS_유저 삭제") void SUCCESS_deleteUser() { @@ -78,9 +78,34 @@ void SUCCESS_deleteUser() { Assertions.assertDoesNotThrow(() -> userService.deleteUser(user)); } + @Test + @DisplayName("SUCCESS_플레이그라운드 토큰 조회") + void SUCCESS_getPlaygroundToken() { + //given + final Long anyUserId = anyLong(); + final String playgroundToken = "token"; + final UserInfo.Id userId = UserInfo.Id.builder().id(anyUserId).build(); + User user = User.builder().id(anyUserId).playgroundToken(playgroundToken).build(); + + //when + when(userRepository.findUserById(anyUserId)).thenReturn(Optional.of(user)); + + //then + Assertions.assertEquals(playgroundToken, userService.getPlaygroundToken(userId).getAccessToken()); + } @Test - void getPlaygroundToken() { + @DisplayName("FAIL_플레이그라운드 토큰 조회시 유저를 찾지 못하면 UnauthorizedException 발생") + void FAIL_getPlaygroundToken() { + //given + final Long anyUserId = anyLong(); + final UserInfo.Id userId = UserInfo.Id.builder().id(anyUserId).build(); + + //when + when(userRepository.findUserById(anyUserId)).thenReturn(Optional.empty()); + + //then + Assertions.assertThrows(UnauthorizedException.class, () -> userService.getPlaygroundToken(userId)); } /* TODO: Implement following test cases From cded47b53a9872763cfd8781a3f7aa1a2da805a8 Mon Sep 17 00:00:00 2001 From: kseysh Date: Sun, 24 Mar 2024 15:39:57 +0900 Subject: [PATCH 080/141] =?UTF-8?q?refactor:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=EB=B3=80=EC=88=98=20=EC=A0=9C=EA=B1=B0=20(#217)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/application/user/UserService.java | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/sopt/app/application/user/UserService.java b/src/main/java/org/sopt/app/application/user/UserService.java index a981ff50..27b947b1 100644 --- a/src/main/java/org/sopt/app/application/user/UserService.java +++ b/src/main/java/org/sopt/app/application/user/UserService.java @@ -77,15 +77,16 @@ public AppAuthRequest.AccessTokenRequest getPlaygroundToken(UserInfo.Id userId) @Transactional public void updatePlaygroundToken(UserInfo.Id userId, String playgroundToken) { val user = userRepository.findUserById(userId.getId()) - .orElseThrow( - () -> new UnauthorizedException(ErrorCode.INVALID_REFRESH_TOKEN.getMessage())); - val newUser = User.builder() - .id(user.getId()) - .username(user.getUsername()) - .playgroundId(user.getPlaygroundId()) - .playgroundToken(playgroundToken) - .build(); - userRepository.save(newUser); + .orElseThrow( + () -> new UnauthorizedException(ErrorCode.INVALID_REFRESH_TOKEN.getMessage())); + userRepository.save( + User.builder() + .id(user.getId()) + .username(user.getUsername()) + .playgroundId(user.getPlaygroundId()) + .playgroundToken(playgroundToken) + .build() + ); } @Transactional(readOnly = true) From 32a004dcbbfff9092d978a119035a1dd42430c83 Mon Sep 17 00:00:00 2001 From: kseysh Date: Sun, 24 Mar 2024 15:42:46 +0900 Subject: [PATCH 081/141] =?UTF-8?q?feat:=20updatePlaygroundToken=20?= =?UTF-8?q?=EC=84=B1=EA=B3=B5=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BC=80?= =?UTF-8?q?=EC=9D=B4=EC=8A=A4=20=EC=B6=94=EA=B0=80=20(#217)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sopt/app/application/UserServiceTest.java | 32 +++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/src/test/java/org/sopt/app/application/UserServiceTest.java b/src/test/java/org/sopt/app/application/UserServiceTest.java index ef1a294c..661afc3f 100644 --- a/src/test/java/org/sopt/app/application/UserServiceTest.java +++ b/src/test/java/org/sopt/app/application/UserServiceTest.java @@ -108,11 +108,39 @@ void FAIL_getPlaygroundToken() { Assertions.assertThrows(UnauthorizedException.class, () -> userService.getPlaygroundToken(userId)); } - /* TODO: Implement following test cases + @Test - void updatePlaygroundToken() { + @DisplayName("SUCCESS_플레이그라운드 토큰 업데이트") + void SUCCESS_updatePlaygroundToken() { + //given + final Long anyUserId = anyLong(); + final UserInfo.Id userId = UserInfo.Id.builder().id(anyUserId).build(); + final String playgroundToken = "newToken"; + + //when + when(userRepository.findUserById(anyUserId)).thenReturn(Optional.of(User.builder().id(anyUserId).build())); + when(userRepository.save(any(User.class))).thenReturn(User.builder().id(anyUserId).playgroundToken(playgroundToken).build()); + + //then + Assertions.assertDoesNotThrow(() -> userService.updatePlaygroundToken(userId, playgroundToken)); } + @Test + @DisplayName("FAIL_플레이그라운드 토큰 업데이트시 유저를 찾지 못하면 UnauthorizedException 발생") + void FAIL_updatePlaygroundToken() { + //given + final Long anyUserId = anyLong(); + final UserInfo.Id userId = UserInfo.Id.builder().id(anyUserId).build(); + final String playgroundToken = "newToken"; + + //when + when(userRepository.findUserById(anyUserId)).thenReturn(Optional.empty()); + + //then + Assertions.assertThrows(UnauthorizedException.class, () -> userService.updatePlaygroundToken(userId, playgroundToken)); + } + + /* TODO: Implement following test cases @Test void getUserProfile() { } From 3015b3b51d96fcd053865edce648213e10f0e338 Mon Sep 17 00:00:00 2001 From: kseysh Date: Sun, 24 Mar 2024 15:47:49 +0900 Subject: [PATCH 082/141] =?UTF-8?q?feat:=20getUserProfile=20=EC=84=B1?= =?UTF-8?q?=EA=B3=B5,=20=EC=8B=A4=ED=8C=A8=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=20=EC=BC=80=EC=9D=B4=EC=8A=A4=20=EC=B6=94=EA=B0=80=20(#217)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sopt/app/application/UserServiceTest.java | 36 +++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/src/test/java/org/sopt/app/application/UserServiceTest.java b/src/test/java/org/sopt/app/application/UserServiceTest.java index 661afc3f..63990f56 100644 --- a/src/test/java/org/sopt/app/application/UserServiceTest.java +++ b/src/test/java/org/sopt/app/application/UserServiceTest.java @@ -1,5 +1,6 @@ package org.sopt.app.application; +import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.Mockito.when; @@ -140,15 +141,46 @@ void FAIL_updatePlaygroundToken() { Assertions.assertThrows(UnauthorizedException.class, () -> userService.updatePlaygroundToken(userId, playgroundToken)); } - /* TODO: Implement following test cases @Test - void getUserProfile() { + @DisplayName("SUCCESS_유저 프로필 조회") + void SUCCESS_getUserProfile() { + //given + final Long anyUserId = anyLong(); + final String username = "username"; + final String playgroundToken = "playgroundToken"; + final Long playgroundId = 1L; + final User user = User.builder().id(anyUserId).username(username).playgroundId(playgroundId) + .playgroundToken(playgroundToken).build(); + + //when + when(userRepository.findUserById(anyUserId)).thenReturn(Optional.of(user)); + + UserInfo.UserProfile result = userService.getUserProfile(anyUserId); + UserInfo.UserProfile expected = UserInfo.UserProfile.builder().userId(anyUserId).name(username) + .playgroundId(playgroundId).build(); + + //then + assertThat(result).usingRecursiveComparison().isEqualTo(expected); + } + + @Test + @DisplayName("FAIL_유저 프로필 조회시 유저를 찾지 못하면 UnauthorizedException 발생") + void FAIL_getUserProfile() { + //given + final Long anyUserId = anyLong(); + + //when + when(userRepository.findUserById(anyUserId)).thenReturn(Optional.empty()); + + //then + Assertions.assertThrows(UnauthorizedException.class, () -> userService.getUserProfile(anyUserId)); } @Test void getUserProfilesByPlaygroundIds() { } + /* TODO: Implement following test cases @Test void getUserProfileByUserId() { } From ddee035f5ec409ec99dd98ea2d77a88231d4bf29 Mon Sep 17 00:00:00 2001 From: kseysh Date: Sun, 24 Mar 2024 15:53:10 +0900 Subject: [PATCH 083/141] =?UTF-8?q?chore:=20=EC=B6=95=EC=95=BD=ED=98=95=20?= =?UTF-8?q?=EB=84=A4=EC=9D=B4=EB=B0=8D=20=EA=B0=80=EB=8F=85=EC=84=B1=20?= =?UTF-8?q?=EC=9E=88=EB=8A=94=20=EC=9D=B4=EB=A6=84=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=20(#217)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/application/user/UserService.java | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/sopt/app/application/user/UserService.java b/src/main/java/org/sopt/app/application/user/UserService.java index 27b947b1..9e890962 100644 --- a/src/main/java/org/sopt/app/application/user/UserService.java +++ b/src/main/java/org/sopt/app/application/user/UserService.java @@ -102,21 +102,21 @@ public UserProfile getUserProfile(Long userId) { public List getUserProfilesByPlaygroundIds(List playgroundIds) { return userRepository.findAllByPlaygroundIdIn(playgroundIds).stream().map( - u -> UserProfile.builder() - .userId(u.getId()) - .name(u.getUsername()) - .playgroundId(u.getPlaygroundId()) - .build() + user -> UserProfile.builder() + .userId(user.getId()) + .name(user.getUsername()) + .playgroundId(user.getPlaygroundId()) + .build() ).toList(); } public List getUserProfileByUserId(List userId) { return userRepository.findAllByIdIn(userId).stream().map( - u -> UserProfile.builder() - .userId(u.getId()) - .name(u.getUsername()) - .playgroundId(u.getPlaygroundId()) - .build() + user -> UserProfile.builder() + .userId(user.getId()) + .name(user.getUsername()) + .playgroundId(user.getPlaygroundId()) + .build() ).collect(Collectors.toList()); } } From b31765c740e56fb4af89e8adce0933895c601592 Mon Sep 17 00:00:00 2001 From: kseysh Date: Sun, 24 Mar 2024 15:59:07 +0900 Subject: [PATCH 084/141] =?UTF-8?q?feat:=20getUserProfilesByPlaygroundIds?= =?UTF-8?q?=20=EC=84=B1=EA=B3=B5=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BC=80?= =?UTF-8?q?=EC=9D=B4=EC=8A=A4=20=EC=B6=94=EA=B0=80=20(#217)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sopt/app/application/UserServiceTest.java | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/test/java/org/sopt/app/application/UserServiceTest.java b/src/test/java/org/sopt/app/application/UserServiceTest.java index 63990f56..159713c8 100644 --- a/src/test/java/org/sopt/app/application/UserServiceTest.java +++ b/src/test/java/org/sopt/app/application/UserServiceTest.java @@ -5,6 +5,7 @@ import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.Mockito.when; +import java.util.List; import java.util.Optional; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.DisplayName; @@ -177,7 +178,27 @@ void FAIL_getUserProfile() { } @Test - void getUserProfilesByPlaygroundIds() { + @DisplayName("SUCCESS_플레이그라운드 아이디 리스트로 유저 리스트 조회") + void SUCCESS_getUserProfilesByPlaygroundIds() { + //given + final List playgroundIds = List.of(1L, 2L); + final User user1 = User.builder().id(1L).username("user1").playgroundId(1L).build(); + final User user2 = User.builder().id(2L).username("user2").playgroundId(2L).build(); + final List users = List.of(user1, user2); + + //when + when(userRepository.findAllByPlaygroundIdIn(playgroundIds)).thenReturn(users); + + List result = userService.getUserProfilesByPlaygroundIds(playgroundIds); + List expected = List.of( + UserInfo.UserProfile.builder().userId(user1.getId()).name(user1.getUsername()).playgroundId( + user1.getPlaygroundId()).build(), + UserInfo.UserProfile.builder().userId(user2.getId()).name(user2.getUsername()).playgroundId( + user2.getPlaygroundId()).build() + ); + + //then + assertThat(result).usingRecursiveComparison().isEqualTo(expected); } /* TODO: Implement following test cases From 910387d8d259a33d5361129982b31d5207ac233a Mon Sep 17 00:00:00 2001 From: kseysh Date: Sun, 24 Mar 2024 16:11:50 +0900 Subject: [PATCH 085/141] =?UTF-8?q?refactor:=20=EA=B0=80=EB=8F=85=EC=84=B1?= =?UTF-8?q?=EC=9D=84=20=EC=9C=84=ED=95=9C=20=EC=BD=94=EB=93=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20(#217)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/org/sopt/app/application/user/UserService.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/org/sopt/app/application/user/UserService.java b/src/main/java/org/sopt/app/application/user/UserService.java index 9e890962..12ae16b2 100644 --- a/src/main/java/org/sopt/app/application/user/UserService.java +++ b/src/main/java/org/sopt/app/application/user/UserService.java @@ -1,7 +1,6 @@ package org.sopt.app.application.user; import java.util.List; -import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import lombok.val; import org.sopt.app.application.auth.PlaygroundAuthInfo; @@ -117,6 +116,6 @@ public List getUserProfileByUserId(List userId) { .name(user.getUsername()) .playgroundId(user.getPlaygroundId()) .build() - ).collect(Collectors.toList()); + ).toList(); } } From 9cd6eb4c392fa4e226a65448040daa1799d1b36a Mon Sep 17 00:00:00 2001 From: kseysh Date: Sun, 24 Mar 2024 16:13:53 +0900 Subject: [PATCH 086/141] =?UTF-8?q?feat:=20getUserProfileByUserId=20?= =?UTF-8?q?=EC=84=B1=EA=B3=B5=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BC=80?= =?UTF-8?q?=EC=9D=B4=EC=8A=A4=20=EC=B6=94=EA=B0=80=20(#217)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sopt/app/application/UserServiceTest.java | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/test/java/org/sopt/app/application/UserServiceTest.java b/src/test/java/org/sopt/app/application/UserServiceTest.java index 159713c8..206c76a7 100644 --- a/src/test/java/org/sopt/app/application/UserServiceTest.java +++ b/src/test/java/org/sopt/app/application/UserServiceTest.java @@ -201,10 +201,28 @@ void SUCCESS_getUserProfilesByPlaygroundIds() { assertThat(result).usingRecursiveComparison().isEqualTo(expected); } - /* TODO: Implement following test cases @Test - void getUserProfileByUserId() { - } + @DisplayName("SUCCESS_유저 아이디로 유저 프로필 조회") + void SUCCESS_getUserProfileByUserId() { + //given + final List userIds = List.of(1L, 2L); + final User user1 = User.builder().id(1L).username("user1").playgroundId(1L).build(); + final User user2 = User.builder().id(2L).username("user2").playgroundId(2L).build(); + final List users = List.of(user1, user2); + + //when + when(userRepository.findAllByIdIn(userIds)).thenReturn(users); + + List result = userService.getUserProfileByUserId(userIds); + List expected = List.of( + UserInfo.UserProfile.builder().userId(user1.getId()).name(user1.getUsername()).playgroundId( + user1.getPlaygroundId()).build(), + UserInfo.UserProfile.builder().userId(user2.getId()).name(user2.getUsername()).playgroundId( + user2.getPlaygroundId()).build() + ); - */ + //then + assertThat(result).usingRecursiveComparison().isEqualTo(expected); + + } } \ No newline at end of file From 9aba470ce01a0c55455ec6171994fa30f63ff18b Mon Sep 17 00:00:00 2001 From: kseysh Date: Sun, 24 Mar 2024 17:11:40 +0900 Subject: [PATCH 087/141] =?UTF-8?q?feat:=20findUserById=20=EC=84=B1?= =?UTF-8?q?=EA=B3=B5=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BC=80=EC=9D=B4?= =?UTF-8?q?=EC=8A=A4=20=EC=B6=94=EA=B0=80=20(#217)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../postgres/UserRepositoryTest.java | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 src/test/java/org/sopt/app/interfaces/postgres/UserRepositoryTest.java diff --git a/src/test/java/org/sopt/app/interfaces/postgres/UserRepositoryTest.java b/src/test/java/org/sopt/app/interfaces/postgres/UserRepositoryTest.java new file mode 100644 index 00000000..3f0da773 --- /dev/null +++ b/src/test/java/org/sopt/app/interfaces/postgres/UserRepositoryTest.java @@ -0,0 +1,72 @@ +package org.sopt.app.interfaces.postgres; + +import java.util.Optional; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.sopt.app.common.config.QuerydslConfiguration; +import org.sopt.app.domain.entity.User; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase; +import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase.Replace; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.context.annotation.Import; + +@DataJpaTest +@AutoConfigureTestDatabase(replace = Replace.NONE) +@Import(QuerydslConfiguration.class) +class UserRepositoryTest { + + @Autowired + private UserRepository userRepository; + + User user1 = new User(); + User user2 = new User(); + + @BeforeEach + void beforeTest() { + final Long user1PlaygroundId = Long.MAX_VALUE; + final Long user2PlaygroundId = Long.MAX_VALUE - 1; + + user1 = userRepository.save( + User.builder() + .playgroundId(user1PlaygroundId) + .build() + ); + user2 = userRepository.save( + User.builder() + .playgroundId(user2PlaygroundId) + .build() + ); + } + + @Test + @DisplayName("SUCCESS_유저 아이디로 유저 찾기") + void SUCCESS_findUserById() { + Assertions.assertEquals(Optional.of(user1), userRepository.findUserById(user1.getId())); + } + + /* TODO: Implement following test code + @Test + void findUserByPlaygroundId() { + } + + @Test + void findAllByPlaygroundIdIn() { + } + + @Test + void findAllIdByPlaygroundIdIn() { + } + + @Test + void findAllPlaygroundId() { + } + + @Test + void findAllByIdIn() { + } + + */ +} \ No newline at end of file From 91f2d99fb22bfe01c73daef4fc35688dec2fd15b Mon Sep 17 00:00:00 2001 From: kseysh Date: Sun, 24 Mar 2024 17:15:50 +0900 Subject: [PATCH 088/141] =?UTF-8?q?feat:=20findAllByPlaygroundIdIn=20?= =?UTF-8?q?=EC=84=B1=EA=B3=B5=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BC=80?= =?UTF-8?q?=EC=9D=B4=EC=8A=A4=20=EC=B6=94=EA=B0=80=20(#217)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../interfaces/postgres/UserRepositoryTest.java | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/test/java/org/sopt/app/interfaces/postgres/UserRepositoryTest.java b/src/test/java/org/sopt/app/interfaces/postgres/UserRepositoryTest.java index 3f0da773..00984a3f 100644 --- a/src/test/java/org/sopt/app/interfaces/postgres/UserRepositoryTest.java +++ b/src/test/java/org/sopt/app/interfaces/postgres/UserRepositoryTest.java @@ -1,5 +1,6 @@ package org.sopt.app.interfaces.postgres; +import java.util.List; import java.util.Optional; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; @@ -47,15 +48,23 @@ void SUCCESS_findUserById() { Assertions.assertEquals(Optional.of(user1), userRepository.findUserById(user1.getId())); } - /* TODO: Implement following test code @Test - void findUserByPlaygroundId() { + @DisplayName("SUCCESS_플레이그라운드 아이디로 유저 찾기") + void SUCCESS_findUserByPlaygroundId() { + Assertions.assertEquals(Optional.of(user1), userRepository.findUserByPlaygroundId(user1.getPlaygroundId())); } @Test - void findAllByPlaygroundIdIn() { + @DisplayName("SUCCESS_플레이그라운드 아이디 리스트로 유저 리스트 찾기") + void SUCCESS_findAllByPlaygroundIdIn() { + //given + final List playgroundIds = List.of(user1.getPlaygroundId(), user2.getPlaygroundId()); + + //then + Assertions.assertEquals(List.of(user1, user2), userRepository.findAllByPlaygroundIdIn(playgroundIds)); } + /* TODO: Implement the following test cases @Test void findAllIdByPlaygroundIdIn() { } From 698bc932d23665a10230c32e57c04653ed3d8e92 Mon Sep 17 00:00:00 2001 From: kseysh Date: Sun, 24 Mar 2024 17:16:43 +0900 Subject: [PATCH 089/141] =?UTF-8?q?feat:=20findAllIdByPlaygroundIdIn=20?= =?UTF-8?q?=EC=84=B1=EA=B3=B5=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BC=80?= =?UTF-8?q?=EC=9D=B4=EC=8A=A4=20=EC=B6=94=EA=B0=80=20(#217)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/interfaces/postgres/UserRepositoryTest.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/test/java/org/sopt/app/interfaces/postgres/UserRepositoryTest.java b/src/test/java/org/sopt/app/interfaces/postgres/UserRepositoryTest.java index 00984a3f..cccc6f8a 100644 --- a/src/test/java/org/sopt/app/interfaces/postgres/UserRepositoryTest.java +++ b/src/test/java/org/sopt/app/interfaces/postgres/UserRepositoryTest.java @@ -64,11 +64,18 @@ void SUCCESS_findAllByPlaygroundIdIn() { Assertions.assertEquals(List.of(user1, user2), userRepository.findAllByPlaygroundIdIn(playgroundIds)); } - /* TODO: Implement the following test cases + @Test - void findAllIdByPlaygroundIdIn() { + @DisplayName("SUCCESS_플레이그라운드 아이디 리스트로 유저 아이디 리스트 찾기") + void SUCCESS_findAllIdByPlaygroundIdIn() { + //given + final List playgroundIds = List.of(user1.getPlaygroundId(), user2.getPlaygroundId()); + + //then + Assertions.assertEquals(List.of(user1.getId(), user2.getId()), userRepository.findAllIdByPlaygroundIdIn(playgroundIds)); } + /* TODO: Implement the following test cases @Test void findAllPlaygroundId() { } From 8a1aff944b37a6f2f9a3b4c5802e6a2b4ff5889e Mon Sep 17 00:00:00 2001 From: kseysh Date: Sun, 24 Mar 2024 17:22:21 +0900 Subject: [PATCH 090/141] =?UTF-8?q?feat:=20findAllPlaygroundId=20=EC=84=B1?= =?UTF-8?q?=EA=B3=B5=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BC=80=EC=9D=B4?= =?UTF-8?q?=EC=8A=A4=20=EC=B6=94=EA=B0=80=20(#217)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/interfaces/postgres/UserRepositoryTest.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/test/java/org/sopt/app/interfaces/postgres/UserRepositoryTest.java b/src/test/java/org/sopt/app/interfaces/postgres/UserRepositoryTest.java index cccc6f8a..560fd245 100644 --- a/src/test/java/org/sopt/app/interfaces/postgres/UserRepositoryTest.java +++ b/src/test/java/org/sopt/app/interfaces/postgres/UserRepositoryTest.java @@ -75,11 +75,17 @@ void SUCCESS_findAllIdByPlaygroundIdIn() { Assertions.assertEquals(List.of(user1.getId(), user2.getId()), userRepository.findAllIdByPlaygroundIdIn(playgroundIds)); } - /* TODO: Implement the following test cases + @Test - void findAllPlaygroundId() { + void SUCCESS_findAllPlaygroundId() { + //given + final List playgroundIds = List.of(user1.getPlaygroundId(), user2.getPlaygroundId()); + + //then + Assertions.assertTrue(userRepository.findAllPlaygroundId().containsAll(playgroundIds)); } + /* TODO: Implement the following test cases @Test void findAllByIdIn() { } From eb17e9321f5c932e8086dcd640ebef37966de52a Mon Sep 17 00:00:00 2001 From: kseysh Date: Sun, 24 Mar 2024 17:24:49 +0900 Subject: [PATCH 091/141] =?UTF-8?q?feat:=20findAllByIdIn=20=EC=84=B1?= =?UTF-8?q?=EA=B3=B5=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BC=80=EC=9D=B4?= =?UTF-8?q?=EC=8A=A4=20=EC=B6=94=EA=B0=80=20(#217)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/interfaces/postgres/UserRepositoryTest.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/test/java/org/sopt/app/interfaces/postgres/UserRepositoryTest.java b/src/test/java/org/sopt/app/interfaces/postgres/UserRepositoryTest.java index 560fd245..f76af784 100644 --- a/src/test/java/org/sopt/app/interfaces/postgres/UserRepositoryTest.java +++ b/src/test/java/org/sopt/app/interfaces/postgres/UserRepositoryTest.java @@ -77,6 +77,7 @@ void SUCCESS_findAllIdByPlaygroundIdIn() { @Test + @DisplayName("SUCCESS_모든 유저의 플레이그라운드 아이디 찾기") void SUCCESS_findAllPlaygroundId() { //given final List playgroundIds = List.of(user1.getPlaygroundId(), user2.getPlaygroundId()); @@ -85,10 +86,13 @@ void SUCCESS_findAllPlaygroundId() { Assertions.assertTrue(userRepository.findAllPlaygroundId().containsAll(playgroundIds)); } - /* TODO: Implement the following test cases @Test - void findAllByIdIn() { - } + @DisplayName("SUCCESS_모든 유저의 유저 아이디 찾기") + void SUCCESS_findAllByIdIn() { + //given + final List userIds = List.of(user1.getId(), user2.getId()); - */ + //then + Assertions.assertEquals(List.of(user1, user2), userRepository.findAllByIdIn(userIds)); + } } \ No newline at end of file From b1bca2e9dafdae6540dcc0cc7eacf91a45d3cf14 Mon Sep 17 00:00:00 2001 From: kseysh Date: Sun, 24 Mar 2024 17:26:06 +0900 Subject: [PATCH 092/141] =?UTF-8?q?refactor:=20=EC=82=AC=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EB=A0=88=ED=8F=AC=EC=A7=80?= =?UTF-8?q?=ED=86=A0=EB=A6=AC=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=20(#217)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sopt/app/interfaces/postgres/SoptampUserRepository.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/java/org/sopt/app/interfaces/postgres/SoptampUserRepository.java b/src/main/java/org/sopt/app/interfaces/postgres/SoptampUserRepository.java index 739a2b75..1f6d9307 100644 --- a/src/main/java/org/sopt/app/interfaces/postgres/SoptampUserRepository.java +++ b/src/main/java/org/sopt/app/interfaces/postgres/SoptampUserRepository.java @@ -1,6 +1,5 @@ package org.sopt.app.interfaces.postgres; -import java.util.List; import java.util.Optional; import org.sopt.app.domain.entity.SoptampUser; import org.springframework.data.jpa.repository.JpaRepository; @@ -10,6 +9,4 @@ public interface SoptampUserRepository extends JpaRepository Optional findByUserId(Long userId); Optional findUserByNickname(String nickname); - - List findAllByUserIdIn(List userIds); } From bb572f24994d1f008cb7aa56e852990eb97163de Mon Sep 17 00:00:00 2001 From: kseysh Date: Sun, 24 Mar 2024 17:59:56 +0900 Subject: [PATCH 093/141] =?UTF-8?q?refactor:=20unique=ED=95=9C=20id?= =?UTF-8?q?=EB=A5=BC=20=EC=83=9D=EC=84=B1=ED=95=98=EC=97=AC=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=EB=A5=BC=20=EC=A7=84=ED=96=89=ED=95=A0=20?= =?UTF-8?q?=EC=88=98=20=EC=9E=88=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95=20?= =?UTF-8?q?(#217)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../postgres/UserRepositoryTest.java | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/test/java/org/sopt/app/interfaces/postgres/UserRepositoryTest.java b/src/test/java/org/sopt/app/interfaces/postgres/UserRepositoryTest.java index f76af784..2e84d51f 100644 --- a/src/test/java/org/sopt/app/interfaces/postgres/UserRepositoryTest.java +++ b/src/test/java/org/sopt/app/interfaces/postgres/UserRepositoryTest.java @@ -27,21 +27,31 @@ class UserRepositoryTest { @BeforeEach void beforeTest() { - final Long user1PlaygroundId = Long.MAX_VALUE; - final Long user2PlaygroundId = Long.MAX_VALUE - 1; user1 = userRepository.save( User.builder() - .playgroundId(user1PlaygroundId) + .playgroundId(generateUniquePlaygroundId()) .build() ); user2 = userRepository.save( User.builder() - .playgroundId(user2PlaygroundId) + .playgroundId(generateUniquePlaygroundId()) .build() ); } + private Long generateUniquePlaygroundId() { + long playgroundId = Long.MAX_VALUE; + + for (int i = 0; i < 1000; i++) { + if (userRepository.findUserByPlaygroundId(playgroundId).isEmpty()) { + break; + } + playgroundId = playgroundId - i; + } + return playgroundId; + } + @Test @DisplayName("SUCCESS_유저 아이디로 유저 찾기") void SUCCESS_findUserById() { From 7ce199282d657e50710374b9277eb3fbfe744325 Mon Sep 17 00:00:00 2001 From: kseysh Date: Sun, 24 Mar 2024 18:00:17 +0900 Subject: [PATCH 094/141] =?UTF-8?q?feat:=20SoptampUserRepositoryTest=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=20(#217)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../postgres/SoptampUserRepositoryTest.java | 73 +++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 src/test/java/org/sopt/app/interfaces/postgres/SoptampUserRepositoryTest.java diff --git a/src/test/java/org/sopt/app/interfaces/postgres/SoptampUserRepositoryTest.java b/src/test/java/org/sopt/app/interfaces/postgres/SoptampUserRepositoryTest.java new file mode 100644 index 00000000..854aa210 --- /dev/null +++ b/src/test/java/org/sopt/app/interfaces/postgres/SoptampUserRepositoryTest.java @@ -0,0 +1,73 @@ +package org.sopt.app.interfaces.postgres; + +import java.util.Optional; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.sopt.app.common.config.QuerydslConfiguration; +import org.sopt.app.domain.entity.SoptampUser; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase; +import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase.Replace; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.context.annotation.Import; + +@DataJpaTest +@AutoConfigureTestDatabase(replace = Replace.NONE) +@Import(QuerydslConfiguration.class) +class SoptampUserRepositoryTest { + + @Autowired + private SoptampUserRepository soptampUserRepository; + + SoptampUser user = new SoptampUser(); + + @BeforeEach + void beforeTest() { + + user = soptampUserRepository.save( + SoptampUser.builder() + .userId(generateUniqueUserId()) + .nickname(generateUniqueNickname()) + .build() + ); + } + + private Long generateUniqueUserId() { + long userId = Long.MAX_VALUE; + + for (int i = 0; i < 1000; i++) { + if (soptampUserRepository.findByUserId(userId).isEmpty()) { + break; + } + userId = userId - i; + } + return userId; + } + + private String generateUniqueNickname() { + String nickname = "uniqueNickname"; + long uniqueNumber = Long.MAX_VALUE; + + for (int i = 0; i < 1000; i++) { + if (soptampUserRepository.findUserByNickname(nickname).isEmpty()) { + break; + } + nickname = "uniqueNickname" + (uniqueNumber - i); + } + return nickname; + } + + @Test + @DisplayName("SUCCESS_유저 아이디로 유저 찾기") + void SUCCESS_findByUserId() { + Assertions.assertEquals(Optional.of(user), soptampUserRepository.findByUserId(user.getUserId())); + } + + @Test + @DisplayName("SUCCESS_유저 닉네임으로 유저 찾기") + void findUserByNickname() { + Assertions.assertEquals(Optional.of(user), soptampUserRepository.findUserByNickname(user.getNickname())); + } +} \ No newline at end of file From 355baed2cd34cfcaf7feaf09d7e0e5736b4e1795 Mon Sep 17 00:00:00 2001 From: kseysh Date: Sun, 24 Mar 2024 18:09:34 +0900 Subject: [PATCH 095/141] =?UTF-8?q?refactor:=20=EC=82=AC=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EB=B3=80=EC=88=98=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=20(#217)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/org/sopt/app/facade/UserFacade.java | 2 +- .../sopt/app/presentation/user/UserOriginalController.java | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/sopt/app/facade/UserFacade.java b/src/main/java/org/sopt/app/facade/UserFacade.java index a4be0c5a..04c60bd9 100644 --- a/src/main/java/org/sopt/app/facade/UserFacade.java +++ b/src/main/java/org/sopt/app/facade/UserFacade.java @@ -20,7 +20,7 @@ public class UserFacade { private final UserResponseMapper userResponseMapper; @Transactional(readOnly = true) - public MainView getMainViewInfo(User user, String accessToken) { + public MainView getMainViewInfo(User user) { val mainViewUser = playgroundAuthService.getPlaygroundUserForMainView(user.getPlaygroundToken()); val dummyOperation = OperationInfo.MainView.builder().announcement("공지다!").attendanceScore(2D).build(); val mainViewNotification = notificationService.getNotificationConfirmStatus(user); diff --git a/src/main/java/org/sopt/app/presentation/user/UserOriginalController.java b/src/main/java/org/sopt/app/presentation/user/UserOriginalController.java index e693527a..e7719f06 100644 --- a/src/main/java/org/sopt/app/presentation/user/UserOriginalController.java +++ b/src/main/java/org/sopt/app/presentation/user/UserOriginalController.java @@ -40,10 +40,9 @@ public class UserOriginalController { }) @GetMapping(value = "/main") public ResponseEntity getMainViewInfo( - @AuthenticationPrincipal User user, - @RequestHeader("Authorization") String accessToken + @AuthenticationPrincipal User user ) { - val response = userFacade.getMainViewInfo(user, accessToken); + val response = userFacade.getMainViewInfo(user); return ResponseEntity.status(HttpStatus.OK).body(response); } From 88dc82f7a0484232fc8d474cbd9af4b3b07aaf64 Mon Sep 17 00:00:00 2001 From: kseysh Date: Sun, 24 Mar 2024 18:17:10 +0900 Subject: [PATCH 096/141] =?UTF-8?q?refactor:=20=EA=B0=80=EB=8F=85=EC=84=B1?= =?UTF-8?q?=20=ED=96=A5=EC=83=81=EC=9D=84=20=EC=9C=84=ED=95=9C=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EC=88=98=EC=A0=95=20(#217)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sopt/app/application/notification/NotificationService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/sopt/app/application/notification/NotificationService.java b/src/main/java/org/sopt/app/application/notification/NotificationService.java index 6c662706..639f1b4b 100644 --- a/src/main/java/org/sopt/app/application/notification/NotificationService.java +++ b/src/main/java/org/sopt/app/application/notification/NotificationService.java @@ -126,6 +126,6 @@ public Boolean getNotificationConfirmStatus(User user) { val unreadNotificationList = notificationList.stream() .filter(notification -> !notification.getIsRead()) .toList(); - return unreadNotificationList.size() == 0; + return unreadNotificationList.isEmpty(); } } From bcc9635c064f257a05d5386b42f3f573b048bdf3 Mon Sep 17 00:00:00 2001 From: kseysh Date: Mon, 25 Mar 2024 01:39:46 +0900 Subject: [PATCH 097/141] =?UTF-8?q?feat:=20=EB=A9=94=EC=9D=B8=20=EB=B7=B0?= =?UTF-8?q?=20=EC=A1=B0=ED=9A=8C=20=EC=84=B1=EA=B3=B5=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=BC=80=EC=9D=B4=EC=8A=A4=20=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?(#217)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/sopt/app/facade/UserFacadeTest.java | 74 +++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 src/test/java/org/sopt/app/facade/UserFacadeTest.java diff --git a/src/test/java/org/sopt/app/facade/UserFacadeTest.java b/src/test/java/org/sopt/app/facade/UserFacadeTest.java new file mode 100644 index 00000000..860f2aea --- /dev/null +++ b/src/test/java/org/sopt/app/facade/UserFacadeTest.java @@ -0,0 +1,74 @@ +package org.sopt.app.facade; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyBoolean; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.when; + +import java.util.List; +import org.junit.jupiter.api.DisplayName; +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 org.sopt.app.application.auth.PlaygroundAuthInfo; +import org.sopt.app.application.auth.PlaygroundAuthInfo.MainView; +import org.sopt.app.application.auth.PlaygroundAuthService; +import org.sopt.app.application.notification.NotificationService; +import org.sopt.app.application.operation.OperationInfo; +import org.sopt.app.domain.entity.User; +import org.sopt.app.domain.enums.UserStatus; +import org.sopt.app.presentation.user.UserResponse; +import org.sopt.app.presentation.user.UserResponse.Operation; +import org.sopt.app.presentation.user.UserResponseMapper; + +@ExtendWith(MockitoExtension.class) +class UserFacadeTest { + + @Mock + private PlaygroundAuthService playgroundAuthService; + @Mock + private NotificationService notificationService; + @Mock + private UserResponseMapper userResponseMapper; + + @InjectMocks + private UserFacade userFacade; + + @Test + @DisplayName("SUCCESS_메인 뷰 조회") + void getMainViewInfo() { + // given + final boolean isNotificationConfirm = true; + final PlaygroundAuthInfo.MainView playgroundAuthInfo = PlaygroundAuthInfo.MainView.builder().build(); + final UserResponse.Playground playground = UserResponse.Playground.builder().build(); + final UserResponse.Operation operation = Operation.builder().build(); + final UserResponse.MainView mainViewResponse = UserResponse.MainView.builder() + .user(playground) + .operation(operation) + .isAllConfirm(isNotificationConfirm) + .build(); + + //when + when(playgroundAuthService.getPlaygroundUserForMainView(anyString())).thenReturn(playgroundAuthInfo); + when(notificationService.getNotificationConfirmStatus(any(User.class))).thenReturn(isNotificationConfirm); + when(userResponseMapper.ofMainView(any(MainView.class), any(OperationInfo.MainView.class), + anyBoolean())).thenReturn(mainViewResponse); + + UserResponse.MainView expected = UserResponse.MainView.builder() + .user(mainViewResponse.getUser()) + .operation(mainViewResponse.getOperation()) + .isAllConfirm(mainViewResponse.getIsAllConfirm()) + .build(); + UserResponse.MainView result = userFacade.getMainViewInfo( + User.builder() + .playgroundToken(anyString()) + .build() + ); + + //then + assertThat(result).usingRecursiveComparison().isEqualTo(expected); + } +} \ No newline at end of file From fa62c86f924a833aba63cbc87608f690c76a7b38 Mon Sep 17 00:00:00 2001 From: kseysh Date: Mon, 25 Mar 2024 01:40:32 +0900 Subject: [PATCH 098/141] =?UTF-8?q?refactor:=20=EC=82=AC=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20import=EB=AC=B8=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0=20(#217)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/org/sopt/app/facade/UserFacadeTest.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/test/java/org/sopt/app/facade/UserFacadeTest.java b/src/test/java/org/sopt/app/facade/UserFacadeTest.java index 860f2aea..48b26fae 100644 --- a/src/test/java/org/sopt/app/facade/UserFacadeTest.java +++ b/src/test/java/org/sopt/app/facade/UserFacadeTest.java @@ -6,7 +6,6 @@ import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.when; -import java.util.List; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -19,7 +18,6 @@ import org.sopt.app.application.notification.NotificationService; import org.sopt.app.application.operation.OperationInfo; import org.sopt.app.domain.entity.User; -import org.sopt.app.domain.enums.UserStatus; import org.sopt.app.presentation.user.UserResponse; import org.sopt.app.presentation.user.UserResponse.Operation; import org.sopt.app.presentation.user.UserResponseMapper; From a05cc4d3a67cf2fb0479472d788ded3b3aaa41ac Mon Sep 17 00:00:00 2001 From: kseysh Date: Thu, 28 Mar 2024 23:51:05 +0900 Subject: [PATCH 099/141] =?UTF-8?q?chore:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=EC=A3=BC=EC=84=9D=20=EC=A0=9C=EA=B1=B0=20(#228)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/org/sopt/app/presentation/rank/RankController.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/org/sopt/app/presentation/rank/RankController.java b/src/main/java/org/sopt/app/presentation/rank/RankController.java index a73f50c4..15d67c7c 100644 --- a/src/main/java/org/sopt/app/presentation/rank/RankController.java +++ b/src/main/java/org/sopt/app/presentation/rank/RankController.java @@ -43,7 +43,6 @@ public ResponseEntity> findRanks() { return ResponseEntity.status(HttpStatus.OK).body(response); } - //현재 기수 랭킹 목록 조회 @Operation(summary = "현재 기수 랭킹 목록 조회") @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "success"), From 864b9e8bebc12b3fad28f173446e935723a8cc68 Mon Sep 17 00:00:00 2001 From: kseysh Date: Fri, 29 Mar 2024 15:22:07 +0900 Subject: [PATCH 100/141] =?UTF-8?q?chore:=20=ED=8C=8C=ED=8A=B8=20=EB=84=A4?= =?UTF-8?q?=EC=9D=B4=EB=B0=8D=20=EB=8C=80=EB=AC=B8=EC=9E=90=EB=A1=9C=20?= =?UTF-8?q?=ED=86=B5=EC=9D=BC=20(#228)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/org/sopt/app/domain/enums/Part.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/sopt/app/domain/enums/Part.java b/src/main/java/org/sopt/app/domain/enums/Part.java index d08e85c0..d84671dd 100644 --- a/src/main/java/org/sopt/app/domain/enums/Part.java +++ b/src/main/java/org/sopt/app/domain/enums/Part.java @@ -5,7 +5,7 @@ public enum Part { PLAN, DESIGN, ANDROID, - iOS, + IOS, WEB, SERVER } From 9ac3f6176803607980c5811a9790872899366aa3 Mon Sep 17 00:00:00 2001 From: kseysh Date: Fri, 29 Mar 2024 15:25:32 +0900 Subject: [PATCH 101/141] =?UTF-8?q?feat:=20findCurrentRanksByPart=20contro?= =?UTF-8?q?ller=20=EC=B6=94=EA=B0=80=20(#228)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/presentation/rank/RankController.java | 28 +++++++++++++++---- 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/sopt/app/presentation/rank/RankController.java b/src/main/java/org/sopt/app/presentation/rank/RankController.java index 15d67c7c..dfe991ad 100644 --- a/src/main/java/org/sopt/app/presentation/rank/RankController.java +++ b/src/main/java/org/sopt/app/presentation/rank/RankController.java @@ -6,16 +6,18 @@ import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import java.util.List; +import javax.validation.Valid; import lombok.RequiredArgsConstructor; import lombok.val; import org.sopt.app.application.mission.MissionService; import org.sopt.app.application.soptamp.SoptampPointService; import org.sopt.app.application.soptamp.SoptampUserService; -import org.sopt.app.domain.entity.User; +import org.sopt.app.domain.enums.Part; +import org.sopt.app.presentation.stamp.StampRequest; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @@ -49,11 +51,25 @@ public ResponseEntity> findRanks() { @ApiResponse(responseCode = "500", description = "server error", content = @Content) }) @GetMapping("/current") - public ResponseEntity> findCurrentRanks( - @AuthenticationPrincipal User user + public ResponseEntity> findCurrentRanks() { + val soptampPointList = soptampPointService.findCurrentPointList(); + val result = soptampUserService.findCurrentRanks(soptampPointList); + val response = rankResponseMapper.of(result); + return ResponseEntity.status(HttpStatus.OK).body(response); + } + + @Operation(summary = "파트 별 현재 기수 랭킹 목록 조회") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "success"), + @ApiResponse(responseCode = "400", description = "part not found", content = @Content), + @ApiResponse(responseCode = "500", description = "server error", content = @Content) + }) + @GetMapping("/current") + public ResponseEntity> findCurrentRanksByPart( + @Valid @ModelAttribute Part part ) { - val soptamPointList = soptampPointService.findCurrentPointList(); - val result = soptampUserService.findCurrentRanks(soptamPointList); + val soptampPointList = soptampPointService.findCurrentPointListByPart(); + val result = soptampUserService.findCurrentRanks(soptampPointList); val response = rankResponseMapper.of(result); return ResponseEntity.status(HttpStatus.OK).body(response); } From 1588c3c8f7519259b872d9d160cbeee04f212ccd Mon Sep 17 00:00:00 2001 From: kseysh Date: Fri, 29 Mar 2024 15:26:29 +0900 Subject: [PATCH 102/141] =?UTF-8?q?chore:=20=EC=82=AC=EC=9A=A9=EB=90=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20import=20=EC=A0=9C=EA=B1=B0=20?= =?UTF-8?q?(#228)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/org/sopt/app/presentation/rank/RankController.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/org/sopt/app/presentation/rank/RankController.java b/src/main/java/org/sopt/app/presentation/rank/RankController.java index dfe991ad..aa434335 100644 --- a/src/main/java/org/sopt/app/presentation/rank/RankController.java +++ b/src/main/java/org/sopt/app/presentation/rank/RankController.java @@ -13,7 +13,6 @@ import org.sopt.app.application.soptamp.SoptampPointService; import org.sopt.app.application.soptamp.SoptampUserService; import org.sopt.app.domain.enums.Part; -import org.sopt.app.presentation.stamp.StampRequest; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; From fe529604b47a0083ead861ca98e089c5a7ee67e7 Mon Sep 17 00:00:00 2001 From: kseysh Date: Fri, 29 Mar 2024 16:52:20 +0900 Subject: [PATCH 103/141] =?UTF-8?q?feat:=20findCurrentRanksByPart=20?= =?UTF-8?q?=ED=94=8C=EB=A1=9C=EC=9A=B0=20=EC=9E=91=EC=84=B1=20(#228)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/sopt/app/presentation/rank/RankController.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/sopt/app/presentation/rank/RankController.java b/src/main/java/org/sopt/app/presentation/rank/RankController.java index aa434335..98e64d8c 100644 --- a/src/main/java/org/sopt/app/presentation/rank/RankController.java +++ b/src/main/java/org/sopt/app/presentation/rank/RankController.java @@ -67,7 +67,10 @@ public ResponseEntity> findCurrentRanks() { public ResponseEntity> findCurrentRanksByPart( @Valid @ModelAttribute Part part ) { - val soptampPointList = soptampPointService.findCurrentPointListByPart(); + // 이름 앞이 파트인 모든 유저들의 유저 아이디를 가져온다. (없을 시 에러를 던진다.) + val soptampUserIdList = soptampUserService.findSoptampUserByPart(part); + // 유저 아이디를 통해 솝탬프 포인트 리스트를 받아온다. + val soptampPointList = soptampPointService.findCurrentPointListByPart(soptampUserIdList); val result = soptampUserService.findCurrentRanks(soptampPointList); val response = rankResponseMapper.of(result); return ResponseEntity.status(HttpStatus.OK).body(response); From d1631725486bdbbe88c9f6305d3d27bed630c070 Mon Sep 17 00:00:00 2001 From: kseysh Date: Fri, 29 Mar 2024 18:14:16 +0900 Subject: [PATCH 104/141] =?UTF-8?q?feat:=20Part=20enum=EA=B0=92=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20(#228)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/sopt/app/domain/enums/Part.java | 21 ++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/sopt/app/domain/enums/Part.java b/src/main/java/org/sopt/app/domain/enums/Part.java index d84671dd..c8d3b50c 100644 --- a/src/main/java/org/sopt/app/domain/enums/Part.java +++ b/src/main/java/org/sopt/app/domain/enums/Part.java @@ -1,11 +1,18 @@ package org.sopt.app.domain.enums; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@AllArgsConstructor +@Getter public enum Part { - ALL, - PLAN, - DESIGN, - ANDROID, - IOS, - WEB, - SERVER + PLAN("기획"), + DESIGN("디자인"), + ANDROID("안드"), + IOS("아요"), + WEB("웹"), + SERVER("서버"), + ; + + private final String partName; } From 880f2e28072d8a125dac464eb2a091d427adbf04 Mon Sep 17 00:00:00 2001 From: kseysh Date: Fri, 29 Mar 2024 18:15:10 +0900 Subject: [PATCH 105/141] =?UTF-8?q?feat:=20RankController.findCurrentRanks?= =?UTF-8?q?ByPart=20=EC=B6=94=EA=B0=80=20=20(#228)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/presentation/rank/RankController.java | 29 ++++++------------- 1 file changed, 9 insertions(+), 20 deletions(-) diff --git a/src/main/java/org/sopt/app/presentation/rank/RankController.java b/src/main/java/org/sopt/app/presentation/rank/RankController.java index 98e64d8c..58fe9a9e 100644 --- a/src/main/java/org/sopt/app/presentation/rank/RankController.java +++ b/src/main/java/org/sopt/app/presentation/rank/RankController.java @@ -6,17 +6,16 @@ import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import java.util.List; -import javax.validation.Valid; import lombok.RequiredArgsConstructor; import lombok.val; import org.sopt.app.application.mission.MissionService; +import org.sopt.app.application.soptamp.SoptampPointInfo; import org.sopt.app.application.soptamp.SoptampPointService; import org.sopt.app.application.soptamp.SoptampUserService; import org.sopt.app.domain.enums.Part; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @@ -44,19 +43,6 @@ public ResponseEntity> findRanks() { return ResponseEntity.status(HttpStatus.OK).body(response); } - @Operation(summary = "현재 기수 랭킹 목록 조회") - @ApiResponses(value = { - @ApiResponse(responseCode = "200", description = "success"), - @ApiResponse(responseCode = "500", description = "server error", content = @Content) - }) - @GetMapping("/current") - public ResponseEntity> findCurrentRanks() { - val soptampPointList = soptampPointService.findCurrentPointList(); - val result = soptampUserService.findCurrentRanks(soptampPointList); - val response = rankResponseMapper.of(result); - return ResponseEntity.status(HttpStatus.OK).body(response); - } - @Operation(summary = "파트 별 현재 기수 랭킹 목록 조회") @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "success"), @@ -65,12 +51,15 @@ public ResponseEntity> findCurrentRanks() { }) @GetMapping("/current") public ResponseEntity> findCurrentRanksByPart( - @Valid @ModelAttribute Part part + @RequestParam(required = false) Part part ) { - // 이름 앞이 파트인 모든 유저들의 유저 아이디를 가져온다. (없을 시 에러를 던진다.) - val soptampUserIdList = soptampUserService.findSoptampUserByPart(part); - // 유저 아이디를 통해 솝탬프 포인트 리스트를 받아온다. - val soptampPointList = soptampPointService.findCurrentPointListByPart(soptampUserIdList); + List soptampPointList; + if (part == null) { + soptampPointList = soptampPointService.findCurrentPointList(); + } else { + val soptampUserIdList = soptampUserService.findSoptampUserByPart(part); + soptampPointList = soptampPointService.findCurrentPointListBySoptampUserIds(soptampUserIdList); + } val result = soptampUserService.findCurrentRanks(soptampPointList); val response = rankResponseMapper.of(result); return ResponseEntity.status(HttpStatus.OK).body(response); From bdeda58daab258eb907836427e457472c81ffcdb Mon Sep 17 00:00:00 2001 From: kseysh Date: Fri, 29 Mar 2024 18:18:32 +0900 Subject: [PATCH 106/141] =?UTF-8?q?feat:=20=ED=8C=8C=ED=8A=B8=20=EB=B3=84?= =?UTF-8?q?=EB=A1=9C=20=EC=86=9D=ED=83=AC=ED=94=84=20=EC=9C=A0=EC=A0=80?= =?UTF-8?q?=EB=A5=BC=20=EC=B0=BE=EB=8A=94=20=ED=95=A8=EC=88=98=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20(#228)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sopt/app/application/soptamp/SoptampUserService.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/java/org/sopt/app/application/soptamp/SoptampUserService.java b/src/main/java/org/sopt/app/application/soptamp/SoptampUserService.java index afc69524..5f5d4083 100644 --- a/src/main/java/org/sopt/app/application/soptamp/SoptampUserService.java +++ b/src/main/java/org/sopt/app/application/soptamp/SoptampUserService.java @@ -11,6 +11,7 @@ import org.sopt.app.common.exception.BadRequestException; import org.sopt.app.common.response.ErrorCode; import org.sopt.app.domain.entity.SoptampUser; +import org.sopt.app.domain.enums.Part; import org.sopt.app.interfaces.postgres.SoptampUserRepository; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -142,6 +143,13 @@ private List
getCurrentRanking(List userList, List sop }).collect(Collectors.toList()); } + public List findSoptampUserByPart(Part part) { + return soptampUserRepository.findAllByNicknameStartingWith(part.getPartName()) + .stream() + .map(SoptampUser::getId) + .toList(); + } + public SoptampUser findRankByNickname(String nickname) { return soptampUserRepository.findUserByNickname(nickname) .orElseThrow(() -> new BadRequestException(ErrorCode.USER_NOT_FOUND.getMessage())); From 0fc95c018c3fab0bd6972c3eefbe1eb44a9c90d2 Mon Sep 17 00:00:00 2001 From: kseysh Date: Fri, 29 Mar 2024 18:19:00 +0900 Subject: [PATCH 107/141] =?UTF-8?q?chore:=20=EC=BD=94=EB=93=9C=20=ED=8F=AC?= =?UTF-8?q?=EB=A7=A4=ED=8C=85=20(#228)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../soptamp/SoptampUserService.java | 59 ++++++++++--------- 1 file changed, 30 insertions(+), 29 deletions(-) diff --git a/src/main/java/org/sopt/app/application/soptamp/SoptampUserService.java b/src/main/java/org/sopt/app/application/soptamp/SoptampUserService.java index 5f5d4083..00580c55 100644 --- a/src/main/java/org/sopt/app/application/soptamp/SoptampUserService.java +++ b/src/main/java/org/sopt/app/application/soptamp/SoptampUserService.java @@ -25,7 +25,7 @@ public class SoptampUserService { @Transactional(readOnly = true) public SoptampUserInfo.SoptampUser getSoptampUserInfo(Long userId) { val user = soptampUserRepository.findByUserId(userId) - .orElseThrow(() -> new BadRequestException(ErrorCode.USER_NOT_FOUND.getMessage())); + .orElseThrow(() -> new BadRequestException(ErrorCode.USER_NOT_FOUND.getMessage())); return SoptampUserInfo.SoptampUser.builder() .id(user.getId()) .userId(user.getUserId()) @@ -63,7 +63,8 @@ public SoptampUserInfo.SoptampUser editNickname(SoptampUserInfo.SoptampUser sopt } @Transactional - public SoptampUserInfo.SoptampUser editProfileMessage(SoptampUserInfo.SoptampUser soptampUser, String profileMessage) { + public SoptampUserInfo.SoptampUser editProfileMessage(SoptampUserInfo.SoptampUser soptampUser, + String profileMessage) { val newSoptampUser = SoptampUser.builder() .id(soptampUser.getId()) .userId(soptampUser.getUserId()) @@ -108,7 +109,7 @@ public List
findRanks() { public List findCurrentRanks(List soptampPointList) { val soptampUserIdList = soptampPointList.stream() - .map(Point::getSoptampUserId).toList(); + .map(Point::getSoptampUserId).toList(); val userList = soptampUserRepository.findAllById(soptampUserIdList); return this.getCurrentRanking(userList, soptampPointList); } @@ -116,31 +117,31 @@ public List findCurrentRanks(List soptampPointList private List
getRanking(List userList) { val rankPoint = new AtomicInteger(1); return userList.stream().sorted( - Comparator.comparing(SoptampUser::getTotalPoints).reversed()) - .map(user -> Main.builder() - .rank(rankPoint.getAndIncrement()) - .nickname(user.getNickname()) - .point(user.getTotalPoints()) - .profileMessage(user.getProfileMessage()) - .build()) - .collect(Collectors.toList()); + Comparator.comparing(SoptampUser::getTotalPoints).reversed()) + .map(user -> Main.builder() + .rank(rankPoint.getAndIncrement()) + .nickname(user.getNickname()) + .point(user.getTotalPoints()) + .profileMessage(user.getProfileMessage()) + .build()) + .collect(Collectors.toList()); } private List
getCurrentRanking(List userList, List soptampPointList) { val rankPoint = new AtomicInteger(1); return soptampPointList.stream().sorted(Comparator.comparing(Point::getPoints).reversed()) - .map(point -> { - val user = userList.stream() - .filter(u -> u.getId().equals(point.getSoptampUserId())) - .findFirst() - .orElseThrow(() -> new BadRequestException(ErrorCode.USER_NOT_FOUND.getMessage())); - return Main.builder() - .rank(rankPoint.getAndIncrement()) - .nickname(user.getNickname()) - .point(point.getPoints()) - .profileMessage(user.getProfileMessage()) - .build(); - }).collect(Collectors.toList()); + .map(point -> { + val user = userList.stream() + .filter(u -> u.getId().equals(point.getSoptampUserId())) + .findFirst() + .orElseThrow(() -> new BadRequestException(ErrorCode.USER_NOT_FOUND.getMessage())); + return Main.builder() + .rank(rankPoint.getAndIncrement()) + .nickname(user.getNickname()) + .point(point.getPoints()) + .profileMessage(user.getProfileMessage()) + .build(); + }).collect(Collectors.toList()); } public List findSoptampUserByPart(Part part) { @@ -152,13 +153,13 @@ public List findSoptampUserByPart(Part part) { public SoptampUser findRankByNickname(String nickname) { return soptampUserRepository.findUserByNickname(nickname) - .orElseThrow(() -> new BadRequestException(ErrorCode.USER_NOT_FOUND.getMessage())); + .orElseThrow(() -> new BadRequestException(ErrorCode.USER_NOT_FOUND.getMessage())); } @Transactional public SoptampUserInfo.SoptampUser addPoint(Long userId, Integer level) { val user = soptampUserRepository.findByUserId(userId) - .orElseThrow(() -> new BadRequestException(ErrorCode.USER_NOT_FOUND.getMessage())); + .orElseThrow(() -> new BadRequestException(ErrorCode.USER_NOT_FOUND.getMessage())); val newTotalPoint = user.getTotalPoints() + level; val newSoptampUser = SoptampUser.builder() .id(user.getId()) @@ -180,7 +181,7 @@ public SoptampUserInfo.SoptampUser addPoint(Long userId, Integer level) { @Transactional public SoptampUserInfo.SoptampUser subtractPoint(Long userId, Integer level) { val user = soptampUserRepository.findByUserId(userId) - .orElseThrow(() -> new BadRequestException(ErrorCode.USER_NOT_FOUND.getMessage())); + .orElseThrow(() -> new BadRequestException(ErrorCode.USER_NOT_FOUND.getMessage())); val newTotalPoint = user.getTotalPoints() - level; val newSoptampUser = SoptampUser.builder() .id(user.getId()) @@ -200,8 +201,8 @@ public SoptampUserInfo.SoptampUser subtractPoint(Long userId, Integer level) { } public SoptampUserInfo.SoptampUser findByNickname(String nickname) { - val soptampUser= soptampUserRepository.findUserByNickname(nickname) - .orElseThrow(() -> new BadRequestException(ErrorCode.USER_NOT_FOUND.getMessage())); + val soptampUser = soptampUserRepository.findUserByNickname(nickname) + .orElseThrow(() -> new BadRequestException(ErrorCode.USER_NOT_FOUND.getMessage())); return SoptampUserInfo.SoptampUser.builder() .id(soptampUser.getId()) .userId(soptampUser.getUserId()) @@ -214,7 +215,7 @@ public SoptampUserInfo.SoptampUser findByNickname(String nickname) { @Transactional public void initPoint(Long userId) { val sopTampUser = soptampUserRepository.findByUserId(userId) - .orElseThrow(() -> new BadRequestException(ErrorCode.USER_NOT_FOUND.getMessage())); + .orElseThrow(() -> new BadRequestException(ErrorCode.USER_NOT_FOUND.getMessage())); val newSoptampUser = SoptampUser.builder() .id(sopTampUser.getId()) .userId(sopTampUser.getUserId()) From d5ea23a97da12f19d6b92c3546f065c249368cf8 Mon Sep 17 00:00:00 2001 From: kseysh Date: Fri, 29 Mar 2024 18:19:44 +0900 Subject: [PATCH 108/141] =?UTF-8?q?feat:=20=ED=8C=8C=ED=8A=B8=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=EC=9C=BC=EB=A1=9C=20=EC=8B=9C=EC=9E=91=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EC=86=9D=ED=83=AC=ED=94=84=20=EC=9C=A0=EC=A0=80?= =?UTF-8?q?=EB=A5=BC=20=EC=B0=BE=EB=8A=94=20JPA=20=ED=95=A8=EC=88=98=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20(#228)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sopt/app/interfaces/postgres/SoptampUserRepository.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/org/sopt/app/interfaces/postgres/SoptampUserRepository.java b/src/main/java/org/sopt/app/interfaces/postgres/SoptampUserRepository.java index 1f6d9307..eb58d848 100644 --- a/src/main/java/org/sopt/app/interfaces/postgres/SoptampUserRepository.java +++ b/src/main/java/org/sopt/app/interfaces/postgres/SoptampUserRepository.java @@ -1,5 +1,6 @@ package org.sopt.app.interfaces.postgres; +import java.util.List; import java.util.Optional; import org.sopt.app.domain.entity.SoptampUser; import org.springframework.data.jpa.repository.JpaRepository; @@ -9,4 +10,6 @@ public interface SoptampUserRepository extends JpaRepository Optional findByUserId(Long userId); Optional findUserByNickname(String nickname); + + List findAllByNicknameStartingWith(String part); } From 327e6ef2ec12bdd9bc5636a75ddd576ecd12254d Mon Sep 17 00:00:00 2001 From: kseysh Date: Fri, 29 Mar 2024 18:21:04 +0900 Subject: [PATCH 109/141] =?UTF-8?q?feat:=20=EC=9C=A0=EC=A0=80=20=EC=95=84?= =?UTF-8?q?=EC=9D=B4=EB=94=94=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=EB=A1=9C=20?= =?UTF-8?q?=EC=86=9D=ED=83=AC=ED=94=84=20=ED=8F=AC=EC=9D=B8=ED=8A=B8=20?= =?UTF-8?q?=EB=A6=AC=EC=8A=A4=ED=8A=B8=EB=A5=BC=20=EC=B0=BE=EB=8A=94=20?= =?UTF-8?q?=ED=95=A8=EC=88=98=20=EC=B6=94=EA=B0=80=20(#228)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/soptamp/SoptampPointService.java | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/sopt/app/application/soptamp/SoptampPointService.java b/src/main/java/org/sopt/app/application/soptamp/SoptampPointService.java index 7a6729aa..e289b888 100644 --- a/src/main/java/org/sopt/app/application/soptamp/SoptampPointService.java +++ b/src/main/java/org/sopt/app/application/soptamp/SoptampPointService.java @@ -4,7 +4,6 @@ import lombok.RequiredArgsConstructor; import lombok.val; import org.sopt.app.application.soptamp.SoptampPointInfo.Point; -import org.sopt.app.common.exception.BadRequestException; import org.sopt.app.domain.entity.SoptampPoint; import org.sopt.app.domain.enums.UserStatus; import org.sopt.app.interfaces.postgres.SoptampPointRepository; @@ -33,6 +32,19 @@ public List findCurrentPointList() { ).toList(); } + public List findCurrentPointListBySoptampUserIds(List soptampUserIdList) { + + return soptampPointRepository.findAllBySoptampUserIdInAndGeneration(soptampUserIdList, currentGeneration).stream() + .map(point -> + SoptampPointInfo.Point.of( + point.getId(), + point.getGeneration(), + point.getSoptampUserId(), + point.getPoints() + ) + ).toList(); + } + @Transactional public void addPoint(Long soptampUserId, Integer level) { val soptampPoint = soptampPointRepository.findAllBySoptampUserIdAndGeneration(soptampUserId, currentGeneration); From da15b106073820db0834047fdf41d326c6f939d9 Mon Sep 17 00:00:00 2001 From: kseysh Date: Fri, 29 Mar 2024 18:21:17 +0900 Subject: [PATCH 110/141] =?UTF-8?q?feat:=20=EC=9C=A0=EC=A0=80=20=EC=95=84?= =?UTF-8?q?=EC=9D=B4=EB=94=94=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=EB=A1=9C=20?= =?UTF-8?q?=EC=86=9D=ED=83=AC=ED=94=84=20=ED=8F=AC=EC=9D=B8=ED=8A=B8=20?= =?UTF-8?q?=EB=A6=AC=EC=8A=A4=ED=8A=B8=EB=A5=BC=20=EC=B0=BE=EB=8A=94=20JPA?= =?UTF-8?q?=20=ED=95=A8=EC=88=98=20=EC=B6=94=EA=B0=80=20(#228)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sopt/app/interfaces/postgres/SoptampPointRepository.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/sopt/app/interfaces/postgres/SoptampPointRepository.java b/src/main/java/org/sopt/app/interfaces/postgres/SoptampPointRepository.java index d8c7cef3..e20b5727 100644 --- a/src/main/java/org/sopt/app/interfaces/postgres/SoptampPointRepository.java +++ b/src/main/java/org/sopt/app/interfaces/postgres/SoptampPointRepository.java @@ -2,7 +2,6 @@ import java.util.List; import java.util.Optional; -import org.sopt.app.application.soptamp.SoptampPointInfo.Point; import org.sopt.app.domain.entity.SoptampPoint; import org.springframework.data.jpa.repository.JpaRepository; @@ -11,4 +10,6 @@ public interface SoptampPointRepository extends JpaRepository findAllByGeneration(Long currentGeneration); Optional findAllBySoptampUserIdAndGeneration(Long soptampUserId, Long currentGeneration); + + List findAllBySoptampUserIdInAndGeneration(List soptampUserIdList, Long currentGeneration); } From fc17bdca45081367a4302781ed66aa65a6af99ee Mon Sep 17 00:00:00 2001 From: kseysh Date: Fri, 29 Mar 2024 18:50:23 +0900 Subject: [PATCH 111/141] =?UTF-8?q?feat:=20Stamp=20entity=EC=97=90=20activ?= =?UTF-8?q?ityDate=20=EC=B6=94=EA=B0=80=20(#230)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/sopt/app/domain/entity/Stamp.java | 49 ++++++++++--------- 1 file changed, 26 insertions(+), 23 deletions(-) diff --git a/src/main/java/org/sopt/app/domain/entity/Stamp.java b/src/main/java/org/sopt/app/domain/entity/Stamp.java index f5743a93..1232032f 100644 --- a/src/main/java/org/sopt/app/domain/entity/Stamp.java +++ b/src/main/java/org/sopt/app/domain/entity/Stamp.java @@ -2,6 +2,7 @@ import com.vladmihalcea.hibernate.type.array.ListArrayType; +import java.time.LocalDateTime; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; @@ -15,8 +16,8 @@ @Entity @Table(name = "stamp", schema = "app_dev") @TypeDef( - name = "list-array", - typeClass = ListArrayType.class + name = "list-array", + typeClass = ListArrayType.class ) @Getter @Builder @@ -24,31 +25,33 @@ @AllArgsConstructor public class Stamp extends BaseEntity { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; - @Column - private String contents; + @Column + private String contents; - @Type(type = "list-array") - @Column( - columnDefinition = "text[]" - ) - private List images; + @Type(type = "list-array") + @Column( + columnDefinition = "text[]" + ) + private List images; - @Column - private Long userId; + @Column + private Long userId; - @Column - private Long missionId; + @Column + private Long missionId; - //수정하기 위한 메서드 생성 - public void changeContents(String contents){ - this.contents = contents; - } + @Column + private LocalDateTime activityDate; - public void changeImages(List images){ - this.images = images; - } + public void changeContents(String contents) { + this.contents = contents; + } + + public void changeImages(List images) { + this.images = images; + } } From 5165a1a3ec603bb83336ac1b80ade343332f07dd Mon Sep 17 00:00:00 2001 From: kseysh Date: Fri, 29 Mar 2024 19:28:55 +0900 Subject: [PATCH 112/141] =?UTF-8?q?feat:=20Stamp=20entity=EC=97=90=20activ?= =?UTF-8?q?ityDate=20=EB=B3=80=EA=B2=BD=20=ED=95=A8=EC=88=98=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20(#230)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/org/sopt/app/domain/entity/Stamp.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/org/sopt/app/domain/entity/Stamp.java b/src/main/java/org/sopt/app/domain/entity/Stamp.java index 1232032f..26c9639c 100644 --- a/src/main/java/org/sopt/app/domain/entity/Stamp.java +++ b/src/main/java/org/sopt/app/domain/entity/Stamp.java @@ -54,4 +54,8 @@ public void changeContents(String contents) { public void changeImages(List images) { this.images = images; } + + public void changeActivityDate(LocalDateTime activityDate) { + this.activityDate = activityDate; + } } From d4bc96d046d41150232867ea602cc965240463a2 Mon Sep 17 00:00:00 2001 From: kseysh Date: Fri, 29 Mar 2024 19:31:42 +0900 Subject: [PATCH 113/141] =?UTF-8?q?feat:=20StampInfo=EC=97=90=20activityDa?= =?UTF-8?q?te=20=EB=B3=80=EA=B2=BD=20=EC=B6=94=EA=B0=80=20(#230)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/org/sopt/app/application/stamp/StampInfo.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/org/sopt/app/application/stamp/StampInfo.java b/src/main/java/org/sopt/app/application/stamp/StampInfo.java index f2eb1814..96ca48ee 100644 --- a/src/main/java/org/sopt/app/application/stamp/StampInfo.java +++ b/src/main/java/org/sopt/app/application/stamp/StampInfo.java @@ -16,6 +16,7 @@ public static class Stamp { private List images; private Long userId; private Long missionId; + private LocalDateTime activityDate; private LocalDateTime createdAt; private LocalDateTime updatedAt; } From 2c74690107b12cedd7317a5e4d2f2928015621ce Mon Sep 17 00:00:00 2001 From: kseysh Date: Fri, 29 Mar 2024 19:32:11 +0900 Subject: [PATCH 114/141] =?UTF-8?q?feat:=20StampRequest=EC=97=90=20activit?= =?UTF-8?q?yDate=20=ED=95=84=EB=93=9C=20=EC=B6=94=EA=B0=80=20(#230)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/sopt/app/presentation/stamp/StampRequest.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/org/sopt/app/presentation/stamp/StampRequest.java b/src/main/java/org/sopt/app/presentation/stamp/StampRequest.java index 1a7f8fa5..c3864dbf 100644 --- a/src/main/java/org/sopt/app/presentation/stamp/StampRequest.java +++ b/src/main/java/org/sopt/app/presentation/stamp/StampRequest.java @@ -1,6 +1,7 @@ package org.sopt.app.presentation.stamp; import io.swagger.v3.oas.annotations.media.Schema; +import java.time.LocalDateTime; import javax.validation.constraints.NotNull; import lombok.Getter; import lombok.Setter; @@ -35,6 +36,8 @@ public static class RegisterStampRequest { @Schema(description = "스탬프 내용", example = "스탬프 찍었다!") @NotNull(message = "contents may not be null") private String contents; + @Schema(description = "활동 날짜", example = "2023-03-29T18:39:42.106369") + private LocalDateTime activityDate; } @Getter @@ -51,5 +54,7 @@ public static class EditStampRequest { @Schema(description = "스탬프 내용", example = "스탬프 찍었다!") @NotNull(message = "contents may not be null") private String contents; + @Schema(description = "활동 날짜", example = "2023-03-29T18:39:42.106369") + private LocalDateTime activityDate; } } From 9c704912dc149372b53d688ad6cb9f4e01e44032 Mon Sep 17 00:00:00 2001 From: kseysh Date: Fri, 29 Mar 2024 19:33:10 +0900 Subject: [PATCH 115/141] =?UTF-8?q?feat:=20StampResponse=EC=97=90=20activi?= =?UTF-8?q?tyDate=20=ED=95=84=EB=93=9C=20=EC=B6=94=EA=B0=80=20(#230)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/sopt/app/presentation/stamp/StampResponse.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/org/sopt/app/presentation/stamp/StampResponse.java b/src/main/java/org/sopt/app/presentation/stamp/StampResponse.java index afcd28bd..65771e89 100644 --- a/src/main/java/org/sopt/app/presentation/stamp/StampResponse.java +++ b/src/main/java/org/sopt/app/presentation/stamp/StampResponse.java @@ -20,6 +20,8 @@ public static class StampMain { private String contents; @Schema(description = "스탬프 이미지", example = "[https://s3.ap-northeast-2.amazonaws.com/example/283aab53-22e3-46da-85ec-146c99f82ed4.jpeg]") private List images; + @Schema(description = "활동 날짜", example = "2023-03-29T18:39:42.106369") + private LocalDateTime activityDate; @Schema(description = "스탬프 생성 일시", example = "2023-03-29T18:39:42.106369") private LocalDateTime createdAt; @Schema(description = "스탬프 수정 일시", example = "2023-03-29T18:39:42.106369") From 677eeb090e67130aa1d18a624336b7f1a17dd308 Mon Sep 17 00:00:00 2001 From: kseysh Date: Fri, 29 Mar 2024 19:35:25 +0900 Subject: [PATCH 116/141] =?UTF-8?q?feat:=20StampService=20return=EA=B0=92?= =?UTF-8?q?=EC=97=90=20activityDate=20=ED=95=84=EB=93=9C=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20(#230)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/sopt/app/application/stamp/StampService.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/java/org/sopt/app/application/stamp/StampService.java b/src/main/java/org/sopt/app/application/stamp/StampService.java index f12d247c..c55b2543 100644 --- a/src/main/java/org/sopt/app/application/stamp/StampService.java +++ b/src/main/java/org/sopt/app/application/stamp/StampService.java @@ -31,6 +31,7 @@ public StampInfo.Stamp findStamp(Long missionId, Long userId) { .id(entity.getId()) .contents(entity.getContents()) .images(entity.getImages()) + .activityDate(entity.getActivityDate()) .createdAt(entity.getCreatedAt()) .updatedAt(entity.getUpdatedAt()) .missionId(entity.getMissionId()) @@ -50,6 +51,7 @@ public StampInfo.Stamp uploadStampDeprecated( .id(newStamp.getId()) .contents(newStamp.getContents()) .images(newStamp.getImages()) + .activityDate(newStamp.getActivityDate()) .createdAt(newStamp.getCreatedAt()) .updatedAt(newStamp.getUpdatedAt()) .missionId(newStamp.getMissionId()) @@ -64,6 +66,7 @@ public StampInfo.Stamp uploadStamp( .contents(stampRequest.getContents()) .images(List.of(stampRequest.getImage())) .missionId(stampRequest.getMissionId()) + .activityDate(stampRequest.getActivityDate()) .userId(userId) .build(); @@ -72,6 +75,7 @@ public StampInfo.Stamp uploadStamp( .id(newStamp.getId()) .contents(newStamp.getContents()) .images(newStamp.getImages()) + .activityDate(newStamp.getActivityDate()) .createdAt(newStamp.getCreatedAt()) .updatedAt(newStamp.getUpdatedAt()) .missionId(newStamp.getMissionId()) @@ -110,6 +114,9 @@ public StampInfo.Stamp editStampContents( if (StringUtils.hasText(editStampRequest.getImage())) { stamp.changeImages(List.of(editStampRequest.getImage())); } + if (editStampRequest.getActivityDate() != null) { + stamp.changeActivityDate(editStampRequest.getActivityDate()); + } stamp.setUpdatedAt(LocalDateTime.now()); val newStamp = stampRepository.save(stamp); return StampInfo.Stamp.builder() From 3573971b45e45b16ad6811e057f3fbc3b7112f09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A3=BC=EC=96=B4=EC=A7=84=EC=82=AC=EB=9E=91=28eojinjoo?= =?UTF-8?q?=29?= Date: Sun, 31 Mar 2024 15:04:22 +0900 Subject: [PATCH 117/141] =?UTF-8?q?refactor:=20PlaygroundAuthServiceTest?= =?UTF-8?q?=20=EB=A6=AC=EB=B7=B0=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/DescriptionServiceTest.java | 9 ++----- .../PlaygroundAuthServiceTest.java | 7 ++--- .../sopt/app/application/S3ServiceTest.java | 26 +++++-------------- .../org/sopt/app/facade/AuthFacadeTest.java | 8 +++--- .../app/facade/DescriptionFacadeTest.java | 5 ++-- .../MainDescriptionRepositoryTest.java | 10 +++++-- 6 files changed, 28 insertions(+), 37 deletions(-) diff --git a/src/test/java/org/sopt/app/application/DescriptionServiceTest.java b/src/test/java/org/sopt/app/application/DescriptionServiceTest.java index 6ebeeed0..325a2fc4 100644 --- a/src/test/java/org/sopt/app/application/DescriptionServiceTest.java +++ b/src/test/java/org/sopt/app/application/DescriptionServiceTest.java @@ -4,11 +4,9 @@ import java.util.List; import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.TestInstance; -import org.junit.jupiter.api.TestInstance.Lifecycle; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; @@ -18,10 +16,7 @@ import org.sopt.app.domain.entity.MainDescription; import org.sopt.app.domain.enums.UserStatus; import org.sopt.app.interfaces.postgres.MainDescriptionRepository; -import org.springframework.boot.test.context.SpringBootTest; -@SpringBootTest -@TestInstance(Lifecycle.PER_CLASS) @ExtendWith(MockitoExtension.class) public class DescriptionServiceTest { @@ -31,7 +26,7 @@ public class DescriptionServiceTest { @InjectMocks private DescriptionService descriptionService; - @BeforeAll + @BeforeEach private void beforeTest() { when(mainDescriptionRepository.findAll()).thenReturn(List.of( MainDescription.builder() diff --git a/src/test/java/org/sopt/app/application/PlaygroundAuthServiceTest.java b/src/test/java/org/sopt/app/application/PlaygroundAuthServiceTest.java index 87fa1559..e7a03514 100644 --- a/src/test/java/org/sopt/app/application/PlaygroundAuthServiceTest.java +++ b/src/test/java/org/sopt/app/application/PlaygroundAuthServiceTest.java @@ -10,8 +10,10 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.DisplayName; 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 org.sopt.app.application.auth.PlaygroundAuthInfo; import org.sopt.app.application.auth.PlaygroundAuthInfo.ActiveUserIds; import org.sopt.app.application.auth.PlaygroundAuthInfo.MainView; @@ -30,10 +32,9 @@ import org.sopt.app.interfaces.external.PlaygroundClient; import org.sopt.app.presentation.auth.AppAuthRequest.AccessTokenRequest; import org.sopt.app.presentation.auth.AppAuthRequest.CodeRequest; -import org.springframework.boot.test.context.SpringBootTest; import org.springframework.web.client.HttpClientErrorException.BadRequest; -@SpringBootTest +@ExtendWith(MockitoExtension.class) public class PlaygroundAuthServiceTest { @Mock @@ -107,7 +108,7 @@ void SUCCESS_getPlaygroundAccessToken() { } @Test - @DisplayName("FAIL_플레이그라운드 어세스 토큰 발 BadRequestException") + @DisplayName("FAIL_플레이그라운드 어세스 토큰 발급 BadRequestException") void FAIL_getPlaygroundAccessTokenBadRequestException() { CodeRequest codeRequest = new CodeRequest(); diff --git a/src/test/java/org/sopt/app/application/S3ServiceTest.java b/src/test/java/org/sopt/app/application/S3ServiceTest.java index b8c5f32e..e3ce4e9d 100644 --- a/src/test/java/org/sopt/app/application/S3ServiceTest.java +++ b/src/test/java/org/sopt/app/application/S3ServiceTest.java @@ -8,7 +8,6 @@ import com.amazonaws.AmazonServiceException; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.model.PutObjectResult; -import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.nio.charset.StandardCharsets; @@ -16,15 +15,16 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.DisplayName; 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 org.sopt.app.application.s3.S3Info; import org.sopt.app.application.s3.S3Service; import org.sopt.app.common.exception.BadRequestException; -import org.springframework.boot.test.context.SpringBootTest; import org.springframework.mock.web.MockMultipartFile; -@SpringBootTest +@ExtendWith(MockitoExtension.class) public class S3ServiceTest { @Mock @@ -35,20 +35,14 @@ public class S3ServiceTest { @Test @DisplayName("SUCCESS_업로드(DEPRECATED) 파일 리스트 null일 때") - void SUCCESS_uploadDeprecatedNull() throws MalformedURLException { - when(s3Client.putObject(any())).thenReturn(new PutObjectResult()); - when(s3Client.getUrl(any(), any())).thenReturn(new URL("http://url.com")); - + void SUCCESS_uploadDeprecatedNull() { List result = s3Service.uploadDeprecated(null); Assertions.assertEquals(0, result.size()); } @Test @DisplayName("SUCCESS_업로드(DEPRECATED) 파일 리스트 첫 원소 empty일 때") - void SUCCESS_uploadDeprecatedEmpty() throws MalformedURLException { - when(s3Client.putObject(any())).thenReturn(new PutObjectResult()); - when(s3Client.getUrl(any(), any())).thenReturn(new URL("http://url.com")); - + void SUCCESS_uploadDeprecatedEmpty() { List result = s3Service.uploadDeprecated( List.of(new MockMultipartFile("name", (byte[]) null)) ); @@ -70,10 +64,7 @@ void SUCCESS_uploadDeprecatedNotNull() throws MalformedURLException { @Test() @DisplayName("FAIL_업로드(DEPRECATED) 잘못된 파일명") - void FAIL_uploadDeprecatedInvalidFilename() throws IOException { - when(s3Client.putObject(any())).thenReturn(new PutObjectResult()); - when(s3Client.getUrl(any(), any())).thenReturn(new URL("http://url.com")); - + void FAIL_uploadDeprecatedInvalidFilename() { Assertions.assertThrows(BadRequestException.class, () -> { s3Service.uploadDeprecated( List.of(new MockMultipartFile("files", "", "text/plain", @@ -83,10 +74,7 @@ void FAIL_uploadDeprecatedInvalidFilename() throws IOException { @Test @DisplayName("FAIL_업로드(DEPRECATED) 잘못된 파일 확장자") - void FAIL_uploadDeprecatedInvalidExtension() throws IOException { - when(s3Client.putObject(any())).thenReturn(new PutObjectResult()); - when(s3Client.getUrl(any(), any())).thenReturn(new URL("http://url.com")); - + void FAIL_uploadDeprecatedInvalidExtension() { Assertions.assertThrows(BadRequestException.class, () -> { s3Service.uploadDeprecated( List.of(new MockMultipartFile("files", "file.csv", "text/plain", diff --git a/src/test/java/org/sopt/app/facade/AuthFacadeTest.java b/src/test/java/org/sopt/app/facade/AuthFacadeTest.java index 15b43c48..75d7dedf 100644 --- a/src/test/java/org/sopt/app/facade/AuthFacadeTest.java +++ b/src/test/java/org/sopt/app/facade/AuthFacadeTest.java @@ -6,9 +6,10 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; -import org.mockito.Mockito; +import org.mockito.junit.jupiter.MockitoExtension; import org.sopt.app.application.auth.JwtTokenService; import org.sopt.app.application.auth.PlaygroundAuthInfo.AppToken; import org.sopt.app.application.auth.PlaygroundAuthInfo.PlaygroundMain; @@ -24,9 +25,8 @@ import org.sopt.app.presentation.auth.AppAuthRequest.RefreshRequest; import org.sopt.app.presentation.auth.AppAuthResponse.Token; import org.sopt.app.presentation.auth.AppAuthResponseMapper; -import org.springframework.boot.test.context.SpringBootTest; -@SpringBootTest +@ExtendWith(MockitoExtension.class) public class AuthFacadeTest { @Mock @@ -36,7 +36,7 @@ public class AuthFacadeTest { @Mock private UserService userService; @Mock - private PlaygroundAuthService playgroundAuthService = Mockito.mock(PlaygroundAuthService.class); + private PlaygroundAuthService playgroundAuthService; @Mock private SoptampUserService soptampUserService; @Mock diff --git a/src/test/java/org/sopt/app/facade/DescriptionFacadeTest.java b/src/test/java/org/sopt/app/facade/DescriptionFacadeTest.java index 99cb23e0..63d054b5 100644 --- a/src/test/java/org/sopt/app/facade/DescriptionFacadeTest.java +++ b/src/test/java/org/sopt/app/facade/DescriptionFacadeTest.java @@ -5,9 +5,11 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Mockito; +import org.mockito.junit.jupiter.MockitoExtension; import org.sopt.app.application.auth.PlaygroundAuthInfo.UserActiveInfo; import org.sopt.app.application.auth.PlaygroundAuthService; import org.sopt.app.application.description.DescriptionInfo; @@ -15,9 +17,8 @@ import org.sopt.app.application.description.DescriptionService; import org.sopt.app.domain.entity.User; import org.sopt.app.domain.enums.UserStatus; -import org.springframework.boot.test.context.SpringBootTest; -@SpringBootTest +@ExtendWith(MockitoExtension.class) public class DescriptionFacadeTest { @Mock diff --git a/src/test/java/org/sopt/app/interfaces/postgres/MainDescriptionRepositoryTest.java b/src/test/java/org/sopt/app/interfaces/postgres/MainDescriptionRepositoryTest.java index ef6c82dc..72ea42e7 100644 --- a/src/test/java/org/sopt/app/interfaces/postgres/MainDescriptionRepositoryTest.java +++ b/src/test/java/org/sopt/app/interfaces/postgres/MainDescriptionRepositoryTest.java @@ -2,10 +2,16 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import org.sopt.app.common.config.QuerydslConfiguration; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase; +import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase.Replace; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.context.annotation.Import; -@SpringBootTest +@DataJpaTest +@AutoConfigureTestDatabase(replace = Replace.NONE) +@Import(QuerydslConfiguration.class) public class MainDescriptionRepositoryTest { @Autowired From 158aa841adcbc046e5fa549fba280c6b17a295c2 Mon Sep 17 00:00:00 2001 From: kseysh Date: Mon, 1 Apr 2024 03:33:00 +0900 Subject: [PATCH 118/141] =?UTF-8?q?feat:=20=EC=8A=A4=ED=83=AC=ED=94=84=20?= =?UTF-8?q?=EB=93=B1=EB=A1=9D=20=EC=8B=9C=20activityDate=EA=B0=80=20null?= =?UTF-8?q?=EC=9D=B4=EB=A9=B4=20=EC=97=90=EB=9F=AC=EB=A5=BC=20=EB=B0=98?= =?UTF-8?q?=ED=99=98=ED=95=98=EB=8A=94=20=EC=9A=94=EA=B5=AC=EC=82=AC?= =?UTF-8?q?=ED=95=AD=20=EB=B0=98=EC=98=81=20(#230)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/org/sopt/app/presentation/stamp/StampRequest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/org/sopt/app/presentation/stamp/StampRequest.java b/src/main/java/org/sopt/app/presentation/stamp/StampRequest.java index c3864dbf..94c17ef6 100644 --- a/src/main/java/org/sopt/app/presentation/stamp/StampRequest.java +++ b/src/main/java/org/sopt/app/presentation/stamp/StampRequest.java @@ -37,6 +37,7 @@ public static class RegisterStampRequest { @NotNull(message = "contents may not be null") private String contents; @Schema(description = "활동 날짜", example = "2023-03-29T18:39:42.106369") + @NotNull(message = "activity date may not be null") private LocalDateTime activityDate; } From c1b8ac1911a3791059d2bc51f4d4a4552170ef7e Mon Sep 17 00:00:00 2001 From: kseysh Date: Mon, 1 Apr 2024 03:33:23 +0900 Subject: [PATCH 119/141] =?UTF-8?q?feat:=20=EC=8A=A4=ED=83=AC=ED=94=84=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20=EC=8B=9C=20activityDate=EA=B0=80=20null?= =?UTF-8?q?=EC=9D=B4=EB=A9=B4=20=EC=97=90=EB=9F=AC=EB=A5=BC=20=EB=B0=98?= =?UTF-8?q?=ED=99=98=ED=95=98=EB=8A=94=20=EC=9A=94=EA=B5=AC=EC=82=AC?= =?UTF-8?q?=ED=95=AD=20=EB=B0=98=EC=98=81=20(#230)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/sopt/app/application/stamp/StampService.java | 5 +++-- src/main/java/org/sopt/app/common/response/ErrorCode.java | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/sopt/app/application/stamp/StampService.java b/src/main/java/org/sopt/app/application/stamp/StampService.java index c55b2543..3edfdd98 100644 --- a/src/main/java/org/sopt/app/application/stamp/StampService.java +++ b/src/main/java/org/sopt/app/application/stamp/StampService.java @@ -114,9 +114,10 @@ public StampInfo.Stamp editStampContents( if (StringUtils.hasText(editStampRequest.getImage())) { stamp.changeImages(List.of(editStampRequest.getImage())); } - if (editStampRequest.getActivityDate() != null) { - stamp.changeActivityDate(editStampRequest.getActivityDate()); + if (editStampRequest.getActivityDate() == null) { + throw new BadRequestException(ErrorCode.INVALID_STAMP_ACTIVITY_DATE.getMessage()); } + stamp.changeActivityDate(editStampRequest.getActivityDate()); stamp.setUpdatedAt(LocalDateTime.now()); val newStamp = stampRepository.save(stamp); return StampInfo.Stamp.builder() diff --git a/src/main/java/org/sopt/app/common/response/ErrorCode.java b/src/main/java/org/sopt/app/common/response/ErrorCode.java index 8f6ceefe..e00b9fc9 100644 --- a/src/main/java/org/sopt/app/common/response/ErrorCode.java +++ b/src/main/java/org/sopt/app/common/response/ErrorCode.java @@ -33,6 +33,7 @@ public enum ErrorCode { // STAMP STAMP_NOT_FOUND("존재하지 않는 스탬프입니다."), DUPLICATE_STAMP("이미 해당 미션에 대한 스탬프가 존재합니다."), + INVALID_STAMP_ACTIVITY_DATE("스탬프 활동 날짜가 존재하지 않습니다."), // NOTIFICATION NOTIFICATION_NOT_FOUND("존재하지 않는 알림입니다."), From 3c986ba3e7c7e8cad50685963171d2e4583e7293 Mon Sep 17 00:00:00 2001 From: kseysh Date: Mon, 1 Apr 2024 03:42:47 +0900 Subject: [PATCH 120/141] =?UTF-8?q?feat:=20=EC=8A=A4=ED=83=AC=ED=94=84=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20=EC=8B=9C=20activityDate=EA=B0=80=20null?= =?UTF-8?q?=EC=9D=B4=EB=A9=B4=20=EC=97=90=EB=9F=AC=EB=A5=BC=20=EB=B0=98?= =?UTF-8?q?=ED=99=98=ED=95=98=EB=8A=94=20=EC=9A=94=EA=B5=AC=EC=82=AC?= =?UTF-8?q?=ED=95=AD=20=EB=B0=98=EC=98=81=20(#230)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/org/sopt/app/presentation/stamp/StampRequest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/org/sopt/app/presentation/stamp/StampRequest.java b/src/main/java/org/sopt/app/presentation/stamp/StampRequest.java index 94c17ef6..286395a0 100644 --- a/src/main/java/org/sopt/app/presentation/stamp/StampRequest.java +++ b/src/main/java/org/sopt/app/presentation/stamp/StampRequest.java @@ -56,6 +56,7 @@ public static class EditStampRequest { @NotNull(message = "contents may not be null") private String contents; @Schema(description = "활동 날짜", example = "2023-03-29T18:39:42.106369") + @NotNull(message = "activity date may not be null") private LocalDateTime activityDate; } } From 36810e825525b35ba8ebfaae31608abcbb712445 Mon Sep 17 00:00:00 2001 From: kseysh Date: Mon, 1 Apr 2024 03:50:25 +0900 Subject: [PATCH 121/141] =?UTF-8?q?feat:=20DTO=EC=97=90=20=EB=8B=B4?= =?UTF-8?q?=EA=B8=B4=20@NotNull=EC=9D=84=20=EC=A0=81=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EA=B8=B0=20=EC=9C=84=ED=95=B4=20@Valid=20=EC=82=AC=EC=9A=A9=20?= =?UTF-8?q?(#230)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/sopt/app/application/stamp/StampService.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/sopt/app/application/stamp/StampService.java b/src/main/java/org/sopt/app/application/stamp/StampService.java index 3edfdd98..eb0f4c37 100644 --- a/src/main/java/org/sopt/app/application/stamp/StampService.java +++ b/src/main/java/org/sopt/app/application/stamp/StampService.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; +import javax.validation.Valid; import lombok.RequiredArgsConstructor; import lombok.val; import org.sopt.app.common.event.Events; @@ -40,7 +41,7 @@ public StampInfo.Stamp findStamp(Long missionId, Long userId) { @Transactional public StampInfo.Stamp uploadStampDeprecated( - RegisterStampRequest stampRequest, + @Valid RegisterStampRequest stampRequest, List imgPaths, Long userId, Long missionId) { @@ -60,7 +61,7 @@ public StampInfo.Stamp uploadStampDeprecated( @Transactional public StampInfo.Stamp uploadStamp( - RegisterStampRequest stampRequest, + @Valid RegisterStampRequest stampRequest, Long userId) { val stamp = Stamp.builder() .contents(stampRequest.getContents()) @@ -84,7 +85,7 @@ public StampInfo.Stamp uploadStamp( @Transactional public StampInfo.Stamp editStampContentsDeprecated( - StampRequest.EditStampRequest editStampRequest, + @Valid StampRequest.EditStampRequest editStampRequest, Long userId, Long missionId) { @@ -103,7 +104,7 @@ public StampInfo.Stamp editStampContentsDeprecated( @Transactional public StampInfo.Stamp editStampContents( - StampRequest.EditStampRequest editStampRequest, + @Valid StampRequest.EditStampRequest editStampRequest, Long userId) { val stamp = stampRepository.findByUserIdAndMissionId(userId, editStampRequest.getMissionId()) @@ -161,7 +162,7 @@ public void deleteAllStamps(Long userId) { private Stamp convertStampImgDeprecated( - RegisterStampRequest stampRequest, + @Valid RegisterStampRequest stampRequest, List imgList, Long userId, Long missionId) { From 1aab84490eb6c87aa226c30139113456b609e538 Mon Sep 17 00:00:00 2001 From: kseysh Date: Mon, 1 Apr 2024 04:02:14 +0900 Subject: [PATCH 122/141] =?UTF-8?q?feat:=20=EC=8A=A4=ED=83=AC=ED=94=84=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20=EC=8B=9C=EC=97=90=20=EB=A6=AC=ED=84=B4=20?= =?UTF-8?q?=EA=B0=92=EC=97=90=20=EB=8C=80=ED=95=9C=20validator=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20(#230)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/application/stamp/StampService.java | 26 +++++++++++++++++++ .../sopt/app/common/response/ErrorCode.java | 6 +++++ 2 files changed, 32 insertions(+) diff --git a/src/main/java/org/sopt/app/application/stamp/StampService.java b/src/main/java/org/sopt/app/application/stamp/StampService.java index eb0f4c37..c538be75 100644 --- a/src/main/java/org/sopt/app/application/stamp/StampService.java +++ b/src/main/java/org/sopt/app/application/stamp/StampService.java @@ -28,6 +28,7 @@ public class StampService { public StampInfo.Stamp findStamp(Long missionId, Long userId) { val entity = stampRepository.findByUserIdAndMissionId(userId, missionId) .orElseThrow(() -> new BadRequestException(ErrorCode.STAMP_NOT_FOUND.getMessage())); + validateStampInfo(entity); return StampInfo.Stamp.builder() .id(entity.getId()) .contents(entity.getContents()) @@ -160,6 +161,31 @@ public void deleteAllStamps(Long userId) { Events.raise(new StampDeletedEvent(imageUrls)); } + private void validateStampInfo(Stamp entity) { + + if (entity.getId() == null) { + throw new BadRequestException(ErrorCode.INVALID_STAMP_ID.getMessage()); + } + if (StringUtils.hasText(entity.getContents())) { + throw new BadRequestException(ErrorCode.INVALID_STAMP_CONTENTS.getMessage()); + } + if (entity.getImages().isEmpty()) { + throw new BadRequestException(ErrorCode.INVALID_STAMP_IMAGES.getMessage()); + } + if (entity.getActivityDate() == null) { + throw new BadRequestException(ErrorCode.INVALID_STAMP_ACTIVITY_DATE.getMessage()); + } + if (entity.getCreatedAt() == null) { + throw new BadRequestException(ErrorCode.INVALID_STAMP_CREATED_AT.getMessage()); + } + if (entity.getUpdatedAt() == null) { + throw new BadRequestException(ErrorCode.INVALID_STAMP_UPDATED_AT.getMessage()); + } + if (entity.getMissionId() == null) { + throw new BadRequestException(ErrorCode.INVALID_STAMP_MISSION_ID.getMessage()); + } + + } private Stamp convertStampImgDeprecated( @Valid RegisterStampRequest stampRequest, diff --git a/src/main/java/org/sopt/app/common/response/ErrorCode.java b/src/main/java/org/sopt/app/common/response/ErrorCode.java index e00b9fc9..b4010b8a 100644 --- a/src/main/java/org/sopt/app/common/response/ErrorCode.java +++ b/src/main/java/org/sopt/app/common/response/ErrorCode.java @@ -34,6 +34,12 @@ public enum ErrorCode { STAMP_NOT_FOUND("존재하지 않는 스탬프입니다."), DUPLICATE_STAMP("이미 해당 미션에 대한 스탬프가 존재합니다."), INVALID_STAMP_ACTIVITY_DATE("스탬프 활동 날짜가 존재하지 않습니다."), + INVALID_STAMP_CONTENTS("스탬프 내용이 존재하지 않습니다."), + INVALID_STAMP_IMAGES("스탬프 이미지가 존재하지 않습니다."), + INVALID_STAMP_MISSION_ID("스탬프 미션 ID가 존재하지 않습니다."), + INVALID_STAMP_ID("스탬프 ID가 존재하지 않습니다."), + INVALID_STAMP_CREATED_AT("스탬프 생성 날짜가 존재하지 않습니다."), + INVALID_STAMP_UPDATED_AT("스탬프 업데이트 날짜가 존재하지 않습니다."), // NOTIFICATION NOTIFICATION_NOT_FOUND("존재하지 않는 알림입니다."), From 4da74cb58ea7f9d74fdec19432b98bdbfaeababa Mon Sep 17 00:00:00 2001 From: kseysh Date: Mon, 1 Apr 2024 04:17:48 +0900 Subject: [PATCH 123/141] =?UTF-8?q?fix:=20=EC=8B=A4=ED=8C=A8=ED=95=9C=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20=EB=B6=80=EB=B6=84=20=EC=88=98=EC=A0=95=20(#230)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sopt/app/application/stamp/StampService.java | 10 +--------- .../org/sopt/app/application/StampServiceTest.java | 13 ++++++++++--- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/src/main/java/org/sopt/app/application/stamp/StampService.java b/src/main/java/org/sopt/app/application/stamp/StampService.java index c538be75..ad0c5d21 100644 --- a/src/main/java/org/sopt/app/application/stamp/StampService.java +++ b/src/main/java/org/sopt/app/application/stamp/StampService.java @@ -162,11 +162,10 @@ public void deleteAllStamps(Long userId) { } private void validateStampInfo(Stamp entity) { - if (entity.getId() == null) { throw new BadRequestException(ErrorCode.INVALID_STAMP_ID.getMessage()); } - if (StringUtils.hasText(entity.getContents())) { + if (!StringUtils.hasText(entity.getContents())) { throw new BadRequestException(ErrorCode.INVALID_STAMP_CONTENTS.getMessage()); } if (entity.getImages().isEmpty()) { @@ -175,16 +174,9 @@ private void validateStampInfo(Stamp entity) { if (entity.getActivityDate() == null) { throw new BadRequestException(ErrorCode.INVALID_STAMP_ACTIVITY_DATE.getMessage()); } - if (entity.getCreatedAt() == null) { - throw new BadRequestException(ErrorCode.INVALID_STAMP_CREATED_AT.getMessage()); - } - if (entity.getUpdatedAt() == null) { - throw new BadRequestException(ErrorCode.INVALID_STAMP_UPDATED_AT.getMessage()); - } if (entity.getMissionId() == null) { throw new BadRequestException(ErrorCode.INVALID_STAMP_MISSION_ID.getMessage()); } - } private Stamp convertStampImgDeprecated( diff --git a/src/test/java/org/sopt/app/application/StampServiceTest.java b/src/test/java/org/sopt/app/application/StampServiceTest.java index eaf83082..081faa69 100644 --- a/src/test/java/org/sopt/app/application/StampServiceTest.java +++ b/src/test/java/org/sopt/app/application/StampServiceTest.java @@ -46,8 +46,7 @@ void SUCCESS_findStamp() { .id(stamp.getId()) .contents(stamp.getContents()) .images(stamp.getImages()) - .createdAt(stamp.getCreatedAt()) - .updatedAt(stamp.getUpdatedAt()) + .activityDate(stamp.getActivityDate()) .missionId(stamp.getMissionId()) .build(); StampInfo.Stamp result = stampService.findStamp(stampUserId, stampMissionId); @@ -204,6 +203,7 @@ private Stamp getSavedStamp(Long missionId, Long requestUserId) { final Long stampId = 1L; final String contents = "savedContents"; final List images = List.of("savedImage"); + final LocalDateTime activityDate = LocalDateTime.of(2023, 1, 1, 0, 0, 0); final Optional savedStamp = Optional.of(Stamp.builder() .id(stampId) @@ -211,6 +211,7 @@ private Stamp getSavedStamp(Long missionId, Long requestUserId) { .images(images) .missionId(missionId) .userId(requestUserId) + .activityDate(activityDate) .build()); Mockito.when(stampRepository.findByUserIdAndMissionId(requestUserId, missionId)).thenReturn(savedStamp); @@ -277,11 +278,13 @@ void SUCCESS_editStampContents() { final Long requestMissionId = anyLong(); final String requestContents = "requestContents"; final String requestImage = "requestImage"; + final LocalDateTime requestActivityDate = LocalDateTime.now(); StampRequest.EditStampRequest editStampRequest = new StampRequest.EditStampRequest(); editStampRequest.setContents(requestContents); editStampRequest.setImage(requestImage); editStampRequest.setMissionId(requestMissionId); + editStampRequest.setActivityDate(requestActivityDate); //when Stamp oldStamp = getSavedStamp(requestMissionId, requestUserId); @@ -301,10 +304,12 @@ void SUCCESS_editStampContentsNoContents() { final String requestBlankContents = ""; final String requestImage = "requestImage"; + final LocalDateTime requestActivityDate = LocalDateTime.now(); StampRequest.EditStampRequest editStampRequest = new StampRequest.EditStampRequest(); editStampRequest.setContents(requestBlankContents); editStampRequest.setImage(requestImage); editStampRequest.setMissionId(requestMissionId); + editStampRequest.setActivityDate(requestActivityDate); //when Stamp oldStamp = getSavedStamp(requestMissionId, requestUserId); @@ -321,13 +326,15 @@ void SUCCESS_editStampContentsNoImage() { // given final Long requestUserId = anyLong(); final Long requestMissionId = anyLong(); - final String requestContents = "requestContents"; final String requestBlankImage = ""; + final LocalDateTime requestActivityDate = LocalDateTime.now(); + StampRequest.EditStampRequest editStampRequest = new StampRequest.EditStampRequest(); editStampRequest.setContents(requestContents); editStampRequest.setImage(requestBlankImage); editStampRequest.setMissionId(requestMissionId); + editStampRequest.setActivityDate(requestActivityDate); //when Stamp oldStamp = getSavedStamp(requestMissionId, requestUserId); From a71ab50cb4cd01a98d739f53cb2bd1bca3d14428 Mon Sep 17 00:00:00 2001 From: kseysh Date: Mon, 1 Apr 2024 04:33:28 +0900 Subject: [PATCH 124/141] =?UTF-8?q?modify:=20=ED=8C=8C=ED=8A=B8=EB=B3=84?= =?UTF-8?q?=20Controller=20=EB=94=B0=EB=A1=9C=20=EB=B6=84=EB=A6=AC=20(#228?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/presentation/rank/RankController.java | 27 ++++++++++++------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/sopt/app/presentation/rank/RankController.java b/src/main/java/org/sopt/app/presentation/rank/RankController.java index 58fe9a9e..494dc943 100644 --- a/src/main/java/org/sopt/app/presentation/rank/RankController.java +++ b/src/main/java/org/sopt/app/presentation/rank/RankController.java @@ -16,6 +16,7 @@ import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @@ -43,23 +44,31 @@ public ResponseEntity> findRanks() { return ResponseEntity.status(HttpStatus.OK).body(response); } + @Operation(summary = "현재 기수 랭킹 목록 조회") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "success"), + @ApiResponse(responseCode = "500", description = "server error", content = @Content) + }) + @GetMapping("/current") + public ResponseEntity> findCurrentRanks() { + val soptampPointList = soptampPointService.findCurrentPointList(); + val result = soptampUserService.findCurrentRanks(soptampPointList); + val response = rankResponseMapper.of(result); + return ResponseEntity.status(HttpStatus.OK).body(response); + } + @Operation(summary = "파트 별 현재 기수 랭킹 목록 조회") @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "success"), @ApiResponse(responseCode = "400", description = "part not found", content = @Content), @ApiResponse(responseCode = "500", description = "server error", content = @Content) }) - @GetMapping("/current") + @GetMapping("/current/part/{part}") public ResponseEntity> findCurrentRanksByPart( - @RequestParam(required = false) Part part + @PathVariable("part") Part part ) { - List soptampPointList; - if (part == null) { - soptampPointList = soptampPointService.findCurrentPointList(); - } else { - val soptampUserIdList = soptampUserService.findSoptampUserByPart(part); - soptampPointList = soptampPointService.findCurrentPointListBySoptampUserIds(soptampUserIdList); - } + val soptampUserIdList = soptampUserService.findSoptampUserByPart(part); + val soptampPointList = soptampPointService.findCurrentPointListBySoptampUserIds(soptampUserIdList); val result = soptampUserService.findCurrentRanks(soptampPointList); val response = rankResponseMapper.of(result); return ResponseEntity.status(HttpStatus.OK).body(response); From a71967f0a4fb2be8d92d21af311549c3ede86d26 Mon Sep 17 00:00:00 2001 From: kseysh Date: Mon, 1 Apr 2024 22:49:05 +0900 Subject: [PATCH 125/141] =?UTF-8?q?refactor:=20=EC=82=AC=EC=9A=A9=EB=90=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20=ED=8C=8C=EC=9D=BC=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=20(#227)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/sopt/app/presentation/rank/RankRequest.java | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 src/main/java/org/sopt/app/presentation/rank/RankRequest.java diff --git a/src/main/java/org/sopt/app/presentation/rank/RankRequest.java b/src/main/java/org/sopt/app/presentation/rank/RankRequest.java deleted file mode 100644 index ab8997f5..00000000 --- a/src/main/java/org/sopt/app/presentation/rank/RankRequest.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.sopt.app.presentation.rank; - -public class RankRequest { - -} From 6fb41becfd6bd5cabf34c6efbb0e7e8d133c8a91 Mon Sep 17 00:00:00 2001 From: kseysh Date: Mon, 1 Apr 2024 23:18:41 +0900 Subject: [PATCH 126/141] =?UTF-8?q?feat:=20=ED=8C=8C=ED=8A=B8=20=EB=B3=84?= =?UTF-8?q?=20=EB=9E=AD=ED=82=B9=20=EB=AA=A9=EB=A1=9D=20=EC=A1=B0=ED=9A=8C?= =?UTF-8?q?=20api=20=EC=BB=A8=ED=8A=B8=EB=A1=A4=EB=9F=AC=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1=20(#227)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/presentation/rank/RankController.java | 31 ++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/sopt/app/presentation/rank/RankController.java b/src/main/java/org/sopt/app/presentation/rank/RankController.java index 494dc943..3e9783ca 100644 --- a/src/main/java/org/sopt/app/presentation/rank/RankController.java +++ b/src/main/java/org/sopt/app/presentation/rank/RankController.java @@ -6,10 +6,13 @@ import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import lombok.val; import org.sopt.app.application.mission.MissionService; -import org.sopt.app.application.soptamp.SoptampPointInfo; +import org.sopt.app.application.soptamp.SoptampPointInfo.PartRank; import org.sopt.app.application.soptamp.SoptampPointService; import org.sopt.app.application.soptamp.SoptampUserService; import org.sopt.app.domain.enums.Part; @@ -87,4 +90,30 @@ public ResponseEntity findRankByNickname(@RequestParam(valu val response = rankResponseMapper.of(result, missionList); return ResponseEntity.status(HttpStatus.OK).body(response); } + + @Operation(summary = "파트끼리의 랭킹 목록 조회") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "success"), + @ApiResponse(responseCode = "500", description = "server error", content = @Content) + }) + @GetMapping("/part") + public ResponseEntity> findPartRanks() { + List partList = List.of(Part.PLAN, Part.DESIGN, Part.WEB, Part.IOS, Part.ANDROID, Part.SERVER); + + Map partPoints = partList.stream() + .collect(Collectors.toMap( + Function.identity(), + part -> soptampPointService.calculateSumOfPoints( + soptampPointService.findCurrentPointListBySoptampUserIds( + soptampUserService.findSoptampUserByPart(part) + ) + ) + )); + + return ResponseEntity.status(HttpStatus.OK).body( + partList.stream() + .map(soptampPointService.findPartRanks(partPoints)::get) + .toList() + ); + } } From abe58cf97331dc4f223ab0b3b292a7516793b9f0 Mon Sep 17 00:00:00 2001 From: kseysh Date: Mon, 1 Apr 2024 23:20:02 +0900 Subject: [PATCH 127/141] =?UTF-8?q?feat:=20=ED=8C=8C=ED=8A=B8=20=EB=B3=84?= =?UTF-8?q?=20=EB=9E=AD=ED=82=B9=20=EB=AA=A9=EB=A1=9D=20=EC=A1=B0=ED=9A=8C?= =?UTF-8?q?=20api=20response=20DTO=20=EC=83=9D=EC=84=B1=20(#227)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sopt/app/application/soptamp/SoptampPointInfo.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/java/org/sopt/app/application/soptamp/SoptampPointInfo.java b/src/main/java/org/sopt/app/application/soptamp/SoptampPointInfo.java index ba9cd9dc..70990cd6 100644 --- a/src/main/java/org/sopt/app/application/soptamp/SoptampPointInfo.java +++ b/src/main/java/org/sopt/app/application/soptamp/SoptampPointInfo.java @@ -42,4 +42,12 @@ public static Point of(Long id, Long generation, Long soptampUserId, Long points return new Point(id, generation, soptampUserId, points); } } + + @Getter + @Builder + public static class PartRank { + private String part; + private Integer rank; + private Long points; + } } From 75c301f96d66ff05b13d694c45dc07d21b05a0fb Mon Sep 17 00:00:00 2001 From: kseysh Date: Mon, 1 Apr 2024 23:23:57 +0900 Subject: [PATCH 128/141] =?UTF-8?q?feat:=20=ED=8C=8C=ED=8A=B8=20=EB=B3=84?= =?UTF-8?q?=20=EB=9E=AD=ED=82=B9=20=EB=AA=A9=EB=A1=9D=20=EC=A1=B0=ED=9A=8C?= =?UTF-8?q?=20api=20service=20=EA=B5=AC=ED=98=84=20(#227)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../soptamp/SoptampPointService.java | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/src/main/java/org/sopt/app/application/soptamp/SoptampPointService.java b/src/main/java/org/sopt/app/application/soptamp/SoptampPointService.java index e289b888..3eab6fd7 100644 --- a/src/main/java/org/sopt/app/application/soptamp/SoptampPointService.java +++ b/src/main/java/org/sopt/app/application/soptamp/SoptampPointService.java @@ -1,10 +1,16 @@ package org.sopt.app.application.soptamp; +import java.util.EnumMap; import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import lombok.val; +import org.sopt.app.application.soptamp.SoptampPointInfo.PartRank; import org.sopt.app.application.soptamp.SoptampPointInfo.Point; import org.sopt.app.domain.entity.SoptampPoint; +import org.sopt.app.domain.enums.Part; import org.sopt.app.domain.enums.UserStatus; import org.sopt.app.interfaces.postgres.SoptampPointRepository; import org.springframework.beans.factory.annotation.Value; @@ -92,4 +98,35 @@ public void upsertSoptampPoint(UserStatus status, Long soptampUserId) { .build(); soptampPointRepository.save(newSoptampPoint); } + + public Map findPartRanks(Map partPoints) { + return partPoints.entrySet().stream() + .collect(Collectors.toMap( + Entry::getKey, + entry -> calculatePartRank(entry.getKey(), partPoints) + )); + } + + private PartRank calculatePartRank(Part part, Map partPoints) { + Integer rank = 1; + + for (Entry comparator : partPoints.entrySet()) { + if(partPoints.get(part) < comparator.getValue()){ + rank++; + } + } + + return PartRank.builder() + .part(part.getPartName()) + .rank(rank) + .points(partPoints.get(part)) + .build(); + } + + + public Long calculateSumOfPoints(List soptampPointList) { + return soptampPointList.stream() + .map(Point::getPoints) + .reduce(0L, Long::sum); + } } From 48e2d4156d525f7b5e672177a569486c82604b35 Mon Sep 17 00:00:00 2001 From: kseysh Date: Wed, 3 Apr 2024 00:47:09 +0900 Subject: [PATCH 129/141] =?UTF-8?q?fix:=20FriendRepositoryTest=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=EB=8D=B0=EC=9D=B4=ED=84=B0=EB=B2=A0=EC=9D=B4?= =?UTF-8?q?=EC=8A=A4=EC=97=90=20=EC=A0=80=EC=9E=A5=EB=90=98=EC=96=B4=20?= =?UTF-8?q?=EC=9E=88=EB=8A=94=20=EA=B0=92=EC=97=90=20=EC=9D=98=EC=A1=B4?= =?UTF-8?q?=ED=95=98=EC=A7=80=20=EC=95=8A=EB=8F=84=EB=A1=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20(#227)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../postgres/FriendRepositoryTest.java | 59 +++++++++++++++++-- 1 file changed, 53 insertions(+), 6 deletions(-) diff --git a/src/test/java/org/sopt/app/interfaces/postgres/FriendRepositoryTest.java b/src/test/java/org/sopt/app/interfaces/postgres/FriendRepositoryTest.java index 4be54529..73164caa 100644 --- a/src/test/java/org/sopt/app/interfaces/postgres/FriendRepositoryTest.java +++ b/src/test/java/org/sopt/app/interfaces/postgres/FriendRepositoryTest.java @@ -2,27 +2,74 @@ import java.util.List; import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import org.sopt.app.common.config.QuerydslConfiguration; +import org.sopt.app.domain.entity.Friend; +import org.sopt.app.domain.entity.User; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase; +import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase.Replace; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Import; -@SpringBootTest -public class FriendRepositoryTest { +@DataJpaTest +@AutoConfigureTestDatabase(replace = Replace.NONE) +@Import(QuerydslConfiguration.class) +class FriendRepositoryTest { @Autowired private FriendRepository friendRepository; + @Autowired + private UserRepository userRepository; + + User user1 = new User(); + User user2 = new User(); + + Friend friend = new Friend(); + + @BeforeEach + void beforeTest() { + + user1 = userRepository.save( + User.builder() + .playgroundId(generateUniquePlaygroundId()) + .build() + ); + user2 = userRepository.save( + User.builder() + .playgroundId(generateUniquePlaygroundId()) + .build() + ); + + friend = friendRepository.save(Friend.builder().userId(user1.getId()).friendUserId(user2.getId()).build()); + } + + private Long generateUniquePlaygroundId() { + long playgroundId = Long.MAX_VALUE; + + for (int i = 0; i < 1000; i++) { + if (userRepository.findUserByPlaygroundId(playgroundId).isEmpty()) { + break; + } + playgroundId = playgroundId - i; + } + return playgroundId; + } + @Test - @DisplayName("200 - findAllByFriendUserId") + @DisplayName("SUCCESS_유저 아이디로 친구 찾기") void findAllByFriendUserIdSuccess() { - Assertions.assertEquals(List.of(), friendRepository.findAllByFriendUserId(1L)); + Assertions.assertEquals(List.of(friend), friendRepository.findAllByFriendUserId(user2.getId())); } @Test - @DisplayName("200 - findAllByUserIdAndFriendUserIdIn") + @DisplayName("SUCCESS_유저 아이디와 친구 아이디로 친구 찾기") void findAllByUserIdAndFriendUserIdInSuccess() { - Assertions.assertEquals(List.of(), friendRepository.findAllByUserIdAndFriendUserIdIn(1L, List.of(2L))); + Assertions.assertEquals(List.of(friend), friendRepository.findAllByUserIdAndFriendUserIdIn(user1.getId(), List.of(user2.getId()))); } } \ No newline at end of file From 44d5d5fda359275dbbcc2d8905cebd0ce7ce3fc4 Mon Sep 17 00:00:00 2001 From: kseysh Date: Wed, 3 Apr 2024 00:58:56 +0900 Subject: [PATCH 130/141] =?UTF-8?q?fix:=20FriendService=EC=97=90=EC=84=9C?= =?UTF-8?q?=20=EB=8D=B0=EC=9D=B4=ED=84=B0=EB=B2=A0=EC=9D=B4=EC=8A=A4?= =?UTF-8?q?=EC=97=90=20=EC=A0=80=EC=9E=A5=EB=90=98=EC=96=B4=20=EC=9E=88?= =?UTF-8?q?=EB=8A=94=20=EA=B0=92=EC=97=90=20=EC=9D=98=EC=A1=B4=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95=20?= =?UTF-8?q?(#227)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/application/FriendServiceTest.java | 30 ++++++++++++++----- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/src/test/java/org/sopt/app/application/FriendServiceTest.java b/src/test/java/org/sopt/app/application/FriendServiceTest.java index 43c74ad9..9551b282 100644 --- a/src/test/java/org/sopt/app/application/FriendServiceTest.java +++ b/src/test/java/org/sopt/app/application/FriendServiceTest.java @@ -1,21 +1,37 @@ package org.sopt.app.application; +import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.Mockito.when; + +import java.util.List; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.DisplayName; 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 org.sopt.app.application.poke.FriendService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; +import org.sopt.app.interfaces.postgres.FriendRepository; + +@ExtendWith(MockitoExtension.class) +class FriendServiceTest { -@SpringBootTest -public class FriendServiceTest { + @Mock + private FriendRepository friendRepository; - @Autowired + @InjectMocks private FriendService friendService; @Test - @DisplayName("200 - getIsNewUserSuccess") + @DisplayName("SUCCESS_친구가 없다면 새로운 유저로 판단하여 true 반환") void getIsNewUserSuccess() { - Assertions.assertEquals(true, friendService.getIsNewUser(1L)); + //given + final Long anyUserId = anyLong(); + //when + when(friendRepository.findAllByFriendUserId(anyUserId)).thenReturn(List.of()); + when(friendRepository.findAllByUserIdAndFriendUserIdIn(anyUserId, List.of())).thenReturn(List.of()); + //then + Assertions.assertTrue(friendService.getIsNewUser(anyUserId)); } } \ No newline at end of file From 17fe3aed67ee542924350de496847cf45cb07eb9 Mon Sep 17 00:00:00 2001 From: kseysh Date: Wed, 3 Apr 2024 01:02:35 +0900 Subject: [PATCH 131/141] =?UTF-8?q?fix:=20=EC=B5=9C=EC=86=8C=20=ED=95=9C?= =?UTF-8?q?=20=EA=B0=9C=EC=9D=98=20Assertion=EC=9D=B4=20=EC=9E=88=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=EC=88=98=EC=A0=95=20(#227)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../interfaces/postgres/MainDescriptionRepositoryTest.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/test/java/org/sopt/app/interfaces/postgres/MainDescriptionRepositoryTest.java b/src/test/java/org/sopt/app/interfaces/postgres/MainDescriptionRepositoryTest.java index 72ea42e7..64f8d0c4 100644 --- a/src/test/java/org/sopt/app/interfaces/postgres/MainDescriptionRepositoryTest.java +++ b/src/test/java/org/sopt/app/interfaces/postgres/MainDescriptionRepositoryTest.java @@ -1,5 +1,6 @@ package org.sopt.app.interfaces.postgres; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.sopt.app.common.config.QuerydslConfiguration; @@ -12,7 +13,7 @@ @DataJpaTest @AutoConfigureTestDatabase(replace = Replace.NONE) @Import(QuerydslConfiguration.class) -public class MainDescriptionRepositoryTest { +class MainDescriptionRepositoryTest { @Autowired private MainDescriptionRepository mainDescriptionRepository; @@ -20,6 +21,6 @@ public class MainDescriptionRepositoryTest { @Test @DisplayName("SUCCESS_메인 문구 전체 조회") void SUCCESS_findAll() { - System.out.println(mainDescriptionRepository.findAll()); + Assertions.assertDoesNotThrow(() -> mainDescriptionRepository.findAll()); } } From 993221b6ac2207dda05dbb42fbe964544d511742 Mon Sep 17 00:00:00 2001 From: kseysh Date: Wed, 3 Apr 2024 03:09:38 +0900 Subject: [PATCH 132/141] =?UTF-8?q?fix:=20CI=20=EA=B3=BC=EC=A0=95=EC=97=90?= =?UTF-8?q?=EC=84=9C=20application-test.yml=EC=9D=84=20=EC=83=9D=EC=84=B1?= =?UTF-8?q?=ED=95=98=EA=B3=A0=20=ED=85=8C=EC=8A=A4=ED=8A=B8=EB=A5=BC=20?= =?UTF-8?q?=EC=8B=A4=ED=96=89=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95(#228)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/build-dev.yml | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build-dev.yml b/.github/workflows/build-dev.yml index 1d47dd9c..27a470cb 100644 --- a/.github/workflows/build-dev.yml +++ b/.github/workflows/build-dev.yml @@ -31,14 +31,18 @@ jobs: # 3) 환경변수 파일 생성 - name: Copy application-local.yml run: | - # application-local.yml 생성 + # application-local.yml, application-test.yml 생성 touch ./src/main/resources/application-local.yml + touch ./src/test/resources/application-test.yml - # application.yaml 파일 값 입력 - echo "${{ secrets.APPLICATION_LOCAL_YML }}" >> ./src/main/resources/application-local.yaml + # application-local.yml, application-test.yml 파일 값 입력 + echo "${{ secrets.APPLICATION_LOCAL_YML }}" >> ./src/main/resources/application-local.yml + echo "${{ secrets.APPLICATION_LOCAL_YML }}" >> ./src/test/resources/application-test.yml - # application.yaml 파일 확인 - cat ./src/main/resources/application-local.yaml + # application-local.yml, application-test.yml 파일 확인 + cat ./src/main/resources/application-local.yml + cat ./src/test/resources/application-test.yml + shell: bash # 이 워크플로우는 gradle build @@ -48,5 +52,5 @@ jobs: - name: Build with Gradle run: | - ./gradlew build -x test + ./gradlew build From 777233d36a938e73ab22cd025ddad5d8aa45be83 Mon Sep 17 00:00:00 2001 From: kseysh Date: Wed, 3 Apr 2024 03:10:46 +0900 Subject: [PATCH 133/141] =?UTF-8?q?fix:=20dev=20=ED=99=98=EA=B2=BD?= =?UTF-8?q?=EC=9D=98=20CD=20=EA=B3=BC=EC=A0=95=EC=97=90=EC=84=9C=20applica?= =?UTF-8?q?tion-test.yml=EC=9D=84=20=EC=83=9D=EC=84=B1=ED=95=98=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=EC=88=98=EC=A0=95=20(#228)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/release-dev-code_deploy.yml | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/.github/workflows/release-dev-code_deploy.yml b/.github/workflows/release-dev-code_deploy.yml index e672e9a3..bc42a9b0 100644 --- a/.github/workflows/release-dev-code_deploy.yml +++ b/.github/workflows/release-dev-code_deploy.yml @@ -5,7 +5,7 @@ on: branches: [ 'dev' ] env: - RESOURCE_PATH: ./src/main/resources/application-local.yaml + RESOURCE_PATH: ./src/main/resources/application-local.yml jobs: build: @@ -28,11 +28,16 @@ jobs: java-version: '17' - name: mkdir resources folder - run: touch ./src/main/resources/application-local.yml + run: | + touch ./src/main/resources/application-local.yml + touch ./src/test/resources/application-test.yml + shell: bash - - name: copy yaml file - run: echo "${{ secrets.APPLICATION_LOCAL_YML }}" > ./src/main/resources/application-local.yml + - name: copy yml file + run: | + echo "${{ secrets.APPLICATION_LOCAL_YML }}" > ./src/main/resources/application-local.yml + echo "${{ secrets.APPLICATION_LOCAL_YML }}" > ./src/test/resources/application-test.yml - name: Grant execute permission for gradlew run: chmod +x gradlew From efbd7d5c92fad2e72f21ad52faf8a2547ab70644 Mon Sep 17 00:00:00 2001 From: kseysh Date: Wed, 3 Apr 2024 03:11:02 +0900 Subject: [PATCH 134/141] =?UTF-8?q?fix:=20prod=20=ED=99=98=EA=B2=BD?= =?UTF-8?q?=EC=9D=98=20CD=20=EA=B3=BC=EC=A0=95=EC=97=90=EC=84=9C=20applica?= =?UTF-8?q?tion-test.yml=EC=9D=84=20=EC=83=9D=EC=84=B1=ED=95=98=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=EC=88=98=EC=A0=95=20(#228)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/release-prod.yml | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/.github/workflows/release-prod.yml b/.github/workflows/release-prod.yml index 3fc5999f..d58d3442 100644 --- a/.github/workflows/release-prod.yml +++ b/.github/workflows/release-prod.yml @@ -6,7 +6,7 @@ on: tags: [ 'makers-app-develop' ] env: - RESOURCE_PATH: ./src/main/resources/application-prod.yaml + RESOURCE_PATH: ./src/main/resources/application-prod.yml jobs: build: @@ -29,11 +29,15 @@ jobs: java-version: '17' - name: mkdir resources folder - run: touch ./src/main/resources/application-prod.yml + run: | + touch ./src/main/resources/application-prod.yml + touch ./src/test/resources/application-test.yml shell: bash - - name: copy yaml file - run: echo "${{ secrets.APPLICATION_YML }}" > ./src/main/resources/application-prod.yml + - name: copy yml file + run: | + echo "${{ secrets.APPLICATION_YML }}" > ./src/main/resources/application-prod.yml + echo "${{ secrets.APPLICATION_YML }}" > ./src/test/resources/application-test.yml - name: Grant execute permission for gradlew run: chmod +x gradlew From d2203f0389794a17a082f6e71ed5450d181f82d2 Mon Sep 17 00:00:00 2001 From: kseysh Date: Fri, 5 Apr 2024 15:51:22 +0900 Subject: [PATCH 135/141] =?UTF-8?q?fix:=20s3=20expiration=20=EC=9E=84?= =?UTF-8?q?=EC=8B=9C=EC=A1=B0=EC=B9=98=EB=A1=9C=2010=EC=8B=9C=EA=B0=84?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EB=B3=80=EA=B2=BD=20(#240)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sopt/app/application/s3/S3Service.java | 44 +++++++++---------- 1 file changed, 21 insertions(+), 23 deletions(-) diff --git a/src/main/java/org/sopt/app/application/s3/S3Service.java b/src/main/java/org/sopt/app/application/s3/S3Service.java index 18c89114..109e1f0f 100644 --- a/src/main/java/org/sopt/app/application/s3/S3Service.java +++ b/src/main/java/org/sopt/app/application/s3/S3Service.java @@ -5,7 +5,6 @@ import com.amazonaws.auth.AWSStaticCredentialsProvider; import com.amazonaws.auth.BasicAWSCredentials; import com.amazonaws.services.s3.AmazonS3; -import com.amazonaws.services.s3.AmazonS3Client; import com.amazonaws.services.s3.AmazonS3ClientBuilder; import com.amazonaws.services.s3.model.CannedAccessControlList; import com.amazonaws.services.s3.model.ObjectMetadata; @@ -18,11 +17,11 @@ import java.util.ArrayList; import java.util.List; import java.util.UUID; -import java.util.stream.Collectors; import javax.annotation.PostConstruct; import lombok.RequiredArgsConstructor; import lombok.val; import org.joda.time.LocalDateTime; +import org.slf4j.LoggerFactory; import org.sopt.app.common.exception.BadRequestException; import org.sopt.app.common.response.ErrorCode; import org.springframework.beans.factory.annotation.Value; @@ -37,12 +36,10 @@ public class S3Service { private final ArrayList imageFileExtension = new ArrayList<>( List.of(".jpg", ".jpeg", ".png", ".JPG", ".JPEG", ".PNG")); - private final AmazonS3 s3Client; - - @Value("${cloud.aws.credentials.accesskey}") + @Value("${cloud.aws.credentials.access-key}") private String accessKey; - @Value("${cloud.aws.credentials.secretkey}") + @Value("${cloud.aws.credentials.secret-key}") private String secretKey; @Value("${cloud.aws.s3.bucket}") @@ -56,11 +53,11 @@ public class S3Service { @PostConstruct - public AmazonS3Client amazonS3Client() { - val awsCredentials = new BasicAWSCredentials(accessKey, secretKey); //accessKey 와 secretKey를 이용하여 자격증명 객체를 얻는다. - return (AmazonS3Client) AmazonS3ClientBuilder.standard() - .withRegion(region) // region 설정 - .withCredentials(new AWSStaticCredentialsProvider(awsCredentials)) // 자격증명을 통해 S3 Client를 가져온다. + public AmazonS3 getAmazonS3() { + val awsCredentials = new BasicAWSCredentials(accessKey, secretKey); + return AmazonS3ClientBuilder.standard() + .withRegion(region) + .withCredentials(new AWSStaticCredentialsProvider(awsCredentials)) .build(); } @@ -72,29 +69,28 @@ public List uploadDeprecated(List multipartFiles) { return multipartFiles.stream().map(file -> { val fileName = createFileName(file.getOriginalFilename()); + val amazonS3 = getAmazonS3(); val objectMetadata = new ObjectMetadata(); objectMetadata.setContentLength(file.getSize()); objectMetadata.setContentType(file.getContentType()); try (InputStream inputStream = file.getInputStream()) { - s3Client.putObject( + amazonS3.putObject( new PutObjectRequest(bucket + "/mainpage/makers-app", fileName, inputStream, objectMetadata) .withCannedAcl(CannedAccessControlList.PublicRead)); - return s3Client.getUrl(bucket + "/mainpage/makers-app", fileName).toString(); + return amazonS3.getUrl(bucket + "/mainpage/makers-app", fileName).toString(); } catch (IOException e) { throw new BadRequestException("요청이 처리 되지 않았습니다."); } - }).collect(Collectors.toList()); + }).toList(); } - // 이미지파일명 중복 방지 private String createFileName(String fileName) { return UUID.randomUUID().toString().concat(getFileExtension(fileName)); } - // 파일 유효성 검사 private String getFileExtension(String fileName) { - if (fileName.length() == 0) { + if (fileName.isEmpty()) { throw new BadRequestException("유효하지 않은 파일명입니다."); } @@ -109,11 +105,13 @@ public S3Info.PreSignedUrl getPreSignedUrl(String folderName) { val now = LocalDateTime.now(); val folderURI = bucket + "/mainpage/makers-app-img/" + folderName; val randomFileName = UUID.randomUUID(); + val amazonS3 = getAmazonS3(); URI uri; try { - uri = this.s3Client.generatePresignedUrl(folderURI, - randomFileName.toString(), now.plusHours(1).toDate(), HttpMethod.PUT).toURI(); + // TODO: EC2와 자바의 시간이 UTC와 KST로 9시간이 차이나 있어 10시간을 더함, 추후 수정 필요 + uri = amazonS3.generatePresignedUrl(folderURI, + randomFileName.toString(), now.plusHours(10).toDate(), HttpMethod.PUT).toURI(); } catch (NullPointerException | URISyntaxException e) { throw new BadRequestException(ErrorCode.PRE_SIGNED_URI_ERROR.getMessage()); } @@ -131,21 +129,21 @@ public S3Info.PreSignedUrl getPreSignedUrl(String folderName) { public void deleteFiles(List fileUrls, String folderName) { val folderURI = bucket + "/mainpage/makers-app-img/" + folderName; val fileNameList = getFileNameList(fileUrls); - fileNameList.stream().forEach(file -> deleteFile(folderURI, file)); + fileNameList.forEach(file -> deleteFile(folderURI, file)); } private List getFileNameList(List fileUrls) { return fileUrls.stream().map(url -> { val fileNameSplit = url.split("/"); return fileNameSplit[fileNameSplit.length - 1]; - }).collect(Collectors.toList()); + }).toList(); } private void deleteFile(String folderURI, String fileName) { try { - s3Client.deleteObject(folderURI, fileName.replace(File.separatorChar, '/')); + this.getAmazonS3().deleteObject(folderURI, fileName.replace(File.separatorChar, '/')); } catch (AmazonServiceException e) { - System.err.println(e.getErrorMessage()); + LoggerFactory.getLogger(S3Service.class).error(e.getErrorMessage()); } } } From f2cd05f3eeaca31c7c1ee5e7da86866da4cd3d9e Mon Sep 17 00:00:00 2001 From: kseysh Date: Fri, 5 Apr 2024 19:27:26 +0900 Subject: [PATCH 136/141] =?UTF-8?q?fix:=20s3=20test=20=EC=8B=A4=ED=8C=A8?= =?UTF-8?q?=20=EC=88=98=EC=A0=95=20(#240)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/org/sopt/app/application/s3/S3Service.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/sopt/app/application/s3/S3Service.java b/src/main/java/org/sopt/app/application/s3/S3Service.java index 109e1f0f..e5867ac1 100644 --- a/src/main/java/org/sopt/app/application/s3/S3Service.java +++ b/src/main/java/org/sopt/app/application/s3/S3Service.java @@ -51,6 +51,8 @@ public class S3Service { @Value("${cloud.aws.s3.uri}") private String baseURI; + private final AmazonS3 amazonS3; + @PostConstruct public AmazonS3 getAmazonS3() { @@ -69,7 +71,6 @@ public List uploadDeprecated(List multipartFiles) { return multipartFiles.stream().map(file -> { val fileName = createFileName(file.getOriginalFilename()); - val amazonS3 = getAmazonS3(); val objectMetadata = new ObjectMetadata(); objectMetadata.setContentLength(file.getSize()); objectMetadata.setContentType(file.getContentType()); @@ -105,7 +106,6 @@ public S3Info.PreSignedUrl getPreSignedUrl(String folderName) { val now = LocalDateTime.now(); val folderURI = bucket + "/mainpage/makers-app-img/" + folderName; val randomFileName = UUID.randomUUID(); - val amazonS3 = getAmazonS3(); URI uri; try { @@ -141,7 +141,7 @@ private List getFileNameList(List fileUrls) { private void deleteFile(String folderURI, String fileName) { try { - this.getAmazonS3().deleteObject(folderURI, fileName.replace(File.separatorChar, '/')); + amazonS3.deleteObject(folderURI, fileName.replace(File.separatorChar, '/')); } catch (AmazonServiceException e) { LoggerFactory.getLogger(S3Service.class).error(e.getErrorMessage()); } From d2b8512923c98fa6b9b97e64e016784b41eee389 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A3=BC=EC=96=B4=EC=A7=84=EC=82=AC=EB=9E=91=28eojinjoo?= =?UTF-8?q?=29?= Date: Tue, 9 Apr 2024 00:08:56 +0900 Subject: [PATCH 137/141] =?UTF-8?q?fix:=20=EC=8A=A4=ED=83=AC=ED=94=84=20?= =?UTF-8?q?=EB=93=B1=EB=A1=9D=EC=8B=9C=EA=B0=84=20String=EC=9C=BC=EB=A1=9C?= =?UTF-8?q?=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sopt/app/application/stamp/StampInfo.java | 4 +++- .../java/org/sopt/app/domain/entity/Stamp.java | 17 ++++++++++------- .../app/presentation/stamp/StampRequest.java | 9 ++++----- .../app/presentation/stamp/StampResponse.java | 4 ++-- 4 files changed, 19 insertions(+), 15 deletions(-) diff --git a/src/main/java/org/sopt/app/application/stamp/StampInfo.java b/src/main/java/org/sopt/app/application/stamp/StampInfo.java index 96ca48ee..11f186ef 100644 --- a/src/main/java/org/sopt/app/application/stamp/StampInfo.java +++ b/src/main/java/org/sopt/app/application/stamp/StampInfo.java @@ -7,16 +7,18 @@ import lombok.ToString; public class StampInfo { + @Getter @Builder @ToString public static class Stamp { + private Long id; private String contents; private List images; private Long userId; private Long missionId; - private LocalDateTime activityDate; + private String activityDate; private LocalDateTime createdAt; private LocalDateTime updatedAt; } diff --git a/src/main/java/org/sopt/app/domain/entity/Stamp.java b/src/main/java/org/sopt/app/domain/entity/Stamp.java index 26c9639c..1b5eca14 100644 --- a/src/main/java/org/sopt/app/domain/entity/Stamp.java +++ b/src/main/java/org/sopt/app/domain/entity/Stamp.java @@ -2,7 +2,13 @@ import com.vladmihalcea.hibernate.type.array.ListArrayType; -import java.time.LocalDateTime; +import java.util.List; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; @@ -10,9 +16,6 @@ import org.hibernate.annotations.Type; import org.hibernate.annotations.TypeDef; -import javax.persistence.*; -import java.util.List; - @Entity @Table(name = "stamp", schema = "app_dev") @TypeDef( @@ -44,8 +47,8 @@ public class Stamp extends BaseEntity { @Column private Long missionId; - @Column - private LocalDateTime activityDate; + @Column(length = 10) + private String activityDate; public void changeContents(String contents) { this.contents = contents; @@ -55,7 +58,7 @@ public void changeImages(List images) { this.images = images; } - public void changeActivityDate(LocalDateTime activityDate) { + public void changeActivityDate(String activityDate) { this.activityDate = activityDate; } } diff --git a/src/main/java/org/sopt/app/presentation/stamp/StampRequest.java b/src/main/java/org/sopt/app/presentation/stamp/StampRequest.java index 286395a0..7c45fd61 100644 --- a/src/main/java/org/sopt/app/presentation/stamp/StampRequest.java +++ b/src/main/java/org/sopt/app/presentation/stamp/StampRequest.java @@ -1,7 +1,6 @@ package org.sopt.app.presentation.stamp; import io.swagger.v3.oas.annotations.media.Schema; -import java.time.LocalDateTime; import javax.validation.constraints.NotNull; import lombok.Getter; import lombok.Setter; @@ -36,9 +35,9 @@ public static class RegisterStampRequest { @Schema(description = "스탬프 내용", example = "스탬프 찍었다!") @NotNull(message = "contents may not be null") private String contents; - @Schema(description = "활동 날짜", example = "2023-03-29T18:39:42.106369") + @Schema(description = "활동 날짜", example = "2024.04.08") @NotNull(message = "activity date may not be null") - private LocalDateTime activityDate; + private String activityDate; } @Getter @@ -55,8 +54,8 @@ public static class EditStampRequest { @Schema(description = "스탬프 내용", example = "스탬프 찍었다!") @NotNull(message = "contents may not be null") private String contents; - @Schema(description = "활동 날짜", example = "2023-03-29T18:39:42.106369") + @Schema(description = "활동 날짜", example = "2024.04.08") @NotNull(message = "activity date may not be null") - private LocalDateTime activityDate; + private String activityDate; } } diff --git a/src/main/java/org/sopt/app/presentation/stamp/StampResponse.java b/src/main/java/org/sopt/app/presentation/stamp/StampResponse.java index 65771e89..c2042aef 100644 --- a/src/main/java/org/sopt/app/presentation/stamp/StampResponse.java +++ b/src/main/java/org/sopt/app/presentation/stamp/StampResponse.java @@ -20,8 +20,8 @@ public static class StampMain { private String contents; @Schema(description = "스탬프 이미지", example = "[https://s3.ap-northeast-2.amazonaws.com/example/283aab53-22e3-46da-85ec-146c99f82ed4.jpeg]") private List images; - @Schema(description = "활동 날짜", example = "2023-03-29T18:39:42.106369") - private LocalDateTime activityDate; + @Schema(description = "활동 날짜", example = "2024.04.08") + private String activityDate; @Schema(description = "스탬프 생성 일시", example = "2023-03-29T18:39:42.106369") private LocalDateTime createdAt; @Schema(description = "스탬프 수정 일시", example = "2023-03-29T18:39:42.106369") From de5b9942f05ca9239716a8ddedfa17468eec2fba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A3=BC=EC=96=B4=EC=A7=84=EC=82=AC=EB=9E=91=28eojinjoo?= =?UTF-8?q?=29?= Date: Tue, 9 Apr 2024 00:14:28 +0900 Subject: [PATCH 138/141] =?UTF-8?q?fix:=20=EC=8A=A4=ED=83=AC=ED=94=84=20?= =?UTF-8?q?=EB=93=B1=EB=A1=9D=EC=8B=9C=EA=B0=84=20String=EC=9C=BC=EB=A1=9C?= =?UTF-8?q?=20=EB=B3=80=EA=B2=BD=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sopt/app/application/StampServiceTest.java | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/test/java/org/sopt/app/application/StampServiceTest.java b/src/test/java/org/sopt/app/application/StampServiceTest.java index 081faa69..1f91a5f8 100644 --- a/src/test/java/org/sopt/app/application/StampServiceTest.java +++ b/src/test/java/org/sopt/app/application/StampServiceTest.java @@ -203,7 +203,7 @@ private Stamp getSavedStamp(Long missionId, Long requestUserId) { final Long stampId = 1L; final String contents = "savedContents"; final List images = List.of("savedImage"); - final LocalDateTime activityDate = LocalDateTime.of(2023, 1, 1, 0, 0, 0); + final String activityDate = "2024.04.08"; final Optional savedStamp = Optional.of(Stamp.builder() .id(stampId) @@ -219,7 +219,8 @@ private Stamp getSavedStamp(Long missionId, Long requestUserId) { return savedStamp.get(); } - private StampInfo.Stamp editStamp(Stamp oldStamp, StampRequest.EditStampRequest editStampRequest, boolean isDeprecatedEditStampContents) { + private StampInfo.Stamp editStamp(Stamp oldStamp, StampRequest.EditStampRequest editStampRequest, + boolean isDeprecatedEditStampContents) { if (!isDeprecatedEditStampContents && StringUtils.hasText(editStampRequest.getContents())) { oldStamp.changeContents(editStampRequest.getContents()); } @@ -278,7 +279,7 @@ void SUCCESS_editStampContents() { final Long requestMissionId = anyLong(); final String requestContents = "requestContents"; final String requestImage = "requestImage"; - final LocalDateTime requestActivityDate = LocalDateTime.now(); + final String requestActivityDate = "2024.04.08"; StampRequest.EditStampRequest editStampRequest = new StampRequest.EditStampRequest(); editStampRequest.setContents(requestContents); @@ -288,7 +289,7 @@ void SUCCESS_editStampContents() { //when Stamp oldStamp = getSavedStamp(requestMissionId, requestUserId); - editStamp(oldStamp, editStampRequest,false); + editStamp(oldStamp, editStampRequest, false); StampInfo.Stamp result = stampService.editStampContents(editStampRequest, requestUserId); //then @@ -304,7 +305,8 @@ void SUCCESS_editStampContentsNoContents() { final String requestBlankContents = ""; final String requestImage = "requestImage"; - final LocalDateTime requestActivityDate = LocalDateTime.now(); + final String requestActivityDate = "2024.04.08"; + StampRequest.EditStampRequest editStampRequest = new StampRequest.EditStampRequest(); editStampRequest.setContents(requestBlankContents); editStampRequest.setImage(requestImage); @@ -328,7 +330,7 @@ void SUCCESS_editStampContentsNoImage() { final Long requestMissionId = anyLong(); final String requestContents = "requestContents"; final String requestBlankImage = ""; - final LocalDateTime requestActivityDate = LocalDateTime.now(); + final String requestActivityDate = "2024.04.08"; StampRequest.EditStampRequest editStampRequest = new StampRequest.EditStampRequest(); editStampRequest.setContents(requestContents); @@ -449,7 +451,8 @@ void FAIL_checkDuplicateStamp() { final Long anyMissionId = anyLong(); //when - Mockito.when(stampRepository.findByUserIdAndMissionId(anyUserId, anyMissionId)).thenReturn(Optional.of(new Stamp())); + Mockito.when(stampRepository.findByUserIdAndMissionId(anyUserId, anyMissionId)) + .thenReturn(Optional.of(new Stamp())); //then Assertions.assertThrows(BadRequestException.class, () -> { From d66a7963d469d1091705f10b369c66f04386f21c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A3=BC=EC=96=B4=EC=A7=84=EC=82=AC=EB=9E=91=28eojinjoo?= =?UTF-8?q?=29?= Date: Tue, 9 Apr 2024 00:19:36 +0900 Subject: [PATCH 139/141] =?UTF-8?q?fix:=20SUCCESS=5F=EB=AA=A8=EB=93=A0=20?= =?UTF-8?q?=EC=9C=A0=EC=A0=80=EC=9D=98=20=EC=9C=A0=EC=A0=80=20=EC=95=84?= =?UTF-8?q?=EC=9D=B4=EB=94=94=20=EC=B0=BE=EA=B8=B0=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/interfaces/postgres/UserRepositoryTest.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/test/java/org/sopt/app/interfaces/postgres/UserRepositoryTest.java b/src/test/java/org/sopt/app/interfaces/postgres/UserRepositoryTest.java index 2e84d51f..710a0732 100644 --- a/src/test/java/org/sopt/app/interfaces/postgres/UserRepositoryTest.java +++ b/src/test/java/org/sopt/app/interfaces/postgres/UserRepositoryTest.java @@ -19,22 +19,23 @@ @Import(QuerydslConfiguration.class) class UserRepositoryTest { - @Autowired - private UserRepository userRepository; - User user1 = new User(); User user2 = new User(); + @Autowired + private UserRepository userRepository; @BeforeEach void beforeTest() { user1 = userRepository.save( User.builder() + .id(1L) .playgroundId(generateUniquePlaygroundId()) .build() ); user2 = userRepository.save( User.builder() + .id(2L) .playgroundId(generateUniquePlaygroundId()) .build() ); @@ -82,7 +83,8 @@ void SUCCESS_findAllIdByPlaygroundIdIn() { final List playgroundIds = List.of(user1.getPlaygroundId(), user2.getPlaygroundId()); //then - Assertions.assertEquals(List.of(user1.getId(), user2.getId()), userRepository.findAllIdByPlaygroundIdIn(playgroundIds)); + Assertions.assertEquals(List.of(user1.getId(), user2.getId()), + userRepository.findAllIdByPlaygroundIdIn(playgroundIds)); } From 833d5125e8f3dbe33974764751f9f53fac968b93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A3=BC=EC=96=B4=EC=A7=84=EC=82=AC=EB=9E=91=28eojinjoo?= =?UTF-8?q?=29?= Date: Sun, 14 Apr 2024 16:42:22 +0900 Subject: [PATCH 140/141] =?UTF-8?q?feat:=20=EC=95=B1=EC=84=9C=EB=B9=84?= =?UTF-8?q?=EC=8A=A4=20=EB=8F=84=EB=A9=94=EC=9D=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sopt/app/domain/entity/AppService.java | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 src/main/java/org/sopt/app/domain/entity/AppService.java diff --git a/src/main/java/org/sopt/app/domain/entity/AppService.java b/src/main/java/org/sopt/app/domain/entity/AppService.java new file mode 100644 index 00000000..d8134dfd --- /dev/null +++ b/src/main/java/org/sopt/app/domain/entity/AppService.java @@ -0,0 +1,37 @@ +package org.sopt.app.domain.entity; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@Entity +@Table(name = "app_service", schema = "app_dev") +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class AppService extends BaseEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id", nullable = false) + private Long id; + + @Column(name = "service_name", nullable = false) + private String serviceName; + + @Column(name = "active_user", nullable = false) + private Boolean activeUser; + + @Column(name = "inactive_user", nullable = false) + private Boolean inactiveUser; +} From 5e5a203924b3c72fe0c6e7747044dbad651d425c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A3=BC=EC=96=B4=EC=A7=84=EC=82=AC=EB=9E=91=28eojinjoo?= =?UTF-8?q?=29?= Date: Sun, 14 Apr 2024 17:09:37 +0900 Subject: [PATCH 141/141] =?UTF-8?q?feat:=20=EC=95=B1=EC=84=9C=EB=B9=84?= =?UTF-8?q?=EC=8A=A4=20flag=20API=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/service/AppServiceInfo.java | 19 ++++++++++++++ .../service/AppServiceService.java | 26 +++++++++++++++++++ .../java/org/sopt/app/facade/UserFacade.java | 10 +++++++ .../postgres/AppServiceRepository.java | 8 ++++++ .../user/UserOriginalController.java | 22 ++++++++++++---- .../app/presentation/user/UserResponse.java | 16 +++++++++++- .../presentation/user/UserResponseMapper.java | 7 ++--- 7 files changed, 99 insertions(+), 9 deletions(-) create mode 100644 src/main/java/org/sopt/app/application/service/AppServiceInfo.java create mode 100644 src/main/java/org/sopt/app/application/service/AppServiceService.java create mode 100644 src/main/java/org/sopt/app/interfaces/postgres/AppServiceRepository.java diff --git a/src/main/java/org/sopt/app/application/service/AppServiceInfo.java b/src/main/java/org/sopt/app/application/service/AppServiceInfo.java new file mode 100644 index 00000000..f1136958 --- /dev/null +++ b/src/main/java/org/sopt/app/application/service/AppServiceInfo.java @@ -0,0 +1,19 @@ +package org.sopt.app.application.service; + +import lombok.Builder; +import lombok.Getter; +import lombok.ToString; + +public class AppServiceInfo { + + @Getter + @Builder + @ToString + public static class AppService { + + private String serviceName; + private Boolean activeUser; + private Boolean inactiveUser; + + } +} diff --git a/src/main/java/org/sopt/app/application/service/AppServiceService.java b/src/main/java/org/sopt/app/application/service/AppServiceService.java new file mode 100644 index 00000000..0699903f --- /dev/null +++ b/src/main/java/org/sopt/app/application/service/AppServiceService.java @@ -0,0 +1,26 @@ +package org.sopt.app.application.service; + +import java.util.List; +import java.util.stream.Collectors; +import lombok.RequiredArgsConstructor; +import lombok.val; +import org.sopt.app.interfaces.postgres.AppServiceRepository; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class AppServiceService { + + private final AppServiceRepository appServiceRepository; + + public List getAllAppService() { + val appServiceList = appServiceRepository.findAll(); + return appServiceList.stream() + .map(appService -> AppServiceInfo.AppService.builder() + .serviceName(appService.getServiceName()) + .activeUser(appService.getActiveUser()) + .inactiveUser(appService.getInactiveUser()) + .build()) + .collect(Collectors.toList()); + } +} diff --git a/src/main/java/org/sopt/app/facade/UserFacade.java b/src/main/java/org/sopt/app/facade/UserFacade.java index 04c60bd9..0aa52310 100644 --- a/src/main/java/org/sopt/app/facade/UserFacade.java +++ b/src/main/java/org/sopt/app/facade/UserFacade.java @@ -1,11 +1,14 @@ package org.sopt.app.facade; +import java.util.List; import lombok.RequiredArgsConstructor; import lombok.val; import org.sopt.app.application.auth.PlaygroundAuthService; import org.sopt.app.application.notification.NotificationService; import org.sopt.app.application.operation.OperationInfo; +import org.sopt.app.application.service.AppServiceService; import org.sopt.app.domain.entity.User; +import org.sopt.app.presentation.user.UserResponse.AppService; import org.sopt.app.presentation.user.UserResponse.MainView; import org.sopt.app.presentation.user.UserResponseMapper; import org.springframework.stereotype.Service; @@ -17,6 +20,7 @@ public class UserFacade { private final PlaygroundAuthService playgroundAuthService; private final NotificationService notificationService; + private final AppServiceService appServiceService; private final UserResponseMapper userResponseMapper; @Transactional(readOnly = true) @@ -26,4 +30,10 @@ public MainView getMainViewInfo(User user) { val mainViewNotification = notificationService.getNotificationConfirmStatus(user); return userResponseMapper.ofMainView(mainViewUser, dummyOperation, mainViewNotification); } + + @Transactional(readOnly = true) + public List getAppServiceInfo() { + val appServiceList = appServiceService.getAllAppService(); + return userResponseMapper.ofAppServiceList(appServiceList); + } } diff --git a/src/main/java/org/sopt/app/interfaces/postgres/AppServiceRepository.java b/src/main/java/org/sopt/app/interfaces/postgres/AppServiceRepository.java new file mode 100644 index 00000000..b56fc540 --- /dev/null +++ b/src/main/java/org/sopt/app/interfaces/postgres/AppServiceRepository.java @@ -0,0 +1,8 @@ +package org.sopt.app.interfaces.postgres; + +import org.sopt.app.domain.entity.AppService; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface AppServiceRepository extends JpaRepository { + +} diff --git a/src/main/java/org/sopt/app/presentation/user/UserOriginalController.java b/src/main/java/org/sopt/app/presentation/user/UserOriginalController.java index e7719f06..74a98d51 100644 --- a/src/main/java/org/sopt/app/presentation/user/UserOriginalController.java +++ b/src/main/java/org/sopt/app/presentation/user/UserOriginalController.java @@ -5,19 +5,17 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import java.util.List; import lombok.RequiredArgsConstructor; import lombok.val; import org.sopt.app.application.auth.PlaygroundAuthService; -import org.sopt.app.application.notification.NotificationService; -import org.sopt.app.application.operation.OperationInfo; -import org.sopt.app.application.operation.OperationService; import org.sopt.app.domain.entity.User; import org.sopt.app.facade.UserFacade; +import org.sopt.app.presentation.user.UserResponse.AppService; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestHeader; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -57,8 +55,22 @@ public ResponseEntity getGenerationInfo( @AuthenticationPrincipal User user ) { val generationUser = playgroundAuthService.getPlaygroundUserActiveInfo( - user.getPlaygroundToken()); + user.getPlaygroundToken()); val response = userResponseMapper.ofGeneration(generationUser); return ResponseEntity.status(HttpStatus.OK).body(response); } + + @Operation(summary = "앱 서비스 조회") + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "success"), + @ApiResponse(responseCode = "400", description = "no playground, operation profile", content = @Content), + @ApiResponse(responseCode = "500", description = "server error", content = @Content) + }) + @GetMapping(value = "/app-service") + public ResponseEntity> getAppServiceInfo( + @AuthenticationPrincipal User user + ) { + val response = userFacade.getAppServiceInfo(); + return ResponseEntity.status(HttpStatus.OK).body(response); + } } diff --git a/src/main/java/org/sopt/app/presentation/user/UserResponse.java b/src/main/java/org/sopt/app/presentation/user/UserResponse.java index 8c8e773a..611a1bc0 100644 --- a/src/main/java/org/sopt/app/presentation/user/UserResponse.java +++ b/src/main/java/org/sopt/app/presentation/user/UserResponse.java @@ -103,14 +103,28 @@ public static class IsOptIn { } - @Getter @Builder @ToString public static class Generation { + @Schema(description = "현재 솝트 기수", example = "33") private Long currentGeneration; @Schema(description = "활동/비활동/비회원 분기 처리", example = "ACTIVE") private String status; } + + @Getter + @Builder + @ToString + public static class AppService { + + @Schema(description = "앱 서비스 네임", example = "SOPTAMP/POKE") + private String serviceName; + @Schema(description = "활동 기수 유저", example = "true") + private Boolean activeUser; + @Schema(description = "비활동 기수 유저", example = "false") + private Boolean inactiveUser; + + } } diff --git a/src/main/java/org/sopt/app/presentation/user/UserResponseMapper.java b/src/main/java/org/sopt/app/presentation/user/UserResponseMapper.java index 113bb58c..bb98cdc9 100644 --- a/src/main/java/org/sopt/app/presentation/user/UserResponseMapper.java +++ b/src/main/java/org/sopt/app/presentation/user/UserResponseMapper.java @@ -1,12 +1,15 @@ package org.sopt.app.presentation.user; +import java.util.List; import org.mapstruct.InjectionStrategy; import org.mapstruct.Mapper; import org.mapstruct.ReportingPolicy; import org.sopt.app.application.auth.PlaygroundAuthInfo; import org.sopt.app.application.operation.OperationInfo; +import org.sopt.app.application.service.AppServiceInfo; import org.sopt.app.application.user.UserInfo; import org.sopt.app.domain.entity.User; +import org.sopt.app.presentation.user.UserResponse.AppService; @Mapper( componentModel = "spring", @@ -23,10 +26,8 @@ UserResponse.MainView ofMainView(PlaygroundAuthInfo.MainView user, OperationInfo UserResponse.Nickname of(UserInfo.Nickname nickname); UserResponse.ProfileMessage of(UserInfo.ProfileMessage profileMessage); - - - UserResponse.Generation ofGeneration(PlaygroundAuthInfo.UserActiveInfo userActiveInfo); + List ofAppServiceList(List appServiceList); }