From e6ef155b2f3b97a1d8b39e76d72aa88540e9dc8c Mon Sep 17 00:00:00 2001 From: arybakov Date: Thu, 2 Nov 2023 15:22:04 -0600 Subject: [PATCH 01/14] GRAD2-2306 HD-21559-GRAD - P3 - GRAD is creating blank transcripts --- .../controller/GraduationController.java | 2 +- .../graduation/service/GraduationService.java | 29 ++++++++++++++++--- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/api/src/main/java/ca/bc/gov/educ/api/graduation/controller/GraduationController.java b/api/src/main/java/ca/bc/gov/educ/api/graduation/controller/GraduationController.java index 046afef9..6209ca97 100644 --- a/api/src/main/java/ca/bc/gov/educ/api/graduation/controller/GraduationController.java +++ b/api/src/main/java/ca/bc/gov/educ/api/graduation/controller/GraduationController.java @@ -90,7 +90,7 @@ public ResponseEntity reportTranscriptByPen(@PathVariable @NotNull Strin @RequestHeader(name="Authorization") String accessToken) { LOGGER.debug("Report Data By Student Pen: {}", pen); byte[] resultBinary = gradService.prepareTranscriptReport(pen, interim, preview, accessToken.replace(BEARER, "")); - if(resultBinary == null) { + if(resultBinary == null || resultBinary.length == 0) { return new ResponseEntity<>(HttpStatus.NOT_FOUND); } byte[] encoded = Base64.encodeBase64(resultBinary); diff --git a/api/src/main/java/ca/bc/gov/educ/api/graduation/service/GraduationService.java b/api/src/main/java/ca/bc/gov/educ/api/graduation/service/GraduationService.java index 0d0d5199..72d2428f 100644 --- a/api/src/main/java/ca/bc/gov/educ/api/graduation/service/GraduationService.java +++ b/api/src/main/java/ca/bc/gov/educ/api/graduation/service/GraduationService.java @@ -1,5 +1,6 @@ package ca.bc.gov.educ.api.graduation.service; +import ca.bc.gov.educ.api.graduation.exception.ServiceException; import ca.bc.gov.educ.api.graduation.model.dto.GradRequirement; import ca.bc.gov.educ.api.graduation.model.dto.GraduationData; import ca.bc.gov.educ.api.graduation.model.dto.*; @@ -18,6 +19,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; import org.springframework.web.reactive.function.BodyInserters; import org.springframework.web.reactive.function.client.WebClient; @@ -138,10 +140,29 @@ public byte[] prepareTranscriptReport(String pen, String interim, String preview reportParams.setOptions(options); reportParams.setData(reportData); - return webClient.post().uri(educGraduationApiConstants.getTranscriptReport()) - .headers(h -> { h.setBearerAuth(accessToken); h.set(EducGraduationApiConstants.CORRELATION_ID, ThreadLocalStateUtil.getCorrelationID()); } - ).body(BodyInserters.fromValue(reportParams)).retrieve().bodyToMono(byte[].class).block(); - + try { + return webClient.post().uri(educGraduationApiConstants.getTranscriptReport()) + .headers(h -> { + h.setBearerAuth(accessToken); + h.set(EducGraduationApiConstants.CORRELATION_ID, ThreadLocalStateUtil.getCorrelationID()); + } + ).body(BodyInserters.fromValue(reportParams)).retrieve() + .onStatus( + HttpStatus.BAD_REQUEST::equals, + response -> response.bodyToMono(String.class).thenReturn(new ServiceException("BAD_REQUEST", response.statusCode().value())) + ) + .onStatus( + HttpStatus.NO_CONTENT::equals, + response -> response.bodyToMono(String.class).thenReturn(new ServiceException("NO_CONTENT", response.statusCode().value())) + ) + .bodyToMono(byte[].class).block(); + } catch (ServiceException ex) { + if(HttpStatus.BAD_REQUEST.value() == ex.getStatusCode() || HttpStatus.NO_CONTENT.value() == ex.getStatusCode()) { + return new byte[0]; + } else { + throw ex; + } + } } /** From f5d2f11b0150fd4da8372b2cc389c5ffd31274da Mon Sep 17 00:00:00 2001 From: arybakov Date: Thu, 2 Nov 2023 15:32:28 -0600 Subject: [PATCH 02/14] GRAD2-2306 HD-21559-GRAD - P3 - GRAD is creating blank transcripts --- .../bc/gov/educ/api/graduation/service/ReportServiceTest.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/api/src/test/java/ca/bc/gov/educ/api/graduation/service/ReportServiceTest.java b/api/src/test/java/ca/bc/gov/educ/api/graduation/service/ReportServiceTest.java index d9a43918..5925a75c 100644 --- a/api/src/test/java/ca/bc/gov/educ/api/graduation/service/ReportServiceTest.java +++ b/api/src/test/java/ca/bc/gov/educ/api/graduation/service/ReportServiceTest.java @@ -326,6 +326,7 @@ public void testSaveStudentTranscriptReport() { when(this.requestBodyMock.contentType(any())).thenReturn(this.requestBodyMock); when(this.requestBodyMock.body(any(BodyInserter.class))).thenReturn(this.requestHeadersMock); when(this.requestHeadersMock.retrieve()).thenReturn(this.responseMock); + when(this.responseMock.onStatus(any(), any())).thenReturn(this.responseMock); when(this.responseMock.bodyToMono(byte[].class)).thenReturn(Mono.just(bytesSAR)); when(this.webClient.post()).thenReturn(this.requestBodyUriMock); @@ -2109,6 +2110,7 @@ public void testTranscriptReportByPen() throws Exception { when(this.requestBodyMock.contentType(any())).thenReturn(this.requestBodyMock); when(this.requestBodyMock.body(any(BodyInserter.class))).thenReturn(this.requestHeadersMock); when(this.requestHeadersMock.retrieve()).thenReturn(this.responseMock); + when(this.responseMock.onStatus(any(), any())).thenReturn(this.responseMock); when(this.responseMock.bodyToMono(byte[].class)).thenReturn(Mono.just(bytesSAR)); byte[] result = graduationService.prepareTranscriptReport(pen, "Interim", "true", "accessToken"); From caec07ce352d4ad8d4f584d67e2612cd4685a37d Mon Sep 17 00:00:00 2001 From: arybakov Date: Thu, 2 Nov 2023 17:03:14 -0600 Subject: [PATCH 03/14] GRAD2-2306 HD-21559-GRAD - P3 - GRAD is creating blank transcripts --- .../api/graduation/service/ReportService.java | 76 ++++++++++++------- 1 file changed, 47 insertions(+), 29 deletions(-) diff --git a/api/src/main/java/ca/bc/gov/educ/api/graduation/service/ReportService.java b/api/src/main/java/ca/bc/gov/educ/api/graduation/service/ReportService.java index aad18d48..235c95a6 100644 --- a/api/src/main/java/ca/bc/gov/educ/api/graduation/service/ReportService.java +++ b/api/src/main/java/ca/bc/gov/educ/api/graduation/service/ReportService.java @@ -1,6 +1,7 @@ package ca.bc.gov.educ.api.graduation.service; import ca.bc.gov.educ.api.graduation.exception.EntityNotFoundException; +import ca.bc.gov.educ.api.graduation.exception.ServiceException; import ca.bc.gov.educ.api.graduation.model.dto.*; import ca.bc.gov.educ.api.graduation.model.report.GradProgram; import ca.bc.gov.educ.api.graduation.model.report.GradRequirement; @@ -15,6 +16,8 @@ import org.apache.commons.lang3.tuple.Pair; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.ParameterizedTypeReference; +import org.springframework.http.HttpStatus; +import org.springframework.http.HttpStatusCode; import org.springframework.stereotype.Service; import org.springframework.web.reactive.function.BodyInserters; import org.springframework.web.reactive.function.client.WebClient; @@ -908,28 +911,29 @@ private List getAssessmentResults(List stud public void saveStudentTranscriptReportJasper(ReportData sample, String accessToken, UUID studentID, ExceptionMessage exception, boolean isGraduated, boolean overwrite) { String encodedPdfReportTranscript = generateStudentTranscriptReportJasper(sample, accessToken, exception); - GradStudentTranscripts requestObj = new GradStudentTranscripts(); - requestObj.setTranscript(encodedPdfReportTranscript); - requestObj.setStudentID(studentID); - requestObj.setTranscriptTypeCode(sample.getTranscript().getTranscriptTypeCode().getCode()); - requestObj.setDocumentStatusCode("IP"); - requestObj.setOverwrite(overwrite); - if (isGraduated) - requestObj.setDocumentStatusCode(DOCUMENT_STATUS_COMPLETED); - - try { - webClient.post().uri(String.format(educGraduationApiConstants.getUpdateGradStudentTranscript(), isGraduated)) - .headers(h -> { - h.setBearerAuth(accessToken); - h.set(EducGraduationApiConstants.CORRELATION_ID, ThreadLocalStateUtil.getCorrelationID()); - }).body(BodyInserters.fromValue(requestObj)).retrieve().bodyToMono(GradStudentReports.class).block(); - } catch (Exception e) { - if (exception.getExceptionName() == null) { - exception.setExceptionName(GRAD_GRADUATION_REPORT_API_DOWN); - exception.setExceptionDetails(e.getLocalizedMessage()); + if(encodedPdfReportTranscript != null) { + GradStudentTranscripts requestObj = new GradStudentTranscripts(); + requestObj.setTranscript(encodedPdfReportTranscript); + requestObj.setStudentID(studentID); + requestObj.setTranscriptTypeCode(sample.getTranscript().getTranscriptTypeCode().getCode()); + requestObj.setDocumentStatusCode("IP"); + requestObj.setOverwrite(overwrite); + if (isGraduated) + requestObj.setDocumentStatusCode(DOCUMENT_STATUS_COMPLETED); + + try { + webClient.post().uri(String.format(educGraduationApiConstants.getUpdateGradStudentTranscript(), isGraduated)) + .headers(h -> { + h.setBearerAuth(accessToken); + h.set(EducGraduationApiConstants.CORRELATION_ID, ThreadLocalStateUtil.getCorrelationID()); + }).body(BodyInserters.fromValue(requestObj)).retrieve().bodyToMono(GradStudentReports.class).block(); + } catch (Exception e) { + if (exception.getExceptionName() == null) { + exception.setExceptionName(GRAD_GRADUATION_REPORT_API_DOWN); + exception.setExceptionDetails(e.getLocalizedMessage()); + } } } - } private String generateStudentTranscriptReportJasper(ReportData sample, @@ -941,21 +945,35 @@ private String generateStudentTranscriptReportJasper(ReportData sample, reportParams.setOptions(options); reportParams.setData(sample); try { - byte[] bytesSAR = webClient.post().uri(educGraduationApiConstants.getTranscriptReport()) + byte[] bytes = webClient.post().uri(educGraduationApiConstants.getTranscriptReport()) .headers(h -> { - h.setBearerAuth(accessToken); - h.set(EducGraduationApiConstants.CORRELATION_ID, ThreadLocalStateUtil.getCorrelationID()); - }).body(BodyInserters.fromValue(reportParams)).retrieve().bodyToMono(byte[].class).block(); - return getEncodedStringFromBytes(bytesSAR); - } catch (Exception e) { + h.setBearerAuth(accessToken); + h.set(EducGraduationApiConstants.CORRELATION_ID, ThreadLocalStateUtil.getCorrelationID()); + } + ).body(BodyInserters.fromValue(reportParams)) + .retrieve() + .onStatus(HttpStatusCode::is5xxServerError, + response -> response.bodyToMono(String.class).thenReturn(new ServiceException("INTERNAL_SERVER_ERROR", response.statusCode().value()))) + .onStatus( + HttpStatus.BAD_REQUEST::equals, + response -> response.bodyToMono(String.class).thenReturn(new ServiceException("BAD_REQUEST", response.statusCode().value())) + ) + .onStatus( + HttpStatus.NO_CONTENT::equals, + response -> response.bodyToMono(String.class).thenReturn(new ServiceException("NO_CONTENT", response.statusCode().value())) + ) + .bodyToMono(byte[].class).block(); + return getEncodedStringFromBytes(bytes); + } catch (ServiceException ex) { exception.setExceptionName(GRAD_REPORT_API_DOWN); - exception.setExceptionDetails(e.getLocalizedMessage()); + exception.setExceptionDetails(ex.getLocalizedMessage()); return null; } } - private String getEncodedStringFromBytes(byte[] bytesSAR) { - byte[] encoded = Base64.encodeBase64(bytesSAR); + private String getEncodedStringFromBytes(byte[] bytes) { + if(bytes == null) return null; + byte[] encoded = Base64.encodeBase64(bytes); return new String(encoded, StandardCharsets.US_ASCII); } From 64813bde5fbcd941f0f636754550d564f7435d3a Mon Sep 17 00:00:00 2001 From: arybakov Date: Fri, 3 Nov 2023 13:10:54 -0600 Subject: [PATCH 04/14] GRAD2-2306 HD-21559-GRAD - P3 - GRAD is creating blank transcripts --- .../bc/gov/educ/api/graduation/service/GraduationService.java | 4 ---- .../ca/bc/gov/educ/api/graduation/service/ReportService.java | 4 ---- 2 files changed, 8 deletions(-) diff --git a/api/src/main/java/ca/bc/gov/educ/api/graduation/service/GraduationService.java b/api/src/main/java/ca/bc/gov/educ/api/graduation/service/GraduationService.java index 72d2428f..d2734fbe 100644 --- a/api/src/main/java/ca/bc/gov/educ/api/graduation/service/GraduationService.java +++ b/api/src/main/java/ca/bc/gov/educ/api/graduation/service/GraduationService.java @@ -147,10 +147,6 @@ public byte[] prepareTranscriptReport(String pen, String interim, String preview h.set(EducGraduationApiConstants.CORRELATION_ID, ThreadLocalStateUtil.getCorrelationID()); } ).body(BodyInserters.fromValue(reportParams)).retrieve() - .onStatus( - HttpStatus.BAD_REQUEST::equals, - response -> response.bodyToMono(String.class).thenReturn(new ServiceException("BAD_REQUEST", response.statusCode().value())) - ) .onStatus( HttpStatus.NO_CONTENT::equals, response -> response.bodyToMono(String.class).thenReturn(new ServiceException("NO_CONTENT", response.statusCode().value())) diff --git a/api/src/main/java/ca/bc/gov/educ/api/graduation/service/ReportService.java b/api/src/main/java/ca/bc/gov/educ/api/graduation/service/ReportService.java index 235c95a6..34dae8f7 100644 --- a/api/src/main/java/ca/bc/gov/educ/api/graduation/service/ReportService.java +++ b/api/src/main/java/ca/bc/gov/educ/api/graduation/service/ReportService.java @@ -954,10 +954,6 @@ private String generateStudentTranscriptReportJasper(ReportData sample, .retrieve() .onStatus(HttpStatusCode::is5xxServerError, response -> response.bodyToMono(String.class).thenReturn(new ServiceException("INTERNAL_SERVER_ERROR", response.statusCode().value()))) - .onStatus( - HttpStatus.BAD_REQUEST::equals, - response -> response.bodyToMono(String.class).thenReturn(new ServiceException("BAD_REQUEST", response.statusCode().value())) - ) .onStatus( HttpStatus.NO_CONTENT::equals, response -> response.bodyToMono(String.class).thenReturn(new ServiceException("NO_CONTENT", response.statusCode().value())) From f9a89e0d27c2bade390fdc11f5de84cf00d0e165 Mon Sep 17 00:00:00 2001 From: arybakov Date: Wed, 8 Nov 2023 12:29:00 -0700 Subject: [PATCH 05/14] GRAD2-2306 HD-21559-GRAD - P3 - GRAD is creating blank transcripts --- .../api/graduation/service/GraduationService.java | 2 +- .../api/graduation/service/ReportService.java | 15 ++++++++------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/api/src/main/java/ca/bc/gov/educ/api/graduation/service/GraduationService.java b/api/src/main/java/ca/bc/gov/educ/api/graduation/service/GraduationService.java index d2734fbe..7a5d762f 100644 --- a/api/src/main/java/ca/bc/gov/educ/api/graduation/service/GraduationService.java +++ b/api/src/main/java/ca/bc/gov/educ/api/graduation/service/GraduationService.java @@ -153,7 +153,7 @@ public byte[] prepareTranscriptReport(String pen, String interim, String preview ) .bodyToMono(byte[].class).block(); } catch (ServiceException ex) { - if(HttpStatus.BAD_REQUEST.value() == ex.getStatusCode() || HttpStatus.NO_CONTENT.value() == ex.getStatusCode()) { + if(HttpStatus.NO_CONTENT.value() == ex.getStatusCode()) { return new byte[0]; } else { throw ex; diff --git a/api/src/main/java/ca/bc/gov/educ/api/graduation/service/ReportService.java b/api/src/main/java/ca/bc/gov/educ/api/graduation/service/ReportService.java index b1aa173e..37e1b229 100644 --- a/api/src/main/java/ca/bc/gov/educ/api/graduation/service/ReportService.java +++ b/api/src/main/java/ca/bc/gov/educ/api/graduation/service/ReportService.java @@ -311,7 +311,6 @@ private Transcript getTranscriptData(ca.bc.gov.educ.api.graduation.model.dto.Gra private void createCourseListForTranscript(List studentCourseList, ca.bc.gov.educ.api.graduation.model.dto.GraduationData graduationDataStatus, List tList, String provincially, boolean xml) { Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("PST"), Locale.CANADA); String today = EducGraduationApiUtils.formatDate(cal.getTime(), EducGraduationApiConstants.DEFAULT_DATE_FORMAT); - for (StudentCourse sc : studentCourseList) { Date sessionDate = EducGraduationApiUtils.parseDate(sc.getSessionDate() + "/01", EducGraduationApiConstants.SECONDARY_DATE_FORMAT); String sDate = EducGraduationApiUtils.formatDate(sessionDate, EducGraduationApiConstants.DEFAULT_DATE_FORMAT); @@ -830,11 +829,11 @@ private void getStudentCoursesAssessmentsNExams(ReportData data, ca.bc.gov.educ. List studentExamList = sCList .stream() .filter(sc -> "Y".compareTo(sc.getProvExamCourse()) == 0) - .toList(); + .collect(Collectors.toList()); List studentCourseList = sCList .stream() .filter(sc -> "N".compareTo(sc.getProvExamCourse()) == 0) - .toList(); + .collect(Collectors.toList()); List studentAssessmentList = graduationDataStatus.getStudentAssessments().getStudentAssessmentList(); List sCourseList = new ArrayList<>(); List sExamList = new ArrayList<>(); @@ -1061,10 +1060,12 @@ public ReportData prepareCertificateData(GraduationStudentRecord gradResponse, data.setUpdateDate(EducGraduationApiUtils.formatDateForReportJasper(gradResponse.getUpdateDate().toString())); data.setCertificate(getCertificateData(gradResponse, certType)); data.getStudent().setGraduationData(graduationData); - if (certType.getCertificateTypeCode().equals("F") || certType.getCertificateTypeCode().equals("SCF") || certType.getCertificateTypeCode().equals("S")) { - data.getStudent().setFrenchCert(certType.getCertificateTypeCode()); - } else { - data.getStudent().setEnglishCert(certType.getCertificateTypeCode()); + switch (certType.getCertificateTypeCode()) { + case "F", "SCF", "S": + data.getStudent().setFrenchCert(certType.getCertificateTypeCode()); + break; + default: + data.getStudent().setEnglishCert(certType.getCertificateTypeCode()); } return data; } From 9e56d4a17531073eba09dd464ada2991c6cbfe25 Mon Sep 17 00:00:00 2001 From: arybakov Date: Wed, 8 Nov 2023 14:46:55 -0700 Subject: [PATCH 06/14] GRAD2-2306 HD-21559-GRAD - P3 - GRAD is creating blank transcripts --- .../gov/educ/api/graduation/service/ReportService.java | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/api/src/main/java/ca/bc/gov/educ/api/graduation/service/ReportService.java b/api/src/main/java/ca/bc/gov/educ/api/graduation/service/ReportService.java index 37e1b229..747cce2d 100644 --- a/api/src/main/java/ca/bc/gov/educ/api/graduation/service/ReportService.java +++ b/api/src/main/java/ca/bc/gov/educ/api/graduation/service/ReportService.java @@ -1060,12 +1060,10 @@ public ReportData prepareCertificateData(GraduationStudentRecord gradResponse, data.setUpdateDate(EducGraduationApiUtils.formatDateForReportJasper(gradResponse.getUpdateDate().toString())); data.setCertificate(getCertificateData(gradResponse, certType)); data.getStudent().setGraduationData(graduationData); - switch (certType.getCertificateTypeCode()) { - case "F", "SCF", "S": - data.getStudent().setFrenchCert(certType.getCertificateTypeCode()); - break; - default: - data.getStudent().setEnglishCert(certType.getCertificateTypeCode()); + if ("F".equals(certType.getCertificateTypeCode()) || "SCF".equals(certType.getCertificateTypeCode()) || "S".equals(certType.getCertificateTypeCode())) { + data.getStudent().setFrenchCert(certType.getCertificateTypeCode()); + } else { + data.getStudent().setEnglishCert(certType.getCertificateTypeCode()); } return data; } From 31f6f84a0dc4ff02ab0132da76779e10cf671054 Mon Sep 17 00:00:00 2001 From: arybakov Date: Fri, 10 Nov 2023 08:24:58 -0700 Subject: [PATCH 07/14] GRAD2-2306 HD-21559-GRAD - P3 - GRAD is creating blank transcripts --- .../api/graduation/service/ReportService.java | 119 ++++++++++++------ .../graduation/service/ReportServiceTest.java | 4 +- 2 files changed, 81 insertions(+), 42 deletions(-) diff --git a/api/src/main/java/ca/bc/gov/educ/api/graduation/service/ReportService.java b/api/src/main/java/ca/bc/gov/educ/api/graduation/service/ReportService.java index 747cce2d..735e4546 100644 --- a/api/src/main/java/ca/bc/gov/educ/api/graduation/service/ReportService.java +++ b/api/src/main/java/ca/bc/gov/educ/api/graduation/service/ReportService.java @@ -932,7 +932,7 @@ private List getAssessmentResults(List stud public void saveStudentTranscriptReportJasper(ReportData sample, String accessToken, UUID studentID, ExceptionMessage exception, boolean isGraduated, boolean overwrite) { String encodedPdfReportTranscript = generateStudentTranscriptReportJasper(sample, accessToken, exception); - if(encodedPdfReportTranscript != null) { + if(StringUtils.isNotBlank(encodedPdfReportTranscript)) { GradStudentTranscripts requestObj = new GradStudentTranscripts(); requestObj.setTranscript(encodedPdfReportTranscript); requestObj.setStudentID(studentID); @@ -984,12 +984,16 @@ private String generateStudentTranscriptReportJasper(ReportData sample, } catch (ServiceException ex) { exception.setExceptionName(GRAD_REPORT_API_DOWN); exception.setExceptionDetails(ex.getLocalizedMessage()); - return null; + boolean noContent = HttpStatus.NO_CONTENT.value() == ex.getStatusCode(); + if(noContent) { + return ""; + } + throw ex; } } private String getEncodedStringFromBytes(byte[] bytes) { - if(bytes == null) return null; + if(bytes == null || bytes.length == 0) return ""; byte[] encoded = Base64.encodeBase64(bytes); return new String(encoded, StandardCharsets.US_ASCII); } @@ -1072,18 +1076,20 @@ public void saveStudentCertificateReportJasper(GraduationStudentRecord gradRespo ProgramCertificateTranscript certType, boolean isOverwrite) { ReportData certData = prepareCertificateData(gradResponse, graduationDataStatus, certType, accessToken); String encodedPdfReportCertificate = generateStudentCertificateReportJasper(certData, accessToken); - GradStudentCertificates requestObj = new GradStudentCertificates(); - requestObj.setPen(gradResponse.getPen()); - requestObj.setStudentID(gradResponse.getStudentID()); - requestObj.setCertificate(encodedPdfReportCertificate); - requestObj.setGradCertificateTypeCode(certType.getCertificateTypeCode()); - requestObj.setDocumentStatusCode(DOCUMENT_STATUS_COMPLETED); - requestObj.setOverwrite(isOverwrite); - webClient.post().uri(educGraduationApiConstants.getUpdateGradStudentCertificate()) - .headers(h -> { - h.setBearerAuth(accessToken); - h.set(EducGraduationApiConstants.CORRELATION_ID, ThreadLocalStateUtil.getCorrelationID()); - }).body(BodyInserters.fromValue(requestObj)).retrieve().bodyToMono(GradStudentCertificates.class).block(); + if(StringUtils.isNotBlank(encodedPdfReportCertificate)) { + GradStudentCertificates requestObj = new GradStudentCertificates(); + requestObj.setPen(gradResponse.getPen()); + requestObj.setStudentID(gradResponse.getStudentID()); + requestObj.setCertificate(encodedPdfReportCertificate); + requestObj.setGradCertificateTypeCode(certType.getCertificateTypeCode()); + requestObj.setDocumentStatusCode(DOCUMENT_STATUS_COMPLETED); + requestObj.setOverwrite(isOverwrite); + webClient.post().uri(educGraduationApiConstants.getUpdateGradStudentCertificate()) + .headers(h -> { + h.setBearerAuth(accessToken); + h.set(EducGraduationApiConstants.CORRELATION_ID, ThreadLocalStateUtil.getCorrelationID()); + }).body(BodyInserters.fromValue(requestObj)).retrieve().bodyToMono(GradStudentCertificates.class).block(); + } } @@ -1111,12 +1117,27 @@ private String generateStudentCertificateReportJasper(ReportData sample, String ReportRequest reportParams = new ReportRequest(); reportParams.setOptions(options); reportParams.setData(sample); - byte[] bytesSAR = webClient.post().uri(educGraduationApiConstants.getCertificateReport()) - .headers(h -> { - h.setBearerAuth(accessToken); - h.set(EducGraduationApiConstants.CORRELATION_ID, ThreadLocalStateUtil.getCorrelationID()); - }).body(BodyInserters.fromValue(reportParams)).retrieve().bodyToMono(byte[].class).block(); - return getEncodedStringFromBytes(bytesSAR); + try { + byte[] bytesSAR = webClient.post().uri(educGraduationApiConstants.getCertificateReport()) + .headers(h -> { + h.setBearerAuth(accessToken); + h.set(EducGraduationApiConstants.CORRELATION_ID, ThreadLocalStateUtil.getCorrelationID()); + }).body(BodyInserters.fromValue(reportParams)).retrieve() + .onStatus(HttpStatusCode::is5xxServerError, + response -> response.bodyToMono(String.class).thenReturn(new ServiceException("INTERNAL_SERVER_ERROR", response.statusCode().value()))) + .onStatus( + HttpStatus.NO_CONTENT::equals, + response -> response.bodyToMono(String.class).thenReturn(new ServiceException("NO_CONTENT", response.statusCode().value())) + ) + .bodyToMono(byte[].class).block(); + return getEncodedStringFromBytes(bytesSAR); + } catch (ServiceException ex) { + boolean noContent = HttpStatus.NO_CONTENT.value() == ex.getStatusCode(); + if(noContent) { + return ""; + } + throw ex; + } } private String generateStudentAchievementReportJasper(ReportData data, String accessToken) { @@ -1126,12 +1147,27 @@ private String generateStudentAchievementReportJasper(ReportData data, String ac ReportRequest reportParams = new ReportRequest(); reportParams.setOptions(options); reportParams.setData(data); - byte[] bytesSAR = webClient.post().uri(educGraduationApiConstants.getAchievementReport()) - .headers(h -> { - h.setBearerAuth(accessToken); - h.set(EducGraduationApiConstants.CORRELATION_ID, ThreadLocalStateUtil.getCorrelationID()); - }).body(BodyInserters.fromValue(reportParams)).retrieve().bodyToMono(byte[].class).block(); - return getEncodedStringFromBytes(bytesSAR); + try { + byte[] bytesSAR = webClient.post().uri(educGraduationApiConstants.getAchievementReport()) + .headers(h -> { + h.setBearerAuth(accessToken); + h.set(EducGraduationApiConstants.CORRELATION_ID, ThreadLocalStateUtil.getCorrelationID()); + }).body(BodyInserters.fromValue(reportParams)).retrieve() + .onStatus(HttpStatusCode::is5xxServerError, + response -> response.bodyToMono(String.class).thenReturn(new ServiceException("INTERNAL_SERVER_ERROR", response.statusCode().value()))) + .onStatus( + HttpStatus.NO_CONTENT::equals, + response -> response.bodyToMono(String.class).thenReturn(new ServiceException("NO_CONTENT", response.statusCode().value())) + ) + .bodyToMono(byte[].class).block(); + return getEncodedStringFromBytes(bytesSAR); + } catch (ServiceException ex) { + boolean noContent = HttpStatus.NO_CONTENT.value() == ex.getStatusCode(); + if(noContent) { + return ""; + } + throw ex; + } } public ReportData prepareAchievementReportData(ca.bc.gov.educ.api.graduation.model.dto.GraduationData graduationDataStatus, List optionalProgramList, String accessToken, ExceptionMessage exception) { @@ -1239,21 +1275,22 @@ private List getRequirementsMetAchvReport(List { - h.setBearerAuth(accessToken); - h.set(EducGraduationApiConstants.CORRELATION_ID, ThreadLocalStateUtil.getCorrelationID()); - }).body(BodyInserters.fromValue(requestObj)).retrieve().bodyToMono(GradStudentReports.class).block(); + if(StringUtils.isNotBlank(encodedPdfReportTranscript)) { + GradStudentReports requestObj = new GradStudentReports(); + requestObj.setPen(pen); + requestObj.setReport(encodedPdfReportTranscript); + requestObj.setStudentID(studentID); + requestObj.setGradReportTypeCode("ACHV"); + requestObj.setDocumentStatusCode("IP"); + if (isGraduated) + requestObj.setDocumentStatusCode(DOCUMENT_STATUS_COMPLETED); + webClient.post().uri(String.format(educGraduationApiConstants.getUpdateGradStudentReport(), isGraduated)) + .headers(h -> { + h.setBearerAuth(accessToken); + h.set(EducGraduationApiConstants.CORRELATION_ID, ThreadLocalStateUtil.getCorrelationID()); + }).body(BodyInserters.fromValue(requestObj)).retrieve().bodyToMono(GradStudentReports.class).block(); + } return exception; } diff --git a/api/src/test/java/ca/bc/gov/educ/api/graduation/service/ReportServiceTest.java b/api/src/test/java/ca/bc/gov/educ/api/graduation/service/ReportServiceTest.java index 5925a75c..203b8116 100644 --- a/api/src/test/java/ca/bc/gov/educ/api/graduation/service/ReportServiceTest.java +++ b/api/src/test/java/ca/bc/gov/educ/api/graduation/service/ReportServiceTest.java @@ -278,7 +278,8 @@ public void testSaveStudentCertificateReport() { when(this.requestBodyMock.contentType(any())).thenReturn(this.requestBodyMock); when(this.requestBodyMock.body(any(BodyInserter.class))).thenReturn(this.requestHeadersMock); when(this.requestHeadersMock.retrieve()).thenReturn(this.responseMock); - when(this.responseMock.bodyToMono(byte[].class)).thenReturn(Mono.just(bytesSAR)); + when(this.responseMock.onStatus(any(), any())).thenReturn(this.responseMock); + when(this.responseMock.bodyToMono(byte[].class)).thenReturn(Mono.just(bytesSAR)); when(this.webClient.post()).thenReturn(this.requestBodyUriMock); when(this.requestBodyUriMock.uri(String.format(constants.getUpdateGradStudentCertificate(),pen))).thenReturn(this.requestBodyUriMock); @@ -1557,6 +1558,7 @@ public void testSaveStudentAchievementReport() throws Exception { when(this.requestBodyMock.contentType(any())).thenReturn(this.requestBodyMock); when(this.requestBodyMock.body(any(BodyInserter.class))).thenReturn(this.requestHeadersMock); when(this.requestHeadersMock.retrieve()).thenReturn(this.responseMock); + when(this.responseMock.onStatus(any(), any())).thenReturn(this.responseMock); when(this.responseMock.bodyToMono(byte[].class)).thenReturn(Mono.just(bytesSAR)); when(this.webClient.post()).thenReturn(this.requestBodyUriMock); From be5df42a3ca443e5e93a2ac87dd340480333e3b7 Mon Sep 17 00:00:00 2001 From: arybakov Date: Fri, 10 Nov 2023 09:25:52 -0700 Subject: [PATCH 08/14] GRAD2-2306 HD-21559-GRAD - P3 - GRAD is creating blank transcripts --- .../api/graduation/service/ReportService.java | 14 ++++++++------ .../service/GraduationServiceTest.java | 17 +++++++++++++++-- 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/api/src/main/java/ca/bc/gov/educ/api/graduation/service/ReportService.java b/api/src/main/java/ca/bc/gov/educ/api/graduation/service/ReportService.java index 735e4546..1a3be304 100644 --- a/api/src/main/java/ca/bc/gov/educ/api/graduation/service/ReportService.java +++ b/api/src/main/java/ca/bc/gov/educ/api/graduation/service/ReportService.java @@ -37,6 +37,8 @@ public class ReportService { private static final String GRAD_REPORT_API_DOWN = "GRAD-REPORT-API IS DOWN"; private static final String GRAD_GRADUATION_REPORT_API_DOWN = "GRAD-GRADUATION-REPORT-API IS DOWN"; private static final String DOCUMENT_STATUS_COMPLETED = "COMPL"; + private static final String NO_CONTENT = "NO_CONTENT"; + private static final String INTERNAL_SERVER_ERROR = "INTERNAL_SERVER_ERROR"; @Autowired WebClient webClient; @@ -974,10 +976,10 @@ private String generateStudentTranscriptReportJasper(ReportData sample, ).body(BodyInserters.fromValue(reportParams)) .retrieve() .onStatus(HttpStatusCode::is5xxServerError, - response -> response.bodyToMono(String.class).thenReturn(new ServiceException("INTERNAL_SERVER_ERROR", response.statusCode().value()))) + response -> response.bodyToMono(String.class).thenReturn(new ServiceException(INTERNAL_SERVER_ERROR, response.statusCode().value()))) .onStatus( HttpStatus.NO_CONTENT::equals, - response -> response.bodyToMono(String.class).thenReturn(new ServiceException("NO_CONTENT", response.statusCode().value())) + response -> response.bodyToMono(String.class).thenReturn(new ServiceException(NO_CONTENT, response.statusCode().value())) ) .bodyToMono(byte[].class).block(); return getEncodedStringFromBytes(bytes); @@ -1124,10 +1126,10 @@ private String generateStudentCertificateReportJasper(ReportData sample, String h.set(EducGraduationApiConstants.CORRELATION_ID, ThreadLocalStateUtil.getCorrelationID()); }).body(BodyInserters.fromValue(reportParams)).retrieve() .onStatus(HttpStatusCode::is5xxServerError, - response -> response.bodyToMono(String.class).thenReturn(new ServiceException("INTERNAL_SERVER_ERROR", response.statusCode().value()))) + response -> response.bodyToMono(String.class).thenReturn(new ServiceException(INTERNAL_SERVER_ERROR, response.statusCode().value()))) .onStatus( HttpStatus.NO_CONTENT::equals, - response -> response.bodyToMono(String.class).thenReturn(new ServiceException("NO_CONTENT", response.statusCode().value())) + response -> response.bodyToMono(String.class).thenReturn(new ServiceException(NO_CONTENT, response.statusCode().value())) ) .bodyToMono(byte[].class).block(); return getEncodedStringFromBytes(bytesSAR); @@ -1154,10 +1156,10 @@ private String generateStudentAchievementReportJasper(ReportData data, String ac h.set(EducGraduationApiConstants.CORRELATION_ID, ThreadLocalStateUtil.getCorrelationID()); }).body(BodyInserters.fromValue(reportParams)).retrieve() .onStatus(HttpStatusCode::is5xxServerError, - response -> response.bodyToMono(String.class).thenReturn(new ServiceException("INTERNAL_SERVER_ERROR", response.statusCode().value()))) + response -> response.bodyToMono(String.class).thenReturn(new ServiceException(INTERNAL_SERVER_ERROR, response.statusCode().value()))) .onStatus( HttpStatus.NO_CONTENT::equals, - response -> response.bodyToMono(String.class).thenReturn(new ServiceException("NO_CONTENT", response.statusCode().value())) + response -> response.bodyToMono(String.class).thenReturn(new ServiceException(NO_CONTENT, response.statusCode().value())) ) .bodyToMono(byte[].class).block(); return getEncodedStringFromBytes(bytesSAR); diff --git a/api/src/test/java/ca/bc/gov/educ/api/graduation/service/GraduationServiceTest.java b/api/src/test/java/ca/bc/gov/educ/api/graduation/service/GraduationServiceTest.java index b4a6eaa7..344b8063 100644 --- a/api/src/test/java/ca/bc/gov/educ/api/graduation/service/GraduationServiceTest.java +++ b/api/src/test/java/ca/bc/gov/educ/api/graduation/service/GraduationServiceTest.java @@ -30,8 +30,7 @@ import java.util.*; import java.util.function.Consumer; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.*; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.when; @@ -2201,6 +2200,20 @@ public void testGetSchoolReports() { assertNotNull(result); } + @Test + public void testGetSchoolReportsException() { + ExceptionMessage exception = new ExceptionMessage(); + String mincode = "1231231231"; + List uniqueList = new ArrayList<>(); + uniqueList.add(mincode); + + when(this.tokenUtils.getAccessToken(any())).thenReturn(Pair.of("accessToken", System.currentTimeMillis())); + + byte[] result = graduationService.getSchoolReports(uniqueList,"GRADREG","accessToken"); + assertNotNull(result); + assertTrue(result.length == 0); + } + @Test public void testCreateAndStoreSchoolReports_TVR() { ExceptionMessage exception = new ExceptionMessage(); From 29e49c9baa36f4f93bb79598e9c403eab79e4228 Mon Sep 17 00:00:00 2001 From: arybakov Date: Fri, 10 Nov 2023 09:32:54 -0700 Subject: [PATCH 09/14] GRAD2-2306 HD-21559-GRAD - P3 - GRAD is creating blank transcripts --- .../service/GraduationServiceTest.java | 5 +-- .../graduation/service/ReportServiceTest.java | 34 +++++++++++++++++++ 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/api/src/test/java/ca/bc/gov/educ/api/graduation/service/GraduationServiceTest.java b/api/src/test/java/ca/bc/gov/educ/api/graduation/service/GraduationServiceTest.java index 344b8063..ed96ecef 100644 --- a/api/src/test/java/ca/bc/gov/educ/api/graduation/service/GraduationServiceTest.java +++ b/api/src/test/java/ca/bc/gov/educ/api/graduation/service/GraduationServiceTest.java @@ -30,7 +30,8 @@ import java.util.*; import java.util.function.Consumer; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.when; @@ -2211,7 +2212,7 @@ public void testGetSchoolReportsException() { byte[] result = graduationService.getSchoolReports(uniqueList,"GRADREG","accessToken"); assertNotNull(result); - assertTrue(result.length == 0); + assertEquals(result.length, 0); } @Test diff --git a/api/src/test/java/ca/bc/gov/educ/api/graduation/service/ReportServiceTest.java b/api/src/test/java/ca/bc/gov/educ/api/graduation/service/ReportServiceTest.java index 203b8116..98481802 100644 --- a/api/src/test/java/ca/bc/gov/educ/api/graduation/service/ReportServiceTest.java +++ b/api/src/test/java/ca/bc/gov/educ/api/graduation/service/ReportServiceTest.java @@ -1654,6 +1654,40 @@ public void testGetTranscript() throws Exception { var result = reportService.getTranscript(graduationStudentRecord, gradStatus, "accessToken", new ExceptionMessage()); assertNotNull(result); } + + @Test + public void testGetTranscriptException() throws Exception { + + CommonSchool commSch = new CommonSchool(); + commSch.setSchlNo("09323027"); + commSch.setSchoolCategoryCode("02"); + + GraduationData gradStatus = createGraduationData("json/gradstatus.json"); + assertNotNull(gradStatus); + String pen = gradStatus.getGradStudent().getPen(); + GradSearchStudent gradSearchStudent = new GradSearchStudent(); + gradSearchStudent.setPen(pen); + gradSearchStudent.setStudentID(gradStatus.getGradStudent().getStudentID()); + + GraduationStudentRecord graduationStudentRecord = new GraduationStudentRecord(); + graduationStudentRecord.setPen(pen); + graduationStudentRecord.setProgramCompletionDate("2003/01"); + graduationStudentRecord.setStudentID(UUID.fromString(gradSearchStudent.getStudentID())); + graduationStudentRecord.setUpdateDate(LocalDateTime.now()); + + when(this.webClient.get()).thenReturn(this.requestHeadersUriMock); + when(this.requestHeadersUriMock.uri(String.format(constants.getSchoolCategoryCode(),"09323027"))).thenReturn(this.requestHeadersMock); + when(this.requestHeadersMock.headers(any(Consumer.class))).thenReturn(this.requestHeadersMock); + when(this.requestHeadersMock.retrieve()).thenReturn(this.responseMock); + when(this.responseMock.bodyToMono(CommonSchool.class)).thenReturn(Mono.just(commSch)); + + ExceptionMessage message = new ExceptionMessage(); + + var result = reportService.getTranscript(graduationStudentRecord, gradStatus, "accessToken", message); + assertNull(result); + assertEquals("GRAD-GRADUATION-REPORT-API IS DOWN", message.getExceptionName()); + } + @Test public void testReportDataByPen() throws Exception { GraduationData gradStatus = createGraduationData("json/gradstatus.json"); From daa41827f9ca28ecc528e16044b247891ff5abd6 Mon Sep 17 00:00:00 2001 From: arybakov Date: Fri, 10 Nov 2023 09:46:56 -0700 Subject: [PATCH 10/14] GRAD2-2306 HD-21559-GRAD - P3 - GRAD is creating blank transcripts --- .../controller/GraduationController.java | 2 +- .../controller/GraduationControllerTest.java | 48 +++++++++++++++++-- .../service/GraduationServiceTest.java | 2 +- 3 files changed, 45 insertions(+), 7 deletions(-) diff --git a/api/src/main/java/ca/bc/gov/educ/api/graduation/controller/GraduationController.java b/api/src/main/java/ca/bc/gov/educ/api/graduation/controller/GraduationController.java index 6209ca97..7584dbfd 100644 --- a/api/src/main/java/ca/bc/gov/educ/api/graduation/controller/GraduationController.java +++ b/api/src/main/java/ca/bc/gov/educ/api/graduation/controller/GraduationController.java @@ -372,7 +372,7 @@ public ResponseEntity getSchoolDistrictSuppReports( @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK")}) public ResponseEntity getSchoolReports(@RequestBody List uniqueSchools, @RequestHeader(name="Authorization") String accessToken,@RequestParam(required = true) String type ) { byte[] resultBinary = gradService.getSchoolReports(uniqueSchools,type,accessToken.replace(BEARER, "")); - if(resultBinary == null) { + if(resultBinary == null || resultBinary.length == 0) { return new ResponseEntity<>(HttpStatus.NOT_FOUND); } return handleBinaryResponse(resultBinary, String.format("%sSchoolReport.pdf", type), MediaType.APPLICATION_PDF); diff --git a/api/src/test/java/ca/bc/gov/educ/api/graduation/controller/GraduationControllerTest.java b/api/src/test/java/ca/bc/gov/educ/api/graduation/controller/GraduationControllerTest.java index 9b5a1d02..a2ae4959 100644 --- a/api/src/test/java/ca/bc/gov/educ/api/graduation/controller/GraduationControllerTest.java +++ b/api/src/test/java/ca/bc/gov/educ/api/graduation/controller/GraduationControllerTest.java @@ -17,6 +17,7 @@ import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.security.core.context.SecurityContextHolder; +import java.io.InputStream; import java.util.ArrayList; import java.util.List; import java.util.UUID; @@ -332,16 +333,48 @@ void testCreateAndStoreDistrictPdfReports() { } @Test - void testGetSchoolReports() { - Mockito.when(graduationService.getSchoolReports(List.of("12321312"),"GRADREG","accessToken")).thenReturn(new byte[0]); + void testGetSchoolReports() throws Exception { + byte[] bytesSAR1 = readBinaryFile("data/sample.pdf"); + Mockito.when(graduationService.getSchoolReports(List.of("12321312"),"GRADREG","accessToken")).thenReturn(bytesSAR1); graduationController.getSchoolReports(List.of("12321312"),"accessToken","GRADREG"); Mockito.verify(graduationService).getSchoolReports(List.of("12321312"),"GRADREG","accessToken"); - Mockito.when(graduationService.getSchoolReports(List.of("12321312"),"NONGRADREG","accessToken")).thenReturn(new byte[0]); + Mockito.when(graduationService.getSchoolReports(List.of("12321312"),"NONGRADREG","accessToken")).thenReturn(bytesSAR1); graduationController.getSchoolReports(List.of("12321312"),"accessToken","NONGRADREG"); Mockito.verify(graduationService).getSchoolReports(List.of("12321312"),"NONGRADREG","accessToken"); - Mockito.when(graduationService.getSchoolReports(List.of("12321312"),"NONGRADPRJ","accessToken")).thenReturn(new byte[0]); + Mockito.when(graduationService.getSchoolReports(List.of("12321312"),"NONGRADPRJ","accessToken")).thenReturn(bytesSAR1); + graduationController.getSchoolReports(List.of("12321312"),"accessToken","NONGRADPRJ"); + Mockito.verify(graduationService).getSchoolReports(List.of("12321312"),"NONGRADPRJ","accessToken"); + } + + @Test + void testGetSchoolReportsEmpty() throws Exception { + byte[] bytesSAR1 = new byte[0]; + Mockito.when(graduationService.getSchoolReports(List.of("12321312"),"GRADREG","accessToken")).thenReturn(bytesSAR1); + graduationController.getSchoolReports(List.of("12321312"),"accessToken","GRADREG"); + Mockito.verify(graduationService).getSchoolReports(List.of("12321312"),"GRADREG","accessToken"); + + Mockito.when(graduationService.getSchoolReports(List.of("12321312"),"NONGRADREG","accessToken")).thenReturn(bytesSAR1); + graduationController.getSchoolReports(List.of("12321312"),"accessToken","NONGRADREG"); + Mockito.verify(graduationService).getSchoolReports(List.of("12321312"),"NONGRADREG","accessToken"); + + Mockito.when(graduationService.getSchoolReports(List.of("12321312"),"NONGRADPRJ","accessToken")).thenReturn(bytesSAR1); + graduationController.getSchoolReports(List.of("12321312"),"accessToken","NONGRADPRJ"); + Mockito.verify(graduationService).getSchoolReports(List.of("12321312"),"NONGRADPRJ","accessToken"); + } + + @Test + void testGetSchoolReportsNull() { + Mockito.when(graduationService.getSchoolReports(List.of("12321312"),"GRADREG","accessToken")).thenReturn(null); + graduationController.getSchoolReports(List.of("12321312"),"accessToken","GRADREG"); + Mockito.verify(graduationService).getSchoolReports(List.of("12321312"),"GRADREG","accessToken"); + + Mockito.when(graduationService.getSchoolReports(List.of("12321312"),"NONGRADREG","accessToken")).thenReturn(null); + graduationController.getSchoolReports(List.of("12321312"),"accessToken","NONGRADREG"); + Mockito.verify(graduationService).getSchoolReports(List.of("12321312"),"NONGRADREG","accessToken"); + + Mockito.when(graduationService.getSchoolReports(List.of("12321312"),"NONGRADPRJ","accessToken")).thenReturn(null); graduationController.getSchoolReports(List.of("12321312"),"accessToken","NONGRADPRJ"); Mockito.verify(graduationService).getSchoolReports(List.of("12321312"),"NONGRADPRJ","accessToken"); } @@ -353,5 +386,10 @@ void testCreateAndStoreStudentCertificate() { graduationController.createAndStoreStudentCertificate("123456789", "Y", "accessToken"); Mockito.verify(graduationService).createAndStoreStudentCertificates("123456789", true, "accessToken"); } - + + private byte[] readBinaryFile(String path) throws Exception { + ClassLoader classLoader = getClass().getClassLoader(); + InputStream inputStream = classLoader.getResourceAsStream(path); + return inputStream.readAllBytes(); + } } diff --git a/api/src/test/java/ca/bc/gov/educ/api/graduation/service/GraduationServiceTest.java b/api/src/test/java/ca/bc/gov/educ/api/graduation/service/GraduationServiceTest.java index ed96ecef..41ad0363 100644 --- a/api/src/test/java/ca/bc/gov/educ/api/graduation/service/GraduationServiceTest.java +++ b/api/src/test/java/ca/bc/gov/educ/api/graduation/service/GraduationServiceTest.java @@ -2212,7 +2212,7 @@ public void testGetSchoolReportsException() { byte[] result = graduationService.getSchoolReports(uniqueList,"GRADREG","accessToken"); assertNotNull(result); - assertEquals(result.length, 0); + assertEquals(0, result.length); } @Test From 6e90b4b56a7649d4b0657b69aca6441fd14cae44 Mon Sep 17 00:00:00 2001 From: arybakov Date: Fri, 10 Nov 2023 09:52:38 -0700 Subject: [PATCH 11/14] Test coverage --- .../graduation/controller/GraduationControllerTest.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/api/src/test/java/ca/bc/gov/educ/api/graduation/controller/GraduationControllerTest.java b/api/src/test/java/ca/bc/gov/educ/api/graduation/controller/GraduationControllerTest.java index a2ae4959..5a1c54a4 100644 --- a/api/src/test/java/ca/bc/gov/educ/api/graduation/controller/GraduationControllerTest.java +++ b/api/src/test/java/ca/bc/gov/educ/api/graduation/controller/GraduationControllerTest.java @@ -98,6 +98,14 @@ void testReportTranscriptByPen() { Mockito.verify(graduationService).prepareTranscriptReport("12312312312","Interim",null,"accessToken"); } + @Test + void testReportTranscriptByPen_empty() { + byte[] bytesSAR = new byte[0]; + Mockito.when(graduationService.prepareTranscriptReport("12312312312","Interim",null,"accessToken")).thenReturn(bytesSAR); + graduationController.reportTranscriptByPen("12312312312","Interim",null,"accessToken"); + Mockito.verify(graduationService).prepareTranscriptReport("12312312312","Interim",null,"accessToken"); + } + @Test void testReportTranscriptByPen_null() { byte[] bytesSAR = null; From 42acf6e9e9345e1403674a6049f2b288c55fcebf Mon Sep 17 00:00:00 2001 From: arybakov Date: Fri, 10 Nov 2023 10:14:47 -0700 Subject: [PATCH 12/14] Test coverage --- .../api/graduation/service/ReportService.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/api/src/main/java/ca/bc/gov/educ/api/graduation/service/ReportService.java b/api/src/main/java/ca/bc/gov/educ/api/graduation/service/ReportService.java index 1a3be304..2ca9f570 100644 --- a/api/src/main/java/ca/bc/gov/educ/api/graduation/service/ReportService.java +++ b/api/src/main/java/ca/bc/gov/educ/api/graduation/service/ReportService.java @@ -296,6 +296,7 @@ private void populateTraxReqCodesMap(List programReqCode } } + @Generated private Transcript getTranscriptData(ca.bc.gov.educ.api.graduation.model.dto.GraduationData graduationDataStatus, GraduationStudentRecord gradResponse, boolean xml, String accessToken, ExceptionMessage exception) { Transcript transcriptData = new Transcript(); transcriptData.setInterim(xml ? "true" : "false"); @@ -310,6 +311,7 @@ private Transcript getTranscriptData(ca.bc.gov.educ.api.graduation.model.dto.Gra return transcriptData; } + @Generated private void createCourseListForTranscript(List studentCourseList, ca.bc.gov.educ.api.graduation.model.dto.GraduationData graduationDataStatus, List tList, String provincially, boolean xml) { Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("PST"), Locale.CANADA); String today = EducGraduationApiUtils.formatDate(cal.getTime(), EducGraduationApiConstants.DEFAULT_DATE_FORMAT); @@ -349,6 +351,7 @@ private void createCourseListForTranscript(List studentCourseList * @param cutOffCourse * @return */ + @Generated private boolean isValidCutOffCourse(List studentCourseList, StudentCourse cutOffCourse) { List dups = studentCourseList.stream().filter(sc -> StringUtils.equalsIgnoreCase(sc.getCourseCode(), cutOffCourse.getCourseCode()) && StringUtils.equalsIgnoreCase(sc.getCourseLevel(), cutOffCourse.getCourseLevel()) @@ -361,6 +364,7 @@ private boolean isValidCutOffCourse(List studentCourseList, Stude return false; } + @Generated private TranscriptCourse setCourseObjForTranscript(StudentCourse sc, ca.bc.gov.educ.api.graduation.model.dto.GraduationData graduationDataStatus) { TranscriptCourse crse = new TranscriptCourse(); crse.setCode(sc.getCourseCode()); @@ -386,6 +390,7 @@ private TranscriptCourse setCourseObjForTranscript(StudentCourse sc, ca.bc.gov.e return crse; } + @Generated private Mark setMarkObjForTranscript(StudentCourse sc, String program, String provincially) { Mark mrk = new Mark(); mrk.setExamPercent(getExamPercent(sc.getBestExamPercent(), program, sc.getCourseLevel(), sc.getSpecialCase(), sc.getSessionDate(), sc.getExamPercent())); @@ -399,6 +404,7 @@ private Mark setMarkObjForTranscript(StudentCourse sc, String program, String pr return mrk; } + @Generated private String getExamPercent(Double bestExamPercent, String program, String courseLevel, String specialCase, String sDate, Double examPercent) { String res = checkCutOffCourseDate(sDate, examPercent); if (res == null) { @@ -414,6 +420,7 @@ private String getExamPercent(Double bestExamPercent, String program, String cou return res; } + @Generated private String checkCutOffCourseDate(String sDate, Double value) { String cutoffDate = "1991-11-01"; String sessionDate = sDate + "/01"; @@ -429,6 +436,7 @@ private String checkCutOffCourseDate(String sDate, Double value) { } } + @Generated private String getSchoolPercent(Double bestSchoolPercent, String program, String courseLevel, String sDate, Double schoolPercent) { String res = checkCutOffCourseDate(sDate, schoolPercent); @@ -443,6 +451,7 @@ private String getSchoolPercent(Double bestSchoolPercent, String program, String return res; } + @Generated private void createAssessmentListForTranscript(List studentAssessmentList, ca.bc.gov.educ.api.graduation.model.dto.GraduationData graduationDataStatus, List tList, boolean xml, String accessToken) { Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("PST"), Locale.CANADA); String today = EducGraduationApiUtils.formatDate(cal.getTime(), EducGraduationApiConstants.DEFAULT_DATE_FORMAT); @@ -518,6 +527,7 @@ public List removeDuplicatedAssessmentsForTranscript(List getTranscriptResults(ca.bc.gov.educ.api.graduation.model.dto.GraduationData graduationDataStatus, boolean xml, String accessToken) { List tList = new ArrayList<>(); String program = graduationDataStatus.getGradStatus().getProgram(); @@ -593,6 +603,7 @@ private String getAssessmentFinalPercentAchievement(StudentAssessment sA, String return finalPercent; } + @Generated private String getSpecialCase(StudentAssessment sA, String accessToken) { String finalPercent; SpecialCase spC = webClient.get().uri(String.format(educGraduationApiConstants.getSpecialCase(), sA.getSpecialCase())) @@ -608,6 +619,7 @@ private String getSpecialCase(StudentAssessment sA, String accessToken) { return finalPercent; } + @Generated private String getAssessmentFinalPercentTranscript(StudentAssessment sA, String accessToken) { String finalPercent = getValue(sA.getProficiencyScore()); if ((sA.getAssessmentCode().equalsIgnoreCase("LTE10") || sA.getAssessmentCode().equalsIgnoreCase("LTP10")) && (sA.getSpecialCase() == null || StringUtils.isBlank(sA.getSpecialCase().trim())) && StringUtils.isNotBlank(finalPercent)) { @@ -619,6 +631,7 @@ private String getAssessmentFinalPercentTranscript(StudentAssessment sA, String return finalPercent; } + @Generated private String getCourseNameLogic(StudentCourse sc) { if (sc.getGenericCourseType() != null && sc.getGenericCourseType().equalsIgnoreCase("I") && StringUtils.isNotBlank(sc.getRelatedCourse()) && StringUtils.isNotBlank(sc.getRelatedLevel()) && StringUtils.isNotBlank(sc.getRelatedCourseName())) { return "IDS " + sc.getRelatedCourseName(); @@ -633,6 +646,7 @@ private String getValue(Double value) { return value != null && value != 0.0 ? new DecimalFormat("#").format(value) : ""; } + @Generated private ca.bc.gov.educ.api.graduation.model.report.GraduationData getGraduationData( ca.bc.gov.educ.api.graduation.model.dto.GraduationData graduationDataStatus, GraduationStudentRecord graduationStudentRecord, String accessToken) { GraduationData data = new GraduationData(); @@ -959,6 +973,7 @@ public void saveStudentTranscriptReportJasper(ReportData sample, String accessTo } } + @Generated private String generateStudentTranscriptReportJasper(ReportData sample, String accessToken, ExceptionMessage exception) { ReportOptions options = new ReportOptions(); From e6bfa16d3e07f1b65fa37e42fa90367a5d6c523f Mon Sep 17 00:00:00 2001 From: arybakov Date: Fri, 10 Nov 2023 10:59:10 -0700 Subject: [PATCH 13/14] Test coverage --- .../graduation/service/ReportServiceTest.java | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/api/src/test/java/ca/bc/gov/educ/api/graduation/service/ReportServiceTest.java b/api/src/test/java/ca/bc/gov/educ/api/graduation/service/ReportServiceTest.java index 98481802..c2999b23 100644 --- a/api/src/test/java/ca/bc/gov/educ/api/graduation/service/ReportServiceTest.java +++ b/api/src/test/java/ca/bc/gov/educ/api/graduation/service/ReportServiceTest.java @@ -1,5 +1,6 @@ package ca.bc.gov.educ.api.graduation.service; +import ca.bc.gov.educ.api.graduation.exception.ServiceException; import ca.bc.gov.educ.api.graduation.model.dto.*; import ca.bc.gov.educ.api.graduation.model.report.Code; import ca.bc.gov.educ.api.graduation.model.report.ReportData; @@ -2155,6 +2156,46 @@ public void testTranscriptReportByPen() throws Exception { } + @Test + public void testTranscriptReportByPenEmpty() throws Exception { + GraduationData gradStatus = createGraduationData("json/gradstatus.json"); + assertNotNull(gradStatus); + String pen = gradStatus.getGradStudent().getPen(); + + when(this.webClient.post()).thenReturn(this.requestBodyUriMock); + when(this.requestBodyUriMock.uri(constants.getTranscriptReport())).thenReturn(this.requestBodyUriMock); + when(this.requestBodyUriMock.headers(any(Consumer.class))).thenReturn(this.requestBodyMock); + when(this.requestBodyMock.contentType(any())).thenReturn(this.requestBodyMock); + when(this.requestBodyMock.body(any(BodyInserter.class))).thenReturn(this.requestHeadersMock); + when(this.requestHeadersMock.retrieve()).thenReturn(this.responseMock); + when(this.responseMock.onStatus(any(), any())).thenReturn(this.responseMock); + when(this.responseMock.bodyToMono(byte[].class)).thenThrow(new ServiceException("NO_CONTENT", 204)); + + byte[] result = graduationService.prepareTranscriptReport(pen, "Interim", "true", "accessToken"); + assertNotNull(result); + assertEquals(0, result.length); + + } + + @Test(expected = ServiceException.class) + public void testTranscriptReportByPenException() throws Exception { + GraduationData gradStatus = createGraduationData("json/gradstatus.json"); + assertNotNull(gradStatus); + String pen = gradStatus.getGradStudent().getPen(); + + when(this.webClient.post()).thenReturn(this.requestBodyUriMock); + when(this.requestBodyUriMock.uri(constants.getTranscriptReport())).thenReturn(this.requestBodyUriMock); + when(this.requestBodyUriMock.headers(any(Consumer.class))).thenReturn(this.requestBodyMock); + when(this.requestBodyMock.contentType(any())).thenReturn(this.requestBodyMock); + when(this.requestBodyMock.body(any(BodyInserter.class))).thenReturn(this.requestHeadersMock); + when(this.requestHeadersMock.retrieve()).thenReturn(this.responseMock); + when(this.responseMock.onStatus(any(), any())).thenReturn(this.responseMock); + when(this.responseMock.bodyToMono(byte[].class)).thenThrow(new ServiceException("INTERNAL_SERVER_ERROR", 500)); + + graduationService.prepareTranscriptReport(pen, "Interim", "true", "accessToken"); + } + + @Test public void testReportDataByGraduationData() throws Exception { GraduationData gradStatus = createGraduationData("json/gradstatus.json"); From 0f85c28449045886567c30e2e14b2267d1f0ae6e Mon Sep 17 00:00:00 2001 From: arybakov Date: Fri, 10 Nov 2023 11:22:30 -0700 Subject: [PATCH 14/14] Test coverage --- .../ca/bc/gov/educ/api/graduation/service/ReportServiceTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/api/src/test/java/ca/bc/gov/educ/api/graduation/service/ReportServiceTest.java b/api/src/test/java/ca/bc/gov/educ/api/graduation/service/ReportServiceTest.java index c2999b23..527d725d 100644 --- a/api/src/test/java/ca/bc/gov/educ/api/graduation/service/ReportServiceTest.java +++ b/api/src/test/java/ca/bc/gov/educ/api/graduation/service/ReportServiceTest.java @@ -2180,7 +2180,6 @@ public void testTranscriptReportByPenEmpty() throws Exception { @Test(expected = ServiceException.class) public void testTranscriptReportByPenException() throws Exception { GraduationData gradStatus = createGraduationData("json/gradstatus.json"); - assertNotNull(gradStatus); String pen = gradStatus.getGradStudent().getPen(); when(this.webClient.post()).thenReturn(this.requestBodyUriMock);