diff --git a/build.gradle b/build.gradle index 1c84189194..07ac546491 100644 --- a/build.gradle +++ b/build.gradle @@ -22,18 +22,24 @@ repositories { } dependencies { - //Text.io 설정 - implementation 'org.beryx:text-io:3.3.0' implementation 'org.springframework.boot:spring-boot-starter' compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' + //ParameterizedTest의존성 추가 + testImplementation 'org.junit.jupiter:junit-jupiter-params:5.8.1' //Logback 설정 implementation 'ch.qos.logback:logback-classic:1.2.6' implementation 'ch.qos.logback:logback-core:1.2.6' + + implementation 'org.springframework.boot:spring-boot-starter-jdbc' + runtimeOnly 'com.h2database:h2' + + testCompileOnly 'org.projectlombok:lombok:1.18.28' + testAnnotationProcessor 'org.projectlombok:lombok:1.18.28' } -tasks.named('test') { +test{ useJUnitPlatform() } \ No newline at end of file diff --git a/build/libs/springboot-basic-0.0.1-SNAPSHOT-plain.jar b/build/libs/springboot-basic-0.0.1-SNAPSHOT-plain.jar deleted file mode 100644 index 964804d3eb..0000000000 Binary files a/build/libs/springboot-basic-0.0.1-SNAPSHOT-plain.jar and /dev/null differ diff --git a/src/main/java/com/prgrms/springbootbasic/ConsoleApplication.java b/src/main/java/com/prgrms/springbootbasic/ConsoleApplication.java index a6dbcf9747..5d72260866 100644 --- a/src/main/java/com/prgrms/springbootbasic/ConsoleApplication.java +++ b/src/main/java/com/prgrms/springbootbasic/ConsoleApplication.java @@ -1,56 +1,43 @@ package com.prgrms.springbootbasic; -import com.prgrms.springbootbasic.controller.VoucherController; -import com.prgrms.springbootbasic.domain.Voucher; -import com.prgrms.springbootbasic.enums.Command; -import com.prgrms.springbootbasic.enums.VoucherType; +import com.prgrms.springbootbasic.enums.ConsoleMenu; import com.prgrms.springbootbasic.view.Console; -import java.util.Map; -import java.util.UUID; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.CommandLineRunner; +import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Component; +@Profile("!test") @Slf4j @Component @RequiredArgsConstructor public class ConsoleApplication implements CommandLineRunner { + private final ConsoleVoucher consoleVoucher; + private final ConsoleCustomer consoleCustomer; private final Console console; - private final VoucherController voucherController; @Override public void run(String... args) throws Exception { - console.consoleMenu(); - while (true) { - String command = console.inputCommand(); - Command inputCommand = Command.checkInputCommand(command); - - switch (inputCommand) { - case CREATE -> createVoucher(); - case LIST -> getVoucherList(); - case EXIT -> { - console.printMessage("프로그램을 종료합니다."); - return; + console.printConsoleMenu(); + try { + ConsoleMenu inputMenu = ConsoleMenu.of(console.inputCommand()); + + switch (inputMenu) { + case CUSTOMER -> consoleCustomer.menu(); + case VOUCHER -> consoleVoucher.menu(); + case EXIT -> { + console.printExitMessage(); + return; + } } + } catch (IllegalArgumentException e) { + log.error("명령어가 잘못 입력되었습니다.", e.getMessage()); + } catch (Exception e) { + log.error("프로그램에서 오류가 발생하였습니다.", e.getMessage()); } } } - - private void createVoucher() { - String voucherTypeInput = console.inputVoucherType(); - VoucherType voucherType = VoucherType.checkVoucherType(voucherTypeInput); - - long voucherDiscount = console.inputVoucherDiscount(); - - voucherController.createVoucher(voucherType, voucherDiscount); - console.printMessage("바우처가 생성되었습니다!"); - } - - private void getVoucherList() { - Map voucherMap = voucherController.printVoucherList(); - console.printlnVoucherList(voucherMap); - } } \ No newline at end of file diff --git a/src/main/java/com/prgrms/springbootbasic/ConsoleCustomer.java b/src/main/java/com/prgrms/springbootbasic/ConsoleCustomer.java new file mode 100644 index 0000000000..c393f805cf --- /dev/null +++ b/src/main/java/com/prgrms/springbootbasic/ConsoleCustomer.java @@ -0,0 +1,128 @@ +package com.prgrms.springbootbasic; + +import com.prgrms.springbootbasic.controller.customer.CustomerController; +import com.prgrms.springbootbasic.dto.customer.request.CustomerCreateRequest; +import com.prgrms.springbootbasic.dto.customer.request.CustomerUpdateRequest; +import com.prgrms.springbootbasic.dto.customer.response.CustomerListResponse; +import com.prgrms.springbootbasic.dto.customer.response.CustomerResponse; +import com.prgrms.springbootbasic.enums.customer.CustomerDeleteMenu; +import com.prgrms.springbootbasic.enums.customer.CustomerMenu; +import com.prgrms.springbootbasic.enums.customer.CustomerSelectMenu; +import com.prgrms.springbootbasic.view.Console; +import java.util.UUID; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Slf4j +@Component +@RequiredArgsConstructor +public class ConsoleCustomer { + + private final CustomerController customerController; + private final Console console; + + public void menu() { + console.printCustomerMenu(); + switch (CustomerMenu.of(console.inputCommand())) { + case CREATE -> createCustomer(); + case UPDATE -> updateCustomer(); + case SELECT -> selectCustomer(); + case DELETE -> deleteCustomer(); + } + } + + //생성(Create) + + private void createCustomer() { + console.printCustomerCreateMenu(); + + CustomerCreateRequest createRequest = console.inputCustomerCreateMessage(); + + customerController.create(createRequest); + console.printCompleteMessage(); + } + + //변경 + private void updateCustomer() { + console.printCustomerUpdateByID(); + UUID customerId = console.inputUUID(); + CustomerUpdateRequest updateRequest = console.inputCustomerUpdateMessage(customerId); + + customerController.update(updateRequest); + console.printCompleteMessage(); + } + + + private void selectCustomer() { + console.printCustomerSelectMenu(); + //선택 - Id, CreateAt, All + switch (CustomerSelectMenu.of(console.inputCommand())) { + case ID -> { + console.printCustomerSelectById(); + UUID customerId = console.inputUUID(); + + if (!customerController.checkCustomerId(customerId)) { + console.printErrorMessage("해당 ID를 가진 고객을 찾을 수 없습니다."); + } else { + CustomerResponse customerResponse = customerController.findById(customerId); + System.out.println("해당 고객의 ID: " + customerResponse.getCustomerId()); + System.out.println("해당 고객의 이름: " + customerResponse.getCustomerName()); + System.out.println("해당 고객의 이메일: " + customerResponse.getCustomerEmail()); + System.out.println("해당 고객의 생성일: " + customerResponse.getCreateAt()); + } + } + //생성일 순으로 조회 - 오류 + case CREATEDAT -> { + console.printCutomerSelectByCreatedAt(); + CustomerListResponse customerListResponse = customerController.findByCreateAt(); + if (!customerListResponse.getCustomerResponseList().isEmpty()) { + console.printCustomerSelectByCreatedAt(customerListResponse); + } else { + console.printErrorMessage("현재 저장된 고객이 존재하지 않습니다."); + } + } + //모든 리스트 조회 + case ALL -> { + CustomerListResponse customerListResponse = customerController.findAllList(); + if (!customerListResponse.getCustomerResponseList().isEmpty()) { + console.printCustomerSelectAll(customerListResponse); + } else { + console.printErrorMessage("현재 저장된 고객이 없습니다."); + } + } + default -> console.printErrorMessage("잘못된 Customer SelectMenu를 선택하셨습니다. 다시 확인해주세요."); + } + } + + + private void deleteCustomer() { + console.printCustomerDeleteMenu(); + //선택 - id, all + switch (CustomerDeleteMenu.of(console.inputCommand())) { + case ID -> { + console.printCustomerDeleteByID(); + UUID customerId = console.inputUUID(); + + if (!customerController.checkCustomerId(customerId)) { + console.printErrorMessage(customerId + "찾을 고객이 존재하지 않습니다."); + return; + } + if (customerController.deleteById(customerId) == 0) { + console.printErrorMessage(customerId + " 삭제하려는 고객이 저장되어있지 않아 삭제할 수 없습니다."); + return; + } + console.printCompleteMessage(); + } + case ALL -> { + console.printCustomerDeleteByAll(); + customerController.deleteAll(); + } + default -> { + IllegalStateException e = new IllegalStateException("프로그램 삭제 명령어 오류"); + log.error("프로그램 삭제 명령어 오류", e); + throw e; + } + } + } +} \ No newline at end of file diff --git a/src/main/java/com/prgrms/springbootbasic/ConsoleVoucher.java b/src/main/java/com/prgrms/springbootbasic/ConsoleVoucher.java new file mode 100644 index 0000000000..e2719abb26 --- /dev/null +++ b/src/main/java/com/prgrms/springbootbasic/ConsoleVoucher.java @@ -0,0 +1,148 @@ +package com.prgrms.springbootbasic; + +import com.prgrms.springbootbasic.controller.voucher.VoucherController; +import com.prgrms.springbootbasic.dto.voucher.request.VoucherCreateRequest; +import com.prgrms.springbootbasic.dto.voucher.request.VoucherUpdateRequest; +import com.prgrms.springbootbasic.dto.voucher.response.VoucherListResponse; +import com.prgrms.springbootbasic.dto.voucher.response.VoucherResponse; +import com.prgrms.springbootbasic.enums.voucher.VoucherDeleteMenu; +import com.prgrms.springbootbasic.enums.voucher.VoucherMenu; +import com.prgrms.springbootbasic.enums.voucher.VoucherSelectMenu; +import com.prgrms.springbootbasic.enums.voucher.VoucherType; +import com.prgrms.springbootbasic.view.Console; +import java.util.UUID; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Slf4j +@Component +@RequiredArgsConstructor +public class ConsoleVoucher { + + private final VoucherController voucherController; + private final Console console; + + public void menu() { + console.printVoucherMenu(); + + switch (VoucherMenu.of(console.inputCommand())) { + case CREATE -> createVoucher(); + case UPDATE -> updateVoucher(); + case SELECT -> selectVoucher(); + case DELETE -> deleteVoucher(); + } + } + + + //생성(Create) + private void createVoucher() { + console.printVoucherCreateTypeMenu(); + VoucherType type = VoucherType.of(console.inputCommand()); + + console.printVoucherCreateDiscountMenu(); + VoucherCreateRequest createRequest = console.inputVoucherCreateMessage(type); + + voucherController.create(createRequest); + console.printCompleteMessage(); + } + + //변경(Update) + private void updateVoucher() { + console.printVoucherUpdateMenu(); + console.printVoucherUpdateById(); + UUID voucherId = console.inputUUID(); + VoucherUpdateRequest updateRequest = console.inputVoucherUpdateMessage(voucherId); + + voucherController.update(updateRequest); + System.out.println("변경 후 금액 : " + updateRequest.getDiscount()); + console.printCompleteMessage(); + } + + + //읽기(Read) - 모든 바우처를 조회하려면 All,타입별로 조회를 하려면 Type, ID로 조회하려면 ID, 생성일별로 조회하려면 CreateAt을 입력 + private void selectVoucher() { + console.printVoucherSelectMenu(); + //선택 - Id, Type, CreateAt, All + switch (VoucherSelectMenu.of(console.inputCommand())) { + case ID -> { + console.printVoucherSelectById(); + UUID voucherId = console.inputUUID(); + + if (!voucherController.checkVoucherId(voucherId)) { + console.printErrorMessage("해당 ID를 가진 Voucher를 찾을 수 없습니다."); + } else { + VoucherResponse voucherResponse = voucherController.findById(voucherId); + System.out.println("해당 바우처의 ID: " + voucherResponse.getVoucherId()); + System.out.println("해당 바우처의 금액: " + voucherResponse.getDiscount()); + System.out.println("해당 바우처의 타입: " + voucherResponse.getType()); + System.out.println("해당 바우처의 생성일:" + voucherResponse.getCreateAt()); + } + } + //바우처 타입 + case TYPE -> { + console.printVoucherSelectByType(); + VoucherType voucherType = VoucherType.of(console.inputCommand()); + VoucherListResponse vouchersByType = voucherController.findByType(voucherType); + if (!vouchersByType.getVoucherResponseList().isEmpty()) { + console.printVoucherSelectByTypeList(vouchersByType); + } else { + console.printErrorMessage("해당 타입의 바우처가 존재하지 않습니다."); + } + } + //생성일 순으로 조회 + case CREATEDAT -> { + VoucherListResponse voucherListResponse = voucherController.findByCreatedAt(); + if (!voucherListResponse.getVoucherResponseList().isEmpty()) { + console.printVoucherSelectByCreateAt(voucherListResponse); + } else { + console.printErrorMessage("현재 저장된 바우처가 존재하지 않습니다."); + } + if (!voucherListResponse.getVoucherResponseList().isEmpty()) { + console.printVoucherSelectBYAll(voucherListResponse); + } else { + + } + + } + //모든 리스트 조회 + case ALL -> { + VoucherListResponse voucherListResponse = voucherController.findAllList(); + if (!voucherListResponse.getVoucherResponseList().isEmpty()) { + console.printVoucherSelectBYAll(voucherListResponse); + } else { + console.printErrorMessage("현재 저장된 바우처가 없습니다."); + } + } + default -> console.printErrorMessage("잘못된 voucherSelectMenu를 선택하셨습니다. 다시 확인해주세요."); + } + } + + //삭제(DELET)- id, all + private void deleteVoucher() { + console.printVoucherDeleteMenu(); + //선택 - id, all + switch (VoucherDeleteMenu.of(console.inputCommand())) { + case ID -> { + console.printVoucherDeleteById(); + UUID voucherId = console.inputUUID(); + + if (voucherController.deleteById(voucherId) == 0) { + console.printErrorMessage(voucherId + " 삭제하려는 바우처가 저장되어있지 않아 삭제할 수 없습니다."); + return; + } + console.printCompleteMessage(); + } + case ALL -> { + console.printVoucherDeleteAll(); + voucherController.deleteAll(); + console.printCompleteMessage(); + } + default -> { + IllegalStateException e = new IllegalStateException("프로그램 삭제 명령어 오류"); + log.error("프로그램 삭제 명령어 오류", e); + throw e; + } + } + } +} \ No newline at end of file diff --git a/src/main/java/com/prgrms/springbootbasic/controller/VoucherController.java b/src/main/java/com/prgrms/springbootbasic/controller/VoucherController.java deleted file mode 100644 index f8fdd10aba..0000000000 --- a/src/main/java/com/prgrms/springbootbasic/controller/VoucherController.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.prgrms.springbootbasic.controller; - -import com.prgrms.springbootbasic.domain.Voucher; -import com.prgrms.springbootbasic.enums.VoucherType; -import com.prgrms.springbootbasic.service.VoucherService; -import java.util.Map; -import java.util.UUID; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Controller; - -@Controller -@AllArgsConstructor -public class VoucherController { - - private final VoucherService voucherService; - - public void createVoucher(VoucherType type, long discount) { - voucherService.createVoucher(type, discount); - } - - public Map printVoucherList() { - return voucherService.fetchAllVouchers(); - } -} diff --git a/src/main/java/com/prgrms/springbootbasic/controller/customer/CustomerController.java b/src/main/java/com/prgrms/springbootbasic/controller/customer/CustomerController.java new file mode 100644 index 0000000000..6c338b8fcc --- /dev/null +++ b/src/main/java/com/prgrms/springbootbasic/controller/customer/CustomerController.java @@ -0,0 +1,58 @@ +package com.prgrms.springbootbasic.controller.customer; + +import com.prgrms.springbootbasic.dto.customer.request.CustomerCreateRequest; +import com.prgrms.springbootbasic.dto.customer.request.CustomerUpdateRequest; +import com.prgrms.springbootbasic.dto.customer.response.CustomerListResponse; +import com.prgrms.springbootbasic.dto.customer.response.CustomerResponse; +import com.prgrms.springbootbasic.service.customer.CustomerService; +import java.util.UUID; +import lombok.AllArgsConstructor; +import org.springframework.stereotype.Controller; + +@Controller +@AllArgsConstructor +public class CustomerController { + + private final CustomerService customerService; + + //(Create)고객 생성 + public CustomerResponse create(CustomerCreateRequest customerCreateRequest) { + return customerService.createCustomer(customerCreateRequest); + } + + //(Read) 고객의 모든 리스트 출력 + public CustomerListResponse findAllList() { + return customerService.findAllCustomers(); + } + + //(Read) - UUID를 통해서 검색 + public CustomerResponse findById(UUID customerId) { + return customerService.findById(customerId); + } + + + //(Read) 고객 생성기간 출력 + public CustomerListResponse findByCreateAt() { + return customerService.findByCreateAt(); + } + + + //(Update) 고객 수정 + public void update(CustomerUpdateRequest customerUpdateRequset) { + customerService.updateCustomer(customerUpdateRequset); + } + + //(Delete) 특정 고객을 찾아 삭제 + public int deleteById(UUID customerId) { + return customerService.deleteById(customerId); + } + + //(Delete) 모든 고객 내용 삭제 + public void deleteAll() { + customerService.deleteAllCustomer(); + } + + public boolean checkCustomerId(UUID voucherId) { + return customerService.existById(voucherId); + } +} \ No newline at end of file diff --git a/src/main/java/com/prgrms/springbootbasic/controller/voucher/VoucherController.java b/src/main/java/com/prgrms/springbootbasic/controller/voucher/VoucherController.java new file mode 100644 index 0000000000..17f320d58e --- /dev/null +++ b/src/main/java/com/prgrms/springbootbasic/controller/voucher/VoucherController.java @@ -0,0 +1,62 @@ +package com.prgrms.springbootbasic.controller.voucher; + +import com.prgrms.springbootbasic.dto.voucher.request.VoucherCreateRequest; +import com.prgrms.springbootbasic.dto.voucher.request.VoucherUpdateRequest; +import com.prgrms.springbootbasic.dto.voucher.response.VoucherListResponse; +import com.prgrms.springbootbasic.dto.voucher.response.VoucherResponse; +import com.prgrms.springbootbasic.enums.voucher.VoucherType; +import com.prgrms.springbootbasic.service.voucher.VoucherService; +import java.util.UUID; +import lombok.AllArgsConstructor; +import org.springframework.stereotype.Controller; + +@Controller +@AllArgsConstructor +public class VoucherController { + + private final VoucherService voucherService; + + //(Create)바우처 생성 + public VoucherResponse create(VoucherCreateRequest voucherCreateRequest) { + return voucherService.createVoucher(voucherCreateRequest); + } + + //(Read) 바우처의 모든 리스트 출력 + public VoucherListResponse findAllList() { + return voucherService.findAllVouchers(); + } + + //(Read) 특정 바우처 id의 내용을 출력 + public VoucherResponse findById(UUID voucherId) { + return voucherService.findById(voucherId); + } + + //(Read) 바우처 생성기간별 출력 + public VoucherListResponse findByCreatedAt() { + return voucherService.findByCreateAt(); + } + + //(Read) 바우처 타입별 리스트 출력 + public VoucherListResponse findByType(VoucherType type) { + return voucherService.findByType(type); + } + + //(Update) 생성된 바우처 수정 + public void update(VoucherUpdateRequest voucherUpdateRequest) { + voucherService.updateVoucher(voucherUpdateRequest); + } + + //(Delete) 특정 바우처를 찾아 삭제 + public int deleteById(UUID voucherId) { + return voucherService.deleteById(voucherId); + } + + //(Delete) 모든 바우처의 내용 삭제 + public void deleteAll() { + voucherService.deleteAllVoucher(); + } + + public boolean checkVoucherId(UUID voucherId) { + return voucherService.existById(voucherId); + } +} diff --git a/src/main/java/com/prgrms/springbootbasic/domain/FixedDiscountVoucher.java b/src/main/java/com/prgrms/springbootbasic/domain/FixedDiscountVoucher.java deleted file mode 100644 index 32a18db515..0000000000 --- a/src/main/java/com/prgrms/springbootbasic/domain/FixedDiscountVoucher.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.prgrms.springbootbasic.domain; - -import com.prgrms.springbootbasic.enums.VoucherType; -import java.util.UUID; -import lombok.Getter; - -@Getter -public class FixedDiscountVoucher implements Voucher { - - private final UUID voucherId; - private final long discount; - - public FixedDiscountVoucher(long discount) { - this.voucherId = UUID.randomUUID(); - this.discount = discount; - } - - @Override - public VoucherType getVoucherType() { - return VoucherType.FIXED; - } -} diff --git a/src/main/java/com/prgrms/springbootbasic/domain/PercentDiscountVoucher.java b/src/main/java/com/prgrms/springbootbasic/domain/PercentDiscountVoucher.java deleted file mode 100644 index 79f0da996b..0000000000 --- a/src/main/java/com/prgrms/springbootbasic/domain/PercentDiscountVoucher.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.prgrms.springbootbasic.domain; - -import com.prgrms.springbootbasic.enums.VoucherType; -import java.util.UUID; -import lombok.Getter; - -@Getter -public class PercentDiscountVoucher implements Voucher { - - private final UUID voucherId; - private final long discount; - - public PercentDiscountVoucher(long discount) { - this.voucherId = UUID.randomUUID(); - this.discount = discount; - } - - @Override - public VoucherType getVoucherType() { - return VoucherType.PERCENT; - } -} diff --git a/src/main/java/com/prgrms/springbootbasic/domain/Voucher.java b/src/main/java/com/prgrms/springbootbasic/domain/Voucher.java deleted file mode 100644 index c88e35ecd4..0000000000 --- a/src/main/java/com/prgrms/springbootbasic/domain/Voucher.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.prgrms.springbootbasic.domain; - -import com.prgrms.springbootbasic.enums.VoucherType; -import java.util.UUID; - -public interface Voucher { - - UUID getVoucherId(); - - long getDiscount(); - - VoucherType getVoucherType(); -} diff --git a/src/main/java/com/prgrms/springbootbasic/domain/customer/Customer.java b/src/main/java/com/prgrms/springbootbasic/domain/customer/Customer.java new file mode 100644 index 0000000000..e6d7d65898 --- /dev/null +++ b/src/main/java/com/prgrms/springbootbasic/domain/customer/Customer.java @@ -0,0 +1,47 @@ +package com.prgrms.springbootbasic.domain.customer; + +import java.time.LocalDateTime; +import java.util.UUID; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class Customer { + + private static final Pattern ENGLISH_PATTERN = Pattern.compile("^[a-zA-Z]*$"); + private static final Pattern EMAIL_PATTERN = Pattern.compile("^[_a-zA-Z0-9-\\.]+@[\\.a-zA-Z0-9-]+\\.[a-zA-Z]+$"); + + private final UUID customerId; + private String name; + private String email; + private final LocalDateTime createAt; + + public Customer(UUID customerId, String name, String email, LocalDateTime createAt) { + this.customerId = customerId; + this.name = validateName(name); + this.email = validateEmail(email); + this.createAt = createAt; + } + + public String validateName(String name) { + Matcher match = ENGLISH_PATTERN.matcher(name); + + if (!match.matches()) { + throw new IllegalArgumentException("영어 입력이 아니여서 에러가 납니다.!"); + } + return name; + } + + public String validateEmail(String email) { + Matcher match = EMAIL_PATTERN.matcher(email); + + if (!match.matches()) { + throw new IllegalArgumentException("이메일 형식이 아니여서 에러가 납니다.!"); + } + return email; + } +} + diff --git a/src/main/java/com/prgrms/springbootbasic/domain/voucher/FixedVoucher.java b/src/main/java/com/prgrms/springbootbasic/domain/voucher/FixedVoucher.java new file mode 100644 index 0000000000..1ad299ac74 --- /dev/null +++ b/src/main/java/com/prgrms/springbootbasic/domain/voucher/FixedVoucher.java @@ -0,0 +1,59 @@ +package com.prgrms.springbootbasic.domain.voucher; + +import com.prgrms.springbootbasic.enums.voucher.VoucherType; +import java.time.LocalDateTime; +import java.util.UUID; +import lombok.Setter; + +@Setter + +public class FixedVoucher implements Voucher { + + private final UUID voucherId; + private long discount; + private final LocalDateTime createAt; + private final VoucherType type; + + public FixedVoucher(long discount) { + this.voucherId = UUID.randomUUID(); + this.discount = ValidDiscount(discount); + this.createAt = LocalDateTime.now(); + this.type = getVoucherType(); + } + + public FixedVoucher(UUID voucherId, long discount, LocalDateTime createdAt) { + this.voucherId = voucherId; + this.discount = discount; + this.createAt = createdAt; + this.type = getVoucherType(); + } + + + public long ValidDiscount(long discount) { + + if (discount <= 0) { + throw new IllegalArgumentException("고정 할인 바우처의 입력 금액은 0 이하를 입력할 수 없습니다."); + } + return discount; + } + + @Override + public UUID getVoucherId() { + return voucherId; + } + + @Override + public long getDiscount() { + return discount; + } + + @Override + public VoucherType getVoucherType() { + return VoucherType.FIXED; + } + + @Override + public LocalDateTime getCreatedAt() { + return createAt; + } +} diff --git a/src/main/java/com/prgrms/springbootbasic/domain/voucher/RateVoucher.java b/src/main/java/com/prgrms/springbootbasic/domain/voucher/RateVoucher.java new file mode 100644 index 0000000000..b889dc6752 --- /dev/null +++ b/src/main/java/com/prgrms/springbootbasic/domain/voucher/RateVoucher.java @@ -0,0 +1,57 @@ +package com.prgrms.springbootbasic.domain.voucher; + +import com.prgrms.springbootbasic.enums.voucher.VoucherType; +import java.time.LocalDateTime; +import java.util.UUID; +import lombok.Setter; + +@Setter +public class RateVoucher implements Voucher { + + private final UUID voucherId; + private long discount; + private final LocalDateTime createAt; + private final VoucherType type; + + public RateVoucher(long discount) { + this.voucherId = UUID.randomUUID(); + this.discount = ValidDiscount(discount); + this.createAt = LocalDateTime.now(); + this.type = getVoucherType(); + } + + public RateVoucher(UUID voucherId, long discount, LocalDateTime createdAt) { + this.voucherId = voucherId; + this.discount = discount; + this.createAt = createdAt; + this.type = getVoucherType(); + } + + public long ValidDiscount(long discount) { + if (discount < 1 || discount > 99) { + throw new IllegalArgumentException("퍼센트 할인 바우처의 할인 퍼센트는 1 ~ 99까지의 숫자를 입력해야 합니다."); + + } + return discount; + } + + @Override + public UUID getVoucherId() { + return voucherId; + } + + @Override + public long getDiscount() { + return discount; + } + + @Override + public VoucherType getVoucherType() { + return VoucherType.RATE; + } + + @Override + public LocalDateTime getCreatedAt() { + return createAt; + } +} diff --git a/src/main/java/com/prgrms/springbootbasic/domain/voucher/Voucher.java b/src/main/java/com/prgrms/springbootbasic/domain/voucher/Voucher.java new file mode 100644 index 0000000000..46362d536b --- /dev/null +++ b/src/main/java/com/prgrms/springbootbasic/domain/voucher/Voucher.java @@ -0,0 +1,16 @@ +package com.prgrms.springbootbasic.domain.voucher; + +import com.prgrms.springbootbasic.enums.voucher.VoucherType; +import java.time.LocalDateTime; +import java.util.UUID; + +public interface Voucher { + + UUID getVoucherId(); + + long getDiscount(); + + VoucherType getVoucherType(); + + LocalDateTime getCreatedAt(); +} diff --git a/src/main/java/com/prgrms/springbootbasic/dto/customer/request/CustomerCreateRequest.java b/src/main/java/com/prgrms/springbootbasic/dto/customer/request/CustomerCreateRequest.java new file mode 100644 index 0000000000..d109039a58 --- /dev/null +++ b/src/main/java/com/prgrms/springbootbasic/dto/customer/request/CustomerCreateRequest.java @@ -0,0 +1,14 @@ +package com.prgrms.springbootbasic.dto.customer.request; + +import java.time.LocalDateTime; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public class CustomerCreateRequest { + + private String name; + private String email; + private LocalDateTime createAt; +} diff --git a/src/main/java/com/prgrms/springbootbasic/dto/customer/request/CustomerUpdateRequest.java b/src/main/java/com/prgrms/springbootbasic/dto/customer/request/CustomerUpdateRequest.java new file mode 100644 index 0000000000..616c2bc6c7 --- /dev/null +++ b/src/main/java/com/prgrms/springbootbasic/dto/customer/request/CustomerUpdateRequest.java @@ -0,0 +1,14 @@ +package com.prgrms.springbootbasic.dto.customer.request; + +import java.util.UUID; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public class CustomerUpdateRequest { + + private UUID customerId; + private String customerName; + private String customerEmail; +} diff --git a/src/main/java/com/prgrms/springbootbasic/dto/customer/response/CustomerListResponse.java b/src/main/java/com/prgrms/springbootbasic/dto/customer/response/CustomerListResponse.java new file mode 100644 index 0000000000..14bd6fde32 --- /dev/null +++ b/src/main/java/com/prgrms/springbootbasic/dto/customer/response/CustomerListResponse.java @@ -0,0 +1,12 @@ +package com.prgrms.springbootbasic.dto.customer.response; + +import java.util.List; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public class CustomerListResponse { + + private final List customerResponseList; +} diff --git a/src/main/java/com/prgrms/springbootbasic/dto/customer/response/CustomerResponse.java b/src/main/java/com/prgrms/springbootbasic/dto/customer/response/CustomerResponse.java new file mode 100644 index 0000000000..60e9ad97d9 --- /dev/null +++ b/src/main/java/com/prgrms/springbootbasic/dto/customer/response/CustomerResponse.java @@ -0,0 +1,16 @@ +package com.prgrms.springbootbasic.dto.customer.response; + +import java.time.LocalDateTime; +import java.util.UUID; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public class CustomerResponse { + + private UUID customerId; + private String customerName; + private String customerEmail; + private LocalDateTime createAt; +} diff --git a/src/main/java/com/prgrms/springbootbasic/dto/voucher/request/VoucherCreateRequest.java b/src/main/java/com/prgrms/springbootbasic/dto/voucher/request/VoucherCreateRequest.java new file mode 100644 index 0000000000..a4e21b1344 --- /dev/null +++ b/src/main/java/com/prgrms/springbootbasic/dto/voucher/request/VoucherCreateRequest.java @@ -0,0 +1,15 @@ +package com.prgrms.springbootbasic.dto.voucher.request; + +import com.prgrms.springbootbasic.enums.voucher.VoucherType; +import java.time.LocalDateTime; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public class VoucherCreateRequest { + + private long discount; + private VoucherType type; + private LocalDateTime createAt; +} \ No newline at end of file diff --git a/src/main/java/com/prgrms/springbootbasic/dto/voucher/request/VoucherUpdateRequest.java b/src/main/java/com/prgrms/springbootbasic/dto/voucher/request/VoucherUpdateRequest.java new file mode 100644 index 0000000000..5eb0d1435e --- /dev/null +++ b/src/main/java/com/prgrms/springbootbasic/dto/voucher/request/VoucherUpdateRequest.java @@ -0,0 +1,13 @@ +package com.prgrms.springbootbasic.dto.voucher.request; + +import java.util.UUID; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public class VoucherUpdateRequest { + + private UUID voucherId; + private long discount; +} \ No newline at end of file diff --git a/src/main/java/com/prgrms/springbootbasic/dto/voucher/response/VoucherListResponse.java b/src/main/java/com/prgrms/springbootbasic/dto/voucher/response/VoucherListResponse.java new file mode 100644 index 0000000000..0bc6f9c320 --- /dev/null +++ b/src/main/java/com/prgrms/springbootbasic/dto/voucher/response/VoucherListResponse.java @@ -0,0 +1,12 @@ +package com.prgrms.springbootbasic.dto.voucher.response; + +import java.util.List; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@RequiredArgsConstructor +public class VoucherListResponse { + + private final List voucherResponseList; +} diff --git a/src/main/java/com/prgrms/springbootbasic/dto/voucher/response/VoucherResponse.java b/src/main/java/com/prgrms/springbootbasic/dto/voucher/response/VoucherResponse.java new file mode 100644 index 0000000000..1c22d83e81 --- /dev/null +++ b/src/main/java/com/prgrms/springbootbasic/dto/voucher/response/VoucherResponse.java @@ -0,0 +1,17 @@ +package com.prgrms.springbootbasic.dto.voucher.response; + +import com.prgrms.springbootbasic.enums.voucher.VoucherType; +import java.time.LocalDateTime; +import java.util.UUID; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public class VoucherResponse { + + private final UUID voucherId; + private long discount; + private final VoucherType type; + private final LocalDateTime createAt; +} \ No newline at end of file diff --git a/src/main/java/com/prgrms/springbootbasic/enums/Command.java b/src/main/java/com/prgrms/springbootbasic/enums/Command.java deleted file mode 100644 index 6d8874912c..0000000000 --- a/src/main/java/com/prgrms/springbootbasic/enums/Command.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.prgrms.springbootbasic.enums; - -public enum Command { - EXIT, - CREATE, - LIST; - - public static Command of(String inputCommand) { - try { - return Command.valueOf(inputCommand.toUpperCase()); - } catch (IllegalArgumentException e) { - throw new IllegalArgumentException("잘못된 명령어 입력입니다. 다시 입력해주세요. " + inputCommand); - } - } -} \ No newline at end of file diff --git a/src/main/java/com/prgrms/springbootbasic/enums/ConsoleMenu.java b/src/main/java/com/prgrms/springbootbasic/enums/ConsoleMenu.java new file mode 100644 index 0000000000..08747b12f9 --- /dev/null +++ b/src/main/java/com/prgrms/springbootbasic/enums/ConsoleMenu.java @@ -0,0 +1,15 @@ +package com.prgrms.springbootbasic.enums; + +public enum ConsoleMenu { + CUSTOMER, + VOUCHER, + EXIT; + + public static ConsoleMenu of(String consoleMenu) { + try { + return ConsoleMenu.valueOf(consoleMenu.toUpperCase()); + } catch (IllegalArgumentException e) { + throw new IllegalArgumentException("잘못된 명령어를 입력하셨습니다! 실행하고자 하는 프로그램의 메뉴를 확인 해주세요!"); + } + } +} diff --git a/src/main/java/com/prgrms/springbootbasic/enums/customer/CustomerDeleteMenu.java b/src/main/java/com/prgrms/springbootbasic/enums/customer/CustomerDeleteMenu.java new file mode 100644 index 0000000000..190a4815fe --- /dev/null +++ b/src/main/java/com/prgrms/springbootbasic/enums/customer/CustomerDeleteMenu.java @@ -0,0 +1,14 @@ +package com.prgrms.springbootbasic.enums.customer; + +public enum CustomerDeleteMenu { + ID, + ALL; + + public static CustomerDeleteMenu of(String deleteMenu) { + try { + return valueOf(deleteMenu.toUpperCase()); + } catch (IllegalArgumentException e) { + throw new IllegalArgumentException("잘못된 명령어를 입력하셨습니다! 삭제하고자 하는 고객 프로그램의 명령어를 다시 확인 해주세요!"); + } + } +} diff --git a/src/main/java/com/prgrms/springbootbasic/enums/customer/CustomerMenu.java b/src/main/java/com/prgrms/springbootbasic/enums/customer/CustomerMenu.java new file mode 100644 index 0000000000..ff1e2f4999 --- /dev/null +++ b/src/main/java/com/prgrms/springbootbasic/enums/customer/CustomerMenu.java @@ -0,0 +1,17 @@ +package com.prgrms.springbootbasic.enums.customer; + +public enum CustomerMenu { + CREATE, + UPDATE, + DELETE, + SELECT; + + public static CustomerMenu of(String menu) { + try { + return valueOf(menu.toUpperCase()); + } catch (IllegalArgumentException e) { + throw new IllegalArgumentException("잘못된 명령어를 입력하셨습니다! 실행하고자 하는 고객 프로그램의 메뉴를 다시 확인해주세요!"); + } + } + +} diff --git a/src/main/java/com/prgrms/springbootbasic/enums/customer/CustomerSelectMenu.java b/src/main/java/com/prgrms/springbootbasic/enums/customer/CustomerSelectMenu.java new file mode 100644 index 0000000000..54479fbd5a --- /dev/null +++ b/src/main/java/com/prgrms/springbootbasic/enums/customer/CustomerSelectMenu.java @@ -0,0 +1,15 @@ +package com.prgrms.springbootbasic.enums.customer; + +public enum CustomerSelectMenu { + ID, + CREATEDAT, + ALL; + + public static CustomerSelectMenu of(String readMenu) { + try { + return valueOf(readMenu.toUpperCase()); + } catch (IllegalArgumentException e) { + throw new IllegalArgumentException("잘못된 명령어를 입력하셨습니다! 실행하고자 하는 고객 프로그램의 명령어를 다시 확인 해주세요!"); + } + } +} diff --git a/src/main/java/com/prgrms/springbootbasic/enums/voucher/VoucherDeleteMenu.java b/src/main/java/com/prgrms/springbootbasic/enums/voucher/VoucherDeleteMenu.java new file mode 100644 index 0000000000..971d015180 --- /dev/null +++ b/src/main/java/com/prgrms/springbootbasic/enums/voucher/VoucherDeleteMenu.java @@ -0,0 +1,14 @@ +package com.prgrms.springbootbasic.enums.voucher; + +public enum VoucherDeleteMenu { + ID, + ALL; + + public static VoucherDeleteMenu of(String deleteMenu) { + try { + return valueOf(deleteMenu.toUpperCase()); + } catch (IllegalArgumentException e) { + throw new IllegalArgumentException("잘못된 명령어를 입력하셨습니다! 삭제하고자 하는 바우처 프로그램의 명령어를 다시 확인 해주세요!"); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/prgrms/springbootbasic/enums/voucher/VoucherMenu.java b/src/main/java/com/prgrms/springbootbasic/enums/voucher/VoucherMenu.java new file mode 100644 index 0000000000..8998375b88 --- /dev/null +++ b/src/main/java/com/prgrms/springbootbasic/enums/voucher/VoucherMenu.java @@ -0,0 +1,16 @@ +package com.prgrms.springbootbasic.enums.voucher; + +public enum VoucherMenu { + CREATE, + UPDATE, + DELETE, + SELECT; + + public static VoucherMenu of(String menu) { + try { + return valueOf(menu.toUpperCase()); + } catch (IllegalArgumentException e) { + throw new IllegalArgumentException("잘못된 명령어를 입력하셨습니다! 실행하고자 하는 바우처 프로그램의 메뉴를 다시 확인해주세요!"); + } + } +} diff --git a/src/main/java/com/prgrms/springbootbasic/enums/voucher/VoucherSelectMenu.java b/src/main/java/com/prgrms/springbootbasic/enums/voucher/VoucherSelectMenu.java new file mode 100644 index 0000000000..193c27e1ba --- /dev/null +++ b/src/main/java/com/prgrms/springbootbasic/enums/voucher/VoucherSelectMenu.java @@ -0,0 +1,17 @@ +package com.prgrms.springbootbasic.enums.voucher; + +//모든 바우처를 조회하려면 All,타입별로 조회를 하려면 Type, ID로 조회하려면 ID, 생성일로 조회하려면 CreateAt을 입력해주세요 +public enum VoucherSelectMenu { + ID, + TYPE, + CREATEDAT, + ALL; + + public static VoucherSelectMenu of(String readMenu) { + try { + return valueOf(readMenu.toUpperCase()); + } catch (IllegalArgumentException e) { + throw new IllegalArgumentException("잘못된 명령어를 입력하셨습니다! 실행하고자 하는 바우처 프로그램의 명령어를 다시 확인 해주세요!"); + } + } +} diff --git a/src/main/java/com/prgrms/springbootbasic/enums/VoucherType.java b/src/main/java/com/prgrms/springbootbasic/enums/voucher/VoucherType.java similarity index 58% rename from src/main/java/com/prgrms/springbootbasic/enums/VoucherType.java rename to src/main/java/com/prgrms/springbootbasic/enums/voucher/VoucherType.java index 135082a87c..292138b7ed 100644 --- a/src/main/java/com/prgrms/springbootbasic/enums/VoucherType.java +++ b/src/main/java/com/prgrms/springbootbasic/enums/voucher/VoucherType.java @@ -1,15 +1,14 @@ -package com.prgrms.springbootbasic.enums; +package com.prgrms.springbootbasic.enums.voucher; public enum VoucherType { FIXED, - PERCENT; - + RATE; public static VoucherType of(String voucherType) { try { return VoucherType.valueOf(voucherType.toUpperCase()); } catch (IllegalArgumentException e) { - throw new IllegalArgumentException("잘못된 바우처 타입입니다." + voucherType); + throw new IllegalArgumentException("잘못된 바우처 타입을 입력하셨습니다. 고정 할인 바우처(Fixed) 또는 비율 할인 바우처(Rate)를 선택해서 다시 입력해주세요!"); } } -} +} \ No newline at end of file diff --git a/src/main/java/com/prgrms/springbootbasic/repository/MemoryVoucherRepository.java b/src/main/java/com/prgrms/springbootbasic/repository/MemoryVoucherRepository.java deleted file mode 100644 index c43e9bb1eb..0000000000 --- a/src/main/java/com/prgrms/springbootbasic/repository/MemoryVoucherRepository.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.prgrms.springbootbasic.repository; - -import com.prgrms.springbootbasic.domain.Voucher; -import java.util.Collections; -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.UUID; -import org.springframework.stereotype.Repository; - -@Repository -public class MemoryVoucherRepository implements VoucherRepository { - - private final Map storage = new LinkedHashMap<>(); - - @Override - public Voucher insert(Voucher voucher) { - storage.put(voucher.getVoucherId(), voucher); - return voucher; - } - - @Override - public Map getAllVouchersList() { - return Collections.unmodifiableMap(storage); - } -} diff --git a/src/main/java/com/prgrms/springbootbasic/repository/VoucherRepository.java b/src/main/java/com/prgrms/springbootbasic/repository/VoucherRepository.java deleted file mode 100644 index 2a3b2f9589..0000000000 --- a/src/main/java/com/prgrms/springbootbasic/repository/VoucherRepository.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.prgrms.springbootbasic.repository; - -import com.prgrms.springbootbasic.domain.Voucher; -import java.util.Map; -import java.util.UUID; - -public interface VoucherRepository { - Voucher insert(Voucher voucher); - Map getAllVouchersList(); -} diff --git a/src/main/java/com/prgrms/springbootbasic/repository/customer/CustomerJdbcRepository.java b/src/main/java/com/prgrms/springbootbasic/repository/customer/CustomerJdbcRepository.java new file mode 100644 index 0000000000..1a86d6f92b --- /dev/null +++ b/src/main/java/com/prgrms/springbootbasic/repository/customer/CustomerJdbcRepository.java @@ -0,0 +1,126 @@ +package com.prgrms.springbootbasic.repository.customer; + +import com.prgrms.springbootbasic.domain.customer.Customer; +import java.time.LocalDateTime; +import java.util.List; +import java.util.Optional; +import java.util.UUID; +import javax.sql.DataSource; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Primary; +import org.springframework.dao.EmptyResultDataAccessException; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; +import org.springframework.jdbc.core.namedparam.SqlParameterSource; +import org.springframework.stereotype.Repository; + +@Repository +@Slf4j +@Primary +public class CustomerJdbcRepository implements CustomerRepository { + + private final NamedParameterJdbcTemplate template; + + public CustomerJdbcRepository(DataSource dataSource) { + this.template = new NamedParameterJdbcTemplate(dataSource); + } + + @Override + public Customer save(Customer customer) { + String sql = "insert into customers values(:customerId, :customerName, :customerEmail, :customerCreateAt)"; + + SqlParameterSource param = new MapSqlParameterSource() + .addValue("customerId", customer.getCustomerId().toString()) + .addValue("customerName", customer.getName()) + .addValue("customerEmail", customer.getEmail()) + .addValue("customerCreateAt", customer.getCreateAt()); + + template.update(sql, param); + return customer; + } + + @Override + public Optional findById(UUID customerId) { + String sql = "select * from customers where customer_id = :customerId"; + + SqlParameterSource param = new MapSqlParameterSource() + .addValue("customerId", customerId.toString()); + + Customer customer = template.queryForObject(sql, param, customerRowMapper()); + return Optional.ofNullable(customer); + } + + @Override + public List findAll() { + String sql = "select * from customers"; + + List customers = template.query(sql, customerRowMapper()); + return customers; + } + + @Override + public List findByCreatedAt() { + String sql = "select * from customers ORDER BY customer_createAt ASC"; + + List customers = template.query(sql, customerRowMapper()); + return customers; + } + + @Override + public void update(Customer customer) { + String sql = "update customers set customer_Name = :customerName, customer_Email = :customerEmail where customer_id = :customerId"; + + SqlParameterSource param = new MapSqlParameterSource() + .addValue("customerId", customer.getCustomerId().toString()) + .addValue("customerName", customer.getName()) + .addValue("customerEmail", customer.getEmail()); + template.update(sql, param); + } + + + @Override + public boolean checkCustomerId(UUID customerId) { + String sql = "select * from customers where customer_id = :customerId"; + + SqlParameterSource param = new MapSqlParameterSource() + .addValue("customerId", customerId.toString()); + try { + template.queryForObject(sql, param, customerRowMapper()); + return true; + } catch (EmptyResultDataAccessException e) { + log.warn("고객의 ID가 존재하는지 체크했으나 없어서 예외 발생함", e.getMessage()); + return false; + } + } + + @Override + public int deleteById(UUID customerId) { + String sql = "delete from customers where customer_id = :customerId"; + SqlParameterSource param = new MapSqlParameterSource() + .addValue("customerId", customerId.toString()); + return template.update(sql, param); + } + + + @Override + public void deleteAll() { + String sql = "delete from customers"; + + SqlParameterSource param = new MapSqlParameterSource(); + + template.update(sql, param); + } + + + private RowMapper customerRowMapper() { + return (resultSet, rowMap) -> { + UUID customerId = UUID.fromString(resultSet.getString("customer_id")); + String name = resultSet.getString("customer_name"); + String email = resultSet.getString("customer_email"); + LocalDateTime createAt = resultSet.getTimestamp("customer_createAt").toLocalDateTime(); + + return new Customer(customerId, name, email, createAt); + }; + } +} diff --git a/src/main/java/com/prgrms/springbootbasic/repository/customer/CustomerRepository.java b/src/main/java/com/prgrms/springbootbasic/repository/customer/CustomerRepository.java new file mode 100644 index 0000000000..da51e0c968 --- /dev/null +++ b/src/main/java/com/prgrms/springbootbasic/repository/customer/CustomerRepository.java @@ -0,0 +1,35 @@ +package com.prgrms.springbootbasic.repository.customer; + +import com.prgrms.springbootbasic.domain.customer.Customer; +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +public interface CustomerRepository { + + //생성(create) + Customer save(Customer customer); + + //read-id + Optional findById(UUID customerId); + + //read-create at + public List findByCreatedAt(); + + + //조회(Read) - all + List findAll(); + + //업데이트(update) + void update(Customer customer); + + //delete-id + int deleteById(UUID customerId); + + + //customer 모두 삭제(Delete) + void deleteAll(); + + boolean checkCustomerId(UUID customerId); + +} diff --git a/src/main/java/com/prgrms/springbootbasic/repository/voucher/MemoryVoucherRepository.java b/src/main/java/com/prgrms/springbootbasic/repository/voucher/MemoryVoucherRepository.java new file mode 100644 index 0000000000..8e01b6aee2 --- /dev/null +++ b/src/main/java/com/prgrms/springbootbasic/repository/voucher/MemoryVoucherRepository.java @@ -0,0 +1,80 @@ +package com.prgrms.springbootbasic.repository.voucher; + +import com.prgrms.springbootbasic.domain.voucher.Voucher; +import com.prgrms.springbootbasic.enums.voucher.VoucherType; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Repository; + +@Repository +@Slf4j +public class MemoryVoucherRepository implements VoucherRepository { + + private final Map storage = new ConcurrentHashMap<>(); + + @Override + public Voucher save(Voucher voucher) { + storage.put(voucher.getVoucherId(), voucher); + return voucher; + } + + @Override + public Optional findById(UUID voucherId) { + Voucher voucher = storage.get(voucherId); + return Optional.ofNullable(voucher); + } + + @Override + public List findByCreatedAt() { + return new ArrayList<>(storage.values()); + } + + + @Override + public List findByType(VoucherType type) { + return storage.values().stream() + .filter(voucher -> voucher.getVoucherType().equals(type)) + .collect(Collectors.toList()); + } + + @Override + public List findAll() { + return new ArrayList<>(storage.values()); + } + + @Override + public void update(Voucher voucher) { + UUID voucherId = voucher.getVoucherId(); + if (storage.containsKey(voucherId)) { + storage.put(voucherId, voucher); + } else { + log.error("업테이트 시 오류가 발생했습니다."); + } + } + + @Override + public int deleteById(UUID voucherId) { + try { + storage.remove(voucherId); + return 1; + } catch (NullPointerException e) { + return 0; + } + } + + @Override + public void deleteAll() { + storage.clear(); + } + + @Override + public boolean checkVoucherId(UUID voucherId) { + return false; + } +} diff --git a/src/main/java/com/prgrms/springbootbasic/repository/voucher/VoucherJdbcRepository.java b/src/main/java/com/prgrms/springbootbasic/repository/voucher/VoucherJdbcRepository.java new file mode 100644 index 0000000000..51bcaf66c2 --- /dev/null +++ b/src/main/java/com/prgrms/springbootbasic/repository/voucher/VoucherJdbcRepository.java @@ -0,0 +1,161 @@ +package com.prgrms.springbootbasic.repository.voucher; + +import com.prgrms.springbootbasic.domain.voucher.Voucher; +import com.prgrms.springbootbasic.enums.voucher.VoucherType; +import java.time.LocalDateTime; +import java.util.List; +import java.util.Optional; +import java.util.UUID; +import javax.sql.DataSource; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Primary; +import org.springframework.dao.EmptyResultDataAccessException; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; +import org.springframework.jdbc.core.namedparam.SqlParameterSource; +import org.springframework.stereotype.Repository; + + +@Repository +@Slf4j +@Primary +public class VoucherJdbcRepository implements VoucherRepository { + + private final NamedParameterJdbcTemplate template; + + public VoucherJdbcRepository(DataSource dataSource) { + this.template = new NamedParameterJdbcTemplate(dataSource); + } + + @Override + public Voucher save(Voucher voucher) { + String sql = "insert into vouchers values(:voucherId, :discount, :voucherType, :voucherCreatedAt)"; + + SqlParameterSource param = new MapSqlParameterSource() + .addValue("voucherId", voucher.getVoucherId().toString()) + .addValue("discount", voucher.getDiscount()) + .addValue("voucherType", voucher.getVoucherType().toString()) + .addValue("voucherCreatedAt", voucher.getCreatedAt()); + + template.update(sql, param); + return voucher; + } + + @Override + public Optional findById(UUID voucherId) { + String sql = "select * from vouchers where voucher_id = :voucherId"; + + SqlParameterSource param = new MapSqlParameterSource() + .addValue("voucherId", voucherId.toString()); + + Voucher voucher; + try { + voucher = template.queryForObject(sql, param, voucherRowMapper()); + return Optional.of(voucher); + } catch (EmptyResultDataAccessException ex) { + return Optional.empty(); + } + } + + @Override + public List findByCreatedAt() { + String sql = "select * from vouchers ORDER BY voucher_createdAt ASC"; + + List vouchers = template.query(sql, voucherRowMapper()); + return vouchers; + } + + @Override + public List findByType(VoucherType type) { + String sql = "select * from vouchers where voucher_type = :voucherType"; + + SqlParameterSource param = new MapSqlParameterSource() + .addValue("voucherType", type.toString()); + + List vouchers = template.query(sql, param, voucherRowMapper()); + return vouchers; + } + + @Override + public List findAll() { + String sql = "select * from vouchers"; + + List vouchers = template.query(sql, voucherRowMapper()); + return vouchers; + } + + @Override + public void update(Voucher voucher) { + String sql = "update vouchers set discount = :discount where voucher_id = :voucherId"; + + SqlParameterSource paramMap = new MapSqlParameterSource() + .addValue("voucherId", voucher.getVoucherId().toString()) + .addValue("discount", voucher.getDiscount()); + + template.update(sql, paramMap); + } + + @Override + public int deleteById(UUID voucherId) { + String sql = "delete from vouchers where voucher_id = :voucherId"; + SqlParameterSource param = new MapSqlParameterSource() + .addValue("voucherId", voucherId.toString()); + return template.update(sql, param); + } + + @Override + public void deleteAll() { + String sql = "delete from vouchers"; + + SqlParameterSource param = new MapSqlParameterSource(); + + template.update(sql, param); + } + + @Override + public boolean checkVoucherId(UUID voucherId) { + String sql = "select * from vouchers where voucher_id = :voucherId"; + + SqlParameterSource param = new MapSqlParameterSource() + .addValue("voucherId", voucherId.toString()); + try { + template.queryForObject(sql, param, voucherRowMapper()); + return true; + } catch (EmptyResultDataAccessException e) { + log.error("바우처 ID가 없어서 예외 발생", e.getMessage()); + return false; + } + } + + private RowMapper voucherRowMapper() { + return (resultSet, rowMap) -> { + UUID voucherId = UUID.fromString(resultSet.getString("voucher_id")); + long discount = Long.parseLong(resultSet.getString("discount")); + VoucherType voucherType = VoucherType.valueOf(resultSet.getString("voucher_type").toUpperCase()); + LocalDateTime createdAt = resultSet.getTimestamp("voucher_createdAt").toLocalDateTime(); + + return new Voucher() { + @Override + public UUID getVoucherId() { + return voucherId; + } + + @Override + public long getDiscount() { + return discount; + } + + @Override + public VoucherType getVoucherType() { + return voucherType; + } + + @Override + public LocalDateTime getCreatedAt() { + return createdAt; + } + }; + }; + } +} diff --git a/src/main/java/com/prgrms/springbootbasic/repository/voucher/VoucherRepository.java b/src/main/java/com/prgrms/springbootbasic/repository/voucher/VoucherRepository.java new file mode 100644 index 0000000000..9eb115e647 --- /dev/null +++ b/src/main/java/com/prgrms/springbootbasic/repository/voucher/VoucherRepository.java @@ -0,0 +1,36 @@ +package com.prgrms.springbootbasic.repository.voucher; + +import com.prgrms.springbootbasic.domain.voucher.Voucher; +import com.prgrms.springbootbasic.enums.voucher.VoucherType; +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +public interface VoucherRepository { + + //create + Voucher save(Voucher voucher); + + //read - id + Optional findById(UUID voucherId); + + List findByType(VoucherType type); + + //read - all + List findAll(); + + //read - create at + List findByCreatedAt(); + + //update + void update(Voucher voucher); + + //delete - id + int deleteById(UUID voucherId); + + //delete - all + void deleteAll(); + + boolean checkVoucherId(UUID voucherId); + +} diff --git a/src/main/java/com/prgrms/springbootbasic/service/VoucherService.java b/src/main/java/com/prgrms/springbootbasic/service/VoucherService.java deleted file mode 100644 index 6f0fbff9e4..0000000000 --- a/src/main/java/com/prgrms/springbootbasic/service/VoucherService.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.prgrms.springbootbasic.service; - -import com.prgrms.springbootbasic.domain.FixedDiscountVoucher; -import com.prgrms.springbootbasic.domain.PercentDiscountVoucher; -import com.prgrms.springbootbasic.domain.Voucher; -import com.prgrms.springbootbasic.enums.VoucherType; -import com.prgrms.springbootbasic.repository.VoucherRepository; -import java.util.Map; -import java.util.UUID; -import org.springframework.stereotype.Service; - -@Service -public class VoucherService { - - private final VoucherRepository voucherRepository; - - public VoucherService(VoucherRepository voucherRepository) { - this.voucherRepository = voucherRepository; - } - - public Voucher createVoucher(VoucherType type, long discount) { - Voucher voucher = switch (type) { - case FIXED -> new FixedDiscountVoucher(discount); - case PERCENT -> new PercentDiscountVoucher(discount); - }; - return voucherRepository.insert(voucher); - } - - public Map fetchAllVouchers() { - return voucherRepository.getAllVouchersList(); - } -} diff --git a/src/main/java/com/prgrms/springbootbasic/service/customer/CustomerService.java b/src/main/java/com/prgrms/springbootbasic/service/customer/CustomerService.java new file mode 100644 index 0000000000..559c3a242f --- /dev/null +++ b/src/main/java/com/prgrms/springbootbasic/service/customer/CustomerService.java @@ -0,0 +1,96 @@ +package com.prgrms.springbootbasic.service.customer; + +import com.prgrms.springbootbasic.domain.customer.Customer; +import com.prgrms.springbootbasic.dto.customer.request.CustomerCreateRequest; +import com.prgrms.springbootbasic.dto.customer.request.CustomerUpdateRequest; +import com.prgrms.springbootbasic.dto.customer.response.CustomerListResponse; +import com.prgrms.springbootbasic.dto.customer.response.CustomerResponse; +import com.prgrms.springbootbasic.repository.customer.CustomerRepository; +import java.time.LocalDateTime; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.Optional; +import java.util.UUID; +import java.util.stream.Collectors; +import lombok.AllArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@AllArgsConstructor +public class CustomerService { + + private CustomerRepository customerRepository; + + //생성(create) + public CustomerResponse createCustomer(CustomerCreateRequest customerCreateRequest) { + String name = customerCreateRequest.getName(); + String email = customerCreateRequest.getEmail(); + LocalDateTime createAt = customerCreateRequest.getCreateAt() == null ? LocalDateTime.now() : customerCreateRequest.getCreateAt(); + + Customer customer = new Customer(UUID.randomUUID(), name, email, createAt); + Customer savedCustomer = customerRepository.save(customer); + return new CustomerResponse(savedCustomer.getCustomerId(), savedCustomer.getName(), savedCustomer.getEmail(), savedCustomer.getCreateAt()); + } + + //조회(Read) - id를 통해서 조회 + public CustomerResponse findById(UUID customerId) { + Customer customer = customerRepository.findById(customerId) + .orElseThrow(() -> new IllegalArgumentException("조회하시는 고객은 존재하지 않습니다.")); + + return new CustomerResponse(customer.getCustomerId(), customer.getName(), customer.getEmail(), customer.getCreateAt()); + } + + + //조회(read - custmer의 모든 List를 조회하기) + public CustomerListResponse findAllCustomers() { + List customers = customerRepository.findAll(); + List customerResponseList = customers.stream() + .map(customer -> new CustomerResponse( + customer.getCustomerId(), + customer.getName(), + customer.getEmail(), + customer.getCreateAt())) + .collect(Collectors.toList()); + + return new CustomerListResponse(customerResponseList); + } + + //조회(Read) - 생성일을 통해서 조회 + public CustomerListResponse findByCreateAt() { + List customers = customerRepository.findByCreatedAt(); + List customerResponseList = customers.stream() + .map(customer -> new CustomerResponse(customer.getCustomerId(), customer.getName(), customer.getEmail(), customer.getCreateAt())) + .collect(Collectors.toList()); + return new CustomerListResponse(customerResponseList); + } + + //수정(Update) + public void updateCustomer(CustomerUpdateRequest customerUpdateRequest) { + UUID customerId = customerUpdateRequest.getCustomerId(); + Optional storedCustomer = customerRepository.findById(customerId); + + Customer customer = storedCustomer.orElseThrow(() -> new IllegalArgumentException("해당 고객은 존재하지 않습니다.")); + + customer.setName(customerUpdateRequest.getCustomerName()); + customer.setEmail(customerUpdateRequest.getCustomerEmail()); + + customerRepository.update(customer); + } + + //삭제(Delete) -id + public int deleteById(UUID customerId) { + if (!customerRepository.checkCustomerId(customerId)) { + throw new NoSuchElementException("삭제하려는 고객의 ID는 존재하지 않습니다. 다시 확인 후, 입력해주세요"); + } + return customerRepository.deleteById(customerId); + } + + //삭제(Delete) + public void deleteAllCustomer() { + customerRepository.deleteAll(); + } + + public boolean existById(UUID customerId) { + return customerRepository.checkCustomerId(customerId); + } +} diff --git a/src/main/java/com/prgrms/springbootbasic/service/voucher/VoucherService.java b/src/main/java/com/prgrms/springbootbasic/service/voucher/VoucherService.java new file mode 100644 index 0000000000..c1356e25c2 --- /dev/null +++ b/src/main/java/com/prgrms/springbootbasic/service/voucher/VoucherService.java @@ -0,0 +1,115 @@ +package com.prgrms.springbootbasic.service.voucher; + +import com.prgrms.springbootbasic.domain.voucher.FixedVoucher; +import com.prgrms.springbootbasic.domain.voucher.RateVoucher; +import com.prgrms.springbootbasic.domain.voucher.Voucher; +import com.prgrms.springbootbasic.dto.voucher.request.VoucherCreateRequest; +import com.prgrms.springbootbasic.dto.voucher.request.VoucherUpdateRequest; +import com.prgrms.springbootbasic.dto.voucher.response.VoucherListResponse; +import com.prgrms.springbootbasic.dto.voucher.response.VoucherResponse; +import com.prgrms.springbootbasic.enums.voucher.VoucherType; +import com.prgrms.springbootbasic.repository.voucher.VoucherRepository; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.Optional; +import java.util.UUID; +import java.util.stream.Collectors; +import lombok.AllArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@AllArgsConstructor +public class VoucherService { + + private VoucherRepository voucherRepository; + + //생성(create) + public VoucherResponse createVoucher(VoucherCreateRequest voucherCreateRequest) { + try { + long discount = voucherCreateRequest.getDiscount(); + VoucherType type = voucherCreateRequest.getType(); + + Voucher voucher = switch (type) { + case FIXED -> new FixedVoucher(discount); + case RATE -> new RateVoucher(discount); + }; + + Voucher savedVoucher = voucherRepository.save(voucher); + return new VoucherResponse(savedVoucher.getVoucherId(), savedVoucher.getDiscount(), savedVoucher.getVoucherType(), savedVoucher.getCreatedAt()); + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); + throw e; + } + } + + //조회(Read) - id를 통해서 조회 + public VoucherResponse findById(UUID voucherId) { + Voucher voucher = voucherRepository.findById(voucherId) + .orElseThrow(() -> new IllegalArgumentException("조회하시는 Voucher는 존재하지 않습니다.")); + + return new VoucherResponse(voucher.getVoucherId(), voucher.getDiscount(), voucher.getVoucherType(), voucher.getCreatedAt()); + } + + //조회(Read) - 생성일순으로 조회 + public VoucherListResponse findByCreateAt() { + List vouchers = voucherRepository.findByCreatedAt(); + List voucherResponseList = vouchers.stream() + .map(voucher -> new VoucherResponse(voucher.getVoucherId(), voucher.getDiscount(), voucher.getVoucherType(), voucher.getCreatedAt())) + .collect(Collectors.toList()); + return new VoucherListResponse(voucherResponseList); + } + + //조회(Read) - 바우처 타입별로 조회 + + public VoucherListResponse findByType(VoucherType type) { + List ListVoucherType = voucherRepository.findByType(type); + List voucherResponseList = ListVoucherType.stream() + .map(voucher -> new VoucherResponse(voucher.getVoucherId(), voucher.getDiscount(), + voucher.getVoucherType(), voucher.getCreatedAt())) + .collect(Collectors.toList()); + return new VoucherListResponse(voucherResponseList); + } + + //조회(Read) -모든 바우처의 목록을 조회 + public VoucherListResponse findAllVouchers() { + List vouchers = voucherRepository.findAll(); + List voucherResponseList = vouchers.stream() + .map(voucher -> new VoucherResponse(voucher.getVoucherId(), voucher.getDiscount(), + voucher.getVoucherType(), voucher.getCreatedAt())) + .collect(Collectors.toList()); + + return new VoucherListResponse(voucherResponseList); + } + + //수정(Update) + public void updateVoucher(VoucherUpdateRequest voucherUpdateRequest) { + UUID voucherId = voucherUpdateRequest.getVoucherId(); + + Optional storegedVoucher = voucherRepository.findById(voucherId); + + Voucher voucher = storegedVoucher.orElseThrow(() -> new IllegalArgumentException("해당 바우처는 존재하지 않습니다.")); + + voucher = switch (voucher.getVoucherType()) { + case FIXED -> new FixedVoucher(voucher.getVoucherId(), voucherUpdateRequest.getDiscount(), voucher.getCreatedAt()); + case RATE -> new RateVoucher(voucher.getVoucherId(), voucherUpdateRequest.getDiscount(), voucher.getCreatedAt()); + }; + voucherRepository.update(voucher); + } + + //삭제(Delete) -id + public int deleteById(UUID voucherId) { + if (!voucherRepository.checkVoucherId(voucherId)) { + throw new NoSuchElementException("삭제하려는 바우처의 ID는 존재하지 않습니다. 다시 확인 후, 입력해주세요"); + } + return voucherRepository.deleteById(voucherId); + } + + //삭제(Delete) + public void deleteAllVoucher() { + voucherRepository.deleteAll(); + } + + public boolean existById(UUID voucherId) { + return voucherRepository.checkVoucherId(voucherId); + } +} diff --git a/src/main/java/com/prgrms/springbootbasic/view/Console.java b/src/main/java/com/prgrms/springbootbasic/view/Console.java index b7d8664485..1b3268afb5 100644 --- a/src/main/java/com/prgrms/springbootbasic/view/Console.java +++ b/src/main/java/com/prgrms/springbootbasic/view/Console.java @@ -1,55 +1,355 @@ package com.prgrms.springbootbasic.view; -import com.prgrms.springbootbasic.domain.Voucher; -import java.util.Map; +import com.prgrms.springbootbasic.dto.customer.request.CustomerCreateRequest; +import com.prgrms.springbootbasic.dto.customer.request.CustomerUpdateRequest; +import com.prgrms.springbootbasic.dto.customer.response.CustomerListResponse; +import com.prgrms.springbootbasic.dto.customer.response.CustomerResponse; +import com.prgrms.springbootbasic.dto.voucher.request.VoucherCreateRequest; +import com.prgrms.springbootbasic.dto.voucher.request.VoucherUpdateRequest; +import com.prgrms.springbootbasic.dto.voucher.response.VoucherListResponse; +import com.prgrms.springbootbasic.dto.voucher.response.VoucherResponse; +import com.prgrms.springbootbasic.enums.voucher.VoucherType; +import java.time.LocalDateTime; import java.util.Scanner; import java.util.UUID; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; +@Slf4j @Component public class Console implements Input, Output { private static final Scanner input = new Scanner(System.in); - public void consoleMenu() { - System.out.println("=== Voucher Program ==="); - System.out.println("Type **exit** to exit the program."); - System.out.println("Type **create** to create a new voucher."); - System.out.println("Type **list** to list all vouchers."); - } - + //Input @Override public String inputCommand() { - System.out.print("명령어를 입력해주세요.(exit,create,list) :"); return input.nextLine(); } + //바우처 생성(Create) @Override - public String inputVoucherType() { - System.out.print("생성할 voucher의 종류를 입력해주세요.(FixedDiscountVoucher, PercentDiscountVoucher) : "); - return input.nextLine(); + public VoucherCreateRequest inputVoucherCreateMessage(VoucherType type) { + String inputDiscount = input.nextLine(); + return new VoucherCreateRequest(Long.parseLong(inputDiscount), type, LocalDateTime.now()); + } + + //바우처 변경(Update) + @Override + public VoucherUpdateRequest inputVoucherUpdateMessage(UUID voucherId) { + System.out.print("변경할 금액 : "); + String updateDiscount = input.nextLine(); + + return new VoucherUpdateRequest(voucherId, Long.parseLong(updateDiscount)); + } + + @Override + public UUID inputUUID() { + try { + return UUID.fromString(input.nextLine()); + } catch (IllegalArgumentException e) { + log.error("입력된 값은 UUID 형식이 아닙니다.", e.getMessage()); + throw new IllegalArgumentException("입력된 값은 UUID 형식이 아닙니다. 다시 한 번 확인해보세요."); + } + } + + //Output + @Override + public void printConsoleMenu() { + System.out.println(); + System.out.println("==== Voucher Program ===="); + System.out.println(" 다음 아래의 3개의 프로그램 명령 중 하나를 선택해주세요."); + System.out.println("Voucher : 바우처 관련 프로그램 시작"); + System.out.println("Customer : 고객 관련 프로그램 시작"); + System.out.println("Exit: 프로그램 종료"); + System.out.print("input : "); + } + + @Override + public void printVoucherMenu() { + System.out.println(); + System.out.println("==== Voucher Program ===="); + System.out.println("바우처 관련 프로그램을 시작합니다."); + System.out.println("다음의 명령어 Create, Select, Update, Delete 중 하나를 입력해주세요."); + System.out.println("바우처 생성: Create"); + System.out.println("바우처 조회: Select"); + System.out.println("바우처 변경: Update"); + System.out.println("바우처 삭제: Delete"); + System.out.print("input : "); + } + + @Override + public void printVoucherCreateTypeMenu() { + System.out.println("==== Voucher 생성 작업 ===="); + System.out.println("생성 가능한 바우처의 타입을 확인 후, 입력해 주세요!"); + System.out.println("정액 할인 바우처(고정 금액 할인)는 fixed를 입력해주세요."); + System.out.println("정률 할인 바우처(비율 금액 할인)는 Rate를 입력해주세요."); + System.out.print("input : "); + } + + @Override + public void printVoucherCreateDiscountMenu() { + System.out.println(); + System.out.println("==== Voucher 생성 작업 ==== "); + System.out.println("생성할 바우처의 종류에 따른 입력 금액을 확인 후, 입력해 주세요!"); + System.out.println("정액 할인 바우처(고정 금액 할인)의 경우, 0이하의 숫자를 제외한 금액을 입력할 수 있습니다."); + System.out.println("정률 할인 바우처(비율 금액 할인)의 경우, 1 ~ 99까지의 비율을 입력할 수 있습니다."); + System.out.print("input : "); + } + + @Override + public void printVoucherSelectMenu() { + System.out.println(); + System.out.println("==== Voucher 조회 작업 ==== "); + System.out.println("바우처의 다음의 조회 방법에 대해서 확인 후, 입력해 주세요! "); + System.out.println("All : 모든 바우처를 조회"); + System.out.println("ID : 바우처의 ID로 조회"); + System.out.println("Type: 바우처의 타입별로 조회"); + System.out.println("CreatedAt : 바우처의 생성일 순으로 조회 "); + System.out.print("input: "); + } + + @Override + public void printVoucherSelectBYAll(VoucherListResponse voucherListResponse) { + for (VoucherResponse voucherResponse : voucherListResponse.getVoucherResponseList()) { + System.out.println(); + System.out.println("==== Voucher 조회 작업 ==== "); + System.out.println("저장된 모든 바우처를 조회를 수행합니다."); + System.out.println("바우처 ID : " + voucherResponse.getVoucherId()); + System.out.println("할인 금액 : " + voucherResponse.getDiscount()); + System.out.println("바우처 타입 : " + voucherResponse.getType()); + System.out.println("바우처 생성일 :" + voucherResponse.getCreateAt()); + System.out.println(); + } + } + + @Override + public void printVoucherSelectByTypeList(VoucherListResponse voucherListResponse) { + for (VoucherResponse voucherResponse : voucherListResponse.getVoucherResponseList()) { + System.out.println(); + System.out.println("==== Voucher 조회 작업 ==== "); + System.out.println(" 저장된 바우처를 타입별 조회를 수행합니다."); + System.out.println(); + System.out.println("바우처 ID : " + voucherResponse.getVoucherId()); + System.out.println("할인 금액 : " + voucherResponse.getDiscount()); + System.out.println("바우처 타입 : " + voucherResponse.getType()); + System.out.println("바우처 생성일 :" + voucherResponse.getCreateAt()); + System.out.println(); + } + } + + @Override + public void printVoucherSelectByType() { + System.out.println(); + System.out.println("==== Voucher 조회 작업 ==== "); + System.out.println("조회할 바우처의 Type을 입력해주세요!"); + System.out.println("fixed : 정액 할인 바우처(고정 금액 할인)"); + System.out.println("rate : 정률 할인 바우처(비율 금액 할인)"); + System.out.print("input : "); + } + + @Override + public void printVoucherSelectById() { + System.out.println(); + System.out.println("==== Voucher 조회 작업 ==== "); + System.out.println("조회할 바우처의 ID를 입력해주세요!"); + System.out.print("input : "); + } + + @Override + public void printVoucherSelectByCreateAt(VoucherListResponse voucherListResponse) { + System.out.println(); + System.out.println("==== Voucher 조회 작업 ==== "); + System.out.println("바우처를 생성일순으로 조회합니다."); + System.out.println(); + } + + @Override + public void printVoucherUpdateMenu() { + System.out.println(); + System.out.println("==== Voucher 수정 작업 ==== "); + System.out.println("바우처 수정을 선택하셨습니다."); + } + + @Override + public void printVoucherUpdateById() { + System.out.println(); + System.out.println("수정할 바우처의 ID를 입력해주세요."); + System.out.print("input : "); + } + + @Override + public void printVoucherDeleteMenu() { + System.out.println(); + System.out.println("==== Voucher 삭제 작업 ==== "); + System.out.println("바우처 삭제를 작업을 선택하셨습니다."); + System.out.println(); + System.out.println("ID: 바우처의 ID를 통해 해당 바우처 삭제"); + System.out.println("ALL : 모든 바우처들을 삭제 "); + System.out.print("input : "); } @Override - public long inputVoucherDiscount() { - System.out.println("생성할 voucher의 금액을 입력해주세요!"); - return Long.parseLong(input.nextLine()); + public void printVoucherDeleteById() { + System.out.println("삭제할 바우처의 ID를 입력해주세요."); + System.out.print("input: "); } @Override - public void printMessage(String message) { - System.out.println(message); + public void printVoucherDeleteAll() { + System.out.println("모든 바우처들을 삭제를 선택하셨습니다!"); } + + //고객 관련 메뉴들 @Override - public void printlnVoucherList(Map voucherMap) { - if (voucherMap.isEmpty()) { - System.out.println("생성된 voucher가 없습니다."); - return; + public void printCustomerMenu() { + System.out.println(); + System.out.println("==== Customer 프로그램 작업 ==== "); + ; + System.out.println("아래의 명령어(Create,Select,Update,Delete) 중 하나를 입력해주세요"); + System.out.println("고객 생성: Create"); + System.out.println("고객 조회: Select"); + System.out.println("고객 변경: Update"); + System.out.println("고객 삭제: Delete"); + System.out.print("input : "); + } + + + @Override + public void printCustomerCreateMenu() { + System.out.println(); + System.out.println("==== Customer 생성 작업 ===="); + System.out.println("반드시 다음과 같은 순서로 입력해주세요!"); + System.out.println("1.고객 이름(Name)"); + System.out.println("2.고객 이메일(Email)"); + } + + @Override + public void printCustomerSelectMenu() { + System.out.println(); + System.out.println("==== Customer 조회 작업 ==== "); + System.out.println("고객 조회에 대해서 다음의 방법을 확인 후, 입력해 주세요! "); + System.out.println("ID : 고객의 ID로 조회"); + System.out.println("CreatedAt : 고객의 생성일 순으로 조회 "); + System.out.println("ALL: 모든 고객을 조회"); + System.out.print("input: "); + } + + @Override + public void printCustomerSelectAll(CustomerListResponse customerListResponse) { + for (CustomerResponse customerResponse : customerListResponse.getCustomerResponseList()) { + System.out.println(); + System.out.println("==== Customer 조회 작업 ==== "); + System.out.println("저장된 모든 고객을 조회를 수행합니다."); + System.out.println("고객 ID : " + customerResponse.getCustomerId()); + System.out.println("고객 Name : " + customerResponse.getCustomerName()); + System.out.println("고객 Email : " + customerResponse.getCustomerEmail()); + System.out.println("고객 생성일 :" + customerResponse.getCreateAt()); + System.out.println(); } - System.out.println("생성된 Voucher의 목록은 다음과 같습니다."); - for (Voucher voucher : voucherMap.values()) { - System.out.println("Voucher Type: " + voucher.getVoucherType() + " + Discount" + voucher.getDiscount()); + } + + + @Override + public void printCustomerSelectById() { + System.out.println(); + System.out.println("==== Customer 조회 작업 ==== "); + System.out.println("조회할 고객의 ID를 입력해주세요!"); + System.out.print("input : "); + } + + @Override + public void printCutomerSelectByCreatedAt() { + System.out.println(); + System.out.println("==== Customer 조회 작업 ==== "); + System.out.println("고객을 생성일순으로 조회합니다."); + System.out.println(); + } + + + //고객 수정(Update) - 메뉴 + public CustomerUpdateRequest inputCustomerUpdateMessage(UUID customerId) { + System.out.print("변경할 이름 : "); + String updateCustomerName = input.nextLine(); + + System.out.print("변경할 이메일 : "); + String updateCustomerEmail = input.nextLine(); + + // 업데이트 요청 객체 반환 + return new CustomerUpdateRequest(customerId, updateCustomerName, updateCustomerEmail); + } + + @Override + public void printCustomerUpdateByID() { + System.out.println(); + System.out.println("수정햘 고객의 ID를 입력해주세요."); + System.out.print("input : "); + } + + //고객 - 삭제 메뉴 + @Override + public void printCustomerDeleteMenu() { + System.out.println(); + System.out.println("==== Customer 삭제 작업 ==== "); + System.out.println("고객 삭제 작업을 선택하셨습니다."); + System.out.println(); + System.out.println("ID: 고객의 ID를 통해 해당 바우처 삭제"); + System.out.println("ALL : 모든 고객을 삭제 "); + System.out.print("input : "); + } + + //고객 삭제 -ID + @Override + public void printCustomerDeleteByID() { + System.out.println(); + System.out.println("삭제할 고객의 ID를 입력해주세요."); + System.out.print("input : "); + } + + //고객 삭제 - All + @Override + public void printCustomerDeleteByAll() { + System.out.println(); + System.out.println("==== Customer 삭제 작업 ==== "); + System.out.println("모든 고객 삭제를 선택하셨습니다!"); + } + + @Override + public void printExitMessage() { + System.out.println("프로그램이 종료됩니다."); + } + + @Override + public void printErrorMessage(String message) { + System.out.println(message.toString()); + } + + @Override + public void printCompleteMessage() { + System.out.println("정상적으로 해당 작업이 완료되었습니다!"); + } + + public void printCustomerSelectByCreatedAt(CustomerListResponse customerListResponse) { + for (CustomerResponse customerResponse : customerListResponse.getCustomerResponseList()) { + System.out.println(); + System.out.println("==== 고객 조회 작업(생성일 순) ==== "); + System.out.println("저장된 모든 고객를 조회를 수행합니다."); + System.out.println("고객 ID : " + customerResponse.getCustomerId()); + System.out.println("고객 이름 : " + customerResponse.getCustomerName()); + System.out.println("고객 이메일 : " + customerResponse.getCustomerEmail()); + System.out.println("고객 생성일 :" + customerResponse.getCreateAt()); + System.out.println(); } } + + @Override + public CustomerCreateRequest inputCustomerCreateMessage() { + System.out.print("input(이름) : "); + String inputCustomerName = input.nextLine(); + + System.out.print("input(Email) : "); + String inputCustomerEmail = input.nextLine(); + return new CustomerCreateRequest(inputCustomerName, inputCustomerEmail, LocalDateTime.now()); + } } diff --git a/src/main/java/com/prgrms/springbootbasic/view/Input.java b/src/main/java/com/prgrms/springbootbasic/view/Input.java index 7a30cbd055..54f22c2bfb 100644 --- a/src/main/java/com/prgrms/springbootbasic/view/Input.java +++ b/src/main/java/com/prgrms/springbootbasic/view/Input.java @@ -1,10 +1,29 @@ package com.prgrms.springbootbasic.view; +import com.prgrms.springbootbasic.dto.customer.request.CustomerCreateRequest; +import com.prgrms.springbootbasic.dto.customer.request.CustomerUpdateRequest; +import com.prgrms.springbootbasic.dto.voucher.request.VoucherCreateRequest; +import com.prgrms.springbootbasic.dto.voucher.request.VoucherUpdateRequest; +import com.prgrms.springbootbasic.enums.voucher.VoucherType; +import java.util.UUID; + public interface Input { + //콘솔 명령어 입력 String inputCommand(); - String inputVoucherType(); + //바우처 생성(Create) + VoucherCreateRequest inputVoucherCreateMessage(VoucherType type); + + //바우처 변경(Update) + VoucherUpdateRequest inputVoucherUpdateMessage(UUID voucherId); + + //고객 생성(Create) + CustomerCreateRequest inputCustomerCreateMessage(); + + //고객 변경(Update) + CustomerUpdateRequest inputCustomerUpdateMessage(UUID cusomterId); - long inputVoucherDiscount(); -} + //ID값 입력 + UUID inputUUID(); +} \ No newline at end of file diff --git a/src/main/java/com/prgrms/springbootbasic/view/Output.java b/src/main/java/com/prgrms/springbootbasic/view/Output.java index 1172024edd..8de09e5cfa 100644 --- a/src/main/java/com/prgrms/springbootbasic/view/Output.java +++ b/src/main/java/com/prgrms/springbootbasic/view/Output.java @@ -1,12 +1,92 @@ package com.prgrms.springbootbasic.view; -import com.prgrms.springbootbasic.domain.Voucher; -import java.util.Map; -import java.util.UUID; +import com.prgrms.springbootbasic.dto.customer.response.CustomerListResponse; +import com.prgrms.springbootbasic.dto.voucher.response.VoucherListResponse; public interface Output { - void printMessage(String message); + void printConsoleMenu(); - void printlnVoucherList(Map voucherMap); + //바우처 관련 메뉴 + void printVoucherMenu(); + + //바우처 생성 - 타입 + void printVoucherCreateTypeMenu(); + + //바우처 생성 - 금액 + void printVoucherCreateDiscountMenu(); + + //바우처 조회 - 메뉴 + void printVoucherSelectMenu(); + + //바우처 조회 - 모든 + void printVoucherSelectBYAll(VoucherListResponse voucherListResponse); + + //바우처 조회 - 타입별 + void printVoucherSelectByTypeList(VoucherListResponse voucherListResponse); + + void printVoucherSelectByType(); + + //바우처 조회 - ID조회 + + void printVoucherSelectById(); + + //바우처 조회 - 생성기간 + void printVoucherSelectByCreateAt(VoucherListResponse voucherListResponse); + + //바우처 변경 - 메뉴 + void printVoucherUpdateMenu(); + + //바우처 변경 - Id + void printVoucherUpdateById(); + + //바우처 삭제 - 메뉴 + void printVoucherDeleteMenu(); + + //바우처 삭제 - ID + void printVoucherDeleteById(); + + //바우처 삭제 - 모든 바우처 삭제 + void printVoucherDeleteAll(); + + //고객 관련 작업 메뉴 + void printCustomerMenu(); + + //고객 생성 - 안내 + void printCustomerCreateMenu(); + + //고객 조회 - 메뉴 + void printCustomerSelectMenu(); + + //고객 조회 - 모든 + void printCustomerSelectAll(CustomerListResponse customerListResponse); + + //고객 조회 - ID + void printCustomerSelectById(); + + //고객 조회 - 생성일 + void printCutomerSelectByCreatedAt(); + + + //고객 변경 - ID + void printCustomerUpdateByID(); + + //고객 삭제 - 메뉴 + void printCustomerDeleteMenu(); + + //고객 삭제 - ID + void printCustomerDeleteByID(); + + //고객 삭제 - ALL + void printCustomerDeleteByAll(); + + + //Exit시 출력문 + void printExitMessage(); + + //에러 메시지 출력문 + void printErrorMessage(String message); + + //작업 완료문 + void printCompleteMessage(); } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties deleted file mode 100644 index 8b13789179..0000000000 --- a/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml new file mode 100644 index 0000000000..fe20d6505e --- /dev/null +++ b/src/main/resources/application.yaml @@ -0,0 +1,9 @@ +spring: + datasource: + driver-class-name: org.h2.Driver + url: jdbc:h2:mem:springboot_basic; + username: sa + password: + sql: + init: + mode: always \ No newline at end of file diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml index 12e7eee709..65769a7367 100644 --- a/src/main/resources/logback.xml +++ b/src/main/resources/logback.xml @@ -12,11 +12,11 @@ - + - + diff --git a/src/main/resources/schema.sql b/src/main/resources/schema.sql new file mode 100644 index 0000000000..1b1ba74034 --- /dev/null +++ b/src/main/resources/schema.sql @@ -0,0 +1,14 @@ +create table vouchers +( + voucher_id varchar(50) primary key, + discount int not null, + voucher_type varchar(30) not null, + voucher_createdAt TIMESTAMP not null +); +create table customers +( + customer_id varchar(50) primary key, + customer_name varchar(50) not null, + customer_email varchar(100) not null, + customer_createAt TIMESTAMP not null +) diff --git a/src/test/java/com/prgrms/springbootbasic/VoucherApplicationTest.java b/src/test/java/com/prgrms/springbootbasic/VoucherApplicationTest.java deleted file mode 100644 index 39963eb9db..0000000000 --- a/src/test/java/com/prgrms/springbootbasic/VoucherApplicationTest.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.prgrms.springbootbasic; - -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class VoucherApplicationTest { -} diff --git a/src/test/java/com/prgrms/springbootbasic/domain/customer/CustomerTest.java b/src/test/java/com/prgrms/springbootbasic/domain/customer/CustomerTest.java new file mode 100644 index 0000000000..db42a8d716 --- /dev/null +++ b/src/test/java/com/prgrms/springbootbasic/domain/customer/CustomerTest.java @@ -0,0 +1,101 @@ +package com.prgrms.springbootbasic.domain.customer; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.is; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import java.time.LocalDateTime; +import java.util.UUID; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +class CustomerTest { + + //해피 케이스 테스트 - Hamcrest 테스트 + @Test + @DisplayName("고객 생성 테스트") + void createCustomerTest() { + //given + UUID customerId = UUID.randomUUID(); + String name = "Hanjo"; + String email = "Hanjo@example.com"; + LocalDateTime createdAt = LocalDateTime.now(); + + //when + Customer customer = new Customer(customerId, name, email, createdAt); + + //then + assertThat(customer.getCustomerId(), is(equalTo(customerId))); + assertThat(customer.getName(), is(equalTo(name))); + assertThat(customer.getEmail(), is(equalTo(email))); + assertThat(customer.getCreateAt(), is(equalTo(createdAt))); + + } + + //엣지 케이스 테스트 - Nested 클래스 사용 + // 정상적으로 영문 Name이 입력되었을 때 테스트, 영문 이외의 글자가 Name에 들어왔을 때 테스트 + @Nested + @DisplayName("고객 Name의 Validation 확인 테스트") + class NameValidationTest { + + @Test + @DisplayName("정상적으로 영문 Name이 입력되었을 때 테스트") + void validNameTest() { + String name = "JohnDoe"; + + assertThat(new Customer(UUID.randomUUID(), name, "valid@example.com", LocalDateTime.now()).getName(), is(equalTo(name))); + } + + @Test + @DisplayName("영문 이외의 글자가 Name에 들어왔을 때 테스트") + void invalidNameTest() { + String name = "잘못된이름"; + + assertThrows(IllegalArgumentException.class, () -> new Customer(UUID.randomUUID(), name, "invalid@example.com", LocalDateTime.now())); + } + } + + //엣지 케이스 테스트 - Nested 클래스 사용 + // 정상적으로 Email이 입력되었을 때 테스트, 비정상적인 Email이 들어왔을 때 테스트 + @Nested + @DisplayName("고객 Email의 Validation 테스트") + class EmailValidationTest { + + @Test + @DisplayName("정상적으로 Email이 입력되었을 때 테스트") + void validEmailTest() { + String email = "valid@example.com"; + + assertThat(new Customer(UUID.randomUUID(), "ValidName", email, LocalDateTime.now()).getEmail(), is(equalTo(email))); + } + + @Test + @DisplayName("비정상적인 Email이 들어왔을 때 테스트") + void invalidEmailTest() { + String email = "invalid-email"; + + assertThrows(IllegalArgumentException.class, () -> new Customer(UUID.randomUUID(), "InvalidName", email, LocalDateTime.now())); + } + } + + + //해피케이스 테스트 - Hamcrest 테스트 + @DisplayName("여러 명의 고객 생성 테스트") + @ParameterizedTest + @CsvSource(value = {"merry, merry@example.com", "jay, jay@example.com", "hanjo, hanjo@example.com"}) + void createMultiCustomerTest(String name, String email) { + UUID customerId = UUID.randomUUID(); + LocalDateTime createdAt = LocalDateTime.now(); + + Customer customer = new Customer(customerId, name, email, createdAt); + + assertThat(customer.getCustomerId(), is(equalTo(customerId))); + assertThat(customer.getName(), is(equalTo(name))); + assertThat(customer.getEmail(), is(equalTo(email))); + assertThat(customer.getCreateAt(), is(equalTo(createdAt))); + } +} \ No newline at end of file diff --git a/src/test/java/com/prgrms/springbootbasic/domain/voucher/FixedVoucherTest.java b/src/test/java/com/prgrms/springbootbasic/domain/voucher/FixedVoucherTest.java new file mode 100644 index 0000000000..8cec92a654 --- /dev/null +++ b/src/test/java/com/prgrms/springbootbasic/domain/voucher/FixedVoucherTest.java @@ -0,0 +1,89 @@ +package com.prgrms.springbootbasic.domain.voucher; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.is; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import com.prgrms.springbootbasic.enums.voucher.VoucherType; +import java.time.LocalDateTime; +import java.util.UUID; +import org.hamcrest.Matchers; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +class FixedVoucherTest { + + //해피케이스 테스트 - Hamcrest 테스트 + @Test + @DisplayName("고정 할인(Fixed) 바우처 생성 테스트") + void createFixedVoucherTest() { + //given + UUID voucherId = UUID.randomUUID(); + long discount = 10000; + LocalDateTime createdAt = LocalDateTime.now(); + + //when + FixedVoucher voucher = new FixedVoucher(voucherId, discount, createdAt); + + //then + assertThat(voucher.getVoucherId(), is(equalTo(voucherId))); + assertThat(voucher.getDiscount(), Matchers.equalTo(discount)); + assertThat(voucher.getVoucherType(), Matchers.equalTo(VoucherType.FIXED)); + assertThat(voucher.getCreatedAt(), is(equalTo(createdAt))); + } + + //엣지 케이스 테스트 - Nested클래스 + // 사용 0이하의 금액이 들어왔을 때 테스트, 0초과의 금액이 들어왔을 때의 테스트 + + @Nested + @DisplayName("고정 할인(Fixed) 바우처의 Validation 확인 테스트") + class checkFixedValidationTest { + + @Test + @DisplayName("금액이 0 이하일 경우") + void invalidDiscountTest() { + //given + long discount = -1000; + + //then + assertThrows(IllegalArgumentException.class, () -> new FixedVoucher(discount)); + } + + @Test + @DisplayName("금액이 0 초과일 경우") + void validDiscountTest() { + //given + long discount = 2000; + + //when + FixedVoucher voucher = new FixedVoucher(discount); + + //then + assertThat(voucher.getDiscount(), Matchers.equalTo(discount)); + } + } + + + //해피케이스 테스트 - Hamcrest 테스트 + @DisplayName("여러 개의 고정 할인(fixed) 바우처 생성 테스트") + @ParameterizedTest + @CsvSource(value = {"1000", "5000", "10000"}) + void createMultiFixcedVoucherTest(long discount) { + //given + UUID voucherId = UUID.randomUUID(); + LocalDateTime createdAt = LocalDateTime.now(); + + //when + FixedVoucher voucher = new FixedVoucher(voucherId, discount, createdAt); + + //then + assertThat(voucher.getVoucherId(), is(equalTo(voucherId))); + assertThat(voucher.getDiscount(), Matchers.equalTo(discount)); + assertThat(voucher.getVoucherType(), Matchers.equalTo(VoucherType.FIXED)); + assertThat(voucher.getCreatedAt(), is(equalTo(createdAt))); + } +} \ No newline at end of file diff --git a/src/test/java/com/prgrms/springbootbasic/domain/voucher/RateVoucherTest.java b/src/test/java/com/prgrms/springbootbasic/domain/voucher/RateVoucherTest.java new file mode 100644 index 0000000000..c592908896 --- /dev/null +++ b/src/test/java/com/prgrms/springbootbasic/domain/voucher/RateVoucherTest.java @@ -0,0 +1,90 @@ +package com.prgrms.springbootbasic.domain.voucher; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.is; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import com.prgrms.springbootbasic.enums.voucher.VoucherType; +import java.time.LocalDateTime; +import java.util.UUID; +import org.hamcrest.Matchers; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +class RateVoucherTest { + + //해피 케이스 테스트 - Hamcrest 테스트 + @Test + @DisplayName("정률 할인(Rate) 바우처 생성 테스트") + void createRateVoucherTest() { + //given + UUID voucherId = UUID.randomUUID(); + long discount = 70; + LocalDateTime createdAt = LocalDateTime.now(); + + //when + RateVoucher voucher = new RateVoucher(voucherId, discount, createdAt); + + //then + assertThat(voucher.getVoucherId(), is(equalTo(voucherId))); + assertThat(voucher.getDiscount(), Matchers.equalTo(discount)); + assertThat(voucher.getVoucherType(), Matchers.equalTo(VoucherType.RATE)); + assertThat(voucher.getCreatedAt(), is(equalTo(createdAt))); + } + + //엣지 케이스 테스트 - Nested 클래스 사용 + // 1~99이외의 퍼센트가 들어왔을 때의 테스트, 1~99범위의 테스트가 들와왔을 때 테스트 + @Nested + @DisplayName("정률 할인(Rate) 바우처의 Validation") + class checkRateValidationTest { + //given + + @Test + @DisplayName("퍼센트가 1~99 이외 범위일 경우") + void invalidDiscountTest() { + //given + long discount = 100; + + //then + assertThrows(IllegalArgumentException.class, () -> new RateVoucher(discount)); + + } + + + @Test + @DisplayName("퍼센트가 1~99 사이의 범위일 경우") + void validDiscountTest() { + //given + long discount = 50; + + //when + RateVoucher voucher = new RateVoucher(discount); + + //then + assertThat(voucher.getDiscount(), Matchers.equalTo(discount)); + } + } + + //해피케이스 테스트 -Hamcreset 테스트 + + @DisplayName("여러 개의 정률 할인(Rate) 바우처 생성 테스트") + @ParameterizedTest + @CsvSource(value = {"1", "50", "99"}) + void createMultiRateVoucherTest(long discount) { + //given + UUID voucherId = UUID.randomUUID(); + LocalDateTime createdAt = LocalDateTime.now(); + //then + RateVoucher voucher = new RateVoucher(voucherId, discount, createdAt); + + //when + assertThat(voucher.getVoucherId(), is(equalTo(voucherId))); + assertThat(voucher.getDiscount(), Matchers.equalTo(discount)); + assertThat(voucher.getVoucherType(), Matchers.equalTo(VoucherType.RATE)); + assertThat(voucher.getCreatedAt(), is(equalTo(createdAt))); + } +} \ No newline at end of file diff --git a/src/test/java/com/prgrms/springbootbasic/repository/customer/CustomerJdbcRepositoryTest.java b/src/test/java/com/prgrms/springbootbasic/repository/customer/CustomerJdbcRepositoryTest.java new file mode 100644 index 0000000000..c1bef11342 --- /dev/null +++ b/src/test/java/com/prgrms/springbootbasic/repository/customer/CustomerJdbcRepositoryTest.java @@ -0,0 +1,159 @@ +package com.prgrms.springbootbasic.repository.customer; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import com.prgrms.springbootbasic.domain.customer.Customer; +import com.prgrms.springbootbasic.dto.customer.request.CustomerUpdateRequest; +import java.time.LocalDateTime; +import java.util.List; +import java.util.Optional; +import java.util.UUID; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.TestConfiguration; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.transaction.annotation.Transactional; + +@ActiveProfiles("test") +//@SpringBootTest +@TestConfiguration +@Transactional +class CustomerJdbcRepositoryTest { + + @Autowired + private CustomerRepository customerRepository; + + @Test + @DisplayName("데이터 베이스와 연동되어 고객 생성 테스트") + void createCustomerTest() { + //given + UUID customerId = UUID.randomUUID(); + Customer savedCustomer = new Customer(customerId, "so", "jay2309@naver.com", LocalDateTime.now()); + + //when + Customer checkCustomer = customerRepository.save(savedCustomer); + + //then + assertThat(checkCustomer).isEqualTo(savedCustomer); + } + + @Test + @DisplayName("데이터 베이스에 저장된 모든 고객 조회 테스트") + void findCustomerTest() { + //given + UUID customerId1 = UUID.randomUUID(); + UUID customerId2 = UUID.randomUUID(); + Customer saveCustomer1 = new Customer(customerId1, "so", "jay2309@naver.com", LocalDateTime.now()); + Customer saveCustomer2 = new Customer(customerId2, "jay", "jay1234@naver.com", LocalDateTime.now()); + + //when + Customer checkCustomer1 = customerRepository.save(saveCustomer1); + Customer checkCustomer2 = customerRepository.save(saveCustomer2); + + List customers = List.of(checkCustomer1, checkCustomer2); + + //then + assertThat(customers).contains(checkCustomer1, checkCustomer2); + } + + @Test + @DisplayName("데이터 베이스에 저장된 생성일 순으로 고객을 조회") + void findByCreatedAtTest() { + //given + UUID customerId1 = UUID.randomUUID(); + UUID customerId2 = UUID.randomUUID(); + Customer saveCustomer1 = new Customer(customerId1, "so", "jay2309@naver.com", LocalDateTime.of(2022, 10, 9, 11, 57)); + Customer saveCustomer2 = new Customer(customerId2, "jay", "jay1234@naver.com", LocalDateTime.of(2022, 12, 9, 15, 38)); + + //when + Customer checkCustomer1 = customerRepository.save(saveCustomer1); + Customer checkCustomer2 = customerRepository.save(saveCustomer2); + List customers = customerRepository.findByCreatedAt(); + + //then + assertNotNull(customers); + assertTrue(customers.size() >= 2); + assertThat(customers.get(0)).isEqualTo(checkCustomer1); + assertThat(customers.get(1)).isEqualTo(checkCustomer2); + } + + @Test + @DisplayName("데이터 베이스에 저장된 고객의 id를 통해서 조회") + void findByIdTest() { + //given + UUID customerId1 = UUID.randomUUID(); + UUID customerId2 = UUID.randomUUID(); + Customer saveCustomer1 = new Customer(customerId1, "so", "jay2309@naver.com", LocalDateTime.now()); + Customer saveCustomer2 = new Customer(customerId2, "jay", "jay1234@naver.com", LocalDateTime.now()); + + //when + Customer checkCustomer1 = customerRepository.save(saveCustomer1); + Customer checkCustomer2 = customerRepository.save(saveCustomer2); + List findByIdCustomer = List.of(saveCustomer1, saveCustomer2); + + //then + assertThat(checkCustomer1.getCustomerId()).isEqualTo(saveCustomer1.getCustomerId()); + assertThat(checkCustomer2.getCustomerId()).isEqualTo(saveCustomer2.getCustomerId()); + } + + @Test + @DisplayName("데이터 베이스에 저장된 고객 수정 테스트") + // 아직 + void updateVoucherTest() { + //given + UUID customerId = UUID.randomUUID(); + Customer saveCustomer = new Customer(customerId, "so", "jay2309@naver.com", LocalDateTime.now()); + customerRepository.save(saveCustomer); + + //when + CustomerUpdateRequest customerUpdateRequest = new CustomerUpdateRequest(saveCustomer.getCustomerId(), "jay", "merry9323@naver.com"); + customerRepository.update(saveCustomer); + + //then + assertThat(saveCustomer).isEqualTo(customerUpdateRequest); + + + } + + @Test + @DisplayName("데이터 베이스에 저장된 id를 통해서 고객 삭제") + void deleteByIdTest() { + //given + UUID customerId = UUID.randomUUID(); + Customer customer = new Customer(customerId, "so", "meery94@naver.com", LocalDateTime.now()); + customerRepository.save(customer); + + //when + customerRepository.deleteById(customer.getCustomerId()); + Optional deleteCustomer = customerRepository.findById(customer.getCustomerId()); + + //then + assertThat(deleteCustomer).isEmpty(); + } + + @Test + @DisplayName("데이터 베이스에 저장된 모든 고객 삭제") + void deleteByAllTest() { + //given + UUID customerId1 = UUID.randomUUID(); + UUID customerId2 = UUID.randomUUID(); + UUID customerId3 = UUID.randomUUID(); + + Customer customer1 = new Customer(customerId1, "jay", "merry59323@naver.com", LocalDateTime.now()); + Customer customer2 = new Customer(customerId2, "hanjo", "merry3392@naver.com", LocalDateTime.now()); + Customer customer3 = new Customer(customerId3, "jaewon", "msedy23@naver.com", LocalDateTime.now()); + customerRepository.save(customer1); + customerRepository.save(customer2); + customerRepository.save(customer3); + + //when + customerRepository.deleteAll(); + + //then + assertThat(customerRepository.findAll().size()).isEqualTo(0); + + } +} \ No newline at end of file diff --git a/src/test/java/com/prgrms/springbootbasic/repository/voucher/VoucherJdbcRepositoryTest.java b/src/test/java/com/prgrms/springbootbasic/repository/voucher/VoucherJdbcRepositoryTest.java new file mode 100644 index 0000000000..d0a2821c6e --- /dev/null +++ b/src/test/java/com/prgrms/springbootbasic/repository/voucher/VoucherJdbcRepositoryTest.java @@ -0,0 +1,171 @@ +package com.prgrms.springbootbasic.repository.voucher; + + +import org.springframework.boot.test.context.TestConfiguration; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.transaction.annotation.Transactional; + +@ActiveProfiles("test") +@Transactional +//@SpringBootTest +@TestConfiguration +class VoucherJdbcRepositoryTest { + +// @Autowired +// private VoucherRepository voucherRepository; +// +// +// //해피 케이스 테스트 +// @Test +// @DisplayName("데이터 베이스와 연동되어 바우처 생성 테스트") +// void createVoucherTest() { +// //given +// VoucherCreateRequest createFixedVoucherRequest = new VoucherCreateRequest(5000, VoucherType.FIXED, LocalDateTime.now()); +// VoucherCreateRequest createRateVoucherRequest = new VoucherCreateRequest(50, VoucherType.RATE, LocalDateTime.now()); +// +// //when +// Voucher fixedVoucher = new FixedVoucher(10000); +// Voucher rateVoucher = new RateVoucher(50); +// +// //then +// assertNotNull(fixedVoucher); +// assertNotNull(rateVoucher); +// +// //FixedVoucher +// assertEquals(fixedVoucher.getVoucherId(), createdFixedVoucher.getVoucherId()); +// assertEquals(fixedVoucher.getDiscount(), createdFixedVoucher.getDiscount()); +// assertEquals(fixedVoucher.getVoucherType(), createdFixedVoucher.getVoucherType()); +// assertEquals(fixedVoucher.getCreatedAt(), createdFixedVoucher.getCreatedAt()); +// +// //RateVoucher +// assertEquals(rateVoucher.getVoucherId(), createdRateVoucher.getVoucherId()); +// assertEquals(rateVoucher.getVoucherId(), createdFixedVoucher.getVoucherId()); +// assertEquals(rateVoucher.getDiscount(), createdFixedVoucher.getDiscount()); +// assertEquals(rateVoucher.getVoucherType(), createdFixedVoucher.getVoucherType()); +// } +// +// @Test +// @DisplayName("데이터 베이스에 저장된 모든 바우처 조회") +// void findByAllTest() { +// //given +// voucherRepository.save(fixedVoucher); +// voucherRepository.save(rateVoucher); +// +// //when +// List allVouchers = voucherRepository.findAll(); +// +// //then +// assertEquals(2, allVouchers.size()); +// assertTrue(allVouchers.stream().anyMatch(v -> v.getVoucherId().equals(fixedVoucher.getVoucherId()))); +// assertTrue(allVouchers.stream().anyMatch(v -> v.getVoucherId().equals(rateVoucher.getVoucherId()))); +// } +// +// @Test +// @DisplayName("데이터 베이스에 저장된 생성일 순으로 바우처 조회") +// void findByCreatedAtTest() { +// //given +// voucherRepository.save(fixedVoucher); +// voucherRepository.save(rateVoucher); +// +// //when +// List vouchersByCreatedAt = voucherRepository.findByCreatedAt(); +// +// //then +// assertEquals(2, vouchersByCreatedAt.size()); +// assertTrue(vouchersByCreatedAt.stream().anyMatch(v -> v.getVoucherId().equals(fixedVoucher.getVoucherId()))); +// assertTrue(vouchersByCreatedAt.stream().anyMatch(v -> v.getVoucherId().equals(rateVoucher.getVoucherId()))); +// } +// +// @Test +// @DisplayName("데이터 베이스에 저장된 바우처를 타입별로 조회") +// void findByTypeTest() { +// //given +// voucherRepository.save(fixedVoucher); +// voucherRepository.save(rateVoucher); +// +// //when +// List fixedVouchers = voucherRepository.findByType(VoucherType.FIXED); +// List rateVouchers = voucherRepository.findByType(VoucherType.RATE); +// +// //then +// +// assertEquals(fixedVoucher.getVoucherId(), fixedVouchers.get(0).getVoucherId()); +// assertEquals(rateVoucher.getVoucherId(), rateVouchers.get(0).getVoucherId()); +// +// } +// +// @Test +// @DisplayName("데이터 베이스에 저장된 바우처 id를 통해서 조회") +// void findByIdTest() { +// //given +// Voucher savedFixedVoucher = voucherRepository.save(fixedVoucher); +// +// //when +// Optional foundVoucher = voucherRepository.findById(savedFixedVoucher.getVoucherId()); +// +// //then +// assertTrue(foundVoucher.isPresent()); +// assertEquals(savedFixedVoucher.getVoucherId(), foundVoucher.get().getVoucherId()); +// +// } +// +// @Test +// @DisplayName("데이터 베이스에 저장된 바우처 수정 테스트") +// void updateVoucherTest() { +// //given +// Voucher savedFixedVoucher = voucherRepository.save(fixedVoucher); +// long newDiscount = 2000; +// +// //when +// //VoucherUpdateRequest updateRequest = new VoucherUpdateRequest(savedFixedVoucher.getVoucherId(), newDiscount); +// +// voucherRepository.update(savedFixedVoucher); +// +// //then +// assertEquals(newDiscount, savedFixedVoucher.getDiscount()); +// +// } +// +// @Test +// @DisplayName("데이터 베이스에 저장된 바우처의 id를 통해서 삭제") +// void deleteByIdTest() { +// //given +// UUID voucherId = UUID.randomUUID(); +// FixedVoucher fixedVoucher = new FixedVoucher(voucherId, 5000, LocalDateTime.now()); +// +// //when +// voucherRepository.save(fixedVoucher); +// voucherRepository.deleteById(voucherId); +// +// //then +// assertThat(voucherRepository.findById(voucherId).isEmpty()); +// +// } +// +// +// @Test +// @DisplayName("데이터 베이스에 저장된 모든 바우처 삭제") +// void deleteByAllTest() { +// //given +// UUID voucherId1 = UUID.randomUUID(); +// UUID voucherId2 = UUID.randomUUID(); +// UUID voucherId3 = UUID.randomUUID(); +// UUID voucherId4 = UUID.randomUUID(); +// +// FixedVoucher fixedVoucher1 = new FixedVoucher(voucherId1, 5000, LocalDateTime.now()); +// FixedVoucher fixedVoucher2 = new FixedVoucher(voucherId2, 10000, LocalDateTime.now()); +// +// RateVoucher rateVoucher1 = new RateVoucher(voucherId3, 50, LocalDateTime.now()); +// RateVoucher rateVoucher2 = new RateVoucher(voucherId4, 70, LocalDateTime.now()); +// +// //when +// voucherRepository.save(fixedVoucher1); +// voucherRepository.save(fixedVoucher2); +// voucherRepository.save(rateVoucher1); +// voucherRepository.save(rateVoucher2); +// voucherRepository.deleteAll(); +// +// //then +// assertThat(voucherRepository.findAll().size()).isEqualTo(0); +// } +} \ No newline at end of file diff --git a/src/test/java/com/prgrms/springbootbasic/service/customer/CustomerServiceTest.java b/src/test/java/com/prgrms/springbootbasic/service/customer/CustomerServiceTest.java new file mode 100644 index 0000000000..ac8be95b13 --- /dev/null +++ b/src/test/java/com/prgrms/springbootbasic/service/customer/CustomerServiceTest.java @@ -0,0 +1,189 @@ +package com.prgrms.springbootbasic.service.customer; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.transaction.annotation.Transactional; + +@ActiveProfiles("test") +@SpringBootTest +@Transactional +class CustomerServiceTest { + + @Autowired + private CustomerService customerService; + + //해피 케이스 테스트 + @Test + @DisplayName("고객 생성 테스트") + void createCustomerTest() { + //given + + //when + + //then + + } + + @Test + @DisplayName("저장된 모든 고객 조회") + void findByAllTest() { + //given + + //when + + //then + + } + + @Test + @DisplayName("고객 조회 - 생성일 순으로 조회") + void findByCreatedAtTest() { + //given + + //when + + //then + + } + + @Test + @DisplayName("고객 조회 - id를 통해서 조회") + void findByIdTest() { + //given + + //when + + //then + + } + + @Test + @DisplayName("고객 수정 테스트") + void updateVoucherTest() { + //given + + //when + + //then + } + + @Test + @DisplayName("고객 삭제 - id를 통해서 삭제") + void deleteByIdTest() { + //given + + //when + + //then + + } + + @Test + @DisplayName("고객 삭제 - 저장된 모든 고객 삭제") + void deleteByAllTest() { + //given + + //when + + //then + + } + + + //엣지 케이스 + @Test + @DisplayName("고객 생성 실패 테스트 케이스") + void createFailTest() { + //given + + //when + + //then + + } + + @Test + @DisplayName("모든 고객 조회 실패 테스트 케이스") + void findAllFailTest() { + //given + + //when + + //then + + } + + @Test + @DisplayName("생성일 순 조회 실패 테스트 케이스") + void findByCreatedAtFailTest() { + //given + + //when + + //then + } + + @Test + @DisplayName("타입별 조회 실패 테스트 케이스") + void findByTypeFailTest() { + //given + + //when + + //then + + } + + @Test + @DisplayName("id 조회 실패 테스트 케이스") + void findByIdFailTest() { + //given + + //when + + //then + } + + @Test + @DisplayName("수정 실패 테스트 케이스") + void updateFailTest() { + //given + + //when + + //then + } + + @Test + @DisplayName("id를 이용한 삭제 실패 테스트 케이스") + void deleteByIdFailTest() { + //given + + //when + + //then + } + + @Test + @DisplayName("모든 고객 삭제 실패 테스트 케이스") + void deleteByAllFailTest() { + //given + + //when + + //then + } + + @Test + @DisplayName("저장된 CustomerId 체크 실패 테스트 케이스") + void existByIdFailTest() { + //given + + //when + + //then + } +} \ No newline at end of file diff --git a/src/test/java/com/prgrms/springbootbasic/service/voucher/VoucherServiceTest.java b/src/test/java/com/prgrms/springbootbasic/service/voucher/VoucherServiceTest.java new file mode 100644 index 0000000000..d097648f70 --- /dev/null +++ b/src/test/java/com/prgrms/springbootbasic/service/voucher/VoucherServiceTest.java @@ -0,0 +1,240 @@ +package com.prgrms.springbootbasic.service.voucher; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import com.prgrms.springbootbasic.dto.voucher.request.VoucherCreateRequest; +import com.prgrms.springbootbasic.dto.voucher.request.VoucherUpdateRequest; +import com.prgrms.springbootbasic.dto.voucher.response.VoucherListResponse; +import com.prgrms.springbootbasic.dto.voucher.response.VoucherResponse; +import com.prgrms.springbootbasic.enums.voucher.VoucherType; +import java.time.LocalDateTime; +import java.util.NoSuchElementException; +import java.util.UUID; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.transaction.annotation.Transactional; + +@ActiveProfiles("test") +@SpringBootTest +@Transactional +class VoucherServiceTest { + + @Autowired + private VoucherService voucherService; + + private VoucherResponse createdVoucher; + + @BeforeEach + void init() { + VoucherCreateRequest request = new VoucherCreateRequest(10000, VoucherType.FIXED, LocalDateTime.now()); + createdVoucher = voucherService.createVoucher(request); + } + + + //해피 케이스 테스트 + @Test + @DisplayName("바우처 생성 테스트") + void createVoucherTest() { + //given + VoucherCreateRequest request = new VoucherCreateRequest(10000, VoucherType.FIXED, LocalDateTime.now()); + + //when + VoucherResponse response = voucherService.createVoucher(request); + + //then + assertNotNull(response); + assertNotNull(response.getVoucherId()); + assertEquals(request.getDiscount(), response.getDiscount()); + assertEquals(request.getType(), response.getType()); + assertNotNull(response.getCreateAt()); + } + + @Test + @DisplayName("저장된 모든 바우처 조회") + void findByAllTest() { + //given + + //when + VoucherListResponse response = voucherService.findAllVouchers(); + + //then + assertNotNull(response); + assertFalse(response.getVoucherResponseList().isEmpty()); + } + + @Test + @DisplayName("바우처 조회 - 생성일 순으로 조회") + void findByCreatedAtTest() { + //given + + //when + VoucherListResponse response = voucherService.findByCreateAt(); + + //then + assertNotNull(response); + assertFalse(response.getVoucherResponseList().isEmpty()); + } + + @Test + @DisplayName("바우처 타입별로 조회") + void findByTypeTest() { + //given + VoucherType type = VoucherType.FIXED; + + //when + VoucherListResponse response = voucherService.findByType(type); + + //then + assertNotNull(response); + assertFalse(response.getVoucherResponseList().isEmpty()); + } + + @Test + @DisplayName("바우처 조회 - id를 통해서 조회") + void findByIdTest() { + //given + UUID voucherId = createdVoucher.getVoucherId(); + + //when + VoucherResponse response = voucherService.findById(voucherId); + + //then + assertNotNull(response); + assertEquals(voucherId, response.getVoucherId()); + } + + @Test + @DisplayName("바우처 수정 테스트") + void updateVoucherTest() { + //given + UUID voucherId = createdVoucher.getVoucherId(); + long newDiscount = 20000; + VoucherUpdateRequest request = new VoucherUpdateRequest(voucherId, newDiscount); + + //when + voucherService.updateVoucher(request); + VoucherResponse updatedVoucher = voucherService.findById(voucherId); + + //then + assertEquals(newDiscount, updatedVoucher.getDiscount()); + } + + @Test + @DisplayName("바우처 삭제 - id를 통해서 삭제") + void deleteByIdTest() { + //given + UUID voucherId = createdVoucher.getVoucherId(); + + //when + int result = voucherService.deleteById(voucherId); + + //then + assertEquals(1, result); + assertThrows(IllegalArgumentException.class, () -> voucherService.findById(voucherId)); + } + + @Test + @DisplayName("바우처 삭제 - 저장된 모든 바우처 삭제") + void deleteByAllTest() { + //given + + //when + voucherService.deleteAllVoucher(); + + //then + VoucherListResponse response = voucherService.findAllVouchers(); + assertTrue(response.getVoucherResponseList().isEmpty()); + } + + + //엣지 케이스 + @Test + @DisplayName("바우처 생성 실패 테스트 케이스") + void createFailTest() { + //given + VoucherCreateRequest request = new VoucherCreateRequest(-10000, VoucherType.FIXED, LocalDateTime.now()); + + //then + assertThrows(IllegalArgumentException.class, () -> voucherService.createVoucher(request)); + } + + @Test + @DisplayName("모든 바우처 조회 실패 테스트 케이스") + void findAllFailTest() { + //given + voucherService.deleteAllVoucher(); + + //when + VoucherListResponse response = voucherService.findAllVouchers(); + + //then + assertTrue(response.getVoucherResponseList().isEmpty()); + } + + @Test + @DisplayName("생성일 순 조회 실패 테스트 케이스") + void findByCreatedAtFailTest() { + //given + voucherService.deleteAllVoucher(); + + //when + VoucherListResponse response = voucherService.findByCreateAt(); + + //then + assertTrue(response.getVoucherResponseList().isEmpty()); + } + + + @Test + @DisplayName("id 조회 실패 테스트 케이스") + void findByIdFailTest() { + //given + UUID nonExistentVoucherId = UUID.randomUUID(); + + //then + assertThrows(IllegalArgumentException.class, () -> voucherService.findById(nonExistentVoucherId)); + } + + @Test + @DisplayName("수정 실패 테스트 케이스") + void updateFailTest() { + //given + UUID nonExistentVoucherId = UUID.randomUUID(); + VoucherUpdateRequest request = new VoucherUpdateRequest(nonExistentVoucherId, 20000); + + //when - then + assertThrows(IllegalArgumentException.class, () -> voucherService.updateVoucher(request)); + } + + @Test + @DisplayName("id를 이용한 삭제 실패 테스트 케이스") + void deleteByIdFailTest() { + //given + UUID nonExistentVoucherId = UUID.randomUUID(); + + //when - then + assertThrows(NoSuchElementException.class, () -> voucherService.deleteById(nonExistentVoucherId)); + } + + @Test + @DisplayName("저장된 VoucherId 체크 실패 테스트 케이스") + void existByIdFailTest() { + //given + UUID nonExistentVoucherId = UUID.randomUUID(); + + //when + boolean result = voucherService.existById(nonExistentVoucherId); + + //then + assertFalse(result); + } +} + diff --git a/src/test/java/resources/application.yaml b/src/test/java/resources/application.yaml new file mode 100644 index 0000000000..3f9e94e897 --- /dev/null +++ b/src/test/java/resources/application.yaml @@ -0,0 +1,12 @@ +spring: + config: + activate: + on-profile: test + datasource: + driver-class-name: org.h2.Driver + url: jdbc:h2:mem:test; + username: sa + password: + sql: + init: + mode: always