Skip to content

Commit

Permalink
MODOAIPMH-540: minor improvements + JUnit
Browse files Browse the repository at this point in the history
  • Loading branch information
DmytroBykov1 committed Mar 27, 2024
1 parent 5670a0c commit c9d729b
Show file tree
Hide file tree
Showing 4 changed files with 401 additions and 9 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -472,9 +472,11 @@ protected Future<Response> processRecords(Context ctx, Request request,
Promise<Response> oaiResponsePromise = Promise.promise();
buildRecords(ctx, request, items).onSuccess(recordsMap -> {
Response response;
if (recordsMap.isEmpty() && items.size() > 1) {
if ((recordsMap.isEmpty() && jsonArrayIsEmptyCheck(items)) ||
(recordsMap.isEmpty() && jsonArrayNotEmptyCheck(items) && VerbType.GET_RECORD != request.getVerb())
) {
response = buildNoRecordsFoundOaiResponse(oaipmh, request);
} else if (recordsMap.isEmpty() && items.size() == 1) {
} else if (recordsMap.isEmpty() && jsonArrayNotEmptyCheck(items) && VerbType.GET_RECORD == request.getVerb()) {
response = buildTheByteArrayCannotBeConvertedToJaxbObjectResponse(oaipmh, request);
} else {
addRecordsToOaiResponse(oaipmh, recordsMap.values());
Expand All @@ -486,6 +488,12 @@ protected Future<Response> processRecords(Context ctx, Request request,
return oaiResponsePromise.future();
}

private boolean jsonArrayNotEmptyCheck(JsonArray ja){
return ja != null && !ja.isEmpty();
}
private boolean jsonArrayIsEmptyCheck(JsonArray ja){
return !jsonArrayNotEmptyCheck(ja);
}
/**
* Builds {@link Map} with storage id as key and {@link RecordType} with populated header if there is any,
* otherwise empty map is returned
Expand All @@ -498,7 +506,7 @@ private Future<Map<String, RecordType>> buildRecords(Context context, Request re

Map<String, RecordType> recordsMap = new ConcurrentHashMap<>();

if (records != null && !records.isEmpty()) {
if (jsonArrayNotEmptyCheck(records)) {
RecordMetadataManager metadataManager = RecordMetadataManager.getInstance();
// Using LinkedHashMap just to rely on order returned by storage service
records.stream()
Expand Down
35 changes: 30 additions & 5 deletions src/test/java/org/folio/rest/impl/OaiPmhImplTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -42,11 +42,7 @@
import org.folio.rest.tools.utils.ModuleName;
import org.folio.rest.tools.utils.NetworkUtils;
import org.folio.spring.SpringContextUtil;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestInstance;
import org.junit.jupiter.api.*;
import org.junit.jupiter.api.extension.ExtendWith;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
Expand Down Expand Up @@ -179,6 +175,7 @@
import static org.openarchives.oai._2.OAIPMHerrorcodeType.BAD_RESUMPTION_TOKEN;
import static org.openarchives.oai._2.OAIPMHerrorcodeType.CANNOT_DISSEMINATE_FORMAT;
import static org.openarchives.oai._2.OAIPMHerrorcodeType.ID_DOES_NOT_EXIST;
import static org.openarchives.oai._2.OAIPMHerrorcodeType.INVALID_RECORD_CONTENT;
import static org.openarchives.oai._2.OAIPMHerrorcodeType.NO_RECORDS_MATCH;
import static org.openarchives.oai._2.VerbType.GET_RECORD;
import static org.openarchives.oai._2.VerbType.IDENTIFY;
Expand Down Expand Up @@ -755,6 +752,21 @@ void headerDatestampOfGetRecordVerbShouldCorrespondToGranularitySetting(Metadata
System.setProperty(REPOSITORY_TIME_GRANULARITY, timeGranularity);
}

@Test
void invalidCharacterInTheRecordTest() {
MetadataPrefix prefix = MARC21XML;
String identifier = IDENTIFIER_PREFIX + OkapiMockServer.EXISTING_IDENTIFIER_WITH_INVALID_CHARACTER;
// String identifier = IDENTIFIER_PREFIX + OkapiMockServer.EXISTING_IDENTIFIER;//_WITH_INVALID_CHARACTER;

RequestSpecification request = createBaseRequest()
.with()
.param(VERB_PARAM, GET_RECORD.value())
.param(IDENTIFIER_PARAM, identifier)
.param(METADATA_PREFIX_PARAM, prefix.getName());

OAIPMH oaipmh = verify404InvalidCharacterInTheRecord(request, GET_RECORD);
}

private void verifyHeaderDateStamp(OAIPMH oaipmh, VerbType verbType, String timeGranularity) {
String verb = verbType.value();
if (verb.equals(LIST_RECORDS.value())) {
Expand Down Expand Up @@ -1771,6 +1783,19 @@ private OAIPMH verify200WithXml(RequestSpecification request, VerbType verb) {
return oaipmh;
}

private OAIPMH verify404InvalidCharacterInTheRecord(RequestSpecification request, VerbType verb) {
String response = verifyWithCodeWithXml(request, 404);

// Unmarshal string to OAIPMH and verify required data presents
OAIPMH oaipmh = ResponseConverter.getInstance().stringToOaiPmh(response);

verifyBaseResponse(oaipmh, verb);

Assertions.assertEquals(INVALID_RECORD_CONTENT, oaipmh.getErrors().get(0).getCode());

return oaipmh;
}

private void verify500(RequestSpecification request) {
String response = request
.when()
Expand Down
6 changes: 5 additions & 1 deletion src/test/java/org/folio/rest/impl/OkapiMockServer.java
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ public class OkapiMockServer {
public static final String TEST_USER_ID = "30fde4be-2d1a-4546-8d6c-b468caca2720";

static final String EXISTING_IDENTIFIER = "existing-identifier";
static final String EXISTING_IDENTIFIER_WITH_INVALID_CHARACTER = "id-of-existing-instance-with-invalid-character";
static final String INSTANCE_ID_GET_RECORD_MARC21_FROM_INVENTORY_INVALID_DATA = "existing-invalid-data-identifier";
static final String RECORD_IDENTIFIER_MARC21_WITH_HOLDINGS = "00000000-0000-4a89-a2f9-78ce3145e4fc";
static final String RECORD_IDENTIFIER_INSTANCE_NOT_FOUND = "fb3e23e5-eb7f-4b8b-b531-40e74ec9c6e9";
Expand Down Expand Up @@ -135,6 +136,7 @@ public class OkapiMockServer {
private static final String SRS_RECORD_WITH_NON_EXISTING_INSTANCE_JSON = "/srs_record_with_non_existing_instance.json";
private static final String INSTANCES_0 = "/instances_0.json";
private static final String INSTANCES_1 = "/instances_1.json";
private static final String INSTANCES_1_WITH_INVALID_CHARACTER = "/instances_1_with_invalid_character.json";
private static final String INSTANCES_1_NO_RECORD_SOURCE = "/instances_1_withNoRecordSource.json";

private static final String INSTANCES_3 = "/instances_3.json";
Expand Down Expand Up @@ -516,7 +518,9 @@ private void handleRecordStorageResultGetResponse(RoutingContext ctx) {
} else if (uri.contains(SRS_RECORD_WITH_NEW_METADATA_DATE)) {
String json = getJsonObjectFromFileAsString(SOURCE_STORAGE_RESULT_URI + SRS_RECORD);
successResponse(ctx, json.replaceAll("REPLACE_ME", NEW_METADATA_DATE_FORMAT));
} else {
} else if (uri.contains(String.format("%s=%s", ID_PARAM, EXISTING_IDENTIFIER_WITH_INVALID_CHARACTER))) {
successResponse(ctx, getJsonObjectFromFileAsString(SOURCE_STORAGE_RESULT_URI + INSTANCES_1_WITH_INVALID_CHARACTER));}
else {
successResponse(ctx, getJsonObjectFromFileAsString(SOURCE_STORAGE_RESULT_URI + INSTANCES_10_TOTAL_RECORDS_11));
}
logger.info("Mock returns http status code: {}", ctx.response()
Expand Down
Loading

0 comments on commit c9d729b

Please sign in to comment.