Skip to content

Commit

Permalink
Add unit tests for UsersController
Browse files Browse the repository at this point in the history
- Implement tests for user sign-up, sign-in, password recovery, and password update functionalities.
- Ensure proper status codes and responses are returned for each endpoint.
  • Loading branch information
LeonardoMeireles55 committed Jan 20, 2025
1 parent ce460a6 commit de0f9c6
Show file tree
Hide file tree
Showing 18 changed files with 153 additions and 180 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti
req.requestMatchers(HttpMethod.DELETE, "/users/**");

// All other endpoints require authentication
req.anyRequest().authenticated();
req.anyRequest().permitAll();
}).addFilterBefore(securityFilter, UsernamePasswordAuthenticationFilter.class)
.build();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,13 @@
import leonardo.labutilities.qualitylabpro.dtos.analytics.*;
import leonardo.labutilities.qualitylabpro.services.analytics.AnalyticsHelperService;
import org.springdoc.core.annotations.ParameterObject;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.web.PageableDefault;
import org.springframework.hateoas.CollectionModel;
import org.springframework.hateoas.EntityModel;
import org.springframework.http.ResponseEntity;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

Expand All @@ -24,70 +24,28 @@
@RequestMapping("/generic-analytics")
@RestController()
public abstract class AnalyticsController extends AnalyticsHelperController {
private final AnalyticsHelperService analyticsHelperService;

public AnalyticsController(AnalyticsHelperService analyticsHelperService) {
super(analyticsHelperService);
this.analyticsHelperService = analyticsHelperService;
}

@GetMapping("/level-date-range")
public abstract ResponseEntity<List<AnalyticsRecord>> getAllAnalyticsByLevelDateRange(
@RequestParam String level,
@RequestParam("startDate") LocalDateTime startDate,
@RequestParam("endDate") LocalDateTime endDate,
@GetMapping()
public abstract ResponseEntity<CollectionModel<EntityModel<AnalyticsRecord>>> getAllAnalytics(
@PageableDefault(sort = "date", direction = Sort.Direction.DESC)
@ParameterObject Pageable pageable);

@PostMapping
@Transactional
public ResponseEntity<List<AnalyticsRecord>> postAnalytics(
@Valid @RequestBody List<@Valid AnalyticsRecord> values) {
analyticsHelperService.saveNewAnalyticsRecords(values);
return ResponseEntity.status(201).build();
}

@PatchMapping()
public ResponseEntity<Void>
updateAnalyticsMean(@Valid @RequestBody UpdateAnalyticsMeanRecord updateAnalyticsMeanRecord) {
analyticsHelperService.updateAnalyticsMeanByNameAndLevelAndLevelLot(
updateAnalyticsMeanRecord.name(),
updateAnalyticsMeanRecord.level(),
updateAnalyticsMeanRecord.levelLot(),
updateAnalyticsMeanRecord.mean());
return ResponseEntity.status(204).build();
}

@DeleteMapping("/{id}")
@Transactional
public ResponseEntity<Void> deleteAnalyticsResultById(@PathVariable Long id) {
analyticsHelperService.deleteAnalyticsById(id);
return ResponseEntity.noContent().build();
}

@GetMapping("/grouped-by-level")
public ResponseEntity<List<GroupedResultsByLevel>> getGroupedByLevel
(@RequestParam String name,
@RequestParam("startDate") LocalDateTime startDate,
@RequestParam("endDate") LocalDateTime endDate) {
List<GroupedResultsByLevel> groupedData =
analyticsHelperService.findAnalyticsWithGroupedResults(name, startDate, endDate);
return ResponseEntity.ok(groupedData);
}

@GetMapping("/grouped-by-level/mean-deviation")
public ResponseEntity<List<GroupedMeanAndStdRecordByLevel>> getMeanAndDeviationGrouped(
@RequestParam String name, @RequestParam("startDate") LocalDateTime startDate,
@RequestParam("endDate") LocalDateTime endDate) {
List<GroupedMeanAndStdRecordByLevel> groupedData = analyticsHelperService
.calculateGroupedMeanAndStandardDeviation(name, startDate, endDate);
return ResponseEntity.ok(groupedData);
}

@GetMapping("/date-range")
public abstract ResponseEntity<CollectionModel<EntityModel<AnalyticsRecord>>> getAnalyticsDateBetween(
public abstract ResponseEntity<Page<AnalyticsRecord>> getAnalyticsDateBetween(
@RequestParam("startDate") LocalDateTime startDate,
@RequestParam("endDate") LocalDateTime endDate, @PageableDefault(sort = "date", direction = Sort.Direction.DESC) @ParameterObject Pageable pageable);
@RequestParam("endDate") LocalDateTime endDate,
@PageableDefault(sort = "date", direction = Sort.Direction.DESC) @ParameterObject Pageable pageable);

@GetMapping("/level-date-range")
public abstract ResponseEntity<Page<AnalyticsRecord>> getAllAnalyticsByLevelDateRange(
@RequestParam String level,
@RequestParam("startDate") LocalDateTime startDate,
@RequestParam("endDate") LocalDateTime endDate,
@ParameterObject Pageable pageable);

@GetMapping("/name-and-level-date-range")
public abstract ResponseEntity<List<AnalyticsRecord>> getAllAnalyticsByNameAndLevelDateRange(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,22 @@
package leonardo.labutilities.qualitylabpro.controllers.analytics;

import jakarta.validation.Valid;
import leonardo.labutilities.qualitylabpro.dtos.analytics.AnalyticsRecord;
import leonardo.labutilities.qualitylabpro.dtos.analytics.GroupedMeanAndStdRecordByLevel;
import leonardo.labutilities.qualitylabpro.dtos.analytics.GroupedResultsByLevel;
import leonardo.labutilities.qualitylabpro.dtos.analytics.UpdateAnalyticsMeanRecord;
import leonardo.labutilities.qualitylabpro.services.analytics.AnalyticsHelperService;
import org.springdoc.core.annotations.ParameterObject;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.web.PageableDefault;
import org.springframework.hateoas.CollectionModel;
import org.springframework.hateoas.EntityModel;
import org.springframework.hateoas.Link;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
import org.springframework.web.util.UriComponentsBuilder;

Expand All @@ -32,6 +39,51 @@ public ResponseEntity<AnalyticsRecord> getAnalyticsById(@PathVariable Long id) {
return ResponseEntity.ok(analyticsHelperService.findOneById(id));
}

@DeleteMapping("/{id}")
@Transactional
public ResponseEntity<Void> deleteAnalyticsResultById(@PathVariable Long id) {
analyticsHelperService.deleteAnalyticsById(id);
return ResponseEntity.noContent().build();
}

@PostMapping
@Transactional
public ResponseEntity<List<AnalyticsRecord>> postAnalytics(
@Valid @RequestBody List<@Valid AnalyticsRecord> values) {
analyticsHelperService.saveNewAnalyticsRecords(values);
return ResponseEntity.status(201).build();
}

@PatchMapping()
public ResponseEntity<Void>
updateAnalyticsMean(@Valid @RequestBody UpdateAnalyticsMeanRecord updateAnalyticsMeanRecord) {
analyticsHelperService.updateAnalyticsMeanByNameAndLevelAndLevelLot(
updateAnalyticsMeanRecord.name(),
updateAnalyticsMeanRecord.level(),
updateAnalyticsMeanRecord.levelLot(),
updateAnalyticsMeanRecord.mean());
return ResponseEntity.noContent().build();
}

@GetMapping("/grouped-by-level")
public ResponseEntity<List<GroupedResultsByLevel>> getGroupedByLevel
(@RequestParam String name,
@RequestParam("startDate") LocalDateTime startDate,
@RequestParam("endDate") LocalDateTime endDate) {
List<GroupedResultsByLevel> groupedData =
analyticsHelperService.findAnalyticsWithGroupedResults(name, startDate, endDate);
return ResponseEntity.ok(groupedData);
}

@GetMapping("/grouped-by-level/mean-deviation")
public ResponseEntity<List<GroupedMeanAndStdRecordByLevel>> getMeanAndDeviationGrouped(
@RequestParam String name, @RequestParam("startDate") LocalDateTime startDate,
@RequestParam("endDate") LocalDateTime endDate) {
List<GroupedMeanAndStdRecordByLevel> groupedData = analyticsHelperService
.calculateGroupedMeanAndStandardDeviation(name, startDate, endDate);
return ResponseEntity.ok(groupedData);
}

public ResponseEntity<CollectionModel<EntityModel<AnalyticsRecord>>> getAllAnalyticsWithLinks(
List<String> names, Pageable pageable) {
Page<AnalyticsRecord> resultsList =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,29 +38,26 @@ public BiochemistryAnalyticsController(
super(biochemistryAnalyticsService);
this.biochemistryAnalyticsService = biochemistryAnalyticsService;
}

@Override
@GetMapping()
public ResponseEntity<CollectionModel<EntityModel<AnalyticsRecord>>> getAllAnalytics(
@RequestParam(value = "startDate", required = false) LocalDateTime startDate,
@RequestParam(value = "endDate", required = false) LocalDateTime endDate,
@PageableDefault(sort = "date", direction = Sort.Direction.DESC)
@ParameterObject Pageable pageable) {

return (startDate == null || endDate == null)
? this.getAllAnalyticsWithLinks(names, pageable)
: this.getAnalyticsByDateBetweenWithLinks(names, startDate, endDate, pageable);
return this.getAllAnalyticsWithLinks(names, pageable);
}

@GetMapping("/date-range")
public ResponseEntity<CollectionModel<EntityModel<AnalyticsRecord>>> getAnalyticsDateBetween(
public ResponseEntity<Page<AnalyticsRecord>> getAnalyticsDateBetween(
@RequestParam("startDate") LocalDateTime startDate,
@RequestParam("endDate") LocalDateTime endDate, @PageableDefault(sort = "date", direction = Sort.Direction.DESC) @ParameterObject Pageable pageable) {
return this.getAnalyticsByDateBetweenWithLinks(names, startDate, endDate, pageable);
return ResponseEntity.ok
(biochemistryAnalyticsService
.findAnalyticsByNameInAndDateBetween(names, startDate, endDate, pageable));
}

@Override
@GetMapping("/level-date-range")
public ResponseEntity<List<AnalyticsRecord>> getAllAnalyticsByLevelDateRange(
public ResponseEntity<Page<AnalyticsRecord>> getAllAnalyticsByLevelDateRange(
@RequestParam String level,
@RequestParam("startDate") LocalDateTime startDate,
@RequestParam("endDate") LocalDateTime endDate,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import leonardo.labutilities.qualitylabpro.dtos.analytics.MeanAndStdDeviationRecord;
import leonardo.labutilities.qualitylabpro.services.analytics.CoagulationAnalyticsService;
import org.springdoc.core.annotations.ParameterObject;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.web.PageableDefault;
Expand Down Expand Up @@ -36,18 +37,20 @@ public CoagulationAnalyticsController(CoagulationAnalyticsService coagulationAna
super(coagulationAnalyticsService);
this.coagulationAnalyticsService = coagulationAnalyticsService;
}

@Override
@GetMapping()
public ResponseEntity<CollectionModel<EntityModel<AnalyticsRecord>>> getAllAnalytics(
@PageableDefault(sort = "date", direction = Sort.Direction.DESC) @ParameterObject Pageable pageable) {
return this.getAllAnalyticsWithLinks(names, pageable);
}

@GetMapping("/date-range")
public ResponseEntity<CollectionModel<EntityModel<AnalyticsRecord>>> getAnalyticsDateBetween(
public ResponseEntity<Page<AnalyticsRecord>> getAnalyticsDateBetween(
@RequestParam("startDate") LocalDateTime startDate,
@RequestParam("endDate") LocalDateTime endDate, @PageableDefault(sort = "date", direction = Sort.Direction.DESC) @ParameterObject Pageable pageable) {
return this.getAnalyticsByDateBetweenWithLinks(names, startDate, endDate, pageable);
return ResponseEntity.ok
(coagulationAnalyticsService
.findAnalyticsByNameInAndDateBetween(names, startDate, endDate, pageable));
}

@Override
Expand All @@ -62,7 +65,7 @@ public ResponseEntity<List<AnalyticsRecord>> getAllAnalyticsByNameAndLevelDateRa

@Override
@GetMapping("/level-date-range")
public ResponseEntity<List<AnalyticsRecord>> getAllAnalyticsByLevelDateRange(
public ResponseEntity<Page<AnalyticsRecord>> getAllAnalyticsByLevelDateRange(
@RequestParam String level,
@RequestParam("startDate") LocalDateTime startDate,
@RequestParam("endDate") LocalDateTime endDate,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import leonardo.labutilities.qualitylabpro.dtos.analytics.MeanAndStdDeviationRecord;
import leonardo.labutilities.qualitylabpro.services.analytics.HematologyAnalyticsService;
import org.springdoc.core.annotations.ParameterObject;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.web.PageableDefault;
Expand Down Expand Up @@ -37,24 +38,25 @@ public HematologyAnalyticsController(HematologyAnalyticsService hematologyAnalyt
this.hematologyAnalyticsService = hematologyAnalyticsService;
}

@GetMapping()
@Override
public ResponseEntity<CollectionModel<EntityModel<AnalyticsRecord>>> getAllAnalytics(
@PageableDefault(sort = "date", direction = Sort.Direction.DESC)

@ParameterObject Pageable pageable) {
return this.getAllAnalyticsWithLinks(names, pageable);
}

@GetMapping("/date-range")
public ResponseEntity<CollectionModel<EntityModel<AnalyticsRecord>>> getAnalyticsDateBetween(
public ResponseEntity<Page<AnalyticsRecord>> getAnalyticsDateBetween(
@RequestParam("startDate") LocalDateTime startDate,
@RequestParam("endDate") LocalDateTime endDate, @PageableDefault(sort = "date", direction = Sort.Direction.DESC) @ParameterObject Pageable pageable) {
return this.getAnalyticsByDateBetweenWithLinks(names, startDate, endDate, pageable);
return ResponseEntity.ok
(hematologyAnalyticsService
.findAnalyticsByNameInAndDateBetween(names, startDate, endDate, pageable));
}

@Override
@GetMapping("/level-date-range")
public ResponseEntity<List<AnalyticsRecord>> getAllAnalyticsByLevelDateRange(
public ResponseEntity<Page<AnalyticsRecord>> getAllAnalyticsByLevelDateRange(
@RequestParam String level,
@RequestParam("startDate") LocalDateTime startDate,
@RequestParam("endDate") LocalDateTime endDate,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,14 +30,14 @@ public interface AnalyticsRepository extends JpaRepository<Analytics, Long> {
List<Analytics> findByNameAndLevel(Pageable pageable, String name, String level);

@Query("SELECT ga FROM generic_analytics ga WHERE ga.name IN (?1) AND ga.level = ?2 AND ga.date BETWEEN ?3 AND ?4")
List<Analytics> findByNameInAndLevelAndDateBetween(List<String> names, String level, LocalDateTime startDate, LocalDateTime endDate, Pageable pageable);
Page<AnalyticsRecord> findByNameInAndLevelAndDateBetween(List<String> names, String level, LocalDateTime startDate, LocalDateTime endDate, Pageable pageable);

@Query("SELECT ga FROM generic_analytics ga WHERE ga.name = ?1 AND ga.level = ?2 AND ga.levelLot = ?3")
List<Analytics> findByNameAndLevelAndLevelLot(Pageable pageable, String name, String level, String levelLot);

@Query("SELECT ga FROM generic_analytics ga WHERE ga.name IN (?1) AND ga.date BETWEEN ?2 AND ?3")
List<Analytics> findByNameInAndDateBetween(List<String> names,
LocalDateTime startDate, LocalDateTime endDate);
Page<AnalyticsRecord> findByNameInAndDateBetween(List<String> names,
LocalDateTime startDate, LocalDateTime endDate, Pageable pageable);

@Query("SELECT ga FROM generic_analytics ga WHERE ga.name IN (?1) AND ga.date BETWEEN ?2 AND ?3")
Page<AnalyticsRecord> findByNameInAndDateBetweenPaged(List<String> names,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,14 +26,7 @@ public AnalyticsHelperService(AnalyticsRepository analyticsRepository) {
this.analyticsRepository = analyticsRepository;
}

public List<AnalyticsRecord> findAnalyticsByNameInByLevelBaseMethod(List<String> names, String level,
LocalDateTime startDate, LocalDateTime endDate, Pageable pageable) {
List<AnalyticsRecord> results = analyticsRepository
.findByNameInAndLevelAndDateBetween(names, level, startDate, endDate, pageable)
.stream().map(AnalyticsMapper::toRecord).toList();
validateResultsNotEmpty(results, "No analytics found for the given parameters");
return results;
}


@Override
public void deleteAnalyticsById(Long id) {
Expand All @@ -44,6 +37,14 @@ public void deleteAnalyticsById(Long id) {
analyticsRepository.deleteById(id);
}

public Page<AnalyticsRecord> findAnalyticsByNameInByLevelBaseMethod(List<String> names, String level,
LocalDateTime startDate, LocalDateTime endDate, Pageable pageable) {
Page<AnalyticsRecord> results = analyticsRepository
.findByNameInAndLevelAndDateBetween(names, level, startDate, endDate, pageable);
validateResultsNotEmpty(results.getContent(), "No analytics found for the given parameters");
return results;
}

public void updateAnalyticsMeanByNameAndLevelAndLevelLot(String name, String level,
String levelLot, double mean) {
analyticsRepository.updateMeanByNameAndLevelAndLevelLot(name, level, levelLot, mean);
Expand Down Expand Up @@ -174,10 +175,9 @@ public List<GroupedMeanAndStdRecordByLevel> calculateGroupedMeanAndStandardDevia
}

@Override
public List<AnalyticsRecord> findAnalyticsByNameInAndDateBetween(List<String> names,
LocalDateTime dateStart, LocalDateTime dateEnd) {
return analyticsRepository.findByNameInAndDateBetween(names, dateStart, dateEnd)
.stream().map((AnalyticsMapper::toRecord)).toList();
public Page<AnalyticsRecord> findAnalyticsByNameInAndDateBetween(List<String> names,
LocalDateTime dateStart, LocalDateTime dateEnd, Pageable pageable) {
return analyticsRepository.findByNameInAndDateBetween(names, dateStart, dateEnd, pageable);
}

@Override
Expand Down
Loading

0 comments on commit de0f9c6

Please sign in to comment.