Skip to content

Commit ffb5928

Browse files
committed
fix: 동일한 사용자가 동일한 대학 좋아요가 가능했던 문제 수정
- 복합 unique 제약 조건 추가, 관련 테스트 코드 추가
1 parent c63647f commit ffb5928

2 files changed

Lines changed: 106 additions & 0 deletions

File tree

src/main/java/com/example/solidconnection/university/domain/LikedUniversity.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,10 @@
55
import jakarta.persistence.GeneratedValue;
66
import jakarta.persistence.GenerationType;
77
import jakarta.persistence.Id;
8+
import jakarta.persistence.JoinColumn;
89
import jakarta.persistence.ManyToOne;
10+
import jakarta.persistence.Table;
11+
import jakarta.persistence.UniqueConstraint;
912
import lombok.AllArgsConstructor;
1013
import lombok.Builder;
1114
import lombok.Getter;
@@ -16,13 +19,20 @@
1619
@Builder
1720
@AllArgsConstructor
1821
@NoArgsConstructor
22+
@Table(uniqueConstraints = {
23+
@UniqueConstraint(
24+
name = "uk_liked_university_site_user_university",
25+
columnNames = {"site_user_id", "university_info_for_apply_id"}
26+
)
27+
})
1928
public class LikedUniversity {
2029

2130
@Id
2231
@GeneratedValue(strategy = GenerationType.IDENTITY)
2332
private Long id;
2433

2534
@ManyToOne
35+
@JoinColumn(name = "university_info_for_apply_id")
2636
private UnivApplyInfo univApplyInfo;
2737

2838
@ManyToOne
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
package com.example.solidconnection.university.repository;
2+
3+
import com.example.solidconnection.siteuser.domain.SiteUser;
4+
import com.example.solidconnection.siteuser.fixture.SiteUserFixture;
5+
import com.example.solidconnection.siteuser.repository.LikedUniversityRepository;
6+
import com.example.solidconnection.support.TestContainerSpringBootTest;
7+
import com.example.solidconnection.university.domain.LikedUniversity;
8+
import com.example.solidconnection.university.domain.UnivApplyInfo;
9+
import com.example.solidconnection.university.fixture.UniversityInfoForApplyFixture;
10+
import org.junit.jupiter.api.DisplayName;
11+
import org.junit.jupiter.api.Nested;
12+
import org.junit.jupiter.api.Test;
13+
import org.springframework.beans.factory.annotation.Autowired;
14+
import org.springframework.dao.DataIntegrityViolationException;
15+
16+
import static org.assertj.core.api.Assertions.assertThat;
17+
import static org.assertj.core.api.AssertionsForClassTypes.assertThatCode;
18+
19+
@TestContainerSpringBootTest
20+
@DisplayName("대학교 좋아요 레파지토리 테스트")
21+
public class UniversityLikeRepositoryTest {
22+
23+
@Autowired
24+
private LikedUniversityRepository likedUniversityRepository;
25+
26+
@Autowired
27+
private SiteUserFixture siteUserFixture;
28+
29+
@Autowired
30+
private UniversityInfoForApplyFixture universityInfoForApplyFixture;
31+
32+
@Nested
33+
class 사용자와_좋아요한_대학은_복합_유니크_제약조건을_갖는다 {
34+
35+
@Test
36+
void 같은_사용자가_같은_대학에_중복으로_좋아요하면_예외_응답을_반환한다() {
37+
// given
38+
SiteUser user = siteUserFixture.사용자();
39+
UnivApplyInfo university = universityInfoForApplyFixture.괌대학_A_지원_정보();
40+
41+
LikedUniversity firstLike = createLikedUniversity(user, university);
42+
likedUniversityRepository.save(firstLike);
43+
44+
LikedUniversity secondLike = createLikedUniversity(user, university);
45+
46+
// when & then
47+
assertThatCode(() -> likedUniversityRepository.save(secondLike))
48+
.isInstanceOf(DataIntegrityViolationException.class);
49+
}
50+
51+
@Test
52+
void 다른_사용자가_같은_대학에_좋아요하면_정상_저장된다() {
53+
// given
54+
SiteUser user1 = siteUserFixture.사용자(1, "user1");
55+
SiteUser user2 = siteUserFixture.사용자(2, "user2");
56+
UnivApplyInfo university = universityInfoForApplyFixture.괌대학_A_지원_정보();
57+
58+
LikedUniversity firstLike = createLikedUniversity(user1, university);
59+
likedUniversityRepository.save(firstLike);
60+
61+
LikedUniversity secondLike = createLikedUniversity(user2, university);
62+
63+
// when & then
64+
assertThatCode(() -> {
65+
LikedUniversity saved = likedUniversityRepository.save(secondLike);
66+
assertThat(saved.getId()).isNotNull();
67+
}).doesNotThrowAnyException();
68+
}
69+
70+
@Test
71+
void 같은_사용자가_다른_대학에_좋아요하면_정상_저장된다() {
72+
// given
73+
SiteUser user = siteUserFixture.사용자();
74+
UnivApplyInfo university1 = universityInfoForApplyFixture.괌대학_A_지원_정보();
75+
UnivApplyInfo university2 = universityInfoForApplyFixture.메이지대학_지원_정보();
76+
77+
LikedUniversity firstLike = createLikedUniversity(user, university1);
78+
likedUniversityRepository.save(firstLike);
79+
80+
LikedUniversity secondLike = createLikedUniversity(user, university2);
81+
82+
// when & then
83+
assertThatCode(() -> {
84+
LikedUniversity saved = likedUniversityRepository.save(secondLike);
85+
assertThat(saved.getId()).isNotNull();
86+
}).doesNotThrowAnyException();
87+
}
88+
}
89+
90+
private LikedUniversity createLikedUniversity(SiteUser siteUser, UnivApplyInfo univApplyInfo) {
91+
return LikedUniversity.builder()
92+
.siteUser(siteUser)
93+
.univApplyInfo(univApplyInfo)
94+
.build();
95+
}
96+
}

0 commit comments

Comments
 (0)