From bbf4f932798dca159135efacbcbacfdce19d84a0 Mon Sep 17 00:00:00 2001 From: Erik Foris Date: Fri, 5 Jul 2024 19:25:13 +0200 Subject: [PATCH 1/6] feat: Add CategoryServiceTest and CategoryControllerTest The code changes include adding new test classes CategoryServiceTest and CategoryControllerTest. These test classes are used to test the functionality of the CategoryService and CategoryController classes respectively. The CategoryServiceTest class contains tests for the addCategory, getAllCategories, and getCategoryById methods of the CategoryService class. The CategoryControllerTest class contains tests for the getAllCategories, fetchCategoryById, and createCategory methods of the CategoryController class. Recent user commits: - Merge branch '36-refactor-dataset-class' into '22-integrate-api-and-frontend' - Merge branch '22-integrate-api-and-frontend' into '36-refactor-dataset-class' - Refactor Dataset class - Merge branch '11-add-api-for-getting-home-page-data' into '22-integrate-api-and-frontend' - Merge branch '37-restructure-backend-according-to-seperation-by-concerns' into '11-add-api-for-getting-home-page-data' - refactor: finilase project structure - Merge branch '11-add-api-for-getting-home-page-data' into '22-integrate-api-and-frontend' - Merge branch '25-consider-moving-non-templated-html-into-static' into '11-add-api-for-getting-home-page-data' - refactor: move static sites into static, Remove unused PageController and update main.js for page navigation - fixed bugs: - suppressed display of search results if nothing was found but there were previous searches - improved display timing of search results/initial pages, which led to false displays --- pom.xml | 8 + .../Dataset/DatasetControllerTests.java | 305 ++++++++++++++++++ .../DataDash/Dataset/DatasetServiceTest.java | 123 +++++++ .../category/CategoryControllerTest.java | 75 +++++ .../category/CategoryServiceTest.java | 68 ++++ 5 files changed, 579 insertions(+) create mode 100644 src/test/java/de/uni_passau/fim/PADAS/group3/DataDash/Dataset/DatasetControllerTests.java create mode 100644 src/test/java/de/uni_passau/fim/PADAS/group3/DataDash/Dataset/DatasetServiceTest.java create mode 100644 src/test/java/de/uni_passau/fim/PADAS/group3/DataDash/category/CategoryControllerTest.java create mode 100644 src/test/java/de/uni_passau/fim/PADAS/group3/DataDash/category/CategoryServiceTest.java diff --git a/pom.xml b/pom.xml index 5d76e0c..36bb031 100644 --- a/pom.xml +++ b/pom.xml @@ -56,6 +56,14 @@ h2 runtime + + + org.mockito + mockito-core + 4.5.1 + test + + diff --git a/src/test/java/de/uni_passau/fim/PADAS/group3/DataDash/Dataset/DatasetControllerTests.java b/src/test/java/de/uni_passau/fim/PADAS/group3/DataDash/Dataset/DatasetControllerTests.java new file mode 100644 index 0000000..06a22fc --- /dev/null +++ b/src/test/java/de/uni_passau/fim/PADAS/group3/DataDash/Dataset/DatasetControllerTests.java @@ -0,0 +1,305 @@ +package de.uni_passau.fim.PADAS.group3.DataDash.Dataset; + +import com.fasterxml.jackson.databind.ObjectMapper; +import de.uni_passau.fim.PADAS.group3.DataDash.Dataset.DatasetController; +import de.uni_passau.fim.PADAS.group3.DataDash.Dataset.DatasetService; +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.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; + +import java.net.URL; +import java.time.LocalDate; +import java.util.Arrays; +import java.util.List; +import java.util.UUID; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.BDDMockito.given; +import static org.mockito.Mockito.doAnswer; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@WebMvcTest(DatasetController.class) +public class DatasetControllerTests { + + @Autowired + private MockMvc mockMvc; + + @MockBean + private DatasetService datasetService; + + @Autowired + private ObjectMapper objectMapper = new ObjectMapper(); + + private Dataset d = new Dataset("Title", "abst", "desc", "auth", null, null, Type.API, "MIT"); + + @Test + void getDatasetById_whenExists() throws Exception { + UUID id = UUID.randomUUID(); + Dataset dataset = new Dataset("Title", "abst", "desc", "auth", null, null, Type.API, "MIT"); // Assuming a + // constructor or + // builder pattern + given(datasetService.getDatasetById(id)).willReturn(dataset); + + mockMvc.perform(get("/api/v1/datasets/id/" + id.toString())) + .andExpect(status().isOk()); + } + + @Test + void getDatasetById_whenNotExists() throws Exception { + UUID id = UUID.randomUUID(); + given(datasetService.getDatasetById(id)).willReturn(null); + + mockMvc.perform(get("/api/v1/datasets/id/" + id)) + .andExpect(status().isNotFound()); + } + + @Test + void createDataset() throws Exception { + Dataset dataset = d; + given(datasetService.addDataset(any(Dataset.class))).willAnswer(invocation -> invocation.getArgument(0)); + mockMvc.perform(post("/api/v1/datasets") + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(dataset))) + .andExpect(status().isCreated()); + } + + @Test + void deleteDataset_whenExists() throws Exception { + UUID id = UUID.randomUUID(); + Dataset dataset = new Dataset("Title", "abst", "desc", "auth", null, null, Type.API, "MIT"); + given(datasetService.getDatasetById(id)).willReturn(dataset); + + mockMvc.perform(delete("/api/v1/datasets/id/" + id.toString())) + .andExpect(status().isOk()); + } + + @Test + void deleteDataset_whenNotExists() throws Exception { + UUID id = UUID.randomUUID(); + given(datasetService.getDatasetById(id)).willReturn(null); + + mockMvc.perform(delete("/api/v1/datasets/id/" + id)) + .andExpect(status().isNotFound()); + } + + @Test + void upvote_whenExists() throws Exception { + UUID id = UUID.randomUUID(); + Dataset dataset = new Dataset("Title", "abst", "desc", "auth", null, null, Type.API, "MIT"); + + doAnswer(invocation -> { + dataset.upvote(); // Directly modify the dataset + return null; + }).when(datasetService).upvoteDataset(id); + + given(datasetService.getDatasetById(id)).willReturn(dataset); + + mockMvc.perform(put("/api/v1/datasets/id/" + id.toString() + "/upvote")) + .andExpect(status().isOk()) + .andExpect(content().json(objectMapper.writeValueAsString(dataset))); + + assertEquals(1, dataset.getUpvotes()); // Assuming getUpvotes() method exists and initial upvotes are 0 + } + + @Test + void upvote_whenNotExists() throws Exception { + UUID id = UUID.randomUUID(); + given(datasetService.getDatasetById(id)).willReturn(null); + + mockMvc.perform(put("/api/v1/datasets/id/" + id + "/upvote")) + .andExpect(status().isNotFound()); + } + + @Test + void downvote_whenExists() throws Exception { + UUID id = UUID.randomUUID(); + Dataset dataset = new Dataset("Title", "abst", "desc", "auth", null, null, Type.API, "MIT"); + + doAnswer(invocation -> { + dataset.downvote(); // Directly modify the dataset + return null; + }).when(datasetService).downvoteDataset(id); + + given(datasetService.getDatasetById(id)).willReturn(dataset); + + mockMvc.perform(put("/api/v1/datasets/id/" + id.toString() + "/downvote")) + .andExpect(status().isOk()) + .andExpect(content().json(objectMapper.writeValueAsString(dataset))); + + assertEquals(-1, dataset.getUpvotes()); // Assuming getDownvotes() method exists and initial downvotes are 0 + } + + @Test + void downvote_whenNotExists() throws Exception { + UUID id = UUID.randomUUID(); + given(datasetService.getDatasetById(id)).willReturn(null); + + mockMvc.perform(put("/api/v1/datasets/id/" + id + "/downvote")) + .andExpect(status().isNotFound()); + } + + @Test + void postMethodName_whenExists() throws Exception { + UUID id = UUID.randomUUID(); + Dataset dataset = new Dataset("Title", "abst", "desc", "auth", null, null, Type.API, "MIT"); + + doAnswer(invocation -> { + dataset.vote(3); // Directly modify the dataset + return null; + }).when(datasetService).voteDataset(id, 3); + + given(datasetService.getDatasetById(id)).willReturn(dataset); + + mockMvc.perform(put("/api/v1/datasets/id/" + id.toString() + "/stars?stars=3")) + .andExpect(status().isOk()) + .andExpect(content().json(objectMapper.writeValueAsString(dataset))); + + assertEquals(3, dataset.getRaiting()); // Assuming getVotes() method exists and initial votes are 0 + } + + @Test + void postMethodName_whenNotExists() throws Exception { + UUID id = UUID.randomUUID(); + given(datasetService.getDatasetById(id)).willReturn(null); + + mockMvc.perform(put("/api/v1/datasets/id/" + id + "/stars?stars=3")) + .andExpect(status().isNotFound()); + } + + @Test + void postMethodName_whenInvalidStars() throws Exception { + UUID id = UUID.randomUUID(); + Dataset dataset = new Dataset("Title", "abst", "desc", "auth", null, null, Type.API, "MIT"); + + given(datasetService.getDatasetById(id)).willReturn(dataset); + + mockMvc.perform(put("/api/v1/datasets/id/" + id + "/stars?stars=7")) + .andExpect(status().isBadRequest()); + } + + @Test + void postMethodName_whenInvalidStars2() throws Exception { + UUID id = UUID.randomUUID(); + Dataset dataset = new Dataset("Title", "abst", "desc", "auth", null, null, Type.API, "MIT"); + + given(datasetService.getDatasetById(id)).willReturn(dataset); + + mockMvc.perform(put("/api/v1/datasets/id/" + id + "/stars?stars=0")) + .andExpect(status().isBadRequest()); + } + + @Test + void postMethodName_whenInvalidStars3() throws Exception { + UUID id = UUID.randomUUID(); + Dataset dataset = new Dataset("Title", "abst", "desc", "auth", null, null, Type.API, "MIT"); + + given(datasetService.getDatasetById(id)).willReturn(dataset); + + mockMvc.perform(put("/api/v1/datasets/id/" + id + "/stars?stars=-1")) + .andExpect(status().isBadRequest()); + } + + @Test + void postMethodName_whenInvalidStars4() throws Exception { + UUID id = UUID.randomUUID(); + Dataset dataset = new Dataset("Title", "abst", "desc", "auth", null, null, Type.API, "MIT"); + + given(datasetService.getDatasetById(id)).willReturn(dataset); + + mockMvc.perform(put("/api/v1/datasets/id/" + id + "/stars?stars=6")) + .andExpect(status().isBadRequest()); + } + + @Test + void postMethodName_whenInvalidStars5() throws Exception { + UUID id = UUID.randomUUID(); + Dataset dataset = new Dataset("Title", "abst", "desc", "auth", null, null, Type.API, "MIT"); + + given(datasetService.getDatasetById(id)).willReturn(dataset); + + mockMvc.perform(put("/api/v1/datasets/id/" + id + "/stars?stars=100")) + .andExpect(status().isBadRequest()); + } + + @Test + void searchDatasets_whenExists() throws Exception { + String keyword = "data"; + List datasets = Arrays.asList( + new Dataset("Title 1", "abst", "data", "auth", null, null, Type.API, "MIT"), + new Dataset("Title 2", "abst", "data", "auth", null, null, Type.API, "MIT")); + given(datasetService.searchByOptionalCriteria(keyword,null,null,PageRequest.of(0,20,Sort.by(Sort.Direction.DESC,"upvotes")))).willReturn(new PageImpl<>(datasets)); + + mockMvc.perform(get("/api/v1/datasets/search?searach=" + keyword)) + .andExpect(status().isOk()); + //TODO: Check output + } + + @Test + void searchDatasets_whenNotExists() throws Exception { + String keyword = "nonexistent"; + given(datasetService.searchByOptionalCriteria(keyword,null,null,PageRequest.of(0,20,Sort.by(Sort.Direction.DESC,"upvotes")))).willReturn(Page.empty()); + + mockMvc.perform(get("/api/v1/datasets/search?seaarch=" + keyword)) + .andExpect(status().isOk()); + } + + @Test + void searchDatasets_whenInvalidSort() throws Exception { + String keyword = "data"; + given(datasetService.searchByOptionalCriteria(keyword,null,null,PageRequest.of(0,20,Sort.by(Sort.Direction.DESC,"upvotes")))).willReturn(Page.empty()); + + mockMvc.perform(get("/api/v1/datasets/search?searach=" + keyword + "&sort=invalid")) + .andExpect(status().isBadRequest()); + } + + @Test + void searchDatasets_whenInvalidDirection() throws Exception { + String keyword = "data"; + given(datasetService.searchByOptionalCriteria(keyword,null,null,PageRequest.of(0,20,Sort.by(Sort.Direction.DESC,"upvotes")))).willReturn(Page.empty()); + + mockMvc.perform(get("/api/v1/datasets/search?searach=" + keyword + "&direction=invalid")) + .andExpect(status().isBadRequest()); + } + + @Test + void searchDatasets_whenInvalidPage() throws Exception { + String keyword = "data"; + given(datasetService.searchByOptionalCriteria(keyword,null,null,PageRequest.of(0,20,Sort.by(Sort.Direction.DESC,"upvotes")))).willReturn(Page.empty()); + + mockMvc.perform(get("/api/v1/datasets/search?searach=" + keyword + "&page=-1")) + .andExpect(status().isBadRequest()); + } + + @Test + void searchDatasets_whenInvalidSize() throws Exception { + String keyword = "data"; + given(datasetService.searchByOptionalCriteria(keyword,null,null,PageRequest.of(0,20,Sort.by(Sort.Direction.DESC,"upvotes")))).willReturn(Page.empty()); + + mockMvc.perform(get("/api/v1/datasets/search?searach=" + keyword + "&size=-1")) + .andExpect(status().isBadRequest()); + } + + @Test + void searchDatasets_whenInvalidSize2() throws Exception { + String keyword = "data"; + given(datasetService.searchByOptionalCriteria(keyword,null,null,PageRequest.of(0,20,Sort.by(Sort.Direction.DESC,"upvotes")))).willReturn(Page.empty()); + + mockMvc.perform(get("/api/v1/datasets/search?searach=" + keyword + "&size=0")) + .andExpect(status().isBadRequest()); + } + +} \ No newline at end of file diff --git a/src/test/java/de/uni_passau/fim/PADAS/group3/DataDash/Dataset/DatasetServiceTest.java b/src/test/java/de/uni_passau/fim/PADAS/group3/DataDash/Dataset/DatasetServiceTest.java new file mode 100644 index 0000000..98e0ff4 --- /dev/null +++ b/src/test/java/de/uni_passau/fim/PADAS/group3/DataDash/Dataset/DatasetServiceTest.java @@ -0,0 +1,123 @@ +package de.uni_passau.fim.PADAS.group3.DataDash.Dataset; + + +import static org.mockito.BDDMockito.given; +import static org.mockito.Mockito.*; +import static org.junit.jupiter.api.Assertions.*; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.BeforeEach; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.springframework.data.domain.Pageable; + +import de.uni_passau.fim.PADAS.group3.DataDash.category.Category; +import de.uni_passau.fim.PADAS.group3.DataDash.category.CategoryRepository; + +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; + +import java.util.Arrays; +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +class DatasetServiceTest { + + @Mock + private dataRepository datasetRepository; + @Mock + private CategoryRepository categoryRepository; + + @InjectMocks + private DatasetService datasetService; + + @BeforeEach + void setUp() { + MockitoAnnotations.openMocks(this); + } + + @Test + void testGetDatasetById() { // Test for getDatasetById method + UUID id = UUID.randomUUID(); + Dataset dataset = new Dataset(); + when(datasetRepository.getDatasetById(id)).thenReturn(dataset); + assertEquals(dataset, datasetService.getDatasetById(id)); + } + + @Test + void testAddDataset() { // Test for addDataset method + Dataset dataset = new Dataset(); + when(datasetRepository.save(dataset)).thenReturn(dataset); + assertEquals(dataset, datasetService.addDataset(dataset)); + } + + @Test + void testVoteDataset() { // Test for voteDataset method + UUID id = UUID.randomUUID(); + Dataset dataset = new Dataset(); + when(datasetRepository.getDatasetById(id)).thenReturn(dataset); + datasetService.voteDataset(id, 5); + verify(datasetRepository).save(dataset); + assertEquals(1, dataset.getVotes()); + assertEquals(5, dataset.getRaiting()); + } + + @Test + void testDeleteDataset() { // Test for deleteDataset method + UUID id = UUID.randomUUID(); + Dataset dataset = new Dataset(); + when(datasetRepository.getDatasetById(id)).thenReturn(dataset); + datasetService.deleteDataset(id); + verify(datasetRepository).delete(dataset); + } + + @Test + void testUpvoteDataset() { // Test for upvoteDataset method + UUID id = UUID.randomUUID(); + Dataset dataset = new Dataset(); + when(datasetRepository.getDatasetById(id)).thenReturn(dataset); + datasetService.upvoteDataset(id); + verify(datasetRepository).save(dataset); + assertEquals(1, dataset.getUpvotes()); + } + + @Test + void testDownvoteDataset() { // Test for downvoteDataset method + UUID id = UUID.randomUUID(); + Dataset dataset = new Dataset(); + when(datasetRepository.getDatasetById(id)).thenReturn(dataset); + datasetService.downvoteDataset(id); + verify(datasetRepository).save(dataset); + assertEquals(-1, dataset.getUpvotes()); + } + + + + @Test + void testSearchByOptionalCriteria() { // Test for searchByOptionalCriteria method + String search = "search"; + Type type = Type.DATASET; + Pageable pageable = PageRequest.of(0, 10); + List datasets = Arrays.asList(new Dataset("Title", "abst", "desc", "auth", null, null, Type.API, "MIT"), new Dataset("Title", "abst", "desc", "auth", null, null, Type.API, "MIT")); + PageImpl s = new PageImpl(datasets); + given(datasetRepository.searchByOptionalCriteria(Optional.ofNullable(search), Optional.ofNullable(type),pageable)).willReturn(s); + assertEquals(s.getContent(), datasetService.searchByOptionalCriteria(search, "%",type.toString(), pageable).getContent()); + } + + @Test + void testSearchByOptionalCriteriaWithCategory() { // Test for searchByOptionalCriteria method + String search = "search"; + Type type = Type.DATASET; + String category = UUID.randomUUID().toString(); + Category cat = new Category(); + Pageable pageable = PageRequest.of(0, 10); + List datasets = Arrays.asList(new Dataset("Title", "abst", "desc", "auth", null, null, Type.API, "MIT"), new Dataset("Title", "abst", "desc", "auth", null, null, Type.API, "MIT")); + PageImpl s = new PageImpl(datasets); + given(categoryRepository.getCategoryById(UUID.fromString(category))).willReturn(cat); + given(datasetRepository.searchByOptionalCriteriaWithCategory(Optional.ofNullable(search), cat ,Optional.ofNullable(type),pageable)).willReturn(s); + assertEquals(s.getContent(), datasetService.searchByOptionalCriteria(search, category,type.toString(), pageable).getContent()); + } + + // Additional tests for other methods can be added following the same pattern. +} \ No newline at end of file diff --git a/src/test/java/de/uni_passau/fim/PADAS/group3/DataDash/category/CategoryControllerTest.java b/src/test/java/de/uni_passau/fim/PADAS/group3/DataDash/category/CategoryControllerTest.java new file mode 100644 index 0000000..d977563 --- /dev/null +++ b/src/test/java/de/uni_passau/fim/PADAS/group3/DataDash/category/CategoryControllerTest.java @@ -0,0 +1,75 @@ +package de.uni_passau.fim.PADAS.group3.DataDash.category; + +import com.fasterxml.jackson.databind.ObjectMapper; +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.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; + +import java.util.Arrays; +import java.util.UUID; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.BDDMockito.given; +import static org.mockito.Mockito.verify; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + +@WebMvcTest(CategoryController.class) +public class CategoryControllerTest { + + @Autowired + private MockMvc mockMvc; + + @MockBean + private CategoryService categoryService; + + @Autowired + private ObjectMapper objectMapper; + + Category category = new Category("yeet"); + + @Test + public void testGetAllCategories() throws Exception { + CategoryDto category1 = CategoryDtoMapper.toDto(category); + CategoryDto category2 = CategoryDtoMapper.toDto(category); + given(categoryService.getAllCategories()).willReturn(Arrays.asList(category1, category2)); + + mockMvc.perform(get("/api/v1/categories")) + .andExpect(status().isOk()) + .andExpect(content().json(objectMapper.writeValueAsString(Arrays.asList(category1, category2)))); + } + + @Test + public void testFetchCategoryByIdFound() throws Exception { + UUID id = UUID.randomUUID(); + CategoryDto category = CategoryDtoMapper.toDto(this.category); + given(categoryService.getCategoryById(id)).willReturn(category); + + mockMvc.perform(get("/api/v1/categories/id/{id}", id)) + .andExpect(status().isOk()) + .andExpect(content().json(objectMapper.writeValueAsString(category))); + } + + @Test + public void testFetchCategoryByIdNotFound() throws Exception { + UUID id = UUID.randomUUID(); + given(categoryService.getCategoryById(id)).willReturn(null); + + mockMvc.perform(get("/api/v1/categories/id/{id}", id)) + .andExpect(status().isNotFound()); + } + + @Test + public void testCreateCategory() throws Exception { + CategoryDto categoryDto = CategoryDtoMapper.toDto(category); + mockMvc.perform(post("/api/v1/categories") + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(categoryDto))) + .andExpect(status().isCreated()); + // Verify that the service method was called once + verify(categoryService).addCategory(any(CategoryDto.class)); + } +} \ No newline at end of file diff --git a/src/test/java/de/uni_passau/fim/PADAS/group3/DataDash/category/CategoryServiceTest.java b/src/test/java/de/uni_passau/fim/PADAS/group3/DataDash/category/CategoryServiceTest.java new file mode 100644 index 0000000..a06d189 --- /dev/null +++ b/src/test/java/de/uni_passau/fim/PADAS/group3/DataDash/category/CategoryServiceTest.java @@ -0,0 +1,68 @@ +package de.uni_passau.fim.PADAS.group3.DataDash.category; + +import static org.mockito.Mockito.*; +import static org.junit.jupiter.api.Assertions.*; + +import java.util.Arrays; +import java.util.List; +import java.util.UUID; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +public class CategoryServiceTest { + + @Mock + private CategoryRepository categoryRepository; + + @InjectMocks + private CategoryService categoryService; + + @BeforeEach + public void setUp() { + MockitoAnnotations.openMocks(this); + } + + @Test + public void testAddCategory() { + CategoryDto categoryDto = new CategoryDto("Test Category", UUID.randomUUID()); + categoryService.addCategory(categoryDto); + + verify(categoryRepository, times(1)).save(any(Category.class)); + } + + @Test + public void testGetAllCategories() { + when(categoryRepository.findAll()).thenReturn(Arrays.asList(new Category("Category 1"), new Category("Category 2"))); + + List categories = categoryService.getAllCategories(); + + assertNotNull(categories); + assertEquals(2, categories.size()); + } + + @Test + public void testGetCategoryByIdFound() { + UUID id = UUID.randomUUID(); + Category category = new Category("Test Category"); + when(categoryRepository.getCategoryById(id)).thenReturn(category); + + CategoryDto result = categoryService.getCategoryById(id); + + assertNotNull(result); + assertEquals("Test Category", result.getName()); + } + + @Test + public void testGetCategoryByIdNotFound() { + UUID id = UUID.randomUUID(); + when(categoryRepository.getCategoryById(id)).thenReturn(null); + + CategoryDto result = categoryService.getCategoryById(id); + + assertNull(result); + } +} \ No newline at end of file From aea23b0a6acd3b82268db258ab6fcbcc1cdbcce9 Mon Sep 17 00:00:00 2001 From: Erik Foris Date: Sat, 6 Jul 2024 13:08:37 +0200 Subject: [PATCH 2/6] refactor: optimize imports --- .../group3/DataDash/Dataset/DatasetControllerTests.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/test/java/de/uni_passau/fim/PADAS/group3/DataDash/Dataset/DatasetControllerTests.java b/src/test/java/de/uni_passau/fim/PADAS/group3/DataDash/Dataset/DatasetControllerTests.java index 06a22fc..634287a 100644 --- a/src/test/java/de/uni_passau/fim/PADAS/group3/DataDash/Dataset/DatasetControllerTests.java +++ b/src/test/java/de/uni_passau/fim/PADAS/group3/DataDash/Dataset/DatasetControllerTests.java @@ -1,8 +1,7 @@ package de.uni_passau.fim.PADAS.group3.DataDash.Dataset; import com.fasterxml.jackson.databind.ObjectMapper; -import de.uni_passau.fim.PADAS.group3.DataDash.Dataset.DatasetController; -import de.uni_passau.fim.PADAS.group3.DataDash.Dataset.DatasetService; + import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; @@ -10,13 +9,10 @@ import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.PageRequest; -import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.http.MediaType; import org.springframework.test.web.servlet.MockMvc; -import java.net.URL; -import java.time.LocalDate; import java.util.Arrays; import java.util.List; import java.util.UUID; From e94ead702675f71478a63b243613781459046ee3 Mon Sep 17 00:00:00 2001 From: Erik Foris Date: Sat, 6 Jul 2024 14:22:54 +0200 Subject: [PATCH 3/6] fix: use dto to make json structure stable --- .../fim/PADAS/group3/DataDash/controler/DatasetController.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/de/uni_passau/fim/PADAS/group3/DataDash/controler/DatasetController.java b/src/main/java/de/uni_passau/fim/PADAS/group3/DataDash/controler/DatasetController.java index 824c5ff..00c1756 100644 --- a/src/main/java/de/uni_passau/fim/PADAS/group3/DataDash/controler/DatasetController.java +++ b/src/main/java/de/uni_passau/fim/PADAS/group3/DataDash/controler/DatasetController.java @@ -11,15 +11,16 @@ import de.uni_passau.fim.PADAS.group3.DataDash.model.DatasetService; import de.uni_passau.fim.PADAS.group3.DataDash.model.Type; import org.springframework.data.domain.Pageable; import org.springframework.data.web.config.EnableSpringDataWebSupport; +import org.springframework.data.web.config.EnableSpringDataWebSupport.PageSerializationMode; import org.springframework.data.domain.Sort; import java.util.UUID; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; +@EnableSpringDataWebSupport(pageSerializationMode = PageSerializationMode.VIA_DTO) @RestController @RequestMapping("/api/v1/datasets") -@EnableSpringDataWebSupport public class DatasetController { @Autowired private DatasetService datasetService; From 7e08a507e4e3548f9b6358d7d84dd9249c0c006c Mon Sep 17 00:00:00 2001 From: Erik Foris Date: Sat, 6 Jul 2024 17:54:48 +0200 Subject: [PATCH 4/6] feat: Add CategoryRepositoryTests and DataRepositoryTests The code changes include adding new test classes CategoryRepositoryTests and DataRepositoryTests. These test classes are used to test the functionality of the CategoryRepository and DataRepository classes respectively. The CategoryRepositoryTests class contains tests for the findById, findByName, and findAll methods of the CategoryRepository class. The DataRepositoryTests class contains tests for the findByOptionalCriteria and getDatasetById methods of the DataRepository class. --- .../DataDash/Dataset/DataRepositoryTests.java | 80 +++++++++++++++++++ .../Dataset/DatasetControllerTests.java | 51 +++++++----- .../category/CategoryRepositoryTests.java | 56 +++++++++++++ 3 files changed, 165 insertions(+), 22 deletions(-) create mode 100644 src/test/java/de/uni_passau/fim/PADAS/group3/DataDash/Dataset/DataRepositoryTests.java create mode 100644 src/test/java/de/uni_passau/fim/PADAS/group3/DataDash/category/CategoryRepositoryTests.java diff --git a/src/test/java/de/uni_passau/fim/PADAS/group3/DataDash/Dataset/DataRepositoryTests.java b/src/test/java/de/uni_passau/fim/PADAS/group3/DataDash/Dataset/DataRepositoryTests.java new file mode 100644 index 0000000..3a8fa41 --- /dev/null +++ b/src/test/java/de/uni_passau/fim/PADAS/group3/DataDash/Dataset/DataRepositoryTests.java @@ -0,0 +1,80 @@ +package de.uni_passau.fim.PADAS.group3.DataDash.Dataset; + +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.data.domain.Page; +import org.springframework.data.domain.PageRequest; + +import java.util.Optional; + +import static org.assertj.core.api.Assertions.assertThat; + +@DataJpaTest +public class DataRepositoryTests { + + @Autowired + private dataRepository dataRepository; + + @BeforeEach + private void clearDatabase() { + dataRepository.deleteAll(); + } + + @Test + public void testFindByOptionalCriteria() { + // Prepare test data + Dataset dataset = new Dataset("title", "abst", "desc", "auth", null, null, Type.API, "MIT"); + dataRepository.save(dataset); + + // Execute the method under test + Page result = dataRepository.findByOptionalCriteria( + Optional.of("title"), Optional.empty(), Optional.empty(), Optional.empty(), + Optional.empty(), Optional.empty(), Optional.empty(), PageRequest.of(0, 10)); + + // Assertions + assertThat(result.getContent()).hasSize(1); + assertThat(result.getContent().get(0).getTitle()).isEqualTo("title"); + } + @Test + public void searchByOptionalCriteria() { + Dataset dataset1 = new Dataset("water", "abst", "desc", "auth", null, null, Type.API, "MIT"); + dataRepository.save(dataset1); + Dataset dataset = new Dataset("title1", "abst", "desc", "auth", null, null, Type.API, "MIT"); + dataRepository.save(dataset); + dataset = new Dataset("title1", "abst", "desc", "auth", null, null, Type.API, "MIT"); + dataRepository.save(dataset); + + Page result = dataRepository.searchByOptionalCriteria( + Optional.of("water"), Optional.empty(), PageRequest.of(0, 10)); + + assertThat(result.getContent()).hasSize(1); + assertThat(result.getContent().get(0).getTitle()).isEqualTo("water"); + } + @Test + public void searchByOptionalCriteriaMulti() { + Dataset dataset1 = new Dataset("title", "abst", "desc", "auth", null, null, Type.API, "MIT"); + dataRepository.save(dataset1); + Dataset dataset = new Dataset("title1", "abst", "desc", "auth", null, null, Type.API, "MIT"); + dataRepository.save(dataset); + dataset = new Dataset("title1", "abst", "desc", "auth", null, null, Type.API, "MIT"); + dataRepository.save(dataset); + + Page result = dataRepository.searchByOptionalCriteria( + Optional.of("title%"), Optional.empty(), PageRequest.of(0, 10)); + + assertThat(result.getContent()).hasSize(3); + } + + @Test + public void getDatasetById() { + Dataset dataset = new Dataset("title", "abst", "desc", "auth", null, null, Type.API, "MIT"); + dataset = dataRepository.save(dataset); + + Dataset result = dataRepository.getDatasetById(dataset.getId()); + + assertThat(result).isNotNull(); + assertThat(result.getTitle()).isEqualTo("title"); + } +} \ No newline at end of file diff --git a/src/test/java/de/uni_passau/fim/PADAS/group3/DataDash/Dataset/DatasetControllerTests.java b/src/test/java/de/uni_passau/fim/PADAS/group3/DataDash/Dataset/DatasetControllerTests.java index 634287a..8a3c7d9 100644 --- a/src/test/java/de/uni_passau/fim/PADAS/group3/DataDash/Dataset/DatasetControllerTests.java +++ b/src/test/java/de/uni_passau/fim/PADAS/group3/DataDash/Dataset/DatasetControllerTests.java @@ -45,9 +45,7 @@ public class DatasetControllerTests { @Test void getDatasetById_whenExists() throws Exception { UUID id = UUID.randomUUID(); - Dataset dataset = new Dataset("Title", "abst", "desc", "auth", null, null, Type.API, "MIT"); // Assuming a - // constructor or - // builder pattern + Dataset dataset = new Dataset("Title", "abst", "desc", "auth", null, null, Type.API, "MIT"); given(datasetService.getDatasetById(id)).willReturn(dataset); mockMvc.perform(get("/api/v1/datasets/id/" + id.toString())) @@ -233,68 +231,77 @@ public class DatasetControllerTests { @Test void searchDatasets_whenExists() throws Exception { - String keyword = "data"; + String keyword = "title%"; List datasets = Arrays.asList( - new Dataset("Title 1", "abst", "data", "auth", null, null, Type.API, "MIT"), - new Dataset("Title 2", "abst", "data", "auth", null, null, Type.API, "MIT")); - given(datasetService.searchByOptionalCriteria(keyword,null,null,PageRequest.of(0,20,Sort.by(Sort.Direction.DESC,"upvotes")))).willReturn(new PageImpl<>(datasets)); + new Dataset("Title 1", "abst", "data", "auth", null, null, Type.API, "MIT")); + // new Dataset("Title 2", "abst", "data", "auth", null, null, Type.API, "MIT")); - mockMvc.perform(get("/api/v1/datasets/search?searach=" + keyword)) - .andExpect(status().isOk()); - //TODO: Check output + Page page = new PageImpl<>(datasets); + given(datasetService.searchByOptionalCriteria(keyword, "%", "%", + PageRequest.of(0, 20, Sort.by(Sort.Direction.DESC, "upvotes")))).willReturn(page); + String s = objectMapper.writeValueAsString(page); + mockMvc.perform(get("/api/v1/datasets/search?search=" + keyword)) + .andExpect(status().isOk()) + .andExpect(content().json(s)); } @Test void searchDatasets_whenNotExists() throws Exception { String keyword = "nonexistent"; - given(datasetService.searchByOptionalCriteria(keyword,null,null,PageRequest.of(0,20,Sort.by(Sort.Direction.DESC,"upvotes")))).willReturn(Page.empty()); + given(datasetService.searchByOptionalCriteria(keyword, null, null, + PageRequest.of(0, 20, Sort.by(Sort.Direction.DESC, "upvotes")))).willReturn(Page.empty()); - mockMvc.perform(get("/api/v1/datasets/search?seaarch=" + keyword)) + mockMvc.perform(get("/api/v1/datasets/search?search=" + keyword)) .andExpect(status().isOk()); } @Test void searchDatasets_whenInvalidSort() throws Exception { String keyword = "data"; - given(datasetService.searchByOptionalCriteria(keyword,null,null,PageRequest.of(0,20,Sort.by(Sort.Direction.DESC,"upvotes")))).willReturn(Page.empty()); + given(datasetService.searchByOptionalCriteria(keyword, null, null, + PageRequest.of(0, 20, Sort.by(Sort.Direction.DESC, "upvotes")))).willReturn(Page.empty()); - mockMvc.perform(get("/api/v1/datasets/search?searach=" + keyword + "&sort=invalid")) + mockMvc.perform(get("/api/v1/datasets/search?search=" + keyword + "&sort=invalid")) .andExpect(status().isBadRequest()); } @Test void searchDatasets_whenInvalidDirection() throws Exception { String keyword = "data"; - given(datasetService.searchByOptionalCriteria(keyword,null,null,PageRequest.of(0,20,Sort.by(Sort.Direction.DESC,"upvotes")))).willReturn(Page.empty()); + given(datasetService.searchByOptionalCriteria(keyword, null, null, + PageRequest.of(0, 20, Sort.by(Sort.Direction.DESC, "upvotes")))).willReturn(Page.empty()); - mockMvc.perform(get("/api/v1/datasets/search?searach=" + keyword + "&direction=invalid")) + mockMvc.perform(get("/api/v1/datasets/search?search=" + keyword + "&direction=invalid")) .andExpect(status().isBadRequest()); } @Test void searchDatasets_whenInvalidPage() throws Exception { String keyword = "data"; - given(datasetService.searchByOptionalCriteria(keyword,null,null,PageRequest.of(0,20,Sort.by(Sort.Direction.DESC,"upvotes")))).willReturn(Page.empty()); + given(datasetService.searchByOptionalCriteria(keyword, null, null, + PageRequest.of(0, 20, Sort.by(Sort.Direction.DESC, "upvotes")))).willReturn(Page.empty()); - mockMvc.perform(get("/api/v1/datasets/search?searach=" + keyword + "&page=-1")) + mockMvc.perform(get("/api/v1/datasets/search?search=" + keyword + "&page=-1")) .andExpect(status().isBadRequest()); } @Test void searchDatasets_whenInvalidSize() throws Exception { String keyword = "data"; - given(datasetService.searchByOptionalCriteria(keyword,null,null,PageRequest.of(0,20,Sort.by(Sort.Direction.DESC,"upvotes")))).willReturn(Page.empty()); + given(datasetService.searchByOptionalCriteria(keyword, null, null, + PageRequest.of(0, 20, Sort.by(Sort.Direction.DESC, "upvotes")))).willReturn(Page.empty()); - mockMvc.perform(get("/api/v1/datasets/search?searach=" + keyword + "&size=-1")) + mockMvc.perform(get("/api/v1/datasets/search?search=" + keyword + "&size=-1")) .andExpect(status().isBadRequest()); } @Test void searchDatasets_whenInvalidSize2() throws Exception { String keyword = "data"; - given(datasetService.searchByOptionalCriteria(keyword,null,null,PageRequest.of(0,20,Sort.by(Sort.Direction.DESC,"upvotes")))).willReturn(Page.empty()); + given(datasetService.searchByOptionalCriteria(keyword, null, null, + PageRequest.of(0, 20, Sort.by(Sort.Direction.DESC, "upvotes")))).willReturn(Page.empty()); - mockMvc.perform(get("/api/v1/datasets/search?searach=" + keyword + "&size=0")) + mockMvc.perform(get("/api/v1/datasets/search?search=" + keyword + "&size=0")) .andExpect(status().isBadRequest()); } diff --git a/src/test/java/de/uni_passau/fim/PADAS/group3/DataDash/category/CategoryRepositoryTests.java b/src/test/java/de/uni_passau/fim/PADAS/group3/DataDash/category/CategoryRepositoryTests.java new file mode 100644 index 0000000..2330d6c --- /dev/null +++ b/src/test/java/de/uni_passau/fim/PADAS/group3/DataDash/category/CategoryRepositoryTests.java @@ -0,0 +1,56 @@ +package de.uni_passau.fim.PADAS.group3.DataDash.category; + +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 java.util.List; +import java.util.Optional; + +import static org.assertj.core.api.Assertions.assertThat; + +@DataJpaTest +public class CategoryRepositoryTests { + + @Autowired + private CategoryRepository categoryRepository; + + private Category savedCategory; + + @BeforeEach + public void setup() { + // Setup data for each test + Category category = new Category(); + category.setName("Test Category"); + // Assuming Category class has a setName method and an ID that is auto-generated + savedCategory = categoryRepository.save(category); + } + + @Test + public void whenFindById_thenReturnCategory() { + Optional foundCategory = categoryRepository.findById(savedCategory.getId()); + assertThat(foundCategory).isPresent(); + assertThat(foundCategory.get().getId()).isEqualTo(savedCategory.getId()); + } + + @Test + public void whenFindByName_thenReturnCategoryList() { + List categories = categoryRepository.findByName("Test Category"); + assertThat(categories).hasSize(1); + assertThat(categories.get(0).getName()).isEqualTo("Test Category"); + } + + @Test + public void whenFindAll_thenReturnAllCategories() { + List categories = categoryRepository.findAll(); + assertThat(categories).isNotEmpty(); + } + + @Test + public void whenGetCategoryById_thenReturnCategory() { + Category foundCategory = categoryRepository.getCategoryById(savedCategory.getId()); + assertThat(foundCategory).isNotNull(); + assertThat(foundCategory.getId()).isEqualTo(savedCategory.getId()); + } +} \ No newline at end of file From 603517d1872e3761e9b6ebdb73daff18a3b28876 Mon Sep 17 00:00:00 2001 From: Erik Foris Date: Sat, 6 Jul 2024 17:57:52 +0200 Subject: [PATCH 5/6] feat: Remove unused methods in dataRepository and CategoryRepository --- .../DataDash/Dataset/dataRepository.java | 26 ------------------- .../DataDash/category/CategoryRepository.java | 2 +- 2 files changed, 1 insertion(+), 27 deletions(-) diff --git a/src/main/java/de/uni_passau/fim/PADAS/group3/DataDash/Dataset/dataRepository.java b/src/main/java/de/uni_passau/fim/PADAS/group3/DataDash/Dataset/dataRepository.java index c896552..65cfd0e 100644 --- a/src/main/java/de/uni_passau/fim/PADAS/group3/DataDash/Dataset/dataRepository.java +++ b/src/main/java/de/uni_passau/fim/PADAS/group3/DataDash/Dataset/dataRepository.java @@ -17,32 +17,6 @@ public interface dataRepository extends JpaRepository { Dataset getDatasetById(UUID id); - List findByTitle(String title); - - List findByTitleLike(String title); - - List findByAuthorLike(String author); - - List findByType(Type type); - - List findByAuthor(String author); - - List findByAbstLike(String abst); - - List findByDescriptionLike(String description); - - List findByRaitingGreaterThan(float raiting); - - List findByVotesGreaterThan(int votes); - - List findByDateAfter(Date date); - - List findByDateBefore(Date date); - - List findByCategorie(Category categorie); - - List findByDateBetween(Date date1, Date date2); - @SuppressWarnings("null") Page findAll(Pageable pageable); diff --git a/src/main/java/de/uni_passau/fim/PADAS/group3/DataDash/category/CategoryRepository.java b/src/main/java/de/uni_passau/fim/PADAS/group3/DataDash/category/CategoryRepository.java index acde965..38e84c6 100644 --- a/src/main/java/de/uni_passau/fim/PADAS/group3/DataDash/category/CategoryRepository.java +++ b/src/main/java/de/uni_passau/fim/PADAS/group3/DataDash/category/CategoryRepository.java @@ -17,4 +17,4 @@ public interface CategoryRepository extends JpaRepository{ @SuppressWarnings("null") Optional findById(UUID id); -} +} \ No newline at end of file From 69afb590d48abb7d91d51ba2313789cf22d11e6c Mon Sep 17 00:00:00 2001 From: Erik Foris Date: Sat, 6 Jul 2024 18:26:54 +0200 Subject: [PATCH 6/6] chore: Remove unused imports in DatasetController, DatasetService, and dataRepository --- .../fim/PADAS/group3/DataDash/Dataset/DatasetController.java | 2 -- .../fim/PADAS/group3/DataDash/Dataset/DatasetService.java | 1 - .../fim/PADAS/group3/DataDash/Dataset/dataRepository.java | 2 -- 3 files changed, 5 deletions(-) diff --git a/src/main/java/de/uni_passau/fim/PADAS/group3/DataDash/Dataset/DatasetController.java b/src/main/java/de/uni_passau/fim/PADAS/group3/DataDash/Dataset/DatasetController.java index b118dab..a844374 100644 --- a/src/main/java/de/uni_passau/fim/PADAS/group3/DataDash/Dataset/DatasetController.java +++ b/src/main/java/de/uni_passau/fim/PADAS/group3/DataDash/Dataset/DatasetController.java @@ -15,8 +15,6 @@ import java.util.UUID; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; -import de.uni_passau.fim.PADAS.group3.DataDash.category.Category; - @EnableSpringDataWebSupport(pageSerializationMode = PageSerializationMode.VIA_DTO) @RestController @RequestMapping("/api/v1/datasets") diff --git a/src/main/java/de/uni_passau/fim/PADAS/group3/DataDash/Dataset/DatasetService.java b/src/main/java/de/uni_passau/fim/PADAS/group3/DataDash/Dataset/DatasetService.java index 93d1388..52e6ef6 100644 --- a/src/main/java/de/uni_passau/fim/PADAS/group3/DataDash/Dataset/DatasetService.java +++ b/src/main/java/de/uni_passau/fim/PADAS/group3/DataDash/Dataset/DatasetService.java @@ -1,7 +1,6 @@ package de.uni_passau.fim.PADAS.group3.DataDash.Dataset; import java.time.LocalDate; -import java.util.List; import java.util.Optional; import java.util.UUID; diff --git a/src/main/java/de/uni_passau/fim/PADAS/group3/DataDash/Dataset/dataRepository.java b/src/main/java/de/uni_passau/fim/PADAS/group3/DataDash/Dataset/dataRepository.java index 65cfd0e..b983df2 100644 --- a/src/main/java/de/uni_passau/fim/PADAS/group3/DataDash/Dataset/dataRepository.java +++ b/src/main/java/de/uni_passau/fim/PADAS/group3/DataDash/Dataset/dataRepository.java @@ -1,9 +1,7 @@ package de.uni_passau.fim.PADAS.group3.DataDash.Dataset; -import java.util.List; import java.util.Optional; import java.util.UUID; -import java.sql.Date; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable;