Add tests for itemFromCSLJSON and make sure data round-trips

This commit is contained in:
Aurimas Vinckevicius 2015-08-04 15:22:35 -05:00
parent c4cd7ce3e0
commit 711b823552
2 changed files with 98 additions and 7 deletions

View file

@ -99,6 +99,7 @@ const CSL_DATE_MAPPINGS = {
/*
* Mappings for types
* Also see itemFromCSLJSON
*/
const CSL_TYPE_MAPPINGS = {
'book':"book",
@ -1645,14 +1646,44 @@ Zotero.Utilities = {
* @param {Object} cslItem
*/
"itemFromCSLJSON":function(item, cslItem) {
var isZoteroItem = item instanceof Zotero.Item, zoteroType;
var isZoteroItem = item instanceof Zotero.Item,
zoteroType;
for(var type in CSL_TYPE_MAPPINGS) {
if(CSL_TYPE_MAPPINGS[type] == cslItem.type) {
zoteroType = type;
break;
// Some special cases to help us map item types correctly
// This ensures that we don't lose data on import. The fields
// we check are incompatible with the alternative item types
if (cslItem.type == 'book') {
zoteroType = 'book';
if (cslItem.version) {
zoteroType = 'computerProgram';
}
} else if (cslItem.type == 'bill') {
zoteroType = 'bill';
if (cslItem.publisher || cslItem['number-of-volumes']) {
zoteroType = 'hearing';
}
} else if (cslItem.type == 'song') {
zoteroType = 'audioRecording';
if (cslItem.number) {
zoteroType = 'podcast';
}
} else if (cslItem.type == 'motion_picture') {
zoteroType = 'film';
if (cslItem['collection-title'] || cslItem['publisher-place']
|| cslItem['event-place'] || cslItem.volume
|| cslItem['number-of-volumes'] || cslItem.ISBN
) {
zoteroType = 'videoRecording';
}
} else {
for(var type in CSL_TYPE_MAPPINGS) {
if(CSL_TYPE_MAPPINGS[type] == cslItem.type) {
zoteroType = type;
break;
}
}
}
if(!zoteroType) zoteroType = "document";
var itemTypeID = Zotero.ItemTypes.getID(zoteroType);
@ -1682,10 +1713,12 @@ Zotero.Utilities = {
if(Zotero.ItemFields.isValidForType(fieldID, itemTypeID)) {
if(isZoteroItem) {
item.setField(fieldID, cslItem[variable], true);
item.setField(fieldID, cslItem[variable]);
} else {
item[field] = cslItem[variable];
}
break;
}
}
}

View file

@ -221,7 +221,7 @@ describe("Zotero.Utilities", function() {
attachment.save();
cslJSONAttachment = Zotero.Utilities.itemToCSLJSON(attachment);
let cslJSONAttachment = Zotero.Utilities.itemToCSLJSON(attachment);
assert.equal(cslJSONAttachment.type, 'article', 'attachment is exported as "article"');
assert.equal(cslJSONAttachment.title, 'Empty', 'attachment title is correct');
assert.deepEqual(cslJSONAttachment.accessed, {"date-parts":[["2001",2,3]]}, 'attachment access date is mapped correctly');
@ -357,4 +357,62 @@ describe("Zotero.Utilities", function() {
assert.deepEqual(cslCreators[5], creators[5].expect, 'protected last name prevents parsing');
});
});
describe("itemFromCSLJSON", function() {
it("should stably perform itemToCSLJSON -> itemFromCSLJSON -> itemToCSLJSON", function() {
let data = loadSampleData('citeProcJSExport');
Zotero.DB.beginTransaction();
for (let i in data) {
let item = data[i];
let zItem = new Zotero.Item();
Zotero.Utilities.itemFromCSLJSON(zItem, item);
zItem = Zotero.Items.get(zItem.save());
let newItem = Zotero.Utilities.itemToCSLJSON(zItem);
delete newItem.id;
delete item.id;
assert.deepEqual(newItem, item, i + ' export -> import -> export is stable');
}
Zotero.DB.commitTransaction();
});
it("should import exported standalone note", function() {
let note = new Zotero.Item('note');
note.setNote('Some note longer than 50 characters, which will become the title.');
note = Zotero.Items.get(note.save());
let jsonNote = Zotero.Utilities.itemToCSLJSON(note);
let zItem = new Zotero.Item();
Zotero.Utilities.itemFromCSLJSON(zItem, jsonNote);
zItem = Zotero.Items.get(zItem.save());
assert.equal(zItem.getField('title'), jsonNote.title, 'title imported correctly');
});
it("should import exported standalone attachment", function() {
let file = getTestDataDirectory();
file.append("empty.pdf");
let attachment = Zotero.Items.get(Zotero.Attachments.importFromFile(file));
attachment.setField('title', 'Empty');
attachment.setField('accessDate', '2001-02-03 12:13:14');
attachment.setField('url', 'http://example.com');
attachment.setNote('Note');
attachment.save();
let jsonAttachment = Zotero.Utilities.itemToCSLJSON(attachment);
let zItem = new Zotero.Item();
Zotero.Utilities.itemFromCSLJSON(zItem, jsonAttachment);
zItem = Zotero.Items.get(zItem.save());
assert.equal(zItem.getField('title'), jsonAttachment.title, 'title imported correctly');
});
});
});