Skip to content

Commit 394a55e

Browse files
committed
test: 좋아요 충돌 처리 유틸 검증 추가
1 parent 65f90cc commit 394a55e

2 files changed

Lines changed: 57 additions & 3 deletions

File tree

src/main/java/com/semosan/api/domain/mountain/service/CourseLikeService.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,13 @@ private boolean toggle(Long userId, Long courseId) {
4040
courseLikeRepository.delete(existing);
4141
return false;
4242
})
43-
.orElseGet(() -> createCourseLike(user, course, userId, courseId));
43+
.orElseGet(() -> createCourseLike(user, course));
4444
}
4545

46-
private boolean createCourseLike(User user, Course course, Long userId, Long courseId) {
46+
private boolean createCourseLike(User user, Course course) {
4747
return LikeConflictHandler.handleConcurrentCreate(
4848
() -> courseLikeRepository.save(CourseLike.create(user, course)),
49-
() -> log.warn("CourseLike 동시 요청 감지: courseId={}, userId={}", courseId, userId)
49+
() -> log.warn("CourseLike 동시 요청 감지: courseId={}, userId={}", course.getId(), user.getId())
5050
);
5151
}
5252

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package com.semosan.api.common.util;
2+
3+
import org.junit.jupiter.api.Test;
4+
import org.springframework.dao.DataIntegrityViolationException;
5+
6+
import java.util.concurrent.atomic.AtomicBoolean;
7+
8+
import static org.assertj.core.api.Assertions.assertThat;
9+
import static org.assertj.core.api.Assertions.assertThatThrownBy;
10+
11+
class LikeConflictHandlerTest {
12+
13+
@Test
14+
void handleConcurrentCreateReturnsTrueWhenCreateActionSucceeds() {
15+
AtomicBoolean createCalled = new AtomicBoolean(false);
16+
AtomicBoolean logCalled = new AtomicBoolean(false);
17+
18+
boolean result = LikeConflictHandler.handleConcurrentCreate(
19+
() -> createCalled.set(true),
20+
() -> logCalled.set(true)
21+
);
22+
23+
assertThat(result).isTrue();
24+
assertThat(createCalled).isTrue();
25+
assertThat(logCalled).isFalse();
26+
}
27+
28+
@Test
29+
void handleConcurrentCreateReturnsTrueAndRunsLogActionWhenDataIntegrityViolationOccurs() {
30+
AtomicBoolean logCalled = new AtomicBoolean(false);
31+
32+
boolean result = LikeConflictHandler.handleConcurrentCreate(
33+
() -> {
34+
throw new DataIntegrityViolationException("duplicate");
35+
},
36+
() -> logCalled.set(true)
37+
);
38+
39+
assertThat(result).isTrue();
40+
assertThat(logCalled).isTrue();
41+
}
42+
43+
@Test
44+
void handleConcurrentCreateRethrowsUnexpectedException() {
45+
RuntimeException exception = new IllegalStateException("unexpected");
46+
47+
assertThatThrownBy(() -> LikeConflictHandler.handleConcurrentCreate(
48+
() -> {
49+
throw exception;
50+
},
51+
() -> {}
52+
)).isSameAs(exception);
53+
}
54+
}

0 commit comments

Comments
 (0)