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! 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; + } +} 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; + } +} 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; + } +} 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..3bfb682 --- /dev/null +++ b/src/main/java/id/ac/ui/cs/advprog/eshop/model/Order.java @@ -0,0 +1,43 @@ +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; + +@Builder +@Getter +public class Order { + String id; + List products; + Long orderTime; + String author; + String status; + + public Order(String id, List products, Long orderTime, String author) { + this.id = id; + this.orderTime = orderTime; + this.author = author; + this.status = OrderStatus.WAITING_PAYMENT.getValue(); + + 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); + this.setStatus(status); + } + + public void setStatus(String status) { + if (OrderStatus.contains(status)) { + this.status = status; + } else { + throw new IllegalArgumentException(); + } + } +} 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..6f92fe3 --- /dev/null +++ b/src/main/java/id/ac/ui/cs/advprog/eshop/model/Payment.java @@ -0,0 +1,92 @@ +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; + +@Getter +public class Payment { + String id; + String method; + String status; + Map paymentData; + 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(PaymentMethod.VOUCHER_CODE.getValue())) { + this.status = checkVoucherCode(); + } else if (this.method.equals(PaymentMethod.BANK_TRANSFER.getValue())) { + this.status = checkBankTransfer(); + } else if (this.method.equals(PaymentMethod.CASH_ON_DELIVERY.getValue())) { + this.status = checkCashOnDelivery(); + } + } + + public void setStatus(String 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 PaymentStatus.REJECTED.getValue(); + } + + if (voucherCode.length() != 16) { + return PaymentStatus.REJECTED.getValue(); + } + + if (!voucherCode.startsWith("ESHOP")) { + return PaymentStatus.REJECTED.getValue(); + } + + int counter = 0; + for (char character: voucherCode.toCharArray()) { + if (Character.isDigit(character)) { + counter += 1; + } + } + if (counter != 8) { + return PaymentStatus.REJECTED.getValue(); + } + + return PaymentStatus.SUCCESS.getValue(); + } + + public String checkBankTransfer() { + String bankName = this.paymentData.get("bankName"); + String referenceCode = this.paymentData.get("referenceCode"); + + if (bankName == null || bankName.isEmpty()) { + return PaymentStatus.REJECTED.getValue(); + } else if (referenceCode == null || referenceCode.isEmpty()) { + return PaymentStatus.REJECTED.getValue(); + } + + return PaymentStatus.SUCCESS.getValue(); + } + + public String checkCashOnDelivery() { + String address = this.paymentData.get("address"); + String deliveryFee = this.paymentData.get("deliveryFee"); + + if (address == null || address.isEmpty()) { + return PaymentStatus.REJECTED.getValue(); + } else if (deliveryFee == null || deliveryFee.isEmpty()) { + return PaymentStatus.REJECTED.getValue(); + } + + return PaymentStatus.SUCCESS.getValue(); + } +} 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..f360f82 --- /dev/null +++ b/src/main/java/id/ac/ui/cs/advprog/eshop/repository/OrderRepository.java @@ -0,0 +1,46 @@ +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) { + 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; + } +} 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..5347e8c --- /dev/null +++ b/src/main/java/id/ac/ui/cs/advprog/eshop/repository/PaymentRepository.java @@ -0,0 +1,41 @@ +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) { + 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() { + List result = new ArrayList<>(); + for (Payment savedPayment : payments) { + result.add(savedPayment); + } + return result; + } +} 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..f7e4183 --- /dev/null +++ b/src/main/java/id/ac/ui/cs/advprog/eshop/service/OrderServiceImpl.java @@ -0,0 +1,47 @@ +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; +import java.util.NoSuchElementException; + +@Service +public class OrderServiceImpl implements OrderService{ + @Autowired + 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) { + 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 orderRepository.findAllByAuthor(author); + } + + @Override + public Order findById(String orderId) { + return orderRepository.findById(orderId); + } +} 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..cf1d6b7 --- /dev/null +++ b/src/main/java/id/ac/ui/cs/advprog/eshop/service/PaymentServiceImpl.java @@ -0,0 +1,50 @@ +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; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; +import java.util.NoSuchElementException; + +@Service +public class PaymentServiceImpl implements PaymentService { + @Autowired + private PaymentRepository paymentRepository; + + @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) { + 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 paymentRepository.findById(paymentId); + } + + @Override + public List getAllPayments() { + return paymentRepository.getAllPayment(); + } +} 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..63ae1b3 --- /dev/null +++ b/src/test/java/id/ac/ui/cs/advprog/eshop/model/OrderTest.java @@ -0,0 +1,84 @@ +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.*; + +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", + OrderStatus.SUCCESS.getValue()); + 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")); + } +} 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..827f544 --- /dev/null +++ b/src/test/java/id/ac/ui/cs/advprog/eshop/model/PaymentTest.java @@ -0,0 +1,151 @@ +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; + +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", PaymentMethod.VOUCHER_CODE.getValue(), + orders.get(1), paymentData); + + assertEquals(PaymentStatus.SUCCESS.getValue(), payment.getStatus()); + } + + @Test + void testPaymentByVoucherRejectedNot16Characters() { + Map paymentData = new HashMap<>(); + paymentData.put("voucherCode", "ESHOP1234"); + + Payment payment = new Payment("68ea553b-a533-4395-99c2-f15a83e9d739", PaymentMethod.VOUCHER_CODE.getValue(), + orders.get(1), paymentData); + + assertEquals(PaymentStatus.REJECTED.getValue(), payment.getStatus()); + } + + @Test + void testPaymentByVoucherRejectedNotStartedByEshop() { + Map paymentData = new HashMap<>(); + paymentData.put("voucherCode", "1234ABC5678"); + + Payment payment = new Payment("68ea553b-a533-4395-99c2-f15a83e9d739", PaymentMethod.VOUCHER_CODE.getValue(), + orders.get(1), paymentData); + + assertEquals(PaymentStatus.REJECTED.getValue(), payment.getStatus()); + } + + @Test + void testPaymentByVoucherRejectedNot8NumericalChar() { + Map paymentData = new HashMap<>(); + paymentData.put("voucherCode", "ESHOP1234ABCDEFG"); + + Payment payment = new Payment("68ea553b-a533-4395-99c2-f15a83e9d739", PaymentMethod.VOUCHER_CODE.getValue(), + orders.get(1), paymentData); + assertEquals(PaymentStatus.REJECTED.getValue(), 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", PaymentMethod.CASH_ON_DELIVERY.getValue(), + orders.get(1), paymentData); + assertEquals(PaymentStatus.SUCCESS.getValue(), 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", PaymentMethod.CASH_ON_DELIVERY.getValue(), + orders.get(1), paymentData); + assertEquals(PaymentStatus.REJECTED.getValue(), 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", PaymentMethod.CASH_ON_DELIVERY.getValue(), + orders.get(1), paymentData); + assertEquals(PaymentStatus.REJECTED.getValue(), 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", PaymentMethod.BANK_TRANSFER.getValue(), + orders.get(1), paymentData); + assertEquals(PaymentStatus.SUCCESS.getValue(), 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", PaymentMethod.BANK_TRANSFER.getValue(), + orders.get(1), paymentData); + assertEquals(PaymentStatus.REJECTED.getValue(), 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", PaymentMethod.BANK_TRANSFER.getValue(), + orders.get(1), paymentData); + assertEquals(PaymentStatus.REJECTED.getValue(), payment.getStatus()); + } +} 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()); + } +} 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..d9e4c9e --- /dev/null +++ b/src/test/java/id/ac/ui/cs/advprog/eshop/repository/PaymentRepositoryTest.java @@ -0,0 +1,109 @@ +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 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()); + } +} 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()); + } +} 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..7614ec2 --- /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.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.getFirst(), 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.getFirst(), payments.getFirst().getPaymentData()); + + doReturn(null).when(paymentRepository).findById(paymentId); + doReturn(payment).when(paymentRepository).save(any(Payment.class)); + + 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()); + } + + @Test + void testAddPaymentIfAlreadyExist() { + UUID uuid = UUID.randomUUID(); + String paymentId = uuid.toString(); + 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.getFirst(), PaymentMethod.VOUCHER_CODE.getValue(), payments.getFirst().getPaymentData()); + verify(paymentRepository, times(1)).findById(paymentId); + verify(paymentRepository, times(0)).save(any(Payment.class)); + assertNull(result); + } + + @Test + void testSetValidStatus() { + Payment payment = payments.getFirst(); + + 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.getFirst(); + 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); + } +}