feat: ingredient controller, websocket messages, ingredient controller tests

This commit is contained in:
Natalia Cholewa 2025-12-05 14:38:43 +01:00
commit 3af808ef58
13 changed files with 498 additions and 9 deletions

View file

@ -0,0 +1,166 @@
package server.api;
import commons.Ingredient;
import org.junit.jupiter.api.BeforeEach;
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.context.annotation.Import;
import org.springframework.http.HttpStatusCode;
import org.springframework.messaging.simp.SimpMessagingTemplate;
import org.springframework.test.context.ActiveProfiles;
import server.database.IngredientRepository;
import server.WebSocketConfig;
import static org.junit.jupiter.api.Assertions.*;
import java.util.List;
import java.util.Optional;
import java.util.stream.Stream;
@DataJpaTest
@ActiveProfiles("mock-data-test")
@Import(WebSocketConfig.class)
public class IngredientControllerTest {
private final SimpMessagingTemplate template;
private final IngredientRepository ingredientRepository;
private IngredientController controller;
@Autowired
public IngredientControllerTest(IngredientRepository ingredientRepository,
SimpMessagingTemplate template) {
this.ingredientRepository = ingredientRepository;
this.template = template;
}
private void createInitialIngredients() {
ingredientRepository.deleteAll();
Stream.of("Salt", "Sugar", "Flour", "Eggs", "Milk")
.map(name -> {
return new Ingredient(name, 1.0, 2.0, 3.0);
})
.forEach(ingredientRepository::save);
}
@BeforeEach
public void setup() {
controller = new IngredientController(ingredientRepository, template);
this.createInitialIngredients();
}
@Test
public void testGetAllIngredients() {
List<Ingredient> ingredients = controller.getIngredients(Optional.empty(), Optional.empty()).getBody();
assertNotNull(ingredients);
assertEquals(5, ingredients.size());
assertEquals("Eggs", ingredients.getFirst().name);
}
@Test
public void testGetPaginatedIngredients() {
List<Ingredient> ingredients = controller.getIngredients(Optional.of(0), Optional.of(2)).getBody();
assertNotNull(ingredients);
assertEquals(2, ingredients.size());
assertEquals("Eggs", ingredients.get(0).name);
assertEquals("Flour", ingredients.get(1).name);
}
@Test
public void testGetIngredientById() {
Ingredient ingredient = ingredientRepository.findAll().getFirst();
Long id = ingredient.id;
Ingredient fetchedIngredient = controller.getIngredientById(id).getBody();
assertNotNull(fetchedIngredient);
assertEquals(ingredient.name, fetchedIngredient.name);
}
@Test
public void testGetIngredientByInvalidId() {
Long invalidId = 2137L;
var response = controller.getIngredientById(invalidId);
assertEquals(HttpStatusCode.valueOf(404), response.getStatusCode());
}
@Test
public void testCreateIngredient() {
Ingredient newIngredient = new Ingredient("Butter", 0.5, 1.0, 1.5);
Ingredient createdIngredient = controller.createIngredient(newIngredient).getBody();
assertNotNull(createdIngredient);
assertEquals("Butter", createdIngredient.name);
assertEquals(6, ingredientRepository.count());
}
@Test
public void testCreateIngredientMissingName() {
Ingredient newIngredient = new Ingredient(null, 0.5, 1.0, 1.5);
var response = controller.createIngredient(newIngredient);
assertEquals(HttpStatusCode.valueOf(400), response.getStatusCode());
}
@Test
public void testUpdateIngredient() {
Ingredient ingredient = ingredientRepository.findAll()
.stream()
.filter(i -> i.name.equals("Salt"))
.findFirst()
.get(); // Should exist, no need for a check
Long id = ingredient.id;
Ingredient updatedData = new Ingredient("Sea Salt", 1.5, 2.5, 3.5);
Ingredient updatedIngredient = controller.updateIngredient(id, updatedData).getBody();
assertNotNull(updatedIngredient);
assertEquals("Sea Salt", updatedIngredient.name);
assertEquals(1.5, updatedIngredient.proteinPer100g);
}
@Test
public void testUpdateMissingIngredient() {
Long invalidId = 2137L;
Ingredient updatedData = new Ingredient("Sea Salt", 1.5, 2.5, 3.5);
var response = controller.updateIngredient(invalidId, updatedData);
assertEquals(HttpStatusCode.valueOf(404), response.getStatusCode());
}
@Test
public void testDeleteIngredient() {
Ingredient ingredient = ingredientRepository.findAll()
.stream()
.filter(i -> i.name.equals("Sugar"))
.findFirst()
.get(); // Should exist, no need for a check
Long id = ingredient.id;
var response = controller.deleteIngredient(id);
assertEquals(HttpStatusCode.valueOf(200), response.getStatusCode());
assertEquals(4, ingredientRepository.count());
}
@Test
public void testDeleteMissingIngredient() {
Long invalidId = 2137L;
var response = controller.deleteIngredient(invalidId);
assertEquals(HttpStatusCode.valueOf(404), response.getStatusCode());
}
}