Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ public class CrewDocumentQueryController {
@Operation(summary = "기수별 크루 목록 조회", description = "기수에 속한 크루의 이름, 문서 UUID, 분야를 조회합니다.")
@GetMapping("/crews")
public ApiResponse<SuccessBody<List<GenerationCrewResponse>>> findAllByGeneration(
@RequestParam Integer generation
@RequestParam String generation
) {
List<GenerationCrewResponse> response = crewDocumentQueryService.findAllByGeneration(generation);
return ApiResponseGenerator.success(response);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,27 +15,23 @@
@Service
public class CrewDocumentQueryService {

private static final String GENERATION_SUFFIX = "기";

private final GenerationCrewQueryRepository generationCrewQueryRepository;
private final CrewProfileExtractor crewProfileExtractor;

@Transactional(readOnly = true)
public List<GenerationCrewResponse> findAllByGeneration(Integer generation) {
public List<GenerationCrewResponse> findAllByGeneration(String generation) {
validateGeneration(generation);
String generationTitle = generation + GENERATION_SUFFIX;
List<GenerationCrewOrganizationReadModel> readModels = generationCrewQueryRepository
.findAllByGenerationTitle(generationTitle);
.findAllByGenerationTitle(generation);
GenerationCrewCandidates candidates = GenerationCrewCandidates.from(readModels);
List<GenerationCrewResponse> responses = candidates.extractResponses(crewProfileExtractor);
responses.sort(Comparator.comparing(GenerationCrewResponse::name));
return List.copyOf(responses);
}

private void validateGeneration(Integer generation) {
if (generation == null || generation <= 0) {
private void validateGeneration(String generation) {
if (generation == null || generation.isBlank()) {
throw new WikiException(ErrorCode.VALIDATION_ERROR);
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ void findAllByGeneration_success_byValidGeneration() {

// when & then
RestAssured.given().log().all()
.queryParam("generation", 8)
.queryParam("generation", "8기")
.when()
.get("/document/crews")
.then().log().all()
Expand All @@ -80,24 +80,28 @@ void findAllByGeneration_fail_byMissingGeneration() {
}

@Test
@DisplayName("기수가 문자열이면 검증 실패를 반환한다.")
void findAllByGeneration_fail_byNonNumericGeneration() {
@DisplayName("기수가 문자열이면 검증 실패를 반환한다.")
void findAllByGeneration_fail_byEmptyGeneration() {
// when & then
assertValidationError("/document/crews?generation=eight");
assertValidationError("/document/crews?generation=");
}

@Test
@DisplayName("기수가 0이면 검증 실패를 반환한다.")
void findAllByGeneration_fail_byZeroGeneration() {
// when & then
assertValidationError("/document/crews?generation=0");
}
@DisplayName("입력한 조직 제목과 정확히 일치하는 기수가 없으면 빈 목록을 반환한다.")
void findAllByGeneration_success_byNoExactGenerationTitle() {
// given
CrewDocument crewDocument = saveCrewDocument("가람 (8기)");
OrganizationDocument generation = saveOrganizationDocument("8기");
saveLink(crewDocument, generation);

@Test
@DisplayName("기수가 음수면 검증 실패를 반환한다.")
void findAllByGeneration_fail_byNegativeGeneration() {
// when & then
assertValidationError("/document/crews?generation=-1");
RestAssured.given().log().all()
.queryParam("generation", "8")
.when()
.get("/document/crews")
.then().log().all()
.statusCode(HttpStatus.OK.value())
.body("data", hasSize(0));
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,18 +47,21 @@ class CrewDocumentQueryServiceTest {
class FindAllByGeneration {

@Test
@DisplayName("요청한 기수에 속한 크루만 반환한다.")
void findAllByGeneration_success_byMatchingGeneration() {
@DisplayName("요청한 조직 제목과 정확히 일치하는 기수의 크루만 반환한다.")
void findAllByGeneration_success_byExactGenerationTitle() {
// given
OrganizationDocument eighthGeneration = saveOrganizationDocument("8기");
OrganizationDocument spacedEighthGeneration = saveOrganizationDocument("8 기");
OrganizationDocument seventhGeneration = saveOrganizationDocument("7기");
CrewDocument eighthCrew = saveCrewDocument("가람(8기)");
CrewDocument seventhCrew = saveCrewDocument("나래(7기)");
CrewDocument spacedEighthCrew = saveCrewDocument("나래(8기)");
CrewDocument seventhCrew = saveCrewDocument("다온(7기)");
saveLink(eighthCrew, eighthGeneration);
saveLink(spacedEighthCrew, spacedEighthGeneration);
saveLink(seventhCrew, seventhGeneration);

// when
List<GenerationCrewResponse> responses = crewDocumentQueryService.findAllByGeneration(8);
List<GenerationCrewResponse> responses = crewDocumentQueryService.findAllByGeneration("8기");

// then
assertSoftly(softly -> {
Expand All @@ -85,7 +88,7 @@ void findAllByGeneration_success_byAllowedFields() {
saveLinks(androidCrew, generation, android);

// when
List<GenerationCrewResponse> responses = crewDocumentQueryService.findAllByGeneration(8);
List<GenerationCrewResponse> responses = crewDocumentQueryService.findAllByGeneration("8기");

// then
assertThat(responses)
Expand All @@ -109,7 +112,7 @@ void findAllByGeneration_success_byIndeterminateFields() {
saveLinks(multipleFieldCrew, generation, backend, frontend);

// when
List<GenerationCrewResponse> responses = crewDocumentQueryService.findAllByGeneration(8);
List<GenerationCrewResponse> responses = crewDocumentQueryService.findAllByGeneration("8기");

// then
assertThat(responses)
Expand All @@ -130,7 +133,7 @@ void findAllByGeneration_success_byCrewTitleFormats() {
saveLink(plainCrew, generation);

// when
List<GenerationCrewResponse> responses = crewDocumentQueryService.findAllByGeneration(8);
List<GenerationCrewResponse> responses = crewDocumentQueryService.findAllByGeneration("8기");

// then
assertThat(responses)
Expand All @@ -147,7 +150,7 @@ void findAllByGeneration_success_byBlankExtractedName() {
saveLink(blankNameCrew, generation);

// when
List<GenerationCrewResponse> responses = crewDocumentQueryService.findAllByGeneration(8);
List<GenerationCrewResponse> responses = crewDocumentQueryService.findAllByGeneration("8기");

// then
assertThat(responses).isEmpty();
Expand All @@ -166,7 +169,7 @@ void findAllByGeneration_success_byNameAscendingOrder() {
saveLink(secondCrew, generation);

// when
List<GenerationCrewResponse> responses = crewDocumentQueryService.findAllByGeneration(8);
List<GenerationCrewResponse> responses = crewDocumentQueryService.findAllByGeneration("8기");

// then
assertThat(responses)
Expand All @@ -178,27 +181,27 @@ void findAllByGeneration_success_byNameAscendingOrder() {
@DisplayName("해당 기수의 크루가 없으면 빈 목록을 반환한다.")
void findAllByGeneration_success_byNoCrew() {
// when
List<GenerationCrewResponse> responses = crewDocumentQueryService.findAllByGeneration(8);
List<GenerationCrewResponse> responses = crewDocumentQueryService.findAllByGeneration("8기");

// then
assertThat(responses).isEmpty();
}

@Test
@DisplayName("기수가 0이면 검증 예외가 발생한다.")
void findAllByGeneration_fail_byZeroGeneration() {
@DisplayName("기수가 공백이면 검증 예외가 발생한다.")
void findAllByGeneration_fail_byBlankGeneration() {
// when & then
assertThatThrownBy(() -> crewDocumentQueryService.findAllByGeneration(0))
assertThatThrownBy(() -> crewDocumentQueryService.findAllByGeneration(" "))
.isInstanceOf(WikiException.class)
.extracting("errorCode")
.isEqualTo(ErrorCode.VALIDATION_ERROR);
}

@Test
@DisplayName("기수가 음수면 검증 예외가 발생한다.")
void findAllByGeneration_fail_byNegativeGeneration() {
@DisplayName("기수가 null이면 검증 예외가 발생한다.")
void findAllByGeneration_fail_byNullGeneration() {
// when & then
assertThatThrownBy(() -> crewDocumentQueryService.findAllByGeneration(-1))
assertThatThrownBy(() -> crewDocumentQueryService.findAllByGeneration(null))
.isInstanceOf(WikiException.class)
.extracting("errorCode")
.isEqualTo(ErrorCode.VALIDATION_ERROR);
Expand Down
Loading