Skip to content

Commit 0565f1f

Browse files
authored
feat: 지원 상태 확인 로직 개선 및 프로필 작성 미완료 상태 추가 (#355)
* feat: 지원 상태 확인 로직 개선 및 프로필 작성 미완료 상태 추가 * fix: 불필요한 공백 제거 * feat: 프로필 완성 여부 확인 로직 개선 및 테스트 추가
1 parent 031d65a commit 0565f1f

6 files changed

Lines changed: 134 additions & 45 deletions

File tree

src/main/java/org/ject/support/domain/apply/controller/ApplyApiSpec.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ void submitApplication(@AuthPrincipal Long memberId,
4444
지원자의 지원서 제출 여부를 확인합니다.
4545
- TEMP_SAVED: 작성 중인 지원서가 있는 경우
4646
- SUBMITTED: 이미 지원서를 제출한 경우
47+
- JOINED: 합격하여 팀에 합류한 경우
4748
""")
4849
ApplyStatusResponse checkApplyStatus(@AuthPrincipal Long memberId);
4950

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,25 @@
11
package org.ject.support.domain.apply.dto;
22

3-
import org.ject.support.domain.apply.domain.Apply;
3+
import com.fasterxml.jackson.annotation.JsonInclude;
44
import org.ject.support.domain.apply.domain.Apply.Status;
55

6+
@JsonInclude(JsonInclude.Include.NON_NULL)
67
public record ApplyStatusResponse(
7-
Status status
8+
Status status,
9+
String step
810
) {
9-
public static ApplyStatusResponse of(Apply apply) {
10-
return new ApplyStatusResponse(apply.getStatus());
11+
12+
public static ApplyStatusResponse of(Status status) {
13+
return new ApplyStatusResponse(status, null);
14+
}
15+
16+
// 프로필 작성을 하지 않았을 경우
17+
public static ApplyStatusResponse tempSavedProfile() {
18+
return new ApplyStatusResponse(Status.TEMP_SAVED, "PROFILE");
19+
}
20+
21+
// 프로필 작성 이후, 지원서 작성 중인 경우
22+
public static ApplyStatusResponse tempSavedApply() {
23+
return new ApplyStatusResponse(Status.TEMP_SAVED, "APPLY");
1124
}
1225
}

src/main/java/org/ject/support/domain/apply/service/ApplyService.java

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,5 @@
11
package org.ject.support.domain.apply.service;
22

3-
import static org.ject.support.domain.apply.domain.Apply.Status.JOINED;
4-
import static org.ject.support.domain.apply.domain.Apply.Status.SUBMITTED;
5-
import static org.ject.support.domain.apply.domain.Apply.Status.TEMP_SAVED;
6-
import static org.ject.support.domain.apply.exception.ApplyErrorCode.ALREADY_SUBMITTED;
7-
import static org.ject.support.domain.apply.exception.ApplyErrorCode.NOT_FOUND_APPLY;
8-
9-
import java.time.LocalDateTime;
10-
import java.util.List;
11-
import java.util.Map;
123
import lombok.RequiredArgsConstructor;
134
import lombok.extern.slf4j.Slf4j;
145
import org.ject.support.common.util.Map2JsonSerializer;
@@ -40,6 +31,16 @@
4031
import org.springframework.stereotype.Service;
4132
import org.springframework.transaction.annotation.Transactional;
4233

34+
import java.time.LocalDateTime;
35+
import java.util.List;
36+
import java.util.Map;
37+
38+
import static org.ject.support.domain.apply.domain.Apply.Status.JOINED;
39+
import static org.ject.support.domain.apply.domain.Apply.Status.SUBMITTED;
40+
import static org.ject.support.domain.apply.domain.Apply.Status.TEMP_SAVED;
41+
import static org.ject.support.domain.apply.exception.ApplyErrorCode.ALREADY_SUBMITTED;
42+
import static org.ject.support.domain.apply.exception.ApplyErrorCode.NOT_FOUND_APPLY;
43+
4344
@Slf4j
4445
@Service
4546
@RequiredArgsConstructor
@@ -172,9 +173,21 @@ public void submitApplication(Long memberId,
172173
@Override
173174
@PeriodAccessible(permitAllJob = true)
174175
public ApplyStatusResponse checkApplyStatus(Long memberId) {
175-
return applyRepository.findByMemberId(memberId)
176-
.map(ApplyStatusResponse::of)
176+
Member member = memberRepository.findById(memberId)
177+
.orElseThrow(() -> new MemberException(MemberErrorCode.NOT_FOUND_MEMBER));
178+
179+
if (!member.isProfileComplete()) {
180+
return ApplyStatusResponse.tempSavedProfile();
181+
}
182+
183+
Apply apply = applyRepository.findByMemberId(memberId)
177184
.orElseThrow(() -> new ApplyException(NOT_FOUND_APPLY));
185+
186+
if (apply.isTempSaved()) {
187+
return ApplyStatusResponse.tempSavedApply();
188+
}
189+
190+
return ApplyStatusResponse.of(apply.getStatus());
178191
}
179192

180193
@Override

src/main/java/org/ject/support/domain/member/entity/Member.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,4 +153,8 @@ public void deleteProfile() {
153153
public void promoteToSemester() {
154154
this.role = Role.SEMESTER;
155155
}
156+
157+
public boolean isProfileComplete() {
158+
return this.name != null && this.phoneNumber != null;
159+
}
156160
}

src/test/java/org/ject/support/domain/apply/service/ApplyServiceTest.java

Lines changed: 56 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,5 @@
11
package org.ject.support.domain.apply.service;
22

3-
import static org.assertj.core.api.Assertions.assertThat;
4-
import static org.assertj.core.api.Assertions.assertThatThrownBy;
5-
import static org.ject.support.domain.apply.domain.Apply.Status.JOINED;
6-
import static org.ject.support.domain.apply.domain.Apply.Status.SUBMITTED;
7-
import static org.ject.support.domain.apply.domain.Apply.Status.TEMP_SAVED;
8-
import static org.ject.support.domain.member.JobFamily.BE;
9-
import static org.mockito.BDDMockito.given;
10-
import static org.mockito.Mockito.any;
11-
import static org.mockito.Mockito.never;
12-
import static org.mockito.Mockito.verify;
13-
import static org.mockito.Mockito.when;
14-
15-
import java.time.LocalDateTime;
16-
import java.util.List;
17-
import java.util.Map;
18-
import java.util.Optional;
193
import org.ject.support.base.UnitTestSupport;
204
import org.ject.support.common.util.Map2JsonSerializer;
215
import org.ject.support.common.util.String2MapSerializer;
@@ -47,6 +31,23 @@
4731
import org.mockito.InjectMocks;
4832
import org.mockito.Mock;
4933

34+
import java.time.LocalDateTime;
35+
import java.util.List;
36+
import java.util.Map;
37+
import java.util.Optional;
38+
39+
import static org.assertj.core.api.Assertions.assertThat;
40+
import static org.assertj.core.api.Assertions.assertThatThrownBy;
41+
import static org.ject.support.domain.apply.domain.Apply.Status.JOINED;
42+
import static org.ject.support.domain.apply.domain.Apply.Status.SUBMITTED;
43+
import static org.ject.support.domain.apply.domain.Apply.Status.TEMP_SAVED;
44+
import static org.ject.support.domain.member.JobFamily.BE;
45+
import static org.mockito.BDDMockito.given;
46+
import static org.mockito.Mockito.any;
47+
import static org.mockito.Mockito.never;
48+
import static org.mockito.Mockito.verify;
49+
import static org.mockito.Mockito.when;
50+
5051
class ApplyServiceTest extends UnitTestSupport {
5152

5253
@InjectMocks
@@ -136,13 +137,36 @@ class ApplyServiceTest extends UnitTestSupport {
136137
.isInstanceOf(QuestionException.class);
137138
}
138139

140+
@Test
141+
void 지원단계중_프로필작성을_하지_않았을_경우_STEP을_PROFILE로_STATUS를_TEMP_SAVED_반환() {
142+
// given
143+
Long memberId = 1L;
144+
Member member = Member.builder()
145+
.build();
146+
given(memberRepository.findById(memberId))
147+
.willReturn(Optional.of(member));
148+
149+
// when
150+
ApplyStatusResponse result = applyService.checkApplyStatus(1L);
151+
152+
// then
153+
assertThat(result).isEqualTo(ApplyStatusResponse.tempSavedProfile());
154+
}
155+
139156
@Test
140157
void 작성_중인_지원서가_있는_경우_TEMP_SAVED_반환() {
141158
// given
142-
when(applyRepository.findByMemberId(any()))
143-
.thenReturn(Optional.of(
159+
Long memberId = 1L;
160+
Member member = Member.builder()
161+
.name("지원자명")
162+
.phoneNumber("01012345678")
163+
.build();
164+
given(memberRepository.findById(memberId))
165+
.willReturn(Optional.of(member));
166+
given(applyRepository.findByMemberId(any()))
167+
.willReturn(Optional.of(
144168
Apply.builder()
145-
.id(1L)
169+
.id(memberId)
146170
.status(TEMP_SAVED)
147171
.build()
148172
));
@@ -151,25 +175,32 @@ class ApplyServiceTest extends UnitTestSupport {
151175
ApplyStatusResponse result = applyService.checkApplyStatus(1L);
152176

153177
// then
154-
assertThat(result).isEqualTo(new ApplyStatusResponse(TEMP_SAVED));
178+
assertThat(result).isEqualTo(ApplyStatusResponse.tempSavedApply());
155179
}
156180

157181
@Test
158182
void 지원서를_제출한_지원자에_대한_제출_상태_확인_시_SUBMITTED_반환() {
159183
// given
160-
when(applyRepository.findByMemberId(any()))
161-
.thenReturn(Optional.of(
184+
Long memberId = 1L;
185+
Member member = Member.builder()
186+
.name("지원자명")
187+
.phoneNumber("01012345678")
188+
.build();
189+
given(memberRepository.findById(memberId))
190+
.willReturn(Optional.of(member));
191+
given(applyRepository.findByMemberId(any()))
192+
.willReturn(Optional.of(
162193
Apply.builder()
163-
.id(1L)
194+
.id(memberId)
164195
.status(SUBMITTED)
165196
.build()
166197
));
167198

168199
// when
169-
ApplyStatusResponse result = applyService.checkApplyStatus(1L);
200+
ApplyStatusResponse result = applyService.checkApplyStatus(memberId);
170201

171202
// then
172-
assertThat(result).isEqualTo(new ApplyStatusResponse(SUBMITTED));
203+
assertThat(result).isEqualTo(ApplyStatusResponse.of(SUBMITTED));
173204
}
174205

175206
@Test

src/test/java/org/ject/support/domain/member/MemberTest.java

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,14 @@
11
package org.ject.support.domain.member;
22

33
import org.ject.support.domain.member.entity.Member;
4-
import org.junit.jupiter.api.DisplayName;
54
import org.junit.jupiter.api.Test;
65

76
import static org.assertj.core.api.Assertions.assertThat;
87

98
class MemberTest {
109

1110
@Test
12-
@DisplayName("Member 엔티티 생성 성공")
13-
void createMember_Success() {
11+
void 멤버_엔티티_생성에_성공() {
1412
// given
1513
String name = "John Doe";
1614
String phoneNumber = "01012345678";
@@ -40,8 +38,7 @@ void createMember_Success() {
4038
}
4139

4240
@Test
43-
@DisplayName("Member 엔티티 생성 - 최소 필수 필드만으로 생성")
44-
void createMember_WithRequiredFieldsOnly_Success() {
41+
void 멤버_엔티티_최소_필수_필드로_생성에_성공() {
4542
// given
4643
String name = "John Doe";
4744
String phoneNumber = "01012345678";
@@ -67,4 +64,34 @@ void createMember_WithRequiredFieldsOnly_Success() {
6764
assertThat(member.getRegion()).isEqualTo(region);
6865
assertThat(member.getJobFamily()).isNull();
6966
}
67+
68+
@Test
69+
void 멤버의_이름이_없을_경우_프로필_완성_확인에_FALSE_반환() {
70+
// given
71+
Member member = Member.builder()
72+
.phoneNumber("01012345678")
73+
.email("noName@ject.com")
74+
.build();
75+
76+
// when
77+
boolean result = member.isProfileComplete();
78+
79+
// then
80+
assertThat(result).isFalse();
81+
}
82+
83+
@Test
84+
void 멤버의_이름과_핸드폰번호가_있을_경우_프로필_완성_확인에_TRUE_반환() {
85+
// given
86+
Member member = Member.builder()
87+
.name("이름")
88+
.phoneNumber("01012345678")
89+
.build();
90+
91+
// when
92+
boolean result = member.isProfileComplete();
93+
94+
// then
95+
assertThat(result).isTrue();
96+
}
7097
}

0 commit comments

Comments
 (0)