From 46e0d05e70fb28562e72bf09318ae73a36d56930 Mon Sep 17 00:00:00 2001 From: Fredo Melvern Tanzil Date: Fri, 1 Mar 2024 09:17:38 +0700 Subject: [PATCH 01/22] [RED] Add tests for Order model --- .../ui/cs/advprog/eshop/model/OrderTest.java | 88 +++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 src/test/java/id/ac/ui/cs/advprog/eshop/model/OrderTest.java diff --git a/src/test/java/id/ac/ui/cs/advprog/eshop/model/OrderTest.java b/src/test/java/id/ac/ui/cs/advprog/eshop/model/OrderTest.java new file mode 100644 index 0000000..e3f6e3b --- /dev/null +++ b/src/test/java/id/ac/ui/cs/advprog/eshop/model/OrderTest.java @@ -0,0 +1,88 @@ +package id.ac.ui.cs.advprog.eshop.model; + + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +class OrderTest { + private List products; + + @BeforeEach + void setUp() { + this.products = new ArrayList<>(); + + Product product1 = new Product(); + product1.setProductId("eb558e9f-1c39-460e-8860-71af6af63bd6"); + product1.setProductName("Sampo Cap Bambang"); + product1.setProductQuantity(2); + + Product product2 = new Product(); + product2.setProductId("a2c62328-4a37-4664-83c7-f32db8620155"); + product2.setProductName("Sabun Cap Usep"); + product2.setProductQuantity(1); + + this.products.add(product1); + this.products.add(product2); + } + + + @Test + void testCreateOrderEmptyProduct() { + this.products.clear(); + + assertThrows(IllegalArgumentException.class, () -> { + Order order = new Order("13652556-012a-4c07-b546-54eb1396d79b", this.products, 1708560000L, "Safira Sudrajat"); + }); + } + + @Test + void testCreateOrderDefaultStatus() { + Order order = new Order("13652556-012a-4c07-b546-54eb1396d79b", this.products, 1788560000L, "Safira Sudrajat"); + + assertSame(this.products, order.getProducts()); + assertEquals(2, order.getProducts().size()); + assertEquals("Sampo Cap Bambang", order.getProducts().get(0).getProductName()); + assertEquals("Sabun Cap Usep", order.getProducts().get(1).getProductName()); + assertEquals("13652556-012a-4c07-b546-54eb1396d79b", order.getId()); + assertEquals(1708560000L, order.getOrderTime()); + assertEquals("Safira Sudrajat", order.getAuthor()); + assertEquals("WAITING_PAYMENT", order.getStatus()); + + } + + + @Test + void testCreateOrderSuccessStatus() { + Order order = new Order("13652556-012a-4c07-b546-54eb1396d79b", + this.products, 1708560000L, "Safira Sudrajat", "SUCCESS"); + assertEquals("SUCCESS", order.getStatus());\ + } + + + @Test + void testCreateOrderInvalidStatus() { + assertThrows (IllegalArgumentException.class, () -> { + Order order = new Order("13652556-012a-4c07-b546-54eb1396d79b", this.products, 1708560000L, "Safira Sudrajat", "MEOW"); + }); + } + + @Test + void testSetStatusToCancelled() { + Order order = new Order("13652556-012a-4c07-b546-54eb1396d79b", this.products, 1708560000L, author:"Safira Sudrajat"); + order.setStatus("CANCELLED"); + assertEquals("CANCELLED", order.getStatus()); + } + + + @Test + void testSetStatusToInvalidStatus() { + Order order = new Order("13652556-012a-4c07-b546-54eb1396d79b", this.products, 1708560000L, "Safira Sudrajat"); + assertThrows(IllegalArgumentException.class, () -> order.setStatus("MEOW")); + } + +} From 8985e9d9bfd1d1e75b93310e6cf976446f1592c0 Mon Sep 17 00:00:00 2001 From: Fredo Melvern Tanzil Date: Fri, 1 Mar 2024 09:22:19 +0700 Subject: [PATCH 02/22] [RED] Add Order model skeleton --- .../ac/ui/cs/advprog/eshop/model/Order.java | 26 +++++++++++++++++++ .../ui/cs/advprog/eshop/model/OrderTest.java | 4 +-- 2 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 src/main/java/id/ac/ui/cs/advprog/eshop/model/Order.java diff --git a/src/main/java/id/ac/ui/cs/advprog/eshop/model/Order.java b/src/main/java/id/ac/ui/cs/advprog/eshop/model/Order.java new file mode 100644 index 0000000..c9d1adb --- /dev/null +++ b/src/main/java/id/ac/ui/cs/advprog/eshop/model/Order.java @@ -0,0 +1,26 @@ +package id.ac.ui.cs.advprog.eshop.model; + + +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +@Builder +@Getter +public class Order { + + String id; + List products; + Long orderTime; + String author; + @Setter + String status; + + public Order(String id, List products, Long orderTime, String author) { + } + + public Order(String id, List products, Long orderTime, String author, String status) { + } +} diff --git a/src/test/java/id/ac/ui/cs/advprog/eshop/model/OrderTest.java b/src/test/java/id/ac/ui/cs/advprog/eshop/model/OrderTest.java index e3f6e3b..ad8241f 100644 --- a/src/test/java/id/ac/ui/cs/advprog/eshop/model/OrderTest.java +++ b/src/test/java/id/ac/ui/cs/advprog/eshop/model/OrderTest.java @@ -60,7 +60,7 @@ void testCreateOrderDefaultStatus() { void testCreateOrderSuccessStatus() { Order order = new Order("13652556-012a-4c07-b546-54eb1396d79b", this.products, 1708560000L, "Safira Sudrajat", "SUCCESS"); - assertEquals("SUCCESS", order.getStatus());\ + assertEquals("SUCCESS", order.getStatus()); } @@ -73,7 +73,7 @@ void testCreateOrderInvalidStatus() { @Test void testSetStatusToCancelled() { - Order order = new Order("13652556-012a-4c07-b546-54eb1396d79b", this.products, 1708560000L, author:"Safira Sudrajat"); + Order order = new Order("13652556-012a-4c07-b546-54eb1396d79b", this.products, 1708560000L, "Safira Sudrajat"); order.setStatus("CANCELLED"); assertEquals("CANCELLED", order.getStatus()); } From 3787cab84e29c6f46c1df1e5e96e82d8005a3ed6 Mon Sep 17 00:00:00 2001 From: Fredo Melvern Tanzil Date: Fri, 1 Mar 2024 09:35:23 +0700 Subject: [PATCH 03/22] [GREEN] Implement Order model --- .../ac/ui/cs/advprog/eshop/model/Order.java | 30 +++++++++++++++++-- .../ui/cs/advprog/eshop/model/OrderTest.java | 2 +- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/main/java/id/ac/ui/cs/advprog/eshop/model/Order.java b/src/main/java/id/ac/ui/cs/advprog/eshop/model/Order.java index c9d1adb..1a75527 100644 --- a/src/main/java/id/ac/ui/cs/advprog/eshop/model/Order.java +++ b/src/main/java/id/ac/ui/cs/advprog/eshop/model/Order.java @@ -3,8 +3,8 @@ import lombok.Builder; import lombok.Getter; -import lombok.Setter; +import java.util.Arrays; import java.util.List; @Builder @@ -15,12 +15,38 @@ public class Order { List products; Long orderTime; String author; - @Setter String status; public Order(String id, List products, Long orderTime, String author) { + this.id = id; + this.orderTime = orderTime; + this.author = author; + this.status = "WAITING_PAYMENT"; + + if (products.isEmpty()){ + throw new IllegalArgumentException(); + } else{ + this.products = products; + } } public Order(String id, List products, Long orderTime, String author, String status) { + this(id, products,orderTime, author); + + String[] statusList = {"WAITING_PAYMENT", "FAILED", "SUCCESS", "CANCELLED"}; + if (Arrays.stream(statusList).noneMatch(item -> (item.equals(status)))){ + throw new IllegalArgumentException(); + } else{ + this.status = status; + } + } + + public void setStatus(String status){ + String[] statusList = {"WAITING_PAYMENT", "FAILED", "SUCCESS", "CANCELLED"}; + if (Arrays.stream(statusList).noneMatch(item -> (item.equals(status)))){ + throw new IllegalArgumentException(); + } else{ + this.status = status; + } } } diff --git a/src/test/java/id/ac/ui/cs/advprog/eshop/model/OrderTest.java b/src/test/java/id/ac/ui/cs/advprog/eshop/model/OrderTest.java index ad8241f..b7c3953 100644 --- a/src/test/java/id/ac/ui/cs/advprog/eshop/model/OrderTest.java +++ b/src/test/java/id/ac/ui/cs/advprog/eshop/model/OrderTest.java @@ -42,7 +42,7 @@ void testCreateOrderEmptyProduct() { @Test void testCreateOrderDefaultStatus() { - Order order = new Order("13652556-012a-4c07-b546-54eb1396d79b", this.products, 1788560000L, "Safira Sudrajat"); + Order order = new Order("13652556-012a-4c07-b546-54eb1396d79b", this.products, 1708560000L, "Safira Sudrajat"); assertSame(this.products, order.getProducts()); assertEquals(2, order.getProducts().size()); From f31cdf7fda683b5625fc4ea541f571c565990e49 Mon Sep 17 00:00:00 2001 From: Fredo Melvern Tanzil Date: Fri, 1 Mar 2024 09:39:08 +0700 Subject: [PATCH 04/22] [REFACTOR] Add OrderStatus enum --- src/main/java/enums/OrderStatus.java | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 src/main/java/enums/OrderStatus.java diff --git a/src/main/java/enums/OrderStatus.java b/src/main/java/enums/OrderStatus.java new file mode 100644 index 0000000..c92f6ec --- /dev/null +++ b/src/main/java/enums/OrderStatus.java @@ -0,0 +1,26 @@ +package enums; + + +import lombok.Getter; + +@Getter +public enum OrderStatus { + WAITING_PAYMENT("WAITING_PAYMENT"), + FAILED("FAILED"), + SUCCESS("SUCCESS"), + CANCELLED("CANCELLED"); + + private final String value; + private OrderStatus (String value) { + this.value = value; + } + + public static boolean contains(String param) { + for (OrderStatus orderStatus : OrderStatus.values()) { + if (orderStatus.name().equals(param)) { + return true; + } + } + return false; + } +} \ No newline at end of file From 3f7e79661cd124d075e6a950178f6abc6fbcf5f4 Mon Sep 17 00:00:00 2001 From: Fredo Melvern Tanzil Date: Fri, 1 Mar 2024 09:41:43 +0700 Subject: [PATCH 05/22] [REFACTOR] Apply OrderStatus enum check to Order model --- .../id/ac/ui/cs/advprog/eshop/model/Order.java | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/src/main/java/id/ac/ui/cs/advprog/eshop/model/Order.java b/src/main/java/id/ac/ui/cs/advprog/eshop/model/Order.java index 1a75527..1661ffa 100644 --- a/src/main/java/id/ac/ui/cs/advprog/eshop/model/Order.java +++ b/src/main/java/id/ac/ui/cs/advprog/eshop/model/Order.java @@ -1,6 +1,7 @@ package id.ac.ui.cs.advprog.eshop.model; +import enums.OrderStatus; import lombok.Builder; import lombok.Getter; @@ -21,7 +22,7 @@ public Order(String id, List products, Long orderTime, String author) { this.id = id; this.orderTime = orderTime; this.author = author; - this.status = "WAITING_PAYMENT"; + this.status = OrderStatus.WAITING_PAYMENT.getValue(); if (products.isEmpty()){ throw new IllegalArgumentException(); @@ -32,21 +33,14 @@ public Order(String id, List products, Long orderTime, String author) { public Order(String id, List products, Long orderTime, String author, String status) { this(id, products,orderTime, author); - - String[] statusList = {"WAITING_PAYMENT", "FAILED", "SUCCESS", "CANCELLED"}; - if (Arrays.stream(statusList).noneMatch(item -> (item.equals(status)))){ - throw new IllegalArgumentException(); - } else{ - this.status = status; - } + this.setStatus(status); } public void setStatus(String status){ - String[] statusList = {"WAITING_PAYMENT", "FAILED", "SUCCESS", "CANCELLED"}; - if (Arrays.stream(statusList).noneMatch(item -> (item.equals(status)))){ - throw new IllegalArgumentException(); - } else{ + if (OrderStatus.contains(status)){ this.status = status; + } else{ + throw new IllegalArgumentException(); } } } From 1e7af95e748eca71dc453527adfb11918cfa80a5 Mon Sep 17 00:00:00 2001 From: Fredo Melvern Tanzil Date: Fri, 1 Mar 2024 09:46:22 +0700 Subject: [PATCH 06/22] [REFACTOR] Apply OrderStatus enum to Order model tests. --- .../java/id/ac/ui/cs/advprog/eshop/model/OrderTest.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/test/java/id/ac/ui/cs/advprog/eshop/model/OrderTest.java b/src/test/java/id/ac/ui/cs/advprog/eshop/model/OrderTest.java index b7c3953..4db752e 100644 --- a/src/test/java/id/ac/ui/cs/advprog/eshop/model/OrderTest.java +++ b/src/test/java/id/ac/ui/cs/advprog/eshop/model/OrderTest.java @@ -1,6 +1,7 @@ package id.ac.ui.cs.advprog.eshop.model; +import enums.OrderStatus; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -59,8 +60,8 @@ void testCreateOrderDefaultStatus() { @Test void testCreateOrderSuccessStatus() { Order order = new Order("13652556-012a-4c07-b546-54eb1396d79b", - this.products, 1708560000L, "Safira Sudrajat", "SUCCESS"); - assertEquals("SUCCESS", order.getStatus()); + this.products, 1708560000L, "Safira Sudrajat", OrderStatus.SUCCESS.getValue()); + assertEquals(OrderStatus.SUCCESS.getValue(), order.getStatus()); } @@ -74,8 +75,8 @@ void testCreateOrderInvalidStatus() { @Test void testSetStatusToCancelled() { Order order = new Order("13652556-012a-4c07-b546-54eb1396d79b", this.products, 1708560000L, "Safira Sudrajat"); - order.setStatus("CANCELLED"); - assertEquals("CANCELLED", order.getStatus()); + order.setStatus(OrderStatus.CANCELLED.getValue()); + assertEquals(OrderStatus.CANCELLED.getValue(), order.getStatus()); } From 34cdb6717e133a72103e67cfbd714077a3e9d4d3 Mon Sep 17 00:00:00 2001 From: Fredo Melvern Tanzil Date: Fri, 1 Mar 2024 10:05:49 +0700 Subject: [PATCH 07/22] [RED] Add tests for OrderRepository --- .../cs/advprog/eshop}/enums/OrderStatus.java | 2 +- .../ac/ui/cs/advprog/eshop/model/Order.java | 3 +- .../ui/cs/advprog/eshop/model/OrderTest.java | 2 +- .../eshop/repository/OrderRepositoryTest.java | 106 ++++++++++++++++++ 4 files changed, 109 insertions(+), 4 deletions(-) rename src/main/java/{ => id/ac/ui/cs/advprog/eshop}/enums/OrderStatus.java (92%) create mode 100644 src/test/java/id/ac/ui/cs/advprog/eshop/repository/OrderRepositoryTest.java diff --git a/src/main/java/enums/OrderStatus.java b/src/main/java/id/ac/ui/cs/advprog/eshop/enums/OrderStatus.java similarity index 92% rename from src/main/java/enums/OrderStatus.java rename to src/main/java/id/ac/ui/cs/advprog/eshop/enums/OrderStatus.java index c92f6ec..e53526d 100644 --- a/src/main/java/enums/OrderStatus.java +++ b/src/main/java/id/ac/ui/cs/advprog/eshop/enums/OrderStatus.java @@ -1,4 +1,4 @@ -package enums; +package id.ac.ui.cs.advprog.eshop.enums; import lombok.Getter; diff --git a/src/main/java/id/ac/ui/cs/advprog/eshop/model/Order.java b/src/main/java/id/ac/ui/cs/advprog/eshop/model/Order.java index 1661ffa..3d5d1e0 100644 --- a/src/main/java/id/ac/ui/cs/advprog/eshop/model/Order.java +++ b/src/main/java/id/ac/ui/cs/advprog/eshop/model/Order.java @@ -1,11 +1,10 @@ package id.ac.ui.cs.advprog.eshop.model; -import enums.OrderStatus; +import id.ac.ui.cs.advprog.eshop.enums.OrderStatus; import lombok.Builder; import lombok.Getter; -import java.util.Arrays; import java.util.List; @Builder diff --git a/src/test/java/id/ac/ui/cs/advprog/eshop/model/OrderTest.java b/src/test/java/id/ac/ui/cs/advprog/eshop/model/OrderTest.java index 4db752e..ff59cfb 100644 --- a/src/test/java/id/ac/ui/cs/advprog/eshop/model/OrderTest.java +++ b/src/test/java/id/ac/ui/cs/advprog/eshop/model/OrderTest.java @@ -1,7 +1,7 @@ package id.ac.ui.cs.advprog.eshop.model; -import enums.OrderStatus; +import id.ac.ui.cs.advprog.eshop.enums.OrderStatus; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/src/test/java/id/ac/ui/cs/advprog/eshop/repository/OrderRepositoryTest.java b/src/test/java/id/ac/ui/cs/advprog/eshop/repository/OrderRepositoryTest.java new file mode 100644 index 0000000..90d89cf --- /dev/null +++ b/src/test/java/id/ac/ui/cs/advprog/eshop/repository/OrderRepositoryTest.java @@ -0,0 +1,106 @@ +package id.ac.ui.cs.advprog.eshop.repository; + + +import id.ac.ui.cs.advprog.eshop.model.Order; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +class OrderRepositoryTest { + OrderRepository orderRepository; + List orders; + + @BeforeEach + void setUp() { + orderRepository = new OrderRepository(); + + List products = new ArrayList<>(); + Product product1 = new Product(); + product1.setProductId("eb558e9f-1c39-460e-8860-71af6af63bd6"); + product1.setProductName("Sampo Cap Bambang"); + product1.setProductQuantity(2); + products.add(product1); + + orders = new ArrayList<>(); + Order order1 = new Order("13652556-012a-4c07-b546-54eb1396d79b", products, 1708560000L, "Safira Sudrajat"); + orders.add(order1); + Order order2 = new Order("7f9e15bb-4b15-42f4-aebc-c3af385fb878", products, 1708570000L, "Safira Sudrajat"); + orders.add(order2); + Order order3 = new Order("e334ef48-9eff-4da8-9487-8ee697ecbf1e", products, 1708570000L, "Bambang Sudrajat"); + orders.add(order3); + } + + @Test + void testSaveCreate() { + Order order = orders.get(1); + Order result = orderRepository.save(order); + + Order findResult = orderRepository.findById(orders.get(1).getId()); + assertEquals(order.getId(), result.getId()); + assertEquals(order.getId(), findResult.getId()); + assertEquals(order.getOrderTime(), findResult.getOrderTime()); + assertEquals(order.getAuthor(), findResult.getAuthor()); + assertEquals(order.getStatus(), findResult.getStatus()); + } + + + @Test + void testSaveUpdate() { + Order order = orders.get(1); + orderRepository.save(order); + Order newOrder = new Order(order.getId(), order.getProducts(), order.getOrderTime(), order.getAuthor(), OrderStatus.SUCCESS.getValue()); + Order result = orderRepository.save(newOrder); + + Order findResult = orderRepository.findById(orders.get(1).getId()); + assertEquals(order.getId(), result.getId()); + assertEquals(order.getId(), findResult.getId()); + assertEquals(order.getOrderTime(), findResult.getOrderTime()); + assertEquals(order.getAuthor(), findResult.getAuthor()); + assertEquals(OrderStatus.SUCCESS.getValue(), find Result.getStatus()); + } + @Test + void testFindByIdIfIdFound() { + for (Order order : orders) { + orderRepository.save(order); + } + + Order findResult = orderRepository.findById(orders.get(1).getId()); + assertEquals(orders.get(1).getId(), findResult.getId()); + assertEquals(orders.get(1).getOrderTime(), findResult.getOrderTime()); + assertEquals(orders.get(1).getAuthor(), findResult.getAuthor()); + assertEquals(orders.get(1).getStatus(), findResult.getStatus()); + } + + @Test + void testFindByIdIfIdNotFound() { + for (Order order : orders) { + orderRepository.save(order); + } + + Order findResult = orderRepository.findById("zczc"); + assertNull(findResult); + } + + @Test + void testFindAllByAuthorIfAuthorCorrect(){ + for (Order order : orders){ + orderRepository.save(order); + } + + List orderList = orderRepository.findAllByAuthor( + orders.get(1).getAuthor()); + assertEquals(2, orderList.size()); + } + + @Test + void testFindAllBuAuthorIfAllLowercase(){ + orderRepository.save(orders.get(1)); + + List orderList = orderRepository.findAllByAuthor( + orders.get(1).getAuthor().toLowerCase()); + assertTrue(orderList.isEmpty()); + } +} From 753b0093dda8f84e95f6788d1e96060eab551484 Mon Sep 17 00:00:00 2001 From: Fredo Melvern Tanzil Date: Fri, 1 Mar 2024 10:08:02 +0700 Subject: [PATCH 08/22] fix tests on OrderRepository --- .../ui/cs/advprog/eshop/repository/OrderRepositoryTest.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/test/java/id/ac/ui/cs/advprog/eshop/repository/OrderRepositoryTest.java b/src/test/java/id/ac/ui/cs/advprog/eshop/repository/OrderRepositoryTest.java index 90d89cf..47e69fb 100644 --- a/src/test/java/id/ac/ui/cs/advprog/eshop/repository/OrderRepositoryTest.java +++ b/src/test/java/id/ac/ui/cs/advprog/eshop/repository/OrderRepositoryTest.java @@ -1,10 +1,13 @@ package id.ac.ui.cs.advprog.eshop.repository; +import id.ac.ui.cs.advprog.eshop.enums.OrderStatus; import id.ac.ui.cs.advprog.eshop.model.Order; +import id.ac.ui.cs.advprog.eshop.model.Product; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import java.util.ArrayList; import java.util.List; import static org.junit.jupiter.api.Assertions.*; @@ -59,7 +62,7 @@ void testSaveUpdate() { assertEquals(order.getId(), findResult.getId()); assertEquals(order.getOrderTime(), findResult.getOrderTime()); assertEquals(order.getAuthor(), findResult.getAuthor()); - assertEquals(OrderStatus.SUCCESS.getValue(), find Result.getStatus()); + assertEquals(OrderStatus.SUCCESS.getValue(), findResult.getStatus()); } @Test void testFindByIdIfIdFound() { From be5349de314cedc8219a5e717079deaf225ec155 Mon Sep 17 00:00:00 2001 From: Fredo Melvern Tanzil Date: Fri, 1 Mar 2024 10:12:52 +0700 Subject: [PATCH 09/22] [RED] Add OrderRepository skeleton --- .../eshop/repository/OrderRepository.java | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 src/main/java/id/ac/ui/cs/advprog/eshop/repository/OrderRepository.java diff --git a/src/main/java/id/ac/ui/cs/advprog/eshop/repository/OrderRepository.java b/src/main/java/id/ac/ui/cs/advprog/eshop/repository/OrderRepository.java new file mode 100644 index 0000000..10e9913 --- /dev/null +++ b/src/main/java/id/ac/ui/cs/advprog/eshop/repository/OrderRepository.java @@ -0,0 +1,21 @@ +package id.ac.ui.cs.advprog.eshop.repository; + +import org.springframework.stereotype.Repository; +import id.ac.ui.cs.advprog.eshop.model.Order; + +import java.util.ArrayList; +import java.util.List; + +@Repository +public class OrderRepository { + private List orderData = new ArrayList<>(); + public Order save(Order order) { + return null; + } + public Order findById(String id){ + return null; + } + public List findAllByAuthor(String author){ + return null; + } +} From b43e5b00e19eb1d4c5cc25d1f07a24b233372701 Mon Sep 17 00:00:00 2001 From: Fredo Melvern Tanzil Date: Fri, 1 Mar 2024 10:23:45 +0700 Subject: [PATCH 10/22] [GREEN] Implement OrderRepository class --- .../eshop/repository/OrderRepository.java | 26 +++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/src/main/java/id/ac/ui/cs/advprog/eshop/repository/OrderRepository.java b/src/main/java/id/ac/ui/cs/advprog/eshop/repository/OrderRepository.java index 10e9913..c484dd8 100644 --- a/src/main/java/id/ac/ui/cs/advprog/eshop/repository/OrderRepository.java +++ b/src/main/java/id/ac/ui/cs/advprog/eshop/repository/OrderRepository.java @@ -10,12 +10,34 @@ public class OrderRepository { private List orderData = new ArrayList<>(); public Order save(Order order) { - return null; + int i = 0; + for (Order savedOrder : orderData){ + if (savedOrder.getId().equals(order.getId())){ + orderData.remove(i); + orderData.add(i, order); + return order; + } + i += 1; + } + + orderData.add(order); + return order; } public Order findById(String id){ + for (Order savedOrder : orderData){ + if (savedOrder.getId().equals(id)){ + return savedOrder; + } + } return null; } public List findAllByAuthor(String author){ - return null; + List result = new ArrayList<>(); + for (Order savedOrder : orderData){ + if (savedOrder.getAuthor().equals(author)){ + result.add(savedOrder); + } + } + return result; } } From 4b86e986dc562bb6014afd11f2e68b79975079fc Mon Sep 17 00:00:00 2001 From: Fredo Melvern Tanzil Date: Fri, 1 Mar 2024 11:44:33 +0700 Subject: [PATCH 11/22] [RED] Add tests for Order ServiceImpl --- .../eshop/service/OrderServiceImplTest.java | 140 ++++++++++++++++++ 1 file changed, 140 insertions(+) create mode 100644 src/test/java/id/ac/ui/cs/advprog/eshop/service/OrderServiceImplTest.java diff --git a/src/test/java/id/ac/ui/cs/advprog/eshop/service/OrderServiceImplTest.java b/src/test/java/id/ac/ui/cs/advprog/eshop/service/OrderServiceImplTest.java new file mode 100644 index 0000000..2f209de --- /dev/null +++ b/src/test/java/id/ac/ui/cs/advprog/eshop/service/OrderServiceImplTest.java @@ -0,0 +1,140 @@ +package id.ac.ui.cs.advprog.eshop.service; + + +import id.ac.ui.cs.advprog.eshop.enums.OrderStatus; +import id.ac.ui.cs.advprog.eshop.model.Order; +import id.ac.ui.cs.advprog.eshop.model.Product; +import id.ac.ui.cs.advprog.eshop.repository.OrderRepository; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.ArrayList; +import java.util.List; +import java.util.NoSuchElementException; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +class OrderServiceImplTest { + @InjectMocks + OrderServiceImpl orderService; + @Mock + OrderRepository orderRepository; + List orders; + + @BeforeEach + void setUp() { + List products = new ArrayList<>(); + Product product1 = new Product(); + product1.setProductId("eb558e9f-1c39-460e-8860-71af6af63bd6"); + product1.setProductName("Sampo Cap Bambang"); + product1.setProductQuantity(2); + products.add(product1); + orders = new ArrayList<>(); + Order order1 = new Order("13652556-012a-4c07-b546-54eb1396d79b", products, 1708560000L, "Safira Sudrajat"); + orders.add(order1); + Order order2 = new Order("7f9e15bb-4b15-42f4-aebc-c3af385fb078", products, 1708570000L, "Safira Sudrajat"); + orders.add(order2); + } + + + @Test + void testCreateOrder() { + Order order = orders.get(1); + doReturn(order).when(orderRepository).save(order); + + Order result = orderService.createOrder(order); + verify(orderRepository, times(1)).save(order); + assertEquals(order.getId(), result.getId()); + } + + @Test + void testCreateOrderIfAlreadyExists() { + Order order = orders.get(1); + doReturn(order).when(orderRepository).findById(order.getId()); + + assertNull(orderService.createOrder(order)); + verify(orderRepository, times(0)).save(order); + } + + @Test + void testUpdateStatus() { + Order order = orders.get(1); + Order newOrder = new Order(order.getId(), order.getProducts(), order.getOrderTime(), + order.getAuthor(), OrderStatus.SUCCESS.getValue()); + doReturn(order).when(orderRepository).findById(order.getId()); + doReturn(newOrder).when(orderRepository).save(any(Order.class)); + + Order result = orderService.updateStatus(order.getId(), OrderStatus.SUCCESS.getValue()); + + assertEquals(order.getId(), result.getId()); + assertEquals(OrderStatus.SUCCESS.getValue(), result.getStatus()); + verify(orderRepository, times(1)).save(any(Order.class)); + } + + + @Test + void testUpdateStatusInvalidStatus() { + Order order = orders.get(1); + doReturn(order).when(orderRepository).findById(order.getId()); + + assertThrows(IllegalArgumentException.class, + () -> orderService.updateStatus(order.getId(), "MEOW")); + + verify(orderRepository, times(0)).save(any(Order.class)); + } + + + @Test + void testUpdateStatusInvalidOrderId() { + doReturn(null).when(orderRepository).findById("zczc"); + + assertThrows(NoSuchElementException.class, + () -> orderService.updateStatus("zczc", OrderStatus.SUCCESS.getValue())); + + verify(orderRepository, times(0)).save(any(Order.class)); + } + + @Test + void testFindByIdIfIdFound() { + Order order = orders.get(1); + doReturn(order).when(orderRepository).findById(order.getId()); + + Order result = orderService.findById(order.getId()); + assertEquals(order.getId(), result.getId()); + } + + @Test + void testFindByIdIfIdNotFound() { + doReturn(null).when(orderRepository).findById("zczc"); + assertNull(orderService.findById("zczc")); + } + + @Test + void testFindAllByAuthorIfAuthorCorrect() { + Order order = orders.get(1); + doReturn(orders).when(orderRepository).findAllByAuthor(order.getAuthor()); + + List results = orderService.findAllByAuthor(order.getAuthor()); + for (Order result : results){ + assertEquals(order.getAuthor(), result.getAuthor()); + } + assertEquals(2, results.size()); + } + + + @Test + void testFindAllByAuthorIfAllLowercase() { + Order order = orders.get(1); + doReturn(new ArrayList()).when(orderRepository) + .findAllByAuthor(order.getAuthor().toLowerCase()); + + List results = orderService.findAllByAuthor(order.getAuthor().toLowerCase()); + assertTrue(results.isEmpty()); + } +} From 5a02932371da530fcaa4e1c9fe30fe3ae6d4d126 Mon Sep 17 00:00:00 2001 From: Fredo Melvern Tanzil Date: Fri, 1 Mar 2024 11:55:35 +0700 Subject: [PATCH 12/22] [GREEN] Implement Order service to pass tests --- .../advprog/eshop/service/OrderService.java | 13 ++++++++ .../eshop/service/OrderServiceImpl.java | 30 +++++++++++++++++++ 2 files changed, 43 insertions(+) create mode 100644 src/main/java/id/ac/ui/cs/advprog/eshop/service/OrderService.java create mode 100644 src/main/java/id/ac/ui/cs/advprog/eshop/service/OrderServiceImpl.java diff --git a/src/main/java/id/ac/ui/cs/advprog/eshop/service/OrderService.java b/src/main/java/id/ac/ui/cs/advprog/eshop/service/OrderService.java new file mode 100644 index 0000000..d0d3247 --- /dev/null +++ b/src/main/java/id/ac/ui/cs/advprog/eshop/service/OrderService.java @@ -0,0 +1,13 @@ +package id.ac.ui.cs.advprog.eshop.service; + +import id.ac.ui.cs.advprog.eshop.model.Order; + +import java.util.List; + +public interface OrderService { + public Order createOrder (Order order); + public Order updateStatus(String orderId, String status); + public Order findById(String orderId); + public List findAllByAuthor(String author); + +} diff --git a/src/main/java/id/ac/ui/cs/advprog/eshop/service/OrderServiceImpl.java b/src/main/java/id/ac/ui/cs/advprog/eshop/service/OrderServiceImpl.java new file mode 100644 index 0000000..3902dc2 --- /dev/null +++ b/src/main/java/id/ac/ui/cs/advprog/eshop/service/OrderServiceImpl.java @@ -0,0 +1,30 @@ +package id.ac.ui.cs.advprog.eshop.service; + +import id.ac.ui.cs.advprog.eshop.model.Order; +import id.ac.ui.cs.advprog.eshop.repository.OrderRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class OrderServiceImpl implements OrderService { + @Autowired + private OrderRepository orderRepository; + @Override + public Order createOrder(Order order){ + return null; + } + @Override + public Order updateStatus(String orderId, String status){ + return null; + } + @Override + public List findAllByAuthor(String author){ + return null; + } + @Override + public Order findById(String orderId){ + return null; + } +} From 127ffe5ef134d9275aeac7a72a403f0629ffbe60 Mon Sep 17 00:00:00 2001 From: Fredo Melvern Tanzil Date: Fri, 1 Mar 2024 11:59:38 +0700 Subject: [PATCH 13/22] [GREEN] Implement OrderService class --- .../advprog/eshop/service/OrderService.java | 1 - .../eshop/service/OrderServiceImpl.java | 19 ++++++++++++++++--- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/main/java/id/ac/ui/cs/advprog/eshop/service/OrderService.java b/src/main/java/id/ac/ui/cs/advprog/eshop/service/OrderService.java index d0d3247..c77abbe 100644 --- a/src/main/java/id/ac/ui/cs/advprog/eshop/service/OrderService.java +++ b/src/main/java/id/ac/ui/cs/advprog/eshop/service/OrderService.java @@ -9,5 +9,4 @@ public interface OrderService { public Order updateStatus(String orderId, String status); public Order findById(String orderId); public List findAllByAuthor(String author); - } diff --git a/src/main/java/id/ac/ui/cs/advprog/eshop/service/OrderServiceImpl.java b/src/main/java/id/ac/ui/cs/advprog/eshop/service/OrderServiceImpl.java index 3902dc2..de7d259 100644 --- a/src/main/java/id/ac/ui/cs/advprog/eshop/service/OrderServiceImpl.java +++ b/src/main/java/id/ac/ui/cs/advprog/eshop/service/OrderServiceImpl.java @@ -6,6 +6,7 @@ import org.springframework.stereotype.Service; import java.util.List; +import java.util.NoSuchElementException; @Service public class OrderServiceImpl implements OrderService { @@ -13,18 +14,30 @@ public class OrderServiceImpl implements OrderService { private OrderRepository orderRepository; @Override public Order createOrder(Order order){ + if (orderRepository.findById(order.getId()) == null){ + orderRepository.save(order); + return order; + } return null; } @Override public Order updateStatus(String orderId, String status){ - return null; + Order order = orderRepository.findById(orderId); + if (order != null){ + Order newOrder = new Order(order.getId(), order.getProducts(), + order.getOrderTime(), order.getAuthor(), status); + orderRepository.save(newOrder); + return newOrder; + } else{ + throw new NoSuchElementException(); + } } @Override public List findAllByAuthor(String author){ - return null; + return orderRepository.findAllByAuthor(author); } @Override public Order findById(String orderId){ - return null; + return orderRepository.findById(orderId); } } From 1b9271d0c1761bfeb76b7021ce20f8b26a204fa7 Mon Sep 17 00:00:00 2001 From: Fredo Melvern Tanzil Date: Sat, 2 Mar 2024 19:54:51 +0700 Subject: [PATCH 14/22] [RED] Add tests for Payment model & skeleton --- README.md | 35 +++- .../ac/ui/cs/advprog/eshop/model/Payment.java | 28 +++ .../cs/advprog/eshop/model/PaymentTest.java | 183 ++++++++++++++++++ 3 files changed, 245 insertions(+), 1 deletion(-) create mode 100644 src/main/java/id/ac/ui/cs/advprog/eshop/model/Payment.java create mode 100644 src/test/java/id/ac/ui/cs/advprog/eshop/model/PaymentTest.java diff --git a/README.md b/README.md index ab521f8..52318f2 100644 --- a/README.md +++ b/README.md @@ -97,4 +97,37 @@ Keuntungan menerapkan prinsip SOLID Kerugian tidak menerapkan prinsip SOLID - Kode hanya dipahami oleh orang yang menulis kode, orang lain yang membaca kode lebih banyak menghabiskan waktunya dalam memahami kode lama dibanding membuat kode baru - Kode sulit dikelola, sulit menambah fitur, dan tidak fleksibel -- Apabila menemukan error atau bug akan sulit melacak kode penyebabnya \ No newline at end of file +- Apabila menemukan error atau bug akan sulit melacak kode penyebabnya + +## Module 4 + +Menurut saya alur TDD (Test-Driven Development) sudah membantu saya selama melakukan pemograman dalam aplikasi Springboot ini, sebab saya sudah menetapkan ekspektasi output program dari awal, sehingga saat melakukan pemrograman menjadi lebih terarah. + + +F.I.R.S.T. principle or not. If not, explain things that you need to do the next time you create more tests. + +- Fast : sudah terpenuhi karena saya memisahkan tests menjadi unit tests dan functional tests, serta menggunakan stubs contohnya InjectMocks OrderServiceImpl dan Mock orderRepository, sehingga test dapat berjalan dengan cepat +- Isolated/Independent : sudah terpenuhi karena saya sudah set up objek dummy atau mock sebelum test case, contohnya pada `OrderTest.java` terdapat method BeforeEach +```java + @BeforeEach + void setUp() { + this.products = new ArrayList<>(); + + Product product1 = new Product(); + product1.setProductId("eb558e9f-1c39-460e-8860-71af6af63bd6"); + product1.setProductName("Sampo Cap Bambang"); + product1.setProductQuantity(2); + + Product product2 = new Product(); + product2.setProductId("a2c62328-4a37-4664-83c7-f32db8620155"); + product2.setProductName("Sabun Cap Usep"); + product2.setProductQuantity(1); + + this.products.add(product1); + this.products.add(product2); + } +``` + +- Repeatable: sudah terpenuhi karena test yang saya buat sudah terisolasi dan dapat berjalan berkali-kali dengan hasil yang konsisten. +- Self-Validating: sudah terpenuhi karena test saya sudah strict serta menggunakan assertions daripada print secara manual. Namun masih beberapa kekurangan yang dapat diimprove seperti kurangnya pesan dalam tiap assertion dan terlalu banyak assertion dalam satu test method. +- Thorough/Timely: sudah terpenuhi karena test yang saya buat sudah mencover semua happy & unhappy path yang mencankup semua kemungkinan error. \ No newline at end of file diff --git a/src/main/java/id/ac/ui/cs/advprog/eshop/model/Payment.java b/src/main/java/id/ac/ui/cs/advprog/eshop/model/Payment.java new file mode 100644 index 0000000..3465833 --- /dev/null +++ b/src/main/java/id/ac/ui/cs/advprog/eshop/model/Payment.java @@ -0,0 +1,28 @@ +package id.ac.ui.cs.advprog.eshop.model; + +import id.ac.ui.cs.advprog.eshop.enums.OrderStatus; +import lombok.Builder; +import lombok.Getter; + +import java.util.List; +import java.util.Map; + +@Builder +@Getter +public class Payment { + + String id; + String method; + String status; + Map paymentData; + + Order order; + + + public Payment(String id, Order order, String method, Map paymentData) { + return; + } + public void setStatus(String status){ + return; + } +} diff --git a/src/test/java/id/ac/ui/cs/advprog/eshop/model/PaymentTest.java b/src/test/java/id/ac/ui/cs/advprog/eshop/model/PaymentTest.java new file mode 100644 index 0000000..e42594a --- /dev/null +++ b/src/test/java/id/ac/ui/cs/advprog/eshop/model/PaymentTest.java @@ -0,0 +1,183 @@ +package id.ac.ui.cs.advprog.eshop.model; + +import id.ac.ui.cs.advprog.eshop.enums.OrderStatus; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.*; + +class PaymentTest { + private List products; + private List orders; + + @BeforeEach + void setUp() { + + // Setup products + this.products = new ArrayList<>(); + + Product product1 = new Product(); + product1.setProductId("eb558e9f-1c39-460e-8860-71af6af63bd6"); + product1.setProductName("Sampo Cap Bambang"); + product1.setProductQuantity(2); + + Product product2 = new Product(); + product2.setProductId("a2c62328-4a37-4664-83c7-f32db8620155"); + product2.setProductName("Sabun Cap Usep"); + product2.setProductQuantity(1); + + this.products.add(product1); + this.products.add(product2); + + + // Setup orders + Order order1 = new Order("13652556-012a-4c07-b546-54eb1396d79b", this.products, 1708560000L, "Safira Sudrajat"); + Order order2 = new Order("93652556-012a-4c07-b546-54eb1396d79b", this.products, 1708570000L, "Bambang Bambang"); + + this.orders.add(order1); + this.orders.add(order2); + } + + + // Voucher Code + @Test + void testCreatePaymentSameOrders() { + Map paymentData = new HashMap(); + paymentData.put("voucherCode", "ESHOP1234ABC5678"); + Payment payment = new Payment("6c93d3e2-b009-46ba-9d15-f03d85adc2de", this.orders.getFirst(), "VOUCHER_CODE", paymentData); + + assertSame(this.orders.getFirst(), payment.getOrder()); + } + + @Test + void testCreatePaymentVoucherCodeSuccess(){ + Map paymentData = new HashMap(); + paymentData.put("voucherCode", "ESHOP1234ABC5678"); + Payment payment = new Payment("6c93d3e2-b009-46ba-9d15-f03d85adc2de", this.orders.getFirst(), "VOUCHER_CODE", paymentData); + + assertEquals("SUCCESS", payment.getStatus()); + } + @Test + void testCreatePaymentVoucherCodeRejectedNot16Characters(){ + Map paymentData = new HashMap(); + paymentData.put("voucherCode", "ESHOP1234ABC56782"); + Payment payment = new Payment("6c93d3e2-b009-46ba-9d15-f03d85adc2de", this.orders.getFirst(), "VOUCHER_CODE", paymentData); + + assertEquals("REJECTED", payment.getStatus()); + } + @Test + void testCreatePaymentVoucherCodeRejectedNotStartedWithESHOP(){ + Map paymentData = new HashMap(); + paymentData.put("voucherCode", "ESSHOP1234ABC567"); + Payment payment = new Payment("6c93d3e2-b009-46ba-9d15-f03d85adc2de", this.orders.getFirst(), "VOUCHER_CODE", paymentData); + + assertEquals("REJECTED", payment.getStatus()); + } + @Test + void testCreatePaymentVoucherCodeRejectedNotContain8NumericalCharacters(){ + Map paymentData = new HashMap(); + paymentData.put("voucherCode", "ESHOP1234ABC567D"); + Payment payment = new Payment("6c93d3e2-b009-46ba-9d15-f03d85adc2de", this.orders.getFirst(), "VOUCHER_CODE", paymentData); + + assertEquals("REJECTED", payment.getStatus()); + } + + + @Test + void testSetStatusPaymentVoucherCodeSucess(){ + Map paymentData = new HashMap(); + paymentData.put("voucherCode", "ESHOP1234ABC567D"); + Payment payment = new Payment("6c93d3e2-b009-46ba-9d15-f03d85adc2de", this.orders.getFirst(), "VOUCHER_CODE", paymentData); + + payment.setStatus("SUCCESS"); + assertEquals("SUCCESS", payment.getOrder().getStatus()); + } + @Test + void testSetStatusPaymentVoucherCodeRejected(){ + Map paymentData = new HashMap(); + paymentData.put("voucherCode", "ESHOP1234ABC567D"); + Payment payment = new Payment("6c93d3e2-b009-46ba-9d15-f03d85adc2de", this.orders.getFirst(), "VOUCHER_CODE", paymentData); + + payment.setStatus("REJECTED"); + assertEquals("FAILED", payment.getOrder().getStatus()); + } + + + @Test + void testCreateOrderInvalidStatus() { + Map paymentData = new HashMap(); + paymentData.put("voucherCode", "ESHOP1234ABC567D"); + Payment payment = new Payment("6c93d3e2-b009-46ba-9d15-f03d85adc2de", this.orders.getFirst(), "VOUCHER_CODE", paymentData); + + assertThrows (IllegalArgumentException.class, () -> { + payment.setStatus("WKWKWKWK"); + }); + } + + + + // Cash on Delivery + @Test + void testCreatePaymentCashOnDeliverySuccess(){ + Map paymentData = new HashMap(); + paymentData.put("address", "Jalan Anggur"); + paymentData.put("deliveryFee", "12000"); + Payment payment = new Payment("6c93d3e2-b009-46ba-9d15-f03d85adc2de", this.orders.getFirst(), "CASH_ON_DELIVERY", paymentData); + + assertEquals("SUCCESS", payment.getStatus()); + } + @Test + void testCreatePaymentCashOnDeliveryRejectedMissingAddress(){ + Map paymentData = new HashMap(); + paymentData.put("deliveryFee", "12000"); + Payment payment = new Payment("6c93d3e2-b009-46ba-9d15-f03d85adc2de", this.orders.getFirst(), "CASH_ON_DELIVERY", paymentData); + + assertEquals("REJECTED", payment.getStatus()); + } + @Test + void testCreatePaymentCashOnDeliveryRejectedMissingDeliveryFee(){ + Map paymentData = new HashMap(); + paymentData.put("address", "Jalan Anggur"); + Payment payment = new Payment("6c93d3e2-b009-46ba-9d15-f03d85adc2de", this.orders.getFirst(), "CASH_ON_DELIVERY", paymentData); + + assertEquals("REJECTED", payment.getStatus()); + } + + @Test + void testSetStatusPaymentCashOnDeliverySucess(){ + Map paymentData = new HashMap(); + paymentData.put("address", "Jalan Anggur"); + paymentData.put("deliveryFee", "12000"); + Payment payment = new Payment("6c93d3e2-b009-46ba-9d15-f03d85adc2de", this.orders.getFirst(), "CASH_ON_DELIVERY", paymentData); + + payment.setStatus("SUCCESS"); + assertEquals("SUCCESS", payment.getOrder().getStatus()); + } + @Test + void testSetStatusPaymentCashOnDeliveryRejected(){ + Map paymentData = new HashMap(); + paymentData.put("address", "Jalan Anggur"); + paymentData.put("deliveryFee", "12000"); + Payment payment = new Payment("6c93d3e2-b009-46ba-9d15-f03d85adc2de", this.orders.getFirst(), "CASH_ON_DELIVERY", paymentData); + + payment.setStatus("REJECTED"); + assertEquals("FAILED", payment.getOrder().getStatus()); + } + + + // Invalid payment method + @Test + void testCreateOrderInvalidMethod() { + Map paymentData = new HashMap(); + paymentData.put("voucherCode", "ESHOP1234ABC567D"); + + assertThrows (IllegalArgumentException.class, () -> { + Payment payment = new Payment("6c93d3e2-b009-46ba-9d15-f03d85adc2de", this.orders.getFirst(), "WKWKWKWKWK", paymentData); + }); + } +} From a684f354e390c19ddd5186fd9de3960ed566cdbf Mon Sep 17 00:00:00 2001 From: Fredo Melvern Tanzil Date: Sat, 2 Mar 2024 20:29:28 +0700 Subject: [PATCH 15/22] [GREEN] Implement Payment model --- .../ac/ui/cs/advprog/eshop/model/Payment.java | 74 +++++++++++++++++-- .../cs/advprog/eshop/model/PaymentTest.java | 5 +- 2 files changed, 71 insertions(+), 8 deletions(-) diff --git a/src/main/java/id/ac/ui/cs/advprog/eshop/model/Payment.java b/src/main/java/id/ac/ui/cs/advprog/eshop/model/Payment.java index 3465833..b1b3460 100644 --- a/src/main/java/id/ac/ui/cs/advprog/eshop/model/Payment.java +++ b/src/main/java/id/ac/ui/cs/advprog/eshop/model/Payment.java @@ -4,7 +4,7 @@ import lombok.Builder; import lombok.Getter; -import java.util.List; + import java.util.Map; @Builder @@ -12,17 +12,81 @@ public class Payment { String id; + Order order; String method; - String status; Map paymentData; - Order order; + String status; + public Payment(String id, Order order, String method, Map paymentData) { - return; + this.id = id; + this.order = order; + this.method = method; + this.paymentData = paymentData; + + boolean valid = false; + switch (method){ + case "VOUCHER_CODE": + + String voucherCode = paymentData.get("voucherCode"); + if (voucherCode != null + && voucherCode.length() == 16 + && voucherCode.startsWith("ESHOP") + ) { + int numCharCount = 0; + for (int i = 0; i < voucherCode.length(); i++){ + if (Character.isDigit(voucherCode.charAt(i))){ + numCharCount++; + } + } + if (numCharCount == 8){ + valid = true; + } + + } + + break; + case "CASH_ON_DELIVERY": + + String address = paymentData.get("address"); + String deliveryFee = paymentData.get("deliveryFee"); + + if (address != null && !address.isEmpty() + && deliveryFee != null && !deliveryFee.isEmpty()){ + valid = true; + } + + break; + default: + throw new IllegalArgumentException(); + } + + if (valid){ + setStatus("SUCCESS"); + } else{ + setStatus("REJECTED"); + } + } + public Payment(String id, Order order, String method, Map paymentData, String status) { + this.id = id; + this.order = order; + this.method = method; + this.paymentData = paymentData; + setStatus(status); } public void setStatus(String status){ - return; + if (status.equals("SUCCESS") || status.equals("REJECTED")){ + this.status = status; + if (status.equals("SUCCESS")){ + order.setStatus("SUCCESS"); + } else if (status.equals("REJECTED")){ + order.setStatus("FAILED"); + } + } else{ + throw new IllegalArgumentException(); + } + } } diff --git a/src/test/java/id/ac/ui/cs/advprog/eshop/model/PaymentTest.java b/src/test/java/id/ac/ui/cs/advprog/eshop/model/PaymentTest.java index e42594a..4e17916 100644 --- a/src/test/java/id/ac/ui/cs/advprog/eshop/model/PaymentTest.java +++ b/src/test/java/id/ac/ui/cs/advprog/eshop/model/PaymentTest.java @@ -38,7 +38,7 @@ void setUp() { // Setup orders Order order1 = new Order("13652556-012a-4c07-b546-54eb1396d79b", this.products, 1708560000L, "Safira Sudrajat"); Order order2 = new Order("93652556-012a-4c07-b546-54eb1396d79b", this.products, 1708570000L, "Bambang Bambang"); - + this.orders = new ArrayList(); this.orders.add(order1); this.orders.add(order2); } @@ -149,7 +149,7 @@ void testCreatePaymentCashOnDeliveryRejectedMissingDeliveryFee(){ } @Test - void testSetStatusPaymentCashOnDeliverySucess(){ + void testSetStatusPaymentCashOnDeliverySuccess(){ Map paymentData = new HashMap(); paymentData.put("address", "Jalan Anggur"); paymentData.put("deliveryFee", "12000"); @@ -169,7 +169,6 @@ void testSetStatusPaymentCashOnDeliveryRejected(){ assertEquals("FAILED", payment.getOrder().getStatus()); } - // Invalid payment method @Test void testCreateOrderInvalidMethod() { From 0172151ce842ad842bbb13d19226c9de8ce3cc2f Mon Sep 17 00:00:00 2001 From: Fredo Melvern Tanzil Date: Sat, 2 Mar 2024 21:15:45 +0700 Subject: [PATCH 16/22] [REFACTOR] Make PaymentStatus enum --- .../cs/advprog/eshop/enums/PaymentStatus.java | 23 +++++++++++++++++++ .../ac/ui/cs/advprog/eshop/model/Payment.java | 5 +++- 2 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 src/main/java/id/ac/ui/cs/advprog/eshop/enums/PaymentStatus.java diff --git a/src/main/java/id/ac/ui/cs/advprog/eshop/enums/PaymentStatus.java b/src/main/java/id/ac/ui/cs/advprog/eshop/enums/PaymentStatus.java new file mode 100644 index 0000000..9d7d881 --- /dev/null +++ b/src/main/java/id/ac/ui/cs/advprog/eshop/enums/PaymentStatus.java @@ -0,0 +1,23 @@ +package id.ac.ui.cs.advprog.eshop.enums; + +import lombok.Getter; + +@Getter +public enum PaymentStatus { + SUCCESS("SUCCESS"), + REJECTED("REJECTED"); + + private final String value; + private PaymentStatus (String value) { + this.value = value; + } + + public static boolean contains(String param) { + for (PaymentStatus paymentStatus : PaymentStatus.values()) { + if (paymentStatus.name().equals(param)) { + return true; + } + } + return false; + } +} diff --git a/src/main/java/id/ac/ui/cs/advprog/eshop/model/Payment.java b/src/main/java/id/ac/ui/cs/advprog/eshop/model/Payment.java index b1b3460..aac4f96 100644 --- a/src/main/java/id/ac/ui/cs/advprog/eshop/model/Payment.java +++ b/src/main/java/id/ac/ui/cs/advprog/eshop/model/Payment.java @@ -1,6 +1,7 @@ package id.ac.ui.cs.advprog.eshop.model; import id.ac.ui.cs.advprog.eshop.enums.OrderStatus; +import id.ac.ui.cs.advprog.eshop.enums.PaymentStatus; import lombok.Builder; import lombok.Getter; @@ -77,13 +78,15 @@ public Payment(String id, Order order, String method, Map paymen setStatus(status); } public void setStatus(String status){ - if (status.equals("SUCCESS") || status.equals("REJECTED")){ + if (PaymentStatus.contains(status)){ this.status = status; + if (status.equals("SUCCESS")){ order.setStatus("SUCCESS"); } else if (status.equals("REJECTED")){ order.setStatus("FAILED"); } + } else{ throw new IllegalArgumentException(); } From 2bb3f47bbf30c0c16123118fd9ce80299eec4715 Mon Sep 17 00:00:00 2001 From: Fredo Melvern Tanzil Date: Sat, 2 Mar 2024 21:42:09 +0700 Subject: [PATCH 17/22] [RED] Add tests for PaymentRepository & its skeleton --- .../eshop/repository/PaymentRepository.java | 21 +++ .../repository/PaymentRepositoryTest.java | 127 ++++++++++++++++++ 2 files changed, 148 insertions(+) create mode 100644 src/main/java/id/ac/ui/cs/advprog/eshop/repository/PaymentRepository.java create mode 100644 src/test/java/id/ac/ui/cs/advprog/eshop/repository/PaymentRepositoryTest.java diff --git a/src/main/java/id/ac/ui/cs/advprog/eshop/repository/PaymentRepository.java b/src/main/java/id/ac/ui/cs/advprog/eshop/repository/PaymentRepository.java new file mode 100644 index 0000000..52f1de8 --- /dev/null +++ b/src/main/java/id/ac/ui/cs/advprog/eshop/repository/PaymentRepository.java @@ -0,0 +1,21 @@ +package id.ac.ui.cs.advprog.eshop.repository; + +import id.ac.ui.cs.advprog.eshop.model.Order; +import id.ac.ui.cs.advprog.eshop.model.Payment; + +import java.util.ArrayList; +import java.util.List; + +public class PaymentRepository { + private List paymentData = new ArrayList<>(); + + public Payment save(Payment payment) { + return payment; + } + public Payment findById(String id){ + return null; + } + public List getAllPayment(){ + return null; + } +} diff --git a/src/test/java/id/ac/ui/cs/advprog/eshop/repository/PaymentRepositoryTest.java b/src/test/java/id/ac/ui/cs/advprog/eshop/repository/PaymentRepositoryTest.java new file mode 100644 index 0000000..eb89f82 --- /dev/null +++ b/src/test/java/id/ac/ui/cs/advprog/eshop/repository/PaymentRepositoryTest.java @@ -0,0 +1,127 @@ +package id.ac.ui.cs.advprog.eshop.repository; + + +import id.ac.ui.cs.advprog.eshop.model.Order; +import id.ac.ui.cs.advprog.eshop.model.Payment; +import id.ac.ui.cs.advprog.eshop.model.Product; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.*; + +class PaymentRepositoryTest { + PaymentRepository paymentRepository; + List payments; + + @BeforeEach + void setUp() { + paymentRepository = new PaymentRepository(); + + // Make products + List products = new ArrayList<>(); + Product product1 = new Product(); + product1.setProductId("eb558e9f-1c39-460e-8860-71af6af63bd6"); + product1.setProductName("Sampo Cap Bambang"); + product1.setProductQuantity(2); + products.add(product1); + + // Make orders + List orders = new ArrayList<>(); + Order order1 = new Order("13652556-012a-4c07-b546-54eb1396d79b", products, 1708560000L, "Safira Sudrajat"); + orders.add(order1); + Order order2 = new Order("7f9e15bb-4b15-42f4-aebc-c3af385fb878", products, 1708570000L, "Safira Sudrajat"); + orders.add(order2); + Order order3 = new Order("e334ef48-9eff-4da8-9487-8ee697ecbf1e", products, 1708570000L, "Bambang Sudrajat"); + orders.add(order3); + + // Make payments + Map paymentData1 = new HashMap(); + paymentData1.put("voucherCode", "ESHOP1234ABC5678"); + Payment payment1 = new Payment("6c93d3e2-b009-46ba-9d15-f03d85adc2de", orders.getFirst(), "VOUCHER_CODE", paymentData1); + payments.add(payment1); + + Map paymentData2 = new HashMap(); + paymentData2.put("address", "Jalan Anggur"); + paymentData2.put("deliveryFee", "12000"); + Payment payment2 = new Payment("6c93d3e2-b009-46ba-9d15-f03d85adc2de", orders.getFirst(), "CASH_ON_DELIVERY", paymentData2); + payments.add(payment2); + } + + + @Test + void testSaveCreate() { + Payment payment = payments.get(1); + Payment result = paymentRepository.save(payment); + + Payment findResult = paymentRepository.findById(payments.get(1).getId()); + + assertEquals(payment.getId(), result.getId()); + assertEquals(payment.getId(), findResult.getId()); + assertEquals(payment.getMethod(), findResult.getMethod()); + assertEquals(payment.getStatus(), findResult.getStatus()); + assertEquals(payment.getPaymentData(), findResult.getPaymentData()); + assertSame(payment.getOrder(), findResult.getOrder()); + } + + + @Test + void testSaveUpdate() { + // create new payment + Payment payment = payments.get(1); + paymentRepository.save(payment); + + // change payment data + Payment newPayment = new Payment(payment.getId(), payment.getOrder(), payment.getMethod(), payments.get(0).getPaymentData()); + Payment result = paymentRepository.save(newPayment); + + Payment findResult = paymentRepository.findById(payments.get(1).getId()); + + assertEquals(payment.getId(), result.getId()); + assertEquals(payment.getId(), findResult.getId()); + assertEquals(payment.getMethod(), findResult.getMethod()); + assertEquals(payment.getStatus(), findResult.getStatus()); + assertEquals(payments.getFirst().getPaymentData(), findResult.getPaymentData()); + assertSame(payment.getOrder(), findResult.getOrder()); + + + } + @Test + void testFindByIdIfIdFound() { + for (Payment payment : payments) { + paymentRepository.save(payment); + } + + Payment findResult = paymentRepository.findById(payments.get(1).getId()); + + assertEquals(payments.get(1).getId(), findResult.getId()); + assertEquals(payments.get(1).getMethod(), findResult.getMethod()); + assertEquals(payments.get(1).getStatus(), findResult.getStatus()); + assertEquals(payments.get(1).getPaymentData(), findResult.getPaymentData()); + assertSame(payments.get(1).getOrder(), findResult.getOrder()); + } + + @Test + void testFindByIdIfIdNotFound() { + for (Payment payment: payments) { + paymentRepository.save(payment); + } + + Payment findResult = paymentRepository.findById("zczc"); + assertNull(findResult); + } + + @Test + void testFindAllByAuthorIfAuthorCorrect(){ + for (Payment payment: payments) { + paymentRepository.save(payment); + } + + List paymentList = paymentRepository.getAllPayment(); + assertEquals(2, paymentList.size()); + } +} From 67518c0bbcb45c0dfc310e3fab3c8546ae92c400 Mon Sep 17 00:00:00 2001 From: Fredo Melvern Tanzil Date: Sat, 2 Mar 2024 21:47:56 +0700 Subject: [PATCH 18/22] [GREEN] Implement PaymentRepository --- .../eshop/repository/PaymentRepository.java | 20 +++++++++++++++++-- .../repository/PaymentRepositoryTest.java | 7 ++++--- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/src/main/java/id/ac/ui/cs/advprog/eshop/repository/PaymentRepository.java b/src/main/java/id/ac/ui/cs/advprog/eshop/repository/PaymentRepository.java index 52f1de8..1f3aedc 100644 --- a/src/main/java/id/ac/ui/cs/advprog/eshop/repository/PaymentRepository.java +++ b/src/main/java/id/ac/ui/cs/advprog/eshop/repository/PaymentRepository.java @@ -1,6 +1,5 @@ package id.ac.ui.cs.advprog.eshop.repository; -import id.ac.ui.cs.advprog.eshop.model.Order; import id.ac.ui.cs.advprog.eshop.model.Payment; import java.util.ArrayList; @@ -10,12 +9,29 @@ public class PaymentRepository { private List paymentData = new ArrayList<>(); public Payment save(Payment payment) { + int i = 0; + for (Payment savedPayment : paymentData){ + if (savedPayment.getId().equals(payment.getId())){ + paymentData.remove(i); + paymentData.add(i, payment); + return payment; + } + i += 1; + } + + paymentData.add(payment); + return payment; } public Payment findById(String id){ + for (Payment savedPayment : paymentData){ + if (savedPayment.getId().equals(id)){ + return savedPayment; + } + } return null; } public List getAllPayment(){ - return null; + return paymentData; } } diff --git a/src/test/java/id/ac/ui/cs/advprog/eshop/repository/PaymentRepositoryTest.java b/src/test/java/id/ac/ui/cs/advprog/eshop/repository/PaymentRepositoryTest.java index eb89f82..1197291 100644 --- a/src/test/java/id/ac/ui/cs/advprog/eshop/repository/PaymentRepositoryTest.java +++ b/src/test/java/id/ac/ui/cs/advprog/eshop/repository/PaymentRepositoryTest.java @@ -40,6 +40,8 @@ void setUp() { orders.add(order3); // Make payments + payments = new ArrayList<>(); + Map paymentData1 = new HashMap(); paymentData1.put("voucherCode", "ESHOP1234ABC5678"); Payment payment1 = new Payment("6c93d3e2-b009-46ba-9d15-f03d85adc2de", orders.getFirst(), "VOUCHER_CODE", paymentData1); @@ -48,7 +50,7 @@ void setUp() { Map paymentData2 = new HashMap(); paymentData2.put("address", "Jalan Anggur"); paymentData2.put("deliveryFee", "12000"); - Payment payment2 = new Payment("6c93d3e2-b009-46ba-9d15-f03d85adc2de", orders.getFirst(), "CASH_ON_DELIVERY", paymentData2); + Payment payment2 = new Payment("6c93d3e2-b009-46ba-9d15-f03d85adc2d2", orders.getFirst(), "CASH_ON_DELIVERY", paymentData2); payments.add(payment2); } @@ -84,7 +86,6 @@ void testSaveUpdate() { assertEquals(payment.getId(), result.getId()); assertEquals(payment.getId(), findResult.getId()); assertEquals(payment.getMethod(), findResult.getMethod()); - assertEquals(payment.getStatus(), findResult.getStatus()); assertEquals(payments.getFirst().getPaymentData(), findResult.getPaymentData()); assertSame(payment.getOrder(), findResult.getOrder()); @@ -116,7 +117,7 @@ void testFindByIdIfIdNotFound() { } @Test - void testFindAllByAuthorIfAuthorCorrect(){ + void testFindAll(){ for (Payment payment: payments) { paymentRepository.save(payment); } From bec102ee7854a7203ef53a4b963d1637559b6314 Mon Sep 17 00:00:00 2001 From: Fredo Melvern Tanzil Date: Sat, 2 Mar 2024 22:11:14 +0700 Subject: [PATCH 19/22] [REFACTOR] make PaymentVoucherCode and PaymentCashOnDelivery subclass --- .../ac/ui/cs/advprog/eshop/model/Payment.java | 51 +++---------------- .../eshop/model/PaymentCashOnDelivery.java | 21 ++++++++ .../eshop/model/PaymentVoucherCode.java | 33 ++++++++++++ .../cs/advprog/eshop/model/PaymentTest.java | 48 ++++++++--------- .../repository/PaymentRepositoryTest.java | 13 ++--- 5 files changed, 87 insertions(+), 79 deletions(-) create mode 100644 src/main/java/id/ac/ui/cs/advprog/eshop/model/PaymentCashOnDelivery.java create mode 100644 src/main/java/id/ac/ui/cs/advprog/eshop/model/PaymentVoucherCode.java diff --git a/src/main/java/id/ac/ui/cs/advprog/eshop/model/Payment.java b/src/main/java/id/ac/ui/cs/advprog/eshop/model/Payment.java index aac4f96..ea16a0f 100644 --- a/src/main/java/id/ac/ui/cs/advprog/eshop/model/Payment.java +++ b/src/main/java/id/ac/ui/cs/advprog/eshop/model/Payment.java @@ -8,72 +8,33 @@ import java.util.Map; -@Builder + @Getter -public class Payment { +public abstract class Payment { String id; Order order; - String method; Map paymentData; String status; - public Payment(String id, Order order, String method, Map paymentData) { + public Payment(String id, Order order, Map paymentData) { this.id = id; this.order = order; - this.method = method; this.paymentData = paymentData; - boolean valid = false; - switch (method){ - case "VOUCHER_CODE": - - String voucherCode = paymentData.get("voucherCode"); - if (voucherCode != null - && voucherCode.length() == 16 - && voucherCode.startsWith("ESHOP") - ) { - int numCharCount = 0; - for (int i = 0; i < voucherCode.length(); i++){ - if (Character.isDigit(voucherCode.charAt(i))){ - numCharCount++; - } - } - if (numCharCount == 8){ - valid = true; - } - - } - - break; - case "CASH_ON_DELIVERY": - - String address = paymentData.get("address"); - String deliveryFee = paymentData.get("deliveryFee"); - - if (address != null && !address.isEmpty() - && deliveryFee != null && !deliveryFee.isEmpty()){ - valid = true; - } - - break; - default: - throw new IllegalArgumentException(); - } - if (valid){ + if (paymentDataIsValid()){ setStatus("SUCCESS"); } else{ setStatus("REJECTED"); } } - public Payment(String id, Order order, String method, Map paymentData, String status) { + public Payment(String id, Order order, Map paymentData, String status) { this.id = id; this.order = order; - this.method = method; this.paymentData = paymentData; setStatus(status); } @@ -92,4 +53,6 @@ public void setStatus(String status){ } } + + abstract boolean paymentDataIsValid(); } diff --git a/src/main/java/id/ac/ui/cs/advprog/eshop/model/PaymentCashOnDelivery.java b/src/main/java/id/ac/ui/cs/advprog/eshop/model/PaymentCashOnDelivery.java new file mode 100644 index 0000000..1971893 --- /dev/null +++ b/src/main/java/id/ac/ui/cs/advprog/eshop/model/PaymentCashOnDelivery.java @@ -0,0 +1,21 @@ +package id.ac.ui.cs.advprog.eshop.model; + + +import lombok.Builder; + +import java.util.Map; + +public class PaymentCashOnDelivery extends Payment{ + public PaymentCashOnDelivery(String id, Order order, Map paymentData) { + super(id, order, paymentData); + } + + @Override + boolean paymentDataIsValid() { + String address = paymentData.get("address"); + String deliveryFee = paymentData.get("deliveryFee"); + + return address != null && !address.isEmpty() && deliveryFee != null && !deliveryFee.isEmpty(); + } +} + diff --git a/src/main/java/id/ac/ui/cs/advprog/eshop/model/PaymentVoucherCode.java b/src/main/java/id/ac/ui/cs/advprog/eshop/model/PaymentVoucherCode.java new file mode 100644 index 0000000..5d14d4f --- /dev/null +++ b/src/main/java/id/ac/ui/cs/advprog/eshop/model/PaymentVoucherCode.java @@ -0,0 +1,33 @@ +package id.ac.ui.cs.advprog.eshop.model; + +import lombok.Builder; + +import java.util.Map; + +public class PaymentVoucherCode extends Payment{ + public PaymentVoucherCode(String id, Order order, Map paymentData) { + super(id, order, paymentData); + } + + @Override + boolean paymentDataIsValid() { + String voucherCode = paymentData.get("voucherCode"); + if (voucherCode == null || voucherCode.length() != 16 || !voucherCode.startsWith("ESHOP")) { + return false; + } + + int numCharCount = 0; + for (int i = 0; i < voucherCode.length(); i++){ + if (Character.isDigit(voucherCode.charAt(i))){ + numCharCount++; + } + } + + if (numCharCount != 8){ + return false; + } + + + return true; + } +} diff --git a/src/test/java/id/ac/ui/cs/advprog/eshop/model/PaymentTest.java b/src/test/java/id/ac/ui/cs/advprog/eshop/model/PaymentTest.java index 4e17916..af805f9 100644 --- a/src/test/java/id/ac/ui/cs/advprog/eshop/model/PaymentTest.java +++ b/src/test/java/id/ac/ui/cs/advprog/eshop/model/PaymentTest.java @@ -1,6 +1,5 @@ package id.ac.ui.cs.advprog.eshop.model; -import id.ac.ui.cs.advprog.eshop.enums.OrderStatus; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -49,7 +48,7 @@ void setUp() { void testCreatePaymentSameOrders() { Map paymentData = new HashMap(); paymentData.put("voucherCode", "ESHOP1234ABC5678"); - Payment payment = new Payment("6c93d3e2-b009-46ba-9d15-f03d85adc2de", this.orders.getFirst(), "VOUCHER_CODE", paymentData); + Payment payment = new PaymentVoucherCode("6c93d3e2-b009-46ba-9d15-f03d85adc2de", this.orders.getFirst(), paymentData); assertSame(this.orders.getFirst(), payment.getOrder()); } @@ -58,7 +57,7 @@ void testCreatePaymentSameOrders() { void testCreatePaymentVoucherCodeSuccess(){ Map paymentData = new HashMap(); paymentData.put("voucherCode", "ESHOP1234ABC5678"); - Payment payment = new Payment("6c93d3e2-b009-46ba-9d15-f03d85adc2de", this.orders.getFirst(), "VOUCHER_CODE", paymentData); + Payment payment = new PaymentVoucherCode("6c93d3e2-b009-46ba-9d15-f03d85adc2de", this.orders.getFirst(), paymentData); assertEquals("SUCCESS", payment.getStatus()); } @@ -66,7 +65,7 @@ void testCreatePaymentVoucherCodeSuccess(){ void testCreatePaymentVoucherCodeRejectedNot16Characters(){ Map paymentData = new HashMap(); paymentData.put("voucherCode", "ESHOP1234ABC56782"); - Payment payment = new Payment("6c93d3e2-b009-46ba-9d15-f03d85adc2de", this.orders.getFirst(), "VOUCHER_CODE", paymentData); + Payment payment = new PaymentVoucherCode("6c93d3e2-b009-46ba-9d15-f03d85adc2de", this.orders.getFirst(), paymentData); assertEquals("REJECTED", payment.getStatus()); } @@ -74,7 +73,7 @@ void testCreatePaymentVoucherCodeRejectedNot16Characters(){ void testCreatePaymentVoucherCodeRejectedNotStartedWithESHOP(){ Map paymentData = new HashMap(); paymentData.put("voucherCode", "ESSHOP1234ABC567"); - Payment payment = new Payment("6c93d3e2-b009-46ba-9d15-f03d85adc2de", this.orders.getFirst(), "VOUCHER_CODE", paymentData); + Payment payment = new PaymentVoucherCode("6c93d3e2-b009-46ba-9d15-f03d85adc2de", this.orders.getFirst(), paymentData); assertEquals("REJECTED", payment.getStatus()); } @@ -82,17 +81,25 @@ void testCreatePaymentVoucherCodeRejectedNotStartedWithESHOP(){ void testCreatePaymentVoucherCodeRejectedNotContain8NumericalCharacters(){ Map paymentData = new HashMap(); paymentData.put("voucherCode", "ESHOP1234ABC567D"); - Payment payment = new Payment("6c93d3e2-b009-46ba-9d15-f03d85adc2de", this.orders.getFirst(), "VOUCHER_CODE", paymentData); + Payment payment = new PaymentVoucherCode("6c93d3e2-b009-46ba-9d15-f03d85adc2de", this.orders.getFirst(), paymentData); + + assertEquals("REJECTED", payment.getStatus()); + } + + @Test + void testCreatePaymentVoucherCodeRejectedNoVocuherCode(){ + Map paymentData = new HashMap(); + Payment payment = new PaymentVoucherCode("6c93d3e2-b009-46ba-9d15-f03d85adc2de", this.orders.getFirst(), paymentData); assertEquals("REJECTED", payment.getStatus()); } @Test - void testSetStatusPaymentVoucherCodeSucess(){ + void testSetStatusPaymentVoucherCodeSuccess(){ Map paymentData = new HashMap(); paymentData.put("voucherCode", "ESHOP1234ABC567D"); - Payment payment = new Payment("6c93d3e2-b009-46ba-9d15-f03d85adc2de", this.orders.getFirst(), "VOUCHER_CODE", paymentData); + Payment payment = new PaymentVoucherCode("6c93d3e2-b009-46ba-9d15-f03d85adc2de", this.orders.getFirst(), paymentData); payment.setStatus("SUCCESS"); assertEquals("SUCCESS", payment.getOrder().getStatus()); @@ -101,7 +108,7 @@ void testSetStatusPaymentVoucherCodeSucess(){ void testSetStatusPaymentVoucherCodeRejected(){ Map paymentData = new HashMap(); paymentData.put("voucherCode", "ESHOP1234ABC567D"); - Payment payment = new Payment("6c93d3e2-b009-46ba-9d15-f03d85adc2de", this.orders.getFirst(), "VOUCHER_CODE", paymentData); + Payment payment = new PaymentVoucherCode("6c93d3e2-b009-46ba-9d15-f03d85adc2de", this.orders.getFirst(), paymentData); payment.setStatus("REJECTED"); assertEquals("FAILED", payment.getOrder().getStatus()); @@ -112,7 +119,7 @@ void testSetStatusPaymentVoucherCodeRejected(){ void testCreateOrderInvalidStatus() { Map paymentData = new HashMap(); paymentData.put("voucherCode", "ESHOP1234ABC567D"); - Payment payment = new Payment("6c93d3e2-b009-46ba-9d15-f03d85adc2de", this.orders.getFirst(), "VOUCHER_CODE", paymentData); + Payment payment = new PaymentVoucherCode("6c93d3e2-b009-46ba-9d15-f03d85adc2de", this.orders.getFirst(), paymentData); assertThrows (IllegalArgumentException.class, () -> { payment.setStatus("WKWKWKWK"); @@ -127,7 +134,7 @@ void testCreatePaymentCashOnDeliverySuccess(){ Map paymentData = new HashMap(); paymentData.put("address", "Jalan Anggur"); paymentData.put("deliveryFee", "12000"); - Payment payment = new Payment("6c93d3e2-b009-46ba-9d15-f03d85adc2de", this.orders.getFirst(), "CASH_ON_DELIVERY", paymentData); + Payment payment = new PaymentCashOnDelivery("6c93d3e2-b009-46ba-9d15-f03d85adc2de", this.orders.getFirst(), paymentData); assertEquals("SUCCESS", payment.getStatus()); } @@ -135,7 +142,7 @@ void testCreatePaymentCashOnDeliverySuccess(){ void testCreatePaymentCashOnDeliveryRejectedMissingAddress(){ Map paymentData = new HashMap(); paymentData.put("deliveryFee", "12000"); - Payment payment = new Payment("6c93d3e2-b009-46ba-9d15-f03d85adc2de", this.orders.getFirst(), "CASH_ON_DELIVERY", paymentData); + Payment payment = new PaymentCashOnDelivery("6c93d3e2-b009-46ba-9d15-f03d85adc2de", this.orders.getFirst(), paymentData); assertEquals("REJECTED", payment.getStatus()); } @@ -143,7 +150,7 @@ void testCreatePaymentCashOnDeliveryRejectedMissingAddress(){ void testCreatePaymentCashOnDeliveryRejectedMissingDeliveryFee(){ Map paymentData = new HashMap(); paymentData.put("address", "Jalan Anggur"); - Payment payment = new Payment("6c93d3e2-b009-46ba-9d15-f03d85adc2de", this.orders.getFirst(), "CASH_ON_DELIVERY", paymentData); + Payment payment = new PaymentCashOnDelivery("6c93d3e2-b009-46ba-9d15-f03d85adc2de", this.orders.getFirst(), paymentData); assertEquals("REJECTED", payment.getStatus()); } @@ -153,7 +160,7 @@ void testSetStatusPaymentCashOnDeliverySuccess(){ Map paymentData = new HashMap(); paymentData.put("address", "Jalan Anggur"); paymentData.put("deliveryFee", "12000"); - Payment payment = new Payment("6c93d3e2-b009-46ba-9d15-f03d85adc2de", this.orders.getFirst(), "CASH_ON_DELIVERY", paymentData); + Payment payment = new PaymentCashOnDelivery("6c93d3e2-b009-46ba-9d15-f03d85adc2de", this.orders.getFirst(), paymentData); payment.setStatus("SUCCESS"); assertEquals("SUCCESS", payment.getOrder().getStatus()); @@ -163,20 +170,9 @@ void testSetStatusPaymentCashOnDeliveryRejected(){ Map paymentData = new HashMap(); paymentData.put("address", "Jalan Anggur"); paymentData.put("deliveryFee", "12000"); - Payment payment = new Payment("6c93d3e2-b009-46ba-9d15-f03d85adc2de", this.orders.getFirst(), "CASH_ON_DELIVERY", paymentData); + Payment payment = new PaymentCashOnDelivery("6c93d3e2-b009-46ba-9d15-f03d85adc2de", this.orders.getFirst(), paymentData); payment.setStatus("REJECTED"); assertEquals("FAILED", payment.getOrder().getStatus()); } - - // Invalid payment method - @Test - void testCreateOrderInvalidMethod() { - Map paymentData = new HashMap(); - paymentData.put("voucherCode", "ESHOP1234ABC567D"); - - assertThrows (IllegalArgumentException.class, () -> { - Payment payment = new Payment("6c93d3e2-b009-46ba-9d15-f03d85adc2de", this.orders.getFirst(), "WKWKWKWKWK", paymentData); - }); - } } diff --git a/src/test/java/id/ac/ui/cs/advprog/eshop/repository/PaymentRepositoryTest.java b/src/test/java/id/ac/ui/cs/advprog/eshop/repository/PaymentRepositoryTest.java index 1197291..0cdc8c3 100644 --- a/src/test/java/id/ac/ui/cs/advprog/eshop/repository/PaymentRepositoryTest.java +++ b/src/test/java/id/ac/ui/cs/advprog/eshop/repository/PaymentRepositoryTest.java @@ -1,9 +1,7 @@ package id.ac.ui.cs.advprog.eshop.repository; -import id.ac.ui.cs.advprog.eshop.model.Order; -import id.ac.ui.cs.advprog.eshop.model.Payment; -import id.ac.ui.cs.advprog.eshop.model.Product; +import id.ac.ui.cs.advprog.eshop.model.*; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -44,13 +42,13 @@ void setUp() { Map paymentData1 = new HashMap(); paymentData1.put("voucherCode", "ESHOP1234ABC5678"); - Payment payment1 = new Payment("6c93d3e2-b009-46ba-9d15-f03d85adc2de", orders.getFirst(), "VOUCHER_CODE", paymentData1); + Payment payment1 = new PaymentVoucherCode("6c93d3e2-b009-46ba-9d15-f03d85adc2de", orders.getFirst(), paymentData1); payments.add(payment1); Map paymentData2 = new HashMap(); paymentData2.put("address", "Jalan Anggur"); paymentData2.put("deliveryFee", "12000"); - Payment payment2 = new Payment("6c93d3e2-b009-46ba-9d15-f03d85adc2d2", orders.getFirst(), "CASH_ON_DELIVERY", paymentData2); + Payment payment2 = new PaymentCashOnDelivery("6c93d3e2-b009-46ba-9d15-f03d85adc2d2", orders.getFirst(), paymentData2); payments.add(payment2); } @@ -64,7 +62,6 @@ void testSaveCreate() { assertEquals(payment.getId(), result.getId()); assertEquals(payment.getId(), findResult.getId()); - assertEquals(payment.getMethod(), findResult.getMethod()); assertEquals(payment.getStatus(), findResult.getStatus()); assertEquals(payment.getPaymentData(), findResult.getPaymentData()); assertSame(payment.getOrder(), findResult.getOrder()); @@ -78,14 +75,13 @@ void testSaveUpdate() { paymentRepository.save(payment); // change payment data - Payment newPayment = new Payment(payment.getId(), payment.getOrder(), payment.getMethod(), payments.get(0).getPaymentData()); + Payment newPayment = new PaymentCashOnDelivery(payment.getId(), payment.getOrder(), payments.get(0).getPaymentData()); Payment result = paymentRepository.save(newPayment); Payment findResult = paymentRepository.findById(payments.get(1).getId()); assertEquals(payment.getId(), result.getId()); assertEquals(payment.getId(), findResult.getId()); - assertEquals(payment.getMethod(), findResult.getMethod()); assertEquals(payments.getFirst().getPaymentData(), findResult.getPaymentData()); assertSame(payment.getOrder(), findResult.getOrder()); @@ -100,7 +96,6 @@ void testFindByIdIfIdFound() { Payment findResult = paymentRepository.findById(payments.get(1).getId()); assertEquals(payments.get(1).getId(), findResult.getId()); - assertEquals(payments.get(1).getMethod(), findResult.getMethod()); assertEquals(payments.get(1).getStatus(), findResult.getStatus()); assertEquals(payments.get(1).getPaymentData(), findResult.getPaymentData()); assertSame(payments.get(1).getOrder(), findResult.getOrder()); From 75c52008294b8517091e2ba485dc1e1689781014 Mon Sep 17 00:00:00 2001 From: Fredo Melvern Tanzil Date: Sun, 3 Mar 2024 11:53:27 +0700 Subject: [PATCH 20/22] [RED] Add tests for PaymentServiceImpl --- .../advprog/eshop/service/PaymentService.java | 14 ++ .../eshop/service/PaymentServiceImpl.java | 23 +++ .../eshop/service/PaymentServiceImplTest.java | 156 ++++++++++++++++++ 3 files changed, 193 insertions(+) create mode 100644 src/main/java/id/ac/ui/cs/advprog/eshop/service/PaymentService.java create mode 100644 src/main/java/id/ac/ui/cs/advprog/eshop/service/PaymentServiceImpl.java create mode 100644 src/test/java/id/ac/ui/cs/advprog/eshop/service/PaymentServiceImplTest.java diff --git a/src/main/java/id/ac/ui/cs/advprog/eshop/service/PaymentService.java b/src/main/java/id/ac/ui/cs/advprog/eshop/service/PaymentService.java new file mode 100644 index 0000000..a7743a0 --- /dev/null +++ b/src/main/java/id/ac/ui/cs/advprog/eshop/service/PaymentService.java @@ -0,0 +1,14 @@ +package id.ac.ui.cs.advprog.eshop.service; + +import id.ac.ui.cs.advprog.eshop.model.Order; +import id.ac.ui.cs.advprog.eshop.model.Payment; + +import java.util.List; +import java.util.Map; + +public interface PaymentService { + public Payment addPayment (String id, Order order, String method, Map paymentData); + public Payment setStatus(Payment payment, String status); + public Payment getPayment(String paymentId); + public List getAllPayments(); +} diff --git a/src/main/java/id/ac/ui/cs/advprog/eshop/service/PaymentServiceImpl.java b/src/main/java/id/ac/ui/cs/advprog/eshop/service/PaymentServiceImpl.java new file mode 100644 index 0000000..e344289 --- /dev/null +++ b/src/main/java/id/ac/ui/cs/advprog/eshop/service/PaymentServiceImpl.java @@ -0,0 +1,23 @@ +package id.ac.ui.cs.advprog.eshop.service; + +import id.ac.ui.cs.advprog.eshop.model.Order; +import id.ac.ui.cs.advprog.eshop.model.Payment; + +import java.util.List; +import java.util.Map; + +public class PaymentServiceImpl implements PaymentService{ + + public Payment addPayment (String id, Order order, String method, Map paymentData){ + return null; + } + public Payment setStatus(Payment payment, String status){ + return null; + } + public Payment getPayment(String paymentId){ + return null; + } + public List getAllPayments(){ + return null; + } +} diff --git a/src/test/java/id/ac/ui/cs/advprog/eshop/service/PaymentServiceImplTest.java b/src/test/java/id/ac/ui/cs/advprog/eshop/service/PaymentServiceImplTest.java new file mode 100644 index 0000000..aa8cf72 --- /dev/null +++ b/src/test/java/id/ac/ui/cs/advprog/eshop/service/PaymentServiceImplTest.java @@ -0,0 +1,156 @@ +package id.ac.ui.cs.advprog.eshop.service; + + +import id.ac.ui.cs.advprog.eshop.enums.PaymentStatus; +import id.ac.ui.cs.advprog.eshop.model.*; +import id.ac.ui.cs.advprog.eshop.repository.PaymentRepository; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.*; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +class PaymentServiceImplTest { + @InjectMocks + PaymentServiceImpl paymentService; + @Mock + PaymentRepository paymentRepository; + List> paymentDatas; + List orders; + + @BeforeEach + void setUp() { + + // Make product + List products = new ArrayList<>(); + Product product1 = new Product(); + product1.setProductId("eb558e9f-1c39-460e-8860-71af6af63bd6"); + product1.setProductName("Sampo Cap Bambang"); + product1.setProductQuantity(2); + products.add(product1); + + // Make order + orders = new ArrayList<>(); + Order order1 = new Order("13652556-012a-4c07-b546-54eb1396d79b", products, 1708560000L, "Safira Sudrajat"); + orders.add(order1); + Order order2 = new Order("7f9e15bb-4b15-42f4-aebc-c3af385fb078", products, 1708570000L, "Safira Sudrajat"); + orders.add(order2); + + // Make payment datas + Map paymentData1 = new HashMap(); + paymentData1.put("voucherCode", "ESHOP1234ABC5678"); + paymentDatas.add(paymentData1); + + Map paymentData2 = new HashMap(); + paymentData2.put("address", "Jalan Anggur"); + paymentData2.put("deliveryFee", "12000"); + paymentDatas.add(paymentData2); + } + + @Test + void testCreatePaymentVoucherCode() { + String id = "75c64e96-d4d7-454b-8ee5-7086efff516c"; + Payment payment = new PaymentVoucherCode(id, orders.get(1), paymentDatas.get(0)); + + doReturn(payment).when(paymentRepository).save(payment); + Payment result = paymentService.addPayment(id, orders.get(1), "VOUCHER_CODE", paymentDatas.get(0)); + + verify(paymentRepository, times(1)).save(payment); + assertEquals(payment.getId(), result.getId()); + } + + + @Test + void testCreatePaymentIfAlreadyExists() { + String id = "75c64e96-d4d7-454b-8ee5-7086efff516c"; + Payment payment = new PaymentVoucherCode(id, orders.get(1), paymentDatas.get(0)); + + doReturn(payment).when(paymentRepository).findById(payment.getId()); + + assertNull(paymentService.addPayment(id, orders.get(1), "VOUCHER_CODE", paymentDatas.get(0))); + verify(paymentRepository, times(0)).save(payment); + } + + @Test + void testSetStatus() { + Payment payment = new PaymentCashOnDelivery("75c64e96-d4d7-454b-8ee5-7086efff516c", orders.get(1), paymentDatas.get(0)); + assertEquals(PaymentStatus.REJECTED.getValue(), payment.getStatus()); + + Payment newPayment = new PaymentVoucherCode(payment.getId(), payment.getOrder(), paymentDatas.get(1)); + + + doReturn(payment).when(paymentRepository).findById(payment.getId()); + doReturn(newPayment).when(paymentRepository).save(any(Payment.class)); + + Payment result = paymentService.setStatus(payment, PaymentStatus.SUCCESS.getValue()); + + assertEquals(payment.getId(), result.getId()); + assertEquals(PaymentStatus.SUCCESS.getValue(), result.getStatus()); + verify(paymentRepository, times(1)).save(any(Payment.class)); + } + + + @Test + void testSetStatusInvalidStatus() { + Payment payment = new PaymentCashOnDelivery("75c64e96-d4d7-454b-8ee5-7086efff516c", orders.get(1), paymentDatas.get(0)); + assertEquals(PaymentStatus.REJECTED.getValue(), payment.getStatus()); + + doReturn(payment).when(paymentRepository).findById(payment.getId()); + + assertThrows(IllegalArgumentException.class, + () -> paymentService.setStatus(payment, "MEOW")); + + verify(paymentRepository, times(0)).save(any(Payment.class)); + } + + + @Test + void testSetStatusInvalidPaymentId() { + Payment payment = new PaymentCashOnDelivery("75c64e96-d4d7-454b-8ee5-7086efff516c", orders.get(1), paymentDatas.get(0)); + + doReturn(null).when(paymentRepository).findById(payment.getId()); + + assertThrows(NoSuchElementException.class, + () -> paymentService.setStatus(payment, PaymentStatus.SUCCESS.getValue())); + + verify(paymentRepository, times(0)).save(any(Payment.class)); + } + + @Test + void testGetPaymentIfIdFound() { + Payment payment = new PaymentCashOnDelivery("75c64e96-d4d7-454b-8ee5-7086efff516c", orders.get(1), paymentDatas.get(0)); + + doReturn(payment).when(paymentRepository).findById(payment.getId()); + + Payment result = paymentService.getPayment(payment.getId()); + assertEquals(payment.getId(), result.getId()); + } + + @Test + void testGetPaymentIfIfIdNotFound() { + Payment payment = new PaymentCashOnDelivery("75c64e96-d4d7-454b-8ee5-7086efff516c", orders.get(1), paymentDatas.get(0)); + + assertNull(paymentService.getPayment(payment.getId())); + } + + @Test + void testGetAllPayments() { + Payment payment = new PaymentCashOnDelivery("75c64e96-d4d7-454b-8ee5-7086efff516c", orders.get(1), paymentDatas.get(0)); + List payments = new ArrayList<>(); + payments.add(payment); + + doReturn(payments).when(paymentRepository).getAllPayment(); + + List results = paymentService.getAllPayments(); + assertEquals(payments, results); + + assertEquals(1, results.size()); + } +} From d9aeb220d1f8cb8c0183b8c7d52356146ac1aaf6 Mon Sep 17 00:00:00 2001 From: Fredo Melvern Tanzil Date: Sun, 3 Mar 2024 18:06:08 +0700 Subject: [PATCH 21/22] [GREEN] Implement PaymentServiceImpl --- .../eshop/service/PaymentServiceImpl.java | 49 +++++++++++++++++-- .../eshop/service/PaymentServiceImplTest.java | 21 +++++++- 2 files changed, 65 insertions(+), 5 deletions(-) diff --git a/src/main/java/id/ac/ui/cs/advprog/eshop/service/PaymentServiceImpl.java b/src/main/java/id/ac/ui/cs/advprog/eshop/service/PaymentServiceImpl.java index e344289..1ff811a 100644 --- a/src/main/java/id/ac/ui/cs/advprog/eshop/service/PaymentServiceImpl.java +++ b/src/main/java/id/ac/ui/cs/advprog/eshop/service/PaymentServiceImpl.java @@ -2,22 +2,65 @@ import id.ac.ui.cs.advprog.eshop.model.Order; import id.ac.ui.cs.advprog.eshop.model.Payment; +import id.ac.ui.cs.advprog.eshop.model.PaymentCashOnDelivery; +import id.ac.ui.cs.advprog.eshop.model.PaymentVoucherCode; +import id.ac.ui.cs.advprog.eshop.repository.PaymentRepository; +import org.springframework.beans.factory.annotation.Autowired; import java.util.List; import java.util.Map; +import java.util.NoSuchElementException; public class PaymentServiceImpl implements PaymentService{ + @Autowired + private PaymentRepository paymentRepository; public Payment addPayment (String id, Order order, String method, Map paymentData){ + if (paymentRepository.findById(id) == null){ + + Payment payment; + switch (method){ + case "VOUCHER_CODE": + payment = new PaymentVoucherCode(id, order, paymentData); + break; + case "CASH_ON_DELIVERY": + payment = new PaymentCashOnDelivery(id, order, paymentData); + break; + default: + throw new IllegalArgumentException(); + } + paymentRepository.save(payment); + return payment; + } return null; } public Payment setStatus(Payment payment, String status){ - return null; + Payment savedPayment = paymentRepository.findById(payment.getId()); + if (savedPayment != null){ + + Payment newPayment; + if (payment instanceof PaymentVoucherCode){ + newPayment = new PaymentVoucherCode(payment.getId(), payment.getOrder(), payment.getPaymentData()); + + } else if (payment instanceof PaymentCashOnDelivery){ + newPayment = new PaymentCashOnDelivery(payment.getId(), payment.getOrder(), payment.getPaymentData()); + + } else{ + // Unknown Payment type + throw new IllegalArgumentException(); + } + newPayment.setStatus(status); + paymentRepository.save(newPayment); + return newPayment; + + }else{ + throw new NoSuchElementException(); + } } public Payment getPayment(String paymentId){ - return null; + return paymentRepository.findById(paymentId); } public List getAllPayments(){ - return null; + return paymentRepository.getAllPayment(); } } diff --git a/src/test/java/id/ac/ui/cs/advprog/eshop/service/PaymentServiceImplTest.java b/src/test/java/id/ac/ui/cs/advprog/eshop/service/PaymentServiceImplTest.java index aa8cf72..03de056 100644 --- a/src/test/java/id/ac/ui/cs/advprog/eshop/service/PaymentServiceImplTest.java +++ b/src/test/java/id/ac/ui/cs/advprog/eshop/service/PaymentServiceImplTest.java @@ -43,7 +43,10 @@ void setUp() { Order order2 = new Order("7f9e15bb-4b15-42f4-aebc-c3af385fb078", products, 1708570000L, "Safira Sudrajat"); orders.add(order2); + // Make payment datas + paymentDatas = new ArrayList<>(); + Map paymentData1 = new HashMap(); paymentData1.put("voucherCode", "ESHOP1234ABC5678"); paymentDatas.add(paymentData1); @@ -59,13 +62,27 @@ void testCreatePaymentVoucherCode() { String id = "75c64e96-d4d7-454b-8ee5-7086efff516c"; Payment payment = new PaymentVoucherCode(id, orders.get(1), paymentDatas.get(0)); - doReturn(payment).when(paymentRepository).save(payment); + doReturn(null).when(paymentRepository).findById(id); + doReturn(payment).when(paymentRepository).save(any(Payment.class)); + Payment result = paymentService.addPayment(id, orders.get(1), "VOUCHER_CODE", paymentDatas.get(0)); - verify(paymentRepository, times(1)).save(payment); + verify(paymentRepository, times(1)).save(any(Payment.class)); assertEquals(payment.getId(), result.getId()); } + @Test + void testInvalidPaymentMethod() { + String id = "75c64e96-d4d7-454b-8ee5-7086efff516c"; + Payment payment = new PaymentVoucherCode(id, orders.get(1), paymentDatas.get(0)); + + doReturn(null).when(paymentRepository).findById(id); + assertThrows(IllegalArgumentException.class, + () -> paymentService.addPayment(id, orders.get(1), "WKWKWKWK", paymentDatas.get(0))); + + verify(paymentRepository, times(0)).save(payment); + } + @Test void testCreatePaymentIfAlreadyExists() { From 1fcb422189dddffbde02f5d46a96d123192e21d2 Mon Sep 17 00:00:00 2001 From: Fredo Melvern Tanzil Date: Sun, 3 Mar 2024 18:12:31 +0700 Subject: [PATCH 22/22] [REFACTOR] fix paymentServiceImpl --- .../eshop/service/PaymentServiceImpl.java | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/src/main/java/id/ac/ui/cs/advprog/eshop/service/PaymentServiceImpl.java b/src/main/java/id/ac/ui/cs/advprog/eshop/service/PaymentServiceImpl.java index 1ff811a..77af1f4 100644 --- a/src/main/java/id/ac/ui/cs/advprog/eshop/service/PaymentServiceImpl.java +++ b/src/main/java/id/ac/ui/cs/advprog/eshop/service/PaymentServiceImpl.java @@ -1,5 +1,6 @@ package id.ac.ui.cs.advprog.eshop.service; +import id.ac.ui.cs.advprog.eshop.enums.PaymentStatus; import id.ac.ui.cs.advprog.eshop.model.Order; import id.ac.ui.cs.advprog.eshop.model.Payment; import id.ac.ui.cs.advprog.eshop.model.PaymentCashOnDelivery; @@ -38,20 +39,9 @@ public Payment setStatus(Payment payment, String status){ Payment savedPayment = paymentRepository.findById(payment.getId()); if (savedPayment != null){ - Payment newPayment; - if (payment instanceof PaymentVoucherCode){ - newPayment = new PaymentVoucherCode(payment.getId(), payment.getOrder(), payment.getPaymentData()); - - } else if (payment instanceof PaymentCashOnDelivery){ - newPayment = new PaymentCashOnDelivery(payment.getId(), payment.getOrder(), payment.getPaymentData()); - - } else{ - // Unknown Payment type - throw new IllegalArgumentException(); - } - newPayment.setStatus(status); - paymentRepository.save(newPayment); - return newPayment; + savedPayment.setStatus(status); + paymentRepository.save(savedPayment); + return savedPayment; }else{ throw new NoSuchElementException();