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

Fix OAI-PMH property name and getRecord verb #157

Merged
merged 1 commit into from
Aug 7, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/handlers/oai.js
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ function invalidDateParameters(verb, dates) {
}

/**
* A function to support the OAI-PMH harvesting specfication
* A function to support the "OAI-PMH" harvesting specfication
*/
exports.handler = wrap(async (event) => {
const url = `${baseUrl(event)}oai`;
Expand Down
16 changes: 8 additions & 8 deletions src/handlers/oai/verbs.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ const oaiAttributes = {
xmlns: "http://www.openarchives.org/OAI/2.0/",
"xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance",
"xsi:schemaLocation":
"http://www.openarchives.org/OAI/2.0/\nhttp://www.openarchives.org/OAI/2.0/OAI-PMH.xsd",
"http://www.openarchives.org/OAI/2.0/\nhttp://www.openarchives.org/OAI/2.0/OAI_PMH.xsd",
};

function header(work) {
Expand Down Expand Up @@ -80,7 +80,7 @@ const getRecord = async (url, id) => {
const work = JSON.parse(esResponse.body)._source;
const record = transform(work);
const document = {
OAI_PMH: {
"OAI-PMH": {
_attributes: oaiAttributes,
responseDate: new Date().toISOString(),
request: {
Expand All @@ -91,7 +91,7 @@ const getRecord = async (url, id) => {
},
_text: url,
},
GetRecord: { ...record },
GetRecord: { record: record },
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This can be shortened to

Suggested change
GetRecord: { record: record },
GetRecord: { record },

{ ...record } is an object with a copy of all of record's fields in it. { record } and { record: record } are semantically equivalent. I'm happy leaving it as is, but given the specific diff behind this change I thought it was worth mentioning.

},
};
return output(document);
Expand All @@ -107,7 +107,7 @@ const getRecord = async (url, id) => {
const identify = async (url) => {
let earliestDatestamp = await earliestRecord();
const obj = {
OAI_PMH: {
"OAI-PMH": {
_attributes: oaiAttributes,
responseDate: new Date().toISOString(),
request: {
Expand Down Expand Up @@ -166,7 +166,7 @@ const listIdentifiers = async (
_text: scrollId,
};
const obj = {
OAI_PMH: {
"OAI-PMH": {
_attributes: oaiAttributes,
responseDate: new Date().toISOString(),
request: {
Expand Down Expand Up @@ -203,7 +203,7 @@ const listIdentifiers = async (

const listMetadataFormats = (url) => {
const obj = {
OAI_PMH: {
"OAI-PMH": {
_attributes: oaiAttributes,
responseDate: new Date().toISOString(),
request: {
Expand Down Expand Up @@ -261,7 +261,7 @@ const listRecords = async (
_text: scrollId,
};
const obj = {
OAI_PMH: {
"OAI-PMH": {
_attributes: oaiAttributes,
responseDate: new Date().toISOString(),
request: {
Expand Down Expand Up @@ -307,7 +307,7 @@ const listSets = async (url) => {
});

const obj = {
OAI_PMH: {
"OAI-PMH": {
_attributes: oaiAttributes,
responseDate: new Date().toISOString(),
request: {
Expand Down
4 changes: 2 additions & 2 deletions src/handlers/oai/xml-transformer.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,12 @@ const declaration = {

const invalidOaiRequest = (oaiCode, message, statusCode = 400) => {
const obj = {
OAI_PMH: {
"OAI-PMH": {
_attributes: {
xmlns: "http://www.openarchives.org/OAI/2.0/",
"xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance",
"xsi:schemaLocation":
"http://www.openarchives.org/OAI/2.0/\nhttp://www.openarchives.org/OAI/2.0/OAI-PMH.xsd",
"http://www.openarchives.org/OAI/2.0/\nhttp://www.openarchives.org/OAI/2.0/OAI_PMH.xsd",
},
responseDate: new Date().toISOString(),
error: {
Expand Down
71 changes: 36 additions & 35 deletions test/integration/oai.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ describe("Oai routes", () => {
expect(result).to.have.header("content-type", /application\/xml/);

const resultBody = convert.xml2js(result.body, xmlOpts);
const header = resultBody.OAI_PMH.GetRecord.header;
const header = resultBody["OAI-PMH"].GetRecord.record.header;
expect(header)
.to.be.an("object")
.and.to.deep.include.keys(
Expand All @@ -38,7 +38,8 @@ describe("Oai routes", () => {
"setSpec",
"setName"
);
const metadata = resultBody.OAI_PMH.GetRecord.metadata["oai_dc:dc"];
const metadata =
resultBody["OAI-PMH"].GetRecord.record.metadata["oai_dc:dc"];
expect(metadata)
.to.be.an("object")
.and.to.deep.include.keys(
Expand Down Expand Up @@ -67,10 +68,10 @@ describe("Oai routes", () => {
expect(result).to.have.header("content-type", /application\/xml/);

const resultBody = convert.xml2js(result.body, xmlOpts);
expect(resultBody.OAI_PMH.error["_attributes"]["code"]).to.eq(
expect(resultBody["OAI-PMH"].error["_attributes"]["code"]).to.eq(
"badArgument"
);
expect(resultBody.OAI_PMH.error["_text"]).to.eq(
expect(resultBody["OAI-PMH"].error["_text"]).to.eq(
"You must supply an identifier for GetRecord requests"
);
});
Expand All @@ -86,10 +87,10 @@ describe("Oai routes", () => {
expect(result).to.have.header("content-type", /application\/xml/);

const resultBody = convert.xml2js(result.body, xmlOpts);
expect(resultBody.OAI_PMH.error["_attributes"]["code"]).to.eq(
expect(resultBody["OAI-PMH"].error["_attributes"]["code"]).to.eq(
"idDoesNotExist"
);
expect(resultBody.OAI_PMH.error["_text"]).to.eq(
expect(resultBody["OAI-PMH"].error["_text"]).to.eq(
"The specified record does not exist"
);
});
Expand All @@ -104,7 +105,7 @@ describe("Oai routes", () => {
expect(result.statusCode).to.eq(200);
expect(result).to.have.header("content-type", /application\/xml/);
const resultBody = convert.xml2js(result.body, xmlOpts);
expect(resultBody.OAI_PMH.ListRecords.record)
expect(resultBody["OAI-PMH"].ListRecords.record)
.to.be.an("array")
.and.to.have.lengthOf(12);
});
Expand All @@ -117,10 +118,10 @@ describe("Oai routes", () => {
expect(result.statusCode).to.eq(400);
expect(result).to.have.header("content-type", /application\/xml/);
const resultBody = convert.xml2js(result.body, xmlOpts);
expect(resultBody.OAI_PMH.error["_attributes"]["code"]).to.eq(
expect(resultBody["OAI-PMH"].error["_attributes"]["code"]).to.eq(
"badArgument"
);
expect(resultBody.OAI_PMH.error["_text"]).to.eq(
expect(resultBody["OAI-PMH"].error["_text"]).to.eq(
"Invalid date -- make sure that 'from' or 'until' parameters are formatted as: 'YYYY-MM-DDThh:mm:ss.ffffffZ'"
);
});
Expand All @@ -136,7 +137,7 @@ describe("Oai routes", () => {
expect(result.statusCode).to.eq(200);
expect(result).to.have.header("content-type", /application\/xml/);
const resultBody = convert.xml2js(result.body, xmlOpts);
expect(resultBody.OAI_PMH.ListRecords.record)
expect(resultBody["OAI-PMH"].ListRecords.record)
.to.be.an("array")
.and.to.have.lengthOf(12);
});
Expand All @@ -161,7 +162,7 @@ describe("Oai routes", () => {
expect(result.statusCode).to.eq(200);
expect(result).to.have.header("content-type", /application\/xml/);
const resultBody = convert.xml2js(result.body, xmlOpts);
const resumptionToken = resultBody.OAI_PMH.ListRecords.resumptionToken;
const resumptionToken = resultBody["OAI-PMH"].ListRecords.resumptionToken;
expect(resumptionToken).to.not.haveOwnProperty("_text");
});

Expand All @@ -179,10 +180,10 @@ describe("Oai routes", () => {
expect(result.statusCode).to.eq(401);
expect(result).to.have.header("content-type", /application\/xml/);
const resultBody = convert.xml2js(result.body, xmlOpts);
expect(resultBody.OAI_PMH.error["_attributes"]["code"]).to.eq(
expect(resultBody["OAI-PMH"].error["_attributes"]["code"]).to.eq(
"badResumptionToken"
);
expect(resultBody.OAI_PMH.error["_text"]).to.eq(
expect(resultBody["OAI-PMH"].error["_text"]).to.eq(
"Your resumptionToken is no longer valid"
);
});
Expand All @@ -201,10 +202,10 @@ describe("Oai routes", () => {
expect(result.statusCode).to.eq(400);
expect(result).to.have.header("content-type", /application\/xml/);
const resultBody = convert.xml2js(result.body, xmlOpts);
expect(resultBody.OAI_PMH.error["_attributes"]["code"]).to.eq(
expect(resultBody["OAI-PMH"].error["_attributes"]["code"]).to.eq(
"badRequest"
);
expect(resultBody.OAI_PMH.error["_text"]).to.eq(
expect(resultBody["OAI-PMH"].error["_text"]).to.eq(
"An error occurred processing the ListRecords request"
);
});
Expand All @@ -219,10 +220,10 @@ describe("Oai routes", () => {
expect(result.statusCode).to.eq(400);
expect(result).to.have.header("content-type", /application\/xml/);
const resultBody = convert.xml2js(result.body, xmlOpts);
expect(resultBody.OAI_PMH.error["_attributes"]["code"]).to.eq(
expect(resultBody["OAI-PMH"].error["_attributes"]["code"]).to.eq(
"badArgument"
);
expect(resultBody.OAI_PMH.error["_text"]).to.eq(
expect(resultBody["OAI-PMH"].error["_text"]).to.eq(
"Missing required metadataPrefix argument"
);
});
Expand All @@ -237,7 +238,7 @@ describe("Oai routes", () => {
expect(result).to.have.header("content-type", /application\/xml/);
const resultBody = convert.xml2js(result.body, xmlOpts);
const listMetadataFormatsElement =
resultBody.OAI_PMH.ListMetadataFormats.metadataFormat;
resultBody["OAI-PMH"].ListMetadataFormats.metadataFormat;
expect(listMetadataFormatsElement.metadataNamespace._text).to.eq(
"http://www.openarchives.org/OAI/2.0/oai_dc/"
);
Expand All @@ -254,10 +255,10 @@ describe("Oai routes", () => {
expect(result.statusCode).to.eq(400);
expect(result).to.have.header("content-type", /application\/xml/);
const resultBody = convert.xml2js(result.body, xmlOpts);
expect(resultBody.OAI_PMH.error._attributes).to.include({
expect(resultBody["OAI-PMH"].error._attributes).to.include({
code: "badArgument",
});
expect(resultBody.OAI_PMH.error._text).to.eq("Missing required verb");
expect(resultBody["OAI-PMH"].error._text).to.eq("Missing required verb");
});

it("supports the Identify verb", async () => {
Expand Down Expand Up @@ -286,7 +287,7 @@ describe("Oai routes", () => {
expect(result.statusCode).to.eq(200);
expect(result).to.have.header("content-type", /application\/xml/);
const resultBody = convert.xml2js(result.body, xmlOpts);
const identifyElement = resultBody.OAI_PMH.Identify;
const identifyElement = resultBody["OAI-PMH"].Identify;
expect(identifyElement.earliestDatestamp._text).to.eq(
"2022-11-22T20:36:00.581418Z"
);
Expand All @@ -308,7 +309,7 @@ describe("Oai routes", () => {
expect(result.statusCode).to.eq(200);
expect(result).to.have.header("content-type", /application\/xml/);
const resultBody = convert.xml2js(result.body, xmlOpts);
expect(resultBody.OAI_PMH.ListRecords.record)
expect(resultBody["OAI-PMH"].ListRecords.record)
.to.be.an("array")
.to.have.lengthOf(12);
});
Expand All @@ -325,7 +326,7 @@ describe("Oai routes", () => {
expect(result.statusCode).to.eq(200);
expect(result).to.have.header("content-type", /application\/xml/);
const resultBody = convert.xml2js(result.body, xmlOpts);
expect(resultBody.OAI_PMH.ListSets.set)
expect(resultBody["OAI-PMH"].ListSets.set)
.to.be.an("array")
.and.to.have.lengthOf(3);
});
Expand All @@ -342,10 +343,10 @@ describe("Oai routes", () => {
expect(result.statusCode).to.eq(500);
expect(result).to.have.header("content-type", /application\/xml/);
const resultBody = convert.xml2js(result.body, xmlOpts);
expect(resultBody.OAI_PMH.error._attributes).to.include({
expect(resultBody["OAI-PMH"].error._attributes).to.include({
code: "badRequest",
});
expect(resultBody.OAI_PMH.error._text).to.eq(
expect(resultBody["OAI-PMH"].error._text).to.eq(
"An error occurred processing the ListSets request"
);
});
Expand All @@ -363,7 +364,7 @@ describe("Oai routes", () => {
expect(result).to.have.header("content-type", /application\/xml/);
const resultBody = convert.xml2js(result.body, xmlOpts);
const resumptionToken =
resultBody.OAI_PMH.ListIdentifiers.resumptionToken;
resultBody["OAI-PMH"].ListIdentifiers.resumptionToken;
expect(resumptionToken["_text"]).to.have.lengthOf(120);
});

Expand All @@ -376,10 +377,10 @@ describe("Oai routes", () => {
expect(result.statusCode).to.eq(400);
expect(result).to.have.header("content-type", /application\/xml/);
const resultBody = convert.xml2js(result.body, xmlOpts);
expect(resultBody.OAI_PMH.error._attributes).to.include({
expect(resultBody["OAI-PMH"].error._attributes).to.include({
code: "badArgument",
});
expect(resultBody.OAI_PMH.error._text).to.eq(
expect(resultBody["OAI-PMH"].error._text).to.eq(
"Missing required metadataPrefix argument"
);
});
Expand All @@ -404,7 +405,7 @@ describe("Oai routes", () => {
expect(result.statusCode).to.eq(200);
expect(result).to.have.header("content-type", /application\/xml/);
const resultBody = convert.xml2js(result.body, xmlOpts);
expect(resultBody.OAI_PMH.ListIdentifiers.headers)
expect(resultBody["OAI-PMH"].ListIdentifiers.headers)
.to.be.an("array")
.to.have.lengthOf(1);
});
Expand Down Expand Up @@ -436,7 +437,7 @@ describe("Oai routes", () => {
expect(result).to.have.header("content-type", /application\/xml/);
const resultBody = convert.xml2js(result.body, xmlOpts);
const resumptionToken =
resultBody.OAI_PMH.ListIdentifiers.resumptionToken;
resultBody["OAI-PMH"].ListIdentifiers.resumptionToken;
expect(resumptionToken).to.not.haveOwnProperty("_text");
});

Expand All @@ -460,10 +461,10 @@ describe("Oai routes", () => {
expect(result.statusCode).to.eq(401);
expect(result).to.have.header("content-type", /application\/xml/);
const resultBody = convert.xml2js(result.body, xmlOpts);
expect(resultBody.OAI_PMH.error["_attributes"]["code"]).to.eq(
expect(resultBody["OAI-PMH"].error["_attributes"]["code"]).to.eq(
"badResumptionToken"
);
expect(resultBody.OAI_PMH.error["_text"]).to.eq(
expect(resultBody["OAI-PMH"].error["_text"]).to.eq(
"Your resumptionToken is no longer valid"
);
});
Expand All @@ -488,10 +489,10 @@ describe("Oai routes", () => {
expect(result.statusCode).to.eq(400);
expect(result).to.have.header("content-type", /application\/xml/);
const resultBody = convert.xml2js(result.body, xmlOpts);
expect(resultBody.OAI_PMH.error["_attributes"]["code"]).to.eq(
expect(resultBody["OAI-PMH"].error["_attributes"]["code"]).to.eq(
"badRequest"
);
expect(resultBody.OAI_PMH.error["_text"]).to.eq(
expect(resultBody["OAI-PMH"].error["_text"]).to.eq(
"An error occurred processing the ListIdentifiers request"
);
});
Expand All @@ -505,7 +506,7 @@ describe("Oai routes", () => {
expect(result.statusCode).to.eq(400);
expect(result).to.have.header("content-type", /application\/xml/);
const resultBody = convert.xml2js(result.body, xmlOpts);
expect(resultBody.OAI_PMH.error._attributes).to.include({
expect(resultBody["OAI-PMH"].error._attributes).to.include({
code: "badVerb",
});
});
Expand Down