Skip to content

Commit

Permalink
test: 다이어리 조회 테스트코드 수정
Browse files Browse the repository at this point in the history
  • Loading branch information
koo995 committed Sep 28, 2024
1 parent 2410c4c commit 5c2be58
Show file tree
Hide file tree
Showing 4 changed files with 139 additions and 124 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,12 @@
import com.fasterxml.jackson.databind.ObjectMapper;
import flab.nutridiary.commom.generic.Nutrition;
import flab.nutridiary.diary.domain.*;
import flab.nutridiary.product.domain.ServingUnit;
import flab.nutridiary.diary.dto.request.AddDiaryRecordRequest;
import flab.nutridiary.diary.dto.request.DiaryRegisterRequest;
import flab.nutridiary.diary.repository.DiaryRepository;
import flab.nutridiary.product.domain.NutritionFacts;
import flab.nutridiary.product.domain.Product;
import flab.nutridiary.product.domain.ServingUnit;
import flab.nutridiary.product.repository.ProductRepository;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
Expand Down Expand Up @@ -202,8 +202,7 @@ void getDiary() throws Exception {
.andExpect(status().isOk())
.andExpect(jsonPath("$.statusCode").value(2001))
.andExpect(jsonPath("$.message").value("OK"))
.andExpect(jsonPath("$.data.diaryId").value(diaryId))
.andExpect(jsonPath("$.data.diaryDate").value("2024-08-10"))
.andExpect(jsonPath("$.data.diarySummary").exists());
.andExpect(jsonPath("$.data[0].diaryId").value(diaryId))
.andExpect(jsonPath("$.data[0].diaryDate").value("2024-08-10"));
}
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
package flab.nutridiary.diary.repository;

import flab.nutridiary.commom.generic.Nutrition;
import flab.nutridiary.diary.domain.*;
import flab.nutridiary.diary.dto.response.query.DiaryRetrievalQueryDto;
import flab.nutridiary.diary.domain.Diary;
import flab.nutridiary.diary.domain.DiaryRecord;
import flab.nutridiary.diary.domain.MealType;
import flab.nutridiary.product.domain.NutritionFacts;
import flab.nutridiary.product.domain.Product;
import flab.nutridiary.product.domain.ServingUnit;
Expand All @@ -29,8 +30,6 @@
@Transactional
@SpringBootTest
class DiaryRepositoryTest {
@Autowired
private NutritionCalculator nutritionCalculator;
@Autowired
private DiaryRepository diaryRepository;
@Autowired
Expand Down Expand Up @@ -139,73 +138,4 @@ void findById() throws Exception {
assertThat(findDiary).extracting("memberId", "diaryDate", "diaryRecords")
.containsExactly(memberId, date, Set.of(diaryRecord));
}

@DisplayName("memberId와 date로 DiaryRetrievalQueryDto를 조회한다.")
@Test
void findDiaryWithProductsByMemberIdAndDiaryDate() throws Exception {
// given
Diary diary = Diary.builder()
.diaryDate(LocalDate.of(2024, 8, 10))
.diaryRecord(DiaryRecord.of(
ProductIntakeInfo.builder()
.productId(savedProductIds.get(0))
.mealType("BREAKFAST")
.clientChoiceServingUnitDescription("개")
.quantity(valueOf(2))
.build(),
nutritionCalculator))
.build();
diary.addDiaryRecord(DiaryRecord.of(
ProductIntakeInfo.builder()
.productId(savedProductIds.get(1))
.mealType("BREAKFAST")
.clientChoiceServingUnitDescription("컵")
.quantity(valueOf(2))
.build(),
nutritionCalculator));
diary.addDiaryRecord(DiaryRecord.of(
ProductIntakeInfo.builder()
.productId(savedProductIds.get(0))
.mealType("LUNCH")
.clientChoiceServingUnitDescription("gram")
.quantity(valueOf(200))
.build(),
nutritionCalculator));
Long diaryId = diaryRepository.save(diary).getId();

// when
DiaryRetrievalQueryDto result = diaryRepository.findDiaryWithProductsByMemberIdAndDiaryDate(memberId, LocalDate.of(2024, 8, 10)).get();
System.out.println(result.getDiarySummary().getBreakfast().getDiaryRecords());
System.out.println(result.getDiarySummary().getLunch().getDiaryRecords());
System.out.println(result.getDiarySummary().getDinner().getDiaryRecords());
System.out.println(result.getDiarySummary().getSnack().getDiaryRecords());

// then
Nutrition expectedTotalNutrition = Nutrition.of(valueOf(800), valueOf(70), valueOf(100), valueOf(120));
Nutrition expectedBreakfastNutrition = Nutrition.of(valueOf(600), valueOf(50), valueOf(60), valueOf(60));
Nutrition expectedLunchNutrition = Nutrition.of(valueOf(200), valueOf(20), valueOf(40), valueOf(60));
Nutrition expectedDinnerNutrition = Nutrition.empty();
Nutrition expectedSnackNutrition = Nutrition.empty();

assertThat(result.getDiaryId()).isEqualTo(diaryId);
assertThat(result.getMemberId()).isEqualTo(memberId);
assertThat(result.getDiaryDate()).isEqualTo(LocalDate.of(2024, 8, 10));
assertThat(result.getDiarySummary().getDiaryTotalCalculatedNutrition()).isEqualTo(expectedTotalNutrition);
//breakfast
assertThat(result.getDiarySummary().getBreakfast().getMealType()).isEqualTo(MealType.BREAKFAST);
assertThat(result.getDiarySummary().getBreakfast().getMealTotalCalculatedNutrition()).isEqualTo(expectedBreakfastNutrition);
assertThat(result.getDiarySummary().getBreakfast().getDiaryRecords()).hasSize(2);
//lunch
assertThat(result.getDiarySummary().getLunch().getMealType()).isEqualTo(MealType.LUNCH);
assertThat(result.getDiarySummary().getLunch().getMealTotalCalculatedNutrition()).isEqualTo(expectedLunchNutrition);
assertThat(result.getDiarySummary().getLunch().getDiaryRecords()).hasSize(1);
//dinner
assertThat(result.getDiarySummary().getDinner().getMealType()).isEqualTo(MealType.DINNER);
assertThat(result.getDiarySummary().getDinner().getMealTotalCalculatedNutrition()).isEqualTo(expectedDinnerNutrition);
assertThat(result.getDiarySummary().getDinner().getDiaryRecords()).isEmpty();
//snack
assertThat(result.getDiarySummary().getSnack().getMealType()).isEqualTo(MealType.SNACK);
assertThat(result.getDiarySummary().getSnack().getMealTotalCalculatedNutrition()).isEqualTo(expectedSnackNutrition);
assertThat(result.getDiarySummary().getSnack().getDiaryRecords()).isEmpty();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
package flab.nutridiary.diary.repository;

import flab.nutridiary.commom.generic.Nutrition;
import flab.nutridiary.diary.domain.*;
import flab.nutridiary.diary.dto.response.query.DiaryRecordWithProduct;
import flab.nutridiary.product.domain.NutritionFacts;
import flab.nutridiary.product.domain.Product;
import flab.nutridiary.product.domain.ServingUnit;
import flab.nutridiary.product.repository.ProductRepository;
import org.assertj.core.api.Assertions;
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.test.context.ActiveProfiles;
import org.springframework.transaction.annotation.Transactional;

import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;

import static java.math.BigDecimal.valueOf;

@ActiveProfiles("test")
@Transactional
@SpringBootTest
class DiaryRetrievalRepositoryTest{
@Autowired
private NutritionCalculator nutritionCalculator;
@Autowired
private DiaryRetrievalRepository diaryRetrievalRepository;
@Autowired
private DiaryRepository diaryRepository;
@Autowired
private ProductRepository productRepository;
private List<Long> savedProductIds = new ArrayList<>();
private Long memberId = 1L;

@BeforeEach
void init() {
Product product1 = Product.builder()
.productName("사과")
.productCorp("사과회사")
.nutritionFacts(NutritionFacts.builder()
.nutritionPerOneServingUnit(Nutrition.of(valueOf(50), valueOf(5), valueOf(10), valueOf(15)))
.allowedProductServingUnits(
new ArrayList<>(List.of(
ServingUnit.asOneServingUnit("개"),
ServingUnit.ofGram(BigDecimal.ONE, valueOf(50)))))
.build())
.build();

Product product2 = Product.builder()
.productName("바나나")
.productCorp("바나나회사")
.nutritionFacts(NutritionFacts.builder()
.nutritionPerOneServingUnit(Nutrition.of(valueOf(250), valueOf(20), valueOf(20), valueOf(15)))
.allowedProductServingUnits(
new ArrayList<>(List.of(
ServingUnit.asOneServingUnit("컵"),
ServingUnit.ofGram(BigDecimal.ONE, valueOf(150)))))
.build())
.build();
savedProductIds.add(productRepository.save(product1).getId());
savedProductIds.add(productRepository.save(product2).getId());
}

@DisplayName("memberId와 date로 DiaryRecordWithProduct 리스트를 조회한다.")
@Test
void findDiaryWithProductsByMemberIdAndDiaryDate() throws Exception {
// given
Diary diary = Diary.builder()
.diaryDate(LocalDate.of(2024, 8, 10))
.diaryRecord(DiaryRecord.of(
ProductIntakeInfo.builder()
.productId(savedProductIds.get(0))
.mealType("BREAKFAST")
.clientChoiceServingUnitDescription("개")
.quantity(valueOf(2))
.build(),
nutritionCalculator))
.build();
diary.addDiaryRecord(DiaryRecord.of(
ProductIntakeInfo.builder()
.productId(savedProductIds.get(1))
.mealType("BREAKFAST")
.clientChoiceServingUnitDescription("컵")
.quantity(valueOf(2))
.build(),
nutritionCalculator));
diary.addDiaryRecord(DiaryRecord.of(
ProductIntakeInfo.builder()
.productId(savedProductIds.get(0))
.mealType("LUNCH")
.clientChoiceServingUnitDescription("gram")
.quantity(valueOf(200))
.build(),
nutritionCalculator));
Long diaryId = diaryRepository.save(diary).getId();

// when
List<DiaryRecordWithProduct> results = diaryRetrievalRepository.findDiaryWithProductAllByMemberIdAndDiaryDate(memberId, LocalDate.of(2024, 8, 10));

// then
List<DiaryRecordWithProduct> expectedResults = List.of(
new DiaryRecordWithProduct(1L, 1L, LocalDate.of(2024, 8, 10), 1L, MealType.BREAKFAST, "사과", "사과회사", valueOf(2), "개", Nutrition.of(valueOf(100), valueOf(10), valueOf(20), valueOf(30))),
new DiaryRecordWithProduct(1L, 1L, LocalDate.of(2024, 8, 10), 2L, MealType.LUNCH, "사과", "사과회사", valueOf(200), "gram", Nutrition.of(valueOf(200), valueOf(20), valueOf(40), valueOf(60))),
new DiaryRecordWithProduct(1L, 1L, LocalDate.of(2024, 8, 10), 3L, MealType.BREAKFAST, "바나나", "바나나회사", valueOf(2), "컵", Nutrition.of(valueOf(500), valueOf(40), valueOf(40), valueOf(30)))
);

Assertions.assertThat(results).containsExactlyInAnyOrderElementsOf(expectedResults);
}


}
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
package flab.nutridiary.diary.service;

import flab.nutridiary.commom.exception.BusinessException;
import flab.nutridiary.commom.generic.Nutrition;
import flab.nutridiary.diary.domain.*;
import flab.nutridiary.diary.dto.response.query.DiaryRetrievalQueryDto;
import flab.nutridiary.diary.dto.response.query.DiaryRecordWithProduct;
import flab.nutridiary.diary.repository.DiaryRepository;
import flab.nutridiary.product.domain.NutritionFacts;
import flab.nutridiary.product.domain.Product;
import flab.nutridiary.product.domain.ServingUnit;
import flab.nutridiary.product.repository.ProductRepository;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
Expand All @@ -23,8 +23,6 @@
import java.util.List;

import static java.math.BigDecimal.valueOf;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertThrows;

@ActiveProfiles("test")
@Transactional
Expand All @@ -39,9 +37,6 @@ class DiaryRetrievalServiceTest {
@Autowired
private ProductRepository productRepository;
private List<Long> savedProductIds = new ArrayList<>();
private Long memberId = 1L;
LocalDate date = LocalDate.of(2024, 8, 10);
private Long diaryId;

@BeforeEach
void init() {
Expand Down Expand Up @@ -74,7 +69,7 @@ void init() {

// diary
Diary diary = Diary.builder()
.diaryDate(date)
.diaryDate(LocalDate.of(2024, 8, 10))
.diaryRecord(DiaryRecord.of(
ProductIntakeInfo.builder()
.productId(savedProductIds.get(0))
Expand All @@ -100,52 +95,26 @@ void init() {
.quantity(valueOf(200))
.build(),
nutritionCalculator));
diaryId = diaryRepository.save(diary).getId();
diaryRepository.save(diary);
}

@DisplayName("memberId와 date로 DiaryRetrievalQueryDto를 조회할 수 있다.")
@Test
void getDiary() throws Exception {
Nutrition expectedTotalNutrition = Nutrition.of(valueOf(800), valueOf(70), valueOf(100), valueOf(120));
Nutrition expectedBreakfastNutrition = Nutrition.of(valueOf(600), valueOf(50), valueOf(60), valueOf(60));
Nutrition expectedLunchNutrition = Nutrition.of(valueOf(200), valueOf(20), valueOf(40), valueOf(60));
Nutrition expectedDinnerNutrition = Nutrition.empty();
Nutrition expectedSnackNutrition = Nutrition.empty();

DiaryRetrievalQueryDto diary = diaryRetrievalService.getDiary(memberId, date);
// given
Long memberId = 1L;
LocalDate date = LocalDate.of(2024, 8, 10);

assertThat(diary.getDiaryId()).isEqualTo(diaryId);
assertThat(diary.getMemberId()).isEqualTo(memberId);
assertThat(diary.getDiaryDate()).isEqualTo(LocalDate.of(2024, 8, 10));
assertThat(diary.getDiarySummary().getDiaryTotalCalculatedNutrition()).isEqualTo(expectedTotalNutrition);
//breakfast
assertThat(diary.getDiarySummary().getBreakfast().getMealType()).isEqualTo(MealType.BREAKFAST);
assertThat(diary.getDiarySummary().getBreakfast().getMealTotalCalculatedNutrition()).isEqualTo(expectedBreakfastNutrition);
assertThat(diary.getDiarySummary().getBreakfast().getDiaryRecords()).hasSize(2);
//lunch
assertThat(diary.getDiarySummary().getLunch().getMealType()).isEqualTo(MealType.LUNCH);
assertThat(diary.getDiarySummary().getLunch().getMealTotalCalculatedNutrition()).isEqualTo(expectedLunchNutrition);
assertThat(diary.getDiarySummary().getLunch().getDiaryRecords()).hasSize(1);
//dinner
assertThat(diary.getDiarySummary().getDinner().getMealType()).isEqualTo(MealType.DINNER);
assertThat(diary.getDiarySummary().getDinner().getMealTotalCalculatedNutrition()).isEqualTo(expectedDinnerNutrition);
assertThat(diary.getDiarySummary().getDinner().getDiaryRecords()).isEmpty();
//snack
assertThat(diary.getDiarySummary().getSnack().getMealType()).isEqualTo(MealType.SNACK);
assertThat(diary.getDiarySummary().getSnack().getMealTotalCalculatedNutrition()).isEqualTo(expectedSnackNutrition);
assertThat(diary.getDiarySummary().getSnack().getDiaryRecords()).isEmpty();
}
//when
List<DiaryRecordWithProduct> results = diaryRetrievalService.getDiary(memberId, date);

@DisplayName("memberId와 date로 DiaryRetrievalQueryDto를 조회할 수 없으면 예외가 발생한다.")
@Test
void getDiaryEx() throws Exception {
// given
Long UnknownMemberId = 20L;
// then
List<DiaryRecordWithProduct> expectedResults = List.of(
new DiaryRecordWithProduct(1L, 1L, LocalDate.of(2024, 8, 10), 1L, MealType.BREAKFAST, "사과", "사과회사", valueOf(2), "개", Nutrition.of(valueOf(100), valueOf(10), valueOf(20), valueOf(30))),
new DiaryRecordWithProduct(1L, 1L, LocalDate.of(2024, 8, 10), 2L, MealType.LUNCH, "사과", "사과회사", valueOf(200), "gram", Nutrition.of(valueOf(200), valueOf(20), valueOf(40), valueOf(60))),
new DiaryRecordWithProduct(1L, 1L, LocalDate.of(2024, 8, 10), 3L, MealType.BREAKFAST, "바나나", "바나나회사", valueOf(2), "컵", Nutrition.of(valueOf(500), valueOf(40), valueOf(40), valueOf(30)))
);

// when then
BusinessException exception = assertThrows(BusinessException.class, () ->
diaryRetrievalService.getDiary(UnknownMemberId, date));
assertThat(exception.getStatusCode()).isEqualTo(4004);
assertThat(exception.getMessage()).isEqualTo("해당 다이어리를 찾을 수 없습니다.");
Assertions.assertThat(results).containsExactlyInAnyOrderElementsOf(expectedResults);
}
}

0 comments on commit 5c2be58

Please sign in to comment.