From 8df3912fbb0025ec16f1c2b6c9e74859989c3a68 Mon Sep 17 00:00:00 2001 From: jaeuk520 Date: Sat, 4 May 2024 17:38:14 +0900 Subject: [PATCH] feat: test code --- .../java/hibuy/server/domain/DateCount.java | 3 +- .../dto/address/PostAddressRequest.java | 2 + .../dto/dailyTake/PostDailyTakeRequest.java | 2 + .../server/dto/sample/PostSampleRequest.java | 2 + .../server/service/DateCountService.java | 5 +- .../hibuy/server/service/SampleService.java | 6 +- .../controller/AddressControllerTest.java | 142 ++++++++++++++++++ .../controller/DailyTakeControllerTest.java | 81 ++++++++++ .../controller/DateCountControllerTest.java | 72 +++++++++ .../controller/SampleControllerTest.java | 116 ++++++++++++++ .../hibuy/server/domain/DateCountTest.java | 54 +++++++ .../repository/DailyTakeRepositoryTest.java | 75 +++++++++ .../repository/DateCountRepositoryTest.java | 44 ++++++ .../server/repository/UserRepositoryTest.java | 42 ++++++ .../server/service/DailyTakeServiceTest.java | 127 ++++++++++++++++ .../server/service/DateCountServiceTest.java | 113 ++++++++++++++ .../server/service/SampleServiceTest.java | 89 +++++++++++ 17 files changed, 968 insertions(+), 7 deletions(-) create mode 100644 src/test/java/hibuy/server/controller/AddressControllerTest.java create mode 100644 src/test/java/hibuy/server/controller/DailyTakeControllerTest.java create mode 100644 src/test/java/hibuy/server/controller/DateCountControllerTest.java create mode 100644 src/test/java/hibuy/server/controller/SampleControllerTest.java create mode 100644 src/test/java/hibuy/server/domain/DateCountTest.java create mode 100644 src/test/java/hibuy/server/repository/DailyTakeRepositoryTest.java create mode 100644 src/test/java/hibuy/server/repository/DateCountRepositoryTest.java create mode 100644 src/test/java/hibuy/server/repository/UserRepositoryTest.java create mode 100644 src/test/java/hibuy/server/service/DailyTakeServiceTest.java create mode 100644 src/test/java/hibuy/server/service/DateCountServiceTest.java create mode 100644 src/test/java/hibuy/server/service/SampleServiceTest.java diff --git a/src/main/java/hibuy/server/domain/DateCount.java b/src/main/java/hibuy/server/domain/DateCount.java index 8364fd5..0a37f56 100644 --- a/src/main/java/hibuy/server/domain/DateCount.java +++ b/src/main/java/hibuy/server/domain/DateCount.java @@ -29,10 +29,11 @@ public DateCount(User user) { this.status = Status.ACTIVE; } - public void increaseDateCount() { + public int increaseDateCount() { this.dateCount += 1; if(this.dateCount == 151) { this.dateCount = 1; } + return this.dateCount; } } diff --git a/src/main/java/hibuy/server/dto/address/PostAddressRequest.java b/src/main/java/hibuy/server/dto/address/PostAddressRequest.java index a0e6821..235b8a6 100644 --- a/src/main/java/hibuy/server/dto/address/PostAddressRequest.java +++ b/src/main/java/hibuy/server/dto/address/PostAddressRequest.java @@ -5,10 +5,12 @@ import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.Pattern; import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Getter; @Getter @AllArgsConstructor +@Builder public class PostAddressRequest { public static final String PHONE_NUMBER_REGEX = "^010\\d{8}$"; diff --git a/src/main/java/hibuy/server/dto/dailyTake/PostDailyTakeRequest.java b/src/main/java/hibuy/server/dto/dailyTake/PostDailyTakeRequest.java index def6149..35f2ef6 100644 --- a/src/main/java/hibuy/server/dto/dailyTake/PostDailyTakeRequest.java +++ b/src/main/java/hibuy/server/dto/dailyTake/PostDailyTakeRequest.java @@ -1,5 +1,6 @@ package hibuy.server.dto.dailyTake; +import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; @@ -8,6 +9,7 @@ @Getter @Setter @NoArgsConstructor +@AllArgsConstructor public class PostDailyTakeRequest { private Date date; } diff --git a/src/main/java/hibuy/server/dto/sample/PostSampleRequest.java b/src/main/java/hibuy/server/dto/sample/PostSampleRequest.java index 1dfcbcf..e20811d 100644 --- a/src/main/java/hibuy/server/dto/sample/PostSampleRequest.java +++ b/src/main/java/hibuy/server/dto/sample/PostSampleRequest.java @@ -1,6 +1,7 @@ package hibuy.server.dto.sample; import hibuy.server.domain.Sample; +import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; @@ -8,6 +9,7 @@ @Getter @Setter @NoArgsConstructor +@AllArgsConstructor public class PostSampleRequest { private String productName; diff --git a/src/main/java/hibuy/server/service/DateCountService.java b/src/main/java/hibuy/server/service/DateCountService.java index 4e61b94..fbb29be 100644 --- a/src/main/java/hibuy/server/service/DateCountService.java +++ b/src/main/java/hibuy/server/service/DateCountService.java @@ -28,14 +28,13 @@ public GetDateCountResponse getUserDateCount(Long userId) { } @Transactional - public void updateUserDateCount(Long userId) { + public int updateUserDateCount(Long userId) { log.debug("[PatchDateCountResponse.updateUserDateCount]"); DateCount dateCount = dateCountRepository.findDateCountByUserId(userId) .orElseThrow(NotFoundDateCountException::new); - dateCount.increaseDateCount(); - + return dateCount.increaseDateCount(); } } diff --git a/src/main/java/hibuy/server/service/SampleService.java b/src/main/java/hibuy/server/service/SampleService.java index b4428fc..cf444ac 100644 --- a/src/main/java/hibuy/server/service/SampleService.java +++ b/src/main/java/hibuy/server/service/SampleService.java @@ -17,14 +17,15 @@ public class SampleService { private final SampleRepository sampleRepository; - public void addSample(PostSampleRequest postSampleRequest) { + public Long addSample(PostSampleRequest postSampleRequest) { log.debug("[SampleService.addSample]"); Sample sample = postSampleRequest.toEntity(); - sampleRepository.save(sample); + Sample save = sampleRepository.save(sample); + return save.getSampleId(); } public List getSamples() { @@ -33,6 +34,5 @@ public List getSamples() { return sampleRepository.findAll().stream() .map(GetSampleResponse::new).toList(); - } } diff --git a/src/test/java/hibuy/server/controller/AddressControllerTest.java b/src/test/java/hibuy/server/controller/AddressControllerTest.java new file mode 100644 index 0000000..c038d57 --- /dev/null +++ b/src/test/java/hibuy/server/controller/AddressControllerTest.java @@ -0,0 +1,142 @@ +package hibuy.server.controller; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import hibuy.server.domain.Address; +import hibuy.server.domain.User; +import hibuy.server.dto.address.*; +import hibuy.server.service.AddressService; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.mockito.BDDMockito; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.BDDMockito.*; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@WebMvcTest(controllers = AddressController.class) +class AddressControllerTest { + + @Autowired + AddressController addressController; + @Autowired + MockMvc mockMvc; + @Autowired + ObjectMapper objectMapper; + @MockBean + AddressService addressService; + + @DisplayName("주소를 등록한다.") + @Test + void addAddress() throws Exception { + //given + Long userId = 1L; + PostAddressRequest request = + PostAddressRequest.builder() + .addressName("학교") + .receiver("김건국") + .phoneNumber("01012341234") + .zipCode("08521") + .basicAddress("서울시 광진구") + .detailAddress("신공학관 12층") + .defaultAddress(false) + .request("요청사항 없음") + .userId(userId) + .build(); + + //when //then + mockMvc.perform( + post("/address") + .content(objectMapper.writeValueAsString(request)) + .contentType(MediaType.APPLICATION_JSON) + ) + .andDo(print()) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.code").value(1000)) + .andExpect(jsonPath("$.status").value(200)) + .andExpect(jsonPath("$.message").value("요청에 성공하였습니다.")); + } + + @DisplayName("주소를 조회 결과를 가져온다.") + @Test + void getAddressList() throws Exception { + //given + Long userId = 1L; + User user = User.builder() + .kakaoUserId(1L) + .email("abcd123@naver.com") + .name("김철수") + .phoneNumber("01012341234") + .build(); + + GetAddressListResponse response = new GetAddressListResponse( + List.of( + new AddressDTO(Address.builder() + .addressName("학교") + .receiver("김철수") + .phoneNumber("01012341234") + .zipCode("08521") + .basicAddress("서울시 광진구") + .detailAddress("신공학관 12층") + .defaultAddress(false) + .request("요청사항 없음") + .user(user) + .build() + ) + ) + ); + + given(addressService.getAddressListById(userId)).willReturn(response); + + //when //then + mockMvc.perform( + get("/address") + .param("userId", userId.toString()) + ) + .andDo(print()) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.code").value(1000)) + .andExpect(jsonPath("$.status").value(200)) + .andExpect(jsonPath("$.message").value("요청에 성공하였습니다.")) + .andExpect(jsonPath("$.result.addresses[0].addressName").value("학교")) + .andExpect(jsonPath("$.result.addresses[0].receiver").value("김철수")) + .andExpect(jsonPath("$.result.addresses[0].phoneNumber").value("01012341234")) + .andExpect(jsonPath("$.result.addresses[0].basicAddress").value("서울시 광진구")) + .andExpect(jsonPath("$.result.addresses[0].detailAddress").value("신공학관 12층")) + .andExpect(jsonPath("$.result.addresses[0].request").value("요청사항 없음")) + .andExpect(jsonPath("$.result.addresses[0].defaultAddress").value(false)); + } + + @DisplayName("기본 주소로 등록한다.") + @Test + void updateDefaultAddress() throws Exception { + //given + Long addressId = 1L; + Long userId = 1L; + PatchAddressResponse response = new PatchAddressResponse(addressId); + PatchAddressRequest request = new PatchAddressRequest(addressId, userId, "요청사항 없음"); + given(addressService.updateDefaultAddress(request)).willReturn(response); + + //when //then + mockMvc.perform( + patch("/address") + .content(objectMapper.writeValueAsString(request)) + .contentType(MediaType.APPLICATION_JSON) + ).andDo(print()) + .andDo(print()) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.code").value(1000)) + .andExpect(jsonPath("$.status").value(200)) + .andExpect(jsonPath("$.message").value("요청에 성공하였습니다.")); + } +} \ No newline at end of file diff --git a/src/test/java/hibuy/server/controller/DailyTakeControllerTest.java b/src/test/java/hibuy/server/controller/DailyTakeControllerTest.java new file mode 100644 index 0000000..07dfbdc --- /dev/null +++ b/src/test/java/hibuy/server/controller/DailyTakeControllerTest.java @@ -0,0 +1,81 @@ +package hibuy.server.controller; + +import com.fasterxml.jackson.databind.ObjectMapper; +import hibuy.server.dto.dailyTake.GetMonthlyTakeResponse; +import hibuy.server.dto.dailyTake.PostDailyTakeRequest; +import hibuy.server.service.DailyTakeService; +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.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; + +import java.sql.Date; +import java.util.List; + +import static org.mockito.BDDMockito.*; +import static org.springframework.http.HttpStatus.*; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@WebMvcTest(controllers = DailyTakeController.class) +class DailyTakeControllerTest { + + @Autowired DailyTakeController dailyTakeController; + @Autowired MockMvc mockMvc; + @Autowired ObjectMapper objectMapper; + @MockBean DailyTakeService dailyTakeService; + + @DisplayName("월별 조회 여부를 확인한다.") + @Test + void getMonthlyTake() throws Exception { + //given + Long userId = 1L; + String year = "2024"; + String month = "04"; + GetMonthlyTakeResponse response = new GetMonthlyTakeResponse( + List.of(Date.valueOf("2024-04-01"), Date.valueOf("2024-04-02")) + ); + given(dailyTakeService.getMonthlyTake(userId, year, month)).willReturn(response); + + + //when //then + mockMvc.perform( + get("/users/{userId}/daily-take", userId) + .param("year", year) + .param("month", month) + ) + .andDo(print()) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.code").value(1000)) + .andExpect(jsonPath("$.status").value(200)) + .andExpect(jsonPath("$.message").value("요청에 성공하였습니다.")) + .andExpect(jsonPath("$.result.intakeDate[0]").value("2024-04-01")) + .andExpect(jsonPath("$.result.intakeDate[1]").value("2024-04-02")); + } + + @DisplayName("일일 섭취여부를 추가한다.") + @Test + void addDailyTake() throws Exception { + //given + Long userId = 1L; + PostDailyTakeRequest request = new PostDailyTakeRequest(Date.valueOf("2024-04-05")); + + //when //then + mockMvc.perform( + post("/users/{userId}/daily-take", userId) + .content(objectMapper.writeValueAsString(request)) + .contentType(MediaType.APPLICATION_JSON) + ) + .andDo(print()) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.code").value(1000)) + .andExpect(jsonPath("$.status").value(200)) + .andExpect(jsonPath("$.message").value("요청에 성공하였습니다.")); + } +} \ No newline at end of file diff --git a/src/test/java/hibuy/server/controller/DateCountControllerTest.java b/src/test/java/hibuy/server/controller/DateCountControllerTest.java new file mode 100644 index 0000000..ee050b6 --- /dev/null +++ b/src/test/java/hibuy/server/controller/DateCountControllerTest.java @@ -0,0 +1,72 @@ +package hibuy.server.controller; + +import hibuy.server.domain.DateCount; +import hibuy.server.domain.User; +import hibuy.server.dto.dateCount.GetDateCountResponse; +import hibuy.server.service.DateCountService; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.mockito.BDDMockito; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.web.servlet.MockMvc; + +import static org.mockito.BDDMockito.*; +import static org.springframework.http.HttpStatus.OK; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.patch; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@WebMvcTest(controllers = DateCountController.class) +class DateCountControllerTest { + + @Autowired DateCountController dateCountController; + @Autowired MockMvc mockMvc; + @MockBean DateCountService dateCountService; + + @DisplayName("누적 일수를 조회한다.") + @Test + void getUserDateCount() throws Exception { + //given + Long userId = 1L; + User user = User.builder() + .kakaoUserId(1L) + .email("abcd123@naver.com") + .name("김철수") + .phoneNumber("01012341234") + .build(); + GetDateCountResponse response = GetDateCountResponse.of(new DateCount(user)); + given(dateCountService.getUserDateCount(userId)).willReturn(response); + + //when //then + mockMvc.perform( + get("/users/{userId}/count", userId) + ) + .andDo(print()) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.code").value(1000)) + .andExpect(jsonPath("$.status").value(200)) + .andExpect(jsonPath("$.message").value("요청에 성공하였습니다.")) + .andExpect(jsonPath("$.result.dateCount").value(0)); + } + + @DisplayName("누적 일수를 업데이트한다.") + @Test + void updateUserDateCount() throws Exception { + //given + Long userId = 1L; + given(dateCountService.updateUserDateCount(userId)).willReturn(1); + + //when //then + mockMvc.perform(patch("/users/{userId}/count", userId)) + .andDo(print()) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.code").value(1000)) + .andExpect(jsonPath("$.status").value(200)) + .andExpect(jsonPath("$.message").value("요청에 성공하였습니다.")); + } + +} \ No newline at end of file diff --git a/src/test/java/hibuy/server/controller/SampleControllerTest.java b/src/test/java/hibuy/server/controller/SampleControllerTest.java new file mode 100644 index 0000000..f8bef96 --- /dev/null +++ b/src/test/java/hibuy/server/controller/SampleControllerTest.java @@ -0,0 +1,116 @@ +package hibuy.server.controller; + +import com.fasterxml.jackson.databind.ObjectMapper; +import hibuy.server.dto.sample.GetSampleResponse; +import hibuy.server.dto.sample.PostSampleRequest; +import hibuy.server.service.SampleService; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.mockito.BDDMockito; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; + +import java.util.List; + +import static org.mockito.BDDMockito.*; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@WebMvcTest(controllers = SampleController.class) +class SampleControllerTest { + + @Autowired MockMvc mockMvc; + @Autowired ObjectMapper objectMapper; + @MockBean SampleService sampleService; + + @DisplayName("샘플을 등록합니다.") + @Test + void addSample() throws Exception { + //given + PostSampleRequest request = new PostSampleRequest("락토핏", "종근당", "http://www.aaa.com", "http://www.bbb.com"); + + //when //then + mockMvc.perform( + post("/samples") + .content(objectMapper.writeValueAsString(request)) + .contentType(MediaType.APPLICATION_JSON) + ) + .andDo(print()) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.code").value(1000)) + .andExpect(jsonPath("$.status").value(200)) + .andExpect(jsonPath("$.message").value("요청에 성공하였습니다.")); + } + + @DisplayName("잘못된 이미지 URL 입력") + @Test + void addSampleWithWrongImageUrl() throws Exception { + //given + PostSampleRequest request = new PostSampleRequest("락토핏", "종근당", "aaaaa", "http://www.bbb.com"); + + //when //then + mockMvc.perform( + post("/samples") + .content(objectMapper.writeValueAsString(request)) + .contentType(MediaType.APPLICATION_JSON) + ) + .andDo(print()) + .andExpect(status().isBadRequest()) + .andExpect(jsonPath("$.code").value(2000)) + .andExpect(jsonPath("$.status").value(400)) + .andExpect(jsonPath("$.message").value("유효하지 않은 입력입니다.")) + .andExpect(jsonPath("$.exceptions[0].field").value("imageUrl")) + .andExpect(jsonPath("$.exceptions[0].reason").value("must be a valid URL")); + } + + @DisplayName("잘못된 상품 URL 입력") + @Test + void addSampleWithWrongProductUrl() throws Exception { + //given + PostSampleRequest request = new PostSampleRequest("락토핏", "종근당", "http://www.aaa.com", "bbbbb"); + + //when //then + mockMvc.perform( + post("/samples") + .content(objectMapper.writeValueAsString(request)) + .contentType(MediaType.APPLICATION_JSON) + ) + .andDo(print()) + .andExpect(status().isBadRequest()) + .andExpect(jsonPath("$.code").value(2000)) + .andExpect(jsonPath("$.status").value(400)) + .andExpect(jsonPath("$.message").value("유효하지 않은 입력입니다.")) + .andExpect(jsonPath("$.exceptions[0].field").value("productUrl")) + .andExpect(jsonPath("$.exceptions[0].reason").value("must be a valid URL")); + } + + @DisplayName("샘플 리스트를 조회한다.") + @Test + void getSamples() throws Exception { + //given + List responses = List.of( + new GetSampleResponse("락토핏", "종근당", "http://www.aaa.com", "http://www.bbb.com") + ); + given(sampleService.getSamples()).willReturn(responses); + + //when //then + mockMvc.perform(get("/samples")) + .andDo(print()) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.code").value(1000)) + .andExpect(jsonPath("$.status").value(200)) + .andExpect(jsonPath("$.message").value("요청에 성공하였습니다.")) + .andExpect(jsonPath("$.result[0].productName").value("락토핏")) + .andExpect(jsonPath("$.result[0].companyName").value("종근당")) + .andExpect(jsonPath("$.result[0].imageUrl").value("http://www.aaa.com")) + .andExpect(jsonPath("$.result[0].productUrl").value("http://www.bbb.com")); + } + +} \ No newline at end of file diff --git a/src/test/java/hibuy/server/domain/DateCountTest.java b/src/test/java/hibuy/server/domain/DateCountTest.java new file mode 100644 index 0000000..6764b92 --- /dev/null +++ b/src/test/java/hibuy/server/domain/DateCountTest.java @@ -0,0 +1,54 @@ +package hibuy.server.domain; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.*; + +class DateCountTest { + + private DateCount dateCount; + + @BeforeEach + void init() { + User user = User.builder() + .kakaoUserId(1L) + .email("abcd123@naver.com") + .name("김철수") + .phoneNumber("01012341234") + .build(); + + dateCount = new DateCount(user); + } + + @DisplayName("유저 등록 시 누적 섭취일은 0부터 시작한다.") + @Test + void startsWithZeroDateCount() { + //then + assertThat(dateCount.getDateCount()).isZero(); + } + + @DisplayName("유저가 하루 섭취량을 모두 채우면 누적 섭취일은 1 증가한다.") + @Test + void increaseDateCount() { + //when + dateCount.increaseDateCount(); + + //then + assertThat(dateCount.getDateCount()).isEqualTo(1); + } + + @DisplayName("누적 섭취일은 최대 150일이다. 150일 다음은 1부터 시작한다.") + @Test + void backToZeroWhenDateCountGetOver150() { + //when + for(int i=1; i<=151; i++) { + dateCount.increaseDateCount(); + } + + //then + assertThat(dateCount.getDateCount()).isEqualTo(1); + } + +} \ No newline at end of file diff --git a/src/test/java/hibuy/server/repository/DailyTakeRepositoryTest.java b/src/test/java/hibuy/server/repository/DailyTakeRepositoryTest.java new file mode 100644 index 0000000..8b49a06 --- /dev/null +++ b/src/test/java/hibuy/server/repository/DailyTakeRepositoryTest.java @@ -0,0 +1,75 @@ +package hibuy.server.repository; + +import hibuy.server.domain.DailyTake; +import hibuy.server.domain.User; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +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.jdbc.AutoConfigureTestDatabase; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; + +import java.sql.Date; +import java.util.List; + +import static org.assertj.core.api.Assertions.*; +import static org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase.*; + +@DataJpaTest +@AutoConfigureTestDatabase(replace = Replace.NONE) +class DailyTakeRepositoryTest { + + @Autowired UserRepository userRepository; + @Autowired DailyTakeRepository dailyTakeRepository; + + @DisplayName("userId로 takeDate를 조회한다.") + @Test + void findTakeDatesByUserId() { + //given + User user = User.builder() + .kakaoUserId(1L) + .email("abcd123@naver.com") + .name("김철수") + .phoneNumber("01012341234") + .build(); + userRepository.save(user); + + DailyTake dailyTake = new DailyTake(Date.valueOf("2024-04-03"), user); + DailyTake dailyTake2 = new DailyTake(Date.valueOf("2024-04-04"), user); + dailyTakeRepository.saveAll(List.of(dailyTake, dailyTake2)); + + //when + List results = dailyTakeRepository.findTakeDatesByUserId(user.getUserId()); + + //then + assertThat(results).hasSize(2) + .containsExactlyInAnyOrder( + Date.valueOf("2024-04-03"), + Date.valueOf("2024-04-04") + ); + } + + @DisplayName("userId와 takeDate로 DailyTake를 조회한다.") + @Test + void findDailyTakeByUserIdAAndTakeDate() { + //given + User user = User.builder() + .kakaoUserId(1L) + .email("abcd123@naver.com") + .name("김철수") + .phoneNumber("01012341234") + .build(); + userRepository.save(user); + + DailyTake dailyTake = new DailyTake(Date.valueOf("2024-04-03"), user); + DailyTake dailyTake2 = new DailyTake(Date.valueOf("2024-04-04"), user); + dailyTakeRepository.saveAll(List.of(dailyTake, dailyTake2)); + + //when + DailyTake savedDailyTake = dailyTakeRepository.findDailyTakeByUserIdAAndTakeDate(user.getUserId(), Date.valueOf("2024-04-04")).get(); + + //then + assertThat(dailyTake2).isEqualTo(savedDailyTake); + } +} \ No newline at end of file diff --git a/src/test/java/hibuy/server/repository/DateCountRepositoryTest.java b/src/test/java/hibuy/server/repository/DateCountRepositoryTest.java new file mode 100644 index 0000000..778ed72 --- /dev/null +++ b/src/test/java/hibuy/server/repository/DateCountRepositoryTest.java @@ -0,0 +1,44 @@ +package hibuy.server.repository; + +import hibuy.server.domain.DateCount; +import hibuy.server.domain.User; +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.jdbc.AutoConfigureTestDatabase; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; + +import java.util.Optional; + +import static org.junit.jupiter.api.Assertions.*; +import static org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase.*; + +@DataJpaTest +@AutoConfigureTestDatabase(replace = Replace.NONE) +class DateCountRepositoryTest { + + @Autowired DateCountRepository dateCountRepository; + @Autowired UserRepository userRepository; + + @DisplayName("사용자의 누적 섭취량을 조회한다.") + @Test + void findDateCountByUserId() { + //given + User user = User.builder() + .kakaoUserId(1L) + .email("abcd123@naver.com") + .name("김철수") + .phoneNumber("01012341234") + .build(); + userRepository.save(user); + dateCountRepository.save(new DateCount(user)); + + //when + DateCount dateCount = dateCountRepository.findDateCountByUserId(user.getUserId()).get(); + + //then + Assertions.assertThat(dateCount.getDateCount()).isZero(); + } + +} \ No newline at end of file diff --git a/src/test/java/hibuy/server/repository/UserRepositoryTest.java b/src/test/java/hibuy/server/repository/UserRepositoryTest.java new file mode 100644 index 0000000..31b60da --- /dev/null +++ b/src/test/java/hibuy/server/repository/UserRepositoryTest.java @@ -0,0 +1,42 @@ +package hibuy.server.repository; + +import hibuy.server.domain.User; +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.jdbc.AutoConfigureTestDatabase; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; + +import java.util.List; + +@DataJpaTest +@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE) +class UserRepositoryTest { + + @Autowired UserRepository userRepository; + + @DisplayName("카카오 ID로 유저를 조회한다.") + @Test + void findByKakaoUserId() { + //given + User user = createUser(1L, "김철수", "abcd123@naver.com", "01012341234"); + User user2 = createUser(2L, "박철수", "abcd1234@naver.com", "01023452345"); + userRepository.saveAll(List.of(user, user2)); + + //when + User savedUser = userRepository.findByKakaoUserId(1L).get(); + + //then + Assertions.assertThat(savedUser).isEqualTo(user); + } + + private User createUser(Long kakaoUserId, String name, String email, String phoneNumber) { + return User.builder() + .kakaoUserId(kakaoUserId) + .name(name) + .email(email) + .phoneNumber(phoneNumber) + .build(); + } +} \ No newline at end of file diff --git a/src/test/java/hibuy/server/service/DailyTakeServiceTest.java b/src/test/java/hibuy/server/service/DailyTakeServiceTest.java new file mode 100644 index 0000000..43ee176 --- /dev/null +++ b/src/test/java/hibuy/server/service/DailyTakeServiceTest.java @@ -0,0 +1,127 @@ +package hibuy.server.service; + +import hibuy.server.common.exception.notfound.NotFoundUserException; +import hibuy.server.controller.LoginController; +import hibuy.server.domain.DailyTake; +import hibuy.server.domain.User; +import hibuy.server.dto.dailyTake.GetMonthlyTakeResponse; +import hibuy.server.repository.DailyTakeRepository; +import hibuy.server.repository.UserRepository; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +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; +import org.springframework.boot.test.mock.mockito.MockBean; + +import java.sql.Date; +import java.util.List; + +import static org.assertj.core.api.Assertions.*; + +@SpringBootTest +class DailyTakeServiceTest { + + @Autowired DailyTakeService dailyTakeService; + @Autowired DailyTakeRepository dailyTakeRepository; + @Autowired UserRepository userRepository; + + @AfterEach + void tearDown() { + dailyTakeRepository.deleteAllInBatch(); + userRepository.deleteAllInBatch(); + } + + @DisplayName("입력 받은 년, 월과 일치하는 날짜를 오름차순으로 반환한다.") + @Test + void getMonthlyTake() { + //given + User user = User.builder() + .kakaoUserId(1L) + .email("abcd123@naver.com") + .name("김철수") + .phoneNumber("01012341234") + .build(); + userRepository.save(user); + + DailyTake dailyTake = new DailyTake(Date.valueOf("2024-04-03"), user); + DailyTake dailyTake2 = new DailyTake(Date.valueOf("2024-04-04"), user); + DailyTake dailyTake3 = new DailyTake(Date.valueOf("2024-04-01"), user); + DailyTake dailyTakeWithDifferentYear = new DailyTake(Date.valueOf("2023-04-04"), user); + DailyTake dailyTakeWithDifferentMonth = new DailyTake(Date.valueOf("2024-03-04"), user); + dailyTakeRepository.saveAll(List.of(dailyTake, dailyTake2, dailyTake3, dailyTakeWithDifferentYear,dailyTakeWithDifferentMonth)); + + String year = "2024"; + String month = "04"; + + //when + GetMonthlyTakeResponse monthlyTake = dailyTakeService.getMonthlyTake(user.getUserId(), year, month); + List intakeDate = monthlyTake.getIntakeDate(); + + //then + assertThat(intakeDate).hasSize(3) + .containsExactly( + Date.valueOf("2024-04-01"), + Date.valueOf("2024-04-03"), + Date.valueOf("2024-04-04") + ); + } + + @DisplayName("dailyTake가 존재하지 않는 경우 새로 추가한다.") + @Test + void addDailyTakeWhenDailyTakeEmpty() { + //given + User user = User.builder() + .kakaoUserId(1L) + .email("abcd123@naver.com") + .name("김철수") + .phoneNumber("01012341234") + .build(); + userRepository.save(user); + + List results = dailyTakeRepository.findTakeDatesByUserId(1L); + assertThat(results).isEmpty(); + + //when // then + dailyTakeService.addDailyTake(user.getUserId(), Date.valueOf("2024-04-03")); + results = dailyTakeRepository.findTakeDatesByUserId(user.getUserId()); + + assertThat(results).containsExactly(Date.valueOf("2024-04-03")); + } + + @DisplayName("dailyTake가 활성화 상태로 존재하는 경우 새로 추가하지 않는다.") + @Test + void NotAddDailyTakeWhenDailyTakeExists() { + //given + User user = User.builder() + .kakaoUserId(1L) + .email("abcd123@naver.com") + .name("김철수") + .phoneNumber("01012341234") + .build(); + userRepository.save(user); + + DailyTake dailyTake = new DailyTake(Date.valueOf("2024-04-03"), user); + dailyTakeRepository.save(dailyTake); + + List results = dailyTakeRepository.findTakeDatesByUserId(user.getUserId()); + assertThat(results).hasSize(1).containsExactly(Date.valueOf("2024-04-03")); + + //when + dailyTakeService.addDailyTake(user.getUserId(), Date.valueOf("2024-04-03")); + + //then + assertThat(results).hasSize(1).containsExactly(Date.valueOf("2024-04-03")); + } + + @DisplayName("존재하지 않는 회원에 대한 dailytake 추가 처리는 예외를 발생시킨다.") + @Test + void addDailyTakeWithNotFoundUser() { + //when //then + assertThatThrownBy(() -> dailyTakeService.addDailyTake(1L, Date.valueOf("2024-04-03"))) + .isInstanceOf(NotFoundUserException.class) + .hasMessage("존재하지 않는 회원입니다."); + } +} \ No newline at end of file diff --git a/src/test/java/hibuy/server/service/DateCountServiceTest.java b/src/test/java/hibuy/server/service/DateCountServiceTest.java new file mode 100644 index 0000000..f583044 --- /dev/null +++ b/src/test/java/hibuy/server/service/DateCountServiceTest.java @@ -0,0 +1,113 @@ +package hibuy.server.service; + +import hibuy.server.common.exception.notfound.NotFoundDateCountException; +import hibuy.server.common.exception.notfound.NotFoundUserException; +import hibuy.server.domain.DateCount; +import hibuy.server.domain.User; +import hibuy.server.dto.dateCount.GetDateCountResponse; +import hibuy.server.repository.DateCountRepository; +import hibuy.server.repository.UserRepository; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.AfterEach; +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; + +import java.util.Optional; + +import static org.assertj.core.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.*; + +@SpringBootTest +class DateCountServiceTest { + + @Autowired DateCountService dateCountService; + @Autowired DateCountRepository dateCountRepository; + @Autowired UserRepository userRepository; + + @AfterEach + void tearDown() { + dateCountRepository.deleteAllInBatch(); + userRepository.deleteAllInBatch(); + } + + @DisplayName("유저의 누적 섭취일을 조회한다.") + @Test + void getUserDateCount() { + //given + User user = User.builder() + .kakaoUserId(1L) + .email("abcd123@naver.com") + .name("김철수") + .phoneNumber("01012341234") + .build(); + userRepository.save(user); + dateCountRepository.save(new DateCount(user)); + + //when + GetDateCountResponse response = dateCountService.getUserDateCount(user.getUserId()); + + //then + assertThat(response).extracting("userId", "dateCount") + .containsExactly(user.getUserId(), 0); + } + + @DisplayName("유저의 누적 섭취일 조회시 등록된 누적 섭취일이 없는 경우 예외를 발생시킨다..") + @Test + void searchDateCountThrowNotFoundExceptionWhenDateCountNotExists() { + //given + User user = User.builder() + .kakaoUserId(1L) + .email("abcd123@naver.com") + .name("김철수") + .phoneNumber("01012341234") + .build(); + userRepository.save(user); + + //when //then + assertThatThrownBy(() -> dateCountService.getUserDateCount(user.getUserId())) + .isInstanceOf(NotFoundDateCountException.class) + .hasMessage("해당 누적일수가 존재하지 않습니다."); + } + + @DisplayName("누적 섭취일이 1 증가한다.") + @Test + void increaseDateCount() { + //given + User user = User.builder() + .kakaoUserId(1L) + .email("abcd123@naver.com") + .name("김철수") + .phoneNumber("01012341234") + .build(); + userRepository.save(user); + dateCountRepository.save(new DateCount(user)); + + //when + dateCountService.updateUserDateCount(user.getUserId()); + DateCount dateCount = dateCountRepository.findDateCountByUserId(user.getUserId()).get(); + + //then + Assertions.assertThat(dateCount.getDateCount()).isEqualTo(1); + } + + @DisplayName("유저의 누적 섭취일 업데이트 시 유저가 존재하지 않는 경우 예외를 발생시킨다.") + @Test + void updateDateCountThrowNotFoundExceptionWhenDateCountNotExists() { + //given + User user = User.builder() + .kakaoUserId(1L) + .email("abcd123@naver.com") + .name("김철수") + .phoneNumber("01012341234") + .build(); + userRepository.save(user); + + //when //then + assertThatThrownBy(() -> dateCountService.updateUserDateCount(user.getUserId())) + .isInstanceOf(NotFoundDateCountException.class) + .hasMessage("해당 누적일수가 존재하지 않습니다."); + } + +} \ No newline at end of file diff --git a/src/test/java/hibuy/server/service/SampleServiceTest.java b/src/test/java/hibuy/server/service/SampleServiceTest.java new file mode 100644 index 0000000..fde4f3f --- /dev/null +++ b/src/test/java/hibuy/server/service/SampleServiceTest.java @@ -0,0 +1,89 @@ +package hibuy.server.service; + +import hibuy.server.domain.Sample; +import hibuy.server.dto.sample.GetSampleResponse; +import hibuy.server.dto.sample.PostSampleRequest; +import hibuy.server.repository.SampleRepository; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.AfterEach; +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; + +import java.util.List; + +import static org.assertj.core.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.*; + +@SpringBootTest +class SampleServiceTest { + + @Autowired SampleService sampleService; + @Autowired SampleRepository sampleRepository; + + @AfterEach + void tearDown() { + sampleRepository.deleteAllInBatch(); + } + + @DisplayName("새로 등록한 샘플의 id를 반환한다.") + @Test + void addSample() { + //given + String productName = "락토핏"; + String companyName = "종근당"; + String imageUrl = "aaa@aaa.com"; + String productUrl = "bbb@bbb.com"; + + Sample sample = Sample.builder() + .productName(productName) + .companyName(companyName) + .imageUrl(imageUrl) + .productUrl(productUrl) + .build(); + + sampleRepository.save(sample); + + PostSampleRequest request = new PostSampleRequest(productName, companyName, imageUrl, productUrl); + + //when + Long sampleId = sampleService.addSample(request); + + //then + assertThat(sampleId).isEqualTo(sample.getSampleId() + 1); + } + + @DisplayName("샘플의 조회 결과를 반환한다.") + @Test + void getSamples() { + //given + Sample sample = Sample.builder() + .productName("락토핏") + .companyName("종근당") + .imageUrl("aaa@aaa.com") + .productUrl("bbb@bbb.com") + .build(); + + Sample sample2 = Sample.builder() + .productName("락토핏2") + .companyName("종근당") + .imageUrl("aaa2@aaa.com") + .productUrl("bbb2@bbb.com") + .build(); + + sampleRepository.saveAll(List.of(sample, sample2)); + + //when + List samples = sampleService.getSamples(); + + //then + assertThat(samples).hasSize(2) + .extracting("productName", "companyName", "imageUrl", "productUrl") + .containsExactlyInAnyOrder( + tuple("락토핏", "종근당", "aaa@aaa.com", "bbb@bbb.com"), + tuple("락토핏2", "종근당", "aaa2@aaa.com", "bbb2@bbb.com") + ); + } + +} \ No newline at end of file