From b8bf8e98cb7a156d42ca1d307a0848b8f613a703 Mon Sep 17 00:00:00 2001 From: astrialyanda Date: Tue, 5 Mar 2024 14:06:39 +0700 Subject: [PATCH 01/28] [RED] add tests for Order model --- .../ui/cs/advprog/eshop/model/OrderTest.java | 82 +++++++++++++++++++ 1 file changed, 82 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..9487001 --- /dev/null +++ b/src/test/java/id/ac/ui/cs/advprog/eshop/model/OrderTest.java @@ -0,0 +1,82 @@ +package id.ac.ui.cs.advprog.eshop.model; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.*; + +import java.util.ArrayList; +import java.util.List; + +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, 1708560000L, "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 testSetStatusCancelled() { + Order order = new Order("13652556-012a-4c07-b546-54eb1396d79b", + this.products, 1708560000L, "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 e1e3408bd739dc7a7c8052229ce38e7e7758190b Mon Sep 17 00:00:00 2001 From: astrialyanda Date: Tue, 5 Mar 2024 14:15:33 +0700 Subject: [PATCH 02/28] [RED] add Order model skeleton --- .../ac/ui/cs/advprog/eshop/model/Order.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) 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..b5b6ff3 --- /dev/null +++ b/src/main/java/id/ac/ui/cs/advprog/eshop/model/Order.java @@ -0,0 +1,24 @@ +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) { + } +} From ada14e7a971af901b415db113d0432479119d42b Mon Sep 17 00:00:00 2001 From: astrialyanda Date: Tue, 5 Mar 2024 14:41:38 +0700 Subject: [PATCH 03/28] [GREEN] implement Order model --- .../ac/ui/cs/advprog/eshop/model/Order.java | 29 ++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) 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 b5b6ff3..bc79034 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 @@ -4,6 +4,7 @@ import lombok.Getter; import lombok.Setter; +import java.util.Arrays; import java.util.List; @Builder @@ -13,12 +14,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; + } } } From 835eb6dc757e8a20e9cd2a74a8f39fa618c5015f Mon Sep 17 00:00:00 2001 From: astrialyanda Date: Tue, 5 Mar 2024 15:21:07 +0700 Subject: [PATCH 04/28] [REFACTOR] add OrderStatus enum --- .../cs/advprog/eshop/enums/OrderStatus.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 src/main/java/id/ac/ui/cs/advprog/eshop/enums/OrderStatus.java diff --git a/src/main/java/id/ac/ui/cs/advprog/eshop/enums/OrderStatus.java b/src/main/java/id/ac/ui/cs/advprog/eshop/enums/OrderStatus.java new file mode 100644 index 0000000..f772a89 --- /dev/null +++ b/src/main/java/id/ac/ui/cs/advprog/eshop/enums/OrderStatus.java @@ -0,0 +1,26 @@ +package id.ac.ui.cs.advprog.eshop.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; + } +} From f2b3607bcb4719f2b80f9f56f14d9b45975db177 Mon Sep 17 00:00:00 2001 From: astrialyanda Date: Tue, 5 Mar 2024 15:27:55 +0700 Subject: [PATCH 05/28] [REFACTOR] apply OrderStatus enum check to Order model --- .../ac/ui/cs/advprog/eshop/model/Order.java | 20 ++++++------------- 1 file changed, 6 insertions(+), 14 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 bc79034..3bfb682 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,10 +1,9 @@ package id.ac.ui.cs.advprog.eshop.model; +import id.ac.ui.cs.advprog.eshop.enums.OrderStatus; import lombok.Builder; import lombok.Getter; -import lombok.Setter; -import java.util.Arrays; import java.util.List; @Builder @@ -20,7 +19,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(); @@ -31,21 +30,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 5de0d95accf15bc6bb04fe023edb92a132de9757 Mon Sep 17 00:00:00 2001 From: astrialyanda Date: Tue, 5 Mar 2024 15:33:22 +0700 Subject: [PATCH 06/28] [REFACTOR] apply OrderStatus enum to Order model tests --- src/test/java/id/ac/ui/cs/advprog/eshop/model/OrderTest.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 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 9487001..63ae1b3 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,5 +1,6 @@ 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 static org.junit.jupiter.api.Assertions.*; @@ -53,7 +54,8 @@ void testCreateOrderDefaultStatus() { @Test void testCreateOrderSuccessStatus() { Order order = new Order("13652556-012a-4c07-b546-54eb1396d79b", - this.products, 1708560000L, "Safira Sudrajat", "SUCCESS"); + this.products, 1708560000L, "Safira Sudrajat", + OrderStatus.SUCCESS.getValue()); assertEquals("SUCCESS", order.getStatus()); } From 9054ef3498bbe7ea88537ba370420d2532183762 Mon Sep 17 00:00:00 2001 From: astrialyanda Date: Wed, 6 Mar 2024 04:21:36 +0700 Subject: [PATCH 07/28] [RED] add tests for OrderRepository --- .../eshop/repository/OrderRepositoryTest.java | 110 ++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 src/test/java/id/ac/ui/cs/advprog/eshop/repository/OrderRepositoryTest.java 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..9121336 --- /dev/null +++ b/src/test/java/id/ac/ui/cs/advprog/eshop/repository/OrderRepositoryTest.java @@ -0,0 +1,110 @@ +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 static org.junit.jupiter.api.Assertions.*; + +import java.util.ArrayList; +import java.util.List; + +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-c3af385fb078", + products, 1708570000L, "Safira Sudrajat"); + orders.add(order2); + Order order3 = new Order("e334ef40-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(), findResult.getStatus()); + } + + @Test + void testFindByIdFound() { + 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 testFindAllByAuthorIfAllLowercase() { + orderRepository.save(orders.get(1)); + + List orderList = orderRepository.findAllByAuthor( + orders.get(1).getAuthor().toLowerCase()); + assertTrue(orderList.isEmpty()); + } +} From 2c7b1d17e15ad72bcb3bdd3427eba72baf0ffb69 Mon Sep 17 00:00:00 2001 From: astrialyanda Date: Wed, 6 Mar 2024 04:27:55 +0700 Subject: [PATCH 08/28] [RED] add OrderRepository skeleton --- .../advprog/eshop/repository/OrderRepository.java | 15 +++++++++++++++ 1 file changed, 15 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..151c3c0 --- /dev/null +++ b/src/main/java/id/ac/ui/cs/advprog/eshop/repository/OrderRepository.java @@ -0,0 +1,15 @@ +package id.ac.ui.cs.advprog.eshop.repository; + +import id.ac.ui.cs.advprog.eshop.model.Order; +import org.springframework.stereotype.Repository; + +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 dddbcf14899176385bea1231aada357176202ee4 Mon Sep 17 00:00:00 2001 From: astrialyanda Date: Wed, 6 Mar 2024 07:43:08 +0700 Subject: [PATCH 09/28] [GREEN] implement OrderRepository class --- .../eshop/repository/OrderRepository.java | 37 +++++++++++++++++-- 1 file changed, 34 insertions(+), 3 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 151c3c0..f360f82 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 @@ -9,7 +9,38 @@ @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;} + + public Order save(Order order) { + 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) { + List result = new ArrayList<>(); + for (Order savedOrder : orderData) { + if (savedOrder.getAuthor().equals(author)) { + result.add(savedOrder); + } + } + return result; + } } From 107ff0bb544754106b5762717ea84fdfdb080cc8 Mon Sep 17 00:00:00 2001 From: astrialyanda Date: Wed, 6 Mar 2024 10:52:22 +0700 Subject: [PATCH 10/28] [RED] add tests for OrderServiceImpl --- .../eshop/service/OrderServiceImplTest.java | 143 ++++++++++++++++++ 1 file changed, 143 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..750d671 --- /dev/null +++ b/src/test/java/id/ac/ui/cs/advprog/eshop/service/OrderServiceImplTest.java @@ -0,0 +1,143 @@ +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 static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.times; + +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.ArrayList; +import java.util.List; +import java.util.NoSuchElementException; + +@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 dc84225b6cbf6f3f28581a502453108fd787a1a5 Mon Sep 17 00:00:00 2001 From: astrialyanda Date: Wed, 6 Mar 2024 11:03:58 +0700 Subject: [PATCH 11/28] [RED] add OrderServiceImpl skeleton --- .../advprog/eshop/service/OrderService.java | 12 +++++++++ .../eshop/service/OrderServiceImpl.java | 26 +++++++++++++++++++ 2 files changed, 38 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..498eddb --- /dev/null +++ b/src/main/java/id/ac/ui/cs/advprog/eshop/service/OrderService.java @@ -0,0 +1,12 @@ +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..7483e3a --- /dev/null +++ b/src/main/java/id/ac/ui/cs/advprog/eshop/service/OrderServiceImpl.java @@ -0,0 +1,26 @@ +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 40955c5a06095f4e04ce846fd85b4f991f816d74 Mon Sep 17 00:00:00 2001 From: astrialyanda Date: Wed, 6 Mar 2024 11:48:57 +0700 Subject: [PATCH 12/28] [GREEN] implement OrderService class --- .../eshop/service/OrderServiceImpl.java | 29 ++++++++++++++++--- 1 file changed, 25 insertions(+), 4 deletions(-) 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 7483e3a..f7e4183 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,14 +14,34 @@ public class OrderServiceImpl implements OrderService{ private OrderRepository orderRepository; @Override - public Order createOrder(Order order) {return null;} + 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;} + public Order updateStatus(String orderId, String status) { + 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;} + public List findAllByAuthor(String author) { + return orderRepository.findAllByAuthor(author); + } @Override - public Order findById(String orderId) {return null;} + public Order findById(String orderId) { + return orderRepository.findById(orderId); + } } From 664b1054710aa81bf7b656cf6bafb76d56ea14ff Mon Sep 17 00:00:00 2001 From: astrialyanda Date: Wed, 6 Mar 2024 15:38:25 +0700 Subject: [PATCH 13/28] [RED] add tests for Payment model --- .../cs/advprog/eshop/model/PaymentTest.java | 149 ++++++++++++++++++ 1 file changed, 149 insertions(+) create mode 100644 src/test/java/id/ac/ui/cs/advprog/eshop/model/PaymentTest.java 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..0850392 --- /dev/null +++ b/src/test/java/id/ac/ui/cs/advprog/eshop/model/PaymentTest.java @@ -0,0 +1,149 @@ +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.HashMap; +import java.util.List; +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.*; + +class PaymentTest { + private List orders; + private List products; + + @BeforeEach + void setUp() { + this.products = new ArrayList<>(); + this.orders = new ArrayList<>(); + + Product product1 = new Product(); + product1.setProductId("39a06a92-87ae-4cf4-8c10-35b956699245"); + product1.setProductName("Sapu Ajaib Abdul"); + product1.setProductQuantity(2); + + Product product2 = new Product(); + product2.setProductId("baa3ee56-9ce7-4608-9f83-a2672e8521b3"); + product2.setProductName("Kapas Putih Samara"); + product2.setProductQuantity(1); + + this.products.add(product1); + this.products.add(product2); + + Order order1 = new Order("66a35b43-431c-4868-b078-00b927557a65", this.products, 1708560000L,"Siti"); + Order order2 = new Order("21d7e0b9-9470-466e-acfe-c0527a745b6a", this.products, 1708570000L, "Cipto"); + + this.orders.add(order1); + this.orders.add(order2); + } + + @Test + void testPaymentByVoucherSuccess() { + Map paymentData = new HashMap<>(); + paymentData.put("voucherCode", "ESHOP1234ABC5678"); + + Payment payment = new Payment("68ea553b-a533-4395-99c2-f15a83e9d739", "VOUCHER_CODE", + orders.get(1), paymentData); + + assertEquals("SUCCESS", payment.getStatus()); + } + + @Test + void testPaymentByVoucherRejectedNot16Characters() { + Map paymentData = new HashMap<>(); + paymentData.put("voucherCode", "ESHOP1234"); + + Payment payment = new Payment("68ea553b-a533-4395-99c2-f15a83e9d739", "VOUCHER_CODE", + orders.get(1), paymentData); + + assertEquals("REJECTED", payment.getStatus()); + } + + @Test + void testPaymentByVoucherRejectedNotStartedByEshop() { + Map paymentData = new HashMap<>(); + paymentData.put("voucherCode", "1234ABC5678"); + + Payment payment = new Payment("68ea553b-a533-4395-99c2-f15a83e9d739", "VOUCHER_CODE", + orders.get(1), paymentData); + + assertEquals("REJECTED", payment.getStatus()); + } + + @Test + void testPaymentByVoucherRejectedNot8NumericalChar() { + Map paymentData = new HashMap<>(); + paymentData.put("voucherCode", "ESHOP1234ABCDEFG"); + + Payment payment = new Payment("68ea553b-a533-4395-99c2-f15a83e9d739", "VOUCHER_CODE", + orders.get(1), paymentData); + assertEquals("REJECTED", payment.getStatus()); + } + + @Test + void testPaymentByCashOnDeliverySuccess() { + Map paymentData = new HashMap<>(); + paymentData.put("address", "Jl. Kelapa 2"); + paymentData.put("deliveryFee", "22000"); + + Payment payment = new Payment("4bb81b30-af6a-48f8-810f-0779dc04dd54", "CASH_ON_DELIVERY", + orders.get(1), paymentData); + assertEquals("SUCCESS", payment.getStatus()); + } + + @Test + void testPaymentByCashOnDeliveryRejectedAddressEmpty() { + Map paymentData = new HashMap<>(); + paymentData.put("address", ""); + paymentData.put("deliveryFee", "22000"); + + Payment payment = new Payment("4bb81b30-af6a-48f8-810f-0779dc04dd54", "CASH_ON_DELIVERY", + orders.get(1), paymentData); + assertEquals("REJECTED", payment.getStatus()); + } + @Test + void testPaymentByCashOnDeliveryRejectedDeliveryFeeEmpty() { + Map paymentData = new HashMap<>(); + paymentData.put("address", "Jl. Kelapa 2"); + paymentData.put("deliveryFee", ""); + + Payment payment = new Payment("4bb81b30-af6a-48f8-810f-0779dc04dd54", "CASH_ON_DELIVERY", + orders.get(1), paymentData); + assertEquals("REJECTED", payment.getStatus()); + } + + @Test + void testPaymentByBankTransferSuccess() { + Map paymentData = new HashMap<>(); + paymentData.put("bankName", "BNI"); + paymentData.put("referenceCode", "12345678"); + + Payment payment = new Payment("4bb81b30-af6a-48f8-810f-0779dc04dd54", "BANK_TRANSFER", + orders.get(1), paymentData); + assertEquals("SUCCESS", payment.getStatus()); + } + + @Test + void testPaymentByBankTransferRejectedBankNameEmpty() { + Map paymentData = new HashMap<>(); + paymentData.put("bankName", ""); + paymentData.put("referenceCode", "12345678"); + + Payment payment = new Payment("4bb81b30-af6a-48f8-810f-0779dc04dd54", "BANK_TRANSFER", + orders.get(1), paymentData); + assertEquals("REJECTED", payment.getStatus()); + } + + @Test + void testPaymentByBankTransferRejectedReferenceCodeEmpty() { + Map paymentData = new HashMap<>(); + paymentData.put("bankName", "BNI"); + paymentData.put("referenceCode", ""); + + Payment payment = new Payment("4bb81b30-af6a-48f8-810f-0779dc04dd54", "BANK_TRANSFER", + orders.get(1), paymentData); + assertEquals("REJECTED", payment.getStatus()); + } +} From 85ee0c98cc584c959f8afff9009daafd4e7e784c Mon Sep 17 00:00:00 2001 From: astrialyanda Date: Wed, 6 Mar 2024 15:41:43 +0700 Subject: [PATCH 14/28] [RED] add Payment model skeleton --- .../ac/ui/cs/advprog/eshop/model/Payment.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 src/main/java/id/ac/ui/cs/advprog/eshop/model/Payment.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 new file mode 100644 index 0000000..392027a --- /dev/null +++ b/src/main/java/id/ac/ui/cs/advprog/eshop/model/Payment.java @@ -0,0 +1,17 @@ +package id.ac.ui.cs.advprog.eshop.model; + +import lombok.Getter; + +import java.util.Map; + +@Getter +public class Payment { + String id; + String method; + String status; + Map paymentData; + Order order; + + public Payment(String id, String method, Order order, Map paymentData) { + } +} From 6a74a14157756f202ebbb627b04f97b0c3b69637 Mon Sep 17 00:00:00 2001 From: astrialyanda Date: Wed, 6 Mar 2024 16:25:40 +0700 Subject: [PATCH 15/28] [GREEN] implement Payment model --- .../ac/ui/cs/advprog/eshop/model/Payment.java | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) 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 392027a..5bb148d 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 @@ -13,5 +13,74 @@ public class Payment { Order order; public Payment(String id, String method, Order order, Map paymentData) { + this.id = id; + this.method = method; + this.order = order; + this.paymentData = paymentData; + + if (this.method.equals("VOUCHER_CODE")) { + this.status = checkVoucherCode(); + } else if (this.method.equals("BANK_TRANSFER")) { + this.status = checkBankTransfer(); + } else if (this.method.equals("CASH_ON_DELIVERY")) { + this.status = checkCashOnDelivery(); + } + } + + public void setStatus(String status) { + this.status = status; + } + + public String checkVoucherCode() { + String voucherCode = this.paymentData.get("voucherCode"); + if (voucherCode == null) { + return "REJECTED"; + } + + if (voucherCode.length() != 16) { + return "REJECTED"; + } + + if (!voucherCode.startsWith("ESHOP")) { + return "REJECTED"; + } + + int counter = 0; + for (char character: voucherCode.toCharArray()) { + if (Character.isDigit(character)) { + counter += 1; + } + } + if (counter != 8) { + return "REJECTED"; + } + + return "SUCCESS"; + } + + public String checkBankTransfer() { + String bankName = this.paymentData.get("bankName"); + String referenceCode = this.paymentData.get("referenceCode"); + + if (bankName == null || bankName.isEmpty()) { + return "REJECTED"; + } else if (referenceCode == null || referenceCode.isEmpty()) { + return "REJECTED"; + } + + return "SUCCESS"; + } + + public String checkCashOnDelivery() { + String address = this.paymentData.get("address"); + String deliveryFee = this.paymentData.get("deliveryFee"); + + if (address == null || address.isEmpty()) { + return "REJECTED"; + } else if (deliveryFee == null || deliveryFee.isEmpty()) { + return "REJECTED"; + } + + return "SUCCESS"; } } From 3f0ecb33235eea8d717db456ef06c259f81a601f Mon Sep 17 00:00:00 2001 From: astrialyanda Date: Wed, 6 Mar 2024 16:47:36 +0700 Subject: [PATCH 16/28] [REFACTOR] add PaymentStatus enum --- .../cs/advprog/eshop/enums/PaymentStatus.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) 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..0566120 --- /dev/null +++ b/src/main/java/id/ac/ui/cs/advprog/eshop/enums/PaymentStatus.java @@ -0,0 +1,24 @@ +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; + } +} From 81ef66ad73dd6a4cabc8962f1e823ef5cb2dea49 Mon Sep 17 00:00:00 2001 From: astrialyanda Date: Wed, 6 Mar 2024 17:13:55 +0700 Subject: [PATCH 17/28] [REFACTOR] add PaymentMethod enum --- .../cs/advprog/eshop/enums/PaymentMethod.java | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 src/main/java/id/ac/ui/cs/advprog/eshop/enums/PaymentMethod.java diff --git a/src/main/java/id/ac/ui/cs/advprog/eshop/enums/PaymentMethod.java b/src/main/java/id/ac/ui/cs/advprog/eshop/enums/PaymentMethod.java new file mode 100644 index 0000000..8e1170a --- /dev/null +++ b/src/main/java/id/ac/ui/cs/advprog/eshop/enums/PaymentMethod.java @@ -0,0 +1,25 @@ +package id.ac.ui.cs.advprog.eshop.enums; + +import lombok.Getter; + +@Getter +public enum PaymentMethod { + VOUCHER_CODE("VOUCHER_CODE"), + BANK_TRANSFER("BANK_TRANSFER"), + CASH_ON_DELIVERY("CASH_ON_DELIVERY"); + + private final String value; + + private PaymentMethod(String value) { + this.value = value; + } + + public static boolean contains(String param) { + for (PaymentMethod paymentMethod : PaymentMethod.values()) { + if (paymentMethod.name().equals(param)) { + return true; + } + } + return false; + } +} From 817193974585f811d6751b25cebda2019d061672 Mon Sep 17 00:00:00 2001 From: astrialyanda Date: Wed, 6 Mar 2024 17:16:15 +0700 Subject: [PATCH 18/28] [REFACTOR] apply PaymentStatus and PaymentMethod enum check on Payment model --- .../ac/ui/cs/advprog/eshop/model/Payment.java | 36 +++++++++++-------- 1 file changed, 21 insertions(+), 15 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 5bb148d..6f92fe3 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,5 +1,7 @@ package id.ac.ui.cs.advprog.eshop.model; +import id.ac.ui.cs.advprog.eshop.enums.PaymentStatus; +import id.ac.ui.cs.advprog.eshop.enums.PaymentMethod; import lombok.Getter; import java.util.Map; @@ -18,31 +20,35 @@ public Payment(String id, String method, Order order, Map paymen this.order = order; this.paymentData = paymentData; - if (this.method.equals("VOUCHER_CODE")) { + if (this.method.equals(PaymentMethod.VOUCHER_CODE.getValue())) { this.status = checkVoucherCode(); - } else if (this.method.equals("BANK_TRANSFER")) { + } else if (this.method.equals(PaymentMethod.BANK_TRANSFER.getValue())) { this.status = checkBankTransfer(); - } else if (this.method.equals("CASH_ON_DELIVERY")) { + } else if (this.method.equals(PaymentMethod.CASH_ON_DELIVERY.getValue())) { this.status = checkCashOnDelivery(); } } public void setStatus(String status) { - this.status = status; + if (PaymentStatus.contains(status)) { + this.status = status; + } else { + throw new IllegalArgumentException(); + } } public String checkVoucherCode() { String voucherCode = this.paymentData.get("voucherCode"); if (voucherCode == null) { - return "REJECTED"; + return PaymentStatus.REJECTED.getValue(); } if (voucherCode.length() != 16) { - return "REJECTED"; + return PaymentStatus.REJECTED.getValue(); } if (!voucherCode.startsWith("ESHOP")) { - return "REJECTED"; + return PaymentStatus.REJECTED.getValue(); } int counter = 0; @@ -52,10 +58,10 @@ public String checkVoucherCode() { } } if (counter != 8) { - return "REJECTED"; + return PaymentStatus.REJECTED.getValue(); } - return "SUCCESS"; + return PaymentStatus.SUCCESS.getValue(); } public String checkBankTransfer() { @@ -63,12 +69,12 @@ public String checkBankTransfer() { String referenceCode = this.paymentData.get("referenceCode"); if (bankName == null || bankName.isEmpty()) { - return "REJECTED"; + return PaymentStatus.REJECTED.getValue(); } else if (referenceCode == null || referenceCode.isEmpty()) { - return "REJECTED"; + return PaymentStatus.REJECTED.getValue(); } - return "SUCCESS"; + return PaymentStatus.SUCCESS.getValue(); } public String checkCashOnDelivery() { @@ -76,11 +82,11 @@ public String checkCashOnDelivery() { String deliveryFee = this.paymentData.get("deliveryFee"); if (address == null || address.isEmpty()) { - return "REJECTED"; + return PaymentStatus.REJECTED.getValue(); } else if (deliveryFee == null || deliveryFee.isEmpty()) { - return "REJECTED"; + return PaymentStatus.REJECTED.getValue(); } - return "SUCCESS"; + return PaymentStatus.SUCCESS.getValue(); } } From bf295bfadd29eea877f37c3e2e3bfd709559c55f Mon Sep 17 00:00:00 2001 From: astrialyanda Date: Wed, 6 Mar 2024 17:17:09 +0700 Subject: [PATCH 19/28] [REFACTOR] apply PaymentStatus and PaymentMethod enum to Payment model tests --- .../cs/advprog/eshop/model/PaymentTest.java | 42 ++++++++++--------- 1 file changed, 22 insertions(+), 20 deletions(-) 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 0850392..827f544 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,5 +1,7 @@ package id.ac.ui.cs.advprog.eshop.model; +import id.ac.ui.cs.advprog.eshop.enums.PaymentMethod; +import id.ac.ui.cs.advprog.eshop.enums.PaymentStatus; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -44,10 +46,10 @@ void testPaymentByVoucherSuccess() { Map paymentData = new HashMap<>(); paymentData.put("voucherCode", "ESHOP1234ABC5678"); - Payment payment = new Payment("68ea553b-a533-4395-99c2-f15a83e9d739", "VOUCHER_CODE", + Payment payment = new Payment("68ea553b-a533-4395-99c2-f15a83e9d739", PaymentMethod.VOUCHER_CODE.getValue(), orders.get(1), paymentData); - assertEquals("SUCCESS", payment.getStatus()); + assertEquals(PaymentStatus.SUCCESS.getValue(), payment.getStatus()); } @Test @@ -55,10 +57,10 @@ void testPaymentByVoucherRejectedNot16Characters() { Map paymentData = new HashMap<>(); paymentData.put("voucherCode", "ESHOP1234"); - Payment payment = new Payment("68ea553b-a533-4395-99c2-f15a83e9d739", "VOUCHER_CODE", + Payment payment = new Payment("68ea553b-a533-4395-99c2-f15a83e9d739", PaymentMethod.VOUCHER_CODE.getValue(), orders.get(1), paymentData); - assertEquals("REJECTED", payment.getStatus()); + assertEquals(PaymentStatus.REJECTED.getValue(), payment.getStatus()); } @Test @@ -66,10 +68,10 @@ void testPaymentByVoucherRejectedNotStartedByEshop() { Map paymentData = new HashMap<>(); paymentData.put("voucherCode", "1234ABC5678"); - Payment payment = new Payment("68ea553b-a533-4395-99c2-f15a83e9d739", "VOUCHER_CODE", + Payment payment = new Payment("68ea553b-a533-4395-99c2-f15a83e9d739", PaymentMethod.VOUCHER_CODE.getValue(), orders.get(1), paymentData); - assertEquals("REJECTED", payment.getStatus()); + assertEquals(PaymentStatus.REJECTED.getValue(), payment.getStatus()); } @Test @@ -77,9 +79,9 @@ void testPaymentByVoucherRejectedNot8NumericalChar() { Map paymentData = new HashMap<>(); paymentData.put("voucherCode", "ESHOP1234ABCDEFG"); - Payment payment = new Payment("68ea553b-a533-4395-99c2-f15a83e9d739", "VOUCHER_CODE", + Payment payment = new Payment("68ea553b-a533-4395-99c2-f15a83e9d739", PaymentMethod.VOUCHER_CODE.getValue(), orders.get(1), paymentData); - assertEquals("REJECTED", payment.getStatus()); + assertEquals(PaymentStatus.REJECTED.getValue(), payment.getStatus()); } @Test @@ -88,9 +90,9 @@ void testPaymentByCashOnDeliverySuccess() { paymentData.put("address", "Jl. Kelapa 2"); paymentData.put("deliveryFee", "22000"); - Payment payment = new Payment("4bb81b30-af6a-48f8-810f-0779dc04dd54", "CASH_ON_DELIVERY", + Payment payment = new Payment("4bb81b30-af6a-48f8-810f-0779dc04dd54", PaymentMethod.CASH_ON_DELIVERY.getValue(), orders.get(1), paymentData); - assertEquals("SUCCESS", payment.getStatus()); + assertEquals(PaymentStatus.SUCCESS.getValue(), payment.getStatus()); } @Test @@ -99,9 +101,9 @@ void testPaymentByCashOnDeliveryRejectedAddressEmpty() { paymentData.put("address", ""); paymentData.put("deliveryFee", "22000"); - Payment payment = new Payment("4bb81b30-af6a-48f8-810f-0779dc04dd54", "CASH_ON_DELIVERY", + Payment payment = new Payment("4bb81b30-af6a-48f8-810f-0779dc04dd54", PaymentMethod.CASH_ON_DELIVERY.getValue(), orders.get(1), paymentData); - assertEquals("REJECTED", payment.getStatus()); + assertEquals(PaymentStatus.REJECTED.getValue(), payment.getStatus()); } @Test void testPaymentByCashOnDeliveryRejectedDeliveryFeeEmpty() { @@ -109,9 +111,9 @@ void testPaymentByCashOnDeliveryRejectedDeliveryFeeEmpty() { paymentData.put("address", "Jl. Kelapa 2"); paymentData.put("deliveryFee", ""); - Payment payment = new Payment("4bb81b30-af6a-48f8-810f-0779dc04dd54", "CASH_ON_DELIVERY", + Payment payment = new Payment("4bb81b30-af6a-48f8-810f-0779dc04dd54", PaymentMethod.CASH_ON_DELIVERY.getValue(), orders.get(1), paymentData); - assertEquals("REJECTED", payment.getStatus()); + assertEquals(PaymentStatus.REJECTED.getValue(), payment.getStatus()); } @Test @@ -120,9 +122,9 @@ void testPaymentByBankTransferSuccess() { paymentData.put("bankName", "BNI"); paymentData.put("referenceCode", "12345678"); - Payment payment = new Payment("4bb81b30-af6a-48f8-810f-0779dc04dd54", "BANK_TRANSFER", + Payment payment = new Payment("4bb81b30-af6a-48f8-810f-0779dc04dd54", PaymentMethod.BANK_TRANSFER.getValue(), orders.get(1), paymentData); - assertEquals("SUCCESS", payment.getStatus()); + assertEquals(PaymentStatus.SUCCESS.getValue(), payment.getStatus()); } @Test @@ -131,9 +133,9 @@ void testPaymentByBankTransferRejectedBankNameEmpty() { paymentData.put("bankName", ""); paymentData.put("referenceCode", "12345678"); - Payment payment = new Payment("4bb81b30-af6a-48f8-810f-0779dc04dd54", "BANK_TRANSFER", + Payment payment = new Payment("4bb81b30-af6a-48f8-810f-0779dc04dd54", PaymentMethod.BANK_TRANSFER.getValue(), orders.get(1), paymentData); - assertEquals("REJECTED", payment.getStatus()); + assertEquals(PaymentStatus.REJECTED.getValue(), payment.getStatus()); } @Test @@ -142,8 +144,8 @@ void testPaymentByBankTransferRejectedReferenceCodeEmpty() { paymentData.put("bankName", "BNI"); paymentData.put("referenceCode", ""); - Payment payment = new Payment("4bb81b30-af6a-48f8-810f-0779dc04dd54", "BANK_TRANSFER", + Payment payment = new Payment("4bb81b30-af6a-48f8-810f-0779dc04dd54", PaymentMethod.BANK_TRANSFER.getValue(), orders.get(1), paymentData); - assertEquals("REJECTED", payment.getStatus()); + assertEquals(PaymentStatus.REJECTED.getValue(), payment.getStatus()); } } From bc0f6309f70d61754059c4d0421a549a001b877e Mon Sep 17 00:00:00 2001 From: astrialyanda Date: Wed, 6 Mar 2024 19:41:49 +0700 Subject: [PATCH 20/28] [RED] add tests for PaymentRepository --- .../repository/PaymentRepositoryTest.java | 124 ++++++++++++++++++ 1 file changed, 124 insertions(+) create mode 100644 src/test/java/id/ac/ui/cs/advprog/eshop/repository/PaymentRepositoryTest.java 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..ed875a0 --- /dev/null +++ b/src/test/java/id/ac/ui/cs/advprog/eshop/repository/PaymentRepositoryTest.java @@ -0,0 +1,124 @@ +package id.ac.ui.cs.advprog.eshop.repository; + +import id.ac.ui.cs.advprog.eshop.enums.OrderStatus; +import id.ac.ui.cs.advprog.eshop.enums.PaymentMethod; +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; + List orders; + + @BeforeEach + void setUp() { + paymentRepository = new PaymentRepository(); + + List products = new ArrayList<>(); + Product product1 = new Product(); + product1.setProductId("39a06a92-87ae-4cf4-8c10-35b956699245"); + product1.setProductName("Sapu Ajaib Abdul"); + product1.setProductQuantity(2); + products.add(product1); + + Product product2 = new Product(); + product2.setProductId("baa3ee56-9ce7-4608-9f83-a2672e8521b3"); + product2.setProductName("Kapas Putih Samara"); + product2.setProductQuantity(1); + products.add(product2); + + orders = new ArrayList<>(); + Order order1 = new Order("66a35b43-431c-4868-b078-00b927557a65", products, 1708560000L,"Siti"); + orders.add(order1); + Order order2 = new Order("21d7e0b9-9470-466e-acfe-c0527a745b6a", products, 1708570000L, "Cipto"); + orders.add(order2); + Order order3 = new Order("39bd2dc2-451f-423c-af15-5552866ec25c", products, 1708580000L, "Sunarsih"); + orders.add(order3); + + payments = new ArrayList<>(); + + Map paymentData1 = new HashMap<>(); + paymentData1.put("voucherCode", "ESHOP1234ABC5678"); + Payment payment1 = new Payment("3cadb8b2-89de-4467-b167-e952cb07806c", PaymentMethod.VOUCHER_CODE.getValue(), + orders.get(1), paymentData1); + payments.add(payment1); + + Map paymentData2 = new HashMap<>(); + paymentData1.put("voucherCode", "ESHOP1234ABC0098"); + Payment payment2 = new Payment("7eb97d10-6a2a-4195-a22e-a776a245bba9", PaymentMethod.CASH_ON_DELIVERY.getValue(), + orders.get(1), 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.getPaymentData().keySet(), findResult.getPaymentData().keySet()); + assertEquals(payment.getStatus(), findResult.getStatus()); + } + + @Test + void testSaveUpdate() { + Payment payment = payments.get(1); + paymentRepository.save(payment); + Payment newPayment = new Payment(payment.getId(), payment.getMethod(), payment.getOrder(), payments.get(1).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.getPaymentData().keySet(), findResult.getPaymentData().keySet()); + assertEquals(OrderStatus.SUCCESS.getValue(), findResult.getStatus()); + } + + @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).getPaymentData().keySet(), findResult.getPaymentData().keySet()); + assertEquals(payments.get(1).getStatus(), findResult.getStatus()); + } + + @Test + void testFindByIdIfIdNotFound() { + for (Payment payment : payments) { + paymentRepository.save(payment); + } + + Payment findResult = paymentRepository.findById("0000000"); + assertNull(findResult); + } + + @Test + void testFindAll() { + for (Payment payment: payments) { + paymentRepository.save(payment); + } + + List paymentList = paymentRepository.getAllPayment(); + assertEquals(2, paymentList.size()); + } +} From a261e32877b5e4b4ed34ce756455a944b6651d8c Mon Sep 17 00:00:00 2001 From: astrialyanda Date: Wed, 6 Mar 2024 19:42:46 +0700 Subject: [PATCH 21/28] [RED] add PaymentRepository skeleton --- .../eshop/repository/PaymentRepository.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 src/main/java/id/ac/ui/cs/advprog/eshop/repository/PaymentRepository.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..5b6b202 --- /dev/null +++ b/src/main/java/id/ac/ui/cs/advprog/eshop/repository/PaymentRepository.java @@ -0,0 +1,22 @@ +package id.ac.ui.cs.advprog.eshop.repository; + +import id.ac.ui.cs.advprog.eshop.model.Payment; + +import java.util.ArrayList; +import java.util.List; + +public class PaymentRepository { + private List payments = new ArrayList<>(); + + public Payment save(Payment payment) { + return null; + } + + public Payment findById(String id) { + return null; + } + + public List getAllPayment() { + return null; + } +} From 55f792248e295363677ee832ca8c190fa6aedcae Mon Sep 17 00:00:00 2001 From: astrialyanda Date: Wed, 6 Mar 2024 20:04:35 +0700 Subject: [PATCH 22/28] Fix PaymentRepository test --- .../eshop/repository/PaymentRepositoryTest.java | 15 --------------- 1 file changed, 15 deletions(-) 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 ed875a0..d9e4c9e 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 @@ -74,21 +74,6 @@ void testSaveCreate() { assertEquals(payment.getStatus(), findResult.getStatus()); } - @Test - void testSaveUpdate() { - Payment payment = payments.get(1); - paymentRepository.save(payment); - Payment newPayment = new Payment(payment.getId(), payment.getMethod(), payment.getOrder(), payments.get(1).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.getPaymentData().keySet(), findResult.getPaymentData().keySet()); - assertEquals(OrderStatus.SUCCESS.getValue(), findResult.getStatus()); - } - @Test void testFindByIdIfIdFound() { for (Payment payment : payments) { From 55e29e64c58d351e4a581503b091e6d81dda8f2d Mon Sep 17 00:00:00 2001 From: astrialyanda Date: Wed, 6 Mar 2024 20:06:43 +0700 Subject: [PATCH 23/28] [GREEN] implement PaymentRepository class --- .../eshop/repository/PaymentRepository.java | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 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 5b6b202..5347e8c 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 @@ -9,14 +9,33 @@ public class PaymentRepository { private List payments = new ArrayList<>(); public Payment save(Payment payment) { - return null; + int i = 0; + for (Payment savedPayment : payments) { + if (savedPayment.getId().equals(payment.getId())) { + payments.remove(i); + payments.add(i, payment); + return payment; + } + i += 1; + } + payments.add(payment); + return payment; } public Payment findById(String id) { + for (Payment savedPayment : payments) { + if (savedPayment.getId().equals(id)) { + return savedPayment; + } + } return null; } public List getAllPayment() { - return null; + List result = new ArrayList<>(); + for (Payment savedPayment : payments) { + result.add(savedPayment); + } + return result; } } From f8419183c85090cb69a5e4427bc50af7f9b2e631 Mon Sep 17 00:00:00 2001 From: astrialyanda Date: Wed, 6 Mar 2024 20:43:15 +0700 Subject: [PATCH 24/28] [RED] add tests for PaymentServiceImpl --- .../eshop/service/PaymentServiceTest.java | 125 ++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 src/test/java/id/ac/ui/cs/advprog/eshop/service/PaymentServiceTest.java diff --git a/src/test/java/id/ac/ui/cs/advprog/eshop/service/PaymentServiceTest.java b/src/test/java/id/ac/ui/cs/advprog/eshop/service/PaymentServiceTest.java new file mode 100644 index 0000000..355060c --- /dev/null +++ b/src/test/java/id/ac/ui/cs/advprog/eshop/service/PaymentServiceTest.java @@ -0,0 +1,125 @@ +package id.ac.ui.cs.advprog.eshop.service; + + +import id.ac.ui.cs.advprog.eshop.enums.OrderStatus; +import id.ac.ui.cs.advprog.eshop.enums.PaymentMethod; +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.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.ArgumentMatchers.any; +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +class PaymentServiceTest { + @InjectMocks + PaymentServiceImpl paymentService; + @Mock + PaymentRepository paymentRepository; + List orders; + List payments; + + @BeforeEach + void setUp() { + List products = new ArrayList<>(); + Product product1 = new Product(); + product1.setProductId("39a06a92-87ae-4cf4-8c10-35b956699245"); + product1.setProductName("Sapu Ajaib Abdul"); + product1.setProductQuantity(2); + products.add(product1); + + orders = new ArrayList<>(); + Order order1 = new Order("66a35b43-431c-4868-b078-00b927557a65", products, 1708560000L,"Siti"); + orders.add(order1); + + payments = new ArrayList<>(); + + Map paymentData1 = new HashMap<>(); + paymentData1.put("voucherCode", "ESHOP1234ABC5678"); + Payment payment1 = new Payment("3cadb8b2-89de-4467-b167-e952cb07806c", PaymentMethod.VOUCHER_CODE.getValue(), + orders.get(1), paymentData1); + payments.add(payment1); + + Map paymentData2 = new HashMap<>(); + paymentData1.put("voucherCode", "ESHOP1234ABC0098"); + Payment payment2 = new Payment("7eb97d10-6a2a-4195-a22e-a776a245bba9", PaymentMethod.CASH_ON_DELIVERY.getValue(), + orders.get(1), paymentData2); + payments.add(payment2); + } + + @Test + void testAddPayment() { + UUID uuid = UUID.randomUUID(); + String paymentId = uuid.toString(); + Payment payment = new Payment(paymentId, PaymentMethod.VOUCHER_CODE.getValue(), orders.get(1), payments.get(1).getPaymentData()); + + doReturn(null).when(paymentRepository).findById(paymentId); + doReturn(payment).when(paymentRepository).save(any(Payment.class)); + + Payment result = paymentService.addPayment(paymentId, orders.get(1), PaymentMethod.VOUCHER_CODE.getValue(), payments.get(1).getPaymentData()); + + verify(paymentRepository, times(1)).save(any(Payment.class)); + assertEquals(payment.getId(), result.getId()); + } + + @Test + void testAddPaymentIfAlreadyExist() { + UUID uuid = UUID.randomUUID(); + String paymentId = uuid.toString(); + Payment payment = new Payment(paymentId, PaymentMethod.VOUCHER_CODE.getValue(), orders.get(1), payments.get(1).getPaymentData()); + + doReturn(payment).when(paymentRepository).findById(paymentId); + Payment result = paymentService.addPayment(paymentId, orders.get(1), PaymentMethod.VOUCHER_CODE.getValue(), payments.get(1).getPaymentData()); + verify(paymentRepository, times(1)).findById(paymentId); + verify(paymentRepository, times(0)).save(any(Payment.class)); + assertNull(result); + } + + @Test + void testSetValidStatus() { + Payment payment = payments.get(1); + + Payment payment1 = new Payment(payment.getId(), payment.getMethod(), payment.getOrder(), payment.getPaymentData()); + Payment result1 = paymentService.setStatus(payment1, "SUCCESS"); + assertEquals(payment1.getId(), result1.getId()); + assertEquals(OrderStatus.SUCCESS.getValue(), result1.getOrder().getStatus()); + + Payment payment2 = new Payment(payment.getId(), payment.getMethod(), payment.getOrder(), payment.getPaymentData()); + Payment result2 = paymentService.setStatus(payment1, "REJECTED"); + assertEquals(payment2.getId(), result2.getId()); + assertEquals(OrderStatus.FAILED.getValue(), result1.getOrder().getStatus()); + } + + @Test + void testFindByIdIfIdFound() { + Payment payment = payments.get(1); + doReturn(payment).when(paymentRepository).findById(payment.getId()); + + Payment result = paymentService.getPayment(payment.getId()); + assertEquals(payment.getId(), result.getId()); + } + + @Test + void testFindByIdIfIdNotFound() { + doReturn(null).when(paymentRepository).findById("0000"); + assertNull(paymentService.getPayment("0000")); + } + + @Test + void testGetAllPayments() { + doReturn(payments).when(paymentRepository).getAllPayment(); + + List results = paymentService.getAllPayments(); + assertEquals(payments, results); + } +} From 87632c5296c5d7c2b97e5ae7cc5a1c34c3da1a7e Mon Sep 17 00:00:00 2001 From: astrialyanda Date: Wed, 6 Mar 2024 20:44:02 +0700 Subject: [PATCH 25/28] [RED] add PaymentServiceImpl skeleton --- .../advprog/eshop/service/PaymentService.java | 14 ++++++++ .../eshop/service/PaymentServiceImpl.java | 35 +++++++++++++++++++ 2 files changed, 49 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 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..895eda8 --- /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.Payment; +import id.ac.ui.cs.advprog.eshop.model.Order; + +import java.util.Map; +import java.util.List; + +public interface PaymentService { + public Payment addPayment(String paymentId, 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..b6a7b82 --- /dev/null +++ b/src/main/java/id/ac/ui/cs/advprog/eshop/service/PaymentServiceImpl.java @@ -0,0 +1,35 @@ +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 id.ac.ui.cs.advprog.eshop.repository.PaymentRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +@Service +public class PaymentServiceImpl implements PaymentService { + @Autowired + private PaymentRepository paymentRepository; + + @Override + public Payment addPayment(String paymentId, Order order, String method, Map paymentData) { + return null; + } + @Override + public Payment setStatus(Payment payment, String status) { + return null; + } + + @Override + public Payment getPayment(String paymentId) { + return null; + } + + @Override + public List getAllPayments() { + return null; + } +} From 8a1d439e302e12e98f865be5e937a9a1eed37b40 Mon Sep 17 00:00:00 2001 From: astrialyanda Date: Wed, 6 Mar 2024 20:51:54 +0700 Subject: [PATCH 26/28] Fix: fix PaymentService tests --- .../eshop/service/PaymentServiceTest.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/test/java/id/ac/ui/cs/advprog/eshop/service/PaymentServiceTest.java b/src/test/java/id/ac/ui/cs/advprog/eshop/service/PaymentServiceTest.java index 355060c..7614ec2 100644 --- a/src/test/java/id/ac/ui/cs/advprog/eshop/service/PaymentServiceTest.java +++ b/src/test/java/id/ac/ui/cs/advprog/eshop/service/PaymentServiceTest.java @@ -47,13 +47,13 @@ void setUp() { Map paymentData1 = new HashMap<>(); paymentData1.put("voucherCode", "ESHOP1234ABC5678"); Payment payment1 = new Payment("3cadb8b2-89de-4467-b167-e952cb07806c", PaymentMethod.VOUCHER_CODE.getValue(), - orders.get(1), paymentData1); + orders.getFirst(), paymentData1); payments.add(payment1); Map paymentData2 = new HashMap<>(); paymentData1.put("voucherCode", "ESHOP1234ABC0098"); Payment payment2 = new Payment("7eb97d10-6a2a-4195-a22e-a776a245bba9", PaymentMethod.CASH_ON_DELIVERY.getValue(), - orders.get(1), paymentData2); + orders.getFirst(), paymentData2); payments.add(payment2); } @@ -61,12 +61,12 @@ void setUp() { void testAddPayment() { UUID uuid = UUID.randomUUID(); String paymentId = uuid.toString(); - Payment payment = new Payment(paymentId, PaymentMethod.VOUCHER_CODE.getValue(), orders.get(1), payments.get(1).getPaymentData()); + Payment payment = new Payment(paymentId, PaymentMethod.VOUCHER_CODE.getValue(), orders.getFirst(), payments.getFirst().getPaymentData()); doReturn(null).when(paymentRepository).findById(paymentId); doReturn(payment).when(paymentRepository).save(any(Payment.class)); - Payment result = paymentService.addPayment(paymentId, orders.get(1), PaymentMethod.VOUCHER_CODE.getValue(), payments.get(1).getPaymentData()); + Payment result = paymentService.addPayment(paymentId, orders.getFirst(), PaymentMethod.VOUCHER_CODE.getValue(), payments.getFirst().getPaymentData()); verify(paymentRepository, times(1)).save(any(Payment.class)); assertEquals(payment.getId(), result.getId()); @@ -76,10 +76,10 @@ void testAddPayment() { void testAddPaymentIfAlreadyExist() { UUID uuid = UUID.randomUUID(); String paymentId = uuid.toString(); - Payment payment = new Payment(paymentId, PaymentMethod.VOUCHER_CODE.getValue(), orders.get(1), payments.get(1).getPaymentData()); + Payment payment = new Payment(paymentId, PaymentMethod.VOUCHER_CODE.getValue(), orders.getFirst(), payments.getFirst().getPaymentData()); doReturn(payment).when(paymentRepository).findById(paymentId); - Payment result = paymentService.addPayment(paymentId, orders.get(1), PaymentMethod.VOUCHER_CODE.getValue(), payments.get(1).getPaymentData()); + Payment result = paymentService.addPayment(paymentId, orders.getFirst(), PaymentMethod.VOUCHER_CODE.getValue(), payments.getFirst().getPaymentData()); verify(paymentRepository, times(1)).findById(paymentId); verify(paymentRepository, times(0)).save(any(Payment.class)); assertNull(result); @@ -87,7 +87,7 @@ void testAddPaymentIfAlreadyExist() { @Test void testSetValidStatus() { - Payment payment = payments.get(1); + Payment payment = payments.getFirst(); Payment payment1 = new Payment(payment.getId(), payment.getMethod(), payment.getOrder(), payment.getPaymentData()); Payment result1 = paymentService.setStatus(payment1, "SUCCESS"); @@ -102,7 +102,7 @@ void testSetValidStatus() { @Test void testFindByIdIfIdFound() { - Payment payment = payments.get(1); + Payment payment = payments.getFirst(); doReturn(payment).when(paymentRepository).findById(payment.getId()); Payment result = paymentService.getPayment(payment.getId()); From 80dc0c9aa12e77014e57f3bf75dc37b5e74335c9 Mon Sep 17 00:00:00 2001 From: astrialyanda Date: Wed, 6 Mar 2024 20:53:09 +0700 Subject: [PATCH 27/28] [GREEN] implement PaymentService class --- .../eshop/service/PaymentServiceImpl.java | 21 ++++++++++++++++--- 1 file changed, 18 insertions(+), 3 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 b6a7b82..cf1d6b7 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.OrderStatus; 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.repository.PaymentRepository; @@ -8,6 +9,7 @@ import java.util.List; import java.util.Map; +import java.util.NoSuchElementException; @Service public class PaymentServiceImpl implements PaymentService { @@ -16,20 +18,33 @@ public class PaymentServiceImpl implements PaymentService { @Override public Payment addPayment(String paymentId, Order order, String method, Map paymentData) { + if (paymentRepository.findById(paymentId) == null){ + Payment payment = new Payment(paymentId, method, order, paymentData); + paymentRepository.save(payment); + return payment; + } return null; } @Override public Payment setStatus(Payment payment, String status) { - return null; + Order currentOrder = payment.getOrder(); + if (status.equals("SUCCESS")) { + currentOrder.setStatus(OrderStatus.SUCCESS.getValue()); + } else if (status.equals("REJECTED")) { + currentOrder.setStatus(OrderStatus.FAILED.getValue()); + } else { + throw new IllegalArgumentException("Invalid status payment"); + } + return payment; } @Override public Payment getPayment(String paymentId) { - return null; + return paymentRepository.findById(paymentId); } @Override public List getAllPayments() { - return null; + return paymentRepository.getAllPayment(); } } From 9b427bb72a4ff7d3895cfa0690b06ff2066a4533 Mon Sep 17 00:00:00 2001 From: astrialyanda Date: Wed, 6 Mar 2024 20:59:32 +0700 Subject: [PATCH 28/28] add reflection 4 --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index 67e171d..15c66f5 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,11 @@ link web app: https://advshop-aya.koyeb.app/ +## Tutorial-4 +### Reflection +1. menurut saya flow TDD berguna untuk saya dalam membuat suatu code. Dengan menggunakan flow TDD, saya jadi langsung mengetahui apabila ada kesalahan/bug pada kode saya sehingga bisa segera diperbaiki. Selain itu, karena sudah terlebih dahulu membuat testing, saya jadi mengetahui bagian bagian mana yang mungkin menghasilkan bug sehingga bisa dihindari lebih awal. Hal-hal lain yang harus saya lakukan ke depannya adalah memastikan testing sudah mencakup sebanyak-banyaknya kemungkinan bug. + +2. menurut saya F.I.R.S.T. principle yaitu fast, isolated/independent, repeatable, self-validating, dan thorough/timely + ## Tutorial-3 ### Reflection 1. Explain what principles you apply to your project!