141258d564
Because regex is built using a template string, \s* is actually escaped into s*, i.e. literal "s" appearing 0 or more times. In most cases this would mean that output can have spacing slightly off. In extreme case, when identifier starts with letter "s", this could this could lead to identifier being stored incorrectly. Also adjusted tests to be more strict and mock data to cover this case.
239 lines
8.1 KiB
JavaScript
239 lines
8.1 KiB
JavaScript
/* global setHTTPResponse:false, sinon: false, Zotero_Import_Mendeley: false, HttpServer: false */
|
|
|
|
describe('Zotero_Import_Mendeley', function () {
|
|
var server, importer, httpd, httpdURL;
|
|
|
|
before(async () => {
|
|
Components.utils.import('chrome://zotero/content/import/mendeley/mendeleyImport.js');
|
|
importer = new Zotero_Import_Mendeley();
|
|
importer.mendeleyCode = 'CODE';
|
|
|
|
// real http server is used to deliver an empty pdf so that annotations can be processed during import
|
|
Components.utils.import("resource://zotero-unit/httpd.js");
|
|
const port = 16213;
|
|
httpd = new HttpServer();
|
|
httpdURL = `http://127.0.0.1:${port}`;
|
|
httpd.start(port);
|
|
httpd.registerFile(
|
|
'/file1.pdf',
|
|
Zotero.File.pathToFile(OS.Path.join(getTestDataDirectory().path, 'empty.pdf'))
|
|
);
|
|
});
|
|
|
|
after(async () => {
|
|
await new Zotero.Promise(resolve => httpd.stop(resolve));
|
|
});
|
|
|
|
beforeEach(async () => {
|
|
Zotero.HTTP.mock = sinon.FakeXMLHttpRequest;
|
|
server = sinon.fakeServer.create();
|
|
server.autoRespond = true;
|
|
setHTTPResponse(server, 'https://www.zotero.org/', {
|
|
method: 'POST',
|
|
url: `utils/mendeley/oauth`,
|
|
status: 200,
|
|
headers: {},
|
|
json: {
|
|
access_token: 'ACCESS_TOKEN', // eslint-disable-line camelcase
|
|
token_type: 'bearer', // eslint-disable-line camelcase
|
|
expires_in: 3600, // eslint-disable-line camelcase
|
|
refresh_token: 'REFRESH_TOKEN', // eslint-disable-line camelcase
|
|
msso: null,
|
|
scope: 'all'
|
|
}
|
|
});
|
|
|
|
setHTTPResponse(server, 'https://api.mendeley.com/', {
|
|
method: 'GET',
|
|
url: `folders?limit=500`,
|
|
status: 200,
|
|
headers: {},
|
|
json: JSON.parse(
|
|
await Zotero.File.getContentsFromURLAsync('resource://zotero-unit-tests/data/mendeleyMock/folders-simple.json')
|
|
)
|
|
});
|
|
|
|
setHTTPResponse(server, 'https://api.mendeley.com/', {
|
|
method: 'GET',
|
|
url: `annotations?limit=200`,
|
|
status: 200,
|
|
headers: {},
|
|
json: JSON.parse(
|
|
await Zotero.File.getContentsFromURLAsync('resource://zotero-unit-tests/data/mendeleyMock/annotations.json')
|
|
)
|
|
});
|
|
|
|
setHTTPResponse(server, 'https://api.mendeley.com/', {
|
|
method: 'GET',
|
|
url: `documents?view=all&limit=500`,
|
|
status: 200,
|
|
headers: {},
|
|
json: JSON.parse(
|
|
await Zotero.File.getContentsFromURLAsync('resource://zotero-unit-tests/data/mendeleyMock/items-simple.json')
|
|
)
|
|
});
|
|
|
|
setHTTPResponse(server, 'https://api.mendeley.com/', {
|
|
method: 'GET',
|
|
url: `profiles/v2/me?`,
|
|
status: 200,
|
|
headers: {},
|
|
json: JSON.parse(
|
|
await Zotero.File.getContentsFromURLAsync('resource://zotero-unit-tests/data/mendeleyMock/user.json')
|
|
)
|
|
});
|
|
|
|
setHTTPResponse(server, 'https://api.mendeley.com/', {
|
|
method: 'GET',
|
|
url: `groups/v2?type=all&limit=500`,
|
|
status: 200,
|
|
headers: {},
|
|
json: JSON.parse(
|
|
await Zotero.File.getContentsFromURLAsync('resource://zotero-unit-tests/data/mendeleyMock/groups.json')
|
|
)
|
|
});
|
|
|
|
setHTTPResponse(server, 'https://api.mendeley.com/', {
|
|
method: 'GET',
|
|
url: `files/19fb5e5b-1a39-4851-b513-d48441a670e1?`,
|
|
status: 200, // ideally would be 303 but mock http doesn't like it
|
|
headers: {
|
|
Location: `${httpdURL}/file1.pdf`
|
|
},
|
|
text: ''
|
|
});
|
|
|
|
setHTTPResponse(server, 'https://api.mendeley.com/', {
|
|
method: 'GET',
|
|
url: `annotations?group_id=ec66aee6-455c-300c-b601-ba4d6a34a95e&limit=200`,
|
|
status: 200,
|
|
json: JSON.parse(
|
|
await Zotero.File.getContentsFromURLAsync('resource://zotero-unit-tests/data/mendeleyMock/group-annotations.json')
|
|
)
|
|
});
|
|
|
|
setHTTPResponse(server, 'https://api.mendeley.com/', {
|
|
method: 'GET',
|
|
url: `annotations?group_id=cc697d28-054c-37d2-afa3-74fa4cf8a727&limit=200`,
|
|
status: 200,
|
|
json: []
|
|
});
|
|
|
|
setHTTPResponse(server, 'https://api.mendeley.com/', {
|
|
method: 'GET',
|
|
url: `annotations?group_id=6a15e9d6-c7e6-3716-8834-7a67d6f5f91f&limit=200`,
|
|
status: 200,
|
|
json: []
|
|
});
|
|
});
|
|
|
|
afterEach(() => {
|
|
Zotero.HTTP.mock = null;
|
|
});
|
|
|
|
describe('#import', () => {
|
|
it("should import collections, items, attachments & annotations", async () => {
|
|
await importer.translate({
|
|
libraryID: Zotero.Libraries.userLibraryID,
|
|
collections: null,
|
|
linkFiles: false,
|
|
});
|
|
|
|
const journal = (await Zotero.Relations
|
|
.getByPredicateAndObject('item', 'mendeleyDB:documentUUID', '7fea3cb3-f97d-3f16-8fad-f59caaa71688'))
|
|
.filter(item => item.libraryID == Zotero.Libraries.userLibraryID && !item.deleted)
|
|
.shift();
|
|
|
|
const report = (await Zotero.Relations
|
|
.getByPredicateAndObject('item', 'mendeleyDB:documentUUID', '07a74c26-28d1-4d9f-a60d-3f3bc5ef76ef'))
|
|
.filter(item => item.libraryID == Zotero.Libraries.userLibraryID && !item.deleted)
|
|
.shift();
|
|
|
|
const withpdf = (await Zotero.Relations
|
|
.getByPredicateAndObject('item', 'mendeleyDB:documentUUID', 'c54b0c6f-c4ce-4706-8742-bc7d032df862'))
|
|
.filter(item => item.libraryID == Zotero.Libraries.userLibraryID && !item.deleted)
|
|
.shift();
|
|
|
|
const pdf = (await Zotero.Relations
|
|
.getByPredicateAndObject('item', 'mendeleyDB:fileHash', 'cc22c6611277df346ff8dc7386ba3880b2bafa15'))
|
|
.filter(item => item.libraryID == Zotero.Libraries.userLibraryID && !item.deleted)
|
|
.shift();
|
|
|
|
assert.equal(journal.getField('title'), 'Foo Bar');
|
|
assert.equal(journal.itemTypeID, Zotero.ItemTypes.getID('journalArticle'));
|
|
assert.equal(report.getField('title'), 'Sample Report');
|
|
assert.equal(report.itemTypeID, Zotero.ItemTypes.getID('report'));
|
|
assert.equal(withpdf.getField('title'), 'Item with PDF');
|
|
assert.equal(withpdf.itemTypeID, Zotero.ItemTypes.getID('journalArticle'));
|
|
|
|
// creators
|
|
const creators = journal.getCreators();
|
|
assert.lengthOf(creators, 2);
|
|
assert.sameMembers(creators.map(c => c.firstName), ["Tom", "Lorem"]);
|
|
assert.sameMembers(creators.map(c => c.lastName), ["Najdek", "Ipsum"]);
|
|
|
|
// identifiers
|
|
assert.equal(journal.getField('DOI'), '10.1111');
|
|
assert.sameMembers(journal.getField('extra').split('\n'), ['PMID: 11111111', 'arXiv: 1111.2222']);
|
|
|
|
// attachment & annotations
|
|
assert.lengthOf(withpdf.getAttachments(), 1);
|
|
assert.equal(pdf.parentID, withpdf.id);
|
|
const annotations = await pdf.getAnnotations();
|
|
assert.equal(annotations.length, 5);
|
|
assert.isTrue(annotations.some(a => a.annotationComment === 'blue note 2'));
|
|
assert.isTrue(annotations.some(a => a.annotationComment === 'orange note1'));
|
|
assert.isTrue(annotations.some(a => a.annotationComment === 'note by me'));
|
|
assert.isFalse(annotations.some(a => a.annotationComment === 'note by other'));
|
|
assert.isFalse(annotations.some(a => a.annotationComment === 'mismatched note'));
|
|
|
|
// collection
|
|
const parentCollection = await Zotero.Collections.getAsync(
|
|
journal.getCollections().pop()
|
|
);
|
|
|
|
assert.equal(parentCollection.name, 'folder1');
|
|
});
|
|
|
|
it("should update previously imported item", async () => {
|
|
const importer = new Zotero_Import_Mendeley();
|
|
importer.mendeleyCode = 'CODE';
|
|
await importer.translate({
|
|
libraryID: Zotero.Libraries.userLibraryID,
|
|
collections: null,
|
|
linkFiles: false,
|
|
});
|
|
|
|
const report = (await Zotero.Relations
|
|
.getByPredicateAndObject('item', 'mendeleyDB:documentUUID', '07a74c26-28d1-4d9f-a60d-3f3bc5ef76ef'))
|
|
.filter(item => item.libraryID == Zotero.Libraries.userLibraryID && !item.deleted)
|
|
.shift();
|
|
|
|
assert.equal(report.getField('title'), 'Sample Report');
|
|
assert.equal(report.getField('year'), '2002');
|
|
assert.equal(report.itemTypeID, Zotero.ItemTypes.getID('report'));
|
|
assert.lengthOf(report.getTags(), 0);
|
|
|
|
setHTTPResponse(server, 'https://api.mendeley.com/', {
|
|
method: 'GET',
|
|
url: `documents?view=all&limit=500`,
|
|
status: 200,
|
|
headers: {},
|
|
json: JSON.parse(
|
|
await Zotero.File.getContentsFromURLAsync('resource://zotero-unit-tests/data/mendeleyMock/items-updated.json')
|
|
)
|
|
});
|
|
|
|
await importer.translate({
|
|
libraryID: Zotero.Libraries.userLibraryID,
|
|
collections: null,
|
|
linkFiles: false,
|
|
});
|
|
|
|
assert.equal(report.getField('title'), 'Report updated to Journal Article');
|
|
assert.equal(report.itemTypeID, Zotero.ItemTypes.getID('journalArticle'));
|
|
assert.equal(report.getField('year'), '2002');
|
|
assert.sameMembers(report.getTags().map(t => t.tag), ['\u2605']);
|
|
});
|
|
});
|
|
});
|