From 1ca1e6149aaa249ebe0a24b37d0070c931c95289 Mon Sep 17 00:00:00 2001 From: jc-programs Date: Fri, 8 Nov 2024 13:56:20 +0100 Subject: [PATCH 01/13] add IMenuItem interface & implemented in MenuItem --- .../restaurantManager/model/IMenuItem.java | 22 +++++++ .../restaurantManager/model/MenuItem.java | 58 +++++++++++++++++-- .../resources/application-local.properties | 18 ++++-- .../menuItem/IMenuItemTest.java | 49 ++++++++++++++++ 4 files changed, 138 insertions(+), 9 deletions(-) create mode 100644 src/main/java/dev/example/restaurantManager/model/IMenuItem.java create mode 100644 src/test/java/dev/example/restaurantManager/menuItem/IMenuItemTest.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..5567a6e --- /dev/null +++ b/src/main/java/dev/example/restaurantManager/model/IMenuItem.java @@ -0,0 +1,22 @@ +package dev.example.restaurantManager.model; + +public interface IMenuItem { + String getId(); + String getName(); + String getDescription(); + double getPrice(); + + + void setId(String id); + void setName(String name); + void setDescription(String description); + void setPrice(double price); + + + +// private String id; +// private String name; +// private String description; +// private double price; + +} diff --git a/src/main/java/dev/example/restaurantManager/model/MenuItem.java b/src/main/java/dev/example/restaurantManager/model/MenuItem.java index d1ba851..36a54d6 100644 --- a/src/main/java/dev/example/restaurantManager/model/MenuItem.java +++ b/src/main/java/dev/example/restaurantManager/model/MenuItem.java @@ -6,11 +6,8 @@ import lombok.NoArgsConstructor; import java.util.List; -@Data -@AllArgsConstructor -@NoArgsConstructor @Entity -public class MenuItem { +public class MenuItem implements IMenuItem{ @Id private String id; @@ -21,10 +18,63 @@ public class MenuItem { @ManyToMany(mappedBy = "menuItems") private List menus; + public MenuItem(){ + } + public MenuItem(String id, String name, String description, double price) { this.id = id; this.name = name; this.description = description; this.price = price; } + + + @Override + public String getId() { + return id; + } + + @Override + public String getName() { + return name; + } + + @Override + public String getDescription() { + return description; + } + + @Override + public double getPrice() { + return price; + } + + @Override + public void setId(String id) { + this.id = id; + } + + @Override + public void setName(String name) { + this.name = name; + } + + @Override + public void setDescription(String description) { + this.description = description; + } + + @Override + public void setPrice(double price) { + this.price = price; + } + + @Override + public String toString(){ + return "id=" + this.id + + ", name=" + this.name + + ", description=" + this.description + + ", price=" + this.price; + } + } \ No newline at end of file diff --git a/src/main/resources/application-local.properties b/src/main/resources/application-local.properties index 89a2791..adf66bd 100644 --- a/src/main/resources/application-local.properties +++ b/src/main/resources/application-local.properties @@ -2,13 +2,21 @@ # H2 LOCAL DB SERVER -spring.datasource.url=jdbc:h2:/home/albert/MyProjects/DataBase/restaurantManager/restaurantManagerDB -#spring.datasource.url=jdbc:h2:/home/albert/MyProjects/DataBase/restaurantManager/restaurantManagerDBTest -spring.datasource.username=albert -spring.datasource.password=1234 +spring.datasource.url=jdbc:h2:/home/jc/Documents/restaurant-db/db-pra05 +spring.datasource.username=jc +spring.datasource.password= + +#spring.datasource.url=jdbc:h2:/home/albert/MyProjects/DataBase/restaurantManager/restaurantManagerDB +##spring.datasource.url=jdbc:h2:/home/albert/MyProjects/DataBase/restaurantManager/restaurantManagerDBTest +#spring.datasource.username=albert +#spring.datasource.password=1234 + +# see sql in console +#spring.jpa.show-sql=true +#spring.jpa.properties.hibernate.format_sql=true # DDL OPTIONS: create-drop, create, update, none, validate -spring.jpa.hibernate.ddl-auto=create +spring.jpa.hibernate.ddl-auto=none # create ? Hibernate first drops existing tables and then creates new tables. # update ? The object model created based on the mappings # (annotations or XML) is compared with the existing schema, diff --git a/src/test/java/dev/example/restaurantManager/menuItem/IMenuItemTest.java b/src/test/java/dev/example/restaurantManager/menuItem/IMenuItemTest.java new file mode 100644 index 0000000..e335ec2 --- /dev/null +++ b/src/test/java/dev/example/restaurantManager/menuItem/IMenuItemTest.java @@ -0,0 +1,49 @@ +package dev.example.restaurantManager.menuItem; + +import dev.example.restaurantManager.model.MenuItem; +import dev.example.restaurantManager.repository.MenuItemRepository; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + + +@SpringBootTest +public class IMenuItemTest { + + @Autowired + private MenuItemRepository menuItemRepository; + + @Test + void newInterfaceMenuItem_InMemory(){ + String id = "MI001"; + String name = "item 1"; + String description = "item 1 description"; + double price = 20.0; + MenuItem menuItem = new MenuItem(); + menuItem.setId(id); + menuItem.setName(name); + menuItem.setDescription(description); + menuItem.setPrice(price); + + assertThat(menuItem.getId()).isEqualTo(id); + assertThat(menuItem.getName()).isEqualTo(name); + assertThat(menuItem.getDescription()).isEqualTo(description); + assertThat(menuItem.getPrice()).isEqualTo(price); + } + + @Test + void newInterfaceMenuItem_DB(){ + MenuItem menuItem = menuItemRepository.findAll().getFirst(); + + assertThat(menuItem.getId()).isNotNull(); + assertThat(menuItem.getName()).isNotNull(); + assertThat(menuItem.getDescription()).isNotNull(); + assertThat(menuItem.getPrice()).isNotNull(); + } + +} From 481bba73f3664a299c2b455d2ec829c919d1c808 Mon Sep 17 00:00:00 2001 From: albert Date: Tue, 5 Nov 2024 11:20:11 +0100 Subject: [PATCH 02/13] PRA05: Spring Boot JPA Inheritance and Abstraction --- _PRA/PRA05.md | 106 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 _PRA/PRA05.md diff --git a/_PRA/PRA05.md b/_PRA/PRA05.md new file mode 100644 index 0000000..b1ff881 --- /dev/null +++ b/_PRA/PRA05.md @@ -0,0 +1,106 @@ +# PRA05: Spring Boot JPA Inheritance and Abstraction + +## CIFO La Violeta - FullStack IFCD0021-24 MF04-05 + +In this practical exercise, you will enhance the `RestaurantManager` project by implementing inheritance and abstraction concepts. + + + +You'll refactor the `MenuItem` class, create subclasses, and implement an interface using JPA inheritance strategies. + +### Objectives + +- Refactor `MenuItem` to an abstract class +- Create subclasses for different menu item types +- Implement an interface for menu items +- Use JPA inheritance strategies + +### Project Base + +- Existing Repository: [Restaurant Manager](https://github.com/AlbertProfe/restaurantManager/) +- **Branch** with Abstract refactor: [RestaurantMananger feature-order-abstract]([GitHub - AlbertProfe/restaurantManager at b1bdddcf75c6772d4fd89d71d8370d778511abfe](https://github.com/AlbertProfe/restaurantManager/tree/b1bdddcf75c6772d4fd89d71d8370d778511abfe)) +- Reference: [JPA Inheritance Strategies]([Spring Boot: JPA Inherence – albertprofe wiki](https://albertprofe.dev/springboot/boot-concepts-jpa-5.html)) + +### Tasks + +1. Refactor `MenuItem` to Abstract Class + + - Convert the existing `MenuItem` class to an abstract class + - Identify common properties and methods to keep in the abstract class + +2. Create Subclasses + + - Create two subclasses: `MainCourse` and `Dessert` + - Implement specific properties and methods for each subclass + +3. Create `Interface` Class + + - Design an `interface` (e.g., `IMenuItem`) with common methods for menu items + - Ensure the abstract `MenuItem` class implements this interface + +4. Implement JPA Inheritance Strategy + + - Use the `@Inheritance annotation with strategy = InheritanceType.TABLE_PER_CLASS` + - Adjust entity mappings for the abstract class and subclasses + +5. Update Repository and Service Classes + + - Modify existing repository interfaces to work with the new class hierarchy + - Update service classes to handle the abstract class and its subclasses + +6. Create Test Classes + + - Develop test classes for the new class structure + - Include tests for inheritance-specific scenarios + +7. Update API Endpoints + + - Modify existing endpoints to work with the new class hierarchy + - Add new endpoints if necessary to demonstrate subclass-specific operations + +### Example Code Structure + +```java +public interface IMenuItem { + String getName(); + double getPrice(); + // Other common methods +} + +@Entity +@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) +public abstract class MenuItem implements IMenuItem { + // Common properties and methods +} + +@Entity +public class MainCourse extends MenuItem { + // MainCourse specific properties and methods +} + +@Entity +public class Dessert extends MenuItem { + // Dessert specific properties and methods +} +``` + +### Submission Guidelines + +- Fork the existing Restaurant Manager repository and clone to your local environment. +- Create a new branch named `PRA05-YourName` from the latest commit +- Implement the required changes and tests +- Commit your changes with clear, descriptive messages +- Push your branch to your forked repository +- Create a pull request to the AlbertProfe repository with a summary of your changes with title: + `PRA05-YourName-InheritanceAndAbstraction` + +### Evaluation Criteria + +- Correct implementation of abstract class, subclasses, and interface +- Proper use of JPA inheritance strategy +- Comprehensive test coverage for the new class structure +- Effective use of abstraction and inheritance principles +- Code clarity and documentation quality +- Adherence to Spring Data JPA best practices + +Remember to focus on creating a clean, well-structured inheritance hierarchy that demonstrates good object-oriented design principles. Good luck! From 13778dd402b5ab23cc9670e6d0229c2f1bf9ebeb Mon Sep 17 00:00:00 2001 From: jc-programs Date: Fri, 8 Nov 2024 18:25:31 +0100 Subject: [PATCH 03/13] application-local.properties --- src/main/resources/application-local.properties | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/main/resources/application-local.properties b/src/main/resources/application-local.properties index 89a2791..962f4c6 100644 --- a/src/main/resources/application-local.properties +++ b/src/main/resources/application-local.properties @@ -2,10 +2,13 @@ # H2 LOCAL DB SERVER -spring.datasource.url=jdbc:h2:/home/albert/MyProjects/DataBase/restaurantManager/restaurantManagerDB -#spring.datasource.url=jdbc:h2:/home/albert/MyProjects/DataBase/restaurantManager/restaurantManagerDBTest -spring.datasource.username=albert -spring.datasource.password=1234 +spring.datasource.url=jdbc:h2:/home/jc/Documents/restaurant-db/db-pra05 +spring.datasource.username=jc +spring.datasource.password= + +# see sql in console +# spring.jpa.show-sql=true +# spring.jpa.properties.hibernate.format_sql=true # DDL OPTIONS: create-drop, create, update, none, validate spring.jpa.hibernate.ddl-auto=create From c3c7cec7bde519fe652be7c1d6717a990396eb30 Mon Sep 17 00:00:00 2001 From: jc-programs Date: Fri, 8 Nov 2024 19:09:41 +0100 Subject: [PATCH 04/13] Dessert and MainCourse. MenuItem is not abstract jet --- .../controller/MenuItemController.java | 2 +- .../model/MenuItem/Dessert.java | 24 +++++++++++++++++++ .../model/{ => MenuItem}/IMenuItem.java | 2 +- .../model/MenuItem/MainCourse.java | 23 ++++++++++++++++++ .../model/{ => MenuItem}/MenuItem.java | 7 +++--- .../model/MenuRestaurant.java | 4 ++-- .../repository/MenuItemRepository.java | 2 +- .../service/MenuItemService.java | 2 +- .../service/MenuItemServiceImpl.java | 2 +- .../service/MenuRestaurantServiceImpl.java | 2 +- .../utilities/DataLoader.java | 2 +- .../menuItem/IMenuItemTest.java | 5 +--- 12 files changed, 60 insertions(+), 17 deletions(-) create mode 100644 src/main/java/dev/example/restaurantManager/model/MenuItem/Dessert.java rename src/main/java/dev/example/restaurantManager/model/{ => MenuItem}/IMenuItem.java (87%) create mode 100644 src/main/java/dev/example/restaurantManager/model/MenuItem/MainCourse.java rename src/main/java/dev/example/restaurantManager/model/{ => MenuItem}/MenuItem.java (91%) diff --git a/src/main/java/dev/example/restaurantManager/controller/MenuItemController.java b/src/main/java/dev/example/restaurantManager/controller/MenuItemController.java index fbcc2ac..417e6d4 100644 --- a/src/main/java/dev/example/restaurantManager/controller/MenuItemController.java +++ b/src/main/java/dev/example/restaurantManager/controller/MenuItemController.java @@ -1,6 +1,6 @@ package dev.example.restaurantManager.controller; -import dev.example.restaurantManager.model.MenuItem; +import dev.example.restaurantManager.model.MenuItem.MenuItem; import dev.example.restaurantManager.service.MenuItemService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; diff --git a/src/main/java/dev/example/restaurantManager/model/MenuItem/Dessert.java b/src/main/java/dev/example/restaurantManager/model/MenuItem/Dessert.java new file mode 100644 index 0000000..53309cb --- /dev/null +++ b/src/main/java/dev/example/restaurantManager/model/MenuItem/Dessert.java @@ -0,0 +1,24 @@ +package dev.example.restaurantManager.model.MenuItem; + +import jakarta.persistence.Entity; + + +@Entity +public class Dessert extends MenuItem{ + + private boolean sugarFree; + + public Dessert(String id, String name, String description, double price, boolean sugarFree) { + super(id,name,description,price); + this.sugarFree = sugarFree; + } + + public boolean isSugarFree(){ + return sugarFree; + } + + public void setSugarFree(boolean sugarFree){ + this.sugarFree = sugarFree; + } + +} diff --git a/src/main/java/dev/example/restaurantManager/model/IMenuItem.java b/src/main/java/dev/example/restaurantManager/model/MenuItem/IMenuItem.java similarity index 87% rename from src/main/java/dev/example/restaurantManager/model/IMenuItem.java rename to src/main/java/dev/example/restaurantManager/model/MenuItem/IMenuItem.java index 5567a6e..b9c1cf3 100644 --- a/src/main/java/dev/example/restaurantManager/model/IMenuItem.java +++ b/src/main/java/dev/example/restaurantManager/model/MenuItem/IMenuItem.java @@ -1,4 +1,4 @@ -package dev.example.restaurantManager.model; +package dev.example.restaurantManager.model.MenuItem; public interface IMenuItem { String getId(); diff --git a/src/main/java/dev/example/restaurantManager/model/MenuItem/MainCourse.java b/src/main/java/dev/example/restaurantManager/model/MenuItem/MainCourse.java new file mode 100644 index 0000000..4c1264d --- /dev/null +++ b/src/main/java/dev/example/restaurantManager/model/MenuItem/MainCourse.java @@ -0,0 +1,23 @@ +package dev.example.restaurantManager.model.MenuItem; + +import jakarta.persistence.Entity; + +@Entity +public class MainCourse extends MenuItem{ + + private boolean vegan; + + public MainCourse(String id, String name, String description, double price, boolean vegan) { + super(id,name,description,price); + this.vegan = vegan; + } + + public boolean isVegan(){ + return vegan; + } + + public void setVegan(boolean vegan){ + this.vegan = vegan; + } + +} diff --git a/src/main/java/dev/example/restaurantManager/model/MenuItem.java b/src/main/java/dev/example/restaurantManager/model/MenuItem/MenuItem.java similarity index 91% rename from src/main/java/dev/example/restaurantManager/model/MenuItem.java rename to src/main/java/dev/example/restaurantManager/model/MenuItem/MenuItem.java index 36a54d6..9062210 100644 --- a/src/main/java/dev/example/restaurantManager/model/MenuItem.java +++ b/src/main/java/dev/example/restaurantManager/model/MenuItem/MenuItem.java @@ -1,9 +1,8 @@ -package dev.example.restaurantManager.model; +package dev.example.restaurantManager.model.MenuItem; +import dev.example.restaurantManager.model.MenuRestaurant; import jakarta.persistence.*; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; + import java.util.List; @Entity diff --git a/src/main/java/dev/example/restaurantManager/model/MenuRestaurant.java b/src/main/java/dev/example/restaurantManager/model/MenuRestaurant.java index f23a7ca..c1cdbc6 100644 --- a/src/main/java/dev/example/restaurantManager/model/MenuRestaurant.java +++ b/src/main/java/dev/example/restaurantManager/model/MenuRestaurant.java @@ -1,9 +1,9 @@ package dev.example.restaurantManager.model; -import com.fasterxml.jackson.annotation.JsonIgnore; +import dev.example.restaurantManager.model.MenuItem.MenuItem; import jakarta.persistence.*; import lombok.*; -import java.util.ArrayList; + import java.util.List; import java.util.Objects; diff --git a/src/main/java/dev/example/restaurantManager/repository/MenuItemRepository.java b/src/main/java/dev/example/restaurantManager/repository/MenuItemRepository.java index cfe3f40..16636ca 100644 --- a/src/main/java/dev/example/restaurantManager/repository/MenuItemRepository.java +++ b/src/main/java/dev/example/restaurantManager/repository/MenuItemRepository.java @@ -1,6 +1,6 @@ package dev.example.restaurantManager.repository; -import dev.example.restaurantManager.model.MenuItem; +import dev.example.restaurantManager.model.MenuItem.MenuItem; import org.springframework.data.jpa.repository.JpaRepository; public interface MenuItemRepository extends JpaRepository { diff --git a/src/main/java/dev/example/restaurantManager/service/MenuItemService.java b/src/main/java/dev/example/restaurantManager/service/MenuItemService.java index b45c30f..55b7fd1 100644 --- a/src/main/java/dev/example/restaurantManager/service/MenuItemService.java +++ b/src/main/java/dev/example/restaurantManager/service/MenuItemService.java @@ -1,6 +1,6 @@ package dev.example.restaurantManager.service; -import dev.example.restaurantManager.model.MenuItem; +import dev.example.restaurantManager.model.MenuItem.MenuItem; import java.util.List; public interface MenuItemService { diff --git a/src/main/java/dev/example/restaurantManager/service/MenuItemServiceImpl.java b/src/main/java/dev/example/restaurantManager/service/MenuItemServiceImpl.java index ccce3d3..37fd16d 100644 --- a/src/main/java/dev/example/restaurantManager/service/MenuItemServiceImpl.java +++ b/src/main/java/dev/example/restaurantManager/service/MenuItemServiceImpl.java @@ -1,6 +1,6 @@ package dev.example.restaurantManager.service; -import dev.example.restaurantManager.model.MenuItem; +import dev.example.restaurantManager.model.MenuItem.MenuItem; import dev.example.restaurantManager.repository.MenuItemRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; diff --git a/src/main/java/dev/example/restaurantManager/service/MenuRestaurantServiceImpl.java b/src/main/java/dev/example/restaurantManager/service/MenuRestaurantServiceImpl.java index 2162bfd..835a344 100644 --- a/src/main/java/dev/example/restaurantManager/service/MenuRestaurantServiceImpl.java +++ b/src/main/java/dev/example/restaurantManager/service/MenuRestaurantServiceImpl.java @@ -1,7 +1,7 @@ package dev.example.restaurantManager.service; import dev.example.restaurantManager.model.MenuRestaurant; -import dev.example.restaurantManager.model.MenuItem; +import dev.example.restaurantManager.model.MenuItem.MenuItem; import dev.example.restaurantManager.repository.MenuRestaurantRepository; import dev.example.restaurantManager.repository.MenuItemRepository; import org.springframework.beans.factory.annotation.Autowired; diff --git a/src/main/java/dev/example/restaurantManager/utilities/DataLoader.java b/src/main/java/dev/example/restaurantManager/utilities/DataLoader.java index 760cf2a..32b7d8b 100644 --- a/src/main/java/dev/example/restaurantManager/utilities/DataLoader.java +++ b/src/main/java/dev/example/restaurantManager/utilities/DataLoader.java @@ -2,11 +2,11 @@ import com.github.javafaker.Faker; import dev.example.restaurantManager.model.*; +import dev.example.restaurantManager.model.MenuItem.MenuItem; import dev.example.restaurantManager.repository.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import java.time.LocalDate; import java.util.*; import java.util.concurrent.TimeUnit; diff --git a/src/test/java/dev/example/restaurantManager/menuItem/IMenuItemTest.java b/src/test/java/dev/example/restaurantManager/menuItem/IMenuItemTest.java index e335ec2..976a4b4 100644 --- a/src/test/java/dev/example/restaurantManager/menuItem/IMenuItemTest.java +++ b/src/test/java/dev/example/restaurantManager/menuItem/IMenuItemTest.java @@ -1,14 +1,11 @@ package dev.example.restaurantManager.menuItem; -import dev.example.restaurantManager.model.MenuItem; +import dev.example.restaurantManager.model.MenuItem.MenuItem; import dev.example.restaurantManager.repository.MenuItemRepository; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.boot.test.context.SpringBootTest; -import java.util.List; - import static org.assertj.core.api.Assertions.assertThat; From 2e77a8b134be7524c53307d2b5f9261f8a72c773 Mon Sep 17 00:00:00 2001 From: jc-programs Date: Fri, 8 Nov 2024 19:21:47 +0100 Subject: [PATCH 05/13] Start conversion MenuItem to abstract class --- .../model/MenuItem/MenuItem.java | 2 +- .../repository/DessertRepository.java | 7 ++ .../repository/MainCourseRepository.java | 7 ++ .../menuItem/DessertTest.java | 88 +++++++++++++++++++ .../menuItem/IMenuItemTest.java | 46 ---------- 5 files changed, 103 insertions(+), 47 deletions(-) create mode 100644 src/main/java/dev/example/restaurantManager/repository/DessertRepository.java create mode 100644 src/main/java/dev/example/restaurantManager/repository/MainCourseRepository.java create mode 100644 src/test/java/dev/example/restaurantManager/menuItem/DessertTest.java delete mode 100644 src/test/java/dev/example/restaurantManager/menuItem/IMenuItemTest.java diff --git a/src/main/java/dev/example/restaurantManager/model/MenuItem/MenuItem.java b/src/main/java/dev/example/restaurantManager/model/MenuItem/MenuItem.java index 9062210..cdbb241 100644 --- a/src/main/java/dev/example/restaurantManager/model/MenuItem/MenuItem.java +++ b/src/main/java/dev/example/restaurantManager/model/MenuItem/MenuItem.java @@ -6,7 +6,7 @@ import java.util.List; @Entity -public class MenuItem implements IMenuItem{ +public abstract class MenuItem implements IMenuItem{ @Id private String id; 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..09759ea --- /dev/null +++ b/src/main/java/dev/example/restaurantManager/repository/DessertRepository.java @@ -0,0 +1,7 @@ +package dev.example.restaurantManager.repository; + +import dev.example.restaurantManager.model.MenuItem.Dessert; +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..5f6cee4 --- /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.MenuItem.MainCourse; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface MainCourseRepository extends JpaRepository { +} diff --git a/src/test/java/dev/example/restaurantManager/menuItem/DessertTest.java b/src/test/java/dev/example/restaurantManager/menuItem/DessertTest.java new file mode 100644 index 0000000..b44f05a --- /dev/null +++ b/src/test/java/dev/example/restaurantManager/menuItem/DessertTest.java @@ -0,0 +1,88 @@ +package dev.example.restaurantManager.menuItem; + +import dev.example.restaurantManager.model.MenuItem.Dessert; +import dev.example.restaurantManager.model.MenuItem.MainCourse; +import dev.example.restaurantManager.model.MenuItem.MenuItem; +import dev.example.restaurantManager.repository.DessertRepository; +import dev.example.restaurantManager.repository.MainCourseRepository; +import dev.example.restaurantManager.repository.MenuItemRepository; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import static org.assertj.core.api.Assertions.assertThat; + + +@SpringBootTest +public class DessertTest { + + @Autowired + private DessertRepository dessertRepository; + @Autowired + private MainCourseRepository mainCourseRepository; + + @Test + void newInterfaceDessert_InMemory(){ + String id = "MI001"; + String name = "item 1"; + String description = "item 1 description"; + double price = 20.0; + boolean sugarFree = true; + Dessert dessert = new Dessert(); + dessert.setId(id); + dessert.setName(name); + dessert.setDescription(description); + dessert.setPrice(price); + dessert.setSugarFree(sugarFree); + + assertThat(dessert.getId()).isEqualTo(id); + assertThat(dessert.getName()).isEqualTo(name); + assertThat(dessert.getDescription()).isEqualTo(description); + assertThat(dessert.getPrice()).isEqualTo(price); + assertThat(dessert.isSugarFree()).isEqualTo(sugarFree); + } + + @Test + void newInterfaceDessert_DB(){ + Dessert dessert = dessertRepository.findAll().getFirst(); + + assertThat(dessert.getId()).isNotNull(); + assertThat(dessert.getName()).isNotNull(); + assertThat(dessert.getDescription()).isNotNull(); + assertThat(dessert.getPrice()).isNotNull(); + assertThat(dessert.isSugarFree()).isNotNull(); + } + + @Test + void newInterfaceMainCourse_InMemory(){ + String id = "MI001"; + String name = "item 1"; + String description = "item 1 description"; + double price = 20.0; + boolean vegan = false; + MainCourse mainCourse = new MainCourse(); + mainCourse.setId(id); + mainCourse.setName(name); + mainCourse.setDescription(description); + mainCourse.setPrice(price); + mainCourse.setVegan(vegan); + + assertThat(mainCourse.getId()).isEqualTo(id); + assertThat(mainCourse.getName()).isEqualTo(name); + assertThat(mainCourse.getDescription()).isEqualTo(description); + assertThat(mainCourse.getPrice()).isEqualTo(price); + assertThat(mainCourse.isVegan()).isEqualTo(vegan); + } + + @Test + void newInterfaceMainCourse_DB(){ + MainCourse mainCourse = mainCourseRepository.findAll().getFirst(); + + assertThat(mainCourse.getId()).isNotNull(); + assertThat(mainCourse.getName()).isNotNull(); + assertThat(mainCourse.getDescription()).isNotNull(); + assertThat(mainCourse.getPrice()).isNotNull(); + assertThat(mainCourse.isVegan()).isNotNull(); + } + +} diff --git a/src/test/java/dev/example/restaurantManager/menuItem/IMenuItemTest.java b/src/test/java/dev/example/restaurantManager/menuItem/IMenuItemTest.java deleted file mode 100644 index 976a4b4..0000000 --- a/src/test/java/dev/example/restaurantManager/menuItem/IMenuItemTest.java +++ /dev/null @@ -1,46 +0,0 @@ -package dev.example.restaurantManager.menuItem; - -import dev.example.restaurantManager.model.MenuItem.MenuItem; -import dev.example.restaurantManager.repository.MenuItemRepository; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; - -import static org.assertj.core.api.Assertions.assertThat; - - -@SpringBootTest -public class IMenuItemTest { - - @Autowired - private MenuItemRepository menuItemRepository; - - @Test - void newInterfaceMenuItem_InMemory(){ - String id = "MI001"; - String name = "item 1"; - String description = "item 1 description"; - double price = 20.0; - MenuItem menuItem = new MenuItem(); - menuItem.setId(id); - menuItem.setName(name); - menuItem.setDescription(description); - menuItem.setPrice(price); - - assertThat(menuItem.getId()).isEqualTo(id); - assertThat(menuItem.getName()).isEqualTo(name); - assertThat(menuItem.getDescription()).isEqualTo(description); - assertThat(menuItem.getPrice()).isEqualTo(price); - } - - @Test - void newInterfaceMenuItem_DB(){ - MenuItem menuItem = menuItemRepository.findAll().getFirst(); - - assertThat(menuItem.getId()).isNotNull(); - assertThat(menuItem.getName()).isNotNull(); - assertThat(menuItem.getDescription()).isNotNull(); - assertThat(menuItem.getPrice()).isNotNull(); - } - -} From 52abe3c3fe47aeb46bdac56fe0c4f67df54c10dd Mon Sep 17 00:00:00 2001 From: jc-programs Date: Fri, 8 Nov 2024 19:38:03 +0100 Subject: [PATCH 06/13] DataLoader creates MainCourse and Dessert data and associates it to menus --- .../model/MenuItem/Dessert.java | 4 ++ .../model/MenuItem/MainCourse.java | 4 ++ .../model/MenuItem/MenuItem.java | 1 + .../utilities/DataLoader.java | 49 ++++++++++++++----- .../resources/application-local.properties | 2 +- 5 files changed, 48 insertions(+), 12 deletions(-) diff --git a/src/main/java/dev/example/restaurantManager/model/MenuItem/Dessert.java b/src/main/java/dev/example/restaurantManager/model/MenuItem/Dessert.java index 53309cb..b46e134 100644 --- a/src/main/java/dev/example/restaurantManager/model/MenuItem/Dessert.java +++ b/src/main/java/dev/example/restaurantManager/model/MenuItem/Dessert.java @@ -8,6 +8,10 @@ public class Dessert extends MenuItem{ private boolean sugarFree; + public Dessert(){ + + } + public Dessert(String id, String name, String description, double price, boolean sugarFree) { super(id,name,description,price); this.sugarFree = sugarFree; diff --git a/src/main/java/dev/example/restaurantManager/model/MenuItem/MainCourse.java b/src/main/java/dev/example/restaurantManager/model/MenuItem/MainCourse.java index 4c1264d..7750ddc 100644 --- a/src/main/java/dev/example/restaurantManager/model/MenuItem/MainCourse.java +++ b/src/main/java/dev/example/restaurantManager/model/MenuItem/MainCourse.java @@ -7,6 +7,10 @@ public class MainCourse extends MenuItem{ private boolean vegan; + public MainCourse(){ + + } + public MainCourse(String id, String name, String description, double price, boolean vegan) { super(id,name,description,price); this.vegan = vegan; diff --git a/src/main/java/dev/example/restaurantManager/model/MenuItem/MenuItem.java b/src/main/java/dev/example/restaurantManager/model/MenuItem/MenuItem.java index cdbb241..1a56c37 100644 --- a/src/main/java/dev/example/restaurantManager/model/MenuItem/MenuItem.java +++ b/src/main/java/dev/example/restaurantManager/model/MenuItem/MenuItem.java @@ -6,6 +6,7 @@ import java.util.List; @Entity +@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) public abstract class MenuItem implements IMenuItem{ @Id diff --git a/src/main/java/dev/example/restaurantManager/utilities/DataLoader.java b/src/main/java/dev/example/restaurantManager/utilities/DataLoader.java index 32b7d8b..d82cd14 100644 --- a/src/main/java/dev/example/restaurantManager/utilities/DataLoader.java +++ b/src/main/java/dev/example/restaurantManager/utilities/DataLoader.java @@ -2,6 +2,8 @@ import com.github.javafaker.Faker; import dev.example.restaurantManager.model.*; +import dev.example.restaurantManager.model.MenuItem.Dessert; +import dev.example.restaurantManager.model.MenuItem.MainCourse; import dev.example.restaurantManager.model.MenuItem.MenuItem; import dev.example.restaurantManager.repository.*; import org.springframework.beans.factory.annotation.Autowired; @@ -18,7 +20,9 @@ public class DataLoader { @Autowired private TableRestaurantRepository tableRepository; @Autowired - private MenuItemRepository menuItemRepository; + private MainCourseRepository mainCourseRepository; + @Autowired + private DessertRepository dessertRepository; @Autowired private MenuRestaurantRepository menuRepository; @Autowired @@ -44,7 +48,8 @@ public void loadAllData() { // then create relationships between them createCustomers(); createTables(); - createMenuItems(); + createMainCourses(); + createDesserts(); // create and assign menu items createMenusAndAssignMenuItems(); @@ -94,17 +99,33 @@ private void createTables() { } } - // we are going to create 25 menu items + // we are going to create 25 mainCourses // and save them in the H2 local database - private void createMenuItems() { + private void createMainCourses() { for (int i = 0; i < 25; i++) { - MenuItem menuItem = new MenuItem( + MainCourse mainCourse = new MainCourse( 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.bool().bool() + ); + mainCourseRepository.save(mainCourse); + } + } + + // we are going to create 25 desserts + // and save them in the H2 local database + private void createDesserts() { + for (int i = 0; i < 25; i++) { + Dessert dessert = new Dessert( + UUID.randomUUID().toString(), + faker.food().fruit(), + faker.food().ingredient() + " " + faker.food().ingredient() , + faker.number().randomDouble(2, 5, 30), + faker.bool().bool() ); - menuItemRepository.save(menuItem); + dessertRepository.save(dessert); } } @@ -112,16 +133,22 @@ private void createMenuItems() { // and assign 5 to 10 menu items to each menu // to create a many-to-many relationship private void createMenusAndAssignMenuItems() { - List allItems = menuItemRepository.findAll(); + List allMainCourses = mainCourseRepository.findAll(); + List allDesserts = dessertRepository.findAll(); for (int i = 0; i < 15; i++) { MenuRestaurant menu = new MenuRestaurant( UUID.randomUUID().toString(), " Menu-00" + (i + 1), faker.lorem().paragraph() ); - List menuItems = new ArrayList<>(faker.random().nextInt(5, 10)); - for (int j = 0; j < faker.random().nextInt(5, 10); j++) { - menuItems.add(allItems.get(faker.random().nextInt(allItems.size()))); + int mainCourses = faker.random().nextInt(5, 10); + int desserts = faker.random().nextInt(2, 5); + List menuItems = new ArrayList<>(mainCourses+desserts); + for (int j = 0; j < mainCourses; j++) { + menuItems.add(allMainCourses.get(faker.random().nextInt(allMainCourses.size()))); + } + for (int j = 0; j < desserts; j++) { + menuItems.add(allDesserts.get(faker.random().nextInt(allDesserts.size()))); } menu.setMenuItems(menuItems); menuRepository.save(menu); diff --git a/src/main/resources/application-local.properties b/src/main/resources/application-local.properties index 4dacbdc..05c407f 100644 --- a/src/main/resources/application-local.properties +++ b/src/main/resources/application-local.properties @@ -16,7 +16,7 @@ spring.datasource.password= #spring.jpa.properties.hibernate.format_sql=true # DDL OPTIONS: create-drop, create, update, none, validate -spring.jpa.hibernate.ddl-auto=none +spring.jpa.hibernate.ddl-auto=create # create ? Hibernate first drops existing tables and then creates new tables. # update ? The object model created based on the mappings # (annotations or XML) is compared with the existing schema, From 6e1ea63a4aa81bc4cff50d206929b9b5742277d1 Mon Sep 17 00:00:00 2001 From: jc-programs Date: Fri, 8 Nov 2024 19:45:08 +0100 Subject: [PATCH 07/13] set Dessert and MainCourse test in separated files --- .../resources/application-local.properties | 2 +- .../menuItem/DessertTest.java | 38 -------------- .../menuItem/MainCourseTest.java | 51 +++++++++++++++++++ 3 files changed, 52 insertions(+), 39 deletions(-) create mode 100644 src/test/java/dev/example/restaurantManager/menuItem/MainCourseTest.java diff --git a/src/main/resources/application-local.properties b/src/main/resources/application-local.properties index 05c407f..4dacbdc 100644 --- a/src/main/resources/application-local.properties +++ b/src/main/resources/application-local.properties @@ -16,7 +16,7 @@ spring.datasource.password= #spring.jpa.properties.hibernate.format_sql=true # DDL OPTIONS: create-drop, create, update, none, validate -spring.jpa.hibernate.ddl-auto=create +spring.jpa.hibernate.ddl-auto=none # create ? Hibernate first drops existing tables and then creates new tables. # update ? The object model created based on the mappings # (annotations or XML) is compared with the existing schema, diff --git a/src/test/java/dev/example/restaurantManager/menuItem/DessertTest.java b/src/test/java/dev/example/restaurantManager/menuItem/DessertTest.java index b44f05a..feeb64b 100644 --- a/src/test/java/dev/example/restaurantManager/menuItem/DessertTest.java +++ b/src/test/java/dev/example/restaurantManager/menuItem/DessertTest.java @@ -1,11 +1,7 @@ package dev.example.restaurantManager.menuItem; import dev.example.restaurantManager.model.MenuItem.Dessert; -import dev.example.restaurantManager.model.MenuItem.MainCourse; -import dev.example.restaurantManager.model.MenuItem.MenuItem; import dev.example.restaurantManager.repository.DessertRepository; -import dev.example.restaurantManager.repository.MainCourseRepository; -import dev.example.restaurantManager.repository.MenuItemRepository; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; @@ -18,8 +14,6 @@ public class DessertTest { @Autowired private DessertRepository dessertRepository; - @Autowired - private MainCourseRepository mainCourseRepository; @Test void newInterfaceDessert_InMemory(){ @@ -53,36 +47,4 @@ void newInterfaceDessert_DB(){ assertThat(dessert.isSugarFree()).isNotNull(); } - @Test - void newInterfaceMainCourse_InMemory(){ - String id = "MI001"; - String name = "item 1"; - String description = "item 1 description"; - double price = 20.0; - boolean vegan = false; - MainCourse mainCourse = new MainCourse(); - mainCourse.setId(id); - mainCourse.setName(name); - mainCourse.setDescription(description); - mainCourse.setPrice(price); - mainCourse.setVegan(vegan); - - assertThat(mainCourse.getId()).isEqualTo(id); - assertThat(mainCourse.getName()).isEqualTo(name); - assertThat(mainCourse.getDescription()).isEqualTo(description); - assertThat(mainCourse.getPrice()).isEqualTo(price); - assertThat(mainCourse.isVegan()).isEqualTo(vegan); - } - - @Test - void newInterfaceMainCourse_DB(){ - MainCourse mainCourse = mainCourseRepository.findAll().getFirst(); - - assertThat(mainCourse.getId()).isNotNull(); - assertThat(mainCourse.getName()).isNotNull(); - assertThat(mainCourse.getDescription()).isNotNull(); - assertThat(mainCourse.getPrice()).isNotNull(); - assertThat(mainCourse.isVegan()).isNotNull(); - } - } diff --git a/src/test/java/dev/example/restaurantManager/menuItem/MainCourseTest.java b/src/test/java/dev/example/restaurantManager/menuItem/MainCourseTest.java new file mode 100644 index 0000000..bcbe4e9 --- /dev/null +++ b/src/test/java/dev/example/restaurantManager/menuItem/MainCourseTest.java @@ -0,0 +1,51 @@ +package dev.example.restaurantManager.menuItem; + +import dev.example.restaurantManager.model.MenuItem.MainCourse; +import dev.example.restaurantManager.repository.MainCourseRepository; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import static org.assertj.core.api.Assertions.assertThat; + +@SpringBootTest +public class MainCourseTest { + + @Autowired + private MainCourseRepository mainCourseRepository; + + @Test + void newInterfaceMainCourse_InMemory(){ + String id = "MI001"; + String name = "item 1"; + String description = "item 1 description"; + double price = 20.0; + boolean vegan = false; + MainCourse mainCourse = new MainCourse(); + mainCourse.setId(id); + mainCourse.setName(name); + mainCourse.setDescription(description); + mainCourse.setPrice(price); + mainCourse.setVegan(vegan); + + assertThat(mainCourse.getId()).isEqualTo(id); + assertThat(mainCourse.getName()).isEqualTo(name); + assertThat(mainCourse.getDescription()).isEqualTo(description); + assertThat(mainCourse.getPrice()).isEqualTo(price); + assertThat(mainCourse.isVegan()).isEqualTo(vegan); + } + + @Test + void newInterfaceMainCourse_DB(){ + MainCourse mainCourse = mainCourseRepository.findAll().getFirst(); + + assertThat(mainCourse.getId()).isNotNull(); + assertThat(mainCourse.getName()).isNotNull(); + assertThat(mainCourse.getDescription()).isNotNull(); + assertThat(mainCourse.getPrice()).isNotNull(); + assertThat(mainCourse.isVegan()).isNotNull(); + } +} + + + From c81cdd1c128134ad2a681d9c8a76602b6880f217 Mon Sep 17 00:00:00 2001 From: jc-programs Date: Fri, 8 Nov 2024 20:24:55 +0100 Subject: [PATCH 08/13] added DesertService and MainCourseService and their implementation --- .../service/DessertService.java | 14 +++++ .../service/DessertServiceImpl.java | 60 +++++++++++++++++++ .../service/MainCourseService.java | 14 +++++ .../service/MainCourseServiceImpl.java | 59 ++++++++++++++++++ 4 files changed, 147 insertions(+) create mode 100644 src/main/java/dev/example/restaurantManager/service/DessertService.java create mode 100644 src/main/java/dev/example/restaurantManager/service/DessertServiceImpl.java create mode 100644 src/main/java/dev/example/restaurantManager/service/MainCourseService.java create mode 100644 src/main/java/dev/example/restaurantManager/service/MainCourseServiceImpl.java diff --git a/src/main/java/dev/example/restaurantManager/service/DessertService.java b/src/main/java/dev/example/restaurantManager/service/DessertService.java new file mode 100644 index 0000000..8094c8e --- /dev/null +++ b/src/main/java/dev/example/restaurantManager/service/DessertService.java @@ -0,0 +1,14 @@ +package dev.example.restaurantManager.service; + +import dev.example.restaurantManager.model.MenuItem.Dessert; + +import java.util.List; + +public interface DessertService { + List getAllDesserts(); + Dessert createDessert(Dessert dessert); + Dessert getDessertById(String id); + Dessert updateDessert(String id, Dessert dessertDetails); + boolean deleteDessert(String id); + long countDesserts(); +} diff --git a/src/main/java/dev/example/restaurantManager/service/DessertServiceImpl.java b/src/main/java/dev/example/restaurantManager/service/DessertServiceImpl.java new file mode 100644 index 0000000..f725b61 --- /dev/null +++ b/src/main/java/dev/example/restaurantManager/service/DessertServiceImpl.java @@ -0,0 +1,60 @@ +package dev.example.restaurantManager.service; + +import dev.example.restaurantManager.model.MenuItem.Dessert; +import dev.example.restaurantManager.repository.DessertRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.UUID; + + +@Service +public class DessertServiceImpl implements DessertService{ + + @Autowired + DessertRepository dessertRepository; + + @Override + public List getAllDesserts() { + return dessertRepository.findAll(); + } + + @Override + public Dessert createDessert(Dessert dessert) { + dessert.setId(UUID.randomUUID().toString()); + return dessertRepository.save(dessert); + } + + @Override + public Dessert getDessertById(String id) { + return dessertRepository.findById(id).orElse(null); + } + + @Override + public Dessert updateDessert(String id, Dessert dessertDetails) { + Dessert dessert = getDessertById(id); + if(dessert==null){ + return null; + } + dessert.setName(dessertDetails.getName()); + dessert.setDescription(dessertDetails.getDescription()); + dessert.setPrice(dessertDetails.getPrice()); + dessert.setSugarFree(dessertDetails.isSugarFree()); + return dessertRepository.save(dessert); + } + + @Override + public boolean deleteDessert(String id) { + if(!dessertRepository.existsById(id)) { + return false; + } + dessertRepository.deleteById(id); + return true; + } + + @Override + public long countDesserts() { + return dessertRepository.count(); + } +} diff --git a/src/main/java/dev/example/restaurantManager/service/MainCourseService.java b/src/main/java/dev/example/restaurantManager/service/MainCourseService.java new file mode 100644 index 0000000..d14c6f2 --- /dev/null +++ b/src/main/java/dev/example/restaurantManager/service/MainCourseService.java @@ -0,0 +1,14 @@ +package dev.example.restaurantManager.service; + +import dev.example.restaurantManager.model.MenuItem.MainCourse; + +import java.util.List; + +public interface MainCourseService { + List getAllMainCourses(); + MainCourse createMainCourse(MainCourse mainCourse); + MainCourse getMainCourseById(String id); + MainCourse updateMainCourse(String id, MainCourse mainCourseDetails); + boolean deleteMainCourse(String id); + long countMainCourses(); +} diff --git a/src/main/java/dev/example/restaurantManager/service/MainCourseServiceImpl.java b/src/main/java/dev/example/restaurantManager/service/MainCourseServiceImpl.java new file mode 100644 index 0000000..9330a89 --- /dev/null +++ b/src/main/java/dev/example/restaurantManager/service/MainCourseServiceImpl.java @@ -0,0 +1,59 @@ +package dev.example.restaurantManager.service; + +import dev.example.restaurantManager.model.MenuItem.MainCourse; +import dev.example.restaurantManager.repository.MainCourseRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.UUID; + +@Service +public class MainCourseServiceImpl implements MainCourseService{ + + @Autowired + MainCourseRepository mainCourseRepository; + + @Override + public List getAllMainCourses() { + return mainCourseRepository.findAll(); + } + + @Override + public MainCourse createMainCourse(MainCourse mainCourse) { + mainCourse.setId(UUID.randomUUID().toString()); + return mainCourseRepository.save(mainCourse); + } + + @Override + public MainCourse getMainCourseById(String id) { + return mainCourseRepository.findById(id).orElse(null); + } + + @Override + public MainCourse updateMainCourse(String id, MainCourse mainCourseDetails) { + MainCourse mainCourse = getMainCourseById(id); + if(mainCourse==null){ + return null; + } + mainCourse.setName(mainCourseDetails.getName()); + mainCourse.setDescription(mainCourseDetails.getDescription()); + mainCourse.setPrice(mainCourseDetails.getPrice()); + mainCourse.setVegan(mainCourseDetails.isVegan()); + return mainCourseRepository.save(mainCourse); + } + + @Override + public boolean deleteMainCourse(String id) { + if(!mainCourseRepository.existsById(id)) { + return false; + } + mainCourseRepository.deleteById(id); + return true; + } + + @Override + public long countMainCourses() { + return mainCourseRepository.count(); + } +} From 6b6856cf59d65bac9af8c04b364cafa87eb11dd3 Mon Sep 17 00:00:00 2001 From: jc-programs Date: Fri, 8 Nov 2024 20:28:01 +0100 Subject: [PATCH 09/13] deleted MenuItem Service and Respository. Controller is pending --- .../controller/MenuItemController.java | 1 - .../repository/MenuItemRepository.java | 7 --- .../service/MenuItemService.java | 13 ----- .../service/MenuItemServiceImpl.java | 57 ------------------- .../service/MenuRestaurantServiceImpl.java | 1 - 5 files changed, 79 deletions(-) delete mode 100644 src/main/java/dev/example/restaurantManager/repository/MenuItemRepository.java delete mode 100644 src/main/java/dev/example/restaurantManager/service/MenuItemService.java delete mode 100644 src/main/java/dev/example/restaurantManager/service/MenuItemServiceImpl.java diff --git a/src/main/java/dev/example/restaurantManager/controller/MenuItemController.java b/src/main/java/dev/example/restaurantManager/controller/MenuItemController.java index 417e6d4..fccd29c 100644 --- a/src/main/java/dev/example/restaurantManager/controller/MenuItemController.java +++ b/src/main/java/dev/example/restaurantManager/controller/MenuItemController.java @@ -1,7 +1,6 @@ package dev.example.restaurantManager.controller; import dev.example.restaurantManager.model.MenuItem.MenuItem; -import dev.example.restaurantManager.service.MenuItemService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; diff --git a/src/main/java/dev/example/restaurantManager/repository/MenuItemRepository.java b/src/main/java/dev/example/restaurantManager/repository/MenuItemRepository.java deleted file mode 100644 index 16636ca..0000000 --- a/src/main/java/dev/example/restaurantManager/repository/MenuItemRepository.java +++ /dev/null @@ -1,7 +0,0 @@ -package dev.example.restaurantManager.repository; - -import dev.example.restaurantManager.model.MenuItem.MenuItem; -import org.springframework.data.jpa.repository.JpaRepository; - -public interface MenuItemRepository extends JpaRepository { -} \ No newline at end of file diff --git a/src/main/java/dev/example/restaurantManager/service/MenuItemService.java b/src/main/java/dev/example/restaurantManager/service/MenuItemService.java deleted file mode 100644 index 55b7fd1..0000000 --- a/src/main/java/dev/example/restaurantManager/service/MenuItemService.java +++ /dev/null @@ -1,13 +0,0 @@ -package dev.example.restaurantManager.service; - -import dev.example.restaurantManager.model.MenuItem.MenuItem; -import java.util.List; - -public interface MenuItemService { - List getAllMenuItems(); - MenuItem createMenuItem(MenuItem menuItem); - MenuItem getMenuItemById(String id); - MenuItem updateMenuItem(String id, MenuItem menuItemDetails); - boolean deleteMenuItem(String id); - long countMenuItems(); -} \ No newline at end of file diff --git a/src/main/java/dev/example/restaurantManager/service/MenuItemServiceImpl.java b/src/main/java/dev/example/restaurantManager/service/MenuItemServiceImpl.java deleted file mode 100644 index 37fd16d..0000000 --- a/src/main/java/dev/example/restaurantManager/service/MenuItemServiceImpl.java +++ /dev/null @@ -1,57 +0,0 @@ -package dev.example.restaurantManager.service; - -import dev.example.restaurantManager.model.MenuItem.MenuItem; -import dev.example.restaurantManager.repository.MenuItemRepository; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import java.util.List; -import java.util.UUID; - -@Service -public class MenuItemServiceImpl implements MenuItemService { - - @Autowired - private MenuItemRepository menuItemRepository; - - @Override - public List getAllMenuItems() { - return menuItemRepository.findAll(); - } - - @Override - public MenuItem createMenuItem(MenuItem menuItem) { - menuItem.setId(UUID.randomUUID().toString()); - return menuItemRepository.save(menuItem); - } - - @Override - public MenuItem getMenuItemById(String id) { - return menuItemRepository.findById(id).orElse(null); - } - - @Override - public MenuItem updateMenuItem(String id, MenuItem menuItemDetails) { - MenuItem menuItem = menuItemRepository.findById(id).orElse(null); - if (menuItem != null) { - menuItem.setName(menuItemDetails.getName()); - menuItem.setDescription(menuItemDetails.getDescription()); - menuItem.setPrice(menuItemDetails.getPrice()); - return menuItemRepository.save(menuItem); - } - return null; - } - - @Override - public boolean deleteMenuItem(String id) { - if (menuItemRepository.existsById(id)) { - menuItemRepository.deleteById(id); - return true; - } - return false; - } - - @Override - public long countMenuItems() { - return menuItemRepository.count(); - } -} \ No newline at end of file diff --git a/src/main/java/dev/example/restaurantManager/service/MenuRestaurantServiceImpl.java b/src/main/java/dev/example/restaurantManager/service/MenuRestaurantServiceImpl.java index 835a344..40e80f9 100644 --- a/src/main/java/dev/example/restaurantManager/service/MenuRestaurantServiceImpl.java +++ b/src/main/java/dev/example/restaurantManager/service/MenuRestaurantServiceImpl.java @@ -3,7 +3,6 @@ import dev.example.restaurantManager.model.MenuRestaurant; import dev.example.restaurantManager.model.MenuItem.MenuItem; import dev.example.restaurantManager.repository.MenuRestaurantRepository; -import dev.example.restaurantManager.repository.MenuItemRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; From 4094be626c33869c31ac320eac15b91023e0e331 Mon Sep 17 00:00:00 2001 From: jc-programs Date: Fri, 8 Nov 2024 20:32:40 +0100 Subject: [PATCH 10/13] converted MenuItemController to MainCourseController --- .../controller/MainCourseController.java | 63 +++++++++++++++++++ .../controller/MenuItemController.java | 62 ------------------ 2 files changed, 63 insertions(+), 62 deletions(-) create mode 100644 src/main/java/dev/example/restaurantManager/controller/MainCourseController.java delete mode 100644 src/main/java/dev/example/restaurantManager/controller/MenuItemController.java diff --git a/src/main/java/dev/example/restaurantManager/controller/MainCourseController.java b/src/main/java/dev/example/restaurantManager/controller/MainCourseController.java new file mode 100644 index 0000000..b6cb0ec --- /dev/null +++ b/src/main/java/dev/example/restaurantManager/controller/MainCourseController.java @@ -0,0 +1,63 @@ +package dev.example.restaurantManager.controller; + +import dev.example.restaurantManager.model.MenuItem.MainCourse; +import dev.example.restaurantManager.service.MainCourseService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/api/maincourse") +public class MainCourseController { + + @Autowired + private MainCourseService mainCourseService; + + @GetMapping + public ResponseEntity> getAllMainCourses() { + List mainCourses = mainCourseService.getAllMainCourses(); + return new ResponseEntity<>(mainCourses, HttpStatus.OK); + } + + @PostMapping + public ResponseEntity createMainCourse(@RequestBody MainCourse mainCourse) { + MainCourse newMainCourse = mainCourseService.createMainCourse(mainCourse); + return new ResponseEntity<>(newMainCourse, HttpStatus.CREATED); + } + + @GetMapping("/{id}") + public ResponseEntity getMainCourseById(@PathVariable String id) { + MainCourse mainCourse = mainCourseService.getMainCourseById(id); + if (mainCourse != null) { + return new ResponseEntity<>(mainCourse, HttpStatus.OK); + } + return new ResponseEntity<>(HttpStatus.NOT_FOUND); + } + + @PutMapping("/{id}") + public ResponseEntity updateMainCourse(@PathVariable String id, @RequestBody MainCourse mainCourseDetails) { + MainCourse updatedMainCourse = mainCourseService.updateMainCourse(id, mainCourseDetails); + if (updatedMainCourse != null) { + return new ResponseEntity<>(updatedMainCourse, HttpStatus.OK); + } + return new ResponseEntity<>(HttpStatus.NOT_FOUND); + } + + @DeleteMapping("/{id}") + public ResponseEntity deleteMainCourse(@PathVariable String id) { + boolean deleted = mainCourseService.deleteMainCourse(id); + if (deleted) { + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + return new ResponseEntity<>(HttpStatus.NOT_FOUND); + } + + @GetMapping("/count") + public ResponseEntity countMainCourses() { + long count = mainCourseService.countMainCourses(); + return new ResponseEntity<>(count, HttpStatus.OK); + } +} \ No newline at end of file diff --git a/src/main/java/dev/example/restaurantManager/controller/MenuItemController.java b/src/main/java/dev/example/restaurantManager/controller/MenuItemController.java deleted file mode 100644 index fccd29c..0000000 --- a/src/main/java/dev/example/restaurantManager/controller/MenuItemController.java +++ /dev/null @@ -1,62 +0,0 @@ -package dev.example.restaurantManager.controller; - -import dev.example.restaurantManager.model.MenuItem.MenuItem; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -@RestController -@RequestMapping("/api/menuitems") -public class MenuItemController { - - @Autowired - private MenuItemService menuItemService; - - @GetMapping - public ResponseEntity> getAllMenuItems() { - List menuItems = menuItemService.getAllMenuItems(); - return new ResponseEntity<>(menuItems, HttpStatus.OK); - } - - @PostMapping - public ResponseEntity createMenuItem(@RequestBody MenuItem menuItem) { - MenuItem newMenuItem = menuItemService.createMenuItem(menuItem); - return new ResponseEntity<>(newMenuItem, HttpStatus.CREATED); - } - - @GetMapping("/{id}") - public ResponseEntity getMenuItemById(@PathVariable String id) { - MenuItem menuItem = menuItemService.getMenuItemById(id); - if (menuItem != null) { - return new ResponseEntity<>(menuItem, HttpStatus.OK); - } - return new ResponseEntity<>(HttpStatus.NOT_FOUND); - } - - @PutMapping("/{id}") - public ResponseEntity updateMenuItem(@PathVariable String id, @RequestBody MenuItem menuItemDetails) { - MenuItem updatedMenuItem = menuItemService.updateMenuItem(id, menuItemDetails); - if (updatedMenuItem != null) { - return new ResponseEntity<>(updatedMenuItem, HttpStatus.OK); - } - return new ResponseEntity<>(HttpStatus.NOT_FOUND); - } - - @DeleteMapping("/{id}") - public ResponseEntity deleteMenuItem(@PathVariable String id) { - boolean deleted = menuItemService.deleteMenuItem(id); - if (deleted) { - return new ResponseEntity<>(HttpStatus.NO_CONTENT); - } - return new ResponseEntity<>(HttpStatus.NOT_FOUND); - } - - @GetMapping("/count") - public ResponseEntity countMenuItems() { - long count = menuItemService.countMenuItems(); - return new ResponseEntity<>(count, HttpStatus.OK); - } -} \ No newline at end of file From 6a1a6df1024614562ef676476ac65e61e1234165 Mon Sep 17 00:00:00 2001 From: jc-programs Date: Fri, 8 Nov 2024 20:36:05 +0100 Subject: [PATCH 11/13] added DessertController --- .../controller/DessertController.java | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 src/main/java/dev/example/restaurantManager/controller/DessertController.java diff --git a/src/main/java/dev/example/restaurantManager/controller/DessertController.java b/src/main/java/dev/example/restaurantManager/controller/DessertController.java new file mode 100644 index 0000000..2ecde95 --- /dev/null +++ b/src/main/java/dev/example/restaurantManager/controller/DessertController.java @@ -0,0 +1,63 @@ +package dev.example.restaurantManager.controller; + +import dev.example.restaurantManager.model.MenuItem.Dessert; +import dev.example.restaurantManager.service.DessertService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/api/dessert") +public class DessertController { + + @Autowired + private DessertService dessertService; + + @GetMapping + public ResponseEntity> getAllDesserts() { + List desserts = dessertService.getAllDesserts(); + return new ResponseEntity<>(desserts, HttpStatus.OK); + } + + @PostMapping + public ResponseEntity createDessert(@RequestBody Dessert dessert) { + Dessert newDessert = dessertService.createDessert(dessert); + return new ResponseEntity<>(newDessert, HttpStatus.CREATED); + } + + @GetMapping("/{id}") + public ResponseEntity getDessertById(@PathVariable String id) { + Dessert dessert = dessertService.getDessertById(id); + if (dessert != null) { + return new ResponseEntity<>(dessert, HttpStatus.OK); + } + return new ResponseEntity<>(HttpStatus.NOT_FOUND); + } + + @PutMapping("/{id}") + public ResponseEntity updateDessert(@PathVariable String id, @RequestBody Dessert dessertDetails) { + Dessert updatedDessert = dessertService.updateDessert(id, dessertDetails); + if (updatedDessert != null) { + return new ResponseEntity<>(updatedDessert, HttpStatus.OK); + } + return new ResponseEntity<>(HttpStatus.NOT_FOUND); + } + + @DeleteMapping("/{id}") + public ResponseEntity deleteDessert(@PathVariable String id) { + boolean deleted = dessertService.deleteDessert(id); + if (deleted) { + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + return new ResponseEntity<>(HttpStatus.NOT_FOUND); + } + + @GetMapping("/count") + public ResponseEntity countDesserts() { + long count = dessertService.countDesserts(); + return new ResponseEntity<>(count, HttpStatus.OK); + } +} \ No newline at end of file From e2bbeaeb1cd6d905e9885ad6386e9c7d23887bfd Mon Sep 17 00:00:00 2001 From: jc-programs Date: Sat, 9 Nov 2024 07:35:56 +0100 Subject: [PATCH 12/13] Added endpoints functions to demonstrate subclass-specific operations --- .../controller/DessertController.java | 6 ++++++ .../controller/MainCourseController.java | 6 ++++++ .../service/DessertService.java | 1 + .../service/DessertServiceImpl.java | 8 ++++++++ .../service/MainCourseService.java | 1 + .../service/MainCourseServiceImpl.java | 8 ++++++++ .../service/MenuRestaurantServiceImpl.java | 20 +++++++++++++++++-- 7 files changed, 48 insertions(+), 2 deletions(-) diff --git a/src/main/java/dev/example/restaurantManager/controller/DessertController.java b/src/main/java/dev/example/restaurantManager/controller/DessertController.java index 2ecde95..c652767 100644 --- a/src/main/java/dev/example/restaurantManager/controller/DessertController.java +++ b/src/main/java/dev/example/restaurantManager/controller/DessertController.java @@ -22,6 +22,12 @@ public ResponseEntity> getAllDesserts() { return new ResponseEntity<>(desserts, HttpStatus.OK); } + @GetMapping("/sugarfree") + public ResponseEntity> getAllSugarFreeDesserts() { + List desserts = dessertService.getAllSugarFreeDesserts(); + return new ResponseEntity<>(desserts, HttpStatus.OK); + } + @PostMapping public ResponseEntity createDessert(@RequestBody Dessert dessert) { Dessert newDessert = dessertService.createDessert(dessert); diff --git a/src/main/java/dev/example/restaurantManager/controller/MainCourseController.java b/src/main/java/dev/example/restaurantManager/controller/MainCourseController.java index b6cb0ec..381e12d 100644 --- a/src/main/java/dev/example/restaurantManager/controller/MainCourseController.java +++ b/src/main/java/dev/example/restaurantManager/controller/MainCourseController.java @@ -22,6 +22,12 @@ public ResponseEntity> getAllMainCourses() { return new ResponseEntity<>(mainCourses, HttpStatus.OK); } + @GetMapping("/vegan") + public ResponseEntity> getAllVeganMainCourses() { + List mainCourses = mainCourseService.getAllVeganMainCourses(); + return new ResponseEntity<>(mainCourses, HttpStatus.OK); + } + @PostMapping public ResponseEntity createMainCourse(@RequestBody MainCourse mainCourse) { MainCourse newMainCourse = mainCourseService.createMainCourse(mainCourse); diff --git a/src/main/java/dev/example/restaurantManager/service/DessertService.java b/src/main/java/dev/example/restaurantManager/service/DessertService.java index 8094c8e..2b885d6 100644 --- a/src/main/java/dev/example/restaurantManager/service/DessertService.java +++ b/src/main/java/dev/example/restaurantManager/service/DessertService.java @@ -6,6 +6,7 @@ public interface DessertService { List getAllDesserts(); + List getAllSugarFreeDesserts(); Dessert createDessert(Dessert dessert); Dessert getDessertById(String id); Dessert updateDessert(String id, Dessert dessertDetails); diff --git a/src/main/java/dev/example/restaurantManager/service/DessertServiceImpl.java b/src/main/java/dev/example/restaurantManager/service/DessertServiceImpl.java index f725b61..7fa5be1 100644 --- a/src/main/java/dev/example/restaurantManager/service/DessertServiceImpl.java +++ b/src/main/java/dev/example/restaurantManager/service/DessertServiceImpl.java @@ -7,6 +7,7 @@ import java.util.List; import java.util.UUID; +import java.util.stream.Collectors; @Service @@ -20,6 +21,13 @@ public List getAllDesserts() { return dessertRepository.findAll(); } + @Override + public List getAllSugarFreeDesserts() { + return dessertRepository.findAll().stream() + .filter(Dessert::isSugarFree) + .collect(Collectors.toList()); + } + @Override public Dessert createDessert(Dessert dessert) { dessert.setId(UUID.randomUUID().toString()); diff --git a/src/main/java/dev/example/restaurantManager/service/MainCourseService.java b/src/main/java/dev/example/restaurantManager/service/MainCourseService.java index d14c6f2..424d6a4 100644 --- a/src/main/java/dev/example/restaurantManager/service/MainCourseService.java +++ b/src/main/java/dev/example/restaurantManager/service/MainCourseService.java @@ -6,6 +6,7 @@ public interface MainCourseService { List getAllMainCourses(); + List getAllVeganMainCourses(); MainCourse createMainCourse(MainCourse mainCourse); MainCourse getMainCourseById(String id); MainCourse updateMainCourse(String id, MainCourse mainCourseDetails); diff --git a/src/main/java/dev/example/restaurantManager/service/MainCourseServiceImpl.java b/src/main/java/dev/example/restaurantManager/service/MainCourseServiceImpl.java index 9330a89..f1d0f25 100644 --- a/src/main/java/dev/example/restaurantManager/service/MainCourseServiceImpl.java +++ b/src/main/java/dev/example/restaurantManager/service/MainCourseServiceImpl.java @@ -7,6 +7,7 @@ import java.util.List; import java.util.UUID; +import java.util.stream.Collectors; @Service public class MainCourseServiceImpl implements MainCourseService{ @@ -19,6 +20,13 @@ public List getAllMainCourses() { return mainCourseRepository.findAll(); } + @Override + public List getAllVeganMainCourses() { + return mainCourseRepository.findAll().stream() + .filter(MainCourse::isVegan) + .collect(Collectors.toList()); + } + @Override public MainCourse createMainCourse(MainCourse mainCourse) { mainCourse.setId(UUID.randomUUID().toString()); diff --git a/src/main/java/dev/example/restaurantManager/service/MenuRestaurantServiceImpl.java b/src/main/java/dev/example/restaurantManager/service/MenuRestaurantServiceImpl.java index 40e80f9..882d7db 100644 --- a/src/main/java/dev/example/restaurantManager/service/MenuRestaurantServiceImpl.java +++ b/src/main/java/dev/example/restaurantManager/service/MenuRestaurantServiceImpl.java @@ -2,6 +2,8 @@ import dev.example.restaurantManager.model.MenuRestaurant; import dev.example.restaurantManager.model.MenuItem.MenuItem; +import dev.example.restaurantManager.repository.DessertRepository; +import dev.example.restaurantManager.repository.MainCourseRepository; import dev.example.restaurantManager.repository.MenuRestaurantRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -15,7 +17,10 @@ public class MenuRestaurantServiceImpl implements MenuRestaurantService { private MenuRestaurantRepository menuRestaurantRepository; @Autowired - private MenuItemRepository menuItemRepository; + private MainCourseRepository mainCourseRepository; + + @Autowired + private DessertRepository dessertRepository; @Override public List getAllMenus() { @@ -58,10 +63,21 @@ public long countMenus() { return menuRestaurantRepository.count(); } + + private MenuItem getMenuItem(String menuItemId){ + if(mainCourseRepository.existsById(menuItemId)){ + return mainCourseRepository.findById(menuItemId).orElse(null); + } + if(dessertRepository.existsById(menuItemId)){ + return dessertRepository.findById(menuItemId).orElse(null); + } + return null; + } + @Override public MenuRestaurant addMenuItemToMenu(String menuId, String menuItemId) { + MenuItem menuItem = getMenuItem(menuItemId); MenuRestaurant menu = menuRestaurantRepository.findById(menuId).orElse(null); - MenuItem menuItem = menuItemRepository.findById(menuItemId).orElse(null); if (menu != null && menuItem != null) { menu.getMenuItems().add(menuItem); return menuRestaurantRepository.save(menu); From 509a28a9d47f0e350357d199f347a5b56fbace3c Mon Sep 17 00:00:00 2001 From: jc-programs Date: Mon, 11 Nov 2024 13:11:02 +0100 Subject: [PATCH 13/13] add test to check DessertService and DessertRepository --- .../repository/DessertRepository.java | 7 ++ .../menuItem/DessertRepositoryTest.java | 87 ++++++++++++++++++ .../menuItem/DessertServiceTest.java | 91 +++++++++++++++++++ 3 files changed, 185 insertions(+) create mode 100644 src/test/java/dev/example/restaurantManager/menuItem/DessertRepositoryTest.java create mode 100644 src/test/java/dev/example/restaurantManager/menuItem/DessertServiceTest.java diff --git a/src/main/java/dev/example/restaurantManager/repository/DessertRepository.java b/src/main/java/dev/example/restaurantManager/repository/DessertRepository.java index 09759ea..8c84d8b 100644 --- a/src/main/java/dev/example/restaurantManager/repository/DessertRepository.java +++ b/src/main/java/dev/example/restaurantManager/repository/DessertRepository.java @@ -3,5 +3,12 @@ import dev.example.restaurantManager.model.MenuItem.Dessert; import org.springframework.data.jpa.repository.JpaRepository; +import java.util.Optional; + public interface DessertRepository extends JpaRepository { + + // to do some test + Optional findByDescription(String description); + + } diff --git a/src/test/java/dev/example/restaurantManager/menuItem/DessertRepositoryTest.java b/src/test/java/dev/example/restaurantManager/menuItem/DessertRepositoryTest.java new file mode 100644 index 0000000..d4614a2 --- /dev/null +++ b/src/test/java/dev/example/restaurantManager/menuItem/DessertRepositoryTest.java @@ -0,0 +1,87 @@ +package dev.example.restaurantManager.menuItem; + +import dev.example.restaurantManager.model.MenuItem.Dessert; +import dev.example.restaurantManager.repository.DessertRepository; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.List; +import java.util.Optional; + +import static org.assertj.core.api.Assertions.assertThat; + +@SpringBootTest +public class DessertRepositoryTest { + + @Autowired + DessertRepository dessertRepository; + + private final String description = "This dessert is only for test"; + private Dessert dessert; + + @BeforeEach + public void setup(){ + dessert = new Dessert("ID-will-change-on-insert-to-db","Dessert test",description,6.66,true); + } + + @AfterEach + public void deleteFakeInsertedDessert(){ + Optional foundDessert = dessertRepository.findByDescription(description); + foundDessert.ifPresent(value -> dessertRepository.delete(value)); + } + + @Test + public void insertDessert(){ + Dessert insertedDessert = dessertRepository.save(dessert); + assertThat(insertedDessert).isNotNull(); + assertThat(insertedDessert.getDescription()).isEqualTo(dessert.getDescription()); + } + + @Test + public void deleteDessert(){ + Dessert insertedDessert = dessertRepository.save(dessert); + assertThat(insertedDessert).isNotNull(); + dessertRepository.deleteById(insertedDessert.getId()); + Optional deletedDessert = dessertRepository.findById(insertedDessert.getId()); + assertThat(deletedDessert).isNotPresent(); + } + + @Test + public void updateDessert(){ + Dessert insertedDessert = dessertRepository.save(dessert); + assertThat(insertedDessert).isNotNull(); + String newDescription = "This is a new description for our fake dessert"; + assertThat(insertedDessert.getDescription()).isNotEqualTo(newDescription); + insertedDessert.setDescription(newDescription); + Dessert updatedDessert = dessertRepository.save(insertedDessert); + assertThat(updatedDessert).isNotNull(); + assertThat(updatedDessert.getId()).isEqualTo(insertedDessert.getId()); + assertThat(updatedDessert.getDescription()).isEqualTo(newDescription); + } + + @Test + public void findAll(){ + long nDessertsBeforeInsert = dessertRepository.findAll().size(); + Dessert insertedDessert = dessertRepository.save(dessert); + long nDessertsAfterInsert = dessertRepository.findAll().size(); + assertThat(nDessertsAfterInsert).isEqualTo(nDessertsBeforeInsert+1); + } + + @Test + public void findById(){ + Dessert insertedDessert = dessertRepository.save(dessert); + assertThat(insertedDessert).isNotNull(); + Optional foundDessert = dessertRepository.findById(insertedDessert.getId()); + assertThat(foundDessert).isPresent(); + } + + @Test + public void findByIdNonexistentDessert(){ + Optional foundDessert = dessertRepository.findById("Non existent dessert ID"); + assertThat(foundDessert).isNotPresent(); + } + +} diff --git a/src/test/java/dev/example/restaurantManager/menuItem/DessertServiceTest.java b/src/test/java/dev/example/restaurantManager/menuItem/DessertServiceTest.java new file mode 100644 index 0000000..999adfa --- /dev/null +++ b/src/test/java/dev/example/restaurantManager/menuItem/DessertServiceTest.java @@ -0,0 +1,91 @@ +package dev.example.restaurantManager.menuItem; + +import dev.example.restaurantManager.model.MenuItem.Dessert; +import dev.example.restaurantManager.repository.DessertRepository; +import dev.example.restaurantManager.service.DessertService; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.List; +import java.util.Optional; + +import static org.assertj.core.api.Assertions.assertThat; + +@SpringBootTest +public class DessertServiceTest { + + @Autowired + DessertService dessertService; + + @Autowired + DessertRepository dessertRepository; + + private final String description = "This dessert is only for test"; + private Dessert dessert; + + @BeforeEach + public void setup(){ + dessert = new Dessert("ID-will-change-on-insert-to-db","Dessert test",description,6.66,true); + } + + @AfterEach + public void deleteFakeInsertedDessert(){ + Optional foundDessert = dessertRepository.findByDescription(description); + foundDessert.ifPresent(value -> dessertRepository.delete(value)); + } + + @Test + public void createDessert(){ + Dessert newDessert = dessertService.createDessert(dessert); + assertThat(newDessert).isNotNull(); + assertThat(newDessert.getDescription()).isEqualTo(dessert.getDescription()); + } + + @Test + public void deleteDessert(){ + Dessert insertedDessert = dessertRepository.save(dessert); + assertThat(insertedDessert).isNotNull(); + boolean deleted = dessertService.deleteDessert(insertedDessert.getId()); + assertThat(deleted).isEqualTo(true); + } + + @Test + public void updateDessert(){ + Dessert insertedDessert = dessertRepository.save(dessert); + assertThat(insertedDessert).isNotNull(); + String newDescription = "This is a new description for our fake dessert"; + dessert.setDescription(newDescription); + Dessert updatedDessert = dessertService.updateDessert(insertedDessert.getId(),dessert); + assertThat(updatedDessert).isNotNull(); + assertThat(updatedDessert.getId()).isEqualTo(insertedDessert.getId()); + assertThat(updatedDessert.getDescription()).isEqualTo(newDescription); + + } + + @Test + public void findAll(){ + long nDesserts = dessertRepository.count(); + List desserts = dessertService.getAllDesserts(); + assertThat(desserts.size()).isEqualTo(nDesserts); + } + + @Test + public void findById(){ + Dessert insertedDessert = dessertRepository.save(dessert); + assertThat(insertedDessert).isNotNull(); + Dessert foundDessert = dessertService.getDessertById(insertedDessert.getId()); + assertThat(foundDessert).isNotNull(); + assertThat(foundDessert.getDescription()).isEqualTo(insertedDessert.getDescription()); + } + + @Test + public void findByIdNonexistentDessert(){ + Dessert foundDessert = dessertService.getDessertById("Non existent dessert ID"); + assertThat(foundDessert).isNull(); + } + + +}