Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

TMI2-391 Spotlight submission endpoints for count and last submission date #71

Merged
merged 9 commits into from
Nov 22, 2023
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import gov.cabinetoffice.gap.adminbackend.annotations.SpotlightPublisherHeaderValidator;
import gov.cabinetoffice.gap.adminbackend.dtos.spotlightSubmissions.SpotlightSubmissionDto;
import gov.cabinetoffice.gap.adminbackend.entities.SpotlightSubmission;
import gov.cabinetoffice.gap.adminbackend.enums.SpotlightSubmissionStatus;
import gov.cabinetoffice.gap.adminbackend.mappers.SpotlightSubmissionMapper;
import gov.cabinetoffice.gap.adminbackend.services.SpotlightSubmissionService;
import io.swagger.v3.oas.annotations.Operation;
Expand Down Expand Up @@ -56,4 +57,17 @@ public ResponseEntity<SpotlightSubmissionDto> getSpotlightSubmissionById(
.body(spotlightSubmissionMapper.spotlightSubmissionToSpotlightSubmissionDto(spotlightSubmission));
}

@GetMapping(value = "/count/{schemeId}")
public ResponseEntity<Long> getSpotlightSubmissionCount(@PathVariable Integer schemeId) {
final Long count = spotlightSubmissionService.getCountBySchemeIdAndStatus(schemeId,
SpotlightSubmissionStatus.SENT);
return ResponseEntity.ok(count);
}

@GetMapping(value = "/last-updated/{schemeId}")
public ResponseEntity<String> getLastUpdatedDate(@PathVariable Integer schemeId) {
final String date = spotlightSubmissionService.getLastSubmissionDate(schemeId, SpotlightSubmissionStatus.SENT);
return ResponseEntity.ok(date);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,7 @@
import lombok.Setter;
import lombok.ToString;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.persistence.*;
import java.time.Instant;
import java.util.ArrayList;
import java.util.List;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,14 @@
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.UUID;

@Repository
public interface SpotlightSubmissionRepository extends JpaRepository<SpotlightSubmission, UUID> {

List<SpotlightSubmission> findByGrantSchemeIdAndStatus(Integer id, String status);

long countByGrantSchemeIdAndStatus(Integer id, String status);

}
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,16 @@

import gov.cabinetoffice.gap.adminbackend.entities.SpotlightBatch;
import gov.cabinetoffice.gap.adminbackend.entities.SpotlightSubmission;
import gov.cabinetoffice.gap.adminbackend.enums.SpotlightSubmissionStatus;
import gov.cabinetoffice.gap.adminbackend.exceptions.NotFoundException;
import gov.cabinetoffice.gap.adminbackend.repositories.SpotlightSubmissionRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.time.Instant;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.UUID;

@Service
Expand All @@ -20,4 +25,30 @@ public SpotlightSubmission getSpotlightSubmission(UUID spotlightSubmissionId) {
"A spotlight submission with id " + spotlightSubmissionId + " could not be found"));
}

public void addSpotlightBatchToSpotlightSubmission(UUID spotlightSubmissionId, SpotlightBatch spotlightBatch) {
dylanwrightCO marked this conversation as resolved.
Show resolved Hide resolved
final SpotlightSubmission spotlightSubmission = getSpotlightSubmission(spotlightSubmissionId);

final List<SpotlightBatch> existingBatch = spotlightSubmission.getBatches();
existingBatch.add(spotlightBatch);
spotlightSubmission.setBatches(existingBatch);

spotlightSubmissionRepository.save(spotlightSubmission);
}

public List<SpotlightSubmission> getSubmissionsByBySchemeIdAndStatus(Integer schemeId,
SpotlightSubmissionStatus status) {
return spotlightSubmissionRepository.findByGrantSchemeIdAndStatus(schemeId, status.toString());
}

public long getCountBySchemeIdAndStatus(Integer schemeId, SpotlightSubmissionStatus status) {
return spotlightSubmissionRepository.countByGrantSchemeIdAndStatus(schemeId, status.toString());
}

public String getLastSubmissionDate(Integer schemeId, SpotlightSubmissionStatus status) {
final List<SpotlightSubmission> spotlightSubmissions = getSubmissionsByBySchemeIdAndStatus(schemeId, status);
return spotlightSubmissions.stream().map(SpotlightSubmission::getLastSendAttempt).max(Instant::compareTo)
.map(date -> date.atZone(ZoneOffset.UTC).format(DateTimeFormatter.ofPattern("dd MMMM yyyy")))
.orElse("");
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import gov.cabinetoffice.gap.adminbackend.config.SpotlightPublisherInterceptor;
import gov.cabinetoffice.gap.adminbackend.dtos.spotlightSubmissions.SpotlightSubmissionDto;
import gov.cabinetoffice.gap.adminbackend.entities.SpotlightSubmission;
import gov.cabinetoffice.gap.adminbackend.enums.SpotlightSubmissionStatus;
import gov.cabinetoffice.gap.adminbackend.exceptions.NotFoundException;
import gov.cabinetoffice.gap.adminbackend.mappers.SpotlightSubmissionMapper;
import gov.cabinetoffice.gap.adminbackend.mappers.ValidationErrorMapper;
Expand All @@ -23,8 +24,7 @@

import static org.mockito.Mockito.when;
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;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;

@WebMvcTest(SchemeController.class)
@AutoConfigureMockMvc(addFilters = false)
Expand Down Expand Up @@ -52,6 +52,26 @@ class SpotlightSubmissionControllerTest {
@MockBean
private SpotlightSubmissionMapper spotlightSubmissionMapper;

private final Integer SCHEME_ID = 1;

private final String DATE = "25 September 2023";

@Test
void getSpotlightSubmissionCount() throws Exception {
when(mockSpotlightSubmissionService.getCountBySchemeIdAndStatus(SCHEME_ID, SpotlightSubmissionStatus.SENT))
.thenReturn(Long.valueOf(2));
mockMvc.perform(get("/spotlight-submissions/count/{schemeId}", SCHEME_ID)).andExpect(status().isOk())
.andExpect(content().string("2"));
}

@Test
void getLastUpdatedDate() throws Exception {
when(mockSpotlightSubmissionService.getLastSubmissionDate(SCHEME_ID, SpotlightSubmissionStatus.SENT))
.thenReturn(DATE);
mockMvc.perform(get("/spotlight-submissions/last-updated/{schemeId}", SCHEME_ID)).andExpect(status().isOk())
.andExpect(content().string(DATE));
}

@Nested
class getSpotlightSubmissionById {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import gov.cabinetoffice.gap.adminbackend.annotations.WithAdminSession;
import gov.cabinetoffice.gap.adminbackend.entities.SpotlightSubmission;
import gov.cabinetoffice.gap.adminbackend.enums.SpotlightSubmissionStatus;
import gov.cabinetoffice.gap.adminbackend.exceptions.NotFoundException;
import gov.cabinetoffice.gap.adminbackend.repositories.SpotlightSubmissionRepository;
import org.junit.jupiter.api.Nested;
Expand All @@ -10,11 +11,15 @@
import org.mockito.Mock;
import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;

import java.time.*;
import java.util.List;
import java.util.Optional;
import java.util.UUID;

import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

@SpringJUnitConfig
Expand All @@ -29,6 +34,69 @@ class SpotlightSubmissionServiceTest {
@InjectMocks
private SpotlightSubmissionService spotlightSubmissionService;

private final Integer SCHEME_ID = 1;

private final LocalDate date = LocalDate.of(2023, 9, 25);

private final LocalTime time = LocalTime.of(0, 0, 0);

private final LocalDateTime dateTime = LocalDateTime.of(date, time);

private final Instant DATE = dateTime.toInstant(ZoneOffset.UTC);

private final SpotlightSubmission spotlightSubmission = SpotlightSubmission.builder().id(UUID.randomUUID())
.lastSendAttempt(DATE).build();

@Test
void getSubmissionsByBySchemeIdAndStatus_ReturnsList() {
when(spotlightSubmissionRepository.findByGrantSchemeIdAndStatus(SCHEME_ID,
SpotlightSubmissionStatus.SENT.toString())).thenReturn(List.of(spotlightSubmission));

final List<SpotlightSubmission> result = spotlightSubmissionService
.getSubmissionsByBySchemeIdAndStatus(SCHEME_ID, SpotlightSubmissionStatus.SENT);

verify(spotlightSubmissionRepository).findByGrantSchemeIdAndStatus(SCHEME_ID,
SpotlightSubmissionStatus.SENT.toString());
assertThat(result).isEqualTo(List.of(spotlightSubmission));
}

@Test
void getCountBySchemeIdAndStatus_ReturnsCount() {
when(spotlightSubmissionRepository.countByGrantSchemeIdAndStatus(SCHEME_ID,
SpotlightSubmissionStatus.SENT.toString())).thenReturn(Long.valueOf(2));

final long result = spotlightSubmissionService.getCountBySchemeIdAndStatus(SCHEME_ID,
SpotlightSubmissionStatus.SENT);

verify(spotlightSubmissionRepository).countByGrantSchemeIdAndStatus(SCHEME_ID,
SpotlightSubmissionStatus.SENT.toString());
assertThat(result).isEqualTo(2);

}

@Nested
class getLastSubmissionDate {

@Test
void getLastSubmissionDate_NoSubmissions() {
when(spotlightSubmissionRepository.findByGrantSchemeIdAndStatus(SCHEME_ID,
SpotlightSubmissionStatus.SENT.toString())).thenReturn(List.of());
final String result = spotlightSubmissionService.getLastSubmissionDate(SCHEME_ID,
SpotlightSubmissionStatus.SENT);
assertThat(result).isEmpty();
}

@Test
void getLastSubmissionDate_HasSubmissions() {
when(spotlightSubmissionRepository.findByGrantSchemeIdAndStatus(SCHEME_ID,
SpotlightSubmissionStatus.SENT.toString())).thenReturn(List.of(spotlightSubmission));
final String result = spotlightSubmissionService.getLastSubmissionDate(SCHEME_ID,
SpotlightSubmissionStatus.SENT);
assertThat(result).isEqualTo("25 September 2023");
}

}

@Nested
class getSpotlightSubmission {

Expand Down