From aed7c958524beeb7aadd83a77e55913dbeeb41df Mon Sep 17 00:00:00 2001 From: Daniel Mass Date: Sun, 18 Feb 2024 20:14:25 +0100 Subject: [PATCH 1/3] refactor: introduce interfaces for Services --- .../services/AdminApplicationService.java | 9 ++++--- .../services/BookingApplicationService.java | 3 ++- .../roommate/controller/HomeController.java | 6 ++--- .../roommate/controller/RoomController.java | 10 ++++---- .../domain/services/RoomDomainService.java | 7 +++--- .../services/IAdminApplicationService.java | 7 ++++++ .../services/IBookingApplicationService.java | 25 +++++++++++++++++++ .../domain/services/IRoomDomainService.java | 23 +++++++++++++++++ .../tests/controller/booking/GetBookTest.java | 12 ++++++++- 9 files changed, 85 insertions(+), 17 deletions(-) create mode 100644 src/main/java/com/example/roommate/interfaces/application/services/IAdminApplicationService.java create mode 100644 src/main/java/com/example/roommate/interfaces/application/services/IBookingApplicationService.java create mode 100644 src/main/java/com/example/roommate/interfaces/domain/services/IRoomDomainService.java diff --git a/src/main/java/com/example/roommate/application/services/AdminApplicationService.java b/src/main/java/com/example/roommate/application/services/AdminApplicationService.java index 80c164ba..e7dd57ee 100644 --- a/src/main/java/com/example/roommate/application/services/AdminApplicationService.java +++ b/src/main/java/com/example/roommate/application/services/AdminApplicationService.java @@ -2,7 +2,8 @@ import com.example.roommate.annotations.ApplicationService; import com.example.roommate.application.data.RoomApplicationData; -import com.example.roommate.domain.services.RoomDomainService; +import com.example.roommate.interfaces.application.services.IAdminApplicationService; +import com.example.roommate.interfaces.domain.services.IRoomDomainService; import com.example.roommate.values.domainValues.RoomNumber; import com.example.roommate.values.forms.RoomDataForm; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; @@ -12,11 +13,11 @@ @SuppressFBWarnings(value="EI2", justification="RoomDomainService is properly injected") @ApplicationService -public class AdminApplicationService { +public class AdminApplicationService implements IAdminApplicationService { - final RoomDomainService roomDomainService; + final IRoomDomainService roomDomainService; - public AdminApplicationService(RoomDomainService roomDomainService) { + public AdminApplicationService(IRoomDomainService roomDomainService) { this.roomDomainService = roomDomainService; } diff --git a/src/main/java/com/example/roommate/application/services/BookingApplicationService.java b/src/main/java/com/example/roommate/application/services/BookingApplicationService.java index 402e2bd8..39949ab3 100644 --- a/src/main/java/com/example/roommate/application/services/BookingApplicationService.java +++ b/src/main/java/com/example/roommate/application/services/BookingApplicationService.java @@ -3,6 +3,7 @@ import com.example.roommate.annotations.ApplicationService; import com.example.roommate.application.data.RoomApplicationData; import com.example.roommate.exceptions.domainService.GeneralDomainException; +import com.example.roommate.interfaces.application.services.IBookingApplicationService; import com.example.roommate.utility.IterableSupport; import com.example.roommate.values.domainValues.BookedTimeframe; import com.example.roommate.values.domainValues.IntermediateBookDataForm; @@ -24,7 +25,7 @@ import java.time.DayOfWeek; @ApplicationService @SuppressFBWarnings(value="EI2", justification="RoomDomainService is properly injected") -public class BookingApplicationService { +public class BookingApplicationService implements IBookingApplicationService { RoomDomainService roomDomainService; diff --git a/src/main/java/com/example/roommate/controller/HomeController.java b/src/main/java/com/example/roommate/controller/HomeController.java index 2524d1dc..ec2255e8 100644 --- a/src/main/java/com/example/roommate/controller/HomeController.java +++ b/src/main/java/com/example/roommate/controller/HomeController.java @@ -1,6 +1,6 @@ package com.example.roommate.controller; -import com.example.roommate.application.services.BookingApplicationService; +import com.example.roommate.interfaces.application.services.IBookingApplicationService; import com.example.roommate.utility.IterableSupport; import com.example.roommate.values.domainValues.DayTimeFrame; import com.example.roommate.values.models.RoomHomeModel; @@ -16,9 +16,9 @@ @Controller() @SuppressFBWarnings(value="EI2", justification="BookingApplicationService is properly injected") public class HomeController { - private final BookingApplicationService bookingApplicationService; + private final IBookingApplicationService bookingApplicationService; @Autowired - public HomeController(BookingApplicationService bookingApplicationService) { + public HomeController(IBookingApplicationService bookingApplicationService) { this.bookingApplicationService = bookingApplicationService; } diff --git a/src/main/java/com/example/roommate/controller/RoomController.java b/src/main/java/com/example/roommate/controller/RoomController.java index cbd0b39f..50f8e79f 100644 --- a/src/main/java/com/example/roommate/controller/RoomController.java +++ b/src/main/java/com/example/roommate/controller/RoomController.java @@ -1,16 +1,16 @@ package com.example.roommate.controller; import com.example.roommate.annotations.AdminOnly; -import com.example.roommate.application.services.AdminApplicationService; import com.example.roommate.exceptions.ArgumentValidationException; import com.example.roommate.exceptions.persistence.NotFoundRepositoryException; +import com.example.roommate.interfaces.application.services.IAdminApplicationService; +import com.example.roommate.interfaces.application.services.IBookingApplicationService; import com.example.roommate.utility.IterableSupport; import com.example.roommate.values.domainValues.*; import com.example.roommate.exceptions.applicationService.NotFoundException; import com.example.roommate.interfaces.entities.IRoom; import com.example.roommate.exceptions.domainService.GeneralDomainException; import com.example.roommate.values.forms.BookDataForm; -import com.example.roommate.application.services.BookingApplicationService; import com.example.roommate.values.forms.RoomDataForm; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import jakarta.validation.Valid; @@ -30,12 +30,12 @@ @SuppressFBWarnings(value="EI2", justification="BookingApplicationService & AdminApplicationService are properly injected") public class RoomController { - private final BookingApplicationService bookingApplicationService; + private final IBookingApplicationService bookingApplicationService; - private final AdminApplicationService adminApplicationService; + private final IAdminApplicationService adminApplicationService; @Autowired - public RoomController(BookingApplicationService bookingApplicationService, AdminApplicationService adminApplicationService) { + public RoomController(IBookingApplicationService bookingApplicationService, IAdminApplicationService adminApplicationService) { this.bookingApplicationService = bookingApplicationService; this.adminApplicationService = adminApplicationService; } diff --git a/src/main/java/com/example/roommate/domain/services/RoomDomainService.java b/src/main/java/com/example/roommate/domain/services/RoomDomainService.java index ff064cdc..7d7d662a 100644 --- a/src/main/java/com/example/roommate/domain/services/RoomDomainService.java +++ b/src/main/java/com/example/roommate/domain/services/RoomDomainService.java @@ -2,6 +2,7 @@ import com.example.roommate.annotations.DomainService; import com.example.roommate.application.data.RoomApplicationData; +import com.example.roommate.interfaces.domain.services.IRoomDomainService; import com.example.roommate.interfaces.entities.IRoom; import com.example.roommate.interfaces.repositories.IItemRepository; import com.example.roommate.interfaces.repositories.IRoomRepository; @@ -23,7 +24,7 @@ @DomainService //mediate between Repository, domain; map forms to domain-objects/data @SuppressFBWarnings(value="EI2", justification="Repositories are properly injected, @Lazy self is required for transactions") -public class RoomDomainService { +public class RoomDomainService implements IRoomDomainService { IRoomRepository roomRepository; IItemRepository itemRepository; @@ -35,10 +36,10 @@ public RoomDomainService(IRoomRepository roomRepository, IItemRepository itemRep this.self = this; } @Autowired - public RoomDomainService(IRoomRepository roomRepository, IItemRepository itemRepository, @Lazy RoomDomainService self) { + public RoomDomainService(IRoomRepository roomRepository, IItemRepository itemRepository, @Lazy IRoomDomainService self) { this.roomRepository = roomRepository; this.itemRepository = itemRepository; - this.self = self; + this.self = (RoomDomainService) self; } public void addDummyDummy(){ diff --git a/src/main/java/com/example/roommate/interfaces/application/services/IAdminApplicationService.java b/src/main/java/com/example/roommate/interfaces/application/services/IAdminApplicationService.java new file mode 100644 index 00000000..ee3cde8e --- /dev/null +++ b/src/main/java/com/example/roommate/interfaces/application/services/IAdminApplicationService.java @@ -0,0 +1,7 @@ +package com.example.roommate.interfaces.application.services; + +import com.example.roommate.values.forms.RoomDataForm; + +public interface IAdminApplicationService { + void addRoom(RoomDataForm roomDataForm); +} diff --git a/src/main/java/com/example/roommate/interfaces/application/services/IBookingApplicationService.java b/src/main/java/com/example/roommate/interfaces/application/services/IBookingApplicationService.java new file mode 100644 index 00000000..7dd3caea --- /dev/null +++ b/src/main/java/com/example/roommate/interfaces/application/services/IBookingApplicationService.java @@ -0,0 +1,25 @@ +package com.example.roommate.interfaces.application.services; + +import com.example.roommate.exceptions.applicationService.NotFoundException; +import com.example.roommate.exceptions.domainService.GeneralDomainException; +import com.example.roommate.exceptions.persistence.NotFoundRepositoryException; +import com.example.roommate.interfaces.entities.IRoom; +import com.example.roommate.values.domainValues.IntermediateBookDataForm; +import com.example.roommate.values.domainValues.ItemName; +import com.example.roommate.values.models.RoomBookingModel; + +import java.util.Collection; +import java.util.List; +import java.util.UUID; + +public interface IBookingApplicationService { + void addBookEntry(IntermediateBookDataForm form) throws NotFoundException, GeneralDomainException; + Collection getItems(); + Collection getRooms(); + void addRoom(IRoom room); + IRoom findRoomByID(UUID roomID) throws NotFoundException; + List findAvailableRoomsWithItems(List items, String dateString, String startTimeString, String endTimeString); + void removeItemFromRoom(UUID roomID, String itemName) throws NotFoundRepositoryException; + void addItemToRoom(UUID roomID, String itemName) throws NotFoundRepositoryException; + void createItem(String itemName); +} diff --git a/src/main/java/com/example/roommate/interfaces/domain/services/IRoomDomainService.java b/src/main/java/com/example/roommate/interfaces/domain/services/IRoomDomainService.java new file mode 100644 index 00000000..a12139ae --- /dev/null +++ b/src/main/java/com/example/roommate/interfaces/domain/services/IRoomDomainService.java @@ -0,0 +1,23 @@ +package com.example.roommate.interfaces.domain.services; + +import com.example.roommate.application.data.RoomApplicationData; +import com.example.roommate.exceptions.persistence.NotFoundRepositoryException; +import com.example.roommate.interfaces.entities.IRoom; +import com.example.roommate.values.domainValues.BookedTimeframe; +import com.example.roommate.values.domainValues.ItemName; + +import java.util.Collection; +import java.util.List; +import java.util.UUID; + +public interface IRoomDomainService { + void addBooking(BookedTimeframe bookedTimeframe, UUID roomID) throws NotFoundRepositoryException; + void addRoom(RoomApplicationData roomApplicationData); + void removeRoom(RoomApplicationData room); + Collection getRooms(); + IRoom findRoomByID(UUID roomID) throws NotFoundRepositoryException; + List getItems(); + void removeItemFromRoom(UUID roomID, String itemName) throws NotFoundRepositoryException; + void addItemToRoom(UUID roomID, String itemName) throws NotFoundRepositoryException; + void createItem(String itemName); +} diff --git a/src/test/java/com/example/roommate/tests/controller/booking/GetBookTest.java b/src/test/java/com/example/roommate/tests/controller/booking/GetBookTest.java index 21e1ace9..fcaefd13 100644 --- a/src/test/java/com/example/roommate/tests/controller/booking/GetBookTest.java +++ b/src/test/java/com/example/roommate/tests/controller/booking/GetBookTest.java @@ -2,21 +2,31 @@ import com.example.roommate.annotations.TestClass; import com.example.roommate.annotations.WithMockOAuth2User; +import com.example.roommate.controller.RoomController; +import com.example.roommate.interfaces.application.services.IAdminApplicationService; +import com.example.roommate.interfaces.application.services.IBookingApplicationService; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.test.web.servlet.MockMvc; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; -@WebMvcTest +@WebMvcTest(RoomController.class) @TestClass public class GetBookTest { @Autowired MockMvc mvc; + + @MockBean + IAdminApplicationService adminApplicationService; + + @MockBean + IBookingApplicationService bookingApplicationService; @Test @DisplayName("A Get-Request on /book returns home.html") From bee3c864b1b0b4d8efe0260f00f5b3b87872a9d9 Mon Sep 17 00:00:00 2001 From: Daniel Mass Date: Sun, 18 Feb 2024 21:03:31 +0100 Subject: [PATCH 2/3] refactor: replace actual implementation with dummies --- .../stubs/AdminApplicationServiceDummy.java | 11 ++++ .../stubs/BookingApplicationServiceDummy.java | 61 +++++++++++++++++++ .../stubs/RoomDomainServiceDummy.java | 59 ++++++++++++++++++ .../tests/controller/booking/GetBookTest.java | 6 +- 4 files changed, 135 insertions(+), 2 deletions(-) create mode 100644 src/test/java/com/example/roommate/stubs/AdminApplicationServiceDummy.java create mode 100644 src/test/java/com/example/roommate/stubs/BookingApplicationServiceDummy.java create mode 100644 src/test/java/com/example/roommate/stubs/RoomDomainServiceDummy.java diff --git a/src/test/java/com/example/roommate/stubs/AdminApplicationServiceDummy.java b/src/test/java/com/example/roommate/stubs/AdminApplicationServiceDummy.java new file mode 100644 index 00000000..6dc7b6d6 --- /dev/null +++ b/src/test/java/com/example/roommate/stubs/AdminApplicationServiceDummy.java @@ -0,0 +1,11 @@ +package com.example.roommate.stubs; + +import com.example.roommate.interfaces.application.services.IAdminApplicationService; +import com.example.roommate.values.forms.RoomDataForm; + +public class AdminApplicationServiceDummy implements IAdminApplicationService { + @Override + public void addRoom(RoomDataForm roomDataForm) { + + } +} diff --git a/src/test/java/com/example/roommate/stubs/BookingApplicationServiceDummy.java b/src/test/java/com/example/roommate/stubs/BookingApplicationServiceDummy.java new file mode 100644 index 00000000..4466fb06 --- /dev/null +++ b/src/test/java/com/example/roommate/stubs/BookingApplicationServiceDummy.java @@ -0,0 +1,61 @@ +package com.example.roommate.stubs; + +import com.example.roommate.exceptions.applicationService.NotFoundException; +import com.example.roommate.exceptions.domainService.GeneralDomainException; +import com.example.roommate.exceptions.persistence.NotFoundRepositoryException; +import com.example.roommate.interfaces.application.services.IBookingApplicationService; +import com.example.roommate.interfaces.entities.IRoom; +import com.example.roommate.values.domainValues.IntermediateBookDataForm; +import com.example.roommate.values.domainValues.ItemName; +import com.example.roommate.values.models.RoomBookingModel; + +import java.util.Collection; +import java.util.List; +import java.util.UUID; + +public class BookingApplicationServiceDummy implements IBookingApplicationService { + @Override + public void addBookEntry(IntermediateBookDataForm form) throws NotFoundException, GeneralDomainException { + + } + + @Override + public Collection getItems() { + return null; + } + + @Override + public Collection getRooms() { + return null; + } + + @Override + public void addRoom(IRoom room) { + + } + + @Override + public IRoom findRoomByID(UUID roomID) throws NotFoundException { + return null; + } + + @Override + public List findAvailableRoomsWithItems(List items, String dateString, String startTimeString, String endTimeString) { + return null; + } + + @Override + public void removeItemFromRoom(UUID roomID, String itemName) throws NotFoundRepositoryException { + + } + + @Override + public void addItemToRoom(UUID roomID, String itemName) throws NotFoundRepositoryException { + + } + + @Override + public void createItem(String itemName) { + + } +} diff --git a/src/test/java/com/example/roommate/stubs/RoomDomainServiceDummy.java b/src/test/java/com/example/roommate/stubs/RoomDomainServiceDummy.java new file mode 100644 index 00000000..1576a205 --- /dev/null +++ b/src/test/java/com/example/roommate/stubs/RoomDomainServiceDummy.java @@ -0,0 +1,59 @@ +package com.example.roommate.stubs; + +import com.example.roommate.application.data.RoomApplicationData; +import com.example.roommate.exceptions.persistence.NotFoundRepositoryException; +import com.example.roommate.interfaces.domain.services.IRoomDomainService; +import com.example.roommate.interfaces.entities.IRoom; +import com.example.roommate.values.domainValues.BookedTimeframe; +import com.example.roommate.values.domainValues.ItemName; + +import java.util.Collection; +import java.util.List; +import java.util.UUID; + +public class RoomDomainServiceDummy implements IRoomDomainService { + @Override + public void addBooking(BookedTimeframe bookedTimeframe, UUID roomID) throws NotFoundRepositoryException { + + } + + @Override + public void addRoom(RoomApplicationData roomApplicationData) { + + } + + @Override + public void removeRoom(RoomApplicationData room) { + + } + + @Override + public Collection getRooms() { + return null; + } + + @Override + public IRoom findRoomByID(UUID roomID) throws NotFoundRepositoryException { + return null; + } + + @Override + public List getItems() { + return null; + } + + @Override + public void removeItemFromRoom(UUID roomID, String itemName) throws NotFoundRepositoryException { + + } + + @Override + public void addItemToRoom(UUID roomID, String itemName) throws NotFoundRepositoryException { + + } + + @Override + public void createItem(String itemName) { + + } +} diff --git a/src/test/java/com/example/roommate/tests/controller/booking/GetBookTest.java b/src/test/java/com/example/roommate/tests/controller/booking/GetBookTest.java index fcaefd13..3322b66e 100644 --- a/src/test/java/com/example/roommate/tests/controller/booking/GetBookTest.java +++ b/src/test/java/com/example/roommate/tests/controller/booking/GetBookTest.java @@ -5,6 +5,8 @@ import com.example.roommate.controller.RoomController; import com.example.roommate.interfaces.application.services.IAdminApplicationService; import com.example.roommate.interfaces.application.services.IBookingApplicationService; +import com.example.roommate.stubs.AdminApplicationServiceDummy; +import com.example.roommate.stubs.BookingApplicationServiceDummy; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -23,10 +25,10 @@ public class GetBookTest { MockMvc mvc; @MockBean - IAdminApplicationService adminApplicationService; + AdminApplicationServiceDummy adminApplicationService; @MockBean - IBookingApplicationService bookingApplicationService; + BookingApplicationServiceDummy bookingApplicationService; @Test @DisplayName("A Get-Request on /book returns home.html") From ae0c879918e81b91b99414dc025fe75fe2957e33 Mon Sep 17 00:00:00 2001 From: Daniel Mass Date: Mon, 19 Feb 2024 10:12:06 +0100 Subject: [PATCH 3/3] chore: limit scope using component scan --- .../tests/controller/booking/GetBookTest.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/test/java/com/example/roommate/tests/controller/booking/GetBookTest.java b/src/test/java/com/example/roommate/tests/controller/booking/GetBookTest.java index 3322b66e..1966b15d 100644 --- a/src/test/java/com/example/roommate/tests/controller/booking/GetBookTest.java +++ b/src/test/java/com/example/roommate/tests/controller/booking/GetBookTest.java @@ -2,22 +2,24 @@ import com.example.roommate.annotations.TestClass; import com.example.roommate.annotations.WithMockOAuth2User; +import com.example.roommate.application.services.AdminApplicationService; +import com.example.roommate.application.services.BookingApplicationService; import com.example.roommate.controller.RoomController; import com.example.roommate.interfaces.application.services.IAdminApplicationService; import com.example.roommate.interfaces.application.services.IBookingApplicationService; -import com.example.roommate.stubs.AdminApplicationServiceDummy; -import com.example.roommate.stubs.BookingApplicationServiceDummy; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.FilterType; import org.springframework.test.web.servlet.MockMvc; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; -@WebMvcTest(RoomController.class) +@WebMvcTest(controllers = {RoomController.class}, excludeFilters = @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = {AdminApplicationService.class, BookingApplicationService.class})) @TestClass public class GetBookTest { @@ -25,10 +27,10 @@ public class GetBookTest { MockMvc mvc; @MockBean - AdminApplicationServiceDummy adminApplicationService; + IAdminApplicationService adminApplicationService; @MockBean - BookingApplicationServiceDummy bookingApplicationService; + IBookingApplicationService bookingApplicationService; @Test @DisplayName("A Get-Request on /book returns home.html")