feat: Implementation of session facade design pattern #1278 (#3121)

* 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:
Shahd Hossam
2025-01-11 17:45:01 +02:00
committed by GitHub
parent bcad5b1aa3
commit 8cb7c9ada6
17 changed files with 1180 additions and 0 deletions
@@ -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.");
}
}