diff --git a/src/main/java/com/somemore/Location.java b/src/main/java/com/somemore/Location.java deleted file mode 100644 index 65a41af32..000000000 --- a/src/main/java/com/somemore/Location.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.somemore; - -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.Id; -import lombok.Getter; -import lombok.Setter; - -@Getter -@Setter -@Entity -public class Location { - @Id - @Column(name = "id", nullable = false) - private Long id; - - @Column(name = "address", nullable = false) - private String address; - - @Column(name = "latitude", nullable = false) - private String latitude; - - @Column(name = "longitude", nullable = false) - private String longitude; - -} \ No newline at end of file diff --git a/src/main/java/com/somemore/RecruitBoard.java b/src/main/java/com/somemore/RecruitBoard.java deleted file mode 100644 index 62665b9e5..000000000 --- a/src/main/java/com/somemore/RecruitBoard.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.somemore; - -import jakarta.persistence.*; -import lombok.Getter; -import lombok.Setter; - -import java.time.Instant; -import java.util.UUID; - -@Getter -@Setter -@Entity -@Table(name = "Recruit_board") -public class RecruitBoard { - @Id - @GeneratedValue(strategy = GenerationType.UUID) - private UUID id; - - @Column(name = "title", nullable = false) - private String title; - - @Lob - @Column(name = "content", nullable = false) - private String content; - - @Column(name = "recruit_status", nullable = false, length = 20) - private String recruitStatus; - - @Column(name = "img_url") - private String imgUrl; - - @Column(name = "volunteer_date", nullable = false) - private Instant volunteerDate; - - @Column(name = "volunteer_type", nullable = false, length = 20) - private String volunteerType; - - @Column(name = "volunteer_hours", nullable = false) - private Integer volunteerHours; - - @Column(name = "admitted", nullable = false) - private Boolean admitted = false; - -} \ No newline at end of file diff --git a/src/main/java/com/somemore/location/domain/Location.java b/src/main/java/com/somemore/location/domain/Location.java new file mode 100644 index 000000000..e3a6022f1 --- /dev/null +++ b/src/main/java/com/somemore/location/domain/Location.java @@ -0,0 +1,40 @@ +package com.somemore.location.domain; + +import static jakarta.persistence.GenerationType.IDENTITY; +import static lombok.AccessLevel.PROTECTED; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor(access = PROTECTED) +@Entity +@Table(name = "Location") +public class Location { + + @Id + @GeneratedValue(strategy = IDENTITY) + private Long id; + + @Column(name = "address", nullable = false) + private String address; + + @Column(name = "latitude", nullable = false) + private String latitude; + + @Column(name = "longitude", nullable = false) + private String longitude; + + @Builder + public Location(String address, String latitude, String longitude) { + this.address = address; + this.latitude = latitude; + this.longitude = longitude; + } +} \ No newline at end of file diff --git a/src/main/java/com/somemore/location/dto/request/LocationCreateRequestDto.java b/src/main/java/com/somemore/location/dto/request/LocationCreateRequestDto.java new file mode 100644 index 000000000..80669d209 --- /dev/null +++ b/src/main/java/com/somemore/location/dto/request/LocationCreateRequestDto.java @@ -0,0 +1,31 @@ +package com.somemore.location.dto.request; + +import com.fasterxml.jackson.databind.PropertyNamingStrategies.SnakeCaseStrategy; +import com.fasterxml.jackson.databind.annotation.JsonNaming; +import com.somemore.location.domain.Location; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import lombok.Builder; + +@JsonNaming(SnakeCaseStrategy.class) +@Builder +public record LocationCreateRequestDto( + @Schema(description = "도로명 주소", example = "서울특별시 서초구 반포대로 45, 4층(서초동, 명정빌딩)") + @NotBlank(message = "주소는 필수 입력 값입니다.") + String address, + @Schema(description = "주소에 해당하는 위도 정보", example = "37.4845373748015") + @NotBlank(message = "위도는 필수 입력 값입니다.") + String latitude, + @Schema(description = "주소에 해당하는 경도 정보", example = "127.010842267696") + @NotBlank(message = "경도는 필수 입력 값입니다.") + String longitude +) { + + public Location toEntity() { + return Location.builder() + .address(address) + .latitude(latitude) + .longitude(longitude) + .build(); + } +} diff --git a/src/main/java/com/somemore/location/repository/LocationRepository.java b/src/main/java/com/somemore/location/repository/LocationRepository.java new file mode 100644 index 000000000..e68ae0abc --- /dev/null +++ b/src/main/java/com/somemore/location/repository/LocationRepository.java @@ -0,0 +1,8 @@ +package com.somemore.location.repository; + +import com.somemore.location.domain.Location; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface LocationRepository extends JpaRepository { + +} diff --git a/src/main/java/com/somemore/location/service/LocationCommandService.java b/src/main/java/com/somemore/location/service/LocationCommandService.java new file mode 100644 index 000000000..3a0c5176f --- /dev/null +++ b/src/main/java/com/somemore/location/service/LocationCommandService.java @@ -0,0 +1,9 @@ +package com.somemore.location.service; + +import com.somemore.location.dto.request.LocationCreateRequestDto; + +public interface LocationCommandService { + + public Long createLocation(LocationCreateRequestDto dto); + +} diff --git a/src/main/java/com/somemore/location/service/LocationCommander.java b/src/main/java/com/somemore/location/service/LocationCommander.java new file mode 100644 index 000000000..e671e6163 --- /dev/null +++ b/src/main/java/com/somemore/location/service/LocationCommander.java @@ -0,0 +1,24 @@ +package com.somemore.location.service; + +import com.somemore.location.domain.Location; +import com.somemore.location.dto.request.LocationCreateRequestDto; +import com.somemore.location.repository.LocationRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@RequiredArgsConstructor +@Transactional +@Service +public class LocationCommander implements LocationCommandService { + + private final LocationRepository locationRepository; + + public Long createLocation(LocationCreateRequestDto dto) { + Location location = dto.toEntity(); + + locationRepository.save(location); + + return location.getId(); + } +} diff --git a/src/main/java/com/somemore/recruitboard/domain/RecruitBoard.java b/src/main/java/com/somemore/recruitboard/domain/RecruitBoard.java new file mode 100644 index 000000000..39d5dc77d --- /dev/null +++ b/src/main/java/com/somemore/recruitboard/domain/RecruitBoard.java @@ -0,0 +1,77 @@ +package com.somemore.recruitboard.domain; + +import static com.somemore.recruitboard.domain.RecruitStatus.RECRUITING; +import static jakarta.persistence.EnumType.STRING; +import static jakarta.persistence.GenerationType.IDENTITY; +import static lombok.AccessLevel.PROTECTED; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Enumerated; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import jakarta.persistence.Lob; +import jakarta.persistence.Table; +import java.time.LocalDateTime; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor(access = PROTECTED) +@Entity +@Table(name = "Recruit_board") +public class RecruitBoard { + + @Id + @GeneratedValue(strategy = IDENTITY) + private Long id; + + @Column(name = "location_id", nullable = false) + private Long locationId; + + @Column(name = "center_id", nullable = false) + private Long centerId; + + @Column(name = "title", nullable = false) + private String title; + + @Lob + @Column(name = "content", nullable = false) + private String content; + + @Enumerated(value = STRING) + @Column(name = "recruit_status", nullable = false, length = 20) + private RecruitStatus recruitStatus = RECRUITING; + + @Column(name = "img_url", nullable = false) + private String imgUrl; + + @Column(name = "volunteer_date", nullable = false) + private LocalDateTime volunteerDate; + + @Enumerated(value = STRING) + @Column(name = "volunteer_type", nullable = false, length = 20) + private VolunteerType volunteerType; + + @Column(name = "volunteer_hours", nullable = false) + private int volunteerHours; + + @Column(name = "admitted", nullable = false) + private Boolean admitted; + + @Builder + public RecruitBoard(Long locationId, Long centerId, String title, String content, String imgUrl, + LocalDateTime volunteerDate, VolunteerType volunteerType, int volunteerHours, + Boolean admitted) { + this.locationId = locationId; + this.centerId = centerId; + this.title = title; + this.content = content; + this.imgUrl = imgUrl; + this.volunteerDate = volunteerDate; + this.volunteerType = volunteerType; + this.volunteerHours = volunteerHours; + this.admitted = admitted; + } +} \ No newline at end of file diff --git a/src/main/java/com/somemore/recruitboard/domain/RecruitStatus.java b/src/main/java/com/somemore/recruitboard/domain/RecruitStatus.java new file mode 100644 index 000000000..a10eee42d --- /dev/null +++ b/src/main/java/com/somemore/recruitboard/domain/RecruitStatus.java @@ -0,0 +1,16 @@ +package com.somemore.recruitboard.domain; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@RequiredArgsConstructor +public enum RecruitStatus { + RECRUITING("모집중"), + CLOSED("마감"), + COMPLETED("종료"), + + ; + private final String text; + +} diff --git a/src/main/java/com/somemore/recruitboard/domain/VolunteerType.java b/src/main/java/com/somemore/recruitboard/domain/VolunteerType.java new file mode 100644 index 000000000..65e54601e --- /dev/null +++ b/src/main/java/com/somemore/recruitboard/domain/VolunteerType.java @@ -0,0 +1,27 @@ +package com.somemore.recruitboard.domain; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@RequiredArgsConstructor +public enum VolunteerType { + + LIVING_SUPPORT("생활편의지원"), + HOUSING_ENVIRONMENT("주거환경"), + COUNSELING("상담"), + EDUCATION("교육"), + HEALTHCARE("보건의료"), + RURAL_SUPPORT("농어촌봉사"), + CULTURAL_EVENT("문화행사"), + ENVIRONMENTAL_PROTECTION("환경보호"), + ADMINISTRATIVE_SUPPORT("행정보조"), + SAFETY_PREVENTION("안전예방"), + PUBLIC_INTEREST_HUMAN_RIGHTS("공익인권"), + DISASTER_RELIEF("재해재난"), + MENTORING("멘토링"), + OTHER("기타"), + + ; + private final String text; +} diff --git a/src/main/java/com/somemore/recruitboard/dto/command/RecruitBoardCreateCommandRequestDto.java b/src/main/java/com/somemore/recruitboard/dto/command/RecruitBoardCreateCommandRequestDto.java new file mode 100644 index 000000000..5406efaeb --- /dev/null +++ b/src/main/java/com/somemore/recruitboard/dto/command/RecruitBoardCreateCommandRequestDto.java @@ -0,0 +1,34 @@ +package com.somemore.recruitboard.dto.command; + +import com.somemore.recruitboard.domain.RecruitBoard; +import com.somemore.recruitboard.domain.VolunteerType; +import java.time.LocalDateTime; +import lombok.Builder; + +@Builder +public record RecruitBoardCreateCommandRequestDto( + Long centerId, + Long locationId, + String imgUrl, + String title, + String content, + LocalDateTime volunteerDate, + VolunteerType volunteerType, + Integer volunteerHours, + Boolean admitted + ) { + + public RecruitBoard toEntity() { + return RecruitBoard.builder() + .locationId(locationId) + .centerId(centerId) + .title(title) + .content(content) + .imgUrl(imgUrl) + .volunteerDate(volunteerDate) + .volunteerType(volunteerType) + .admitted(admitted) + .build(); + } + +} diff --git a/src/main/java/com/somemore/recruitboard/dto/request/RecruitCreateRequestDto.java b/src/main/java/com/somemore/recruitboard/dto/request/RecruitCreateRequestDto.java new file mode 100644 index 000000000..97550946a --- /dev/null +++ b/src/main/java/com/somemore/recruitboard/dto/request/RecruitCreateRequestDto.java @@ -0,0 +1,73 @@ +package com.somemore.recruitboard.dto.request; + +import com.fasterxml.jackson.databind.PropertyNamingStrategies.SnakeCaseStrategy; +import com.fasterxml.jackson.databind.annotation.JsonNaming; +import com.somemore.location.dto.request.LocationCreateRequestDto; +import com.somemore.recruitboard.domain.RecruitBoard; +import com.somemore.recruitboard.domain.VolunteerType; +import com.somemore.recruitboard.dto.command.RecruitBoardCreateCommandRequestDto; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Positive; +import java.time.LocalDateTime; +import lombok.Builder; + +@JsonNaming(SnakeCaseStrategy.class) +@Builder +public record RecruitCreateRequestDto( + @Schema(description = "봉사 모집글 제목", example = "서울 청계천 환경 미화 봉사 모집") + @NotBlank(message = "모집글 제목은 필수 값입니다.") + String title, + @Schema(description = "봉사 모집글 내용", example = "서울 청계천 주변 환경 미화 봉사 모집합니다.
") + @NotBlank(message = "모집글 내용은 필수 값입니다.") + String content, + @Schema(description = "봉사 일시", example = "2024-11-20T10:00:00") + @NotNull(message = "봉사 일시는 필수 값입니다.") + LocalDateTime volunteerDate, + @Schema(description = "봉사 활동 유형", example = "ENVIRONMENTAL_PROTECTION") + @NotNull(message = "봉사 활동 유형은 필수 값입니다.") + VolunteerType volunteerType, + @Schema(description = "봉사 시간", example = "4") + @Positive(message = "봉사 시간은 1이상 이어야 합니다.") + Integer volunteerHours, + @Schema(description = "봉사 시간 인정 여부", example = "true") + @NotNull(message = "시간 인정 여부는 필수 값입니다.") + Boolean admitted, + @NotNull(message = "위치 정보는 필수 값입니다.") + LocationCreateRequestDto location +) { + + public RecruitBoard toEntity(Long locationId, Long centerId, String imgUrl) { + return RecruitBoard.builder() + .locationId(locationId) + .centerId(centerId) + .title(title) + .content(content) + .imgUrl(imgUrl) + .volunteerDate(volunteerDate) + .volunteerType(volunteerType) + .admitted(admitted) + .build(); + } + + public RecruitBoardCreateCommandRequestDto toCommandRequest( + Long centerId, + Long locationId, + String imgUrl + ) { + return RecruitBoardCreateCommandRequestDto.builder() + .centerId(centerId) + .locationId(locationId) + .imgUrl(imgUrl) + .title(title) + .content(content) + .volunteerDate(volunteerDate) + .volunteerType(volunteerType) + .volunteerHours(volunteerHours) + .admitted(admitted) + .build(); + + } + +} diff --git a/src/main/java/com/somemore/recruitboard/repository/RecruitBoardRepository.java b/src/main/java/com/somemore/recruitboard/repository/RecruitBoardRepository.java new file mode 100644 index 000000000..8544032b0 --- /dev/null +++ b/src/main/java/com/somemore/recruitboard/repository/RecruitBoardRepository.java @@ -0,0 +1,8 @@ +package com.somemore.recruitboard.repository; + +import com.somemore.recruitboard.domain.RecruitBoard; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface RecruitBoardRepository extends JpaRepository { + +} diff --git a/src/main/java/com/somemore/recruitboard/service/RecruitBoardCommandService.java b/src/main/java/com/somemore/recruitboard/service/RecruitBoardCommandService.java new file mode 100644 index 000000000..79e3dc8e8 --- /dev/null +++ b/src/main/java/com/somemore/recruitboard/service/RecruitBoardCommandService.java @@ -0,0 +1,8 @@ +package com.somemore.recruitboard.service; + +import com.somemore.recruitboard.dto.command.RecruitBoardCreateCommandRequestDto; + +public interface RecruitBoardCommandService { + + public Long create(RecruitBoardCreateCommandRequestDto dto); +} diff --git a/src/main/java/com/somemore/recruitboard/service/RecruitBoardCommander.java b/src/main/java/com/somemore/recruitboard/service/RecruitBoardCommander.java new file mode 100644 index 000000000..c69a8f357 --- /dev/null +++ b/src/main/java/com/somemore/recruitboard/service/RecruitBoardCommander.java @@ -0,0 +1,25 @@ +package com.somemore.recruitboard.service; + +import com.somemore.recruitboard.domain.RecruitBoard; +import com.somemore.recruitboard.repository.RecruitBoardRepository; +import com.somemore.recruitboard.dto.command.RecruitBoardCreateCommandRequestDto; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@RequiredArgsConstructor +@Transactional +@Service +public class RecruitBoardCommander implements RecruitBoardCommandService { + + private final RecruitBoardRepository recruitBoardRepository; + + @Override + public Long create(RecruitBoardCreateCommandRequestDto dto) { + RecruitBoard recruitBoard = dto.toEntity(); + recruitBoardRepository.save(recruitBoard); + + return recruitBoard.getId(); + } + +} diff --git a/src/main/java/com/somemore/recruitboard/service/RecruitBoardUseCase.java b/src/main/java/com/somemore/recruitboard/service/RecruitBoardUseCase.java new file mode 100644 index 000000000..1c41e7a12 --- /dev/null +++ b/src/main/java/com/somemore/recruitboard/service/RecruitBoardUseCase.java @@ -0,0 +1,30 @@ +package com.somemore.recruitboard.service; + +import com.somemore.location.service.LocationCommandService; +import com.somemore.recruitboard.dto.request.RecruitCreateRequestDto; +import java.util.Optional; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@RequiredArgsConstructor +@Transactional +@Service +public class RecruitBoardUseCase implements RecruitBoardUseCaseService { + + private final RecruitBoardCommandService recruitBoardCommandService; + private final LocationCommandService locationCommandService; + + @Override + public Long createRecruitBoard( + RecruitCreateRequestDto requestDto, + Long centerId, + Optional imgUrl) { + + Long locationId = locationCommandService.createLocation(requestDto.location()); + + return recruitBoardCommandService.create( + requestDto.toCommandRequest(centerId, locationId, imgUrl.orElse(""))); + + } +} diff --git a/src/main/java/com/somemore/recruitboard/service/RecruitBoardUseCaseService.java b/src/main/java/com/somemore/recruitboard/service/RecruitBoardUseCaseService.java new file mode 100644 index 000000000..17cd9a805 --- /dev/null +++ b/src/main/java/com/somemore/recruitboard/service/RecruitBoardUseCaseService.java @@ -0,0 +1,13 @@ +package com.somemore.recruitboard.service; + +import com.somemore.recruitboard.dto.request.RecruitCreateRequestDto; +import java.util.Optional; + +public interface RecruitBoardUseCaseService { + + public Long createRecruitBoard( + RecruitCreateRequestDto requestDto, + Long centerId, + Optional imgUrl); + +} diff --git a/src/test/java/com/somemore/IntegrationTestSupport.java b/src/test/java/com/somemore/IntegrationTestSupport.java new file mode 100644 index 000000000..cba699570 --- /dev/null +++ b/src/test/java/com/somemore/IntegrationTestSupport.java @@ -0,0 +1,10 @@ +package com.somemore; + +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ActiveProfiles; + +@ActiveProfiles("test") +@SpringBootTest +public abstract class IntegrationTestSupport { + +} diff --git a/src/test/java/com/somemore/SomemoreApplicationTests.java b/src/test/java/com/somemore/SomemoreApplicationTests.java index 024ac3f28..c1b2bc6c2 100644 --- a/src/test/java/com/somemore/SomemoreApplicationTests.java +++ b/src/test/java/com/somemore/SomemoreApplicationTests.java @@ -3,11 +3,11 @@ import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; -@SpringBootTest +//@SpringBootTest class SomemoreApplicationTests { - @Test - void contextLoads() { - } +// @Test +// void contextLoads() { +// } } diff --git a/src/test/java/com/somemore/location/dto/request/LocationCommanderTest.java b/src/test/java/com/somemore/location/dto/request/LocationCommanderTest.java new file mode 100644 index 000000000..4965ac95c --- /dev/null +++ b/src/test/java/com/somemore/location/dto/request/LocationCommanderTest.java @@ -0,0 +1,48 @@ +package com.somemore.location.service; + +import static org.assertj.core.api.Assertions.assertThat; + +import com.somemore.IntegrationTestSupport; +import com.somemore.location.domain.Location; +import com.somemore.location.dto.request.LocationCreateRequestDto; +import com.somemore.location.repository.LocationRepository; +import java.util.Optional; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +class LocationCommanderTest extends IntegrationTestSupport { + + @Autowired + private LocationCommander locationCommander; + + @Autowired + private LocationRepository locationRepository; + + @AfterEach + void tearDown() { + locationRepository.deleteAllInBatch(); + } + + @DisplayName("위치 생성 정보를 받아 위치를 저장한다") + @Test + void createLocationWithCreateRequestDto() { + // given + LocationCreateRequestDto dto = LocationCreateRequestDto.builder() + .address("위치위치") + .latitude("위도위도") + .longitude("경도경도") + .build(); + + // when + Long locationId = locationCommander.createLocation(dto); + Optional location = locationRepository.findById(locationId); + + // then + assertThat(location.isPresent()).isTrue(); + assertThat(location.get().getId()).isEqualTo(locationId); + + } + +} \ No newline at end of file diff --git a/src/test/java/com/somemore/recruitboard/domain/RecruitBoardTest.java b/src/test/java/com/somemore/recruitboard/domain/RecruitBoardTest.java new file mode 100644 index 000000000..1cdf23610 --- /dev/null +++ b/src/test/java/com/somemore/recruitboard/domain/RecruitBoardTest.java @@ -0,0 +1,35 @@ +package com.somemore.recruitboard.domain; + +import static com.somemore.recruitboard.domain.VolunteerType.OTHER; +import static org.assertj.core.api.Assertions.assertThat; + +import java.time.LocalDateTime; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class RecruitBoardTest { + + @DisplayName("봉사 모집글 생성시 모집상태는 모집중이다") + @Test + void CreateRecruitBoardWithDefaultStatus() { + // given + RecruitBoard board = RecruitBoard.builder() + .locationId(1L) + .centerId(1L) + .title("1234") + .content("123") + .imgUrl("123") + .volunteerDate(LocalDateTime.now()) + .volunteerType(OTHER) + .volunteerHours(7) + .admitted(true) + .build(); + + // when + RecruitStatus recruitStatus = board.getRecruitStatus(); + + // then + assertThat(recruitStatus).isEqualTo(RecruitStatus.RECRUITING); + } + +} \ No newline at end of file diff --git a/src/test/java/com/somemore/recruitboard/service/RecruitBoardCommanderTest.java b/src/test/java/com/somemore/recruitboard/service/RecruitBoardCommanderTest.java new file mode 100644 index 000000000..299a5bc49 --- /dev/null +++ b/src/test/java/com/somemore/recruitboard/service/RecruitBoardCommanderTest.java @@ -0,0 +1,60 @@ +package com.somemore.recruitboard.service; + +import static org.assertj.core.api.Assertions.assertThat; + +import com.somemore.IntegrationTestSupport; +import com.somemore.recruitboard.domain.RecruitBoard; +import com.somemore.recruitboard.domain.VolunteerType; +import com.somemore.recruitboard.repository.RecruitBoardRepository; +import com.somemore.recruitboard.dto.command.RecruitBoardCreateCommandRequestDto; +import java.time.LocalDateTime; +import java.util.Optional; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +class RecruitBoardCommanderTest extends IntegrationTestSupport { + + @Autowired + private RecruitBoardCommander recruitBoardCommander; + + @Autowired + private RecruitBoardRepository recruitBoardRepository; + + + @AfterEach + void tearDown() { + recruitBoardRepository.deleteAllInBatch(); + } + + @DisplayName("모집글 생성 정보를 받아 봉사 모집글을 저장한다.") + @Test + void createRecruitBoardWithCreateRequestDto() { + // given + RecruitBoardCreateCommandRequestDto requestDto = RecruitBoardCreateCommandRequestDto.builder() + .centerId(1L) + .locationId(1L) + .imgUrl("https://image.domain.com/links") + .title("봉사 모집글 작성") + .content("봉사 하실분을 모집합니다.
") + .volunteerDate(LocalDateTime.now()) + .volunteerType(VolunteerType.OTHER) + .volunteerHours(4) + .admitted(true) + .build(); + + // when + Long saveId = recruitBoardCommander.create(requestDto); + Optional recruitBoard = recruitBoardRepository.findById(saveId); + + // then + assertThat(recruitBoard.isPresent()).isTrue(); + assertThat(recruitBoard.get().getId()).isEqualTo(saveId); + assertThat(recruitBoard.get().getCenterId()).isEqualTo(requestDto.centerId()); + assertThat(recruitBoard.get().getLocationId()).isEqualTo(requestDto.locationId()); + assertThat(recruitBoard.get().getImgUrl()).isEqualTo(requestDto.imgUrl()); + } + + +} \ No newline at end of file diff --git a/src/test/java/com/somemore/recruitboard/service/RecruitBoardUseCaseServiceTest.java b/src/test/java/com/somemore/recruitboard/service/RecruitBoardUseCaseServiceTest.java new file mode 100644 index 000000000..5792ba8d0 --- /dev/null +++ b/src/test/java/com/somemore/recruitboard/service/RecruitBoardUseCaseServiceTest.java @@ -0,0 +1,103 @@ +package com.somemore.recruitboard.service; + +import static org.assertj.core.api.Assertions.assertThat; + +import com.somemore.IntegrationTestSupport; +import com.somemore.location.dto.request.LocationCreateRequestDto; +import com.somemore.location.repository.LocationRepository; +import com.somemore.recruitboard.domain.RecruitBoard; +import com.somemore.recruitboard.domain.VolunteerType; +import com.somemore.recruitboard.dto.request.RecruitCreateRequestDto; +import com.somemore.recruitboard.repository.RecruitBoardRepository; +import java.time.LocalDateTime; +import java.util.Optional; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +class RecruitBoardUseCaseServiceTest extends IntegrationTestSupport { + + @Autowired + private RecruitBoardUseCase recruitBoardUseCase; + + @Autowired + private RecruitBoardRepository recruitBoardRepository; + + @Autowired + private LocationRepository locationRepository; + + @AfterEach + void tearDown() { + recruitBoardRepository.deleteAllInBatch(); + locationRepository.deleteAllInBatch(); + } + + @DisplayName("봉사 모집글 생성 정보로 모집글을 저장한다") + @Test + void createRecruitBoardWithDto() { + // given + LocationCreateRequestDto locationDto = LocationCreateRequestDto.builder() + .address("도로명 주소 33") + .latitude("위도 정보") + .longitude("경도 정보") + .build(); + + RecruitCreateRequestDto dto = RecruitCreateRequestDto.builder() + .title("봉사 모집글 작성") + .content("봉사 하실분을 모집합니다.
") + .volunteerDate(LocalDateTime.now()) + .volunteerType(VolunteerType.OTHER) + .volunteerHours(4) + .admitted(true) + .location(locationDto) + .build(); + + long centerId = 1L; + Optional imgUrl = Optional.of("https://image.domain.com/links"); + + // when + Long saveId = recruitBoardUseCase.createRecruitBoard(dto, centerId, imgUrl); + Optional recruitBoard = recruitBoardRepository.findById(saveId); + + // then + assertThat(recruitBoard.isPresent()).isTrue(); + assertThat(recruitBoard.get().getId()).isEqualTo(saveId); + assertThat(recruitBoard.get().getCenterId()).isEqualTo(centerId); + assertThat(recruitBoard.get().getImgUrl()).isEqualTo(imgUrl.get()); + } + + @DisplayName("봉사 모집글 저장시 이미지 링크가 없을 경우 빈 문자열을 저장한다") + @Test + void createRecruitBoardWhenImgUrlIsEmpty() { + // given + LocationCreateRequestDto locationDto = LocationCreateRequestDto.builder() + .address("도로명 주소 33") + .latitude("위도 정보") + .longitude("경도 정보") + .build(); + + RecruitCreateRequestDto dto = RecruitCreateRequestDto.builder() + .title("봉사 모집글 작성") + .content("봉사 하실분을 모집합니다.
") + .volunteerDate(LocalDateTime.now()) + .volunteerType(VolunteerType.OTHER) + .volunteerHours(4) + .admitted(true) + .location(locationDto) + .build(); + + long centerId = 1L; + Optional imgUrl = Optional.empty(); + + // when + Long saveId = recruitBoardUseCase.createRecruitBoard(dto, centerId, imgUrl); + Optional recruitBoard = recruitBoardRepository.findById(saveId); + + // then + assertThat(recruitBoard.isPresent()).isTrue(); + assertThat(recruitBoard.get().getId()).isEqualTo(saveId); + assertThat(recruitBoard.get().getCenterId()).isEqualTo(centerId); + assertThat(recruitBoard.get().getImgUrl()).isEqualTo(""); + } +} \ No newline at end of file diff --git a/src/test/resources/application-test.yml b/src/test/resources/application-test.yml new file mode 100644 index 000000000..5e687f767 --- /dev/null +++ b/src/test/resources/application-test.yml @@ -0,0 +1,22 @@ +spring: + config: + activate: + on-profile: test + + datasource: + url: jdbc:h2:mem:~/somemore + driver-class-name: org.h2.Driver + username: sa + password: + + jpa: + hibernate: + ddl-auto: create + show-sql: true + properties: + hibernate: + format_sql: true + + sql: + init: + mode: never \ No newline at end of file