Skip to content

Commit

Permalink
Test: use fixture (#38)
Browse files Browse the repository at this point in the history
* test: Fixture 작성 (`Member`, `Event`)

* change: 멤버 등록 필요 속성 수정

* change: `WithCustomUser` Annotation을 사용하도록 통일, 관리자 권한이 필요한 API일 경우 해당 권한 테스트에 미리 반영

* test: `MemberFixture` 적용

* test: GWT 다듬기

* style: `EmailDetails`가 Entity가 아닐 경우 단일 Data인 점을 반영하여 `EmailDetail`로 이름 변경

* test: Email Fixture 작성

* test: Email Fixture 적용

* style: `given`절의 메서드가 when보다는 given을 사용하도록 변경

* test: `Attendance` Fixture 작성

* test: `Attendance` Fixture 적용

* test: `Event` Fixture 작성

* test: `Event` Fixture 적용

* test: `Controller` Test를 단위 테스트로 전환

* test: EmailFixture 적용

* fix: 이미 인증된 사용자를 통해 로그인 테스트를 하던 문제 해결

* change: 멤버 출석 성공 시 보여주는 정보 축소

* change: 멤버 출석 등록 시 `Role`을 받도록 수정

* feat: feedback 반영, Test Fixture를 좀 더 Verbose 하게

* test: 변경한 Fixture 반영

* chore: test build에 lombok 사용
  • Loading branch information
goldentrash committed Aug 27, 2024
1 parent 5ca05e0 commit 4a71219
Show file tree
Hide file tree
Showing 47 changed files with 1,044 additions and 856 deletions.
2 changes: 2 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,8 @@ dependencies {
compileOnly 'org.projectlombok:lombok'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
annotationProcessor 'org.projectlombok:lombok'
testCompileOnly 'org.projectlombok:lombok'
testAnnotationProcessor 'org.projectlombok:lombok'


runtimeOnly 'com.h2database:h2:2.2.224'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,10 @@
import gdsc.konkuk.platformcore.application.attendance.exceptions.QrInvalidException;
import gdsc.konkuk.platformcore.application.event.EventService;
import gdsc.konkuk.platformcore.application.event.dtos.EventWithAttendance;
import gdsc.konkuk.platformcore.controller.attendance.dtos.AttendSuccessResponse;
import gdsc.konkuk.platformcore.controller.attendance.dtos.AttendanceRegisterRequest;
import gdsc.konkuk.platformcore.controller.attendance.dtos.AttendanceResponse;
import gdsc.konkuk.platformcore.application.attendance.dtos.AttendanceStatus;
import gdsc.konkuk.platformcore.domain.attendance.entity.Attendance;
import gdsc.konkuk.platformcore.domain.attendance.entity.Participant;
import gdsc.konkuk.platformcore.global.responses.SuccessResponse;
import jakarta.validation.Valid;
import java.time.LocalDate;
Expand Down Expand Up @@ -54,8 +52,8 @@ public ResponseEntity<SuccessResponse> attend(
@PathVariable Long attendanceId,
@RequestParam String qrUuid,
@AuthenticationPrincipal OidcUser oidcUser) {
Participant participant = attendanceService.attend(oidcUser.getEmail(), attendanceId, qrUuid);
return ResponseEntity.ok(SuccessResponse.of(AttendSuccessResponse.from(participant, attendanceId)));
attendanceService.attend(oidcUser.getEmail(), attendanceId, qrUuid);
return ResponseEntity.ok(SuccessResponse.messageOnly());
}

@PostMapping()
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import gdsc.konkuk.platformcore.application.email.EmailTaskFacade;
import gdsc.konkuk.platformcore.application.email.EmailService;
import gdsc.konkuk.platformcore.controller.email.dtos.EmailSendRequest;
import gdsc.konkuk.platformcore.controller.email.dtos.EmailTaskDetailsResponse;
import gdsc.konkuk.platformcore.controller.email.dtos.EmailTaskDetailResponse;
import gdsc.konkuk.platformcore.controller.email.dtos.EmailTaskListResponse;
import gdsc.konkuk.platformcore.controller.email.mapper.EmailTaskMapper;
import gdsc.konkuk.platformcore.domain.email.entity.EmailTask;
Expand Down Expand Up @@ -37,7 +37,7 @@ public ResponseEntity<SuccessResponse> getAllEmailTask() {

@GetMapping("/{taskId}")
public ResponseEntity<SuccessResponse> getEmailTask(@PathVariable Long taskId) {
EmailTaskDetailsResponse emailTask = EmailTaskMapper.mapToEmailTaskDetailsResponse(emailService.getTaskDetails(taskId));
EmailTaskDetailResponse emailTask = EmailTaskMapper.mapToEmailTaskDetailsResponse(emailService.getTaskDetails(taskId));
return ResponseEntity.ok(SuccessResponse.of(emailTask));
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package gdsc.konkuk.platformcore.controller.email.dtos;

import gdsc.konkuk.platformcore.domain.email.entity.EmailDetails;
import gdsc.konkuk.platformcore.domain.email.entity.EmailDetail;
import gdsc.konkuk.platformcore.domain.email.entity.EmailReceiver;
import gdsc.konkuk.platformcore.domain.email.entity.EmailReceivers;
import gdsc.konkuk.platformcore.domain.email.entity.EmailTask;
Expand Down Expand Up @@ -34,17 +34,17 @@ public EmailSendRequest(String subject, String content, Set<EmailReceiverInfo> r
}

public static EmailTask toEntity(EmailSendRequest request) {
EmailDetails details = new EmailDetails(request.getSubject(), request.getContent());
EmailDetail details = new EmailDetail(request.getSubject(), request.getContent());
EmailReceivers receivers = new EmailReceivers(request.toEmailReceivers());
return EmailTask.builder()
.emailDetails(details)
.emailDetail(details)
.receivers(receivers)
.sendAt(request.getSendAt())
.build();
}

public EmailDetails toEmailDetails() {
return new EmailDetails(subject, content);
public EmailDetail toEmailDetails() {
return new EmailDetail(subject, content);
}

public Set<EmailReceiver> toEmailReceivers() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,23 +1,23 @@
package gdsc.konkuk.platformcore.controller.email.dtos;

import gdsc.konkuk.platformcore.domain.email.entity.EmailDetails;
import gdsc.konkuk.platformcore.domain.email.entity.EmailDetail;
import gdsc.konkuk.platformcore.domain.email.entity.EmailReceivers;
import java.time.LocalDateTime;
import java.util.List;
import lombok.Builder;
import lombok.Getter;

@Getter
public class EmailTaskDetailsResponse {
public class EmailTaskDetailResponse {
private final String subject;
private final String content;
private final List<EmailReceiverInfo> receiverInfos;
private final LocalDateTime sendAt;

@Builder
public EmailTaskDetailsResponse(EmailDetails emailDetails, EmailReceivers emailReceivers, LocalDateTime sendAt) {
this.subject = emailDetails.getSubject();
this.content = emailDetails.getContent();
public EmailTaskDetailResponse(EmailDetail emailDetail, EmailReceivers emailReceivers, LocalDateTime sendAt) {
this.subject = emailDetail.getSubject();
this.content = emailDetail.getContent();
this.receiverInfos = emailReceivers
.getReceivers()
.stream()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package gdsc.konkuk.platformcore.controller.email.dtos;

import gdsc.konkuk.platformcore.domain.email.entity.EmailDetails;
import gdsc.konkuk.platformcore.domain.email.entity.EmailDetail;
import gdsc.konkuk.platformcore.domain.email.entity.EmailTask;
import java.time.LocalDateTime;
import java.util.Set;
Expand All @@ -26,13 +26,12 @@ public SimpleEmailTaskResponse(Long id, String subject, Set<EmailReceiverInfo> r
}

public static SimpleEmailTaskResponse from(EmailTask emailTask) {
EmailDetails emailDetails = emailTask.getEmailDetails();
EmailDetail emailDetail = emailTask.getEmailDetail();
Set<EmailReceiverInfo> receiverInfos =
EmailReceiverInfo.fromValueObject(emailTask.getEmailReceivers());

return SimpleEmailTaskResponse.builder()
.id(emailTask.getId())
.subject(emailDetails.getSubject())
.subject(emailDetail.getSubject())
.receiverInfos(receiverInfos)
.sendAt(emailTask.getSendAt())
.isSent(emailTask.isSent())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import java.util.List;

import gdsc.konkuk.platformcore.controller.email.dtos.EmailTaskDetailsResponse;
import gdsc.konkuk.platformcore.controller.email.dtos.EmailTaskDetailResponse;
import gdsc.konkuk.platformcore.controller.email.dtos.EmailTaskListResponse;
import gdsc.konkuk.platformcore.controller.email.dtos.SimpleEmailTaskResponse;
import gdsc.konkuk.platformcore.domain.email.entity.EmailTask;
Expand All @@ -20,8 +20,8 @@ public static EmailTaskListResponse mapToEmailTaskListResponse(List<EmailTask> e
return new EmailTaskListResponse(simpleEmailTaskResponses);
}

public static EmailTaskDetailsResponse mapToEmailTaskDetailsResponse(EmailTask emailTask) {
return new EmailTaskDetailsResponse(
emailTask.getEmailDetails(), emailTask.getEmailReceivers(), emailTask.getSendAt());
public static EmailTaskDetailResponse mapToEmailTaskDetailsResponse(EmailTask emailTask) {
return new EmailTaskDetailResponse(
emailTask.getEmailDetail(), emailTask.getEmailReceivers(), emailTask.getSendAt());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,22 @@ public class MemberRegisterRequest {
private String name;
@NotEmpty
private String email;
@NotEmpty
private String department;
@NotEmpty
private String batch;
@NotEmpty
private String role;

public static Member toEntity(MemberRegisterRequest request) {
return Member.builder()
.memberId(request.getMemberId())
.password(request.getPassword())
.name(request.getName())
.email(request.getEmail())
.department(request.getDepartment())
.batch(request.getBatch())
.role(request.getRole())
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,15 +13,15 @@
@Embeddable
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class EmailDetails {
public class EmailDetail {

@Column(name = "email_subject")
private String subject;
@Column(name = "email_content", columnDefinition = "TEXT")
private String content;

@Builder
public EmailDetails(String subject, String content) {
public EmailDetail(String subject, String content) {
this.subject = validateNotNull(subject, "subject");
this.content = validateNotNull(content, "content");
}
Expand All @@ -32,7 +32,7 @@ public boolean equals(Object o) {
return true;
if (o == null || getClass() != o.getClass())
return false;
EmailDetails that = (EmailDetails)o;
EmailDetail that = (EmailDetail)o;
return Objects.equals(subject, that.subject) && Objects.equals(content, that.content);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ public class EmailTask {
@Column(name = "task_id")
private Long id;

@Embedded private EmailDetails emailDetails;
@Embedded private EmailDetail emailDetail;

@Embedded private EmailReceivers emailReceivers;

Expand All @@ -39,15 +39,15 @@ public class EmailTask {

@Builder
public EmailTask(
Long id, EmailDetails emailDetails, EmailReceivers receivers, LocalDateTime sendAt) {
Long id, EmailDetail emailDetail, EmailReceivers receivers, LocalDateTime sendAt) {
this.id = id;
this.emailDetails = validateNotNull(emailDetails, "emailDetails");
this.emailDetail = validateNotNull(emailDetail, "emailDetails");
this.emailReceivers = validateNotNull(receivers, "emailReceivers");
this.sendAt = validateNotNull(sendAt, "sendAt");
}

public void changeEmailDetails(final EmailDetails newEmailDetails) {
emailDetails = newEmailDetails;
public void changeEmailDetails(final EmailDetail newEmailDetail) {
emailDetail = newEmailDetail;
}

public void changeEmailReceivers(final Set<EmailReceiver> set) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ public class Member {

@Enumerated(EnumType.STRING)
@Column(name = "member_role")
private MemberRole role = MemberRole.MEMBER;
private MemberRole role;

@Column(name = "batch")
private String batch;
Expand Down Expand Up @@ -91,14 +91,16 @@ public Member(
String email,
// String profileImageUrl,
String department,
String role,
String batch) {
this.id = id;
this.memberId = validateNotNull(memberId, "memberId");
this.password = validateNotNull(password, "password");
this.name = validateNotNull(name, "name");
this.email = validateNotNull(email, "email");
// this.profileImageUrl = profileImageUrl;
this.department = department;
this.batch = batch;
this.department = validateNotNull(department, "department");
this.role = (role != null) ? MemberRole.from(role) : MemberRole.MEMBER;
this.batch = validateNotNull(batch, "batch");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,15 @@ public enum MemberRole {

private final String authority;

public static MemberRole from(String role) {
return switch (role) {
case "ROLE_LEAD" -> LEAD;
case "ROLE_ADMIN" -> ADMIN;
case "ROLE_MEMBER" -> MEMBER;
default -> throw new IllegalArgumentException("Invalid role: " + role);
};
}

MemberRole(String authority) {
this.authority = authority;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@

import org.springframework.stereotype.Component;

import gdsc.konkuk.platformcore.domain.email.entity.EmailDetails;
import gdsc.konkuk.platformcore.domain.email.entity.EmailDetail;
import gdsc.konkuk.platformcore.domain.email.entity.EmailTask;
import gdsc.konkuk.platformcore.external.email.exceptions.EmailClientErrorCode;
import gdsc.konkuk.platformcore.external.email.exceptions.EmailSendingException;
Expand All @@ -28,28 +28,28 @@ public class EmailClient {
private final JavaMailSender javaMailSender;

public void sendEmailToReceivers(EmailTask email) {
EmailDetails emailDetails = email.getEmailDetails();
EmailDetail emailDetail = email.getEmailDetail();
Set<EmailReceiver> receivers = email.getEmailReceivers().getReceivers();
receivers.forEach(receiver -> sendEmail(receiver, emailDetails));
receivers.forEach(receiver -> sendEmail(receiver, emailDetail));
}

public String replaceNameToken(String content, String name) {
return content.replaceAll(EMAIL_RECEIVER_NAME_REGEXP, name);
}

private MimeMessage generateMimeMessage(EmailReceiver to, EmailDetails emailDetails)
private MimeMessage generateMimeMessage(EmailReceiver to, EmailDetail emailDetail)
throws MessagingException {
String emailContent = replaceNameToken(emailDetails.getContent(), to.getName());
String emailContent = replaceNameToken(emailDetail.getContent(), to.getName());
String emailDestination = to.getEmail();
String emailSubject = emailDetails.getSubject();
String emailSubject = emailDetail.getSubject();

return convertToHTMLMimeMessage(emailDestination, emailSubject, emailContent);
}

private void sendEmail(EmailReceiver to, EmailDetails emailDetails) {
private void sendEmail(EmailReceiver to, EmailDetail emailDetail) {
try {
log.info("Sending email to {}", to);
MimeMessage message = generateMimeMessage(to, emailDetails);
MimeMessage message = generateMimeMessage(to, emailDetail);
javaMailSender.send(message);
} catch (MailParseException | MessagingException e) {
throw EmailSendingException.of(EmailClientErrorCode.MAIL_PARSING_ERROR, e.getMessage());
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package gdsc.konkuk.platformcore.global.utils;

import lombok.AccessLevel;
import lombok.NoArgsConstructor;

@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class GetDefault {
public static <T> T getDefault(T value, T defaultValue) {
return value == null ? defaultValue : value;
}
}
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
package gdsc.konkuk.platformcore.annotation;

import gdsc.konkuk.platformcore.domain.member.entity.MemberRole;
import gdsc.konkuk.platformcore.fixture.member.MemberFixture;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import org.springframework.security.test.context.support.WithSecurityContext;

@Retention(RetentionPolicy.RUNTIME)
@WithSecurityContext(factory = WithMyCustomUserSecurityContextFactory.class)
public @interface CustomMockUser {
String memberId() default "202011288";

@WithSecurityContext(factory = WithCustomUserSecurityContextFactory.class)
public @interface WithCustomUser {
String memberId() default "2024000000";
MemberRole role() default MemberRole.MEMBER;
}
Loading

0 comments on commit 4a71219

Please sign in to comment.