package enseirb.myinpulse; import static enseirb.myinpulse.model.ProjectDecisionValue.*; import static org.junit.jupiter.api.Assertions.*; import enseirb.myinpulse.model.Administrator; import enseirb.myinpulse.model.Project; import enseirb.myinpulse.model.ProjectDecision; import enseirb.myinpulse.service.AdminApiService; import enseirb.myinpulse.service.database.AdministratorService; import enseirb.myinpulse.service.database.ProjectService; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.server.ResponseStatusException; import java.time.LocalDate; import java.util.ArrayList; import java.util.List; @SpringBootTest @Transactional public class AdminApiServiceTest { private static long administratorid; @Autowired private AdminApiService adminApiService; @Autowired private ProjectService projectService; @BeforeAll static void setup( @Autowired AdministratorService administratorService, @Autowired ProjectService projectService) { administratorService.addAdministrator( new Administrator( "admin", "admin", "testAdminEmpty@example.com", "testAdmin@example.com", "")); Administrator a = administratorService.addAdministrator( new Administrator( "admin2", "admin2", "testAdminFull@example.com", "testAdmin@example.com", "")); administratorid = a.getIdUser(); projectService.addNewProject( new Project( "sampleProjectAdminApiService", null, LocalDate.now(), ACTIVE, administratorService.getAdministratorByPrimaryMain( "testAdminFull@example.com"))); } private List IterableToList(Iterable iterable) { List l = new ArrayList<>(); iterable.forEach(l::add); return l; } @Test void getProjectOfAdminIsEmpty() { Iterable projects = adminApiService.getProjectsOfAdmin("testAdminEmpty@example.com"); assertEquals(0, IterableToList(projects).size()); } @Test void getProjectOfInexistantAdminFails() { String nonExistentAdminEmail = "testInexistantAdmin@example.com"; assertThrows( ResponseStatusException.class, () -> { adminApiService.getProjectsOfAdmin(nonExistentAdminEmail); }); } @Test void getProjectOfAdminNotEmpty() { Iterable projects = adminApiService.getProjectsOfAdmin("testAdminFull@example.com"); List l = IterableToList(projects); assertEquals(1, l.size()); Project p = l.getFirst(); assertEquals(p.getProjectName(), "sampleProjectAdminApiService"); } @Test void getPendingProjectsEmpty() { assertEquals(0, IterableToList(this.adminApiService.getPendingProjects()).size()); } @Test void getPendingProjectsNotEmpty() { this.projectService.addNewProject( new Project( "PendingProjectAdminApiService1", null, LocalDate.now(), PENDING, null)); this.projectService.addNewProject( new Project( "PendingProjectAdminApiService2", null, LocalDate.now(), PENDING, null)); Iterable pendingProjects = this.adminApiService.getPendingProjects(); List pendingProjectsList = IterableToList(pendingProjects); assertEquals(2, pendingProjectsList.size()); assertTrue( List.of("PendingProjectAdminApiService1", "PendingProjectAdminApiService2") .contains(pendingProjectsList.getFirst().getProjectName())); assertTrue( List.of("PendingProjectAdminApiService1", "PendingProjectAdminApiService2") .contains(pendingProjectsList.getLast().getProjectName())); } @Test void validateInexistantProject() { ProjectDecision d = new ProjectDecision(-1, 0, 1); assertThrows(ResponseStatusException.class, () -> this.adminApiService.validateProject(d)); } @Test void validateExistantProject() { Project p = new Project("PendingProjectAdminApiService2", null, LocalDate.now(), PENDING, null); this.projectService.addNewProject(p); assertEquals(PENDING, p.getProjectStatus()); ProjectDecision d = new ProjectDecision(p.getIdProject(), administratorid, 1); this.adminApiService.validateProject(d); assertEquals(ACTIVE, p.getProjectStatus()); // Check if the project was really updated in the database assertEquals(0, IterableToList(this.adminApiService.getPendingProjects()).size()); } @Test void refuseExistantProject() { Project p = new Project("PendingProjectAdminApiService2", null, LocalDate.now(), PENDING, null); this.projectService.addNewProject(p); assertEquals(PENDING, p.getProjectStatus()); ProjectDecision d = new ProjectDecision(p.getIdProject(), administratorid, 0); this.adminApiService.validateProject(d); assertEquals(REJECTED, p.getProjectStatus()); // Check if the project was really updated in the database assertEquals(0, IterableToList(this.adminApiService.getPendingProjects()).size()); } @Test void addProject() { assertEquals(0, IterableToList(this.adminApiService.getPendingProjects()).size()); Project p1 = new Project("PendingProjectAdminApiService2", null, LocalDate.now(), PENDING, null); this.adminApiService.addNewProject(p1); assertEquals(1, IterableToList(this.adminApiService.getPendingProjects()).size()); } @Test void addDuplicateProject() { Project p1 = new Project("PendingProjectAdminApiService2", null, LocalDate.now(), PENDING, null); Project p2 = new Project("PendingProjectAdminApiService2", null, LocalDate.now(), PENDING, null); this.adminApiService.addNewProject(p1); assertThrows(ResponseStatusException.class, () -> this.adminApiService.addNewProject(p2)); } }