diff --git a/src/test/java/ntnu/idatt2016/v233/SmartMat/controller/RecipeControllerTest.java b/src/test/java/ntnu/idatt2016/v233/SmartMat/controller/RecipeControllerTest.java new file mode 100644 index 0000000000000000000000000000000000000000..b6f4bbe962b64446a61ec7c7dbbb6adef0cc8ea2 --- /dev/null +++ b/src/test/java/ntnu/idatt2016/v233/SmartMat/controller/RecipeControllerTest.java @@ -0,0 +1,91 @@ +package ntnu.idatt2016.v233.SmartMat.controller; + +import com.fasterxml.jackson.databind.ObjectMapper; +import ntnu.idatt2016.v233.SmartMat.entity.Recipe; +import ntnu.idatt2016.v233.SmartMat.service.RecipeService; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; + +import java.util.Arrays; +import java.util.List; +import java.util.Optional; + +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.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@ExtendWith(MockitoExtension.class) +public class RecipeControllerTest { + + @Mock + private RecipeService recipeService; + + @InjectMocks + private RecipeController recipeController; + + private MockMvc mockMvc; + private ObjectMapper objectMapper; + private Recipe recipe1; + private Recipe recipe2; + + @BeforeEach + void setUp() { + mockMvc = MockMvcBuilders.standaloneSetup(recipeController).build(); + objectMapper = new ObjectMapper(); + + recipe1 = Recipe.builder() + .id(1L) + .name("Recipe 1") + .description("Recipe 1 description") + .build(); + + recipe2 = Recipe.builder() + .id(2L) + .name("Recipe 2") + .description("Recipe 2 description") + .build(); + } + + @Test + void getRecipeById() throws Exception { + when(recipeService.getRecipeById(recipe1.getId())).thenReturn(Optional.of(recipe1)); + + mockMvc.perform(get("/api/recipe/id/{id}", recipe1.getId())) + .andExpect(status().isOk()) + .andExpect(content().json(objectMapper.writeValueAsString(recipe1))); + } + + @Test + void getRecipeById_NotFound() throws Exception { + when(recipeService.getRecipeById(3L)).thenReturn(Optional.empty()); + + mockMvc.perform(get("/api/recipe/id/{id}", 3L)) + .andExpect(status().isNotFound()); + } + + @Test + void getRecipeByName() throws Exception { + List<Recipe> recipes = Arrays.asList(recipe1, recipe2); + when(recipeService.getRecipesByName("Recipe")).thenReturn(recipes); + + mockMvc.perform(get("/api/recipe/name/{name}", "Recipe")) + .andExpect(status().isOk()) + .andExpect(content().json(objectMapper.writeValueAsString(recipes))); + } + + @Test + void getRecipeByName_NotFound() throws Exception { + when(recipeService.getRecipesByName("Nonexistent")).thenReturn(List.of()); + + mockMvc.perform(get("/api/recipe/name/{name}", "Nonexistent")) + .andExpect(status().isNotFound()); + } +} diff --git a/src/test/java/ntnu/idatt2016/v233/SmartMat/service/RecipeServiceTest.java b/src/test/java/ntnu/idatt2016/v233/SmartMat/service/RecipeServiceTest.java new file mode 100644 index 0000000000000000000000000000000000000000..49804be28b0eab657e76e17ecfe01a268be877be --- /dev/null +++ b/src/test/java/ntnu/idatt2016/v233/SmartMat/service/RecipeServiceTest.java @@ -0,0 +1,122 @@ +package ntnu.idatt2016.v233.SmartMat.service; + +import ntnu.idatt2016.v233.SmartMat.entity.Recipe; +import ntnu.idatt2016.v233.SmartMat.entity.user.User; +import ntnu.idatt2016.v233.SmartMat.repository.RecipeRepository; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.Arrays; +import java.util.List; +import java.util.Optional; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +public class RecipeServiceTest { + + @Mock + private RecipeRepository recipeRepository; + + @InjectMocks + private RecipeService recipeService; + + private Recipe recipe1; + private Recipe recipe2; + private User user; + + @BeforeEach + void setUp() { + recipe1 = Recipe.builder() + .id(1L) + .name("Recipe 1") + .description("Recipe 1 description") + .build(); + + recipe2 = Recipe.builder() + .id(2L) + .name("Recipe 2") + .description("Recipe 2 description") + .build(); + + user = new User(); + user.setUsername("testuser"); + user.setEmail("testuser@example.com"); + } + + @Test + void getRecipeById() { + when(recipeRepository.findById(recipe1.getId())).thenReturn(Optional.of(recipe1)); + + Optional<Recipe> result = recipeService.getRecipeById(recipe1.getId()); + + assertThat(result).isPresent(); + assertThat(result.get()).isEqualTo(recipe1); + verify(recipeRepository).findById(recipe1.getId()); + } + + @Test + void getRecipesByName() { + List<Recipe> expectedRecipes = Arrays.asList(recipe1, recipe2); + when(recipeRepository.findAllByName(recipe1.getName())).thenReturn(expectedRecipes); + + List<Recipe> result = recipeService.getRecipesByName(recipe1.getName()); + + assertThat(result).isEqualTo(expectedRecipes); + verify(recipeRepository).findAllByName(recipe1.getName()); + } + + @Test + void getAllRecipes() { + List<Recipe> expectedRecipes = Arrays.asList(recipe1, recipe2); + when(recipeRepository.findAll()).thenReturn(expectedRecipes); + + List<Recipe> result = recipeService.getAllRecipes(); + + assertThat(result).isEqualTo(expectedRecipes); + verify(recipeRepository).findAll(); + } + + @Test + void saveRecipe() { + when(recipeRepository.save(recipe1)).thenReturn(recipe1); + + Recipe result = recipeService.saveRecipe(recipe1); + + assertThat(result).isEqualTo(recipe1); + verify(recipeRepository).save(recipe1); + } + + @Test + void deleteRecipe() { + doNothing().when(recipeRepository).delete(recipe1); + + recipeService.deleteRecipe(recipe1); + + verify(recipeRepository).delete(recipe1); + } + + @Test + void deleteRecipeById() { + doNothing().when(recipeRepository).deleteById(recipe1.getId()); + + recipeService.deleteRecipeById(recipe1.getId()); + + verify(recipeRepository).deleteById(recipe1.getId()); + } + + @Test + void addUserToRecipe() { + when(recipeRepository.save(recipe1)).thenReturn(recipe1); + + recipeService.addUserToRecipe(recipe1, user); + + assertThat(recipe1.getUsers()).contains(user); + verify(recipeRepository).save(recipe1); + } +}