Skip to content
Snippets Groups Projects
Commit f1e77d2b authored by Anders Montsko Austlid's avatar Anders Montsko Austlid
Browse files

Merge branch 'feature/recipe-tests' into 'main'

Added unit tests for recipe service and controller

Closes #143

See merge request idatt2106-v23-03/backend!109
parents dbcc9359 cf5cc3c8
No related branches found
No related tags found
No related merge requests found
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());
}
}
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);
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment