Compare commits
	
		
			2 commits
		
	
	
		
			
				main
			
			...
			
				tests/incr
			
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 0fb924f93d | |||
| 66f3b0da4c | 
					 49 changed files with 208 additions and 1154 deletions
				
			
		|  | @ -3,7 +3,7 @@ plugins { | ||||||
|     id("org.springframework.boot") version "3.3.4" |     id("org.springframework.boot") version "3.3.4" | ||||||
|     id("io.spring.dependency-management") version "1.1.6" |     id("io.spring.dependency-management") version "1.1.6" | ||||||
|     id("checkstyle") |     id("checkstyle") | ||||||
|     id("org.sonarqube") version "6.0.1.5171" |     id("org.sonarqube") version "5.1.0.4882" | ||||||
|     id("jacoco") |     id("jacoco") | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -6,10 +6,10 @@ Content-Type: application/json | ||||||
| { | { | ||||||
|   "name": "name", |   "name": "name", | ||||||
|   "leading_employee": 1, |   "leading_employee": 1, | ||||||
|   "employees": [312], |   "employees": [2, 3], | ||||||
|   "contractor": 4, |   "contractor": 4, | ||||||
|   "contractor_name": "Peter File", |   "contractor_name": "Peter File", | ||||||
|   "comment": "goal of project", |   "comment": "goal of project", | ||||||
|   "start_date": "02.01.2020", |   "start_date": "01.01.2000", | ||||||
|   "planned_end_date": "01.01.2023" |   "planned_end_date": "01.01.2001" | ||||||
| } | } | ||||||
|  | @ -1,15 +0,0 @@ | ||||||
| POST https://employee.szut.dev/employees |  | ||||||
| Authorization: Bearer {{auth_token}} |  | ||||||
| Content-Type: application/json |  | ||||||
| 
 |  | ||||||
| { |  | ||||||
|   "firstName": "Jan1", |  | ||||||
|   "lastName": "Klattenhoff1", |  | ||||||
|   "street": "Pirolweg 171", |  | ||||||
|   "postcode": "27777", |  | ||||||
|   "city": "Gandakersee1", |  | ||||||
|   "phone": "0176849848161", |  | ||||||
|   "skillSet": [ |  | ||||||
|     "1" |  | ||||||
|   ] |  | ||||||
| } |  | ||||||
|  | @ -1,2 +0,0 @@ | ||||||
| DELETE https://employee.szut.dev/employees/310 |  | ||||||
| Authorization: Bearer {{auth_token}} |  | ||||||
|  | @ -1,2 +0,0 @@ | ||||||
| GET https://employee.szut.dev/employees |  | ||||||
| Authorization: Bearer {{auth_token}} |  | ||||||
|  | @ -1,2 +0,0 @@ | ||||||
| GET https://employee.szut.dev/employees/315 |  | ||||||
| Authorization: Bearer {{auth_token}} |  | ||||||
|  | @ -1,3 +0,0 @@ | ||||||
| GET http://localhost:8080/employees/315/projects |  | ||||||
| Authorization: Bearer {{auth_token}} |  | ||||||
| Content-Type: application/json |  | ||||||
|  | @ -1,2 +0,0 @@ | ||||||
| POST http://localhost:8080/projects/1/employees/312 |  | ||||||
| Authorization: Bearer {{auth_token}} |  | ||||||
|  | @ -1,2 +0,0 @@ | ||||||
| GET http://localhost:8080/projects/2/employees |  | ||||||
| Authorization: Bearer {{auth_token}} |  | ||||||
|  | @ -1,73 +0,0 @@ | ||||||
| package de.szut.lf8_starter.employee; |  | ||||||
| 
 |  | ||||||
| import de.szut.lf8_starter.exceptionHandling.ResourceNotFoundException; |  | ||||||
| import de.szut.lf8_starter.project.ProjectEntity; |  | ||||||
| import de.szut.lf8_starter.project.ProjectRepository; |  | ||||||
| import de.szut.lf8_starter.project.dto.employee.GetEmployeeDto; |  | ||||||
| import de.szut.lf8_starter.project.dto.project.GetProjectDto; |  | ||||||
| import de.szut.lf8_starter.project.mapper.ProjectMapper; |  | ||||||
| import org.springframework.http.HttpEntity; |  | ||||||
| import org.springframework.http.HttpHeaders; |  | ||||||
| import org.springframework.http.HttpMethod; |  | ||||||
| import org.springframework.stereotype.Service; |  | ||||||
| import org.springframework.web.client.HttpClientErrorException; |  | ||||||
| import org.springframework.web.client.RestTemplate; |  | ||||||
| 
 |  | ||||||
| import java.util.ArrayList; |  | ||||||
| import java.util.List; |  | ||||||
| 
 |  | ||||||
| @Service |  | ||||||
| public class EmployeeService { |  | ||||||
|     private final RestTemplate restTemplate; |  | ||||||
|     private final ProjectRepository projectRepository; |  | ||||||
|     private final ProjectMapper projectMapper; |  | ||||||
| 
 |  | ||||||
|     public EmployeeService(RestTemplate restTemplate, ProjectRepository projectRepository, ProjectMapper projectMapper) { |  | ||||||
|         this.restTemplate = restTemplate; |  | ||||||
|         this.projectRepository = projectRepository; |  | ||||||
|         this.projectMapper = projectMapper; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     public boolean employeeExists(String accessToken, Long employeeId) { |  | ||||||
|         HttpHeaders headers = new HttpHeaders(); |  | ||||||
|         headers.setBearerAuth(accessToken.replace("Bearer ", "")); |  | ||||||
| 
 |  | ||||||
|         HttpEntity<String> requestEntity = new HttpEntity<>(headers); |  | ||||||
| 
 |  | ||||||
|         String url = "https://employee.szut.dev/employees/" + employeeId; |  | ||||||
| 
 |  | ||||||
|         try { |  | ||||||
|             restTemplate.exchange(url, HttpMethod.GET, requestEntity, String.class); |  | ||||||
|         } catch (HttpClientErrorException.NotFound e) { |  | ||||||
|             return false; |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         return true; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     public GetEmployeeDto getEmployee(String accessToken, Long employeeId) { |  | ||||||
|         HttpHeaders headers = new HttpHeaders(); |  | ||||||
|         headers.setBearerAuth(accessToken.replace("Bearer ", "")); |  | ||||||
| 
 |  | ||||||
|         HttpEntity<String> requestEntity = new HttpEntity<>(headers); |  | ||||||
| 
 |  | ||||||
|         String url = "https://employee.szut.dev/employees/" + employeeId; |  | ||||||
| 
 |  | ||||||
|         try { |  | ||||||
|             return restTemplate.exchange(url, HttpMethod.GET, requestEntity, GetEmployeeDto.class).getBody(); |  | ||||||
|         } catch (HttpClientErrorException.NotFound e) { |  | ||||||
|             throw new ResourceNotFoundException("Employee not found"); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     public List<GetProjectDto> getProjects(Long employeeId) { |  | ||||||
|         ArrayList<ProjectEntity> projects = this.projectRepository.findAllByEmployeeId(employeeId); |  | ||||||
|         ArrayList<GetProjectDto> projectDtos = new ArrayList<>(); |  | ||||||
| 
 |  | ||||||
|         for (ProjectEntity project : projects) { |  | ||||||
|             projectDtos.add(this.projectMapper.mapToGetDto(project)); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         return projectDtos; |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  | @ -30,7 +30,7 @@ public class GlobalExceptionHandler { | ||||||
|     @ExceptionHandler(Exception.class) |     @ExceptionHandler(Exception.class) | ||||||
|     public ResponseEntity<ErrorDetails> handleAllOtherExceptions(Exception ex, WebRequest request) { |     public ResponseEntity<ErrorDetails> handleAllOtherExceptions(Exception ex, WebRequest request) { | ||||||
|         ErrorDetails errorDetails = new ErrorDetails(new Date(), ex.getClass() + " " + ex.getMessage(), request.getDescription(false)); |         ErrorDetails errorDetails = new ErrorDetails(new Date(), ex.getClass() + " " + ex.getMessage(), request.getDescription(false)); | ||||||
|          | 
 | ||||||
|         return new ResponseEntity<>(errorDetails, HttpStatus.INTERNAL_SERVER_ERROR); |         return new ResponseEntity<>(errorDetails, HttpStatus.INTERNAL_SERVER_ERROR); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -25,7 +25,7 @@ public class ProjectEntity { | ||||||
| 
 | 
 | ||||||
|     private long leadingEmployee; |     private long leadingEmployee; | ||||||
| 
 | 
 | ||||||
|     @ElementCollection(fetch = FetchType.EAGER) |     @ElementCollection | ||||||
|     private List<Long> employees; |     private List<Long> employees; | ||||||
| 
 | 
 | ||||||
|     private long contractor; |     private long contractor; | ||||||
|  |  | ||||||
|  | @ -1,9 +1,8 @@ | ||||||
| package de.szut.lf8_starter.project.mapper; | package de.szut.lf8_starter.project; | ||||||
| 
 | 
 | ||||||
| import de.szut.lf8_starter.project.ProjectEntity; | import de.szut.lf8_starter.project.dto.CreateProjectDto; | ||||||
| import de.szut.lf8_starter.project.dto.project.CreateProjectDto; | import de.szut.lf8_starter.project.dto.GetProjectDto; | ||||||
| import de.szut.lf8_starter.project.dto.project.GetProjectDto; | import de.szut.lf8_starter.project.dto.UpdateProjectDto; | ||||||
| import de.szut.lf8_starter.project.dto.project.UpdateProjectDto; |  | ||||||
| import org.springframework.stereotype.Service; | import org.springframework.stereotype.Service; | ||||||
| 
 | 
 | ||||||
| @Service | @Service | ||||||
|  | @ -1,14 +1,8 @@ | ||||||
| package de.szut.lf8_starter.project; | package de.szut.lf8_starter.project; | ||||||
| 
 | 
 | ||||||
| import org.springframework.data.jpa.repository.JpaRepository; | import org.springframework.data.jpa.repository.JpaRepository; | ||||||
| import org.springframework.data.jpa.repository.Query; |  | ||||||
| import org.springframework.data.repository.query.Param; |  | ||||||
| import org.springframework.stereotype.Repository; | import org.springframework.stereotype.Repository; | ||||||
| 
 | 
 | ||||||
| import java.util.ArrayList; |  | ||||||
| 
 |  | ||||||
| @Repository | @Repository | ||||||
| public interface ProjectRepository extends JpaRepository<ProjectEntity, Long> { | public interface ProjectRepository extends JpaRepository<ProjectEntity, Long> { | ||||||
|     @Query("SELECT p FROM ProjectEntity p WHERE :employeeId MEMBER OF p.employees") |  | ||||||
|     ArrayList<ProjectEntity> findAllByEmployeeId(@Param("employeeId") Long employeeId); |  | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -1,6 +1,5 @@ | ||||||
| package de.szut.lf8_starter.project; | package de.szut.lf8_starter.project; | ||||||
| 
 | 
 | ||||||
| import de.szut.lf8_starter.project.dto.project.GetProjectDto; |  | ||||||
| import org.springframework.stereotype.Service; | import org.springframework.stereotype.Service; | ||||||
| 
 | 
 | ||||||
| import java.util.List; | import java.util.List; | ||||||
|  | @ -26,25 +25,13 @@ public class ProjectService { | ||||||
|         return projectRepository.findById(id); |         return projectRepository.findById(id); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public void update(ProjectEntity project) { |     public ProjectEntity update(ProjectEntity project) { | ||||||
|         this.projectRepository.save(project); |         this.projectRepository.save(project); | ||||||
|  | 
 | ||||||
|  |         return project; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public void delete(Long id) { |     public void delete(Long id) { | ||||||
|         this.projectRepository.deleteById(id); |         this.projectRepository.deleteById(id); | ||||||
|     } |     } | ||||||
| 
 |  | ||||||
|     public boolean isOverlapping(GetProjectDto getProjectDto, ProjectEntity existingProjectEntity) { |  | ||||||
|         return isDateRangeOverlapping(getProjectDto, existingProjectEntity) || isDateEqual(getProjectDto, existingProjectEntity); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     private boolean isDateRangeOverlapping(GetProjectDto getProjectDto, ProjectEntity existingProjectEntity) { |  | ||||||
|         return getProjectDto.getStartDate().isBefore(existingProjectEntity.getPlannedEndDate()) |  | ||||||
|                 && getProjectDto.getPlannedEndDate().isAfter(existingProjectEntity.getStartDate()); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     private boolean isDateEqual(GetProjectDto getProjectDto, ProjectEntity existingProjectEntity) { |  | ||||||
|         return getProjectDto.getStartDate().isEqual(existingProjectEntity.getStartDate()) |  | ||||||
|                 || getProjectDto.getPlannedEndDate().isEqual(existingProjectEntity.getPlannedEndDate()); |  | ||||||
|     } |  | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -0,0 +1,42 @@ | ||||||
|  | package de.szut.lf8_starter.project.action; | ||||||
|  | 
 | ||||||
|  | import de.szut.lf8_starter.project.ProjectEntity; | ||||||
|  | import de.szut.lf8_starter.project.ProjectMapper; | ||||||
|  | import de.szut.lf8_starter.project.ProjectService; | ||||||
|  | import de.szut.lf8_starter.project.dto.CreateProjectDto; | ||||||
|  | import de.szut.lf8_starter.project.dto.GetProjectDto; | ||||||
|  | import io.swagger.v3.oas.annotations.Operation; | ||||||
|  | import io.swagger.v3.oas.annotations.media.Content; | ||||||
|  | import io.swagger.v3.oas.annotations.media.Schema; | ||||||
|  | import io.swagger.v3.oas.annotations.responses.ApiResponse; | ||||||
|  | import io.swagger.v3.oas.annotations.responses.ApiResponses; | ||||||
|  | import jakarta.validation.Valid; | ||||||
|  | import org.springframework.http.HttpStatus; | ||||||
|  | import org.springframework.web.bind.annotation.*; | ||||||
|  | 
 | ||||||
|  | @RestController | ||||||
|  | @RequestMapping(value = "/projects") | ||||||
|  | public class CreateProjectAction { | ||||||
|  |     private final ProjectService projectService; | ||||||
|  |     private final ProjectMapper projectMapper; | ||||||
|  | 
 | ||||||
|  |     public CreateProjectAction(ProjectService projectService, ProjectMapper mappingService) { | ||||||
|  |         this.projectService = projectService; | ||||||
|  |         this.projectMapper = mappingService; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Operation(summary = "Creates a new Project") | ||||||
|  |     @ApiResponses(value = { | ||||||
|  |             @ApiResponse(responseCode = "201", description = "created project", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = GetProjectDto.class))}), | ||||||
|  |             @ApiResponse(responseCode = "400", description = "invalid JSON posted", content = @Content), | ||||||
|  |             @ApiResponse(responseCode = "401", description = "not authorized", content = @Content)}) | ||||||
|  |     @PostMapping | ||||||
|  |     @ResponseStatus(code = HttpStatus.CREATED) | ||||||
|  |     public GetProjectDto create(@RequestBody @Valid CreateProjectDto createProjectDto) { | ||||||
|  |         ProjectEntity projectEntity = this.projectMapper.mapCreateDtoToEntity(createProjectDto); | ||||||
|  | 
 | ||||||
|  |         projectEntity = this.projectService.create(projectEntity); | ||||||
|  | 
 | ||||||
|  |         return this.projectMapper.mapToGetDto(projectEntity); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | @ -1,8 +1,8 @@ | ||||||
| package de.szut.lf8_starter.project.action.crud; | package de.szut.lf8_starter.project.action; | ||||||
| 
 | 
 | ||||||
|  | import de.szut.lf8_starter.project.ProjectMapper; | ||||||
| import de.szut.lf8_starter.project.ProjectService; | import de.szut.lf8_starter.project.ProjectService; | ||||||
| import de.szut.lf8_starter.project.dto.project.GetProjectDto; | import de.szut.lf8_starter.project.dto.GetProjectDto; | ||||||
| import de.szut.lf8_starter.project.mapper.ProjectMapper; |  | ||||||
| import io.swagger.v3.oas.annotations.Operation; | import io.swagger.v3.oas.annotations.Operation; | ||||||
| import io.swagger.v3.oas.annotations.media.Content; | import io.swagger.v3.oas.annotations.media.Content; | ||||||
| import io.swagger.v3.oas.annotations.media.Schema; | import io.swagger.v3.oas.annotations.media.Schema; | ||||||
|  | @ -1,9 +1,9 @@ | ||||||
| package de.szut.lf8_starter.project.action.crud; | package de.szut.lf8_starter.project.action; | ||||||
| 
 | 
 | ||||||
| import de.szut.lf8_starter.project.ProjectEntity; | import de.szut.lf8_starter.project.ProjectEntity; | ||||||
|  | import de.szut.lf8_starter.project.ProjectMapper; | ||||||
| import de.szut.lf8_starter.project.ProjectService; | import de.szut.lf8_starter.project.ProjectService; | ||||||
| import de.szut.lf8_starter.project.dto.project.GetProjectDto; | import de.szut.lf8_starter.project.dto.GetProjectDto; | ||||||
| import de.szut.lf8_starter.project.mapper.ProjectMapper; |  | ||||||
| import io.swagger.v3.oas.annotations.Operation; | import io.swagger.v3.oas.annotations.Operation; | ||||||
| import io.swagger.v3.oas.annotations.media.Content; | import io.swagger.v3.oas.annotations.media.Content; | ||||||
| import io.swagger.v3.oas.annotations.media.Schema; | import io.swagger.v3.oas.annotations.media.Schema; | ||||||
|  | @ -11,10 +11,7 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse; | ||||||
| import io.swagger.v3.oas.annotations.responses.ApiResponses; | import io.swagger.v3.oas.annotations.responses.ApiResponses; | ||||||
| import org.springframework.http.HttpStatus; | import org.springframework.http.HttpStatus; | ||||||
| import org.springframework.http.ResponseEntity; | import org.springframework.http.ResponseEntity; | ||||||
| import org.springframework.web.bind.annotation.GetMapping; | import org.springframework.web.bind.annotation.*; | ||||||
| import org.springframework.web.bind.annotation.PathVariable; |  | ||||||
| import org.springframework.web.bind.annotation.RequestMapping; |  | ||||||
| import org.springframework.web.bind.annotation.RestController; |  | ||||||
| 
 | 
 | ||||||
| import java.util.Optional; | import java.util.Optional; | ||||||
| 
 | 
 | ||||||
|  | @ -1,18 +1,15 @@ | ||||||
| package de.szut.lf8_starter.project.action.crud; | package de.szut.lf8_starter.project.action; | ||||||
| 
 | 
 | ||||||
| import de.szut.lf8_starter.project.ProjectEntity; | import de.szut.lf8_starter.project.ProjectEntity; | ||||||
| import de.szut.lf8_starter.project.ProjectService; | import de.szut.lf8_starter.project.ProjectService; | ||||||
| import de.szut.lf8_starter.project.dto.project.GetProjectDto; | import de.szut.lf8_starter.project.dto.GetProjectDto; | ||||||
| import io.swagger.v3.oas.annotations.Operation; | import io.swagger.v3.oas.annotations.Operation; | ||||||
| import io.swagger.v3.oas.annotations.media.Content; | import io.swagger.v3.oas.annotations.media.Content; | ||||||
| import io.swagger.v3.oas.annotations.responses.ApiResponse; | import io.swagger.v3.oas.annotations.responses.ApiResponse; | ||||||
| import io.swagger.v3.oas.annotations.responses.ApiResponses; | import io.swagger.v3.oas.annotations.responses.ApiResponses; | ||||||
| import org.springframework.http.HttpStatus; | import org.springframework.http.HttpStatus; | ||||||
| import org.springframework.http.ResponseEntity; | import org.springframework.http.ResponseEntity; | ||||||
| import org.springframework.web.bind.annotation.DeleteMapping; | import org.springframework.web.bind.annotation.*; | ||||||
| import org.springframework.web.bind.annotation.PathVariable; |  | ||||||
| import org.springframework.web.bind.annotation.RequestMapping; |  | ||||||
| import org.springframework.web.bind.annotation.RestController; |  | ||||||
| 
 | 
 | ||||||
| import java.util.Optional; | import java.util.Optional; | ||||||
| 
 | 
 | ||||||
|  | @ -1,10 +1,10 @@ | ||||||
| package de.szut.lf8_starter.project.action.crud; | package de.szut.lf8_starter.project.action; | ||||||
| 
 | 
 | ||||||
| import de.szut.lf8_starter.project.ProjectEntity; | import de.szut.lf8_starter.project.ProjectEntity; | ||||||
|  | import de.szut.lf8_starter.project.ProjectMapper; | ||||||
| import de.szut.lf8_starter.project.ProjectService; | import de.szut.lf8_starter.project.ProjectService; | ||||||
| import de.szut.lf8_starter.project.dto.project.GetProjectDto; | import de.szut.lf8_starter.project.dto.GetProjectDto; | ||||||
| import de.szut.lf8_starter.project.dto.project.UpdateProjectDto; | import de.szut.lf8_starter.project.dto.UpdateProjectDto; | ||||||
| import de.szut.lf8_starter.project.mapper.ProjectMapper; |  | ||||||
| import io.swagger.v3.oas.annotations.Operation; | import io.swagger.v3.oas.annotations.Operation; | ||||||
| import io.swagger.v3.oas.annotations.media.Content; | import io.swagger.v3.oas.annotations.media.Content; | ||||||
| import io.swagger.v3.oas.annotations.media.Schema; | import io.swagger.v3.oas.annotations.media.Schema; | ||||||
|  | @ -1,63 +0,0 @@ | ||||||
| package de.szut.lf8_starter.project.action.crud; |  | ||||||
| 
 |  | ||||||
| import de.szut.lf8_starter.employee.EmployeeService; |  | ||||||
| import de.szut.lf8_starter.project.ProjectEntity; |  | ||||||
| import de.szut.lf8_starter.project.ProjectService; |  | ||||||
| import de.szut.lf8_starter.project.dto.project.CreateProjectDto; |  | ||||||
| import de.szut.lf8_starter.project.dto.project.GetProjectDto; |  | ||||||
| import de.szut.lf8_starter.project.mapper.ProjectMapper; |  | ||||||
| import io.swagger.v3.oas.annotations.Operation; |  | ||||||
| import io.swagger.v3.oas.annotations.media.Content; |  | ||||||
| import io.swagger.v3.oas.annotations.media.Schema; |  | ||||||
| import io.swagger.v3.oas.annotations.responses.ApiResponse; |  | ||||||
| import io.swagger.v3.oas.annotations.responses.ApiResponses; |  | ||||||
| import jakarta.validation.Valid; |  | ||||||
| import org.springframework.http.HttpStatus; |  | ||||||
| import org.springframework.http.ResponseEntity; |  | ||||||
| import org.springframework.web.bind.annotation.*; |  | ||||||
| 
 |  | ||||||
| @RestController |  | ||||||
| @RequestMapping(value = "/projects") |  | ||||||
| public class CreateProjectAction { |  | ||||||
|     private final EmployeeService employeeService; |  | ||||||
|     private final ProjectService projectService; |  | ||||||
|     private final ProjectMapper projectMapper; |  | ||||||
| 
 |  | ||||||
|     public CreateProjectAction(EmployeeService employeeService, ProjectService projectService, ProjectMapper mappingService) { |  | ||||||
|         this.employeeService = employeeService; |  | ||||||
|         this.projectService = projectService; |  | ||||||
|         this.projectMapper = mappingService; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     @Operation(summary = "Creates a new Project") |  | ||||||
|     @ApiResponses(value = { |  | ||||||
|             @ApiResponse(responseCode = "201", description = "created project", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = GetProjectDto.class))}), |  | ||||||
|             @ApiResponse(responseCode = "400", description = "invalid JSON posted", content = @Content), |  | ||||||
|             @ApiResponse(responseCode = "401", description = "not authorized", content = @Content), |  | ||||||
|             @ApiResponse(responseCode = "409", description = "Project dates conflict", content = @Content) |  | ||||||
|     }) |  | ||||||
|     @PostMapping |  | ||||||
|     @ResponseStatus(code = HttpStatus.CREATED) |  | ||||||
|     public ResponseEntity<Object> create( |  | ||||||
|             @RequestBody @Valid CreateProjectDto createProjectDto, |  | ||||||
|             @RequestHeader("Authorization") String accessToken |  | ||||||
|     ) { |  | ||||||
|         ProjectEntity project = this.projectMapper.mapCreateDtoToEntity(createProjectDto); |  | ||||||
| 
 |  | ||||||
|         for (Long employeeId : createProjectDto.getEmployees()) { |  | ||||||
|             if (!this.employeeService.employeeExists(accessToken, employeeId)) { |  | ||||||
|                 return new ResponseEntity<>("Employee with ID: " + employeeId + " not found", HttpStatus.NOT_FOUND); |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             for (GetProjectDto getProjectDto : this.employeeService.getProjects(employeeId)) { |  | ||||||
|                 if (projectService.isOverlapping(getProjectDto, project)) { |  | ||||||
|                     return new ResponseEntity<>("Project dates conflict with an existing project for Employee with ID: " + employeeId, HttpStatus.CONFLICT); |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         this.projectService.create(project); |  | ||||||
| 
 |  | ||||||
|         return new ResponseEntity<>(this.projectMapper.mapToGetDto(project), HttpStatus.CREATED); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  | @ -1,65 +0,0 @@ | ||||||
| package de.szut.lf8_starter.project.action.employee; |  | ||||||
| 
 |  | ||||||
| import de.szut.lf8_starter.employee.EmployeeService; |  | ||||||
| import de.szut.lf8_starter.project.ProjectEntity; |  | ||||||
| import de.szut.lf8_starter.project.ProjectService; |  | ||||||
| import de.szut.lf8_starter.project.dto.project.GetProjectDto; |  | ||||||
| import io.swagger.v3.oas.annotations.Operation; |  | ||||||
| import io.swagger.v3.oas.annotations.media.Content; |  | ||||||
| import io.swagger.v3.oas.annotations.responses.ApiResponse; |  | ||||||
| import io.swagger.v3.oas.annotations.responses.ApiResponses; |  | ||||||
| import org.springframework.http.HttpStatus; |  | ||||||
| import org.springframework.http.ResponseEntity; |  | ||||||
| import org.springframework.web.bind.annotation.PathVariable; |  | ||||||
| import org.springframework.web.bind.annotation.PostMapping; |  | ||||||
| import org.springframework.web.bind.annotation.RequestHeader; |  | ||||||
| import org.springframework.web.bind.annotation.RestController; |  | ||||||
| 
 |  | ||||||
| import java.util.Optional; |  | ||||||
| 
 |  | ||||||
| @RestController |  | ||||||
| public class AddEmployeeToProjectAction { |  | ||||||
|     private final ProjectService projectService; |  | ||||||
|     private final EmployeeService employeeService; |  | ||||||
| 
 |  | ||||||
|     public AddEmployeeToProjectAction(ProjectService projectService, EmployeeService employeeService) { |  | ||||||
|         this.projectService = projectService; |  | ||||||
|         this.employeeService = employeeService; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     @Operation(summary = "Add an employee to a project") |  | ||||||
|     @ApiResponses(value = { |  | ||||||
|             @ApiResponse(responseCode = "204", description = "Employee added to project"), |  | ||||||
|             @ApiResponse(responseCode = "404", description = "Project or employee not found", content = @Content), |  | ||||||
|             @ApiResponse(responseCode = "409", description = "Project dates conflict", content = @Content) |  | ||||||
|     }) |  | ||||||
|     @PostMapping("/projects/{projectId}/employees/{employeeId}") |  | ||||||
|     public ResponseEntity<Object> create( |  | ||||||
|             @PathVariable Long projectId, |  | ||||||
|             @PathVariable Long employeeId, |  | ||||||
|             @RequestHeader("Authorization") String accessToken |  | ||||||
|     ) { |  | ||||||
|         Optional<ProjectEntity> optionalProject = this.projectService.findById(projectId); |  | ||||||
| 
 |  | ||||||
|         if (optionalProject.isEmpty()) { |  | ||||||
|             return new ResponseEntity<>(HttpStatus.NOT_FOUND); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         ProjectEntity projectEntity = optionalProject.get(); |  | ||||||
| 
 |  | ||||||
|         if (!this.employeeService.employeeExists(accessToken, employeeId)) { |  | ||||||
|             return new ResponseEntity<>(HttpStatus.NOT_FOUND); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         for (GetProjectDto getProjectDto : this.employeeService.getProjects(employeeId)) { |  | ||||||
|             if (this.projectService.isOverlapping(getProjectDto, projectEntity)) { |  | ||||||
|                 return new ResponseEntity<>("Project dates conflict with an existing project for Employee with ID: " + employeeId, HttpStatus.CONFLICT); |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         projectEntity.getEmployees().add(employeeId); |  | ||||||
|         this.projectService.update(projectEntity); |  | ||||||
| 
 |  | ||||||
|         return new ResponseEntity<>(HttpStatus.NO_CONTENT); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  | @ -1,51 +0,0 @@ | ||||||
| package de.szut.lf8_starter.project.action.employee; |  | ||||||
| 
 |  | ||||||
| import de.szut.lf8_starter.project.ProjectEntity; |  | ||||||
| import de.szut.lf8_starter.project.ProjectService; |  | ||||||
| import de.szut.lf8_starter.project.dto.employee.GetEmployeesFromProjectDto; |  | ||||||
| import de.szut.lf8_starter.project.mapper.EmployeeFromProjectMapper; |  | ||||||
| import io.swagger.v3.oas.annotations.Operation; |  | ||||||
| import io.swagger.v3.oas.annotations.media.Content; |  | ||||||
| import io.swagger.v3.oas.annotations.responses.ApiResponse; |  | ||||||
| import io.swagger.v3.oas.annotations.responses.ApiResponses; |  | ||||||
| import org.springframework.http.HttpStatus; |  | ||||||
| import org.springframework.http.ResponseEntity; |  | ||||||
| import org.springframework.web.bind.annotation.GetMapping; |  | ||||||
| import org.springframework.web.bind.annotation.PathVariable; |  | ||||||
| import org.springframework.web.bind.annotation.RequestHeader; |  | ||||||
| import org.springframework.web.bind.annotation.RestController; |  | ||||||
| 
 |  | ||||||
| import java.util.Optional; |  | ||||||
| 
 |  | ||||||
| @RestController |  | ||||||
| public class GetEmployeeFromProjectAction { |  | ||||||
|     private final ProjectService projectService; |  | ||||||
|     private final EmployeeFromProjectMapper employeeFromProjectMapper; |  | ||||||
| 
 |  | ||||||
|     public GetEmployeeFromProjectAction(ProjectService projectService, EmployeeFromProjectMapper employeeFromProjectMapper) { |  | ||||||
|         this.projectService = projectService; |  | ||||||
|         this.employeeFromProjectMapper = employeeFromProjectMapper; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     @Operation(summary = "Get all employees from project") |  | ||||||
|     @ApiResponses(value = { |  | ||||||
|             @ApiResponse(responseCode = "200", description = "Outputs projects with employees"), |  | ||||||
|             @ApiResponse(responseCode = "404", description = "Project not found", content = @Content) |  | ||||||
|     }) |  | ||||||
|     @GetMapping("/projects/{projectId}/employees") |  | ||||||
|     public ResponseEntity<Object> create( |  | ||||||
|             @PathVariable Long projectId, |  | ||||||
|             @RequestHeader("Authorization") String accessToken |  | ||||||
|     ) { |  | ||||||
|         Optional<ProjectEntity> project = projectService.findById(projectId); |  | ||||||
| 
 |  | ||||||
|         if (project.isEmpty()) { |  | ||||||
|             return new ResponseEntity<>(HttpStatus.NOT_FOUND); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         GetEmployeesFromProjectDto getEmployeesFromProjectDto = this.employeeFromProjectMapper |  | ||||||
|                 .mapToGetEmployeesFromProjectDto(project.get(), accessToken); |  | ||||||
| 
 |  | ||||||
|         return new ResponseEntity<>(getEmployeesFromProjectDto, HttpStatus.OK); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  | @ -1,39 +0,0 @@ | ||||||
| package de.szut.lf8_starter.project.action.employee; |  | ||||||
| 
 |  | ||||||
| import de.szut.lf8_starter.employee.EmployeeService; |  | ||||||
| import io.swagger.v3.oas.annotations.Operation; |  | ||||||
| import io.swagger.v3.oas.annotations.media.Content; |  | ||||||
| import io.swagger.v3.oas.annotations.responses.ApiResponse; |  | ||||||
| import io.swagger.v3.oas.annotations.responses.ApiResponses; |  | ||||||
| import org.springframework.http.HttpStatus; |  | ||||||
| import org.springframework.http.ResponseEntity; |  | ||||||
| import org.springframework.web.bind.annotation.GetMapping; |  | ||||||
| import org.springframework.web.bind.annotation.PathVariable; |  | ||||||
| import org.springframework.web.bind.annotation.RequestHeader; |  | ||||||
| import org.springframework.web.bind.annotation.RestController; |  | ||||||
| 
 |  | ||||||
| @RestController |  | ||||||
| public class GetProjectsFromEmployee { |  | ||||||
|     private final EmployeeService employeeService; |  | ||||||
| 
 |  | ||||||
|     public GetProjectsFromEmployee(EmployeeService employeeService) { |  | ||||||
|         this.employeeService = employeeService; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     @Operation(summary = "Get all projects from employee") |  | ||||||
|     @ApiResponses(value = { |  | ||||||
|             @ApiResponse(responseCode = "200", description = "Get all projects from employee", content = @Content), |  | ||||||
|             @ApiResponse(responseCode = "404", description = "Employee not found", content = @Content) |  | ||||||
|     }) |  | ||||||
|     @GetMapping("/employees/{employeeId}/projects") |  | ||||||
|     public ResponseEntity<Object> create( |  | ||||||
|             @PathVariable Long employeeId, |  | ||||||
|             @RequestHeader("Authorization") String accessToken |  | ||||||
|     ) { |  | ||||||
|         if (!this.employeeService.employeeExists(accessToken, employeeId)) { |  | ||||||
|             return new ResponseEntity<>(HttpStatus.NOT_FOUND); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         return new ResponseEntity<>(this.employeeService.getProjects(employeeId), HttpStatus.OK); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  | @ -1,52 +0,0 @@ | ||||||
| package de.szut.lf8_starter.project.action.employee; |  | ||||||
| 
 |  | ||||||
| import de.szut.lf8_starter.employee.EmployeeService; |  | ||||||
| import de.szut.lf8_starter.project.ProjectEntity; |  | ||||||
| import de.szut.lf8_starter.project.ProjectService; |  | ||||||
| import io.swagger.v3.oas.annotations.Operation; |  | ||||||
| import io.swagger.v3.oas.annotations.media.Content; |  | ||||||
| import io.swagger.v3.oas.annotations.responses.ApiResponse; |  | ||||||
| import io.swagger.v3.oas.annotations.responses.ApiResponses; |  | ||||||
| import org.springframework.http.HttpStatus; |  | ||||||
| import org.springframework.http.ResponseEntity; |  | ||||||
| import org.springframework.web.bind.annotation.*; |  | ||||||
| 
 |  | ||||||
| import java.util.Optional; |  | ||||||
| 
 |  | ||||||
| @RestController |  | ||||||
| public class RemoveEmployeeFromProjectAction { |  | ||||||
|     private final ProjectService projectService; |  | ||||||
|     private final EmployeeService employeeService; |  | ||||||
| 
 |  | ||||||
|     public RemoveEmployeeFromProjectAction(ProjectService projectService, EmployeeService employeeService) { |  | ||||||
|         this.projectService = projectService; |  | ||||||
|         this.employeeService = employeeService; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     @Operation(summary = "Remove an employee from a project") |  | ||||||
|     @ApiResponses(value = { |  | ||||||
|             @ApiResponse(responseCode = "204", description = "Employee removed from project"), |  | ||||||
|             @ApiResponse(responseCode = "404", description = "Project or employee not found", content = @Content) |  | ||||||
|     }) |  | ||||||
|     @DeleteMapping("/projects/{projectId}/employees/{employeeId}") |  | ||||||
|     public ResponseEntity<Object> remove( |  | ||||||
|             @PathVariable Long projectId, |  | ||||||
|             @PathVariable Long employeeId, |  | ||||||
|             @RequestHeader("Authorization") String accessToken |  | ||||||
|     ) { |  | ||||||
|         Optional<ProjectEntity> project = this.projectService.findById(projectId); |  | ||||||
| 
 |  | ||||||
|         if (project.isEmpty()) { |  | ||||||
|             return new ResponseEntity<>(HttpStatus.NOT_FOUND); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         if (!this.employeeService.employeeExists(accessToken, employeeId)) { |  | ||||||
|             return new ResponseEntity<>(HttpStatus.NOT_FOUND); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         project.get().getEmployees().remove(employeeId); |  | ||||||
|         this.projectService.update(project.get()); |  | ||||||
| 
 |  | ||||||
|         return new ResponseEntity<>(HttpStatus.NO_CONTENT); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  | @ -1,4 +1,4 @@ | ||||||
| package de.szut.lf8_starter.project.dto.project; | package de.szut.lf8_starter.project.dto; | ||||||
| 
 | 
 | ||||||
| import com.fasterxml.jackson.annotation.JsonFormat; | import com.fasterxml.jackson.annotation.JsonFormat; | ||||||
| import com.fasterxml.jackson.databind.PropertyNamingStrategies; | import com.fasterxml.jackson.databind.PropertyNamingStrategies; | ||||||
|  | @ -1,4 +1,4 @@ | ||||||
| package de.szut.lf8_starter.project.dto.project; | package de.szut.lf8_starter.project.dto; | ||||||
| 
 | 
 | ||||||
| import com.fasterxml.jackson.annotation.JsonFormat; | import com.fasterxml.jackson.annotation.JsonFormat; | ||||||
| import com.fasterxml.jackson.databind.PropertyNamingStrategies; | import com.fasterxml.jackson.databind.PropertyNamingStrategies; | ||||||
|  | @ -1,4 +1,4 @@ | ||||||
| package de.szut.lf8_starter.project.dto.project; | package de.szut.lf8_starter.project.dto; | ||||||
| 
 | 
 | ||||||
| import com.fasterxml.jackson.annotation.JsonFormat; | import com.fasterxml.jackson.annotation.JsonFormat; | ||||||
| import com.fasterxml.jackson.databind.PropertyNamingStrategies; | import com.fasterxml.jackson.databind.PropertyNamingStrategies; | ||||||
|  | @ -1,22 +0,0 @@ | ||||||
| package de.szut.lf8_starter.project.dto.employee; |  | ||||||
| 
 |  | ||||||
| import com.fasterxml.jackson.databind.PropertyNamingStrategies; |  | ||||||
| import com.fasterxml.jackson.databind.annotation.JsonNaming; |  | ||||||
| import lombok.Getter; |  | ||||||
| import lombok.Setter; |  | ||||||
| 
 |  | ||||||
| import java.util.List; |  | ||||||
| 
 |  | ||||||
| @Getter |  | ||||||
| @Setter |  | ||||||
| @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) |  | ||||||
| public class EmployeeDto { |  | ||||||
|     private long id; |  | ||||||
|     private String firstName; |  | ||||||
|     private String lastName; |  | ||||||
|     private String street; |  | ||||||
|     private String postcode; |  | ||||||
|     private String city; |  | ||||||
|     private String phone; |  | ||||||
|     private List<String> skillSet; |  | ||||||
| } |  | ||||||
|  | @ -1,11 +0,0 @@ | ||||||
| package de.szut.lf8_starter.project.dto.employee; |  | ||||||
| 
 |  | ||||||
| import lombok.Getter; |  | ||||||
| import lombok.Setter; |  | ||||||
| 
 |  | ||||||
| @Getter |  | ||||||
| @Setter |  | ||||||
| public class GetEmployeeDto { |  | ||||||
|     private long id; |  | ||||||
|     private GetSkillDto[] skillSet; |  | ||||||
| } |  | ||||||
|  | @ -1,17 +0,0 @@ | ||||||
| package de.szut.lf8_starter.project.dto.employee; |  | ||||||
| 
 |  | ||||||
| import com.fasterxml.jackson.databind.PropertyNamingStrategies; |  | ||||||
| import com.fasterxml.jackson.databind.annotation.JsonNaming; |  | ||||||
| import lombok.Getter; |  | ||||||
| import lombok.Setter; |  | ||||||
| 
 |  | ||||||
| import java.util.ArrayList; |  | ||||||
| 
 |  | ||||||
| @Getter |  | ||||||
| @Setter |  | ||||||
| @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) |  | ||||||
| public class GetEmployeesFromProjectDto { |  | ||||||
|     private long projectId; |  | ||||||
|     private String projectDescription; |  | ||||||
|     private ArrayList<GetEmployeeDto> employees; |  | ||||||
| } |  | ||||||
|  | @ -1,13 +0,0 @@ | ||||||
| package de.szut.lf8_starter.project.dto.employee; |  | ||||||
| 
 |  | ||||||
| import com.fasterxml.jackson.databind.PropertyNamingStrategies; |  | ||||||
| import com.fasterxml.jackson.databind.annotation.JsonNaming; |  | ||||||
| import lombok.Getter; |  | ||||||
| import lombok.Setter; |  | ||||||
| 
 |  | ||||||
| @Getter |  | ||||||
| @Setter |  | ||||||
| @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) |  | ||||||
| public class GetSkillDto { |  | ||||||
|     private String skill; |  | ||||||
| } |  | ||||||
|  | @ -1,35 +0,0 @@ | ||||||
| package de.szut.lf8_starter.project.mapper; |  | ||||||
| 
 |  | ||||||
| import de.szut.lf8_starter.employee.EmployeeService; |  | ||||||
| import de.szut.lf8_starter.project.ProjectEntity; |  | ||||||
| import de.szut.lf8_starter.project.dto.employee.GetEmployeeDto; |  | ||||||
| import de.szut.lf8_starter.project.dto.employee.GetEmployeesFromProjectDto; |  | ||||||
| import org.springframework.stereotype.Service; |  | ||||||
| 
 |  | ||||||
| import java.util.ArrayList; |  | ||||||
| 
 |  | ||||||
| @Service |  | ||||||
| public class EmployeeFromProjectMapper { |  | ||||||
|     private final EmployeeService employeeService; |  | ||||||
| 
 |  | ||||||
|     public EmployeeFromProjectMapper(EmployeeService employeeService) { |  | ||||||
|         this.employeeService = employeeService; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     public GetEmployeesFromProjectDto mapToGetEmployeesFromProjectDto(ProjectEntity projectEntity, String accessToken) { |  | ||||||
|         GetEmployeesFromProjectDto getEmployeesFromProjectDto = new GetEmployeesFromProjectDto(); |  | ||||||
|         getEmployeesFromProjectDto.setProjectId(projectEntity.getId()); |  | ||||||
|         getEmployeesFromProjectDto.setProjectDescription(projectEntity.getComment()); |  | ||||||
| 
 |  | ||||||
|         ArrayList<GetEmployeeDto> employeeDtos = new ArrayList<>(); |  | ||||||
|         for (long id : projectEntity.getEmployees()) { |  | ||||||
|             GetEmployeeDto getEmployeeDto = this.employeeService.getEmployee(accessToken, id); |  | ||||||
| 
 |  | ||||||
|             employeeDtos.add(getEmployeeDto); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         getEmployeesFromProjectDto.setEmployees(employeeDtos); |  | ||||||
| 
 |  | ||||||
|         return getEmployeesFromProjectDto; |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  | @ -0,0 +1,50 @@ | ||||||
|  | package de.szut.lf8_starter.integration.hello; | ||||||
|  | 
 | ||||||
|  | import de.szut.lf8_starter.hello.HelloRepository; | ||||||
|  | import org.json.JSONObject; | ||||||
|  | import org.junit.jupiter.api.Test; | ||||||
|  | import org.springframework.beans.factory.annotation.Autowired; | ||||||
|  | import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; | ||||||
|  | import org.springframework.boot.test.context.SpringBootTest; | ||||||
|  | import org.springframework.http.MediaType; | ||||||
|  | import org.springframework.test.web.servlet.MockMvc; | ||||||
|  | 
 | ||||||
|  | import java.time.LocalDate; | ||||||
|  | import java.util.Arrays; | ||||||
|  | 
 | ||||||
|  | import static org.assertj.core.api.Assertions.assertThat; | ||||||
|  | import static org.hamcrest.Matchers.is; | ||||||
|  | import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; | ||||||
|  | import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; | ||||||
|  | import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; | ||||||
|  | 
 | ||||||
|  | @SpringBootTest | ||||||
|  | @AutoConfigureMockMvc(addFilters = false) | ||||||
|  | class CreateHelloTest { | ||||||
|  |     @Autowired | ||||||
|  |     private MockMvc mockMvc; | ||||||
|  |     @Autowired | ||||||
|  |     private HelloRepository helloRepository; | ||||||
|  |     @Test | ||||||
|  |     void createProjectTest() throws Exception { | ||||||
|  |         String content = """ | ||||||
|  |                 { | ||||||
|  |                     "message": "test" | ||||||
|  |                   } | ||||||
|  |                 """; | ||||||
|  | 
 | ||||||
|  |         final var contentAsString = this.mockMvc.perform( | ||||||
|  |                         post("/hello").content(content).contentType(MediaType.APPLICATION_JSON) | ||||||
|  |                 ) | ||||||
|  |                 .andExpect(status().isOk()) | ||||||
|  |                 .andExpect(jsonPath("message", is("test"))) | ||||||
|  |                 .andReturn() | ||||||
|  |                 .getResponse() | ||||||
|  |                 .getContentAsString(); | ||||||
|  | 
 | ||||||
|  |         final var id = Long.parseLong(new JSONObject(contentAsString).get("id").toString()); | ||||||
|  | 
 | ||||||
|  |         final var hello = this.helloRepository.findById(id); | ||||||
|  |         assertThat(hello.get().getMessage()).isEqualTo("test"); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | @ -1,160 +0,0 @@ | ||||||
| package de.szut.lf8_starter.integration.project; |  | ||||||
| 
 |  | ||||||
| import de.szut.lf8_starter.project.ProjectEntity; |  | ||||||
| import de.szut.lf8_starter.project.ProjectRepository; |  | ||||||
| import org.junit.jupiter.api.Test; |  | ||||||
| import org.springframework.beans.factory.annotation.Autowired; |  | ||||||
| import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; |  | ||||||
| import org.springframework.boot.test.context.SpringBootTest; |  | ||||||
| import org.springframework.http.*; |  | ||||||
| import org.springframework.test.annotation.DirtiesContext; |  | ||||||
| import org.springframework.test.web.servlet.MockMvc; |  | ||||||
| import org.springframework.util.LinkedMultiValueMap; |  | ||||||
| import org.springframework.util.MultiValueMap; |  | ||||||
| import org.springframework.web.client.RestTemplate; |  | ||||||
| 
 |  | ||||||
| import java.time.LocalDate; |  | ||||||
| import java.util.List; |  | ||||||
| import java.util.Map; |  | ||||||
| import java.util.Objects; |  | ||||||
| 
 |  | ||||||
| import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; |  | ||||||
| import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; |  | ||||||
| 
 |  | ||||||
| @SpringBootTest |  | ||||||
| @AutoConfigureMockMvc(addFilters = false) |  | ||||||
| @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) |  | ||||||
| class AddEmployeeToProjectTest { |  | ||||||
|     @Autowired |  | ||||||
|     private MockMvc mockMvc; |  | ||||||
| 
 |  | ||||||
|     @Autowired |  | ||||||
|     private RestTemplate restTemplate; |  | ||||||
| 
 |  | ||||||
|     @Autowired |  | ||||||
|     private ProjectRepository projectRepository; |  | ||||||
| 
 |  | ||||||
|     @Test |  | ||||||
|     void addEmployeeToProjectTest() throws Exception { |  | ||||||
|         ProjectEntity project = new ProjectEntity(); |  | ||||||
|         project.setComment("comment"); |  | ||||||
|         project.setContractor(1); |  | ||||||
|         project.setContractorName("contractorName"); |  | ||||||
|         project.setEndDate(LocalDate.of(2024, 1, 1)); |  | ||||||
|         project.setLeadingEmployee(1); |  | ||||||
|         project.setName("name"); |  | ||||||
|         project.setStartDate(LocalDate.of(2021, 1, 1)); |  | ||||||
|         project.setEmployees(List.of(1L, 2L, 3L)); |  | ||||||
|         this.projectRepository.save(project); |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|         mockMvc.perform(post("/projects/{projectId}/employees/{employeeId}", 1, 312) |  | ||||||
|                         .header(HttpHeaders.AUTHORIZATION, getBearerToken()) |  | ||||||
|                         .contentType(MediaType.APPLICATION_JSON)) |  | ||||||
|                 .andExpect(status().isNoContent()); |  | ||||||
| 
 |  | ||||||
|         ProjectEntity updatedProject = projectRepository.findById(1L).get(); |  | ||||||
| 
 |  | ||||||
|         assert updatedProject.getEmployees().contains(312L); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     @Test |  | ||||||
|     void addEmployeeToPastProjectTest() throws Exception { |  | ||||||
|         ProjectEntity project = new ProjectEntity(); |  | ||||||
|         project.setComment("past project"); |  | ||||||
|         project.setContractor(1); |  | ||||||
|         project.setContractorName("contractorName"); |  | ||||||
|         project.setPlannedEndDate(LocalDate.of(1991, 1, 1)); |  | ||||||
|         project.setLeadingEmployee(1); |  | ||||||
|         project.setName("past project"); |  | ||||||
|         project.setStartDate(LocalDate.of(1990, 1, 1)); |  | ||||||
|         project.setEmployees(List.of(1L, 2L, 3L)); |  | ||||||
|         this.projectRepository.save(project); |  | ||||||
| 
 |  | ||||||
|         mockMvc.perform(post("/projects/{projectId}/employees/{employeeId}", project.getId(), 312) |  | ||||||
|                         .header(HttpHeaders.AUTHORIZATION, getBearerToken()) |  | ||||||
|                         .contentType(MediaType.APPLICATION_JSON)) |  | ||||||
|                 .andExpect(status().isNoContent()); |  | ||||||
| 
 |  | ||||||
|         ProjectEntity updatedProject = projectRepository.findById(project.getId()).get(); |  | ||||||
| 
 |  | ||||||
|         assert updatedProject.getEmployees().contains(312L); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     @Test |  | ||||||
|     void addEmployeeToFutureProjectTest() throws Exception { |  | ||||||
|         ProjectEntity project = new ProjectEntity(); |  | ||||||
|         project.setComment("future project"); |  | ||||||
|         project.setContractor(1); |  | ||||||
|         project.setContractorName("contractorName"); |  | ||||||
|         project.setPlannedEndDate(LocalDate.of(2101, 1, 1)); |  | ||||||
|         project.setLeadingEmployee(1); |  | ||||||
|         project.setName("future project"); |  | ||||||
|         project.setStartDate(LocalDate.of(2100, 1, 1)); |  | ||||||
|         project.setEmployees(List.of(1L, 2L, 3L)); |  | ||||||
|         this.projectRepository.save(project); |  | ||||||
| 
 |  | ||||||
|         mockMvc.perform(post("/projects/{projectId}/employees/{employeeId}", project.getId(), 312) |  | ||||||
|                         .header(HttpHeaders.AUTHORIZATION, getBearerToken()) |  | ||||||
|                         .contentType(MediaType.APPLICATION_JSON)) |  | ||||||
|                 .andExpect(status().isNoContent()); |  | ||||||
| 
 |  | ||||||
|         ProjectEntity updatedProject = projectRepository.findById(project.getId()).get(); |  | ||||||
| 
 |  | ||||||
|         assert updatedProject.getEmployees().contains(312L); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     @Test |  | ||||||
|     void addEmployeeToProjectWithOverlappingDatesTest() throws Exception { |  | ||||||
|         ProjectEntity project1 = new ProjectEntity(); |  | ||||||
|         project1.setComment("project 1"); |  | ||||||
|         project1.setContractor(1); |  | ||||||
|         project1.setContractorName("contractorName"); |  | ||||||
|         project1.setPlannedEndDate(LocalDate.of(2023, 1, 1)); |  | ||||||
|         project1.setLeadingEmployee(1); |  | ||||||
|         project1.setName("project 1"); |  | ||||||
|         project1.setStartDate(LocalDate.of(2022, 1, 1)); |  | ||||||
|         project1.setEmployees(List.of(1L, 2L, 3L)); |  | ||||||
|         this.projectRepository.save(project1); |  | ||||||
| 
 |  | ||||||
|         ProjectEntity project2 = new ProjectEntity(); |  | ||||||
|         project2.setComment("project 2"); |  | ||||||
|         project2.setContractor(1); |  | ||||||
|         project2.setContractorName("contractorName"); |  | ||||||
|         project2.setPlannedEndDate(LocalDate.of(2023, 6, 1)); |  | ||||||
|         project2.setLeadingEmployee(1); |  | ||||||
|         project2.setName("project 2"); |  | ||||||
|         project2.setStartDate(LocalDate.of(2022, 6, 1)); |  | ||||||
|         project2.setEmployees(List.of(1L, 2L, 3L)); |  | ||||||
|         this.projectRepository.save(project2); |  | ||||||
| 
 |  | ||||||
|         mockMvc.perform(post("/projects/{projectId}/employees/{employeeId}", project1.getId(), 312) |  | ||||||
|                         .header(HttpHeaders.AUTHORIZATION, getBearerToken()) |  | ||||||
|                         .contentType(MediaType.APPLICATION_JSON)) |  | ||||||
|                 .andExpect(status().isNoContent()); |  | ||||||
| 
 |  | ||||||
|         mockMvc.perform(post("/projects/{projectId}/employees/{employeeId}", project2.getId(), 312) |  | ||||||
|                         .header(HttpHeaders.AUTHORIZATION, getBearerToken()) |  | ||||||
|                         .contentType(MediaType.APPLICATION_JSON)) |  | ||||||
|                 .andExpect(status().isConflict()); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     private String getBearerToken() { |  | ||||||
|         String url = "https://keycloak.szut.dev/auth/realms/szut/protocol/openid-connect/token"; |  | ||||||
| 
 |  | ||||||
|         HttpHeaders headers = new HttpHeaders(); |  | ||||||
|         headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); |  | ||||||
| 
 |  | ||||||
|         MultiValueMap<String, String> map = new LinkedMultiValueMap<>(); |  | ||||||
|         map.add("grant_type", "password"); |  | ||||||
|         map.add("client_id", "employee-management-service"); |  | ||||||
|         map.add("username", "user"); |  | ||||||
|         map.add("password", "test"); |  | ||||||
| 
 |  | ||||||
|         HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(map, headers); |  | ||||||
| 
 |  | ||||||
|         ResponseEntity<Map> response = this.restTemplate.exchange(url, HttpMethod.POST, request, Map.class); |  | ||||||
| 
 |  | ||||||
|         return Objects.requireNonNull(response.getBody()).get("access_token").toString(); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  | @ -1,41 +1,30 @@ | ||||||
| package de.szut.lf8_starter.integration.project; | package de.szut.lf8_starter.integration.project; | ||||||
| 
 | 
 | ||||||
| import de.szut.lf8_starter.project.ProjectEntity; |  | ||||||
| import de.szut.lf8_starter.project.ProjectRepository; | import de.szut.lf8_starter.project.ProjectRepository; | ||||||
| import org.json.JSONObject; | import org.json.JSONObject; | ||||||
| import org.junit.jupiter.api.Test; | import org.junit.jupiter.api.Test; | ||||||
| import org.springframework.beans.factory.annotation.Autowired; | import org.springframework.beans.factory.annotation.Autowired; | ||||||
| import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; | import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; | ||||||
| import org.springframework.boot.test.context.SpringBootTest; | import org.springframework.boot.test.context.SpringBootTest; | ||||||
| import org.springframework.http.*; | import org.springframework.http.MediaType; | ||||||
| import org.springframework.test.annotation.DirtiesContext; |  | ||||||
| import org.springframework.test.web.servlet.MockMvc; | import org.springframework.test.web.servlet.MockMvc; | ||||||
| import org.springframework.util.LinkedMultiValueMap; |  | ||||||
| import org.springframework.util.MultiValueMap; |  | ||||||
| import org.springframework.web.client.RestTemplate; |  | ||||||
| 
 | 
 | ||||||
| import java.time.LocalDate; | import java.time.LocalDate; | ||||||
| import java.util.List; | import java.util.Arrays; | ||||||
| import java.util.Map; |  | ||||||
| import java.util.Objects; |  | ||||||
| import java.util.Optional; |  | ||||||
| 
 | 
 | ||||||
| import static org.assertj.core.api.Assertions.assertThat; | import static org.assertj.core.api.Assertions.assertThat; | ||||||
| import static org.hamcrest.Matchers.is; |  | ||||||
| import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; | import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; | ||||||
| import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; | import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; | ||||||
|  | import static org.hamcrest.Matchers.is; | ||||||
| import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; | import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; | ||||||
| 
 | 
 | ||||||
| @SpringBootTest | @SpringBootTest | ||||||
| @AutoConfigureMockMvc(addFilters = false) | @AutoConfigureMockMvc(addFilters = false) | ||||||
| @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) |  | ||||||
| class CreateProjectActionTest { | class CreateProjectActionTest { | ||||||
|     @Autowired |     @Autowired | ||||||
|     private MockMvc mockMvc; |     private MockMvc mockMvc; | ||||||
|     @Autowired |     @Autowired | ||||||
|     private ProjectRepository projectRepository; |     private ProjectRepository projectRepository; | ||||||
|     @Autowired |  | ||||||
|     private RestTemplate restTemplate; |  | ||||||
| 
 | 
 | ||||||
|     @Test |     @Test | ||||||
|     void createProjectTest() throws Exception { |     void createProjectTest() throws Exception { | ||||||
|  | @ -43,7 +32,7 @@ class CreateProjectActionTest { | ||||||
|                 { |                 { | ||||||
|                     "name": "name", |                     "name": "name", | ||||||
|                     "leading_employee": 1, |                     "leading_employee": 1, | ||||||
|                     "employees": [312], |                     "employees": [2, 3], | ||||||
|                     "contractor": 4, |                     "contractor": 4, | ||||||
|                     "contractor_name": "Peter File", |                     "contractor_name": "Peter File", | ||||||
|                     "comment": "goal of project", |                     "comment": "goal of project", | ||||||
|  | @ -52,16 +41,13 @@ class CreateProjectActionTest { | ||||||
|                   } |                   } | ||||||
|                 """; |                 """; | ||||||
| 
 | 
 | ||||||
|         final String contentAsString = this.mockMvc.perform( |         final var contentAsString = this.mockMvc.perform( | ||||||
|                         post("/projects") |                 post("/projects").content(content).contentType(MediaType.APPLICATION_JSON) | ||||||
|                                 .content(content) |         ) | ||||||
|                                 .contentType(MediaType.APPLICATION_JSON) |  | ||||||
|                                 .header(HttpHeaders.AUTHORIZATION, getBearerToken()) |  | ||||||
|                 ) |  | ||||||
|                 .andExpect(status().isCreated()) |                 .andExpect(status().isCreated()) | ||||||
|                 .andExpect(jsonPath("name", is("name"))) |                 .andExpect(jsonPath("name", is("name"))) | ||||||
|                 .andExpect(jsonPath("leading_employee", is(1))) |                 .andExpect(jsonPath("leading_employee", is(1))) | ||||||
|                 .andExpect(jsonPath("employees", is(List.of(312)))) |                 .andExpect(jsonPath("employees", is(Arrays.asList(2, 3)))) | ||||||
|                 .andExpect(jsonPath("contractor", is(4))) |                 .andExpect(jsonPath("contractor", is(4))) | ||||||
|                 .andExpect(jsonPath("contractor_name", is("Peter File"))) |                 .andExpect(jsonPath("contractor_name", is("Peter File"))) | ||||||
|                 .andExpect(jsonPath("comment", is("goal of project"))) |                 .andExpect(jsonPath("comment", is("goal of project"))) | ||||||
|  | @ -71,166 +57,15 @@ class CreateProjectActionTest { | ||||||
|                 .getResponse() |                 .getResponse() | ||||||
|                 .getContentAsString(); |                 .getContentAsString(); | ||||||
| 
 | 
 | ||||||
|         final long id = Long.parseLong(new JSONObject(contentAsString).get("id").toString()); |             final var id = Long.parseLong(new JSONObject(contentAsString).get("id").toString()); | ||||||
| 
 | 
 | ||||||
|         final Optional<ProjectEntity> project = this.projectRepository.findById(id); |             final var project = this.projectRepository.findById(id); | ||||||
|         assertThat(project.get().getName()).isEqualTo("name"); |             assertThat(project.get().getName()).isEqualTo("name"); | ||||||
|         assertThat(project.get().getLeadingEmployee()).isEqualTo(1); |             assertThat(project.get().getLeadingEmployee()).isEqualTo(1); | ||||||
|         assertThat(project.get().getContractor()).isEqualTo(4); |             assertThat(project.get().getContractor()).isEqualTo(4); | ||||||
|         assertThat(project.get().getContractorName()).isEqualTo("Peter File"); |             assertThat(project.get().getContractorName()).isEqualTo("Peter File"); | ||||||
|         assertThat(project.get().getComment()).isEqualTo("goal of project"); |             assertThat(project.get().getComment()).isEqualTo("goal of project"); | ||||||
|         assertThat(project.get().getStartDate()).isEqualTo(LocalDate.of(2000, 1, 1)); |             assertThat(project.get().getStartDate()).isEqualTo(LocalDate.of(2000, 1, 1)); | ||||||
|         assertThat(project.get().getPlannedEndDate()).isEqualTo(LocalDate.of(2001, 1, 1)); |             assertThat(project.get().getPlannedEndDate()).isEqualTo(LocalDate.of(2001, 1, 1)); | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     @Test |  | ||||||
|     void createProjectShouldReturnConflictResponseOnConflictingProjects() throws Exception { |  | ||||||
|         String content = """ |  | ||||||
|                 { |  | ||||||
|                     "name": "name", |  | ||||||
|                     "leading_employee": 1, |  | ||||||
|                     "employees": [312], |  | ||||||
|                     "contractor": 4, |  | ||||||
|                     "contractor_name": "Peter File", |  | ||||||
|                     "comment": "goal of project", |  | ||||||
|                     "start_date": "01.01.2000", |  | ||||||
|                     "planned_end_date": "01.01.2001" |  | ||||||
|                   } |  | ||||||
|                 """; |  | ||||||
| 
 |  | ||||||
|         this.mockMvc.perform( |  | ||||||
|                         post("/projects") |  | ||||||
|                                 .content(content) |  | ||||||
|                                 .contentType(MediaType.APPLICATION_JSON) |  | ||||||
|                                 .header(HttpHeaders.AUTHORIZATION, getBearerToken()) |  | ||||||
|                 ) |  | ||||||
|                 .andExpect(status().isCreated()); |  | ||||||
| 
 |  | ||||||
|         this.mockMvc.perform( |  | ||||||
|                         post("/projects") |  | ||||||
|                                 .content(content) |  | ||||||
|                                 .contentType(MediaType.APPLICATION_JSON) |  | ||||||
|                                 .header(HttpHeaders.AUTHORIZATION, getBearerToken()) |  | ||||||
|                 ) |  | ||||||
|                 .andExpect(status().isConflict()); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     @Test |  | ||||||
|     void createProjectWithPastStartDate() throws Exception { |  | ||||||
|         String content = """ |  | ||||||
|                 { |  | ||||||
|                     "name": "past project", |  | ||||||
|                     "leading_employee": 1, |  | ||||||
|                     "employees": [312], |  | ||||||
|                     "contractor": 4, |  | ||||||
|                     "contractor_name": "Past Contractor", |  | ||||||
|                     "comment": "past project", |  | ||||||
|                     "start_date": "01.01.1990", |  | ||||||
|                     "planned_end_date": "01.01.1991" |  | ||||||
|                   } |  | ||||||
|                 """; |  | ||||||
| 
 |  | ||||||
|         this.mockMvc.perform( |  | ||||||
|                         post("/projects") |  | ||||||
|                                 .content(content) |  | ||||||
|                                 .contentType(MediaType.APPLICATION_JSON) |  | ||||||
|                                 .header(HttpHeaders.AUTHORIZATION, getBearerToken()) |  | ||||||
|                 ) |  | ||||||
|                 .andExpect(status().isCreated()) |  | ||||||
|                 .andExpect(jsonPath("name", is("past project"))) |  | ||||||
|                 .andExpect(jsonPath("start_date", is("01.01.1990"))) |  | ||||||
|                 .andExpect(jsonPath("planned_end_date", is("01.01.1991"))); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     @Test |  | ||||||
|     void createProjectWithFutureStartDate() throws Exception { |  | ||||||
|         String content = """ |  | ||||||
|                 { |  | ||||||
|                     "name": "future project", |  | ||||||
|                     "leading_employee": 1, |  | ||||||
|                     "employees": [312], |  | ||||||
|                     "contractor": 4, |  | ||||||
|                     "contractor_name": "Future Contractor", |  | ||||||
|                     "comment": "future project", |  | ||||||
|                     "start_date": "01.01.2100", |  | ||||||
|                     "planned_end_date": "01.01.2101" |  | ||||||
|                   } |  | ||||||
|                 """; |  | ||||||
| 
 |  | ||||||
|         this.mockMvc.perform( |  | ||||||
|                         post("/projects") |  | ||||||
|                                 .content(content) |  | ||||||
|                                 .contentType(MediaType.APPLICATION_JSON) |  | ||||||
|                                 .header(HttpHeaders.AUTHORIZATION, getBearerToken()) |  | ||||||
|                 ) |  | ||||||
|                 .andExpect(status().isCreated()) |  | ||||||
|                 .andExpect(jsonPath("name", is("future project"))) |  | ||||||
|                 .andExpect(jsonPath("start_date", is("01.01.2100"))) |  | ||||||
|                 .andExpect(jsonPath("planned_end_date", is("01.01.2101"))); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     @Test |  | ||||||
|     void createProjectWithOverlappingDates() throws Exception { |  | ||||||
|         String content1 = """ |  | ||||||
|                 { |  | ||||||
|                     "name": "project 1", |  | ||||||
|                     "leading_employee": 1, |  | ||||||
|                     "employees": [312], |  | ||||||
|                     "contractor": 4, |  | ||||||
|                     "contractor_name": "Contractor 1", |  | ||||||
|                     "comment": "project 1", |  | ||||||
|                     "start_date": "01.01.2022", |  | ||||||
|                     "planned_end_date": "01.01.2023" |  | ||||||
|                   } |  | ||||||
|                 """; |  | ||||||
| 
 |  | ||||||
|         String content2 = """ |  | ||||||
|                 { |  | ||||||
|                     "name": "project 2", |  | ||||||
|                     "leading_employee": 1, |  | ||||||
|                     "employees": [312], |  | ||||||
|                     "contractor": 4, |  | ||||||
|                     "contractor_name": "Contractor 2", |  | ||||||
|                     "comment": "project 2", |  | ||||||
|                     "start_date": "01.06.2022", |  | ||||||
|                     "planned_end_date": "01.06.2023" |  | ||||||
|                   } |  | ||||||
|                 """; |  | ||||||
| 
 |  | ||||||
|         this.mockMvc.perform( |  | ||||||
|                         post("/projects") |  | ||||||
|                                 .content(content1) |  | ||||||
|                                 .contentType(MediaType.APPLICATION_JSON) |  | ||||||
|                                 .header(HttpHeaders.AUTHORIZATION, getBearerToken()) |  | ||||||
|                 ) |  | ||||||
|                 .andExpect(status().isCreated()); |  | ||||||
| 
 |  | ||||||
|         this.mockMvc.perform( |  | ||||||
|                         post("/projects") |  | ||||||
|                                 .content(content2) |  | ||||||
|                                 .contentType(MediaType.APPLICATION_JSON) |  | ||||||
|                                 .header(HttpHeaders.AUTHORIZATION, getBearerToken()) |  | ||||||
|                 ) |  | ||||||
|                 .andExpect(status().isConflict()); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     private String getBearerToken() { |  | ||||||
|         String url = "https://keycloak.szut.dev/auth/realms/szut/protocol/openid-connect/token"; |  | ||||||
| 
 |  | ||||||
|         HttpHeaders headers = new HttpHeaders(); |  | ||||||
|         headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); |  | ||||||
| 
 |  | ||||||
|         MultiValueMap<String, String> map = new LinkedMultiValueMap<>(); |  | ||||||
|         map.add("grant_type", "password"); |  | ||||||
|         map.add("client_id", "employee-management-service"); |  | ||||||
|         map.add("username", "user"); |  | ||||||
|         map.add("password", "test"); |  | ||||||
| 
 |  | ||||||
|         HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(map, headers); |  | ||||||
| 
 |  | ||||||
|         ResponseEntity<Map> response = this.restTemplate.exchange(url, HttpMethod.POST, request, Map.class); |  | ||||||
| 
 |  | ||||||
|         return Objects.requireNonNull(response.getBody()).get("access_token").toString(); |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 |  | ||||||
|  |  | ||||||
|  | @ -1,84 +0,0 @@ | ||||||
| package de.szut.lf8_starter.integration.project; |  | ||||||
| 
 |  | ||||||
| import de.szut.lf8_starter.project.ProjectEntity; |  | ||||||
| import de.szut.lf8_starter.project.ProjectRepository; |  | ||||||
| import org.junit.jupiter.api.Test; |  | ||||||
| import org.springframework.beans.factory.annotation.Autowired; |  | ||||||
| import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; |  | ||||||
| import org.springframework.boot.test.context.SpringBootTest; |  | ||||||
| import org.springframework.http.*; |  | ||||||
| import org.springframework.test.annotation.DirtiesContext; |  | ||||||
| import org.springframework.test.web.servlet.MockMvc; |  | ||||||
| import org.springframework.util.LinkedMultiValueMap; |  | ||||||
| import org.springframework.util.MultiValueMap; |  | ||||||
| import org.springframework.web.client.RestTemplate; |  | ||||||
| 
 |  | ||||||
| import java.time.LocalDate; |  | ||||||
| import java.util.List; |  | ||||||
| import java.util.Map; |  | ||||||
| import java.util.Objects; |  | ||||||
| 
 |  | ||||||
| import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; |  | ||||||
| import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; |  | ||||||
| import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; |  | ||||||
| 
 |  | ||||||
| @SpringBootTest |  | ||||||
| @AutoConfigureMockMvc(addFilters = false) |  | ||||||
| @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) |  | ||||||
| class GetEmployeesFromProjectTest { |  | ||||||
|     @Autowired |  | ||||||
|     private MockMvc mockMvc; |  | ||||||
|     @Autowired |  | ||||||
|     private ProjectRepository projectRepository; |  | ||||||
|     @Autowired |  | ||||||
|     private RestTemplate restTemplate; |  | ||||||
| 
 |  | ||||||
|     @Test |  | ||||||
|     void getEmployeesFromProjectTest() throws Exception { |  | ||||||
|         ProjectEntity project = new ProjectEntity(); |  | ||||||
|         project.setId(1); |  | ||||||
|         project.setComment("comment"); |  | ||||||
|         project.setContractor(1); |  | ||||||
|         project.setContractorName("contractorName"); |  | ||||||
|         project.setEndDate(LocalDate.of(2024, 1, 1)); |  | ||||||
|         project.setLeadingEmployee(1); |  | ||||||
|         project.setName("name"); |  | ||||||
|         project.setStartDate(LocalDate.of(2021, 1, 1)); |  | ||||||
|         project.setEmployees(List.of(315L)); |  | ||||||
|         this.projectRepository.save(project); |  | ||||||
| 
 |  | ||||||
|         this.mockMvc.perform(get("/projects/1/employees") |  | ||||||
|                         .header(HttpHeaders.AUTHORIZATION, getBearerToken()) |  | ||||||
|                 ).andExpect(status().isOk()) |  | ||||||
|                 .andExpect(jsonPath("project_id").value(1)) |  | ||||||
|                 .andExpect(jsonPath("project_description").value("comment")) |  | ||||||
|                 .andExpect(jsonPath("employees[0].id").value(315)) |  | ||||||
|                 .andExpect(jsonPath("employees[0].skillSet[0].skill").value("Product Owner")); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     @Test |  | ||||||
|     void getEmployeesFromProjectShouldReturnNotFoundResponseWhenProjectIsNotFound() throws Exception { |  | ||||||
|         this.mockMvc.perform(get("/projects/1111/employees") |  | ||||||
|                 .header(HttpHeaders.AUTHORIZATION, getBearerToken()) |  | ||||||
|         ).andExpect(status().isNotFound()); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     private String getBearerToken() { |  | ||||||
|         String url = "https://keycloak.szut.dev/auth/realms/szut/protocol/openid-connect/token"; |  | ||||||
| 
 |  | ||||||
|         HttpHeaders headers = new HttpHeaders(); |  | ||||||
|         headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); |  | ||||||
| 
 |  | ||||||
|         MultiValueMap<String, String> map = new LinkedMultiValueMap<>(); |  | ||||||
|         map.add("grant_type", "password"); |  | ||||||
|         map.add("client_id", "employee-management-service"); |  | ||||||
|         map.add("username", "user"); |  | ||||||
|         map.add("password", "test"); |  | ||||||
| 
 |  | ||||||
|         HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(map, headers); |  | ||||||
| 
 |  | ||||||
|         ResponseEntity<Map> response = this.restTemplate.exchange(url, HttpMethod.POST, request, Map.class); |  | ||||||
| 
 |  | ||||||
|         return Objects.requireNonNull(response.getBody()).get("access_token").toString(); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  | @ -6,7 +6,6 @@ import org.junit.jupiter.api.Test; | ||||||
| import org.springframework.beans.factory.annotation.Autowired; | import org.springframework.beans.factory.annotation.Autowired; | ||||||
| import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; | import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; | ||||||
| import org.springframework.boot.test.context.SpringBootTest; | import org.springframework.boot.test.context.SpringBootTest; | ||||||
| import org.springframework.test.annotation.DirtiesContext; |  | ||||||
| import org.springframework.test.web.servlet.MockMvc; | import org.springframework.test.web.servlet.MockMvc; | ||||||
| 
 | 
 | ||||||
| import java.time.LocalDate; | import java.time.LocalDate; | ||||||
|  | @ -19,7 +18,6 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. | ||||||
| 
 | 
 | ||||||
| @SpringBootTest | @SpringBootTest | ||||||
| @AutoConfigureMockMvc(addFilters = false) | @AutoConfigureMockMvc(addFilters = false) | ||||||
| @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) |  | ||||||
| class GetProjectActionTest { | class GetProjectActionTest { | ||||||
|     @Autowired |     @Autowired | ||||||
|     private MockMvc mockMvc; |     private MockMvc mockMvc; | ||||||
|  | @ -28,7 +26,7 @@ class GetProjectActionTest { | ||||||
| 
 | 
 | ||||||
|     @Test |     @Test | ||||||
|     void getProjectTest() throws Exception { |     void getProjectTest() throws Exception { | ||||||
|         ProjectEntity project = new ProjectEntity(); |         var project = new ProjectEntity(); | ||||||
|         project.setId(1); |         project.setId(1); | ||||||
|         project.setComment("comment"); |         project.setComment("comment"); | ||||||
|         project.setContractor(1); |         project.setContractor(1); | ||||||
|  | @ -56,6 +54,6 @@ class GetProjectActionTest { | ||||||
| 
 | 
 | ||||||
|     @Test |     @Test | ||||||
|     void getProjectShouldReturnNotFoundResponseWhenProjectIsNotFound() throws Exception { |     void getProjectShouldReturnNotFoundResponseWhenProjectIsNotFound() throws Exception { | ||||||
|         this.mockMvc.perform(get("/projects/1111")).andExpect(status().isNotFound()); |         this.mockMvc.perform(get("/projects/2")).andExpect(status().isNotFound()); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -1,88 +0,0 @@ | ||||||
| package de.szut.lf8_starter.integration.project; |  | ||||||
| 
 |  | ||||||
| import de.szut.lf8_starter.project.ProjectEntity; |  | ||||||
| import de.szut.lf8_starter.project.ProjectRepository; |  | ||||||
| import org.junit.jupiter.api.Test; |  | ||||||
| import org.springframework.beans.factory.annotation.Autowired; |  | ||||||
| import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; |  | ||||||
| import org.springframework.boot.test.context.SpringBootTest; |  | ||||||
| import org.springframework.http.*; |  | ||||||
| import org.springframework.test.annotation.DirtiesContext; |  | ||||||
| import org.springframework.test.web.servlet.MockMvc; |  | ||||||
| import org.springframework.util.LinkedMultiValueMap; |  | ||||||
| import org.springframework.util.MultiValueMap; |  | ||||||
| import org.springframework.web.client.RestTemplate; |  | ||||||
| 
 |  | ||||||
| import java.time.LocalDate; |  | ||||||
| import java.util.List; |  | ||||||
| import java.util.Map; |  | ||||||
| import java.util.Objects; |  | ||||||
| 
 |  | ||||||
| import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; |  | ||||||
| import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; |  | ||||||
| import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; |  | ||||||
| 
 |  | ||||||
| @SpringBootTest |  | ||||||
| @AutoConfigureMockMvc(addFilters = false) |  | ||||||
| @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) |  | ||||||
| class GetProjectsFromEmployeeTest { |  | ||||||
|     @Autowired |  | ||||||
|     private MockMvc mockMvc; |  | ||||||
|     @Autowired |  | ||||||
|     private ProjectRepository projectRepository; |  | ||||||
|     @Autowired |  | ||||||
|     private RestTemplate restTemplate; |  | ||||||
| 
 |  | ||||||
|     @Test |  | ||||||
|     void getProjectsFromEmployeeTest() throws Exception { |  | ||||||
|         ProjectEntity project = new ProjectEntity(); |  | ||||||
|         project.setId(1); |  | ||||||
|         project.setComment("comment"); |  | ||||||
|         project.setContractor(1); |  | ||||||
|         project.setContractorName("contractorName"); |  | ||||||
|         project.setEndDate(LocalDate.of(2024, 1, 1)); |  | ||||||
|         project.setLeadingEmployee(1); |  | ||||||
|         project.setName("name"); |  | ||||||
|         project.setStartDate(LocalDate.of(2021, 1, 1)); |  | ||||||
|         project.setEmployees(List.of(315L)); |  | ||||||
|         this.projectRepository.save(project); |  | ||||||
| 
 |  | ||||||
|         this.mockMvc.perform(get("/employees/315/projects") |  | ||||||
|                         .header(HttpHeaders.AUTHORIZATION, getBearerToken()) |  | ||||||
|                 ).andExpect(status().isOk()) |  | ||||||
|                 .andExpect(jsonPath("$[0].id").value(1)) |  | ||||||
|                 .andExpect(jsonPath("$[0].name").value("name")) |  | ||||||
|                 .andExpect(jsonPath("$[0].leading_employee").value(1)) |  | ||||||
|                 .andExpect(jsonPath("$[0].employees[0]").value(315)) |  | ||||||
|                 .andExpect(jsonPath("$[0].contractor").value(1)) |  | ||||||
|                 .andExpect(jsonPath("$[0].contractor_name").value("contractorName")) |  | ||||||
|                 .andExpect(jsonPath("$[0].comment").value("comment")) |  | ||||||
|                 .andExpect(jsonPath("$[0].start_date").value("01.01.2021")); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     @Test |  | ||||||
|     void GetProjectsFromEmployeeShouldReturnNotFoundResponseWhenEmployeeIsNotFound() throws Exception { |  | ||||||
|         this.mockMvc.perform(get("/employees/1111/projects") |  | ||||||
|                 .header(HttpHeaders.AUTHORIZATION, getBearerToken()) |  | ||||||
|         ).andExpect(status().isNotFound()); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     private String getBearerToken() { |  | ||||||
|         String url = "https://keycloak.szut.dev/auth/realms/szut/protocol/openid-connect/token"; |  | ||||||
| 
 |  | ||||||
|         HttpHeaders headers = new HttpHeaders(); |  | ||||||
|         headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); |  | ||||||
| 
 |  | ||||||
|         MultiValueMap<String, String> map = new LinkedMultiValueMap<>(); |  | ||||||
|         map.add("grant_type", "password"); |  | ||||||
|         map.add("client_id", "employee-management-service"); |  | ||||||
|         map.add("username", "user"); |  | ||||||
|         map.add("password", "test"); |  | ||||||
| 
 |  | ||||||
|         HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(map, headers); |  | ||||||
| 
 |  | ||||||
|         ResponseEntity<Map> response = this.restTemplate.exchange(url, HttpMethod.POST, request, Map.class); |  | ||||||
| 
 |  | ||||||
|         return Objects.requireNonNull(response.getBody()).get("access_token").toString(); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  | @ -0,0 +1,32 @@ | ||||||
|  | package de.szut.lf8_starter.integration.project; | ||||||
|  | 
 | ||||||
|  | import de.szut.lf8_starter.project.ProjectRepository; | ||||||
|  | import org.junit.jupiter.api.Test; | ||||||
|  | import org.springframework.beans.factory.annotation.Autowired; | ||||||
|  | import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; | ||||||
|  | import org.springframework.boot.test.context.SpringBootTest; | ||||||
|  | import org.springframework.boot.test.web.client.TestRestTemplate; | ||||||
|  | import org.springframework.test.web.servlet.MockMvc; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; | ||||||
|  | import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; | ||||||
|  | 
 | ||||||
|  | @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) | ||||||
|  | @AutoConfigureMockMvc(addFilters = true) | ||||||
|  | class ProjectFindAllNotAuthenticated { | ||||||
|  |     @Autowired | ||||||
|  |     private ProjectRepository projectRepository; | ||||||
|  | 
 | ||||||
|  |     @Autowired | ||||||
|  |     private MockMvc mockMvc; | ||||||
|  | 
 | ||||||
|  |     @Autowired | ||||||
|  |     private TestRestTemplate restTemplate; | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void findAllProjects() throws Exception { | ||||||
|  |         this.mockMvc.perform(get("/projects")) | ||||||
|  |                 .andExpect(status().isUnauthorized()); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | @ -6,7 +6,6 @@ import org.junit.jupiter.api.Test; | ||||||
| import org.springframework.beans.factory.annotation.Autowired; | import org.springframework.beans.factory.annotation.Autowired; | ||||||
| import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; | import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; | ||||||
| import org.springframework.boot.test.context.SpringBootTest; | import org.springframework.boot.test.context.SpringBootTest; | ||||||
| import org.springframework.test.annotation.DirtiesContext; |  | ||||||
| import org.springframework.test.web.servlet.MockMvc; | import org.springframework.test.web.servlet.MockMvc; | ||||||
| 
 | 
 | ||||||
| import java.time.LocalDate; | import java.time.LocalDate; | ||||||
|  | @ -19,7 +18,6 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. | ||||||
| 
 | 
 | ||||||
| @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) | @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) | ||||||
| @AutoConfigureMockMvc(addFilters = false) | @AutoConfigureMockMvc(addFilters = false) | ||||||
| @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) |  | ||||||
| class ProjectFindAllSuccessTest { | class ProjectFindAllSuccessTest { | ||||||
|     @Autowired |     @Autowired | ||||||
|     private ProjectRepository projectRepository; |     private ProjectRepository projectRepository; | ||||||
|  | @ -29,7 +27,7 @@ class ProjectFindAllSuccessTest { | ||||||
| 
 | 
 | ||||||
|     @Test |     @Test | ||||||
|     void findAllProjectsTest() throws Exception { |     void findAllProjectsTest() throws Exception { | ||||||
|         ProjectEntity project = new ProjectEntity(); |         var project = new ProjectEntity(); | ||||||
|         project.setId(1); |         project.setId(1); | ||||||
|         project.setComment("comment"); |         project.setComment("comment"); | ||||||
|         project.setContractor(1); |         project.setContractor(1); | ||||||
|  | @ -38,7 +36,7 @@ class ProjectFindAllSuccessTest { | ||||||
|         project.setLeadingEmployee(1); |         project.setLeadingEmployee(1); | ||||||
|         project.setName("name"); |         project.setName("name"); | ||||||
|         project.setStartDate(LocalDate.of(2021, 1, 1)); |         project.setStartDate(LocalDate.of(2021, 1, 1)); | ||||||
|         project.setEmployees(List.of(1L, 2L, 3L)); |         project.setEmployees(List.of(1L,2L,3L)); | ||||||
|         this.projectRepository.save(project); |         this.projectRepository.save(project); | ||||||
| 
 | 
 | ||||||
|         this.mockMvc.perform(get("/projects")) |         this.mockMvc.perform(get("/projects")) | ||||||
|  |  | ||||||
|  | @ -1,87 +0,0 @@ | ||||||
| package de.szut.lf8_starter.integration.project; |  | ||||||
| 
 |  | ||||||
| import de.szut.lf8_starter.project.ProjectEntity; |  | ||||||
| import de.szut.lf8_starter.project.ProjectRepository; |  | ||||||
| import org.junit.jupiter.api.Test; |  | ||||||
| import org.springframework.beans.factory.annotation.Autowired; |  | ||||||
| import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; |  | ||||||
| import org.springframework.boot.test.context.SpringBootTest; |  | ||||||
| import org.springframework.http.*; |  | ||||||
| import org.springframework.test.annotation.DirtiesContext; |  | ||||||
| import org.springframework.test.web.servlet.MockMvc; |  | ||||||
| import org.springframework.util.LinkedMultiValueMap; |  | ||||||
| import org.springframework.util.MultiValueMap; |  | ||||||
| import org.springframework.web.client.RestTemplate; |  | ||||||
| 
 |  | ||||||
| import java.time.LocalDate; |  | ||||||
| import java.util.List; |  | ||||||
| import java.util.Map; |  | ||||||
| import java.util.Objects; |  | ||||||
| 
 |  | ||||||
| import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete; |  | ||||||
| import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; |  | ||||||
| 
 |  | ||||||
| @SpringBootTest |  | ||||||
| @AutoConfigureMockMvc(addFilters = false) |  | ||||||
| @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) |  | ||||||
| class RemoveEmployeeFromProjectIntegrationTest { |  | ||||||
|     @Autowired |  | ||||||
|     private MockMvc mockMvc; |  | ||||||
| 
 |  | ||||||
|     @Autowired |  | ||||||
|     private RestTemplate restTemplate; |  | ||||||
| 
 |  | ||||||
|     @Autowired |  | ||||||
|     private ProjectRepository projectRepository; |  | ||||||
| 
 |  | ||||||
|     @Test |  | ||||||
|     void removeEmployeeFromProject() throws Exception { |  | ||||||
|         ProjectEntity project = new ProjectEntity(); |  | ||||||
|         project.setComment("comment"); |  | ||||||
|         project.setContractor(1); |  | ||||||
|         project.setContractorName("contractorName"); |  | ||||||
|         project.setEndDate(LocalDate.of(2024, 1, 1)); |  | ||||||
|         project.setLeadingEmployee(1); |  | ||||||
|         project.setName("name"); |  | ||||||
|         project.setStartDate(LocalDate.of(2021, 1, 1)); |  | ||||||
|         project.setEmployees(List.of(1L, 2L, 3L, 312L)); |  | ||||||
|         this.projectRepository.save(project); |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|         mockMvc.perform(delete("/projects/{projectId}/employees/{employeeId}", 1, 312) |  | ||||||
|                         .header(HttpHeaders.AUTHORIZATION, getBearerToken()) |  | ||||||
|                         .contentType(MediaType.APPLICATION_JSON)) |  | ||||||
|                 .andExpect(status().isNoContent()); |  | ||||||
| 
 |  | ||||||
|         ProjectEntity updatedProject = projectRepository.findById(1L).get(); |  | ||||||
| 
 |  | ||||||
|         assert !updatedProject.getEmployees().contains(312L); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     private String getBearerToken() { |  | ||||||
|         String url = "https://keycloak.szut.dev/auth/realms/szut/protocol/openid-connect/token"; |  | ||||||
| 
 |  | ||||||
|         HttpHeaders headers = new HttpHeaders(); |  | ||||||
|         headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); |  | ||||||
| 
 |  | ||||||
|         MultiValueMap<String, String> map = new LinkedMultiValueMap<>(); |  | ||||||
|         map.add("grant_type", "password"); |  | ||||||
|         map.add("client_id", "employee-management-service"); |  | ||||||
|         map.add("username", "user"); |  | ||||||
|         map.add("password", "test"); |  | ||||||
| 
 |  | ||||||
|         HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(map, headers); |  | ||||||
| 
 |  | ||||||
|         ResponseEntity<Map> response = this.restTemplate.exchange(url, HttpMethod.POST, request, Map.class); |  | ||||||
| 
 |  | ||||||
|         return Objects.requireNonNull(response.getBody()).get("access_token").toString(); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     @Test |  | ||||||
|     void removeEmployeeShouldReturn404IfProjectNotFound() throws Exception { |  | ||||||
|         mockMvc.perform(delete("/projects/{projectId}/employees/{employeeId}", 1987234987, 312) |  | ||||||
|                         .header(HttpHeaders.AUTHORIZATION, getBearerToken()) |  | ||||||
|                         .contentType(MediaType.APPLICATION_JSON)) |  | ||||||
|                 .andExpect(status().isNotFound()); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  | @ -6,7 +6,6 @@ import org.junit.jupiter.api.Test; | ||||||
| import org.springframework.beans.factory.annotation.Autowired; | import org.springframework.beans.factory.annotation.Autowired; | ||||||
| import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; | import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; | ||||||
| import org.springframework.boot.test.context.SpringBootTest; | import org.springframework.boot.test.context.SpringBootTest; | ||||||
| import org.springframework.test.annotation.DirtiesContext; |  | ||||||
| import org.springframework.test.web.servlet.MockMvc; | import org.springframework.test.web.servlet.MockMvc; | ||||||
| 
 | 
 | ||||||
| import java.time.LocalDate; | import java.time.LocalDate; | ||||||
|  | @ -18,7 +17,6 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. | ||||||
| 
 | 
 | ||||||
| @SpringBootTest | @SpringBootTest | ||||||
| @AutoConfigureMockMvc(addFilters = false) | @AutoConfigureMockMvc(addFilters = false) | ||||||
| @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) |  | ||||||
| class RemoveProjectActionTest { | class RemoveProjectActionTest { | ||||||
|     @Autowired |     @Autowired | ||||||
|     private MockMvc mockMvc; |     private MockMvc mockMvc; | ||||||
|  | @ -27,7 +25,7 @@ class RemoveProjectActionTest { | ||||||
| 
 | 
 | ||||||
|     @Test |     @Test | ||||||
|     void deleteProjectTest() throws Exception { |     void deleteProjectTest() throws Exception { | ||||||
|         ProjectEntity project = new ProjectEntity(); |         var project = new ProjectEntity(); | ||||||
|         project.setComment("comment"); |         project.setComment("comment"); | ||||||
|         project.setContractor(1); |         project.setContractor(1); | ||||||
|         project.setContractorName("contractorName"); |         project.setContractorName("contractorName"); | ||||||
|  |  | ||||||
|  | @ -8,13 +8,11 @@ import org.springframework.beans.factory.annotation.Autowired; | ||||||
| import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; | import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; | ||||||
| import org.springframework.boot.test.context.SpringBootTest; | import org.springframework.boot.test.context.SpringBootTest; | ||||||
| import org.springframework.http.MediaType; | import org.springframework.http.MediaType; | ||||||
| import org.springframework.test.annotation.DirtiesContext; |  | ||||||
| import org.springframework.test.web.servlet.MockMvc; | import org.springframework.test.web.servlet.MockMvc; | ||||||
| 
 | 
 | ||||||
| import java.time.LocalDate; | import java.time.LocalDate; | ||||||
| import java.util.Arrays; | import java.util.Arrays; | ||||||
| import java.util.List; | import java.util.List; | ||||||
| import java.util.Optional; |  | ||||||
| 
 | 
 | ||||||
| import static org.assertj.core.api.Assertions.assertThat; | import static org.assertj.core.api.Assertions.assertThat; | ||||||
| import static org.hamcrest.Matchers.is; | import static org.hamcrest.Matchers.is; | ||||||
|  | @ -24,7 +22,6 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. | ||||||
| 
 | 
 | ||||||
| @SpringBootTest | @SpringBootTest | ||||||
| @AutoConfigureMockMvc(addFilters = false) | @AutoConfigureMockMvc(addFilters = false) | ||||||
| @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) |  | ||||||
| class UpdateProjectActionTest { | class UpdateProjectActionTest { | ||||||
|     @Autowired |     @Autowired | ||||||
|     private MockMvc mockMvc; |     private MockMvc mockMvc; | ||||||
|  | @ -58,7 +55,7 @@ class UpdateProjectActionTest { | ||||||
|                   } |                   } | ||||||
|                 """; |                 """; | ||||||
| 
 | 
 | ||||||
|         final String contentAsString = this.mockMvc.perform( |         final var contentAsString = this.mockMvc.perform( | ||||||
|                         put("/projects/1").content(content).contentType(MediaType.APPLICATION_JSON) |                         put("/projects/1").content(content).contentType(MediaType.APPLICATION_JSON) | ||||||
|                 ) |                 ) | ||||||
|                 .andExpect(status().isOk()) |                 .andExpect(status().isOk()) | ||||||
|  | @ -74,9 +71,9 @@ class UpdateProjectActionTest { | ||||||
|                 .getResponse() |                 .getResponse() | ||||||
|                 .getContentAsString(); |                 .getContentAsString(); | ||||||
| 
 | 
 | ||||||
|         final long id = Long.parseLong(new JSONObject(contentAsString).get("id").toString()); |         final var id = Long.parseLong(new JSONObject(contentAsString).get("id").toString()); | ||||||
| 
 | 
 | ||||||
|         final Optional<ProjectEntity> existingProject = this.projectRepository.findById(id); |         final var existingProject = this.projectRepository.findById(id); | ||||||
|         assertThat(existingProject.get().getName()).isEqualTo("updatedName"); |         assertThat(existingProject.get().getName()).isEqualTo("updatedName"); | ||||||
|         assertThat(existingProject.get().getLeadingEmployee()).isEqualTo(2); |         assertThat(existingProject.get().getLeadingEmployee()).isEqualTo(2); | ||||||
|         assertThat(existingProject.get().getContractor()).isEqualTo(6); |         assertThat(existingProject.get().getContractor()).isEqualTo(6); | ||||||
|  | @ -106,13 +103,13 @@ class UpdateProjectActionTest { | ||||||
|                 {} |                 {} | ||||||
|                 """; |                 """; | ||||||
| 
 | 
 | ||||||
|         final String contentAsString = this.mockMvc.perform( |         final var contentAsString = this.mockMvc.perform( | ||||||
|                         put("/projects/1").content(content).contentType(MediaType.APPLICATION_JSON) |                         put("/projects/1").content(content).contentType(MediaType.APPLICATION_JSON) | ||||||
|                 ) |                 ) | ||||||
|                 .andExpect(status().isOk()) |                 .andExpect(status().isOk()) | ||||||
|                 .andExpect(jsonPath("name", is("name"))) |                 .andExpect(jsonPath("name", is("name"))) | ||||||
|                 .andExpect(jsonPath("leading_employee", is(1))) |                 .andExpect(jsonPath("leading_employee", is(1))) | ||||||
|                 .andExpect(jsonPath("employees", is(List.of(1, 2, 3)))) |                 .andExpect(jsonPath("employees", is(List.of(1,2,3)))) | ||||||
|                 .andExpect(jsonPath("contractor", is(1))) |                 .andExpect(jsonPath("contractor", is(1))) | ||||||
|                 .andExpect(jsonPath("contractor_name", is("contractorName"))) |                 .andExpect(jsonPath("contractor_name", is("contractorName"))) | ||||||
|                 .andExpect(jsonPath("comment", is("comment"))) |                 .andExpect(jsonPath("comment", is("comment"))) | ||||||
|  | @ -123,9 +120,9 @@ class UpdateProjectActionTest { | ||||||
|                 .getResponse() |                 .getResponse() | ||||||
|                 .getContentAsString(); |                 .getContentAsString(); | ||||||
| 
 | 
 | ||||||
|         final long id = Long.parseLong(new JSONObject(contentAsString).get("id").toString()); |         final var id = Long.parseLong(new JSONObject(contentAsString).get("id").toString()); | ||||||
| 
 | 
 | ||||||
|         final Optional<ProjectEntity> existingProject = this.projectRepository.findById(id); |         final var existingProject = this.projectRepository.findById(id); | ||||||
|         assertThat(existingProject.get().getName()).isEqualTo("name"); |         assertThat(existingProject.get().getName()).isEqualTo("name"); | ||||||
|         assertThat(existingProject.get().getLeadingEmployee()).isEqualTo(1); |         assertThat(existingProject.get().getLeadingEmployee()).isEqualTo(1); | ||||||
|         assertThat(existingProject.get().getContractor()).isEqualTo(1); |         assertThat(existingProject.get().getContractor()).isEqualTo(1); | ||||||
|  | @ -138,6 +135,6 @@ class UpdateProjectActionTest { | ||||||
| 
 | 
 | ||||||
|     @Test |     @Test | ||||||
|     void updateProjectShouldReturnNotFoundResponseWhenProjectIsNotFound() throws Exception { |     void updateProjectShouldReturnNotFoundResponseWhenProjectIsNotFound() throws Exception { | ||||||
|         this.mockMvc.perform(put("/projects/98723498798").content("{}").contentType(MediaType.APPLICATION_JSON)).andExpect(status().isNotFound()); |         this.mockMvc.perform(put("/projects/2").content("{}").contentType(MediaType.APPLICATION_JSON)).andExpect(status().isNotFound()); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -0,0 +1,24 @@ | ||||||
|  | package de.szut.lf8_starter.integration.welcome; | ||||||
|  | 
 | ||||||
|  | import org.junit.jupiter.api.Test; | ||||||
|  | import org.springframework.beans.factory.annotation.Autowired; | ||||||
|  | import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; | ||||||
|  | import org.springframework.boot.test.context.SpringBootTest; | ||||||
|  | import org.springframework.test.web.servlet.MockMvc; | ||||||
|  | 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; | ||||||
|  | 
 | ||||||
|  | @SpringBootTest | ||||||
|  | @AutoConfigureMockMvc | ||||||
|  | class WelcomeTest { | ||||||
|  |     @Autowired | ||||||
|  |     private MockMvc mockMvc; | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     void welcomeTest() throws Exception { | ||||||
|  |         mockMvc.perform(get("/welcome")) | ||||||
|  |                 .andExpect(status().isOk()) | ||||||
|  |                 .andExpect(content().string("welcome to lf8_starter")); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | @ -1,6 +0,0 @@ | ||||||
| spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE |  | ||||||
| spring.datasource.driverClassName=org.h2.Driver |  | ||||||
| spring.datasource.username=sa |  | ||||||
| spring.datasource.password=password |  | ||||||
| spring.jpa.database-platform=org.hibernate.dialect.H2Dialect |  | ||||||
| spring.jpa.hibernate.ddl-auto=create-drop |  | ||||||
		Reference in a new issue