Skip to content
This repository was archived by the owner on Feb 7, 2025. It is now read-only.

Commit

Permalink
Merge pull request #1182 from CDCgov/chores/additional-code-coverage-…
Browse files Browse the repository at this point in the history
…cont

Additional code coverage and code reuse refactoring
luis-pabon-tf authored Jul 30, 2024
2 parents 6d08bb5 + a21d6ff commit 8e7a8df
Showing 8 changed files with 89 additions and 64 deletions.
12 changes: 2 additions & 10 deletions app/src/main/java/gov/hhs/cdc/trustedintermediary/OpenApi.java
Original file line number Diff line number Diff line change
@@ -2,11 +2,9 @@

import gov.hhs.cdc.trustedintermediary.context.ApplicationContext;
import gov.hhs.cdc.trustedintermediary.domainconnector.UnableToReadOpenApiSpecificationException;
import gov.hhs.cdc.trustedintermediary.external.openapi.OpenApiReaderImplementation;
import gov.hhs.cdc.trustedintermediary.wrappers.YamlCombiner;
import gov.hhs.cdc.trustedintermediary.wrappers.YamlCombinerException;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.Set;

/** Directs the construction of a full YAML OpenAPI specification */
@@ -39,12 +37,6 @@ public String generateApiDocumentation(final Set<String> openApiSpecifications)

String getBaselineDocumentation() throws UnableToReadOpenApiSpecificationException {
String fileName = "openapi_base.yaml";
try (InputStream openApiStream =
getClass().getClassLoader().getResourceAsStream(fileName)) {
return new String(openApiStream.readAllBytes(), StandardCharsets.UTF_8);
} catch (IOException e) {
throw new UnableToReadOpenApiSpecificationException(
"Failed to open baseline documentation for " + fileName, e);
}
return OpenApiReaderImplementation.getInstance().openAsString(fileName);
}
}
Original file line number Diff line number Diff line change
@@ -7,11 +7,9 @@
import gov.hhs.cdc.trustedintermediary.domainconnector.DomainResponseHelper;
import gov.hhs.cdc.trustedintermediary.domainconnector.HttpEndpoint;
import gov.hhs.cdc.trustedintermediary.domainconnector.UnableToReadOpenApiSpecificationException;
import gov.hhs.cdc.trustedintermediary.external.openapi.OpenApiReaderImplementation;
import gov.hhs.cdc.trustedintermediary.wrappers.InvalidTokenException;
import gov.hhs.cdc.trustedintermediary.wrappers.Logger;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.Map;
import java.util.function.Function;
import javax.inject.Inject;
@@ -43,13 +41,7 @@ public Map<HttpEndpoint, Function<DomainRequest, DomainResponse>> domainRegistra
@Override
public String openApiSpecification() throws UnableToReadOpenApiSpecificationException {
String fileName = "openapi_auth.yaml";
try (InputStream openApiStream =
getClass().getClassLoader().getResourceAsStream(fileName)) {
return new String(openApiStream.readAllBytes(), StandardCharsets.UTF_8);
} catch (IOException e) {
throw new UnableToReadOpenApiSpecificationException(
"Failed to open OpenAPI specification for " + fileName, e);
}
return OpenApiReaderImplementation.getInstance().openAsString(fileName);
}

DomainResponse handleAuth(DomainRequest request) {
Original file line number Diff line number Diff line change
@@ -39,16 +39,14 @@
import gov.hhs.cdc.trustedintermediary.external.localfile.FileMessageLinkStorage;
import gov.hhs.cdc.trustedintermediary.external.localfile.FilePartnerMetadataStorage;
import gov.hhs.cdc.trustedintermediary.external.localfile.MockRSEndpointClient;
import gov.hhs.cdc.trustedintermediary.external.openapi.OpenApiReaderImplementation;
import gov.hhs.cdc.trustedintermediary.external.reportstream.ReportStreamEndpointClient;
import gov.hhs.cdc.trustedintermediary.external.reportstream.ReportStreamOrderSender;
import gov.hhs.cdc.trustedintermediary.external.reportstream.ReportStreamResultSender;
import gov.hhs.cdc.trustedintermediary.external.reportstream.ReportStreamSenderHelper;
import gov.hhs.cdc.trustedintermediary.wrappers.FhirParseException;
import gov.hhs.cdc.trustedintermediary.wrappers.HapiFhir;
import gov.hhs.cdc.trustedintermediary.wrappers.Logger;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
@@ -145,17 +143,7 @@ public Map<HttpEndpoint, Function<DomainRequest, DomainResponse>> domainRegistra
@Override
public String openApiSpecification() throws UnableToReadOpenApiSpecificationException {
String fileName = "openapi_etor.yaml";
try {
return openApiStream(fileName);
} catch (IOException e) {
throw new UnableToReadOpenApiSpecificationException(
"Failed to open OpenAPI specification for " + fileName, e);
}
}

public String openApiStream(String fileName) throws IOException {
InputStream openApiStream = getClass().getClassLoader().getResourceAsStream(fileName);
return new String(openApiStream.readAllBytes(), StandardCharsets.UTF_8);
return OpenApiReaderImplementation.getInstance().openAsString(fileName);
}

DomainResponse handleOrders(DomainRequest request) {
Original file line number Diff line number Diff line change
@@ -101,10 +101,6 @@ public enum Hl7FhirMappingPath {
this.fhirPath = fhirPath;
}

public String getHl7Path() {
return hl7Path;
}

public String getFhirPath() {
return fhirPath;
}
Original file line number Diff line number Diff line change
@@ -8,9 +8,9 @@ import gov.hhs.cdc.trustedintermediary.domainconnector.DomainRequest
import gov.hhs.cdc.trustedintermediary.domainconnector.DomainResponse
import gov.hhs.cdc.trustedintermediary.domainconnector.DomainResponseHelper
import gov.hhs.cdc.trustedintermediary.domainconnector.HttpEndpoint
import gov.hhs.cdc.trustedintermediary.domainconnector.UnableToReadOpenApiSpecificationException
import gov.hhs.cdc.trustedintermediary.etor.messages.MessageHdDataType
import gov.hhs.cdc.trustedintermediary.etor.messages.MessageRequestHandler
import gov.hhs.cdc.trustedintermediary.etor.messages.UnableToSendMessageException
import gov.hhs.cdc.trustedintermediary.etor.metadata.partner.PartnerMetadata
import gov.hhs.cdc.trustedintermediary.etor.metadata.partner.PartnerMetadataConverter
import gov.hhs.cdc.trustedintermediary.etor.metadata.partner.PartnerMetadataException
@@ -112,30 +112,6 @@ class EtorDomainRegistrationTest extends Specification {
openApiSpecification.contains("paths:")
}

def "correctly handles errors when loading OpenAPI"() {
given:
def domainRegistration = Spy(EtorDomainRegistration)
domainRegistration.openApiStream(_ as String) >> { throw new IOException()}

when:
domainRegistration.openApiSpecification()

then:
thrown(UnableToReadOpenApiSpecificationException)
}

def "openApiStream assertion behaves correctly with bad filenames"() {
given:
def domainRegistration = Spy(EtorDomainRegistration)
domainRegistration.openApiStream(_ as String) >> { throw new IOException()}

when:
domainRegistration.openApiStream("badFile")

then:
thrown(IOException)
}

def "handleOrders happy path"() {
given:
def orderMock = new OrderMock<?>("resource id", "a patient ID", "orders", null, null, null, null, null)
@@ -480,4 +456,38 @@ class EtorDomainRegistrationTest extends Specification {
1 * mockLogger.logError(_ as String)
1 * requestHandler.handle(null)
}

def "handleMessageRequest logs an error and continues when unable to send message"() {
given:
def expectedStatusCode = 400

def request = new DomainRequest(headers: ["recordid": "recordId"])
def response

def requestHandler = Mock(MessageRequestHandler)
requestHandler.handle(_ as String) >> { throw new UnableToSendMessageException("DogCow", new NullPointerException()) }

def connector = new EtorDomainRegistration()
TestApplicationContext.register(EtorDomainRegistration, connector)

def mockResponseHelper = Mock(DomainResponseHelper)
TestApplicationContext.register(DomainResponseHelper, mockResponseHelper)

def mockPartnerMetadataOrchestrator = Mock(PartnerMetadataOrchestrator)
TestApplicationContext.register(PartnerMetadataOrchestrator,mockPartnerMetadataOrchestrator)

def mockLogger = Mock(Logger)
TestApplicationContext.register(Logger, mockLogger)

TestApplicationContext.injectRegisteredImplementations()

when:
response = connector.handleMessageRequest(request, requestHandler, _ as String)

then:
response.statusCode == expectedStatusCode
1 * mockResponseHelper.constructErrorResponse(expectedStatusCode, _ as Exception) >> new DomainResponse(expectedStatusCode)
1 * mockLogger.logError(_ as String, _ as Exception)
1 * mockPartnerMetadataOrchestrator.setMetadataStatusToFailed(_ as String, _ as String)
}
}
Original file line number Diff line number Diff line change
@@ -28,7 +28,7 @@ public interface DomainConnector {
* An implementation would return the OpenAPI specification in YAML format for this domain
*
* @return The OpenAPI specifications for just this given domain
* @throws UnableToReadOpenApiSpecificationException
* @throws UnableToReadOpenApiSpecificationException When unable to load the expected file
*/
String openApiSpecification() throws UnableToReadOpenApiSpecificationException;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package gov.hhs.cdc.trustedintermediary.external.openapi;

import gov.hhs.cdc.trustedintermediary.domainconnector.UnableToReadOpenApiSpecificationException;
import gov.hhs.cdc.trustedintermediary.wrappers.OpenApiReader;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.Objects;

/**
* Basic implementation of a Reader for OpenApi to promote code reuse. If additional functionality
* is needed, consider implementing a library and wrapping it.
*/
public class OpenApiReaderImplementation implements OpenApiReader {
private static final OpenApiReaderImplementation INSTANCE = new OpenApiReaderImplementation();

public static OpenApiReaderImplementation getInstance() {
return INSTANCE;
}

/**
* Loads the stream of an OpenApi file and returns the output as a string.
*
* @param fileName Name of the file to load
* @return File contents as string
* @throws UnableToReadOpenApiSpecificationException If there is an issue loading the Api file
*/
@Override
public String openAsString(String fileName) throws UnableToReadOpenApiSpecificationException {
InputStream stream = getClass().getClassLoader().getResourceAsStream(fileName);
try {
return new String(
Objects.requireNonNull(stream).readAllBytes(), StandardCharsets.UTF_8);
} catch (IOException | NullPointerException e) {
throw new UnableToReadOpenApiSpecificationException(
"Failed to open OpenAPI specification for " + fileName, e);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package gov.hhs.cdc.trustedintermediary.wrappers;

import gov.hhs.cdc.trustedintermediary.domainconnector.UnableToReadOpenApiSpecificationException;

/** Wrapper for classes that load OpenApi documentation. */
public interface OpenApiReader {
String openAsString(String fileName) throws UnableToReadOpenApiSpecificationException;
}

0 comments on commit 8e7a8df

Please sign in to comment.