diff --git a/backend/src/main/java/com/woowacourse/moamoa/study/query/MyStudyDao.java b/backend/src/main/java/com/woowacourse/moamoa/study/query/MyStudyDao.java index f46f5c86a..924bcb3d3 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/study/query/MyStudyDao.java +++ b/backend/src/main/java/com/woowacourse/moamoa/study/query/MyStudyDao.java @@ -3,10 +3,10 @@ import com.woowacourse.moamoa.member.query.data.MemberData; import com.woowacourse.moamoa.study.domain.StudyStatus; import com.woowacourse.moamoa.study.query.data.MyStudySummaryData; -import com.woowacourse.moamoa.study.query.data.StudyOwnerAndTagsData; import com.woowacourse.moamoa.tag.query.response.TagSummaryData; import java.util.ArrayList; +import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -32,7 +32,7 @@ public class MyStudyDao { final String title = rs.getString("title"); final String studyStatus = rs.getString("study_status"); final int currentMemberCount = rs.getInt("current_member_count"); - final int maxMemberCount = rs.getInt("max_member_count"); + final Integer maxMemberCount = rs.getObject("max_member_count", Integer.class); final String startDate = rs.getString("start_date"); final String endDate = rs.getString("end_date"); @@ -40,8 +40,8 @@ public class MyStudyDao { currentMemberCount, maxMemberCount, startDate, endDate); }; - private static final ResultSetExtractor> OWNER_WITH_TAG_ROW_MAPPER = rs -> { - Map result = new LinkedHashMap<>(); + private static final ResultSetExtractor> OWNER_ROW_MAPPER = rs -> { + Map result = new LinkedHashMap<>(); Long studyId; while (rs.next()) { @@ -53,14 +53,26 @@ public class MyStudyDao { String imageUrl = rs.getString("image_url"); String profileUrl = rs.getString("profile_url"); - result.put(studyId, new StudyOwnerAndTagsData(new MemberData(githubId, username, imageUrl, profileUrl), - new ArrayList<>())); + result.put(studyId, new MemberData(githubId, username, imageUrl, profileUrl)); + } + } + return result; + }; + + private static final ResultSetExtractor>> TAG_ROW_MAPPER = rs -> { + Map> result = new LinkedHashMap<>(); + + while (rs.next()) { + Long studyId = rs.getLong("study.id"); + + if (!result.containsKey(studyId)) { + result.put(studyId, new ArrayList<>()); } final Long tagId = rs.getLong("tag.id"); final String tagName = rs.getString("tag.name"); - result.get(studyId) - .addTag(new TagSummaryData(tagId, tagName)); + + result.get(studyId).add(new TagSummaryData(tagId, tagName)); } return result; }; @@ -68,25 +80,42 @@ public class MyStudyDao { public List findMyStudyByMemberId(Long id) { String sql = "SELECT DISTINCT study.id, study.title, study.study_status, study.current_member_count, " + "study.max_member_count, study.start_date, study.end_date " - + "FROM study_member JOIN study ON study_member.study_id = study.id " + + "FROM study LEFT JOIN study_member ON study_member.study_id = study.id " + "WHERE study_member.member_id = :id OR study.owner_id = :id"; return jdbcTemplate.query(sql, Map.of("id", id), MY_STUDY_SUMMARY_ROW_MAPPER); } - public Map findStudyOwnerWithTags(List studyIds) { + public Map findOwners(List studyIds) { + if (studyIds.isEmpty()) { + return new HashMap<>(); + } + + SqlParameterSource parameters = new MapSqlParameterSource("ids", studyIds); + + String sql = "SELECT study.id, member.github_id, member.username, member.image_url, member.profile_url " + + "FROM study JOIN member ON member.id = study.owner_id " + + "WHERE study.id IN (:ids)"; + + return jdbcTemplate.query(sql, parameters, OWNER_ROW_MAPPER); + } + + public Map> findTags(List studyIds) { + if (studyIds.isEmpty()) { + return new HashMap<>(); + } + List ids = studyIds.stream() .map(Object::toString) .collect(Collectors.toList()); SqlParameterSource parameters = new MapSqlParameterSource("ids", ids); - String sql = "SELECT study.id, member.github_id, member.username, member.image_url, member.profile_url, tag.id, tag.name " - + "FROM study JOIN member ON member.id = study.owner_id " - + "JOIN study_tag ON study.id = study_tag.study_id " + String sql = "SELECT study.id, tag.id, tag.name " + + "FROM study JOIN study_tag ON study.id = study_tag.study_id " + "JOIN tag ON tag.id = study_tag.tag_id " + "WHERE study.id IN (:ids)"; - return jdbcTemplate.query(sql, parameters, OWNER_WITH_TAG_ROW_MAPPER); + return jdbcTemplate.query(sql, parameters, TAG_ROW_MAPPER); } } diff --git a/backend/src/main/java/com/woowacourse/moamoa/study/query/data/MyStudySummaryData.java b/backend/src/main/java/com/woowacourse/moamoa/study/query/data/MyStudySummaryData.java index 636ae23af..a8aa1acda 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/study/query/data/MyStudySummaryData.java +++ b/backend/src/main/java/com/woowacourse/moamoa/study/query/data/MyStudySummaryData.java @@ -2,11 +2,13 @@ import com.woowacourse.moamoa.study.domain.StudyStatus; import lombok.AllArgsConstructor; +import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor; @NoArgsConstructor @AllArgsConstructor +@EqualsAndHashCode @Getter public class MyStudySummaryData { diff --git a/backend/src/main/java/com/woowacourse/moamoa/study/query/data/StudyOwnerAndTagsData.java b/backend/src/main/java/com/woowacourse/moamoa/study/query/data/StudyOwnerAndTagsData.java index d176c4238..9fe08143d 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/study/query/data/StudyOwnerAndTagsData.java +++ b/backend/src/main/java/com/woowacourse/moamoa/study/query/data/StudyOwnerAndTagsData.java @@ -14,8 +14,4 @@ public class StudyOwnerAndTagsData { private MemberData owner; private List tags; - - public void addTag(TagSummaryData tagSummaryData) { - this.tags.add(tagSummaryData); - } } diff --git a/backend/src/main/java/com/woowacourse/moamoa/study/service/MyStudyService.java b/backend/src/main/java/com/woowacourse/moamoa/study/service/MyStudyService.java index 684d058a0..6037bf18b 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/study/service/MyStudyService.java +++ b/backend/src/main/java/com/woowacourse/moamoa/study/service/MyStudyService.java @@ -2,6 +2,7 @@ import com.woowacourse.moamoa.member.domain.Member; import com.woowacourse.moamoa.member.domain.repository.MemberRepository; +import com.woowacourse.moamoa.member.query.data.MemberData; import com.woowacourse.moamoa.study.domain.Study; import com.woowacourse.moamoa.study.domain.repository.StudyRepository; import com.woowacourse.moamoa.study.query.MyStudyDao; @@ -13,6 +14,8 @@ import com.woowacourse.moamoa.study.query.data.MyStudySummaryData; import com.woowacourse.moamoa.study.service.response.MyStudiesResponse; +import com.woowacourse.moamoa.tag.query.response.TagSummaryData; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -43,9 +46,30 @@ public MyStudiesResponse getStudies(final Long githubId) { .map(MyStudySummaryData::getId) .collect(Collectors.toList()); - final Map studyOwnerWithTags = myStudyDao.findStudyOwnerWithTags(studyIds); + Map ownerWithTags = getOwnerWithTags(studyIds); - return new MyStudiesResponse(mapToResponse(myStudySummaryData, studyOwnerWithTags)); + return new MyStudiesResponse(mapToResponse(myStudySummaryData, ownerWithTags)); + } + + private Map getOwnerWithTags(final List studyIds) { + final Map owners = myStudyDao.findOwners(studyIds); + final Map> tags = myStudyDao.findTags(studyIds); + + return mapOwnerWithTags(studyIds, owners, tags); + } + + private Map mapOwnerWithTags(final List studyIds, + final Map owners, + final Map> tags) { + Map result = new HashMap<>(); + for (Long id : studyIds) { + if (tags.get(id) == null) { + result.put(id, new StudyOwnerAndTagsData(owners.get(id), List.of())); + continue; + } + result.put(id, new StudyOwnerAndTagsData(owners.get(id), tags.get(id))); + } + return result; } private List mapToResponse(final List myStudySummaryData, diff --git a/backend/src/main/java/com/woowacourse/moamoa/study/service/response/MyStudiesResponse.java b/backend/src/main/java/com/woowacourse/moamoa/study/service/response/MyStudiesResponse.java index c93d39f10..72d5b3678 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/study/service/response/MyStudiesResponse.java +++ b/backend/src/main/java/com/woowacourse/moamoa/study/service/response/MyStudiesResponse.java @@ -2,11 +2,17 @@ import java.util.List; import lombok.AllArgsConstructor; +import lombok.EqualsAndHashCode; import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.ToString; @AllArgsConstructor +@NoArgsConstructor +@EqualsAndHashCode @Getter +@ToString public class MyStudiesResponse { - private final List studies; + private List studies; } diff --git a/backend/src/main/java/com/woowacourse/moamoa/study/service/response/MyStudyResponse.java b/backend/src/main/java/com/woowacourse/moamoa/study/service/response/MyStudyResponse.java index 56ee8b3a0..6772893d1 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/study/service/response/MyStudyResponse.java +++ b/backend/src/main/java/com/woowacourse/moamoa/study/service/response/MyStudyResponse.java @@ -6,12 +6,16 @@ import com.woowacourse.moamoa.tag.query.response.TagSummaryData; import java.util.List; import lombok.AllArgsConstructor; +import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor; +import lombok.ToString; @NoArgsConstructor @AllArgsConstructor @Getter +@EqualsAndHashCode +@ToString public class MyStudyResponse { private Long id; diff --git a/backend/src/main/java/com/woowacourse/moamoa/tag/query/response/TagSummaryData.java b/backend/src/main/java/com/woowacourse/moamoa/tag/query/response/TagSummaryData.java index 24dc98745..b98c2a4c9 100644 --- a/backend/src/main/java/com/woowacourse/moamoa/tag/query/response/TagSummaryData.java +++ b/backend/src/main/java/com/woowacourse/moamoa/tag/query/response/TagSummaryData.java @@ -4,11 +4,13 @@ import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor; +import lombok.ToString; @NoArgsConstructor @AllArgsConstructor @Getter @EqualsAndHashCode +@ToString public class TagSummaryData { private Long id; diff --git a/backend/src/test/java/com/woowacourse/acceptance/test/study/GettingMyStudiesAcceptanceTest.java b/backend/src/test/java/com/woowacourse/acceptance/test/study/GettingMyStudiesAcceptanceTest.java index 12b8ff32f..0c6dbfb26 100644 --- a/backend/src/test/java/com/woowacourse/acceptance/test/study/GettingMyStudiesAcceptanceTest.java +++ b/backend/src/test/java/com/woowacourse/acceptance/test/study/GettingMyStudiesAcceptanceTest.java @@ -11,10 +11,13 @@ import static com.woowacourse.acceptance.fixture.StudyFixtures.리액트_스터디_제목; import static com.woowacourse.acceptance.fixture.StudyFixtures.자바_스터디_제목; import static com.woowacourse.acceptance.fixture.TagFixtures.BE_태그_ID; +import static com.woowacourse.acceptance.fixture.TagFixtures.BE_태그_설명; +import static com.woowacourse.acceptance.fixture.TagFixtures.BE_태그명; import static com.woowacourse.acceptance.fixture.TagFixtures.리액트_태그_ID; import static com.woowacourse.acceptance.fixture.TagFixtures.리액트_태그_설명; import static com.woowacourse.acceptance.fixture.TagFixtures.자바_태그_ID; import static com.woowacourse.acceptance.fixture.TagFixtures.자바_태그_설명; +import static com.woowacourse.acceptance.fixture.TagFixtures.자바_태그명; import static com.woowacourse.acceptance.steps.LoginSteps.그린론이; import static com.woowacourse.acceptance.steps.LoginSteps.디우가; import static com.woowacourse.moamoa.study.domain.StudyStatus.IN_PROGRESS; @@ -49,7 +52,6 @@ public class GettingMyStudiesAcceptanceTest extends AcceptanceTest { - @Disabled // 그린론이 해결할 버그 관련 인수 테스트 @DisplayName("내가 참여한 스터디를 조회한다.") @Test void getMyStudies() { @@ -75,10 +77,10 @@ void getMyStudies() { new MyStudySummaryData(자바_스터디_ID, 자바_스터디_제목, IN_PROGRESS, 1, null, 지금.toString(), null), new MemberData(그린론_깃허브_ID, 그린론_이름, 그린론_이미지_URL, 그린론_프로필_URL), - List.of(new TagSummaryData(자바_태그_ID, 자바_태그_설명), new TagSummaryData(리액트_태그_ID, 리액트_태그_설명))); + List.of(new TagSummaryData(자바_태그_ID, 자바_태그명), new TagSummaryData(BE_태그_ID, BE_태그명))); MyStudyResponse expectedReact = new MyStudyResponse( - new MyStudySummaryData(리액트_스터디_ID, 리액트_스터디_제목, StudyStatus.PREPARE, 1, + new MyStudySummaryData(리액트_스터디_ID, 리액트_스터디_제목, StudyStatus.PREPARE, 2, null, 지금.plusDays(10).toString(), null), new MemberData(디우_깃허브_ID, 디우_이름, 디우_이미지_URL, 디우_프로필_URL), List.of()); diff --git a/backend/src/test/java/com/woowacourse/moamoa/study/controller/MyStudyControllerTest.java b/backend/src/test/java/com/woowacourse/moamoa/study/controller/MyStudyControllerTest.java index 9f08fc79f..6d93be425 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/study/controller/MyStudyControllerTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/study/controller/MyStudyControllerTest.java @@ -55,17 +55,23 @@ void setUp() { final LocalDateTime now = LocalDateTime.now(); jdbcTemplate.update("INSERT INTO study(id, title, excerpt, thumbnail, recruitment_status, study_status, description, current_member_count, max_member_count, created_at, start_date, owner_id) " - + "VALUES (1, 'Java 스터디', '자바 설명', 'java thumbnail', 'RECRUITMENT_START', 'PREPARE', '그린론의 우당탕탕 자바 스터디입니다.', 3, 10, '" + now + "', '2021-12-08', 2)"); + + "VALUES (1, 'Java 스터디', '자바 설명', 'java thumbnail', 'RECRUITMENT_START', 'PREPARE', '그린론의 우당탕탕 자바 스터디입니다.', 3, 10, '" + + now + "', '2021-12-08', 2)"); jdbcTemplate.update("INSERT INTO study(id, title, excerpt, thumbnail, recruitment_status, study_status, description, current_member_count, max_member_count, created_at, enrollment_end_date, start_date, end_date, owner_id) " - + "VALUES (2, 'React 스터디', '리액트 설명', 'react thumbnail', 'RECRUITMENT_START', 'PREPARE', '디우의 뤼액트 스터디입니다.', 4, 5, '" + now + "', '2021-11-09', '2021-11-10', '2021-12-08', 3)"); + + "VALUES (2, 'React 스터디', '리액트 설명', 'react thumbnail', 'RECRUITMENT_START', 'PREPARE', '디우의 뤼액트 스터디입니다.', 4, 5, '" + + now + "', '2021-11-09', '2021-11-10', '2021-12-08', 3)"); jdbcTemplate.update("INSERT INTO study(id, title, excerpt, thumbnail, recruitment_status, study_status, description, current_member_count, max_member_count, created_at, start_date, owner_id) " - + "VALUES (3, 'javaScript 스터디', '자바스크립트 설명', 'javascript thumbnail', 'RECRUITMENT_START', 'PREPARE', '그린론의 자바스크립트 접해보기', 3, 20, '" + now + "', '2022-08-03', 2)"); + + "VALUES (3, 'javaScript 스터디', '자바스크립트 설명', 'javascript thumbnail', 'RECRUITMENT_START', 'PREPARE', '그린론의 자바스크립트 접해보기', 3, 20, '" + + now + "', '2022-08-03', 2)"); jdbcTemplate.update("INSERT INTO study(id, title, excerpt, thumbnail, recruitment_status, study_status, description, max_member_count, created_at, start_date, owner_id) " - + "VALUES (4, 'HTTP 스터디', 'HTTP 설명', 'http thumbnail', 'RECRUITMENT_END', 'PREPARE', '디우의 HTTP 정복하기', 5, '" + now + "', '2022-08-03', 3)"); + + "VALUES (4, 'HTTP 스터디', 'HTTP 설명', 'http thumbnail', 'RECRUITMENT_END', 'PREPARE', '디우의 HTTP 정복하기', 5, '" + + now + "', '2022-08-03', 3)"); jdbcTemplate.update("INSERT INTO study(id, title, excerpt, thumbnail, recruitment_status, study_status, description, current_member_count, created_at, owner_id, start_date) " - + "VALUES (5, '알고리즘 스터디', '알고리즘 설명', 'algorithm thumbnail', 'RECRUITMENT_END', 'PREPARE', '알고리즘을 TDD로 풀자의 베루스입니다.', 1, '" + now + "', 4, '2021-12-06')"); + + "VALUES (5, '알고리즘 스터디', '알고리즘 설명', 'algorithm thumbnail', 'RECRUITMENT_END', 'PREPARE', '알고리즘을 TDD로 풀자의 베루스입니다.', 1, '" + + now + "', 4, '2021-12-06')"); jdbcTemplate.update("INSERT INTO study(id, title, excerpt, thumbnail, recruitment_status, study_status, description, current_member_count, created_at, owner_id, start_date, enrollment_end_date, end_date) " - + "VALUES (6, 'Linux 스터디', '리눅스 설명', 'linux thumbnail', 'RECRUITMENT_END', 'PREPARE', 'Linux를 공부하자의 베루스입니다.', 1, '" + now + "', 4, '2021-12-06', '2021-12-07', '2022-01-07')"); + + "VALUES (6, 'Linux 스터디', '리눅스 설명', 'linux thumbnail', 'RECRUITMENT_END', 'PREPARE', 'Linux를 공부하자의 베루스입니다.', 1, '" + + now + "', 4, '2021-12-06', '2021-12-07', '2022-01-07')"); jdbcTemplate.update("INSERT INTO study_tag(study_id, tag_id) VALUES (1, 1)"); jdbcTemplate.update("INSERT INTO study_tag(study_id, tag_id) VALUES (1, 2)"); @@ -100,12 +106,14 @@ void getMyStudies() { assertThat(myStudies.getStatusCode()).isEqualTo(HttpStatus.OK); assertThat(myStudies.getBody()).isNotNull(); assertThat(myStudies.getBody().getStudies()) - .hasSize(3) + .hasSize(5) .extracting("id", "title", "studyStatus", "currentMemberCount", "maxMemberCount") .containsExactlyElementsOf(List.of( tuple(1L, "Java 스터디", PREPARE, 3, 10), tuple(2L, "React 스터디", PREPARE, 4, 5), - tuple(3L, "javaScript 스터디", PREPARE, 3, 20)) + tuple(3L, "javaScript 스터디", PREPARE, 3, 20), + tuple(5L, "알고리즘 스터디", PREPARE, 1, null), + tuple(6L, "Linux 스터디", PREPARE, 1, null)) ); final List owners = myStudies.getBody() @@ -115,13 +123,15 @@ void getMyStudies() { .collect(Collectors.toList()); assertThat(owners) - .hasSize(3) + .hasSize(5) .extracting("githubId", "username", "imageUrl", "profileUrl") .containsExactlyElementsOf(List.of( tuple(2L, "greenlawn", "https://image", "github.com"), tuple(3L, "dwoo", "https://image", "github.com"), - tuple(2L, "greenlawn", "https://image", "github.com")) - ); + tuple(2L, "greenlawn", "https://image", "github.com"), + tuple(4L, "verus", "https://image", "github.com"), + tuple(4L, "verus", "https://image", "github.com") + )); final List> tags = myStudies.getBody() .getStudies() @@ -150,5 +160,9 @@ void getMyStudies() { .extracting("id", "name") .contains(tuple(2L, "4기"), tuple(4L, "FE")); + + assertThat(tags.get(3).size()).isZero(); + + assertThat(tags.get(4).size()).isZero(); } } diff --git a/backend/src/test/java/com/woowacourse/moamoa/study/query/MyStudyDaoTest.java b/backend/src/test/java/com/woowacourse/moamoa/study/query/MyStudyDaoTest.java index b15ea3245..e027cbe9c 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/study/query/MyStudyDaoTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/study/query/MyStudyDaoTest.java @@ -4,6 +4,8 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.tuple; +import com.woowacourse.moamoa.member.query.data.MemberData; +import com.woowacourse.moamoa.tag.query.response.TagSummaryData; import java.util.List; import com.woowacourse.moamoa.common.RepositoryTest; @@ -11,6 +13,7 @@ import java.time.LocalDateTime; +import java.util.Map; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -48,6 +51,9 @@ void initDataBase() { + "VALUES (5, '알고리즘 스터디', '알고리즘 설명', 'algorithm thumbnail', 'RECRUITMENT_END', 'PREPARE', '알고리즘을 TDD로 풀자의 베루스입니다.', 1, '" + now + "', 4, '2021-12-06')"); jdbcTemplate.update("INSERT INTO study(id, title, excerpt, thumbnail, recruitment_status, study_status, description, current_member_count, created_at, owner_id, start_date, enrollment_end_date, end_date) " + "VALUES (6, 'Linux 스터디', '리눅스 설명', 'linux thumbnail', 'RECRUITMENT_END', 'PREPARE', 'Linux를 공부하자의 베루스입니다.', 1, '" + now + "', 4, '2021-12-06', '2021-12-07', '2022-01-07')"); + jdbcTemplate.update("INSERT INTO study(id, title, excerpt, thumbnail, recruitment_status, study_status, description, current_member_count, created_at, owner_id, start_date, enrollment_end_date, end_date) " + + "VALUES (7, 'OS 스터디', 'OS 설명', 'os thumbnail', 'RECRUITMENT_END', 'PREPARE', 'OS를 공부하자의 그린론입니다.', 1, '" + now + "', 2, '2021-12-06', '2021-12-07', '2022-01-07')"); + jdbcTemplate.update("INSERT INTO study_tag(study_id, tag_id) VALUES (1, 1)"); jdbcTemplate.update("INSERT INTO study_tag(study_id, tag_id) VALUES (1, 2)"); @@ -80,14 +86,30 @@ void getMyStudies() { final List studySummaryData = myStudyDao.findMyStudyByMemberId(2L); assertThat(studySummaryData) - .hasSize(3) + .hasSize(4) .filteredOn(myStudySummaryData -> myStudySummaryData.getId() != null) .extracting("title", "studyStatus", "currentMemberCount", "maxMemberCount", "startDate", "endDate") .contains( tuple("Java 스터디", PREPARE, 3, 10, "2021-12-08", null), tuple("javaScript 스터디" ,PREPARE, 3, 20, "2022-08-03", null), tuple("React 스터디", PREPARE, 4, 5, "2021-11-10", "2021-12-08"), - tuple("React 스터디", PREPARE, 4, 5, "2021-11-10", "2021-12-08") + tuple("OS 스터디", PREPARE, 1, null, "2021-12-06", "2022-01-07") ); } + + @DisplayName("스터디 ID가 비어있을 경우, 스터디 방장 빈 맵을 반환한다.") + @Test + void findStudyOwnersByEmptyStudyId() { + final Map owners = myStudyDao.findOwners(List.of()); + + assertThat(owners.size()).isZero(); + } + + @DisplayName("스터디 ID가 비어있을 경우, 스터디 태그 빈 맵을 반환한다.") + @Test + void findStudyTagsByEmptyStudyId() { + final Map> tags = myStudyDao.findTags(List.of()); + + assertThat(tags.size()).isZero(); + } } diff --git a/backend/src/test/java/com/woowacourse/moamoa/study/service/MyStudyServiceTest.java b/backend/src/test/java/com/woowacourse/moamoa/study/service/MyStudyServiceTest.java index 75366b968..5f08aa9d6 100644 --- a/backend/src/test/java/com/woowacourse/moamoa/study/service/MyStudyServiceTest.java +++ b/backend/src/test/java/com/woowacourse/moamoa/study/service/MyStudyServiceTest.java @@ -84,18 +84,16 @@ void setUp() { jdbcTemplate.update("INSERT INTO study_tag(study_id, tag_id) VALUES (4, 2)"); jdbcTemplate.update("INSERT INTO study_tag(study_id, tag_id) VALUES (4, 3)"); - jdbcTemplate.update("INSERT INTO study_tag(study_id, tag_id) VALUES (7, 2)"); - jdbcTemplate.update("INSERT INTO study_member(study_id, member_id) VALUES (1, 3)"); jdbcTemplate.update("INSERT INTO study_member(study_id, member_id) VALUES (1, 4)"); - jdbcTemplate.update("INSERT INTO study_member(study_id, member_id) VALUES (2, 1)"); jdbcTemplate.update("INSERT INTO study_member(study_id, member_id) VALUES (2, 2)"); jdbcTemplate.update("INSERT INTO study_member(study_id, member_id) VALUES (2, 4)"); jdbcTemplate.update("INSERT INTO study_member(study_id, member_id) VALUES (3, 3)"); jdbcTemplate.update("INSERT INTO study_member(study_id, member_id) VALUES (3, 4)"); + jdbcTemplate.update("INSERT INTO study_member(study_id, member_id) VALUES (7, 1)"); jdbcTemplate.update("INSERT INTO study_member(study_id, member_id) VALUES (7, 2)"); } @@ -140,6 +138,41 @@ void findMyStudies() { assertThat(tags).hasSize(4); } + @DisplayName("태그가 없는 스터디를 조회한다.") + @Test + void findMyStudiesWithoutTags() { + final MyStudiesResponse myStudiesResponse = myStudyService.getStudies(1L); + + final List owners = myStudiesResponse.getStudies() + .stream() + .map(MyStudyResponse::getOwner) + .collect(toList()); + + final List> tags = myStudiesResponse.getStudies() + .stream() + .map(MyStudyResponse::getTags) + .collect(toList()); + + final List studies = myStudiesResponse.getStudies(); + + assertThat(studies) + .hasSize(1) + .filteredOn(study -> study.getId() != null) + .extracting("title", "studyStatus", "currentMemberCount", "maxMemberCount") + .contains( + tuple("OS 스터디", PREPARE, 1, 6) + ); + + assertThat(owners) + .hasSize(1) + .extracting("githubId", "username", "imageUrl", "profileUrl") + .contains( + tuple(4L, "verus", "https://image", "github.com") + ); + + assertThat(tags.get(0).size()).isZero(); + } + @DisplayName("존재하지 않은 내가 참여한 스터디 조회 시 예외 발생") @Test void getMyStudyNotExistUser() {