From c5552caca680fbae85d010a32df9c89fc4b45ea6 Mon Sep 17 00:00:00 2001 From: Emma Alonso Date: Wed, 6 Nov 2024 13:02:51 +0100 Subject: [PATCH 1/6] Modify MenuItem to make it abstract and create IMenuItem interface --- .../restaurantManager/model/IMenuItem.java | 9 +++++++++ .../restaurantManager/model/MenuItem.java | 18 +++++++++++++++++- 2 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 src/main/java/dev/example/restaurantManager/model/IMenuItem.java diff --git a/src/main/java/dev/example/restaurantManager/model/IMenuItem.java b/src/main/java/dev/example/restaurantManager/model/IMenuItem.java new file mode 100644 index 0000000..153da63 --- /dev/null +++ b/src/main/java/dev/example/restaurantManager/model/IMenuItem.java @@ -0,0 +1,9 @@ +package dev.example.restaurantManager.model; + +public interface IMenuItem { + String getName(); + double getPrice(); + String getDescription(); + +} + diff --git a/src/main/java/dev/example/restaurantManager/model/MenuItem.java b/src/main/java/dev/example/restaurantManager/model/MenuItem.java index d1ba851..54bbcfd 100644 --- a/src/main/java/dev/example/restaurantManager/model/MenuItem.java +++ b/src/main/java/dev/example/restaurantManager/model/MenuItem.java @@ -10,7 +10,8 @@ @AllArgsConstructor @NoArgsConstructor @Entity -public class MenuItem { +@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) +public abstract class MenuItem implements IMenuItem { @Id private String id; @@ -27,4 +28,19 @@ public MenuItem(String id, String name, String description, double price) { this.description = description; this.price = price; } + + @Override + public String getName() { + return this.name; + } + + @Override + public double getPrice() { + return this.price; + } + + @Override + public String getDescription() { + return this.description; + } } \ No newline at end of file From a5dbf592a236e427db64b46d9e8747cc18bdbb67 Mon Sep 17 00:00:00 2001 From: Emma Alonso Date: Wed, 6 Nov 2024 13:10:57 +0100 Subject: [PATCH 2/6] Modify DataLoader and create subclasses Dessert and MainCourse --- .../restaurantManager/model/Dessert.java | 15 +++++++++++ .../restaurantManager/model/MainCourse.java | 15 +++++++++++ .../utilities/DataLoader.java | 27 ++++++++++++++----- 3 files changed, 50 insertions(+), 7 deletions(-) create mode 100644 src/main/java/dev/example/restaurantManager/model/Dessert.java create mode 100644 src/main/java/dev/example/restaurantManager/model/MainCourse.java diff --git a/src/main/java/dev/example/restaurantManager/model/Dessert.java b/src/main/java/dev/example/restaurantManager/model/Dessert.java new file mode 100644 index 0000000..3b2725f --- /dev/null +++ b/src/main/java/dev/example/restaurantManager/model/Dessert.java @@ -0,0 +1,15 @@ +package dev.example.restaurantManager.model; + +import java.util.List; + +public class Dessert extends MenuItem { + public Dessert(String string, String dish, String s, double v) { + } + + public Dessert() { + } + + public Dessert(String id, String name, String description, double price, List menus) { + super(id, name, description, price, menus); + } +} diff --git a/src/main/java/dev/example/restaurantManager/model/MainCourse.java b/src/main/java/dev/example/restaurantManager/model/MainCourse.java new file mode 100644 index 0000000..94aea15 --- /dev/null +++ b/src/main/java/dev/example/restaurantManager/model/MainCourse.java @@ -0,0 +1,15 @@ +package dev.example.restaurantManager.model; + +import java.util.List; + +public class MainCourse extends MenuItem { + public MainCourse(String string, String dish, String s, double v) { + } + + public MainCourse(String id, String name, String description, double price, List menus) { + super(id, name, description, price, menus); + } + + public MainCourse() { + } +} diff --git a/src/main/java/dev/example/restaurantManager/utilities/DataLoader.java b/src/main/java/dev/example/restaurantManager/utilities/DataLoader.java index 760cf2a..c98c565 100644 --- a/src/main/java/dev/example/restaurantManager/utilities/DataLoader.java +++ b/src/main/java/dev/example/restaurantManager/utilities/DataLoader.java @@ -44,7 +44,8 @@ public void loadAllData() { // then create relationships between them createCustomers(); createTables(); - createMenuItems(); + createMainCourse(); + createDessert(); // create and assign menu items createMenusAndAssignMenuItems(); @@ -94,20 +95,32 @@ private void createTables() { } } - // we are going to create 25 menu items - // and save them in the H2 local database - private void createMenuItems() { - for (int i = 0; i < 25; i++) { - MenuItem menuItem = new MenuItem( + private void createMainCourse() { + for (int i = 0; i < 10; i++) { + MenuItem menuItem; + menuItem = new MainCourse( + UUID.randomUUID().toString(), + faker.food().dish(), + faker.food().ingredient() + " " + faker.food().ingredient(), + faker.number().randomDouble(2, 5, 30) + ); + menuItemRepository.save(menuItem); + } + } + private void createDessert() { + for (int i = 0; i < 10; i++) { + MenuItem menuItem; + menuItem = new Dessert( UUID.randomUUID().toString(), faker.food().dish(), - faker.food().ingredient() + " " + faker.food().ingredient() , + faker.food().ingredient() + " " + faker.food().ingredient(), faker.number().randomDouble(2, 5, 30) ); menuItemRepository.save(menuItem); } } + // we are going to create 15 menus // and assign 5 to 10 menu items to each menu // to create a many-to-many relationship From 93741918c68f159ef9e37ee5f0b292cd5b73fd22 Mon Sep 17 00:00:00 2001 From: Emma Alonso Date: Wed, 6 Nov 2024 13:49:00 +0100 Subject: [PATCH 3/6] Implement subclasses Dessert and MainCourse --- .../restaurantManager/model/Dessert.java | 22 ++++++++++++--- .../restaurantManager/model/MainCourse.java | 28 +++++++++++++------ .../utilities/DataLoader.java | 6 ++-- 3 files changed, 41 insertions(+), 15 deletions(-) diff --git a/src/main/java/dev/example/restaurantManager/model/Dessert.java b/src/main/java/dev/example/restaurantManager/model/Dessert.java index 3b2725f..0a122c9 100644 --- a/src/main/java/dev/example/restaurantManager/model/Dessert.java +++ b/src/main/java/dev/example/restaurantManager/model/Dessert.java @@ -1,15 +1,29 @@ package dev.example.restaurantManager.model; +import jakarta.persistence.Entity; + import java.util.List; +@Entity public class Dessert extends MenuItem { - public Dessert(String string, String dish, String s, double v) { + private boolean toShare; + + public Dessert(String id, String name, String description, double price, boolean toShare) { + super(id, name, description, price); + this.toShare = false; } - public Dessert() { + public boolean getToShare() { + return toShare; } - public Dessert(String id, String name, String description, double price, List menus) { - super(id, name, description, price, menus); + public void setToShare(boolean toShare) { + this.toShare = toShare; + } + + // Example method specific to Dessert + public void isToShare() { + System.out.println("Dessert to share? " + toShare); } } + diff --git a/src/main/java/dev/example/restaurantManager/model/MainCourse.java b/src/main/java/dev/example/restaurantManager/model/MainCourse.java index 94aea15..e806657 100644 --- a/src/main/java/dev/example/restaurantManager/model/MainCourse.java +++ b/src/main/java/dev/example/restaurantManager/model/MainCourse.java @@ -1,15 +1,25 @@ package dev.example.restaurantManager.model; +import jakarta.persistence.*; -import java.util.List; + @Entity + public class MainCourse extends MenuItem { + private String servingSize; -public class MainCourse extends MenuItem { - public MainCourse(String string, String dish, String s, double v) { - } + public MainCourse(String id, String name, String description, double price, String servingSize) { + super(id, name, description, price); + this.servingSize = servingSize; + } - public MainCourse(String id, String name, String description, double price, List menus) { - super(id, name, description, price, menus); - } + public String getServingSize() { + return servingSize; + } - public MainCourse() { + public void setServingSize(String servingSize) { + this.servingSize = servingSize; + } + + public void printServingSize() { + System.out.println("Serving Size: " + servingSize); + } } -} + diff --git a/src/main/java/dev/example/restaurantManager/utilities/DataLoader.java b/src/main/java/dev/example/restaurantManager/utilities/DataLoader.java index c98c565..511ca78 100644 --- a/src/main/java/dev/example/restaurantManager/utilities/DataLoader.java +++ b/src/main/java/dev/example/restaurantManager/utilities/DataLoader.java @@ -102,7 +102,8 @@ private void createMainCourse() { UUID.randomUUID().toString(), faker.food().dish(), faker.food().ingredient() + " " + faker.food().ingredient(), - faker.number().randomDouble(2, 5, 30) + faker.number().randomDouble(2, 5, 30), + faker.options().option("Small", "Medium", "Large") ); menuItemRepository.save(menuItem); } @@ -114,7 +115,8 @@ private void createDessert() { UUID.randomUUID().toString(), faker.food().dish(), faker.food().ingredient() + " " + faker.food().ingredient(), - faker.number().randomDouble(2, 5, 30) + faker.number().randomDouble(2, 5, 30), + faker.random().nextBoolean() ); menuItemRepository.save(menuItem); } From c91a2630ba06b84d1d4aa866c04b2aa7d4c2a451 Mon Sep 17 00:00:00 2001 From: Emma Alonso Date: Thu, 7 Nov 2024 12:56:09 +0100 Subject: [PATCH 4/6] Create repositories for subclasses --- .../restaurantManager/repository/DessertRepository.java | 8 ++++++++ .../repository/MainCourseRepository.java | 7 +++++++ 2 files changed, 15 insertions(+) create mode 100644 src/main/java/dev/example/restaurantManager/repository/DessertRepository.java create mode 100644 src/main/java/dev/example/restaurantManager/repository/MainCourseRepository.java diff --git a/src/main/java/dev/example/restaurantManager/repository/DessertRepository.java b/src/main/java/dev/example/restaurantManager/repository/DessertRepository.java new file mode 100644 index 0000000..2bfdba5 --- /dev/null +++ b/src/main/java/dev/example/restaurantManager/repository/DessertRepository.java @@ -0,0 +1,8 @@ +package dev.example.restaurantManager.repository; + +import dev.example.restaurantManager.model.Dessert; +import dev.example.restaurantManager.model.MainCourse; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface DessertRepository extends JpaRepository { +} diff --git a/src/main/java/dev/example/restaurantManager/repository/MainCourseRepository.java b/src/main/java/dev/example/restaurantManager/repository/MainCourseRepository.java new file mode 100644 index 0000000..3e7f265 --- /dev/null +++ b/src/main/java/dev/example/restaurantManager/repository/MainCourseRepository.java @@ -0,0 +1,7 @@ +package dev.example.restaurantManager.repository; + +import dev.example.restaurantManager.model.MainCourse; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface MainCourseRepository extends JpaRepository { +} From 0dba14427b1cd21d84e0f381fc654926ca45d3b0 Mon Sep 17 00:00:00 2001 From: Emma Alonso Date: Thu, 7 Nov 2024 12:56:43 +0100 Subject: [PATCH 5/6] Implement unit tests for subclasses --- .../restaurantManager/model/Dessert.java | 6 +- .../restaurantManager/model/IMenuItem.java | 1 - .../restaurantManager/model/MainCourse.java | 36 ++++++----- .../utilities/DataLoader.java | 4 ++ .../resources/application-local.properties | 4 +- .../BookingTableManyToManyTest.java | 3 + .../restaurantManager/MenuItemTest.java | 60 +++++++++++++++++++ 7 files changed, 94 insertions(+), 20 deletions(-) create mode 100644 src/test/java/dev/example/restaurantManager/MenuItemTest.java diff --git a/src/main/java/dev/example/restaurantManager/model/Dessert.java b/src/main/java/dev/example/restaurantManager/model/Dessert.java index 0a122c9..24ff4c7 100644 --- a/src/main/java/dev/example/restaurantManager/model/Dessert.java +++ b/src/main/java/dev/example/restaurantManager/model/Dessert.java @@ -1,16 +1,20 @@ package dev.example.restaurantManager.model; import jakarta.persistence.Entity; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; import java.util.List; +@NoArgsConstructor +@AllArgsConstructor @Entity public class Dessert extends MenuItem { private boolean toShare; public Dessert(String id, String name, String description, double price, boolean toShare) { super(id, name, description, price); - this.toShare = false; + this.toShare = toShare; } public boolean getToShare() { diff --git a/src/main/java/dev/example/restaurantManager/model/IMenuItem.java b/src/main/java/dev/example/restaurantManager/model/IMenuItem.java index 153da63..cb17737 100644 --- a/src/main/java/dev/example/restaurantManager/model/IMenuItem.java +++ b/src/main/java/dev/example/restaurantManager/model/IMenuItem.java @@ -4,6 +4,5 @@ public interface IMenuItem { String getName(); double getPrice(); String getDescription(); - } diff --git a/src/main/java/dev/example/restaurantManager/model/MainCourse.java b/src/main/java/dev/example/restaurantManager/model/MainCourse.java index e806657..10a6f4e 100644 --- a/src/main/java/dev/example/restaurantManager/model/MainCourse.java +++ b/src/main/java/dev/example/restaurantManager/model/MainCourse.java @@ -1,25 +1,29 @@ package dev.example.restaurantManager.model; import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; - @Entity - public class MainCourse extends MenuItem { - private String servingSize; +@NoArgsConstructor +@AllArgsConstructor +@Entity +public class MainCourse extends MenuItem { + private String servingSize; - public MainCourse(String id, String name, String description, double price, String servingSize) { - super(id, name, description, price); - this.servingSize = servingSize; - } + public MainCourse(String id, String name, String description, double price, String servingSize) { + super(id, name, description, price); + this.servingSize = servingSize; + } - public String getServingSize() { - return servingSize; - } + public String getServingSize() { + return servingSize; + } - public void setServingSize(String servingSize) { - this.servingSize = servingSize; - } + public void setServingSize(String servingSize) { + this.servingSize = servingSize; + } - public void printServingSize() { - System.out.println("Serving Size: " + servingSize); - } + public void printServingSize() { + System.out.println("Serving Size: " + servingSize); } +} diff --git a/src/main/java/dev/example/restaurantManager/utilities/DataLoader.java b/src/main/java/dev/example/restaurantManager/utilities/DataLoader.java index 511ca78..a02e258 100644 --- a/src/main/java/dev/example/restaurantManager/utilities/DataLoader.java +++ b/src/main/java/dev/example/restaurantManager/utilities/DataLoader.java @@ -33,6 +33,10 @@ public class DataLoader { private ShippingOrderRepository shippingOrderRepository; @Autowired private TakeAwayOrderRepository takeAwayOrderRepository; + @Autowired + private MainCourseRepository mainCourseRepository; + @Autowired + private DessertRepository dessertRepository; private final Faker faker = new Faker(new Locale("en-US")); // master method orchestrating all other methods to diff --git a/src/main/resources/application-local.properties b/src/main/resources/application-local.properties index 89a2791..a4a6929 100644 --- a/src/main/resources/application-local.properties +++ b/src/main/resources/application-local.properties @@ -2,9 +2,9 @@ # H2 LOCAL DB SERVER -spring.datasource.url=jdbc:h2:/home/albert/MyProjects/DataBase/restaurantManager/restaurantManagerDB +spring.datasource.url=jdbc:h2:/home/emma/MyProjects/DataBase/restaurantManager/restaurantManagerDB #spring.datasource.url=jdbc:h2:/home/albert/MyProjects/DataBase/restaurantManager/restaurantManagerDBTest -spring.datasource.username=albert +spring.datasource.username=emma spring.datasource.password=1234 # DDL OPTIONS: create-drop, create, update, none, validate diff --git a/src/test/java/dev/example/restaurantManager/BookingTableManyToManyTest.java b/src/test/java/dev/example/restaurantManager/BookingTableManyToManyTest.java index e9bebaa..893183a 100644 --- a/src/test/java/dev/example/restaurantManager/BookingTableManyToManyTest.java +++ b/src/test/java/dev/example/restaurantManager/BookingTableManyToManyTest.java @@ -2,6 +2,7 @@ import dev.example.restaurantManager.model.Booking; import dev.example.restaurantManager.model.Customer; +import dev.example.restaurantManager.model.MainCourse; import dev.example.restaurantManager.model.TableRestaurant; import dev.example.restaurantManager.repository.BookingRepository; import dev.example.restaurantManager.repository.CustomerRepository; @@ -13,6 +14,7 @@ import java.util.Date; import java.util.Optional; import static org.assertj.core.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; @DataJpaTest public class BookingTableManyToManyTest { @@ -127,4 +129,5 @@ void createBooking() { } + } diff --git a/src/test/java/dev/example/restaurantManager/MenuItemTest.java b/src/test/java/dev/example/restaurantManager/MenuItemTest.java new file mode 100644 index 0000000..00d5f80 --- /dev/null +++ b/src/test/java/dev/example/restaurantManager/MenuItemTest.java @@ -0,0 +1,60 @@ +package dev.example.restaurantManager; + +import dev.example.restaurantManager.model.Dessert; +import dev.example.restaurantManager.model.MainCourse; +import dev.example.restaurantManager.repository.DessertRepository; +import dev.example.restaurantManager.repository.MainCourseRepository; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.*; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.boot.test.context.SpringBootTest; + +@DataJpaTest +class MenuItemTest { + + @Autowired + private DessertRepository dessertRepository; + @Autowired + private MainCourseRepository mainCourseRepository; + + @Test + public void DessertRepositoryTest() { + Dessert dessert = new Dessert( + "D03", + "Apple Pie", + "Warm apple pie with cinnamon", + 6.50, + true + ); + dessertRepository.save(dessert); + + Dessert found = dessertRepository.findById("D03").orElse(null); + assertNotNull(found); + assertEquals("Apple Pie", found.getName()); + assertTrue(found.getToShare()); + } + + @Test + public void MainCourseRepositoryTest() { + + MainCourse mainCourse = new MainCourse( + "MC03", + "Salmon", + "Grilled salmon with spices", + 15.99, + "Large" + ); + mainCourseRepository.save(mainCourse); + + MainCourse found = mainCourseRepository.findById("MC03").orElse(null); + assertNotNull(found); + assertEquals("Salmon", found.getName()); + assertEquals("Large", found.getServingSize()); + } + +} + + From c6789c19b5994421615b8f19faeec644deba7eea Mon Sep 17 00:00:00 2001 From: Emma Alonso Date: Thu, 7 Nov 2024 13:08:27 +0100 Subject: [PATCH 6/6] Implement unit tests for subclasses used as menuItem objects --- .../example/restaurantManager/MenuItemTest.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/test/java/dev/example/restaurantManager/MenuItemTest.java b/src/test/java/dev/example/restaurantManager/MenuItemTest.java index 00d5f80..a0cfe4e 100644 --- a/src/test/java/dev/example/restaurantManager/MenuItemTest.java +++ b/src/test/java/dev/example/restaurantManager/MenuItemTest.java @@ -2,6 +2,7 @@ import dev.example.restaurantManager.model.Dessert; import dev.example.restaurantManager.model.MainCourse; +import dev.example.restaurantManager.model.MenuItem; import dev.example.restaurantManager.repository.DessertRepository; import dev.example.restaurantManager.repository.MainCourseRepository; import org.junit.jupiter.api.Nested; @@ -12,6 +13,9 @@ import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.boot.test.context.SpringBootTest; +import java.util.ArrayList; +import java.util.List; + @DataJpaTest class MenuItemTest { @@ -55,6 +59,19 @@ public void MainCourseRepositoryTest() { assertEquals("Large", found.getServingSize()); } + @Test + void testPolymorphicBehavior() { + List menuItems = new ArrayList<>(); + menuItems.add(new MainCourse("MC02", "Pasta", "Pasta with tomato sauce", 10.50, "Medium")); + menuItems.add(new Dessert("D02", "Ice Cream", "Vanilla flavor", 5.99, false)); + + for (MenuItem item : menuItems) { + assertNotNull(item.getName()); + assertTrue(item.getPrice() > 0); + assertTrue(item.getDescription().length() > 0); + } + } + }