diff --git a/pom.xml b/pom.xml index 4bde34817088839a2ab848ebdacf305485a104a1..bd71f56bf219d4d440046992c54261312c1124ed 100644 --- a/pom.xml +++ b/pom.xml @@ -18,6 +18,11 @@ <java.version>17</java.version> </properties> <dependencies> + <dependency> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-surefire-plugin</artifactId> + <version>3.0.0</version> + </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> @@ -52,6 +57,11 @@ <artifactId>spring-security-test</artifactId> <scope>test</scope> </dependency> + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + <scope>test</scope> + </dependency> <dependency> <groupId>com.google.code.gson</groupId> @@ -79,12 +89,25 @@ <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>3.0.0</version> + <dependencies> + <dependency> + <groupId>org.apache.maven.surefire</groupId> + <artifactId>surefire-junit4</artifactId> + <version>3.0.0</version> + </dependency> + </dependencies> </plugin> <plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <version>0.8.9</version> + <configuration> + <excludes> + <exclude>**/model/**</exclude> + <exclude>**/MatsvinnBackendApplication.class</exclude> + </excludes> + </configuration> <executions> <execution> <goals> diff --git a/src/main/java/edu/ntnu/idatt210602/matsvinnbackend/controller/FoodPreferenceController.java b/src/main/java/edu/ntnu/idatt210602/matsvinnbackend/controller/FoodPreferenceController.java new file mode 100644 index 0000000000000000000000000000000000000000..9791ce98bad166a85b743aa14ee30f080b7945cc --- /dev/null +++ b/src/main/java/edu/ntnu/idatt210602/matsvinnbackend/controller/FoodPreferenceController.java @@ -0,0 +1,29 @@ +package edu.ntnu.idatt210602.matsvinnbackend.controller; + +import edu.ntnu.idatt210602.matsvinnbackend.model.FoodPreference; +import edu.ntnu.idatt210602.matsvinnbackend.service.FoodPreferenceService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.server.ResponseStatusException; + +import java.util.List; + +/** + * Class FoodPreferenceController responsible for processing incoming REST API requests related to food preferences + */ +@RequestMapping("/foodpreferences") +@RestController +@CrossOrigin +public class FoodPreferenceController { + + @Autowired + FoodPreferenceService foodPreferenceService; + + @GetMapping("") + @ResponseStatus(code = HttpStatus.OK) + public List<FoodPreference> getAllFoodPreferences() { + return foodPreferenceService.getAllFoodPreferences(); + } +} diff --git a/src/main/java/edu/ntnu/idatt210602/matsvinnbackend/model/FoodPreference.java b/src/main/java/edu/ntnu/idatt210602/matsvinnbackend/model/FoodPreference.java new file mode 100644 index 0000000000000000000000000000000000000000..2d7331d42f1184cabb874f122cda966a47b360ee --- /dev/null +++ b/src/main/java/edu/ntnu/idatt210602/matsvinnbackend/model/FoodPreference.java @@ -0,0 +1,28 @@ +package edu.ntnu.idatt210602.matsvinnbackend.model; + +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +/** + * Class FoodPreferences to represent a food preference e.g. vegan. + */ +@NoArgsConstructor +@AllArgsConstructor +@Entity +public class FoodPreference { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + @Getter + private Integer Id; + + @Getter + @Setter + private String Type; +} diff --git a/src/main/java/edu/ntnu/idatt210602/matsvinnbackend/repo/FoodPreferencesRepository.java b/src/main/java/edu/ntnu/idatt210602/matsvinnbackend/repo/FoodPreferencesRepository.java new file mode 100644 index 0000000000000000000000000000000000000000..fcb41e5532e18e5347f1f18f93bcfc344454a2ec --- /dev/null +++ b/src/main/java/edu/ntnu/idatt210602/matsvinnbackend/repo/FoodPreferencesRepository.java @@ -0,0 +1,13 @@ +package edu.ntnu.idatt210602.matsvinnbackend.repo; + +import edu.ntnu.idatt210602.matsvinnbackend.model.FoodPreference; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +/** + * Interface FoodPreferencesRepository to provide mechanisms for several operations on the FoodPreferences class + */ +@Repository +public interface FoodPreferencesRepository extends JpaRepository<FoodPreference, Integer> { + +} diff --git a/src/main/java/edu/ntnu/idatt210602/matsvinnbackend/service/FoodPreferenceService.java b/src/main/java/edu/ntnu/idatt210602/matsvinnbackend/service/FoodPreferenceService.java new file mode 100644 index 0000000000000000000000000000000000000000..1301243dc94590f9b81dfcd6d15e42e77dca20fa --- /dev/null +++ b/src/main/java/edu/ntnu/idatt210602/matsvinnbackend/service/FoodPreferenceService.java @@ -0,0 +1,22 @@ +package edu.ntnu.idatt210602.matsvinnbackend.service; + +import edu.ntnu.idatt210602.matsvinnbackend.model.FoodPreference; +import edu.ntnu.idatt210602.matsvinnbackend.repo.FoodPreferencesRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * Class FoodPreferenceService to provide business functionalities related to foodPreferences + */ +@Service +public class FoodPreferenceService { + + @Autowired + FoodPreferencesRepository foodPreferencesRepository; + + public List<FoodPreference> getAllFoodPreferences() { + return foodPreferencesRepository.findAll(); + } +} diff --git a/src/test/java/edu/ntnu/idatt210602/matsvinnbackend/MatsvinnBackendApplicationTests.java b/src/test/java/edu/ntnu/idatt210602/matsvinnbackend/MatsvinnBackendApplicationTests.java index 9155c7886750853fecd661a89d7490b06212de59..7e35a14e2cae09984186fae027c7b83ed3fc4686 100644 --- a/src/test/java/edu/ntnu/idatt210602/matsvinnbackend/MatsvinnBackendApplicationTests.java +++ b/src/test/java/edu/ntnu/idatt210602/matsvinnbackend/MatsvinnBackendApplicationTests.java @@ -9,4 +9,5 @@ class MatsvinnBackendApplicationTests { @Test void contextLoads() { } + } diff --git a/src/test/java/edu/ntnu/idatt210602/matsvinnbackend/controller/FoodPreferencesControllerTest.java b/src/test/java/edu/ntnu/idatt210602/matsvinnbackend/controller/FoodPreferencesControllerTest.java new file mode 100644 index 0000000000000000000000000000000000000000..58966919956bf813efa8a6486fbaa64a35054d19 --- /dev/null +++ b/src/test/java/edu/ntnu/idatt210602/matsvinnbackend/controller/FoodPreferencesControllerTest.java @@ -0,0 +1,71 @@ +package edu.ntnu.idatt210602.matsvinnbackend.controller; + +import edu.ntnu.idatt210602.matsvinnbackend.controller.FoodPreferenceController; +import edu.ntnu.idatt210602.matsvinnbackend.model.FoodPreference; +import edu.ntnu.idatt210602.matsvinnbackend.repo.FoodPreferencesRepository; +import edu.ntnu.idatt210602.matsvinnbackend.service.FoodPreferenceService; +import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.runner.RunWith; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.context.junit4.SpringRunner; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import org.springframework.test.web.servlet.MockMvc; +import java.util.ArrayList; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.when; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@RunWith(SpringRunner.class) +@ExtendWith(MockitoExtension.class) +@WebMvcTest(FoodPreferenceController.class) +@AutoConfigureMockMvc(addFilters = false) +public class FoodPreferencesControllerTest { + + @Autowired + private MockMvc mvc; + + @MockBean + private FoodPreferencesRepository foodPreferencesRepository; + + @MockBean + private FoodPreferenceService foodPreferencesService; + + @Autowired + FoodPreferenceController foodPreferenceController; + + FoodPreference testPreference = new FoodPreference(null,"Vegan"); + FoodPreference testPreference2 = new FoodPreference(null,"Vegetarian"); + + @BeforeEach + void setup() { + foodPreferencesRepository.deleteAll(); + } + + @Test + public void GetAllFoodPreferencesGivesOkStatusResponse() throws Exception { + + this.mvc.perform(get("/foodpreferences")).andDo(print()).andExpect(status().isOk()); + assertEquals(0, foodPreferenceController.getAllFoodPreferences().size()); + } + + @Test + public void getAllFoodPreferencesWhenSavedPreferencesReturnsAllSavedPreferences() { + + List<FoodPreference> preferences = new ArrayList<>(); + preferences.add(testPreference); + preferences.add(testPreference2); + foodPreferencesRepository.save(testPreference); + foodPreferencesRepository.save(testPreference2); + when(foodPreferenceController.getAllFoodPreferences()).thenReturn(preferences); + assertEquals(preferences, foodPreferenceController.getAllFoodPreferences()); + } +} diff --git a/src/test/java/edu/ntnu/idatt210602/matsvinnbackend/model/FoodPreferenceTest.java b/src/test/java/edu/ntnu/idatt210602/matsvinnbackend/model/FoodPreferenceTest.java new file mode 100644 index 0000000000000000000000000000000000000000..5fc92e8d17b1ff3befb7557924e6646466c4f92c --- /dev/null +++ b/src/test/java/edu/ntnu/idatt210602/matsvinnbackend/model/FoodPreferenceTest.java @@ -0,0 +1,34 @@ +package edu.ntnu.idatt210602.matsvinnbackend.model; + + +import org.junit.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.runner.RunWith; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; + +@SpringBootTest +@RunWith(SpringRunner.class) +@ExtendWith(MockitoExtension.class) +public class FoodPreferenceTest { + + @Test + public void WhenConstructingAnObjectItIsConstructed() { + FoodPreference foodPreference = new FoodPreference(null,"vegan"); + assertEquals("vegan", foodPreference.getType()); + assertNull(foodPreference.getId()); + + foodPreference.setType("vegetarian"); + assertEquals("vegetarian", foodPreference.getType()); + } + + @Test + public void WhenUsingEmptyConstructorFieldsAreNull() { + FoodPreference foodPreference = new FoodPreference(); + assertNull(foodPreference.getType()); + assertNull(foodPreference.getId()); + } +} diff --git a/src/test/java/edu/ntnu/idatt210602/matsvinnbackend/service/FoodPreferencesServiceTest.java b/src/test/java/edu/ntnu/idatt210602/matsvinnbackend/service/FoodPreferencesServiceTest.java new file mode 100644 index 0000000000000000000000000000000000000000..ec0d6b1bcf9e54cdaaa765826dc6f259213fd591 --- /dev/null +++ b/src/test/java/edu/ntnu/idatt210602/matsvinnbackend/service/FoodPreferencesServiceTest.java @@ -0,0 +1,44 @@ +package edu.ntnu.idatt210602.matsvinnbackend.service; + +import edu.ntnu.idatt210602.matsvinnbackend.model.FoodPreference; +import edu.ntnu.idatt210602.matsvinnbackend.repo.FoodPreferencesRepository; +import org.junit.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; +import static org.junit.jupiter.api.Assertions.*; + +import java.util.ArrayList; +import java.util.List; + +import static org.mockito.Mockito.*; + +@SpringBootTest +@RunWith(SpringRunner.class) +@ExtendWith(MockitoExtension.class) +public class FoodPreferencesServiceTest { + + @Mock + private FoodPreferencesRepository foodPreferencesRepository; + + @InjectMocks + FoodPreferenceService foodPreferenceService; + + FoodPreference testPreference = new FoodPreference(null,"Vegan"); + FoodPreference testPreference2 = new FoodPreference(null,"Vegetarian"); + + @Test + public void getAllPreferencesReturnsAllSavedPreferences() { + List<FoodPreference> preferences = new ArrayList<>(); + preferences.add(testPreference); + preferences.add(testPreference2); + foodPreferencesRepository.save(testPreference); + foodPreferencesRepository.save(testPreference2); + when(foodPreferenceService.getAllFoodPreferences()).thenReturn(preferences); + assertEquals(preferences, foodPreferenceService.getAllFoodPreferences()); + } +}