diff --git a/README.md b/README.md
index 303a3b5..25b70fc 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,19 @@
-# Be
+# ๐ฟ Leafy - ๊ธฐํ๋ฅผ ์งํค๋ ์ค๋์ ์ค์ฒ
+**Leafy(๋ฆฌํผ)** ๋ ์ผ์ ์ ์์ ์ค์ฒ์ ํตํด
+๊ธฐํ ๋ณํ์ ๋์ํ ์ ์๋๋ก ๋๊ธฐ๋ฅผ ๋ถ์ฌํ๋ ์ค์ฒ ๊ธฐ๋ฐ ํ๋ซํผ์
๋๋ค.
+
+
+
+
+
+
+
+
+
+
+
+
+
-### ์ํคํ
์ฒ
-
diff --git a/src/main/java/com/example/hackathon/domain/productpurchasehistory/facade/ProductPurchaseFacade.java b/src/main/java/com/example/hackathon/domain/productpurchasehistory/facade/ProductPurchaseFacade.java
index 37a5d9a..393b7f9 100644
--- a/src/main/java/com/example/hackathon/domain/productpurchasehistory/facade/ProductPurchaseFacade.java
+++ b/src/main/java/com/example/hackathon/domain/productpurchasehistory/facade/ProductPurchaseFacade.java
@@ -56,6 +56,6 @@ public void purchase(Long userId, ProductPurchaseRequestDto request) {
productPurchaseHistoryService.purchase(history);
-// pointService.usingPoint();
+ pointService.updatePointBalance(userId, product.price());
}
}
diff --git a/src/test/java/com/example/hackathon/domain/activity/service/ActivityServiceTest.java b/src/test/java/com/example/hackathon/domain/activity/service/ActivityServiceTest.java
index 5b756b0..33e9293 100644
--- a/src/test/java/com/example/hackathon/domain/activity/service/ActivityServiceTest.java
+++ b/src/test/java/com/example/hackathon/domain/activity/service/ActivityServiceTest.java
@@ -1,10 +1,13 @@
package com.example.hackathon.domain.activity.service;
-import com.example.hackathon.domain.point.dto.PointRequestDTO;
-import com.example.hackathon.domain.point.entity.Point;
-import com.example.hackathon.domain.point.entity.ProductType;
-import com.example.hackathon.domain.point.repository.PointRepository;
-import com.example.hackathon.domain.point.service.PointService;
+import com.example.hackathon.domain.activity.dto.ActivityNewRequestDto;
+import com.example.hackathon.domain.activity.dto.ActivityResponseDto;
+import com.example.hackathon.domain.activity.entity.Activity;
+import com.example.hackathon.domain.activity.entity.RepeatCycle;
+import com.example.hackathon.domain.activity.repository.ActivityRepository;
+import com.example.hackathon.domain.category.entity.Category;
+import com.example.hackathon.domain.category.entity.CategoryType;
+import com.example.hackathon.domain.category.repository.CategoryRepository;
import com.example.hackathon.domain.user.entity.User;
import com.example.hackathon.domain.user.repository.UserRepository;
import com.example.hackathon.global.exception.BusinessException;
@@ -15,6 +18,8 @@
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
+import java.util.Arrays;
+import java.util.List;
import java.util.Optional;
import static org.assertj.core.api.Assertions.*;
@@ -25,103 +30,143 @@
import org.mockito.junit.jupiter.MockitoExtension;
@ExtendWith(MockitoExtension.class)
-class PointServiceTest {
+class ActivityServiceTest {
- @Mock
- private PointRepository pointRepository;
-
- @Mock
- private UserRepository userRepository;
+ @Mock private ActivityRepository activityRepository;
+ @Mock private UserRepository userRepository;
+ @Mock private CategoryRepository categoryRepository;
@InjectMocks
- private PointService pointService;
+ private ActivityService activityService;
+
+ private Activity mockActivity;
+
+ @BeforeEach
+ void setup() {
+ mockActivity = Activity.builder()
+ .id(1L)
+ .description("Test activity")
+ .point(100)
+ .sortOrder(1)
+ .isCustom(false)
+ .build();
+ }
- @Mock
- private User user;
+ @Test
+ @DisplayName("์นดํ
๊ณ ๋ฆฌ๋ณ ํ๋ ์กฐํ ์ฑ๊ณต")
+ void getActivitiesByCategoryWithTodayFlags_success() {
+ // given
+ when(activityRepository.findByCategoryIdAndIsDisplayedTrueOrderBySortOrderAsc(1L))
+ .thenReturn(List.of(mockActivity));
- private Point mockPoint;
+ List todayIds = List.of(1L);
- Long userId = 1L;
+ // when
+ List result = activityService.getActivitiesByCategoryWithTodayFlags(1L, todayIds);
- @BeforeEach
- void setUp() {
- mockPoint = new Point();
- mockPoint.setUser(user);
- mockPoint.setTotalPoint(500);
+ // then
+ assertThat(result).hasSize(1);
+ assertThat(result.get(0).isTodayActivity()).isTrue();
+ }
+
+ @Test
+ @DisplayName("์ค๋์ ๋ฏธ์
ํ๋ ์กฐํ ์ฑ๊ณต")
+ void getTodayMissionActivitiesWithTodayFlags_success() {
+ // given
+ when(activityRepository.findByIsDisplayedTrueAndIsTodayActivityTrueOrderBySortOrderAsc())
+ .thenReturn(List.of(mockActivity));
+
+ List todayIds = List.of(1L);
+
+ // when
+ List result = activityService.getTodayMissionActivitiesWithTodayFlags(todayIds);
+
+ // then
+ assertThat(result).hasSize(1);
+ assertThat(result.get(0).isTodayActivity()).isTrue();
}
@Test
- @DisplayName("์ฌ์ฉ์ ํฌ์ธํธ ์กฐํ - ์ฑ๊ณต (500 ํฌ์ธํธ)")
- void getUserTotalPoint_success() {
+ @DisplayName("๋จ์ผ ํ๋ ์กฐํ - ์กด์ฌํ ๊ฒฝ์ฐ")
+ void getActivity_exists() {
// given
- when(pointRepository.findByUserId(userId)).thenReturn(Optional.of(mockPoint));
+ when(activityRepository.findById(1L)).thenReturn(Optional.of(mockActivity));
// when
- int totalPoint = pointService.getUserTotalPoint(userId);
+ ActivityResponseDto result = activityService.getActivity(1L);
// then
- assertThat(totalPoint).isEqualTo(500);
+ assertThat(result).isNotNull();
+ assertThat(result.getId()).isEqualTo(1L);
}
@Test
- @DisplayName("์ฌ์ฉ์ ํฌ์ธํธ ์กฐํ - ์ ๋ณด ์์ ๊ฒฝ์ฐ 0 ๋ฐํ")
- void getUserTotalPoint_zeroWhenNotExists() {
+ @DisplayName("๋จ์ผ ํ๋ ์กฐํ - ์กด์ฌํ์ง ์์ ๊ฒฝ์ฐ null ๋ฐํ")
+ void getActivity_notExists() {
// given
- when(pointRepository.findByUserId(userId)).thenReturn(Optional.empty());
+ when(activityRepository.findById(1L)).thenReturn(Optional.empty());
// when
- int totalPoint = pointService.getUserTotalPoint(userId);
+ ActivityResponseDto result = activityService.getActivity(1L);
// then
- assertThat(totalPoint).isEqualTo(0);
+ assertThat(result).isNull();
}
@Test
- @DisplayName("ํฌ์ธํธ ์ฌ์ฉ - ์ฑ๊ณต")
- void usingPoint_success() {
+ @DisplayName("์ฌ์ฉ์ ํ๋ ์ถ๊ฐ ์ฑ๊ณต")
+ void addUserActivities_success() {
// given
- PointRequestDTO.buyProductReq req = PointRequestDTO.buyProductReq.builder()
- .productType(ProductType.KEYRING) // ์: KEYRING์ 200ํฌ์ธํธ ํ์
+ User user = mock(User.class);
+ Category category = mock(Category.class);
+ ActivityNewRequestDto.AddActivity req = ActivityNewRequestDto.AddActivity.builder()
+ .categoryType(CategoryType.CONSUMPTION)
+ .description("์ค๋ช
")
+ .title("์ ๋ชฉ")
+ .repeatCycle(RepeatCycle.DAILY)
.build();
- when(pointRepository.findByUserId(userId)).thenReturn(Optional.of(mockPoint));
+ when(userRepository.findByKakaoId(1L)).thenReturn(Optional.of(user));
+ when(categoryRepository.findByCategoryType(CategoryType.CONSUMPTION)).thenReturn(Optional.of(category));
// when
- pointService.usingPoint(userId, req);
+ activityService.addUserActivities(1L, req);
// then
- assertThat(mockPoint.getTotalPoint()).isEqualTo(279); // 500 - 200
+ verify(activityRepository, times(1)).save(any(Activity.class));
}
@Test
- @DisplayName("ํฌ์ธํธ ์ฌ์ฉ - ์์ฌ ํฌ์ธํธ ๋ถ์กฑ ์ ์์ธ ๋ฐ์")
- void usingPoint_notEnoughPoint_throwsException() {
+ @DisplayName("์ฌ์ฉ์ ํ๋ ์ถ๊ฐ - ์ฌ์ฉ์ ์์ ์์ธ")
+ void addUserActivities_userNotFound() {
// given
- PointRequestDTO.buyProductReq req = PointRequestDTO.buyProductReq.builder()
- .productType(ProductType.KEYRING) // ์: ํค๋ง
+ ActivityNewRequestDto.AddActivity req = ActivityNewRequestDto.AddActivity.builder()
+ .categoryType(CategoryType.CONSUMPTION)
.build();
- when(pointRepository.findByUserId(userId)).thenReturn(Optional.of(mockPoint));
+ when(userRepository.findByKakaoId(1L)).thenReturn(Optional.empty());
// expect
- assertThatThrownBy(() -> pointService.usingPoint(userId, req))
+ assertThatThrownBy(() -> activityService.addUserActivities(1L, req))
.isInstanceOf(BusinessException.class)
- .hasMessageContaining(Code.POINT_NOT_ENOUGH.getMessage());
+ .hasMessageContaining(Code.USER_NOT_FOUND.getMessage());
}
@Test
- @DisplayName("ํฌ์ธํธ ์ฌ์ฉ - ์ฌ์ฉ์ ํฌ์ธํธ ์ ๋ณด๊ฐ ์์ ์ ์์ธ ๋ฐ์")
- void usingPoint_pointEntityNotFound_throwsException() {
+ @DisplayName("์ฌ์ฉ์ ํ๋ ์ถ๊ฐ - ์นดํ
๊ณ ๋ฆฌ ์์ ์์ธ")
+ void addUserActivities_categoryNotFound() {
// given
- PointRequestDTO.buyProductReq req = PointRequestDTO.buyProductReq.builder()
- .productType(ProductType.KEYRING)
+ User user = mock(User.class);
+ ActivityNewRequestDto.AddActivity req = ActivityNewRequestDto.AddActivity.builder()
+ .categoryType(CategoryType.CONSUMPTION)
.build();
- when(pointRepository.findByUserId(userId)).thenReturn(Optional.empty());
+ when(userRepository.findByKakaoId(1L)).thenReturn(Optional.of(user));
+ when(categoryRepository.findByCategoryType(CategoryType.CONSUMPTION)).thenReturn(Optional.empty());
// expect
- assertThatThrownBy(() -> pointService.usingPoint(userId, req))
+ assertThatThrownBy(() -> activityService.addUserActivities(1L, req))
.isInstanceOf(BusinessException.class)
- .hasMessageContaining(Code.POINT_NOT_FOUND.getMessage());
+ .hasMessageContaining(Code.CATEGORY_NOT_FOUND.getMessage());
}
}
diff --git a/src/test/java/com/example/hackathon/domain/point/service/PointServiceV1Test.java b/src/test/java/com/example/hackathon/domain/point/service/PointServiceV1Test.java
new file mode 100644
index 0000000..37fb063
--- /dev/null
+++ b/src/test/java/com/example/hackathon/domain/point/service/PointServiceV1Test.java
@@ -0,0 +1,114 @@
+package com.example.hackathon.domain.point.service;
+
+import com.example.hackathon.domain.point.dto.PointRequestDTO;
+import com.example.hackathon.domain.point.entity.Point;
+import com.example.hackathon.domain.point.entity.ProductType;
+import com.example.hackathon.domain.point.repository.PointRepository;
+import com.example.hackathon.domain.user.entity.User;
+import com.example.hackathon.domain.user.repository.UserRepository;
+import com.example.hackathon.global.exception.BusinessException;
+import com.example.hackathon.global.response.Code;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+
+import java.util.Optional;
+
+import static org.assertj.core.api.Assertions.*;
+import static org.mockito.Mockito.*;
+
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+
+@ExtendWith(MockitoExtension.class)
+class PointServiceV1Test {
+
+ @Mock
+ private PointRepository pointRepository;
+
+ @Mock
+ private UserRepository userRepository;
+
+ @InjectMocks
+ private PointService pointService;
+
+ @Mock
+ private User user;
+
+ private Point mockPoint;
+
+ Long userId = 1L;
+
+ @BeforeEach
+ void setUp() {
+ mockPoint = new Point();
+ mockPoint.setUser(user);
+ mockPoint.setTotalPoint(500);
+ }
+
+ @Test
+ @DisplayName("์ฌ์ฉ์ ํฌ์ธํธ ์กฐํ - ์ฑ๊ณต (500 ํฌ์ธํธ)")
+ void getUserTotalPoint_success() {
+ // given
+ when(pointRepository.findByUserId(userId)).thenReturn(Optional.of(mockPoint));
+
+ // when
+ int totalPoint = pointService.getUserTotalPoint(userId);
+
+ // then
+ assertThat(totalPoint).isEqualTo(500);
+ }
+
+ @Test
+ @DisplayName("์ฌ์ฉ์ ํฌ์ธํธ ์กฐํ - ์ ๋ณด ์์ ๊ฒฝ์ฐ 0 ๋ฐํ")
+ void getUserTotalPoint_zeroWhenNotExists() {
+ // given
+ when(pointRepository.findByUserId(userId)).thenReturn(Optional.empty());
+
+ // when
+ int totalPoint = pointService.getUserTotalPoint(userId);
+
+ // then
+ assertThat(totalPoint).isEqualTo(0);
+ }
+
+ @Test
+ @DisplayName("ํฌ์ธํธ ์ฌ์ฉ - ์ฑ๊ณต")
+ void usingPoint_success() {
+ // given
+ when(pointRepository.findByUserId(userId)).thenReturn(Optional.of(mockPoint));
+
+ // when
+ pointService.updatePointBalance(userId, ProductType.KEYRING.getPoint());
+
+ // then
+ assertThat(mockPoint.getTotalPoint()).isEqualTo(279); // 500 - 200
+ }
+
+ @Test
+ @DisplayName("ํฌ์ธํธ ์ฌ์ฉ - ์์ฌ ํฌ์ธํธ ๋ถ์กฑ ์ ์์ธ ๋ฐ์")
+ void usingPoint_notEnoughPoint_throwsException() {
+ // given
+ when(pointRepository.findByUserId(userId)).thenReturn(Optional.of(mockPoint));
+
+ // expect
+ assertThatThrownBy(() -> pointService.updatePointBalance(userId, ProductType.KEYRING.getPoint()))
+ .isInstanceOf(BusinessException.class)
+ .hasMessageContaining(Code.POINT_NOT_ENOUGH.getMessage());
+ }
+
+ @Test
+ @DisplayName("ํฌ์ธํธ ์ฌ์ฉ - ์ฌ์ฉ์ ํฌ์ธํธ ์ ๋ณด๊ฐ ์์ ์ ์์ธ ๋ฐ์")
+ void usingPoint_pointEntityNotFound_throwsException() {
+ // given
+ when(pointRepository.findByUserId(userId)).thenReturn(Optional.empty());
+
+ // expect
+ assertThatThrownBy(() -> pointService.updatePointBalance(userId, ProductType.KEYRING.getPoint()))
+ .isInstanceOf(BusinessException.class)
+ .hasMessageContaining(Code.POINT_NOT_FOUND.getMessage());
+ }
+}