diff --git a/src/main/java/com/dnd/runus/infrastructure/persistence/jooq/scale/JooqScaleRepository.java b/src/main/java/com/dnd/runus/infrastructure/persistence/jooq/scale/JooqScaleRepository.java index a6954190..7ec7ffc6 100644 --- a/src/main/java/com/dnd/runus/infrastructure/persistence/jooq/scale/JooqScaleRepository.java +++ b/src/main/java/com/dnd/runus/infrastructure/persistence/jooq/scale/JooqScaleRepository.java @@ -35,7 +35,10 @@ public List findAchievableScaleIds(long memberId) { .fields("id", "cumulative_sum") .as(select( SCALE.ID, - sum(SCALE.SIZE_METER).over().orderBy(SCALE.ID).cast(int.class)) + sum(SCALE.SIZE_METER) + .over() + .orderBy(SCALE.INDEX) + .cast(int.class)) .from(SCALE)); return dsl.with(totalDistance) diff --git a/src/test/java/com/dnd/runus/infrastructure/persistence/domain/scale/ScaleRepositoryImplTest.java b/src/test/java/com/dnd/runus/infrastructure/persistence/domain/scale/ScaleRepositoryImplTest.java index 7addacaf..3c3d2e1e 100644 --- a/src/test/java/com/dnd/runus/infrastructure/persistence/domain/scale/ScaleRepositoryImplTest.java +++ b/src/test/java/com/dnd/runus/infrastructure/persistence/domain/scale/ScaleRepositoryImplTest.java @@ -26,6 +26,7 @@ import java.time.Duration; import java.time.OffsetDateTime; import java.time.ZonedDateTime; +import java.util.Comparator; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; @@ -50,9 +51,10 @@ public class ScaleRepositoryImplTest { @Autowired private ScaleAchievementRepository scaleAchievementRepository; - private Long scale1Id; - private Long scale2Id; - private Long scale3Id; + private Scale scale1; + private Scale scale2; + private Scale scale3; + private Scale scale4; @BeforeEach void setUp() { @@ -60,9 +62,9 @@ void setUp() { em.persist(ScaleEntity.from(new Scale(0, "scale1", 1_000_000, 1, "서울(한국)", "도쿄(일본)"))); // 누적 달성 거리 : 1_000_000 em.persist(ScaleEntity.from(new Scale(0, "scale2", 2_100_000, 2, "도쿄(일본)", "베이징(중국)"))); // 누적 달성 거리 : 3_100_000 em.persist( - ScaleEntity.from(new Scale(0, "scale3", 1_000_000, 3, "베이징(중국)", "타이베이(대만)"))); // 누적 달성 거리 : 4_100_000 + ScaleEntity.from(new Scale(0, "scale3", 1_000_000, 4, "베이징(중국)", "타이베이(대만)"))); // 누적 달성 거리 : 4_100_000 em.persist( - ScaleEntity.from(new Scale(0, "scale4", 1_000_000, 4, "베이징(중국)", "타이베이(대만)"))); // 누적 달성 거리 : 5_100_000 + ScaleEntity.from(new Scale(0, "scale4", 1_000_000, 3, "베이징(중국)", "타이베이(대만)"))); // 누적 달성 거리 : 5_100_000 em.flush(); CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder(); @@ -70,12 +72,16 @@ void setUp() { Root from = query.from(ScaleEntity.class); query.select(from).orderBy(criteriaBuilder.asc(from.get("index"))); - List idList = - em.createQuery(query).getResultStream().map(ScaleEntity::getId).toList(); + List scales = em.createQuery(query) + .getResultStream() + .sorted(Comparator.comparing(ScaleEntity::getIndex)) + .map(ScaleEntity::toDomain) + .toList(); - scale1Id = idList.get(0); - scale2Id = idList.get(1); - scale3Id = idList.get(2); + scale1 = scales.get(0); // total sum : 1_000_000 + scale2 = scales.get(1); // total sum : 3_100_000 + scale4 = scales.get(2); // total sum : 4_100_000 + scale3 = scales.get(3); // total sum : 5_100_000 } @DisplayName("scale_achievement에 기록이 없는 경우 성취 가능한 scale_id를 반환한다.") @@ -107,8 +113,8 @@ void findAchievableScaleIdsWithoutNoAchievementRecords() { // then assertNotNull(achievableScaleIds); assertThat(achievableScaleIds.size()).isEqualTo(2); - assertTrue(achievableScaleIds.contains(scale1Id)); - assertTrue(achievableScaleIds.contains(scale2Id)); + assertTrue(achievableScaleIds.contains(scale1.scaleId())); + assertTrue(achievableScaleIds.contains(scale2.scaleId())); } @DisplayName("scale_achievement에 기록이 존재 할 경우, 성취 가능한 scale_id를 반환한다.") @@ -132,9 +138,42 @@ void findAchievableScaleIds() { RunningEmoji.SOSO)); // scale1 기록 달성(달성 거리 1_000_000 달성), 현재 누적 거리 : 1_100_000 scaleAchievementRepository.saveAll( - List.of(new ScaleAchievement(savedMember, new Scale(scale1Id), OffsetDateTime.now()))); + List.of(new ScaleAchievement(savedMember, new Scale(scale1.scaleId()), OffsetDateTime.now()))); - for (int i = 0; i < 3; i++) { + for (int i = 0; i < 2; i++) { + RunningRecord runningRecord = new RunningRecord( + 0, + savedMember, + 1_100_000, + Duration.ofHours(12).plusMinutes(23).plusSeconds(56), + 1, + new Pace(5, 11), + ZonedDateTime.now(), + ZonedDateTime.now().plusHours(1), + List.of(new CoordinatePoint(1, 2, 3), new CoordinatePoint(4, 5, 6)), + "start location", + "end location", + RunningEmoji.SOSO); + runningRecordRepository.save(runningRecord); + } // 현재 누넉 거리 : 3_300_000 + + // when + List achievableScaleIds = scaleRepository.findAchievableScaleIds(savedMember.memberId()); + + // then + assertNotNull(achievableScaleIds); + assertThat(achievableScaleIds.size()).isEqualTo(1); + assertTrue(achievableScaleIds.contains(scale2.scaleId())); + } + + @DisplayName("scaled의 id와 index값의 순서가 달를 경우, 성취 가능한 scale_id를 올바르게 반환한다.") + @Test + void findAchievableScaleIds_diffIDAndIndex() { + // given + Member savedMember = memberRepository.save( + new Member(1L, MemberRole.USER, "nickname", OffsetDateTime.now(), OffsetDateTime.now())); + + for (int i = 0; i < 4; i++) { RunningRecord runningRecord = new RunningRecord( 0, savedMember, @@ -156,8 +195,9 @@ void findAchievableScaleIds() { // then assertNotNull(achievableScaleIds); - assertThat(achievableScaleIds.size()).isEqualTo(2); - assertTrue(achievableScaleIds.contains(scale2Id)); - assertTrue(achievableScaleIds.contains(scale3Id)); + assertThat(achievableScaleIds.size()).isEqualTo(3); + assertTrue(achievableScaleIds.contains(scale1.scaleId())); + assertTrue(achievableScaleIds.contains(scale2.scaleId())); + assertTrue(achievableScaleIds.contains(scale4.scaleId())); } }