diff --git a/src/main/java/com/prgrms/springbootbasic/ConsoleApplication.java b/src/main/java/com/prgrms/springbootbasic/ConsoleApplication.java index a6dbcf9747..1f863ec328 100644 --- a/src/main/java/com/prgrms/springbootbasic/ConsoleApplication.java +++ b/src/main/java/com/prgrms/springbootbasic/ConsoleApplication.java @@ -1,7 +1,7 @@ package com.prgrms.springbootbasic; -import com.prgrms.springbootbasic.controller.VoucherController; -import com.prgrms.springbootbasic.domain.Voucher; +import com.prgrms.springbootbasic.controller.voucher.VoucherController; +import com.prgrms.springbootbasic.domain.voucher.Voucher; import com.prgrms.springbootbasic.enums.Command; import com.prgrms.springbootbasic.enums.VoucherType; import com.prgrms.springbootbasic.view.Console; @@ -25,31 +25,41 @@ 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; + try { + String command = console.inputCommand(); + Command inputCommand = Command.of(command); + + switch (inputCommand) { + case CREATE -> createVoucher(); + case LIST -> getVoucherList(); + case EXIT -> { + console.printMessage("프로그램을 종료합니다."); + return; + } } + } catch (IllegalArgumentException e) { + log.error("명령어가 잘못 입력되었습니다. ", e.getMessage()); + } catch (Exception e) { + log.error("프로그램에서 오류가 발생하였습니다.", e.getMessage()); } } } - private void createVoucher() { + public void createVoucher() { String voucherTypeInput = console.inputVoucherType(); - VoucherType voucherType = VoucherType.checkVoucherType(voucherTypeInput); + VoucherType voucherType = VoucherType.of(voucherTypeInput); long voucherDiscount = console.inputVoucherDiscount(); - voucherController.createVoucher(voucherType, voucherDiscount); - console.printMessage("바우처가 생성되었습니다!"); + try { + voucherController.createVoucher(voucherType, voucherDiscount); + console.printMessage("바우처가 생성되었습니다!"); + } catch (IllegalArgumentException e) { + console.printMessage("생성할 바우처의 금액의 범위를 다시 한번 확인해주세요!"); + } } - private void getVoucherList() { + public void getVoucherList() { Map voucherMap = voucherController.printVoucherList(); console.printlnVoucherList(voucherMap); } diff --git a/src/main/java/com/prgrms/springbootbasic/controller/VoucherController.java b/src/main/java/com/prgrms/springbootbasic/controller/voucher/VoucherController.java similarity index 74% rename from src/main/java/com/prgrms/springbootbasic/controller/VoucherController.java rename to src/main/java/com/prgrms/springbootbasic/controller/voucher/VoucherController.java index f8fdd10aba..22e6f2a655 100644 --- a/src/main/java/com/prgrms/springbootbasic/controller/VoucherController.java +++ b/src/main/java/com/prgrms/springbootbasic/controller/voucher/VoucherController.java @@ -1,8 +1,8 @@ -package com.prgrms.springbootbasic.controller; +package com.prgrms.springbootbasic.controller.voucher; -import com.prgrms.springbootbasic.domain.Voucher; +import com.prgrms.springbootbasic.domain.voucher.Voucher; import com.prgrms.springbootbasic.enums.VoucherType; -import com.prgrms.springbootbasic.service.VoucherService; +import com.prgrms.springbootbasic.service.voucher.VoucherService; import java.util.Map; import java.util.UUID; import lombok.AllArgsConstructor; diff --git a/src/main/java/com/prgrms/springbootbasic/domain/FixedDiscountVoucher.java b/src/main/java/com/prgrms/springbootbasic/domain/voucher/FixedDiscountVoucher.java similarity index 89% rename from src/main/java/com/prgrms/springbootbasic/domain/FixedDiscountVoucher.java rename to src/main/java/com/prgrms/springbootbasic/domain/voucher/FixedDiscountVoucher.java index 32a18db515..50921b26bb 100644 --- a/src/main/java/com/prgrms/springbootbasic/domain/FixedDiscountVoucher.java +++ b/src/main/java/com/prgrms/springbootbasic/domain/voucher/FixedDiscountVoucher.java @@ -1,4 +1,4 @@ -package com.prgrms.springbootbasic.domain; +package com.prgrms.springbootbasic.domain.voucher; import com.prgrms.springbootbasic.enums.VoucherType; import java.util.UUID; @@ -14,7 +14,7 @@ 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/voucher/PercentDiscountVoucher.java similarity index 90% rename from src/main/java/com/prgrms/springbootbasic/domain/PercentDiscountVoucher.java rename to src/main/java/com/prgrms/springbootbasic/domain/voucher/PercentDiscountVoucher.java index 79f0da996b..950cedf6cc 100644 --- a/src/main/java/com/prgrms/springbootbasic/domain/PercentDiscountVoucher.java +++ b/src/main/java/com/prgrms/springbootbasic/domain/voucher/PercentDiscountVoucher.java @@ -1,4 +1,4 @@ -package com.prgrms.springbootbasic.domain; +package com.prgrms.springbootbasic.domain.voucher; import com.prgrms.springbootbasic.enums.VoucherType; import java.util.UUID; diff --git a/src/main/java/com/prgrms/springbootbasic/domain/Voucher.java b/src/main/java/com/prgrms/springbootbasic/domain/voucher/Voucher.java similarity index 79% rename from src/main/java/com/prgrms/springbootbasic/domain/Voucher.java rename to src/main/java/com/prgrms/springbootbasic/domain/voucher/Voucher.java index c88e35ecd4..d38d0c7dac 100644 --- a/src/main/java/com/prgrms/springbootbasic/domain/Voucher.java +++ b/src/main/java/com/prgrms/springbootbasic/domain/voucher/Voucher.java @@ -1,4 +1,4 @@ -package com.prgrms.springbootbasic.domain; +package com.prgrms.springbootbasic.domain.voucher; import com.prgrms.springbootbasic.enums.VoucherType; import java.util.UUID; diff --git a/src/main/java/com/prgrms/springbootbasic/enums/Command.java b/src/main/java/com/prgrms/springbootbasic/enums/Command.java index 6d8874912c..6de5f2b858 100644 --- a/src/main/java/com/prgrms/springbootbasic/enums/Command.java +++ b/src/main/java/com/prgrms/springbootbasic/enums/Command.java @@ -9,7 +9,7 @@ public static Command of(String inputCommand) { try { return Command.valueOf(inputCommand.toUpperCase()); } catch (IllegalArgumentException e) { - throw new IllegalArgumentException("잘못된 명령어 입력입니다. 다시 입력해주세요. " + inputCommand); + throw new IllegalArgumentException("잘못된 명령어 입력입니다. 프로그램 종료(exit),바우처 생성(create), 바우처 목록 조회(list) 중 하나를 입력해주세요."); } } } \ No newline at end of file diff --git a/src/main/java/com/prgrms/springbootbasic/enums/VoucherType.java b/src/main/java/com/prgrms/springbootbasic/enums/VoucherType.java index 135082a87c..ec690a8455 100644 --- a/src/main/java/com/prgrms/springbootbasic/enums/VoucherType.java +++ b/src/main/java/com/prgrms/springbootbasic/enums/VoucherType.java @@ -9,7 +9,7 @@ public static VoucherType of(String voucherType) { try { return VoucherType.valueOf(voucherType.toUpperCase()); } catch (IllegalArgumentException e) { - throw new IllegalArgumentException("잘못된 바우처 타입입니다." + voucherType); + throw new IllegalArgumentException("잘못된 바우처 타입을 입력하셨습니다. 고정 할인 바우처(fixed) 또는 비율 할인 바우처(percent)를 선택해서 다시 입력해주세요!"); } } } 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/MemoryVoucherRepository.java b/src/main/java/com/prgrms/springbootbasic/repository/voucher/MemoryVoucherRepository.java similarity index 83% rename from src/main/java/com/prgrms/springbootbasic/repository/MemoryVoucherRepository.java rename to src/main/java/com/prgrms/springbootbasic/repository/voucher/MemoryVoucherRepository.java index c43e9bb1eb..1a05353948 100644 --- a/src/main/java/com/prgrms/springbootbasic/repository/MemoryVoucherRepository.java +++ b/src/main/java/com/prgrms/springbootbasic/repository/voucher/MemoryVoucherRepository.java @@ -1,6 +1,6 @@ -package com.prgrms.springbootbasic.repository; +package com.prgrms.springbootbasic.repository.voucher; -import com.prgrms.springbootbasic.domain.Voucher; +import com.prgrms.springbootbasic.domain.voucher.Voucher; import java.util.Collections; import java.util.LinkedHashMap; import java.util.Map; 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..8ef826db67 --- /dev/null +++ b/src/main/java/com/prgrms/springbootbasic/repository/voucher/VoucherJdbcRepository.java @@ -0,0 +1,5 @@ +package com.prgrms.springbootbasic.repository.voucher; + +public class VoucherJdbcRepository { + +} 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..68ac898c7d --- /dev/null +++ b/src/main/java/com/prgrms/springbootbasic/repository/voucher/VoucherRepository.java @@ -0,0 +1,12 @@ +package com.prgrms.springbootbasic.repository.voucher; + +import com.prgrms.springbootbasic.domain.voucher.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/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/voucher/VoucherService.java b/src/main/java/com/prgrms/springbootbasic/service/voucher/VoucherService.java new file mode 100644 index 0000000000..7e41cf5135 --- /dev/null +++ b/src/main/java/com/prgrms/springbootbasic/service/voucher/VoucherService.java @@ -0,0 +1,53 @@ +package com.prgrms.springbootbasic.service.voucher; + +import com.prgrms.springbootbasic.domain.voucher.FixedDiscountVoucher; +import com.prgrms.springbootbasic.domain.voucher.PercentDiscountVoucher; +import com.prgrms.springbootbasic.domain.voucher.Voucher; +import com.prgrms.springbootbasic.enums.VoucherType; +import com.prgrms.springbootbasic.repository.voucher.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) { + try { + isValidDiscount(type, discount); + Voucher voucher = switch (type) { + case FIXED -> new FixedDiscountVoucher(discount); + case PERCENT -> new PercentDiscountVoucher(discount); + }; + return voucherRepository.insert(voucher); + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); + throw e; + } + } + + public void isValidDiscount(VoucherType type, long discount) { + switch (type) { + case FIXED: + if (discount <= 0) { + throw new IllegalArgumentException("고정 할인 바우처의 입력 금액은 0 이하를 입력할 수 없습니다."); + } + break; + case PERCENT: + if (discount < 1 || discount > 99) { + throw new IllegalArgumentException("퍼센트 할인 바우처의 할인 퍼센트는 1 ~ 99까지의 숫자를 입력해야 합니다."); + } + break; + } + } + + public Map fetchAllVouchers() { + return voucherRepository.getAllVouchersList(); + } +} diff --git a/src/main/java/com/prgrms/springbootbasic/view/Console.java b/src/main/java/com/prgrms/springbootbasic/view/Console.java index b7d8664485..b0ca39c720 100644 --- a/src/main/java/com/prgrms/springbootbasic/view/Console.java +++ b/src/main/java/com/prgrms/springbootbasic/view/Console.java @@ -1,6 +1,6 @@ package com.prgrms.springbootbasic.view; -import com.prgrms.springbootbasic.domain.Voucher; +import com.prgrms.springbootbasic.domain.voucher.Voucher; import java.util.Map; import java.util.Scanner; import java.util.UUID; @@ -26,13 +26,14 @@ public String inputCommand() { @Override public String inputVoucherType() { - System.out.print("생성할 voucher의 종류를 입력해주세요.(FixedDiscountVoucher, PercentDiscountVoucher) : "); + System.out.print("생성할 voucher의 종류를 입력해주세요.(fixed(고정 할인 바우처) , percent(퍼센트 할인 바우처) : "); return input.nextLine(); } @Override public long inputVoucherDiscount() { System.out.println("생성할 voucher의 금액을 입력해주세요!"); + System.out.print("Discount : "); return Long.parseLong(input.nextLine()); } @@ -49,7 +50,7 @@ public void printlnVoucherList(Map voucherMap) { } System.out.println("생성된 Voucher의 목록은 다음과 같습니다."); for (Voucher voucher : voucherMap.values()) { - System.out.println("Voucher Type: " + voucher.getVoucherType() + " + Discount" + voucher.getDiscount()); + System.out.println("Voucher Type: " + voucher.getVoucherType() + ", 해당 Voucher의 Discount: " + voucher.getDiscount() + " 입니다."); } } } diff --git a/src/main/java/com/prgrms/springbootbasic/view/Output.java b/src/main/java/com/prgrms/springbootbasic/view/Output.java index 1172024edd..d79cdb5f96 100644 --- a/src/main/java/com/prgrms/springbootbasic/view/Output.java +++ b/src/main/java/com/prgrms/springbootbasic/view/Output.java @@ -1,6 +1,6 @@ package com.prgrms.springbootbasic.view; -import com.prgrms.springbootbasic.domain.Voucher; +import com.prgrms.springbootbasic.domain.voucher.Voucher; import java.util.Map; import java.util.UUID; 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/controller/VoucherControllerTest.java b/src/test/java/com/prgrms/springbootbasic/controller/VoucherControllerTest.java new file mode 100644 index 0000000000..097da97c0a --- /dev/null +++ b/src/test/java/com/prgrms/springbootbasic/controller/VoucherControllerTest.java @@ -0,0 +1,63 @@ +package com.prgrms.springbootbasic.controller; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import com.prgrms.springbootbasic.controller.voucher.VoucherController; +import com.prgrms.springbootbasic.domain.voucher.Voucher; +import com.prgrms.springbootbasic.enums.VoucherType; +import com.prgrms.springbootbasic.service.voucher.VoucherService; +import java.util.Collections; +import java.util.Map; +import java.util.UUID; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +class VoucherControllerTest { + + @Mock + private VoucherService voucherService; + + private VoucherController voucherController; + + @BeforeEach + void setUp() { + MockitoAnnotations.openMocks(this); + voucherController = new VoucherController(voucherService); + } + + @Test + @DisplayName("바우처 목록 validation 테스트") + void getVoucherListControllerTest() { + // given + Map voucherMap = Collections.emptyMap(); + when(voucherService.fetchAllVouchers()).thenReturn(voucherMap); + + // when + Map voucherList = voucherController.printVoucherList(); + + // then + assertThat(voucherList).isEmpty(); + verify(voucherService, times(1)).fetchAllVouchers(); + } + + @Test + @DisplayName("바우처 생성 validation 테스트") + void getVoucherCreateControllerTest() { + // given + long discount = 10000; + + // when + voucherController.createVoucher(VoucherType.FIXED, discount); + + // then + verify(voucherService, times(1)).createVoucher(VoucherType.FIXED, discount); + } +} + + diff --git a/src/test/java/com/prgrms/springbootbasic/domain/FixedDiscountVoucherTest.java b/src/test/java/com/prgrms/springbootbasic/domain/FixedDiscountVoucherTest.java new file mode 100644 index 0000000000..4a90bf9def --- /dev/null +++ b/src/test/java/com/prgrms/springbootbasic/domain/FixedDiscountVoucherTest.java @@ -0,0 +1,40 @@ +package com.prgrms.springbootbasic.domain; + +import static org.assertj.core.api.Assertions.assertThat; + +import com.prgrms.springbootbasic.domain.voucher.FixedDiscountVoucher; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +class FixedDiscountVoucherTest { + + @Test + @DisplayName("고정 할인 바우처 생성 테스트") + void createFixedVoucherTest() { + // given + long discount = 10000; + + // when + FixedDiscountVoucher fixedDiscountVoucher = new FixedDiscountVoucher(discount); + + // then + assertThat(fixedDiscountVoucher.getDiscount()).isEqualTo(discount); + } + + @ParameterizedTest + @CsvSource({"1000, 10000", "200000, 5000"}) + @DisplayName("여러 개 고정 할인 바우처 확인 테스트") + void createdFixDiscountVoucherEquals(long discount1, long discount2) { + // given + FixedDiscountVoucher fixedDiscountVoucher1 = new FixedDiscountVoucher(discount1); + FixedDiscountVoucher fixedDiscountVoucher2 = new FixedDiscountVoucher(discount2); + + // when + + // then + assertThat(fixedDiscountVoucher1.getDiscount()).isEqualTo(discount1); + assertThat(fixedDiscountVoucher2.getDiscount()).isEqualTo(discount2); + } +} diff --git a/src/test/java/com/prgrms/springbootbasic/domain/PercentDiscountVoucherTest.java b/src/test/java/com/prgrms/springbootbasic/domain/PercentDiscountVoucherTest.java new file mode 100644 index 0000000000..a346a78ef2 --- /dev/null +++ b/src/test/java/com/prgrms/springbootbasic/domain/PercentDiscountVoucherTest.java @@ -0,0 +1,38 @@ +package com.prgrms.springbootbasic.domain; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import com.prgrms.springbootbasic.domain.voucher.PercentDiscountVoucher; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +class PercentDiscountVoucherTest { + + @Test + @DisplayName("비율 할인 바우처 생성 테스트") + void createPercentDiscountVoucher() { + // given + long discount = 20; + + // when + PercentDiscountVoucher percentDiscountVoucher = new PercentDiscountVoucher(discount); + + // then + assertEquals(discount, percentDiscountVoucher.getDiscount()); + } + + @ParameterizedTest + @CsvSource({"10", "30", "50", "70"}) + @DisplayName("생성된 여러 개의 할인 바우처 확인 테스트") + void createdPercentDiscountVoucherEquals(long discount) { + // given + PercentDiscountVoucher percentDiscountVoucher = new PercentDiscountVoucher(discount); + + // when + + // then + assertEquals(discount, percentDiscountVoucher.getDiscount()); + } +} diff --git a/src/test/java/com/prgrms/springbootbasic/service/VoucherServiceTest.java b/src/test/java/com/prgrms/springbootbasic/service/VoucherServiceTest.java new file mode 100644 index 0000000000..8ec2b40f19 --- /dev/null +++ b/src/test/java/com/prgrms/springbootbasic/service/VoucherServiceTest.java @@ -0,0 +1,121 @@ +package com.prgrms.springbootbasic.service; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoInteractions; +import static org.mockito.Mockito.when; + +import com.prgrms.springbootbasic.domain.voucher.FixedDiscountVoucher; +import com.prgrms.springbootbasic.domain.voucher.PercentDiscountVoucher; +import com.prgrms.springbootbasic.domain.voucher.Voucher; +import com.prgrms.springbootbasic.enums.VoucherType; +import com.prgrms.springbootbasic.repository.voucher.VoucherRepository; +import com.prgrms.springbootbasic.service.voucher.VoucherService; +import java.util.Map; +import java.util.UUID; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.mockito.ArgumentCaptor; +import org.mockito.Captor; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +class VoucherServiceTest { + + @Mock + private VoucherRepository voucherRepository; + + private VoucherService voucherService; + + @Captor + private ArgumentCaptor voucherCaptor; + + public VoucherServiceTest() { + MockitoAnnotations.openMocks(this); + voucherService = new VoucherService(voucherRepository); + } + + @Test + @DisplayName("고정 할인 바우처 생성 테스트") + void createFixedDiscountVoucherTest() { + // given + long discount = 10000; + + // when + voucherService.createVoucher(VoucherType.FIXED, discount); + + // then + verify(voucherRepository, times(1)).insert(voucherCaptor.capture()); + Voucher capturedVoucher = voucherCaptor.getValue(); + + assertThat(capturedVoucher).isInstanceOf(FixedDiscountVoucher.class); + assertThat(capturedVoucher.getDiscount()).isEqualTo(discount); + } + + @Test + @DisplayName("비율 할인 바우처 생성 테스트") + void createPercentDiscountVoucherTest() { + // given + long discount = 20; + + // when + voucherService.createVoucher(VoucherType.PERCENT, discount); + + // then + verify(voucherRepository, times(1)).insert(voucherCaptor.capture()); + Voucher capturedVoucher = voucherCaptor.getValue(); + + assertThat(capturedVoucher).isInstanceOf(PercentDiscountVoucher.class); + assertThat(capturedVoucher.getDiscount()).isEqualTo(discount); + } + + @Test + @DisplayName("고정 할인 바우처 생성 시 입력 금액이 0 이하인 경우 예외가 발생함") + void createFixedDiscountVoucherWithInvalidDiscountTest() { + // given + long discount = -100; + + // when + assertThatThrownBy(() -> voucherService.createVoucher(VoucherType.FIXED, discount)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("고정 할인 바우처의 입력 금액은 0 이하를 입력할 수 없습니다."); + + // then + verifyNoInteractions(voucherRepository); + } + + @Test + @DisplayName("비율 할인 바우처 생성 시 할인 퍼센트가 1 미만 또는 99 초과인 경우 예외가 발생함") + void createPercentDiscountVoucherWithInvalidDiscountTest() { + // given + long discount = 110; + + // when + assertThatThrownBy(() -> voucherService.createVoucher(VoucherType.PERCENT, discount)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("퍼센트 할인 바우처의 할인 퍼센트는 1 ~ 99까지의 숫자를 입력해야 합니다."); + + // then + verifyNoInteractions(voucherRepository); + } + + @Test + @DisplayName("모든 바우처 목록 조회 테스트") + void fetchAllVouchersTest() { + // given + Map voucherMap = Map.of( + UUID.randomUUID(), new FixedDiscountVoucher(10000), + UUID.randomUUID(), new PercentDiscountVoucher(20) + ); + when(voucherRepository.getAllVouchersList()).thenReturn(voucherMap); + + // when + Map fetchedVouchers = voucherService.fetchAllVouchers(); + + // then + assertThat(fetchedVouchers).isEqualTo(voucherMap); + verify(voucherRepository, times(1)).getAllVouchersList(); + } +} diff --git a/src/test/java/com/prgrms/springbootbasic/view/ConsoleApplicationTest.java b/src/test/java/com/prgrms/springbootbasic/view/ConsoleApplicationTest.java new file mode 100644 index 0000000000..e7bbc8f3ec --- /dev/null +++ b/src/test/java/com/prgrms/springbootbasic/view/ConsoleApplicationTest.java @@ -0,0 +1,102 @@ +package com.prgrms.springbootbasic.view; + +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import com.prgrms.springbootbasic.ConsoleApplication; +import com.prgrms.springbootbasic.controller.voucher.VoucherController; +import com.prgrms.springbootbasic.domain.voucher.Voucher; +import com.prgrms.springbootbasic.enums.VoucherType; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +class ConsoleApplicationTest { + + @Mock + private Console console; + + @Mock + private VoucherController voucherController; + + private ConsoleApplication consoleApplication; + + @BeforeEach + void setUp() { + MockitoAnnotations.openMocks(this); + consoleApplication = new ConsoleApplication(console, voucherController); + } + + @Test + @DisplayName("바우처 생성 테스트") + void createVoucherTest() { + // given + String voucherTypeInput = "FIXED"; + VoucherType voucherType = VoucherType.FIXED; + long voucherDiscount = 10000; + + Voucher dummyVoucher = mock(Voucher.class); + + when(console.inputVoucherType()).thenReturn(voucherTypeInput); + when(console.inputVoucherDiscount()).thenReturn(voucherDiscount); + doNothing().when(voucherController).createVoucher(voucherType, voucherDiscount); + + // when + consoleApplication.createVoucher(); + + // then + verify(console).printMessage("바우처가 생성되었습니다!"); + verify(voucherController).createVoucher(voucherType, voucherDiscount); + } + + + @Test + @DisplayName("바우처 목록 조회 테스트") + void getVoucherListTest() { + // given + Map voucherMap = createDummyVoucherMap(); + + when(voucherController.printVoucherList()).thenReturn(voucherMap); + + // when + consoleApplication.getVoucherList(); + + // then + verify(console).printlnVoucherList(voucherMap); + verify(voucherController).printVoucherList(); + } + + private Map createDummyVoucherMap() { + Map voucherMap = new HashMap<>(); + voucherMap.put(UUID.randomUUID(), createDummyVoucher(VoucherType.FIXED, 10000)); + return voucherMap; + } + + private Voucher createDummyVoucher(VoucherType type, long discount) { + return new Voucher() { + @Override + public UUID getVoucherId() { + return UUID.randomUUID(); + } + + @Override + public long getDiscount() { + return discount; + } + + @Override + public VoucherType getVoucherType() { + return type; + } + }; + } +} + +