Skip to content

Commit

Permalink
Deploy | CAKK-56 | v2.0.4 ๋ฐฐํฌ
Browse files Browse the repository at this point in the history
* Fix | CAKK-25 | Test method ์ ‘๊ทผ์ œํ•œ์ž ์ˆ˜์ •

* Test | CAKK-25 | ์ผ€์ดํฌ ์ƒต ์ฃผ์ธ ์ธ์ฆ ์™„๋ฃŒ ์‹œ, ์ •์ฑ… ๋„๋ฉ”์ธ์œผ๋กœ ์บก์Šํ™” ๋ฐ ํ…Œ์ŠคํŠธ

* Feature | CAKK-25 | ์ธ์ฆ ์ƒํƒœ ์—ฌ๋ถ€ ํ•„๋“œ๋ฅผ  ์œ„ํ•œ Converter ์ถ”๊ฐ€

* Fix | CAKK-25 | ๋ฉ”์„œ๋“œ ๋„ค์ด๋ฐ ๋ณ€๊ฒฝ

* Test | CAKK-25 | ์ธ์ฆ ์ •์ฑ… ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

* Refactor | CAKK-25 | ์‚ฌ์—…์ž ์ •๋ณด ์ผ€์ดํฌ์ƒต ์ฃผ์ธ ์—…๋ฐ์ดํŠธ ๋กœ์ง ๋ฆฌํŒฉํ† ๋ง

* Feature | CAKK-25 | ์ผ€์ดํฌ์ƒต ์ฃผ์ธ ํ›„๋ณด ์—ฌ๋ถ€ ์กฐํšŒ ๋กœ์ง ์ถ”๊ฐ€ ๋ฐ ํ…Œ์ŠคํŠธ

* Fix | CAKK-25 | ์ผ€์ดํฌ์ƒต ์ƒ์„ฑ์ž ๋กฌ๋ณต ์ œ๊ฑฐ

* Fix | CAKK-25 | ์–ด๋“œ๋ฏผ API ๋ถ„๋ฆฌ

* Feature | CAKK-25 | ์‚ฌ์žฅ๋‹˜ ์ธ์ฆ ์š”์ฒญ ๋ฆฌ์ŠคํŠธ ๋ชฉ๋ก ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ์ง ์ถ”๊ฐ€

* Test | CAKK-25| ์‚ฌ์žฅ๋‹˜ ์ธ์ฆ ์š”์ฒญ ๋ชฉ๋ก ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

* Refactor | CAKK-25 | checkstyle ๋ฐ˜์˜

* Test | CAKK-25 | ๋น ์กŒ๋˜ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€ ๋ฐ build ๋ฌธ์ œ ํ•ด๊ฒฐ

* Fix | CAKK-25 | ์ธ์ฆ ์ •์ฑ… ์‘์ง‘๋„๋ฅผ ์œ„ํ•œ ํŒจํ‚ค์ง€ ์ˆ˜์ •

* Fix | CAKK-25 | ์š”์ฒญ ๋ฐ์ดํ„ฐ์— ๋”ฐ๋ฅธ response ์ˆ˜์ •

* Fix | CAKK-25 | ์ฝ”๋“œ ๋ฆฌ๋ทฐ ๋ฐ˜์˜

* Fix | CAKK-26 | dto ๋„ค์ด๋ฐ ์ˆ˜์ •

* Feature | CAKK-26 | ์ธ์ฆ ์š”์ฒญ ์ƒ์„ธ ๋‚ด์šฉ ์กฐํšŒ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ์ง ์ถ”๊ฐ€

* Feature | CAKK-26 | ์ƒ์„ธ์กฐํšŒ๋ฅผ ์œ„ํ•œ ์ฟผ๋ฆฌ ์ถ”๊ฐ€

* Test | CAKK-26 | ์ธ์ฆ ์š”์ฒญ ์ƒ์„ธ ๋‚ด์šฉ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€

* Refactor | CAKK-26 | checkstyle ๋ฐ˜์˜

* Fix | CAKK-26 | response data builder ์‚ฌ์šฉ์œผ๋กœ ์ˆ˜์ •

* Chore | CAKK-35 | kotlin 2.0 ์„ค์ •

* Chore | CAKK-35 | admin ๋ชจ๋“ˆ ์„ค์ •

* Chore | CAKK-35 | admin ๋ชจ๋“ˆ ์„ค์ •

* Refactor | CAKK-35 | admin ๊ด€๋ จ ์ผ๋ถ€ ๋น„์ฆˆ๋‹ˆ์Šค ์ด๊ด€

* Fix | CAKK-36 |  CakeShop Domain์—์„œ ์ธ์ฆ ์—ฐ๊ฒฐ ์—ฌ๋ถ€ ์ƒํƒœ ์ œ๊ฑฐ

* Refactor | CAKK-36 | ์ผ€์ดํฌ์ƒต ์‚ฌ์žฅ๋‹˜ ์ธ์ฆ ์š”์ฒญ ๋กœ์ง ๋ฆฌํŒฉํ† ๋ง

* Test | CAKK-36 | ์ผ€์ดํฌ์ƒต ์‚ฌ์žฅ๋‹˜ ์ธ์ฆ ์š”์ฒญ ํ…Œ์ŠคํŠธ ๋ฆฌํŒฉํ† ๋ง

* Refactor | CAKK-36 | ๋ถˆํ•„์š”ํ•œ ๋ฉ”์„œ๋“œ ์ œ๊ฑฐ

* Refactor | CAKK-36 | User Role์—์„œ Business Owner์ œ๊ฑฐ๋กœ ์ธํ•œ ๋ฆฌํŒฉํ† ๋ง

* Fix | CAKK-36 | ์ธ์ฆ ์š”์ฒญ ์‹œ, cakeShop nullable ์ œ๊ฑฐ ๋ฐ ํ…Œ์ŠคํŠธ ์ œ๊ฑฐ

* Refactor | CAKK-36 | ์ธ์ฆ ์š”์ฒญ๊ณผ ๊ฒ€์ฆ ๋กœ์ง ๋ถ„๋ฆฌ ๋ฆฌํŒฉํ† ๋ง

* Chore | CAKK-40 | ๋ชจ๋“ˆ ๊ฐ„ ์„ค์ • ์ˆ˜์ •

* Chore | CAKK-40 | ์–ด๋“œ๋ฏผ ๋ชจ๋“ˆ ์˜์กด์„ฑ ์ถ”๊ฐ€

* Test | CAKK-36 | ๋กœ์ง ๋ฆฌํŒฉํ† ๋ง์œผ๋กœ ์ธํ•œ ํ…Œ์ŠคํŠธ ๋ฆฌํŒฉํ† ๋ง

* Fix | CAKK-36 | ์ธ์ฆ ์—ฌ๋ถ€ ํ•„๋“œ๋กœ ์ธํ•œ ์ฟผ๋ฆฌ ์ˆ˜์ •

* Refactor | CAKK-36 | checkstyle ์ ์šฉ

* Fix | CAKK-36 | sql file ํ…Œ์ด๋ธ” ๊ตฌ์กฐ ๋ณ€๊ฒฝ์œผ๋กœ ์ˆ˜์ •

* Refactor | CAKK-40 | BusinessInformation ๊ด€๋ จ ๊ธฐ๋Šฅ ์ด๊ด€

* Refactor | CAKK-36 | ์ฝ”๋“œ ๋ฆฌ๋ทฐ ๋ฐ˜์˜ ๋ฐ ์‚ฌ์žฅ๋‹˜ ์ธ์ฆ ์Šน์ธ์—์„œ์˜ ๊ฒ€์ฆ ๋กœ์ง ์ถ”๊ฐ€

* Test | CAKK-36 | ์‚ฌ์žฅ๋‹˜์œผ๋กœ ์Šน์ธ ์‹œ, ๊ฒ€์ฆ์œผ๋กœ ์ธํ•œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ˆ˜์ •

* Refactor | CAKK-42 | Cake ๊ด€๋ จ ๊ธฐ๋Šฅ ์ด๊ด€

* Chore | CAKK-42 | gitignore์— kotlin ๊ด€๋ จ ์ถ”๊ฐ€

* Refactor | CAKK-42 | kotlin lambda ๋ฆฌํŒฉํ† ๋ง

* Refactor | CAKK-42 | Cake ๊ด€๋ จ ๊ธฐ๋Šฅ ์ด๊ด€

* Refactor | CAKK-42 | CakeShop ์ƒ์„ฑ Dto ๋ฐ Mapping ๋ฆฌํŒฉํ† ๋ง

* Refactor | CAKK-42 | ์ฝ”๋“œ ๋ฆฌ๋ทฐ ๋ฐ˜์˜

* Refactor | CAKK-41 | ์ผ€์ดํฌ ์ƒต ๊ด€๋ จ ๊ธฐ๋Šฅ ์ด๊ด€

* Refactor | CAKK-41 | Param์— Builder ์ถ”

* Refactor | CAKK-41 | api ์„ค๊ณ„ ์ˆ˜์ •

* Refactor | CAKK-41 | ์ผ€์ดํฌ ์ƒต ๊ด€๋ จ ๊ธฐ๋Šฅ ์ด๊ด€

* Refactor | CAKK-41 | kotlin ๊ด€๋ จ ์„ค์ •

* Refactor | CAKK-41 | kotlin ๊ด€๋ จ ์„ค์ •

* Refactor | CAKK-54 |  ์ผ€์ดํฌ ํ•˜ํŠธ ๊ธฐ๋Šฅ ๋ฆฌํŒฉํ† ๋ง

* Refactor | CAKK-54 | ๋„๋ฉ”์ธ์„ ํ™œ์šฉํ•œ ๋ฆฌํŒฉํ† ๋ง

* Refactor | CAKK-54 | ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋ฆฌํŒฉํ† ๋ง

* Test | CAKK-54 | ํ•˜ํŠธ ์ทจ์†Œ ๊ด€๋ จ TC ์ถ”๊ฐ€ ์ž‘์„ฑ

* Refactor | CAKK-54 | fetch join์„ ํ™œ์šฉํ•œ ๋ฆฌํŒฉํ† 

* Refactor | CAKK-54 | fetch join์„ ํ™œ์šฉํ•œ ๋ฆฌํŒฉํ† ๋ง

* Refactor | CAKK-54 | ๋ฏธ์‚ฌ์šฉ ๋ฉ”์„œ๋“œ ์ œ๊ฑฐ

* Test | CAKK-54 | ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ˆ˜์ •

* Refactor | CAKK-54 | ์ฝ”๋“œ ๋ฆฌ๋ทฐ ๋ฐ˜์˜

* Test | CAKK-54 | Test ๊ด€๋ จ Sql ์Šคํฌ๋ฆฝํŠธ ์ˆ˜์ •

* Refactor | CAKK-55 | ์ผ€์ดํฌ์ƒต ํ•˜ํŠธ ๋ฐ ๊ธฐ๋Œ€๋ผ์š” ๊ธฐ๋Šฅ ๋ฆฌํŒฉํ† ๋ง

* Refactor | CAKK-55 | Redis Repository์— ์ถ”์ƒํ™” ์ ์šฉ

* Refactor | CAKK-55 | ์ผ€์ดํฌ ์ƒต ํ•˜ํŠธ, ๊ธฐ๋Œ€๋ผ์š” ๋ฉ”์„œ๋“œ ๋ฆฌํŒฉํ† ๋ง

* Refactor | CAKK-55 | ๋ฏธ์‚ฌ์šฉ ๋ฉ”์„œ๋“œ ์‚ญ์ œ

* Refactor | CAKK-55 | Facade ํŒจํ„ด ์ ์šฉ

* Test | CAKK-55 | ๋ฆฌํŒฉํ† ๋ง ๋กœ์ง ํ…Œ์ŠคํŠธ ์ž‘์„ฑ

* Chore | CAKK-55 | Fixture Monkey ๋ฒ„์ „์—…

* Chore | CAKK-55 | test ํŒŒ์ผ ๊ฒฝ๋กœ ์ถ”๊ฐ€

* Fix | CAKK-56 | git ์ถฉ๋Œ ํ•ด๊ฒฐ

* Fix | CAKK-56 | git ์ถฉ๋Œ ํ•ด๊ฒฐ

* Refactor | CAKK-56 | checkstyle ๋ฐ˜์˜

---------

Co-authored-by: ๊น€ํƒœ์šฉ <amico741@naver.com>
Co-authored-by: TAEYONG KIM <86272688+YongsHub@users.noreply.github.com>
  • Loading branch information
3 people authored Aug 28, 2024
1 parent 9ee7343 commit 3aef33c
Show file tree
Hide file tree
Showing 34 changed files with 531 additions and 234 deletions.
4 changes: 3 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,9 @@ jobs:
uses: EnricoMi/publish-unit-test-result-action@v2
if: always()
with:
files: ./cakk-api/build/test-results/**/*.xml
files: |
./cakk-api/build/test-results/**/*.xml
./cakk-domain/mysql/build/test-results/**/*.xml
- name: Upload test coverage
id: jacoco
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,6 @@ public ApiResponse<Void> like(
@SignInUser User user,
@PathVariable Long cakeShopId
) {
likeService.validateLikeCount(user, cakeShopId);
likeService.likeCakeShop(user, cakeShopId);

return ApiResponse.success();
Expand Down
28 changes: 10 additions & 18 deletions cakk-api/src/main/java/com/cakk/api/service/like/HeartService.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,21 +16,16 @@
import com.cakk.api.mapper.CakeMapper;
import com.cakk.api.mapper.HeartMapper;
import com.cakk.api.mapper.ShopMapper;
import com.cakk.common.enums.RedisKey;
import com.cakk.domain.mysql.dto.param.like.HeartCakeImageResponseParam;
import com.cakk.domain.mysql.dto.param.like.HeartCakeShopResponseParam;
import com.cakk.domain.mysql.entity.cake.Cake;
import com.cakk.domain.mysql.entity.cake.CakeHeart;
import com.cakk.domain.mysql.entity.shop.CakeShop;
import com.cakk.domain.mysql.entity.shop.CakeShopHeart;
import com.cakk.domain.mysql.entity.user.User;
import com.cakk.domain.mysql.facade.user.UserHeartFacade;
import com.cakk.domain.mysql.repository.reader.CakeHeartReader;
import com.cakk.domain.mysql.repository.reader.CakeReader;
import com.cakk.domain.mysql.repository.reader.CakeShopHeartReader;
import com.cakk.domain.mysql.repository.reader.CakeShopReader;
import com.cakk.domain.mysql.repository.writer.CakeHeartWriter;
import com.cakk.domain.mysql.repository.writer.CakeShopHeartWriter;
import com.cakk.domain.redis.repository.LockRedisRepository;

@RequiredArgsConstructor
@Service
Expand All @@ -39,9 +34,8 @@ public class HeartService {
private final CakeReader cakeReader;
private final CakeShopReader cakeShopReader;
private final CakeHeartReader cakeHeartReader;
private final CakeHeartWriter cakeHeartWriter;
private final CakeShopHeartReader cakeShopHeartReader;
private final CakeShopHeartWriter cakeShopHeartWriter;
private final UserHeartFacade userHeartFacade;

@Transactional(readOnly = true)
public HeartCakeImageListResponse searchCakeImagesByCursorAndHeart(
Expand Down Expand Up @@ -73,33 +67,31 @@ public HeartCakeShopListResponse searchCakeShopByCursorAndHeart(

@Transactional(readOnly = true)
public HeartResponse isHeartCake(final User user, final Long cakeId) {
final Cake cake = cakeReader.findById(cakeId);
final boolean isHeart = cakeHeartReader.existsByUserAndCake(user, cake);
final Cake cake = cakeReader.findByIdWithHeart(cakeId);
final boolean isHeart = cake.isHeartedBy(user);

return HeartMapper.supplyHeartResponseBy(isHeart);
}

@Transactional(readOnly = true)
public HeartResponse isHeartCakeShop(final User user, final Long cakeShopId) {
final CakeShop cakeShop = cakeShopReader.findById(cakeShopId);
final boolean isHeart = cakeShopHeartReader.existsByUserAndCakeShop(user, cakeShop);
final CakeShop cakeShop = cakeShopReader.findByIdWithHeart(cakeShopId);
final boolean isHeart = cakeShop.isHeartedBy(user);

return HeartMapper.supplyHeartResponseBy(isHeart);
}

@DistributedLock(key = "#cakeId")
public void heartCake(final User user, final Long cakeId) {
final Cake cake = cakeReader.findById(cakeId);
final CakeHeart cakeHeart = cakeHeartReader.findOrNullByUserAndCake(user, cake);
final Cake cake = cakeReader.findByIdWithHeart(cakeId);

cakeHeartWriter.heartOrCancel(cakeHeart, user, cake);
userHeartFacade.heartCake(user, cake);
}

@DistributedLock(key = "#cakeShopId")
public void heartCakeShop(final User user, final Long cakeShopId) {
final CakeShop cakeShop = cakeShopReader.findById(cakeShopId);
final CakeShopHeart cakeShopHeart = cakeShopHeartReader.findOrNullByUserAndCakeShop(user, cakeShop);
final CakeShop cakeShop = cakeShopReader.findByIdWithHeart(cakeShopId);

cakeShopHeartWriter.heartOrCancel(cakeShopHeart, user, cakeShop);
userHeartFacade.heartCakeShop(user, cakeShop);
}
}
22 changes: 4 additions & 18 deletions cakk-api/src/main/java/com/cakk/api/service/like/LikeService.java
Original file line number Diff line number Diff line change
@@ -1,40 +1,26 @@
package com.cakk.api.service.like;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import lombok.RequiredArgsConstructor;

import com.cakk.api.annotation.DistributedLock;
import com.cakk.common.enums.ReturnCode;
import com.cakk.common.exception.CakkException;
import com.cakk.domain.mysql.entity.shop.CakeShop;
import com.cakk.domain.mysql.entity.user.User;
import com.cakk.domain.mysql.repository.reader.CakeShopLikeReader;
import com.cakk.domain.mysql.facade.user.UserLikeFacade;
import com.cakk.domain.mysql.repository.reader.CakeShopReader;
import com.cakk.domain.mysql.repository.writer.CakeShopLikeWriter;

@Service
@RequiredArgsConstructor
public class LikeService {

private final CakeShopReader cakeShopReader;
private final CakeShopLikeReader cakeShopLikeReader;
private final CakeShopLikeWriter cakeShopLikeWriter;

@Transactional(readOnly = true)
public void validateLikeCount(final User user, final Long cakeShopId) {
final int likeCount = cakeShopLikeReader.countByCakeShopIdAndUser(cakeShopId, user);

if (likeCount >= 50) {
throw new CakkException(ReturnCode.MAX_CAKE_SHOP_LIKE);
}
}
private final UserLikeFacade userCakeFacade;

@DistributedLock(key = "#cakeShopId")
public void likeCakeShop(final User user, final Long cakeShopId) {
final CakeShop cakeShop = cakeShopReader.findById(cakeShopId);
final CakeShop cakeShop = cakeShopReader.findByIdWithLike(cakeShopId);

cakeShopLikeWriter.like(cakeShop, user);
userCakeFacade.likeCakeShop(user, cakeShop);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,17 +21,15 @@
import com.cakk.domain.mysql.dto.param.like.HeartCakeImageResponseParam;
import com.cakk.domain.mysql.entity.cake.Cake;
import com.cakk.domain.mysql.entity.shop.CakeShop;
import com.cakk.domain.mysql.entity.shop.CakeShopHeart;
import com.cakk.domain.mysql.entity.user.User;
import com.cakk.domain.mysql.facade.user.UserHeartFacade;
import com.cakk.domain.mysql.repository.reader.CakeHeartReader;
import com.cakk.domain.mysql.repository.reader.CakeReader;
import com.cakk.domain.mysql.repository.reader.CakeShopHeartReader;
import com.cakk.domain.mysql.repository.reader.CakeShopReader;
import com.cakk.domain.mysql.repository.writer.CakeHeartWriter;
import com.cakk.domain.mysql.repository.writer.CakeShopHeartWriter;

@DisplayName("ํ•˜ํŠธ ๊ธฐ๋Šฅ ๊ด€๋ จ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ํ…Œ์ŠคํŠธ")
public class HeartServiceTest extends ServiceTest {
class HeartServiceTest extends ServiceTest {

@InjectMocks
private HeartService heartService;
Expand All @@ -45,14 +43,12 @@ public class HeartServiceTest extends ServiceTest {
@Mock
private CakeHeartReader cakeHeartReader;

@Mock
private CakeHeartWriter cakeHeartWriter;

@Mock
private CakeShopHeartReader cakeShopHeartReader;

@Mock
private CakeShopHeartWriter cakeShopHeartWriter;
private UserHeartFacade userHeartFacade;


@TestWithDisplayName("ํ•˜ํŠธ ํ•œ ์ผ€์ดํฌ ๋ชฉ๋ก์„ ์กฐํšŒํ•œ๋‹ค.")
void findCakeImagesByCursorAndHeart() {
Expand Down Expand Up @@ -135,59 +131,53 @@ void heartCake1() {
final Long cakeId = 1L;
final Cake cake = getConstructorMonkey().giveMeOne(Cake.class);

doReturn(cake).when(cakeReader).findById(cakeId);
doReturn(null).when(cakeHeartReader).findOrNullByUserAndCake(user, cake);
doReturn(cake).when(cakeReader).findByIdWithHeart(cakeId);
doNothing().when(userHeartFacade).heartCake(user, cake);

// when & then
assertDoesNotThrow(() -> heartService.heartCake(user, cakeId));

verify(cakeReader, times(1)).findById(cakeId);
verify(cakeHeartReader, times(1)).findOrNullByUserAndCake(user, cake);
verify(cakeReader, times(1)).findByIdWithHeart(cakeId);
verify(userHeartFacade, times(1)).heartCake(user, cake);
}

@TestWithDisplayName("ํ•ด๋‹น ์ผ€์ดํฌ๊ฐ€ ์—†์œผ๋ฉด ํ•˜ํŠธ ๋™์ž‘์„ ์‹คํŒจํ•œ๋‹ค.")
@TestWithDisplayName("์ผ€์ดํฌ์— ๋Œ€ํ•˜์—ฌ ํ•˜ํŠธ ์ทจ์†Œ๋ฅผ ๋™์ž‘ํ•œ๋‹ค.")
void heartCake2() {
// given
final User user = getUser();
final Long cakeId = 1L;
final Cake cake = getConstructorMonkey().giveMeOne(Cake.class);
cake.heart(user);

doThrow(new CakkException(ReturnCode.NOT_EXIST_CAKE)).when(cakeReader).findById(cakeId);
doReturn(cake).when(cakeReader).findByIdWithHeart(cakeId);
doNothing().when(userHeartFacade).heartCake(user, cake);

// when & then
assertThrows(
CakkException.class,
() -> heartService.heartCake(user, cakeId),
ReturnCode.NOT_EXIST_CAKE.getMessage());
assertDoesNotThrow(() -> heartService.heartCake(user, cakeId));

verify(cakeReader, times(1)).findById(cakeId);
verify(cakeHeartReader, times(0)).findOrNullByUserAndCake(user, cake);
verify(cakeReader, times(1)).findByIdWithHeart(cakeId);
verify(userHeartFacade, times(1)).heartCake(user, cake);
}

@TestWithDisplayName("์ผ€์ดํฌ ์ƒต์— ๋Œ€ํ•˜์—ฌ ํ•˜ํŠธ๋ฅผ ๋™์ž‘ํ•œ๋‹ค.")
void heartCakeShop1() {
@TestWithDisplayName("ํ•ด๋‹น ์ผ€์ดํฌ๊ฐ€ ์—†์œผ๋ฉด ํ•˜ํŠธ ๋™์ž‘์„ ์‹คํŒจํ•œ๋‹ค.")
void heartCake3() {
// given
final User user = getUser();
final Long cakeShopId = 1L;
final CakeShop cakeShop = getConstructorMonkey().giveMeBuilder(CakeShop.class)
.set("shopName", Arbitraries.strings().withCharRange('a', 'z').ofMaxLength(30))
.set("shopBio", Arbitraries.strings().withCharRange('a', 'z').ofMaxLength(40))
.set("shopDescription", Arbitraries.strings().withCharRange('a', 'z').ofMaxLength(500))
.set("location", supplyPointBy(Arbitraries.doubles().sample(), Arbitraries.doubles().sample()))
.sample();
final Long cakeId = 1L;

doReturn(cakeShop).when(cakeShopReader).findById(cakeShopId);
doReturn(null).when(cakeShopHeartReader).findOrNullByUserAndCakeShop(user, cakeShop);
doThrow(new CakkException(ReturnCode.NOT_EXIST_CAKE)).when(cakeReader).findByIdWithHeart(cakeId);

// when & then
assertDoesNotThrow(() -> heartService.heartCakeShop(user, cakeShopId));
assertThrows(
CakkException.class,
() -> heartService.heartCake(user, cakeId),
ReturnCode.NOT_EXIST_CAKE.getMessage());

verify(cakeShopReader, times(1)).findById(cakeShopId);
verify(cakeShopHeartReader, times(1)).findOrNullByUserAndCakeShop(user, cakeShop);
verify(cakeReader, times(1)).findByIdWithHeart(cakeId);
}

@TestWithDisplayName("์ผ€์ดํฌ ์ƒต์— ๋Œ€ํ•˜์—ฌ ํ•˜ํŠธ ์ทจ์†Œ๋ฅผ ๋™์ž‘ํ•œ๋‹ค.")
void heartCakeShop2() {
@TestWithDisplayName("์ผ€์ดํฌ ์ƒต์— ๋Œ€ํ•˜์—ฌ ํ•˜ํŠธ๋ฅผ ๋™์ž‘ํ•œ๋‹ค.")
void heartCakeShop1() {
// given
final User user = getUser();
final Long cakeShopId = 1L;
Expand All @@ -197,16 +187,15 @@ void heartCakeShop2() {
.set("shopDescription", Arbitraries.strings().withCharRange('a', 'z').ofMaxLength(500))
.set("location", supplyPointBy(Arbitraries.doubles().sample(), Arbitraries.doubles().sample()))
.sample();
final CakeShopHeart cakeShopHeart = getConstructorMonkey().giveMeOne(CakeShopHeart.class);

doReturn(cakeShop).when(cakeShopReader).findById(cakeShopId);
doReturn(cakeShopHeart).when(cakeShopHeartReader).findOrNullByUserAndCakeShop(user, cakeShop);
doReturn(cakeShop).when(cakeShopReader).findByIdWithHeart(cakeShopId);
doNothing().when(userHeartFacade).heartCakeShop(user, cakeShop);

// when & then
assertDoesNotThrow(() -> heartService.heartCakeShop(user, cakeShopId));

verify(cakeShopReader, times(1)).findById(cakeShopId);
verify(cakeShopHeartReader, times(1)).findOrNullByUserAndCakeShop(user, cakeShop);
verify(cakeShopReader, times(1)).findByIdWithHeart(cakeShopId);
verify(userHeartFacade, times(1)).heartCakeShop(user, cakeShop);
}

@TestWithDisplayName("ํ•ด๋‹น ์ผ€์ดํฌ ์ƒต์ด ์—†์œผ๋ฉด ํ•˜ํŠธ ๋™์ž‘์„ ์‹คํŒจํ•œ๋‹ค.")
Expand All @@ -215,15 +204,15 @@ void heartCakeShop3() {
final User user = getUser();
final Long cakeShopId = 1L;

doThrow(new CakkException(ReturnCode.NOT_EXIST_CAKE_SHOP)).when(cakeShopReader).findById(cakeShopId);
doThrow(new CakkException(ReturnCode.NOT_EXIST_CAKE_SHOP)).when(cakeShopReader).findByIdWithHeart(cakeShopId);

// when & then
assertThrows(
CakkException.class,
() -> heartService.heartCakeShop(user, cakeShopId),
ReturnCode.NOT_EXIST_CAKE_SHOP.getMessage());

verify(cakeShopReader, times(1)).findById(cakeShopId);
verify(cakeShopReader, times(1)).findByIdWithHeart(cakeShopId);
verify(cakeShopHeartReader, times(0)).findOrNullByUserAndCakeShop(any(User.class), any(CakeShop.class));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,10 @@

import com.cakk.api.common.annotation.TestWithDisplayName;
import com.cakk.api.common.base.ServiceTest;
import com.cakk.common.enums.ReturnCode;
import com.cakk.common.exception.CakkException;
import com.cakk.domain.mysql.entity.shop.CakeShop;
import com.cakk.domain.mysql.entity.user.User;
import com.cakk.domain.mysql.repository.reader.CakeShopLikeReader;
import com.cakk.domain.mysql.facade.user.UserLikeFacade;
import com.cakk.domain.mysql.repository.reader.CakeShopReader;
import com.cakk.domain.mysql.repository.writer.CakeShopLikeWriter;

@DisplayName("์ข‹์•„์š” ๊ธฐ๋Šฅ ๊ด€๋ จ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ํ…Œ์ŠคํŠธ")
public class LikeServiceTest extends ServiceTest {

Expand All @@ -29,39 +25,7 @@ public class LikeServiceTest extends ServiceTest {
private CakeShopReader cakeShopReader;

@Mock
private CakeShopLikeReader cakeShopLikeReader;

@Mock
private CakeShopLikeWriter cakeShopLikeWriter;

@TestWithDisplayName("์ข‹์•„์š” ๊ฐœ์ˆ˜ 50๊ฐœ๊ฐ€ ๋„˜์ง€ ์•Š์œผ๋ฉด ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ์— ํ†ต๊ณผํ•œ๋‹ค.")
void validateLikeCountSuccess() {
// given
final User user = getUser();
final long cakeShopId = Arbitraries.longs().greaterOrEqual(1).sample();
final int likeCount = Arbitraries.integers().lessOrEqual(49).sample();

doReturn(likeCount).when(cakeShopLikeReader).countByCakeShopIdAndUser(cakeShopId, user);

// when & then
assertDoesNotThrow(() -> likeService.validateLikeCount(user, cakeShopId));
}

@TestWithDisplayName("์ข‹์•„์š” ๊ฐœ์ˆ˜ 50๊ฐœ๊ฐ€ ๋„˜์œผ๋ฉด ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ์—์„œ ์—๋Ÿฌ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.")
void validateLikeCountFail() {
// given
final User user = getUser();
final long cakeShopId = Arbitraries.longs().greaterOrEqual(1).sample();
final int likeCount = Arbitraries.integers().greaterOrEqual(50).sample();

doReturn(likeCount).when(cakeShopLikeReader).countByCakeShopIdAndUser(cakeShopId, user);

// when & then
assertThrows(
CakkException.class,
() -> likeService.validateLikeCount(user, cakeShopId),
ReturnCode.MAX_CAKE_SHOP_LIKE.getMessage());
}
private UserLikeFacade userLikeFacade;

@TestWithDisplayName("์ผ€์ดํฌ ์ƒต ์ข‹์•„์š”๋ฅผ ์„ฑ๊ณตํ•œ๋‹ค.")
void likeCakeShop() {
Expand All @@ -75,8 +39,8 @@ void likeCakeShop() {
.set("location", supplyPointBy(Arbitraries.doubles().sample(), Arbitraries.doubles().sample()))
.sample();

doReturn(cakeShop).when(cakeShopReader).findById(cakeShopId);
doNothing().when(cakeShopLikeWriter).like(cakeShop, user);
doReturn(cakeShop).when(cakeShopReader).findByIdWithLike(cakeShopId);
doNothing().when(userLikeFacade).likeCakeShop(user, cakeShop);

// when
likeService.likeCakeShop(user, cakeShopId);
Expand Down
2 changes: 1 addition & 1 deletion cakk-api/src/test/resources/sql/insert-cake-shop.sql
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ SET @g9 = 'Point(37.543343 127.052609)';
SET @g10 = 'Point(37.541530 127.054164)';

insert into cake_shop (shop_id, thumbnail_url, shop_name, shop_address, shop_bio, shop_description, location, like_count, heart_count, created_at, updated_at)
values (1, 'thumbnail_url1', '์ผ€์ดํฌ ๋ง›์ง‘1', '์ผ€์ดํฌ ๋ง›์ง‘์ž…๋‹ˆ๋‹ค.', '์„œ์šธ์‹œ ๊ฐ•๋‚จ๊ตฌ ์–ด์ฉŒ๊ณ ๋กœ1', '์ผ€์ดํฌ ๋ง›์ง‘์ž…๋‹ˆ๋‹ค.', ST_GeomFromText(@g1, 4326), 0, 0, now(), now()),
values (1, 'thumbnail_url1', '์ผ€์ดํฌ ๋ง›์ง‘1', '์ผ€์ดํฌ ๋ง›์ง‘์ž…๋‹ˆ๋‹ค.', '์„œ์šธ์‹œ ๊ฐ•๋‚จ๊ตฌ ์–ด์ฉŒ๊ณ ๋กœ1', '์ผ€์ดํฌ ๋ง›์ง‘์ž…๋‹ˆ๋‹ค.', ST_GeomFromText(@g1, 4326), 0, 1, now(), now()),
(2, 'thumbnail_url2', '์ผ€์ดํฌ ๋ง›์ง‘2', '์ผ€์ดํฌ ๋ง›์ง‘์ž…๋‹ˆ๋‹ค.', '์„œ์šธ์‹œ ๊ฐ•๋‚จ๊ตฌ ์–ด์ฉŒ๊ณ ๋กœ2', '์ผ€์ดํฌ ๋ง›์ง‘์ž…๋‹ˆ๋‹ค.', ST_GeomFromText(@g2, 4326), 0, 0, now(), now()),
(3, 'thumbnail_url3', '์ผ€์ดํฌ ๋ง›์ง‘3', '์ผ€์ดํฌ ๋ง›์ง‘์ž…๋‹ˆ๋‹ค.', '์„œ์šธ์‹œ ๊ฐ•๋‚จ๊ตฌ ์–ด์ฉŒ๊ณ ๋กœ3', '์ผ€์ดํฌ ๋ง›์ง‘์ž…๋‹ˆ๋‹ค.', ST_GeomFromText(@g3, 4326), 0, 0, now(), now()),
(4, 'thumbnail_url4', '์ผ€์ดํฌ ๋ง›์ง‘4', '์ผ€์ดํฌ ๋ง›์ง‘์ž…๋‹ˆ๋‹ค.', '์„œ์šธ์‹œ ๊ฐ•๋‚จ๊ตฌ ์–ด์ฉŒ๊ณ ๋กœ3', '์ผ€์ดํฌ ๋ง›์ง‘์ž…๋‹ˆ๋‹ค.', ST_GeomFromText(@g4, 4326), 0, 0, now(), now()),
Expand Down
2 changes: 1 addition & 1 deletion cakk-api/src/test/resources/sql/insert-cake.sql
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ values (1, 1, 0, '10:00:00', '22:00:00', now(), now()),
insert into cake (cake_id, shop_id, cake_image_url, heart_count, created_at, updated_at)
values (1, 1, 'cake_image_url1', 0, now(), now()),
(2, 1, 'cake_image_url2', 0, now(), now()),
(3, 1, 'cake_image_url3', 0, now(), now()),
(3, 1, 'cake_image_url3', 1, now(), now()),
(4, 2, 'cake_image_url4', 0, now(), now()),
(5, 2, 'cake_image_url5', 0, now(), now()),
(6, 2, 'cake_image_url6', 0, now(), now()),
Expand Down
2 changes: 1 addition & 1 deletion cakk-domain/mysql/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ dependencies {
implementation 'io.hypersistence:hypersistence-utils-hibernate-63:3.7.4'

// test
testImplementation("com.navercorp.fixturemonkey:fixture-monkey-starter:1.0.16")
testImplementation("com.navercorp.fixturemonkey:fixture-monkey-starter:1.0.23")
testImplementation('org.assertj:assertj-core')
testImplementation('org.junit.jupiter:junit-jupiter')
testRuntimeOnly('org.junit.platform:junit-platform-launcher')
Expand Down
Loading

0 comments on commit 3aef33c

Please sign in to comment.