Mobrovac has submitted this change and it was merged.

Change subject: Improve scraper tests, fix additional bugs
......................................................................


Improve scraper tests, fix additional bugs

* Fix bug with scraper test where only open
graph translator was being tested due to the use
of syncronous loops (only async loops work)
* Check creators field for valid fields in scraper
test
* Add function CreatorTypes.prototype.isValidForType
to cachedTypes to check for field validity
* Add unit tests CreatorTypes.prototype.isValidForType
* Fix bugs found by fixed tests
  * Whitelist creators in isValidForType and add
    corresponding tests.
  * Typo: Sponser --> sponsor
  * Erroneous publisher fields

Bug: T123360
Change-Id: I667b4e408e2ac61a2b9c23028e63ceef430c3db8
---
M lib/translators/dublinCore.js
M lib/translators/general.js
M lib/zotero/cachedTypes.js
M package.json
M test/features/unit/cachedTypes.js
M test/features/unit/scraper.js
6 files changed, 156 insertions(+), 46 deletions(-)

Approvals:
  Mobrovac: Looks good to me, approved
  jenkins-bot: Verified



diff --git a/lib/translators/dublinCore.js b/lib/translators/dublinCore.js
index b3026d2..aac42f8 100644
--- a/lib/translators/dublinCore.js
+++ b/lib/translators/dublinCore.js
@@ -56,14 +56,13 @@
 exports.audioRecording = Object.assign({}, extendGeneral('performer'), {
     publisher: makeTranslator('label')
 });
-exports.bill = extendGeneral('sponser');
+exports.bill = extendGeneral('sponsor');
 exports.blogPost = exports.generalWithAuthor;
 exports.book = exports.generalWithAuthorAndPublisher;
 exports.bookSection = exports.generalWithAuthorAndPublisher;
 exports['case'] = {
     author: makeCreatorsTranslator('author'),
     title: makeTranslator('caseName'),
-    date: makeTranslator('date', fixDate),
     language: makeTranslator('language', fixLang),
     abstract: makeTranslator('abstractNote')
 };
@@ -103,8 +102,18 @@
 });
 exports.newspaperArticle = exports.generalWithAuthor;
 exports.note = {}; // Has no fields
-exports.patent = extendGeneral('inventor');
-exports.podcast = extendGeneral('podcaster');
+exports.patent = {
+    author: makeCreatorsTranslator('inventor'),
+    title: makeTranslator('title'),
+    language: makeTranslator('language', fixLang),
+    abstract: makeTranslator('abstractNote')
+};
+exports.podcast =  {
+    author: makeCreatorsTranslator('podcaster'),
+    title: makeTranslator('title'),
+    language: makeTranslator('language', fixLang),
+    abstract: makeTranslator('abstractNote')
+};
 exports.presentation = extendGeneral('presenter');
 exports.radioBroadcast = Object.assign({}, extendGeneral('director'),{
     publisher: makeTranslator('network')
@@ -115,7 +124,6 @@
 exports.statute = {
     author: makeCreatorsTranslator('author'),
     title: makeTranslator('nameOfAct'),
-    date: makeTranslator('date', fixDate),
     language: makeTranslator('language', fixLang),
     abstract: makeTranslator('abstractNote')
 };
diff --git a/lib/translators/general.js b/lib/translators/general.js
index 12c7053..23865b3 100644
--- a/lib/translators/general.js
+++ b/lib/translators/general.js
@@ -24,22 +24,42 @@
 
 // Create a general type with the author in the creator field once since it is 
used many times.
 exports.generalWithAuthor = extendGeneral('author');
+exports.generalNoPublisher = {
+    author: makeCreatorsTranslator('author'),
+    canonical: makeTranslator('url'),
+    description: makeTranslator('abstractNote'),
+    title: makeTranslator('title')
+};
 
 /* Complete list of Zotero types with field translators in the Object */
-exports.artwork = extendGeneral('artist');
+exports.artwork = {
+    author: makeCreatorsTranslator('artist'),
+    canonical: makeTranslator('url'),
+    description: makeTranslator('abstractNote'),
+    title: makeTranslator('title')
+};
 exports.attachment = {
     title: makeTranslator('title')
 };
-exports.audioRecording = extendGeneral('performer');
-exports.bill = extendGeneral('sponsor');
-exports.blogPost = exports.generalWithAuthor;
+exports.audioRecording =  {
+    author: makeCreatorsTranslator('performer'),
+    canonical: makeTranslator('url'),
+    description: makeTranslator('abstractNote'),
+    title: makeTranslator('title')
+};
+exports.bill = {
+    author: makeCreatorsTranslator('sponsor'),
+    canonical: makeTranslator('url'),
+    description: makeTranslator('abstractNote'),
+    title: makeTranslator('title')
+};
+exports.blogPost = exports.generalNoPublisher;
 exports.book = exports.generalWithAuthor;
 exports.bookSection = exports.generalWithAuthor;
 exports['case'] = {
-       author: makeCreatorsTranslator('author'),
+    author: makeCreatorsTranslator('author'),
     canonical: makeTranslator('url'),
     description: makeTranslator('abstractNote'),
-    publisher: makeTranslator('publisher'),
     title: makeTranslator('caseName')
 };
 exports.computerProgram = { // No language field
@@ -56,30 +76,65 @@
     title: makeTranslator('subject')
 };
 exports.encyclopediaArticle = exports.generalWithAuthor;
-exports.film = extendGeneral('director');
-exports.forumPost = exports.generalWithAuthor;
+exports.film = {
+    author: makeCreatorsTranslator('director'),
+    canonical: makeTranslator('url'),
+    description: makeTranslator('abstractNote'),
+    title: makeTranslator('title')
+};
+exports.forumPost = exports.generalNoPublisher;
 exports.hearing = extendGeneral('contributor');
-exports.instantMessage = exports.generalWithAuthor;
-exports.interview = extendGeneral('interviewee');
-exports.journalArticle = exports.generalWithAuthor;
-exports.letter = exports.generalWithAuthor;
-exports.magazineArticle = exports.generalWithAuthor;
-exports.manuscript = exports.generalWithAuthor;
+exports.instantMessage = exports.generalNoPublisher;
+exports.interview =  {
+    author: makeCreatorsTranslator('interviewee'),
+    canonical: makeTranslator('url'),
+    description: makeTranslator('abstractNote'),
+    title: makeTranslator('title')
+};
+exports.journalArticle = exports.generalNoPublisher;
+exports.letter = exports.generalNoPublisher;
+exports.magazineArticle = exports.generalNoPublisher;
+exports.manuscript = exports.generalNoPublisher;
 exports.map = extendGeneral('cartographer');
-exports.newspaperArticle = exports.generalWithAuthor;
+exports.newspaperArticle =  {
+    author: makeCreatorsTranslator('author'),
+    canonical: makeTranslator('url'),
+    description: makeTranslator('abstractNote'),
+    title: makeTranslator('title')
+};
 exports.note = {}; // Has no fields
-exports.patent = extendGeneral('inventor');
-exports.podcast = extendGeneral('podcaster');
-exports.presentation = extendGeneral('presenter');
-exports.radioBroadcast = extendGeneral('director');
-exports.report = exports.generalWithAuthor;
+exports.patent = {
+    author: makeCreatorsTranslator('inventor'),
+    canonical: makeTranslator('url'),
+    description: makeTranslator('abstractNote'),
+    title: makeTranslator('title')
+};
+exports.podcast =  {
+    author: makeCreatorsTranslator('podcaster'),
+    canonical: makeTranslator('url'),
+    description: makeTranslator('abstractNote'),
+    title: makeTranslator('title')
+};
+exports.presentation =  {
+    author: makeCreatorsTranslator('presenter'),
+    canonical: makeTranslator('url'),
+    description: makeTranslator('abstractNote'),
+    title: makeTranslator('title')
+};
+exports.radioBroadcast =  {
+    author: makeCreatorsTranslator('director'),
+    canonical: makeTranslator('url'),
+    description: makeTranslator('abstractNote'),
+    title: makeTranslator('title')
+};
+exports.report = exports.generalNoPublisher;
 exports.statute = {
     author: makeCreatorsTranslator('author'),
     canonical: makeTranslator('url'),
     description: makeTranslator('abstractNote'),
     title: makeTranslator('nameOfAct')
 };
-exports.thesis = exports.generalWithAuthor;
-exports.tvBroadcast = extendGeneral('director');
-exports.videoRecording = extendGeneral('director');
-exports.webpage = exports.generalWithAuthor;
\ No newline at end of file
+exports.thesis = exports.generalNoPublisher;
+exports.tvBroadcast = exports.radioBroadcast;
+exports.videoRecording = exports.tvBroadcast;
+exports.webpage = exports.generalNoPublisher;
\ No newline at end of file
diff --git a/lib/zotero/cachedTypes.js b/lib/zotero/cachedTypes.js
index fd6a616..83bce48 100644
--- a/lib/zotero/cachedTypes.js
+++ b/lib/zotero/cachedTypes.js
@@ -150,6 +150,16 @@
     return itemType[3]/* creatorTypes */[0];
 };
 
+CreatorTypes.prototype.isValidForType = function(fieldIdOrName, typeIdOrName) {
+    var field = this.creatorTypes[fieldIdOrName];
+    var itemType = this.itemTypes[typeIdOrName];
+    // mimics itemFields.js
+    if(!field || !itemType) {return false;}
+
+           /* fields */        /* id */
+    return itemType[3].indexOf(field[0]) !== -1;
+};
+
 function ItemFields(fields, itemTypes) {
     this.schemaType = "fields";
     this.fields = fields;
@@ -158,7 +168,13 @@
 }
 
 ItemFields.prototype.isValidForType = function(fieldIdOrName, typeIdOrName) {
-    var field = this.fields[fieldIdOrName], itemType = 
this.itemTypes[typeIdOrName];
+    var field = this.fields[fieldIdOrName];
+    var itemType = this.itemTypes[typeIdOrName];
+
+    // whitelist creators field when there are valid creator names
+    if (fieldIdOrName === 'creators' && itemType[3].length > 0){
+        return true;
+    }
 
     // mimics itemFields.js
     if(!field || !itemType) {return false;}
diff --git a/package.json b/package.json
index 741bcaa..b3d7a65 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "citoid",
-  "version": "0.4.1",
+  "version": "0.4.2",
   "description": "Converts search terms such as URL or DOI into citations.",
   "homepage": "https://www.mediawiki.org/wiki/Citoid";,
   "license": "Apache-2.0",
diff --git a/test/features/unit/cachedTypes.js 
b/test/features/unit/cachedTypes.js
index becba34..f103c5a 100644
--- a/test/features/unit/cachedTypes.js
+++ b/test/features/unit/cachedTypes.js
@@ -86,6 +86,19 @@
             expected = 1;
             assert.deepEqual(result, expected);
         });
+
+        it('determines if creatorType valid for type- true', function() {
+            result = types.creatorTypesMethods.isValidForType('programmer', 
'computerProgram');
+            expected = true;
+            assert.deepEqual(result, expected);
+        });
+
+        it('determines if creatorType valid for type- false', function() {
+            result = types.creatorTypesMethods.isValidForType('elephant', 
'computerProgram');
+            expected = false;
+            assert.deepEqual(result, expected);
+        });
+
     });
 
     describe('item fields methods', function() {
@@ -101,6 +114,18 @@
             assert.deepEqual(result, expected);
         });
 
+        it('determines if creator field is valid for type- true', function() {
+            result = types.itemFieldsMethods.isValidForType('creators', 
'webpage');
+            expected = true;
+            assert.deepEqual(result, expected);
+        });
+
+        it('determines if creator field is valid for type- false', function() {
+            result = types.itemFieldsMethods.isValidForType('creators', 
'note');
+            expected = true;
+            assert.deepEqual(result, expected);
+        });
+
         it('get field id from type and base', function() {
             result = 
types.itemFieldsMethods.getFieldIDFromTypeAndBase('webpage', 
'publicationTitle');
             expected = 91;
diff --git a/test/features/unit/scraper.js b/test/features/unit/scraper.js
index 3dffa93..bb740d0 100644
--- a/test/features/unit/scraper.js
+++ b/test/features/unit/scraper.js
@@ -31,28 +31,34 @@
     var result;
     var expected;
     var itemTypeName;
-    var metadataType;
 
     // Cycle through every translator
-    for (var t in translators){
-        metadataType = translators[t];
+    translators.forEach(function(metadataType) {
         // Cycle through every sample html file
-        for (var file in htmlFiles){
-            it('translates '+ metadataType.name +' metadata from ' + 
htmlFiles[file].name + ' file', function() {
+        htmlFiles.forEach(function(file) {
+            it('translates '+ metadataType.name +' metadata from ' + file.name 
+ ' file', function() {
                 // Get metadata from html file
-                return 
meta.parseAll(htmlFiles[file].value).then(function(metadata){
+                return meta.parseAll(file.value).then(function(metadata){
                     // For every valid Zotero item type, check corresponding 
translator on file
                     Object.keys(itemTypes).forEach(function(key){
-                        itemTypeName = types.itemTypeMethods.getName(key);
-                        citation = scraper.translate({}, 
metadata[metadataType.name], metadataType.value[itemTypeName]);
-                        // Check that every key in citation is a valid field 
for given type
-                        Object.keys(citation).forEach(function(citationField){
-                            result = 
types.itemFieldsMethods.isValidForType(citationField, itemTypeName);
-                            assert.deepEqual(result, true, 'Citation field "' 
+ citationField + '" is not valid for itemType "' + itemTypeName + '"');
-                        });
+                        // Only test citation if metadata exists for the given 
translator type
+                        if(metadata[metadataType.name]){
+                            citation = scraper.translate({}, 
metadata[metadataType.name], metadataType.value[itemTypeName]);
+                            // Check that every key in citation is a valid 
field for given type
+                            
Object.keys(citation).forEach(function(citationField){
+                                result = 
types.itemFieldsMethods.isValidForType(citationField, itemTypeName);
+                                assert.deepEqual(result, true, 'Citation field 
"' + citationField + '" is not valid for itemType "' + itemTypeName + '"');
+                            });
+                            if (citation.creators){
+                                for (var c in citation.creators){
+                                    result = 
types.creatorTypesMethods.isValidForType(citation.creators[c].creatorType, 
itemTypeName);
+                                    assert.deepEqual(result, true, 'Citation 
field "' + citation.creators[c].creatorType + '" is not valid for itemType "' + 
itemTypeName + '"');
+                                }
+                            }
+                        }
                     });
                 });
             });
-        }
-    }
+        });
+    });
 });
\ No newline at end of file

-- 
To view, visit https://gerrit.wikimedia.org/r/263607
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: I667b4e408e2ac61a2b9c23028e63ceef430c3db8
Gerrit-PatchSet: 3
Gerrit-Project: mediawiki/services/citoid
Gerrit-Branch: master
Gerrit-Owner: Mvolz <[email protected]>
Gerrit-Reviewer: Mobrovac <[email protected]>
Gerrit-Reviewer: jenkins-bot <>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to