mirror of
https://github.com/tiennm99/java-design-patterns.git
synced 2026-05-24 17:34:57 +00:00
* implementation of session facade #1278 * minor change * readme updated * addressed the comments regarding changing lists to maps and adding maven assembly plugin --------- Co-authored-by: Ilkka Seppälä <iluwatar@users.noreply.github.com>
This commit is contained in:
@@ -0,0 +1,62 @@
|
||||
/*
|
||||
* This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt).
|
||||
*
|
||||
* The MIT License
|
||||
* Copyright © 2014-2022 Ilkka Seppälä
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
package com.iluwatar.sessionfacade;
|
||||
|
||||
/**
|
||||
* The main entry point of the application that demonstrates the usage
|
||||
* of the ShoppingFacade to manage the shopping process using the Session Facade pattern.
|
||||
* This class serves as a client that interacts with the simplified
|
||||
* interface provided by the ShoppingFacade, which encapsulates
|
||||
* complex interactions with the underlying business services.
|
||||
* The ShoppingFacade acts as a session bean that coordinates the communication
|
||||
* between multiple services, hiding their complexity and providing a single, unified API.
|
||||
*/
|
||||
public class App {
|
||||
/**
|
||||
* The entry point of the application.
|
||||
* This method demonstrates how the ShoppingFacade, acting as a Session Facade, is used to:
|
||||
* - Add items to the shopping cart
|
||||
* - Process a payment
|
||||
* - Place the order
|
||||
* The session facade manages the communication between the individual services
|
||||
* and simplifies the interactions for the client.
|
||||
*
|
||||
* @param args the input arguments
|
||||
*/
|
||||
public static void main(String[] args) {
|
||||
ShoppingFacade shoppingFacade = new ShoppingFacade();
|
||||
|
||||
// Adding items to the shopping cart
|
||||
shoppingFacade.addToCart(1);
|
||||
shoppingFacade.addToCart(2);
|
||||
|
||||
// Processing the payment with the chosen method
|
||||
shoppingFacade.processPayment("cash");
|
||||
|
||||
// Finalizing the order
|
||||
shoppingFacade.order();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,87 @@
|
||||
/*
|
||||
* This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt).
|
||||
*
|
||||
* The MIT License
|
||||
* Copyright © 2014-2022 Ilkka Seppälä
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
package com.iluwatar.sessionfacade;
|
||||
|
||||
|
||||
import java.util.Map;
|
||||
import lombok.Getter;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
/**
|
||||
* The type Cart service.
|
||||
* Represents the cart entity, has add to cart and remove from cart methods
|
||||
*/
|
||||
@Slf4j
|
||||
public class CartService {
|
||||
/**
|
||||
* -- GETTER --
|
||||
* Gets cart.
|
||||
*/
|
||||
@Getter
|
||||
private final Map<Integer, Product> cart;
|
||||
private final Map<Integer, Product> productCatalog;
|
||||
|
||||
/**
|
||||
* Instantiates a new Cart service.
|
||||
*
|
||||
* @param cart the cart
|
||||
* @param productCatalog the product catalog
|
||||
*/
|
||||
public CartService(Map<Integer, Product> cart, Map<Integer, Product> productCatalog) {
|
||||
this.cart = cart;
|
||||
this.productCatalog = productCatalog;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add to cart.
|
||||
*
|
||||
* @param productId the product id
|
||||
*/
|
||||
public void addToCart(int productId) {
|
||||
Product product = productCatalog.get(productId);
|
||||
if (product != null) {
|
||||
cart.put(productId, product);
|
||||
LOGGER.info("{} successfully added to the cart", product);
|
||||
} else {
|
||||
LOGGER.info("No product is found in catalog with id {}", productId);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove from cart.
|
||||
*
|
||||
* @param productId the product id
|
||||
*/
|
||||
public void removeFromCart(int productId) {
|
||||
Product product = cart.remove(productId); // Remove product from cart
|
||||
if (product != null) {
|
||||
LOGGER.info("{} successfully removed from the cart", product);
|
||||
} else {
|
||||
LOGGER.info("No product is found in cart with id {}", productId);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,83 @@
|
||||
/*
|
||||
* This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt).
|
||||
*
|
||||
* The MIT License
|
||||
* Copyright © 2014-2022 Ilkka Seppälä
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
package com.iluwatar.sessionfacade;
|
||||
|
||||
import java.util.Map;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
/**
|
||||
* The OrderService class is responsible for finalizing a customer's order.
|
||||
* It includes a method to calculate the total cost of the order, which follows
|
||||
* the information expert principle from GRASP by assigning the responsibility
|
||||
* of total calculation to this service.
|
||||
* Additionally, it provides a method to complete the order, which empties the
|
||||
* client's shopping cart once the order is finalized.
|
||||
*/
|
||||
@Slf4j
|
||||
public class OrderService {
|
||||
private final Map<Integer, Product> cart;
|
||||
|
||||
/**
|
||||
* Instantiates a new Order service.
|
||||
*
|
||||
* @param cart the cart
|
||||
*/
|
||||
public OrderService(Map<Integer, Product> cart) {
|
||||
this.cart = cart;
|
||||
}
|
||||
|
||||
/**
|
||||
* Order.
|
||||
*/
|
||||
public void order() {
|
||||
Double total = getTotal();
|
||||
if (!this.cart.isEmpty()) {
|
||||
LOGGER.info("Client has chosen to order {} with total {}", cart,
|
||||
String.format("%.2f", total));
|
||||
this.completeOrder();
|
||||
} else {
|
||||
LOGGER.info("Client's shopping cart is empty");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets total.
|
||||
*
|
||||
* @return the total
|
||||
*/
|
||||
public double getTotal() {
|
||||
final double[] total = {0.0};
|
||||
this.cart.forEach((key, product) -> total[0] += product.price());
|
||||
return total[0];
|
||||
}
|
||||
|
||||
/**
|
||||
* Complete order.
|
||||
*/
|
||||
public void completeOrder() {
|
||||
this.cart.clear();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,75 @@
|
||||
/*
|
||||
* This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt).
|
||||
*
|
||||
* The MIT License
|
||||
* Copyright © 2014-2022 Ilkka Seppälä
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
package com.iluwatar.sessionfacade;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
/**
|
||||
* The PaymentService class is responsible for handling the selection and processing
|
||||
* of different payment methods. It provides functionality to select a payment method
|
||||
* (cash or credit card) and process the corresponding payment option. The class uses
|
||||
* logging to inform the client of the selected payment method.
|
||||
* It includes methods to:
|
||||
* - Select the payment method based on the client's choice.
|
||||
* - Process cash payments through the `cashPayment()` method.
|
||||
* - Process credit card payments through the `creditCardPayment()` method.
|
||||
*/
|
||||
public class PaymentService {
|
||||
/**
|
||||
* The constant LOGGER.
|
||||
*/
|
||||
public static Logger LOGGER = LoggerFactory.getLogger(PaymentService.class);
|
||||
|
||||
/**
|
||||
* Select payment method.
|
||||
*
|
||||
* @param method the method
|
||||
*/
|
||||
public void selectPaymentMethod(String method) {
|
||||
if (method.equals("cash")) {
|
||||
cashPayment();
|
||||
} else if (method.equals("credit")) {
|
||||
creditCardPayment();
|
||||
} else {
|
||||
LOGGER.info("Unspecified payment method type");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Cash payment.
|
||||
*/
|
||||
public void cashPayment() {
|
||||
LOGGER.info("Client have chosen cash payment option");
|
||||
}
|
||||
|
||||
/**
|
||||
* Credit card payment.
|
||||
*/
|
||||
public void creditCardPayment() {
|
||||
LOGGER.info("Client have chosen credit card payment option");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
/*
|
||||
* This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt).
|
||||
*
|
||||
* The MIT License
|
||||
* Copyright © 2014-2022 Ilkka Seppälä
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
package com.iluwatar.sessionfacade;
|
||||
|
||||
/**
|
||||
* The type Product.
|
||||
*/
|
||||
public record Product(int id, String name, double price, String description) {
|
||||
@Override
|
||||
public String toString() {
|
||||
return "ID: " + id + "\nName: " + name + "\nPrice: $" + price + "\nDescription: " + description;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,60 @@
|
||||
/*
|
||||
* This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt).
|
||||
*
|
||||
* The MIT License
|
||||
* Copyright © 2014-2022 Ilkka Seppälä
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
package com.iluwatar.sessionfacade;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* The type ProductCatalogService.
|
||||
* This class manages a catalog of products. It holds a map of products,
|
||||
* where each product is identified by a unique ID. The class
|
||||
* provides functionality to access and manage the products in the catalog.
|
||||
*/
|
||||
public class ProductCatalogService {
|
||||
|
||||
private final Map<Integer, Product> products;
|
||||
|
||||
/**
|
||||
* Instantiates a new ProductCatalogService.
|
||||
*
|
||||
* @param products the map of products to be used by this service
|
||||
*/
|
||||
public ProductCatalogService(Map<Integer, Product> products) {
|
||||
this.products = products;
|
||||
}
|
||||
|
||||
// Additional methods to interact with products can be added here, for example:
|
||||
|
||||
/**
|
||||
* Retrieves a product by its ID.
|
||||
*
|
||||
* @param id the product ID
|
||||
* @return the product corresponding to the ID
|
||||
*/
|
||||
public Product getProductById(int id) {
|
||||
return products.get(id);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,126 @@
|
||||
/*
|
||||
* This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt).
|
||||
*
|
||||
* The MIT License
|
||||
* Copyright © 2014-2022 Ilkka Seppälä
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
package com.iluwatar.sessionfacade;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
|
||||
/**
|
||||
* The ShoppingFacade class provides a simplified interface for clients to interact with the shopping system.
|
||||
* It acts as a facade to handle operations related to a shopping cart, order processing, and payment.
|
||||
* Responsibilities:
|
||||
* - Add products to the shopping cart.
|
||||
* - Remove products from the shopping cart.
|
||||
* - Retrieve the current shopping cart.
|
||||
* - Finalize an order by calling the order service.
|
||||
* - Check if a payment is required based on the order total.
|
||||
* - Process payment using different payment methods (e.g., cash, credit card).
|
||||
* The ShoppingFacade class delegates operations to the following services:
|
||||
* - CartService: Manages the cart and product catalog.
|
||||
* - OrderService: Handles the order finalization process and calculation of the total.
|
||||
* - PaymentService: Handles the payment processing based on the selected payment method.
|
||||
*/
|
||||
@Slf4j
|
||||
public class ShoppingFacade {
|
||||
private final CartService cartService;
|
||||
private final OrderService orderService;
|
||||
private final PaymentService paymentService;
|
||||
|
||||
/**
|
||||
* Instantiates a new Shopping facade.
|
||||
*/
|
||||
public ShoppingFacade() {
|
||||
Map<Integer, Product> productCatalog = new HashMap<>();
|
||||
productCatalog.put(1, new Product(1, "Wireless Mouse", 25.99, "Ergonomic wireless mouse with USB receiver."));
|
||||
productCatalog.put(2, new Product(2, "Gaming Keyboard", 79.99, "RGB mechanical gaming keyboard with programmable keys."));
|
||||
Map<Integer, Product> cart = new HashMap<>();
|
||||
cartService = new CartService(cart, productCatalog);
|
||||
orderService = new OrderService(cart);
|
||||
paymentService = new PaymentService();
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets cart.
|
||||
*
|
||||
* @return the cart
|
||||
*/
|
||||
public Map<Integer, Product> getCart() {
|
||||
return this.cartService.getCart();
|
||||
}
|
||||
|
||||
/**
|
||||
* Add to cart.
|
||||
*
|
||||
* @param productId the product id
|
||||
*/
|
||||
public void addToCart(int productId) {
|
||||
this.cartService.addToCart(productId);
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove from cart.
|
||||
*
|
||||
* @param productId the product id
|
||||
*/
|
||||
public void removeFromCart(int productId) {
|
||||
this.cartService.removeFromCart(productId);
|
||||
}
|
||||
|
||||
/**
|
||||
* Order.
|
||||
*/
|
||||
public void order() {
|
||||
this.orderService.order();
|
||||
}
|
||||
|
||||
/**
|
||||
* Is payment required boolean.
|
||||
*
|
||||
* @return the boolean
|
||||
*/
|
||||
public Boolean isPaymentRequired() {
|
||||
double total = this.orderService.getTotal();
|
||||
if (total == 0.0) {
|
||||
LOGGER.info("No payment required");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Process payment.
|
||||
*
|
||||
* @param method the method
|
||||
*/
|
||||
public void processPayment(String method) {
|
||||
Boolean isPaymentRequired = isPaymentRequired();
|
||||
if (Boolean.TRUE.equals(isPaymentRequired)) {
|
||||
paymentService.selectPaymentMethod(method);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
/*
|
||||
* This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt).
|
||||
*
|
||||
* The MIT License
|
||||
* Copyright © 2014-2022 Ilkka Seppälä
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
package com.iluwatar.sessionfacade;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
|
||||
|
||||
/**
|
||||
* The type App test.
|
||||
*/
|
||||
public class AppTest {
|
||||
|
||||
/**
|
||||
* Should execute application without exception.
|
||||
*/
|
||||
@org.junit.jupiter.api.Test
|
||||
void shouldExecuteApplicationWithoutException() {
|
||||
assertDoesNotThrow(() -> App.main(new String[]{}));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,99 @@
|
||||
/*
|
||||
* This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt).
|
||||
*
|
||||
* The MIT License
|
||||
* Copyright © 2014-2022 Ilkka Seppälä
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
package com.iluwatar.sessionfacade;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.mockito.MockitoAnnotations;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
|
||||
/**
|
||||
* The type Cart service test.
|
||||
*/
|
||||
@Slf4j
|
||||
class CartServiceTest {
|
||||
|
||||
private CartService cartService;
|
||||
private Map<Integer,Product> cart;
|
||||
|
||||
/**
|
||||
* Sets up.
|
||||
*/
|
||||
@BeforeEach
|
||||
void setUp() {
|
||||
MockitoAnnotations.openMocks(this);
|
||||
cart = new HashMap<>();
|
||||
Map<Integer,Product> productCatalog = new HashMap<>();
|
||||
productCatalog.put(1,new Product(1, "Product A", 2.0, "any description"));
|
||||
productCatalog.put(2,new Product(2, "Product B", 300.0, "a watch"));
|
||||
cartService = new CartService(cart, productCatalog);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test add to cart.
|
||||
*/
|
||||
@Test
|
||||
void testAddToCart() {
|
||||
cartService.addToCart(1);
|
||||
assertEquals(1, cart.size());
|
||||
assertEquals("Product A", cart.get(1).name());
|
||||
}
|
||||
|
||||
/**
|
||||
* Test remove from cart.
|
||||
*/
|
||||
@Test
|
||||
void testRemoveFromCart() {
|
||||
cartService.addToCart(1);
|
||||
assertEquals(1, cart.size());
|
||||
cartService.removeFromCart(1);
|
||||
assertTrue(cart.isEmpty());
|
||||
}
|
||||
|
||||
/**
|
||||
* Test add to cart with invalid product id.
|
||||
*/
|
||||
@Test
|
||||
void testAddToCartWithInvalidProductId() {
|
||||
cartService.addToCart(999);
|
||||
assertTrue(cart.isEmpty());
|
||||
}
|
||||
|
||||
/**
|
||||
* Test remove from cart with invalid product id.
|
||||
*/
|
||||
@Test
|
||||
void testRemoveFromCartWithInvalidProductId() {
|
||||
cartService.removeFromCart(999);
|
||||
assertTrue(cart.isEmpty());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,80 @@
|
||||
/*
|
||||
* This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt).
|
||||
*
|
||||
* The MIT License
|
||||
* Copyright © 2014-2022 Ilkka Seppälä
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
package com.iluwatar.sessionfacade;
|
||||
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.slf4j.Logger;
|
||||
|
||||
import static org.mockito.Mockito.*;
|
||||
|
||||
/**
|
||||
* The type Payment service test.
|
||||
*/
|
||||
class PaymentServiceTest {
|
||||
private PaymentService paymentService;
|
||||
private OrderService orderService;
|
||||
private Logger mockLogger;
|
||||
|
||||
/**
|
||||
* Sets up.
|
||||
*/
|
||||
@BeforeEach
|
||||
void setUp() {
|
||||
paymentService = new PaymentService();
|
||||
mockLogger = mock(Logger.class);
|
||||
paymentService.LOGGER = mockLogger;
|
||||
}
|
||||
|
||||
/**
|
||||
* Test select cash payment method.
|
||||
*/
|
||||
@Test
|
||||
void testSelectCashPaymentMethod() {
|
||||
String method = "cash";
|
||||
paymentService.selectPaymentMethod(method);
|
||||
verify(mockLogger).info("Client have chosen cash payment option");
|
||||
}
|
||||
|
||||
/**
|
||||
* Test select credit card payment method.
|
||||
*/
|
||||
@Test
|
||||
void testSelectCreditCardPaymentMethod() {
|
||||
String method = "credit";
|
||||
paymentService.selectPaymentMethod(method);
|
||||
verify(mockLogger).info("Client have chosen credit card payment option");
|
||||
}
|
||||
|
||||
/**
|
||||
* Test select unspecified payment method.
|
||||
*/
|
||||
@Test
|
||||
void testSelectUnspecifiedPaymentMethod() {
|
||||
String method = "cheque";
|
||||
paymentService.selectPaymentMethod(method);
|
||||
verify(mockLogger).info("Unspecified payment method type");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,77 @@
|
||||
/*
|
||||
* This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt).
|
||||
*
|
||||
* The MIT License
|
||||
* Copyright © 2014-2022 Ilkka Seppälä
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
package com.iluwatar.sessionfacade;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
|
||||
/**
|
||||
* The type Product test.
|
||||
*/
|
||||
public class ProductTest {
|
||||
/**
|
||||
* Test product creation.
|
||||
*/
|
||||
@Test
|
||||
public void testProductCreation() {
|
||||
int id = 1;
|
||||
String name = "Product A";
|
||||
double price = 200.0;
|
||||
String description = "a description";
|
||||
Product product = new Product(id,name,price,description);
|
||||
assertEquals(id, product.id());
|
||||
assertEquals(name, product.name());
|
||||
assertEquals(price, product.price());
|
||||
assertEquals(description, product.description());
|
||||
}
|
||||
|
||||
/**
|
||||
* Test equals and hash code.
|
||||
*/
|
||||
@Test
|
||||
public void testEqualsAndHashCode() {
|
||||
Product product1 = new Product(1, "Product A", 99.99, "a description");
|
||||
Product product2 = new Product(1, "Product A", 99.99, "a description");
|
||||
Product product3 = new Product(2, "Product B", 199.99, "a description");
|
||||
|
||||
assertEquals(product1, product2);
|
||||
assertNotEquals(product1, product3);
|
||||
assertEquals(product1.hashCode(), product2.hashCode());
|
||||
assertNotEquals(product1.hashCode(), product3.hashCode());
|
||||
}
|
||||
|
||||
/**
|
||||
* Test to string.
|
||||
*/
|
||||
@Test
|
||||
public void testToString() {
|
||||
Product product = new Product(1, "Product A", 99.99, "a description");
|
||||
String toStringResult = product.toString();
|
||||
assertTrue(toStringResult.contains("Product A"));
|
||||
assertTrue(toStringResult.contains("99.99"));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,75 @@
|
||||
/*
|
||||
* This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt).
|
||||
*
|
||||
* The MIT License
|
||||
* Copyright © 2014-2022 Ilkka Seppälä
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
package com.iluwatar.sessionfacade;
|
||||
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||
|
||||
/**
|
||||
* Unit tests for ShoppingFacade.
|
||||
*/
|
||||
class ShoppingFacadeTest {
|
||||
|
||||
private ShoppingFacade shoppingFacade;
|
||||
|
||||
@BeforeEach
|
||||
void setUp() {
|
||||
shoppingFacade = new ShoppingFacade();
|
||||
}
|
||||
|
||||
@Test
|
||||
void testAddToCart() {
|
||||
shoppingFacade.addToCart(1);
|
||||
shoppingFacade.addToCart(2);
|
||||
Map<Integer,Product> cart = shoppingFacade.getCart();
|
||||
assertEquals(2, cart.size(), "Cart should contain two items.");
|
||||
assertEquals("Wireless Mouse", cart.get(1).name(), "First item in the cart should be 'Wireless Mouse'.");
|
||||
assertEquals("Gaming Keyboard", cart.get(2).name(), "Second item in the cart should be 'Gaming Keyboard'.");
|
||||
}
|
||||
|
||||
@Test
|
||||
void testRemoveFromCart() {
|
||||
shoppingFacade.addToCart(1);
|
||||
shoppingFacade.addToCart(2);
|
||||
shoppingFacade.removeFromCart(1);
|
||||
Map<Integer,Product> cart = shoppingFacade.getCart();
|
||||
assertEquals(1, cart.size(), "Cart should contain one item after removal.");
|
||||
assertEquals("Gaming Keyboard", cart.get(2).name(), "Remaining item should be 'Gaming Keyboard'.");
|
||||
}
|
||||
|
||||
@Test
|
||||
void testOrder() {
|
||||
shoppingFacade.addToCart(1);
|
||||
shoppingFacade.addToCart(2);
|
||||
shoppingFacade.processPayment("cash");
|
||||
shoppingFacade.order();
|
||||
assertTrue(shoppingFacade.getCart().isEmpty(), "Cart should be empty after placing the order.");
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user