@natlibfi/marc-record-validators-melinda 8.4.5 → 9.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.drone.yml +7 -7
- package/dist/field-exclusion.js +7 -5
- package/dist/field-exclusion.js.map +1 -1
- package/dist/field-exclusion.spec.js +266 -32
- package/dist/field-exclusion.spec.js.map +1 -1
- package/dist/fields-present.spec.js +38 -1
- package/dist/fields-present.spec.js.map +1 -1
- package/package.json +7 -10
- package/src/field-exclusion.js +6 -4
- package/src/field-exclusion.spec.js +140 -32
- package/src/fields-present.spec.js +30 -1
package/.drone.yml
CHANGED
|
@@ -11,29 +11,29 @@ trigger:
|
|
|
11
11
|
steps:
|
|
12
12
|
|
|
13
13
|
- name: audit
|
|
14
|
-
image: node:
|
|
14
|
+
image: node:14
|
|
15
15
|
commands:
|
|
16
16
|
- npm audit --package-lock-only --production --audit-level=moderate
|
|
17
17
|
|
|
18
18
|
- name: install
|
|
19
|
-
image: node:
|
|
19
|
+
image: node:14
|
|
20
20
|
environment:
|
|
21
21
|
NPM_CONFIG_IGNORE_SCRIPTS: true
|
|
22
22
|
commands:
|
|
23
23
|
- npm ci
|
|
24
24
|
|
|
25
25
|
- name: test
|
|
26
|
-
image: node:
|
|
26
|
+
image: node:14
|
|
27
27
|
commands:
|
|
28
28
|
- npm test
|
|
29
29
|
|
|
30
30
|
- name: check-coverage
|
|
31
|
-
image: node:
|
|
31
|
+
image: node:14
|
|
32
32
|
commands:
|
|
33
33
|
- npm run coverage
|
|
34
34
|
|
|
35
35
|
- name: build
|
|
36
|
-
image: node:
|
|
36
|
+
image: node:14
|
|
37
37
|
commands:
|
|
38
38
|
- npm run build
|
|
39
39
|
- NPM_CONFIG_IGNORE_SCRIPTS=true npm ci --production
|
|
@@ -50,7 +50,7 @@ steps:
|
|
|
50
50
|
token:
|
|
51
51
|
from_secret: npm_token
|
|
52
52
|
when:
|
|
53
|
-
event: tag
|
|
53
|
+
event: tag
|
|
54
54
|
---
|
|
55
55
|
kind: pipeline
|
|
56
56
|
type: docker
|
|
@@ -87,6 +87,6 @@ name: gpg_key
|
|
|
87
87
|
data: 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
|
|
88
88
|
---
|
|
89
89
|
kind: signature
|
|
90
|
-
hmac:
|
|
90
|
+
hmac: 976ccc627b05500d5bcf91a1ccdc5c2b0cdfdd18e151220f1a7ca985542cb2d0
|
|
91
91
|
|
|
92
92
|
...
|
package/dist/field-exclusion.js
CHANGED
|
@@ -79,7 +79,8 @@ function forEach(obj, fun) {
|
|
|
79
79
|
}
|
|
80
80
|
|
|
81
81
|
function isRegExp(re) {
|
|
82
|
-
|
|
82
|
+
const result = re instanceof RegExp;
|
|
83
|
+
return result;
|
|
83
84
|
}
|
|
84
85
|
|
|
85
86
|
function _default(config) {
|
|
@@ -88,13 +89,14 @@ function _default(config) {
|
|
|
88
89
|
} // Transform RegExp-only elements to objects
|
|
89
90
|
|
|
90
91
|
|
|
91
|
-
|
|
92
|
+
const objOnlyConfigs = config.map(e => isRegExp(e) ? {
|
|
92
93
|
tag: e
|
|
93
|
-
} : e)
|
|
94
|
+
} : e);
|
|
95
|
+
configValid(objOnlyConfigs);
|
|
94
96
|
return {
|
|
95
97
|
description: 'Checks that the record does not contain the configured fields',
|
|
96
|
-
validate: record => excludeFields(record,
|
|
97
|
-
fix: record => excludeFields(record,
|
|
98
|
+
validate: record => excludeFields(record, objOnlyConfigs, false),
|
|
99
|
+
fix: record => excludeFields(record, objOnlyConfigs, true)
|
|
98
100
|
}; /// /////////////////////////////////////////
|
|
99
101
|
// These check that configuration is valid
|
|
100
102
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/field-exclusion.js"],"names":["confSpec","tag","type","mandatory","value","excl","ind1","ind2","subfields","code","dependencies","leader","forEach","obj","fun","Object","entries","isRegExp","re","RegExp","config","Array","isArray","TypeError","configValid","map","e","description","validate","record","excludeFields","fix","excluded","checkMandatory","key","val","configMatchesSpec","push","includes","Error","data","spec","subObj","subKey","subVal","keys","length","subFieldCheck","confField","element","values","some","subField","elemSub","test","conf","res","message","valid","confObj","found","get","every","confKey","dependency","field","removeField"],"mappings":"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","sourcesContent":["/**\n*\n* @licstart The following is the entire license notice for the JavaScript code in this file.\n*\n* MARC record validators used in Melinda\n*\n* Copyright (c) 2014-2020 University Of Helsinki (The National Library Of Finland)\n*\n* This file is part of marc-record-validators-melinda\n*\n* marc-record-validators-melinda program is free software: you can redistribute it and/or modify\n* it under the terms of the GNU Lesser General Public License as\n* published by the Free Software Foundation, either version 3 of the\n* License, or (at your option) any later version.\n*\n* marc-record-validators-melinda is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n* GNU Lesser General Public License for more details.\n*\n* You should have received a copy of the GNU Lesser General Public License\n* along with this program. If not, see <http://www.gnu.org/licenses/>.\n*\n* @licend The above is the entire license notice\n* for the JavaScript code in this file.\n*\n*/\n\n\n// Configuration specification\nconst confSpec = {\n tag: { // Pattern to match the field's tags\n type: 'RegExp',\n mandatory: true\n },\n value: { // Regular expression object for matching a controlfields value. Mutual exclusive with\n type: 'RegExp',\n excl: ['subfields', 'ind1', 'ind2']\n },\n ind1: { // Pattern to match the field's ind1 property.\n type: 'RegExp', // Array<Indicator>\n excl: ['value']\n },\n ind2: { // Pattern to match the field's ind2 property.\n type: 'RegExp', // Array<Indicator>\n excl: ['value']\n },\n subfields: { // An array of objects with the following properties\n code: {\n type: 'RegExp',\n mandatory: true\n },\n value: {\n type: 'RegExp',\n mandatory: true\n }\n },\n dependencies: {\n leader: {\n type: 'RegExp'\n }\n }\n};\n\nfunction forEach(obj, fun) {\n Object.entries(obj).forEach(fun);\n}\n\nfunction isRegExp(re) {\n return re instanceof RegExp;\n}\n\nexport default function (config) {\n if (!Array.isArray(config)) {\n throw new TypeError('Configuration array not provided');\n }\n\n // Transform RegExp-only elements to objects\n configValid(config.map(e => isRegExp(e) ? {tag: e} : e));\n\n return {\n description:\n 'Checks that the record does not contain the configured fields',\n validate: record => excludeFields(record, config, false),\n fix: record => excludeFields(record, config, true)\n };\n\n /// /////////////////////////////////////////\n // These check that configuration is valid\n function configValid(config) {\n config.forEach(obj => {\n const excluded = []; // Validate fields: check that they are valid to confSpec (exists, correct data type), concat excluded elements\n\n checkMandatory(confSpec, obj);\n\n forEach(obj, ([key, val]) => {\n configMatchesSpec(val, key, confSpec);\n // Concat all excluded elements to array\n if (confSpec[key].excl) { // eslint-disable-line functional/no-conditional-statement\n excluded.push(...confSpec[key].excl); // eslint-disable-line functional/immutable-data\n }\n });\n\n // Check that no excluded elements are in use\n forEach(obj, ([key]) => {\n if (excluded.includes(key)) {\n throw new Error('Configuration not valid - excluded element');\n }\n });\n });\n }\n\n // Recursive validator\n function configMatchesSpec(data, key, spec) {\n // Field not found in configuration spec\n if (!spec[key]) {\n throw new Error(`Configuration not valid - unidentified value: ${key}`);\n }\n\n // If configuration type does not match type in configuration spec\n if (typeof data !== spec[key].type &&\n (spec[key].type === 'RegExp' && !isRegExp(data))) {\n throw new Error(`Configuration not valid - invalid data type for: ${key}`);\n }\n\n // Check subfields recursively\n if (key === 'subfields') { // eslint-disable-line functional/no-conditional-statement\n forEach(data, ([, subObj]) => {\n // Console.log(\"subObj: \", subObj, \" type: \", typeof subObj, !(Array.isArray(subObj)))\n if (typeof subObj === 'object' && !Array.isArray(subObj)) { // eslint-disable-line functional/no-conditional-statement\n checkMandatory(spec[key], subObj);\n\n forEach(subObj, ([subKey, subVal]) => {\n configMatchesSpec(subVal, subKey, spec[key]);\n });\n } else {\n throw new TypeError(`Configuration not valid - subfield: ${subObj} not object`);\n }\n });\n }\n\n if (key === 'dependencies') { // eslint-disable-line functional/no-conditional-statement\n forEach(data, ([, subObj]) => {\n if (!(typeof subObj === 'object' && !Array.isArray(subObj) && Object.keys(subObj).length === 1 && isRegExp(subObj.leader))) {\n throw new TypeError('Configuration not valid - Invalid dependencies config');\n }\n });\n }\n }\n\n function checkMandatory(spec, obj) {\n // Check if all mandatory fields are present\n forEach(spec, ([key, val]) => {\n if (val.mandatory && typeof obj[key] === 'undefined') {\n throw new Error(`Configuration not valid - missing mandatory element: ${key}`);\n }\n });\n }\n /// /////////////////////////////////////////\n\n /// /////////////////////////////////////////\n // These check that record is valid\n function subFieldCheck(confField, element) {\n // Parse trough every configuration subfield, check if one matches some subobjects fields\n return Object.values(confField).some(subField => Object.values(element.subfields)\n // Check if subfield matches configuration spec\n .some(elemSub => subField.code && elemSub.code && subField.code.test(elemSub.code) &&\n subField.value && elemSub.value && subField.value.test(elemSub.value)));\n }\n\n function excludeFields(record, conf, fix) {\n const res = {message: [], valid: true};\n\n // Parse trough every element of config array\n forEach(conf, ([, confObj]) => {\n const found = record.get(confObj.tag); // Find matching record fields based on mandatory tag\n const excluded = [];\n\n // Check if some of found record fields matches all configuration fields\n found.forEach(element => {\n // Compare each found element against each configuration object\n if (Object.entries(confObj).every(([confKey, confField]) => {\n // This is already checked on .get()\n if (confKey === 'tag') {\n return true;\n }\n\n if (confKey === 'dependencies') {\n return confObj.dependencies.every(dependency => dependency.leader.test(record.leader));\n }\n\n // Check subfield configurations\n if (confKey === 'subfields') {\n return subFieldCheck(confField, element);\n }\n\n // Configuration object is RegExp and record value matches it\n if (element[confKey] && isRegExp(confField) && confField.test(element[confKey])) {\n return true;\n\n // Configuration object not found from found element\n }\n\n return false;\n })) {\n // All configuration fields match, element should be excluded.\n if (fix) { // eslint-disable-line functional/no-conditional-statement\n excluded.push(element); // eslint-disable-line functional/immutable-data\n } else { // eslint-disable-line functional/no-conditional-statement\n res.message.push(`Field $${element.tag} should be excluded`); // eslint-disable-line functional/immutable-data\n }\n }\n });\n\n excluded.forEach(field => record.removeField(field));\n });\n\n // Fix does not send response\n if (!fix) {\n if (res.message.length > 0) { // eslint-disable-line functional/no-conditional-statement\n res.valid = false; // eslint-disable-line functional/immutable-data\n }\n\n return res;\n }\n // Res.fix.push('Field $' + element.tag + ' excluded');\n }\n /// /////////////////////////////////////////\n}\n"],"file":"field-exclusion.js"}
|
|
1
|
+
{"version":3,"sources":["../src/field-exclusion.js"],"names":["confSpec","tag","type","mandatory","value","excl","ind1","ind2","subfields","code","dependencies","leader","forEach","obj","fun","Object","entries","isRegExp","re","result","RegExp","config","Array","isArray","TypeError","objOnlyConfigs","map","e","configValid","description","validate","record","excludeFields","fix","excluded","checkMandatory","key","val","configMatchesSpec","push","includes","Error","data","spec","subObj","subKey","subVal","keys","length","subFieldCheck","confField","element","values","some","subField","elemSub","test","conf","res","message","valid","confObj","found","get","every","confKey","dependency","field","removeField"],"mappings":"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","sourcesContent":["/**\n*\n* @licstart The following is the entire license notice for the JavaScript code in this file.\n*\n* MARC record validators used in Melinda\n*\n* Copyright (c) 2014-2020 University Of Helsinki (The National Library Of Finland)\n*\n* This file is part of marc-record-validators-melinda\n*\n* marc-record-validators-melinda program is free software: you can redistribute it and/or modify\n* it under the terms of the GNU Lesser General Public License as\n* published by the Free Software Foundation, either version 3 of the\n* License, or (at your option) any later version.\n*\n* marc-record-validators-melinda is distributed in the hope that it will be useful,\n* but WITHOUT ANY WARRANTY; without even the implied warranty of\n* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n* GNU Lesser General Public License for more details.\n*\n* You should have received a copy of the GNU Lesser General Public License\n* along with this program. If not, see <http://www.gnu.org/licenses/>.\n*\n* @licend The above is the entire license notice\n* for the JavaScript code in this file.\n*\n*/\n\n\n// Configuration specification\nconst confSpec = {\n tag: { // Pattern to match the field's tags\n type: 'RegExp',\n mandatory: true\n },\n value: { // Regular expression object for matching a controlfields value. Mutual exclusive with\n type: 'RegExp',\n excl: ['subfields', 'ind1', 'ind2']\n },\n ind1: { // Pattern to match the field's ind1 property.\n type: 'RegExp', // Array<Indicator>\n excl: ['value']\n },\n ind2: { // Pattern to match the field's ind2 property.\n type: 'RegExp', // Array<Indicator>\n excl: ['value']\n },\n subfields: { // An array of objects with the following properties\n code: {\n type: 'RegExp',\n mandatory: true\n },\n value: {\n type: 'RegExp',\n mandatory: true\n }\n },\n dependencies: {\n leader: {\n type: 'RegExp'\n }\n }\n};\n\nfunction forEach(obj, fun) {\n Object.entries(obj).forEach(fun);\n}\n\nfunction isRegExp(re) {\n const result = re instanceof RegExp;\n return result;\n}\n\nexport default function (config) {\n if (!Array.isArray(config)) {\n throw new TypeError('Configuration array not provided');\n }\n\n // Transform RegExp-only elements to objects\n const objOnlyConfigs = config.map(e => isRegExp(e) ? {tag: e} : e);\n configValid(objOnlyConfigs);\n\n return {\n description:\n 'Checks that the record does not contain the configured fields',\n validate: record => excludeFields(record, objOnlyConfigs, false),\n fix: record => excludeFields(record, objOnlyConfigs, true)\n };\n\n /// /////////////////////////////////////////\n // These check that configuration is valid\n function configValid(config) {\n config.forEach(obj => {\n const excluded = []; // Validate fields: check that they are valid to confSpec (exists, correct data type), concat excluded elements\n\n checkMandatory(confSpec, obj);\n\n forEach(obj, ([key, val]) => {\n configMatchesSpec(val, key, confSpec);\n // Concat all excluded elements to array\n if (confSpec[key].excl) { // eslint-disable-line functional/no-conditional-statement\n excluded.push(...confSpec[key].excl); // eslint-disable-line functional/immutable-data\n }\n });\n\n // Check that no excluded elements are in use\n forEach(obj, ([key]) => {\n if (excluded.includes(key)) {\n throw new Error('Configuration not valid - excluded element');\n }\n });\n });\n }\n\n // Recursive validator\n function configMatchesSpec(data, key, spec) {\n // Field not found in configuration spec\n if (!spec[key]) {\n throw new Error(`Configuration not valid - unidentified value: ${key}`);\n }\n\n // If configuration type does not match type in configuration spec\n if (typeof data !== spec[key].type &&\n (spec[key].type === 'RegExp' && !isRegExp(data))) {\n throw new Error(`Configuration not valid - invalid data type for: ${key}`);\n }\n\n // Check subfields recursively\n if (key === 'subfields') { // eslint-disable-line functional/no-conditional-statement\n forEach(data, ([, subObj]) => {\n // Console.log(\"subObj: \", subObj, \" type: \", typeof subObj, !(Array.isArray(subObj)))\n if (typeof subObj === 'object' && !Array.isArray(subObj)) { // eslint-disable-line functional/no-conditional-statement\n checkMandatory(spec[key], subObj);\n\n forEach(subObj, ([subKey, subVal]) => {\n configMatchesSpec(subVal, subKey, spec[key]);\n });\n } else {\n throw new TypeError(`Configuration not valid - subfield: ${subObj} not object`);\n }\n });\n }\n\n if (key === 'dependencies') { // eslint-disable-line functional/no-conditional-statement\n forEach(data, ([, subObj]) => {\n if (!(typeof subObj === 'object' && !Array.isArray(subObj) && Object.keys(subObj).length === 1 && isRegExp(subObj.leader))) {\n throw new TypeError('Configuration not valid - Invalid dependencies config');\n }\n });\n }\n }\n\n function checkMandatory(spec, obj) {\n // Check if all mandatory fields are present\n forEach(spec, ([key, val]) => {\n if (val.mandatory && typeof obj[key] === 'undefined') {\n throw new Error(`Configuration not valid - missing mandatory element: ${key}`);\n }\n });\n }\n /// /////////////////////////////////////////\n\n /// /////////////////////////////////////////\n // These check that record is valid\n function subFieldCheck(confField, element) {\n // Parse trough every configuration subfield, check if one matches some subobjects fields\n return Object.values(confField).some(subField => Object.values(element.subfields)\n // Check if subfield matches configuration spec\n .some(elemSub => subField.code && elemSub.code && subField.code.test(elemSub.code) &&\n subField.value && elemSub.value && subField.value.test(elemSub.value)));\n }\n\n function excludeFields(record, conf, fix) {\n const res = {message: [], valid: true};\n\n // Parse trough every element of config array\n forEach(conf, ([, confObj]) => {\n const found = record.get(confObj.tag); // Find matching record fields based on mandatory tag\n const excluded = [];\n\n // Check if some of found record fields matches all configuration fields\n found.forEach(element => {\n // Compare each found element against each configuration object\n if (Object.entries(confObj).every(([confKey, confField]) => {\n // This is already checked on .get()\n if (confKey === 'tag') {\n return true;\n }\n\n if (confKey === 'dependencies') {\n return confObj.dependencies.every(dependency => dependency.leader.test(record.leader));\n }\n\n // Check subfield configurations\n if (confKey === 'subfields') {\n return subFieldCheck(confField, element);\n }\n\n // Configuration object is RegExp and record value matches it\n if (element[confKey] && isRegExp(confField) && confField.test(element[confKey])) {\n return true;\n\n // Configuration object not found from found element\n }\n\n return false;\n })) {\n // All configuration fields match, element should be excluded.\n if (fix) { // eslint-disable-line functional/no-conditional-statement\n excluded.push(element); // eslint-disable-line functional/immutable-data\n } else { // eslint-disable-line functional/no-conditional-statement\n res.message.push(`Field $${element.tag} should be excluded`); // eslint-disable-line functional/immutable-data\n }\n }\n });\n\n excluded.forEach(field => record.removeField(field));\n });\n\n // Fix does not send response\n if (!fix) {\n if (res.message.length > 0) { // eslint-disable-line functional/no-conditional-statement\n res.valid = false; // eslint-disable-line functional/immutable-data\n }\n\n return res;\n }\n // Res.fix.push('Field $' + element.tag + ' excluded');\n }\n /// /////////////////////////////////////////\n}\n"],"file":"field-exclusion.js"}
|
|
@@ -310,24 +310,42 @@ describe('field-exclusion', () => {
|
|
|
310
310
|
});
|
|
311
311
|
it('Finds the record valid (spec)', async () => {
|
|
312
312
|
const validator = await (0, _fieldExclusion.default)(config);
|
|
313
|
-
const
|
|
314
|
-
|
|
313
|
+
const {
|
|
314
|
+
valid,
|
|
315
|
+
message
|
|
316
|
+
} = await validator.validate(recordValid);
|
|
317
|
+
expect({
|
|
318
|
+
valid,
|
|
319
|
+
message
|
|
320
|
+
}).to.eql({
|
|
315
321
|
valid: true,
|
|
316
322
|
message: []
|
|
317
323
|
});
|
|
318
324
|
});
|
|
319
325
|
it('Finds the record invalid (spec)', async () => {
|
|
320
326
|
const validator = await (0, _fieldExclusion.default)(config);
|
|
321
|
-
const
|
|
322
|
-
|
|
327
|
+
const {
|
|
328
|
+
valid,
|
|
329
|
+
message
|
|
330
|
+
} = await validator.validate(recordInvalid);
|
|
331
|
+
expect({
|
|
332
|
+
valid,
|
|
333
|
+
message
|
|
334
|
+
}).to.eql({
|
|
323
335
|
valid: false,
|
|
324
336
|
message: ['Field $500 should be excluded']
|
|
325
337
|
});
|
|
326
338
|
});
|
|
327
339
|
it('Finds the record invalid - double', async () => {
|
|
328
340
|
const validator = await (0, _fieldExclusion.default)(config);
|
|
329
|
-
const
|
|
330
|
-
|
|
341
|
+
const {
|
|
342
|
+
valid,
|
|
343
|
+
message
|
|
344
|
+
} = await validator.validate(recordInvalidDouble);
|
|
345
|
+
expect({
|
|
346
|
+
valid,
|
|
347
|
+
message
|
|
348
|
+
}).to.eql({
|
|
331
349
|
valid: false,
|
|
332
350
|
message: ['Field $500 should be excluded', 'Field $500 should be excluded']
|
|
333
351
|
});
|
|
@@ -432,24 +450,180 @@ describe('field-exclusion', () => {
|
|
|
432
450
|
});
|
|
433
451
|
it('Finds the record valid (spec)', async () => {
|
|
434
452
|
const validator = await (0, _fieldExclusion.default)(config);
|
|
435
|
-
const
|
|
436
|
-
|
|
453
|
+
const {
|
|
454
|
+
valid,
|
|
455
|
+
message
|
|
456
|
+
} = await validator.validate(recordValid);
|
|
457
|
+
expect({
|
|
458
|
+
valid,
|
|
459
|
+
message
|
|
460
|
+
}).to.eql({
|
|
437
461
|
valid: true,
|
|
438
462
|
message: []
|
|
439
463
|
});
|
|
440
464
|
});
|
|
441
465
|
it('Finds the record invalid (spec)', async () => {
|
|
442
466
|
const validator = await (0, _fieldExclusion.default)(config);
|
|
443
|
-
const
|
|
444
|
-
|
|
467
|
+
const {
|
|
468
|
+
valid,
|
|
469
|
+
message
|
|
470
|
+
} = await validator.validate(recordInvalid);
|
|
471
|
+
expect({
|
|
472
|
+
valid,
|
|
473
|
+
message
|
|
474
|
+
}).to.eql({
|
|
445
475
|
valid: false,
|
|
446
476
|
message: ['Field $648 should be excluded']
|
|
447
477
|
});
|
|
448
478
|
});
|
|
449
479
|
it('Finds the record invalid - double', async () => {
|
|
450
480
|
const validator = await (0, _fieldExclusion.default)(config);
|
|
451
|
-
const
|
|
452
|
-
|
|
481
|
+
const {
|
|
482
|
+
valid,
|
|
483
|
+
message
|
|
484
|
+
} = await validator.validate(recordInvalidDouble);
|
|
485
|
+
expect({
|
|
486
|
+
valid,
|
|
487
|
+
message
|
|
488
|
+
}).to.eql({
|
|
489
|
+
valid: false,
|
|
490
|
+
message: ['Field $648 should be excluded', 'Field $650 should be excluded']
|
|
491
|
+
});
|
|
492
|
+
});
|
|
493
|
+
it('Repairs invalid record', async () => {
|
|
494
|
+
const validator = await (0, _fieldExclusion.default)(config);
|
|
495
|
+
await validator.fix(recordInvalid);
|
|
496
|
+
expect(recordInvalid.equalsTo(recordInvalidFixed)).to.eql(true);
|
|
497
|
+
});
|
|
498
|
+
it('Repairs invalid record - double', async () => {
|
|
499
|
+
const validator = await (0, _fieldExclusion.default)(config);
|
|
500
|
+
await validator.fix(recordInvalidDouble);
|
|
501
|
+
expect(recordInvalidDouble.equalsTo(recordInvalidFixed)).to.eql(true);
|
|
502
|
+
});
|
|
503
|
+
}); // Simple multi tag configuration
|
|
504
|
+
|
|
505
|
+
describe('#validate: Simple multi tag configuration - No object (spec)', () => {
|
|
506
|
+
const config = [/^(648|650|651|655)$/u]; // eslint-disable-line prefer-named-capture-group
|
|
507
|
+
|
|
508
|
+
const recordValid = new _marcRecord.MarcRecord({
|
|
509
|
+
leader: 'foo',
|
|
510
|
+
fields: [{
|
|
511
|
+
tag: '245',
|
|
512
|
+
ind1: ' ',
|
|
513
|
+
ind2: ' ',
|
|
514
|
+
subfields: [{
|
|
515
|
+
code: 'a',
|
|
516
|
+
value: 'Fubar'
|
|
517
|
+
}]
|
|
518
|
+
}]
|
|
519
|
+
});
|
|
520
|
+
const recordInvalid = new _marcRecord.MarcRecord({
|
|
521
|
+
leader: 'foo',
|
|
522
|
+
fields: [{
|
|
523
|
+
tag: '245',
|
|
524
|
+
ind1: ' ',
|
|
525
|
+
ind2: ' ',
|
|
526
|
+
subfields: [{
|
|
527
|
+
code: 'a',
|
|
528
|
+
value: 'Fubar'
|
|
529
|
+
}]
|
|
530
|
+
}, {
|
|
531
|
+
tag: '648',
|
|
532
|
+
ind1: ' ',
|
|
533
|
+
ind2: ' ',
|
|
534
|
+
subfields: [{
|
|
535
|
+
code: 'a',
|
|
536
|
+
value: 'Foo Bar Foo Bar Foo Bar'
|
|
537
|
+
}, {
|
|
538
|
+
code: '9',
|
|
539
|
+
value: 'ALMA<KEEP>'
|
|
540
|
+
}]
|
|
541
|
+
}]
|
|
542
|
+
});
|
|
543
|
+
const recordInvalidDouble = new _marcRecord.MarcRecord({
|
|
544
|
+
leader: 'foo',
|
|
545
|
+
fields: [{
|
|
546
|
+
tag: '245',
|
|
547
|
+
ind1: ' ',
|
|
548
|
+
ind2: ' ',
|
|
549
|
+
subfields: [{
|
|
550
|
+
code: 'a',
|
|
551
|
+
value: 'Fubar'
|
|
552
|
+
}]
|
|
553
|
+
}, {
|
|
554
|
+
tag: '648',
|
|
555
|
+
ind1: ' ',
|
|
556
|
+
ind2: ' ',
|
|
557
|
+
subfields: [{
|
|
558
|
+
code: 'a',
|
|
559
|
+
value: 'Foo'
|
|
560
|
+
}, {
|
|
561
|
+
code: '9',
|
|
562
|
+
value: 'ALMA<KEEP>'
|
|
563
|
+
}]
|
|
564
|
+
}, {
|
|
565
|
+
tag: '650',
|
|
566
|
+
ind1: ' ',
|
|
567
|
+
ind2: ' ',
|
|
568
|
+
subfields: [{
|
|
569
|
+
code: 'a',
|
|
570
|
+
value: 'Bar'
|
|
571
|
+
}, {
|
|
572
|
+
code: '9',
|
|
573
|
+
value: 'ALMA<KEEP>'
|
|
574
|
+
}]
|
|
575
|
+
}]
|
|
576
|
+
});
|
|
577
|
+
const recordInvalidFixed = new _marcRecord.MarcRecord({
|
|
578
|
+
leader: 'foo',
|
|
579
|
+
fields: [{
|
|
580
|
+
tag: '245',
|
|
581
|
+
ind1: ' ',
|
|
582
|
+
ind2: ' ',
|
|
583
|
+
subfields: [{
|
|
584
|
+
code: 'a',
|
|
585
|
+
value: 'Fubar'
|
|
586
|
+
}]
|
|
587
|
+
}]
|
|
588
|
+
});
|
|
589
|
+
it('Finds the record valid (spec)', async () => {
|
|
590
|
+
const validator = await (0, _fieldExclusion.default)(config);
|
|
591
|
+
const {
|
|
592
|
+
valid,
|
|
593
|
+
message
|
|
594
|
+
} = await validator.validate(recordValid);
|
|
595
|
+
expect({
|
|
596
|
+
valid,
|
|
597
|
+
message
|
|
598
|
+
}).to.eql({
|
|
599
|
+
valid: true,
|
|
600
|
+
message: []
|
|
601
|
+
});
|
|
602
|
+
});
|
|
603
|
+
it('Finds the record invalid (spec)', async () => {
|
|
604
|
+
const validator = await (0, _fieldExclusion.default)(config);
|
|
605
|
+
const {
|
|
606
|
+
valid,
|
|
607
|
+
message
|
|
608
|
+
} = await validator.validate(recordInvalid);
|
|
609
|
+
expect({
|
|
610
|
+
valid,
|
|
611
|
+
message
|
|
612
|
+
}).to.eql({
|
|
613
|
+
valid: false,
|
|
614
|
+
message: ['Field $648 should be excluded']
|
|
615
|
+
});
|
|
616
|
+
});
|
|
617
|
+
it('Finds the record invalid - double', async () => {
|
|
618
|
+
const validator = await (0, _fieldExclusion.default)(config);
|
|
619
|
+
const {
|
|
620
|
+
valid,
|
|
621
|
+
message
|
|
622
|
+
} = await validator.validate(recordInvalidDouble);
|
|
623
|
+
expect({
|
|
624
|
+
valid,
|
|
625
|
+
message
|
|
626
|
+
}).to.eql({
|
|
453
627
|
valid: false,
|
|
454
628
|
message: ['Field $648 should be excluded', 'Field $650 should be excluded']
|
|
455
629
|
});
|
|
@@ -534,16 +708,28 @@ describe('field-exclusion', () => {
|
|
|
534
708
|
});
|
|
535
709
|
it('Finds the record valid (spec)', async () => {
|
|
536
710
|
const validator = await (0, _fieldExclusion.default)(config);
|
|
537
|
-
const
|
|
538
|
-
|
|
711
|
+
const {
|
|
712
|
+
valid,
|
|
713
|
+
message
|
|
714
|
+
} = await validator.validate(recordValid);
|
|
715
|
+
expect({
|
|
716
|
+
valid,
|
|
717
|
+
message
|
|
718
|
+
}).to.eql({
|
|
539
719
|
valid: true,
|
|
540
720
|
message: []
|
|
541
721
|
});
|
|
542
722
|
});
|
|
543
723
|
it('Finds the record invalid (spec)', async () => {
|
|
544
724
|
const validator = await (0, _fieldExclusion.default)(config);
|
|
545
|
-
const
|
|
546
|
-
|
|
725
|
+
const {
|
|
726
|
+
valid,
|
|
727
|
+
message
|
|
728
|
+
} = await validator.validate(recordInvalid);
|
|
729
|
+
expect({
|
|
730
|
+
valid,
|
|
731
|
+
message
|
|
732
|
+
}).to.eql({
|
|
547
733
|
valid: false,
|
|
548
734
|
message: ['Field $500 should be excluded']
|
|
549
735
|
});
|
|
@@ -677,24 +863,42 @@ describe('field-exclusion', () => {
|
|
|
677
863
|
});
|
|
678
864
|
it('Finds the record valid (spec)', async () => {
|
|
679
865
|
const validator = await (0, _fieldExclusion.default)(config);
|
|
680
|
-
const
|
|
681
|
-
|
|
866
|
+
const {
|
|
867
|
+
valid,
|
|
868
|
+
message
|
|
869
|
+
} = await validator.validate(recordValid);
|
|
870
|
+
expect({
|
|
871
|
+
valid,
|
|
872
|
+
message
|
|
873
|
+
}).to.eql({
|
|
682
874
|
valid: true,
|
|
683
875
|
message: []
|
|
684
876
|
});
|
|
685
877
|
});
|
|
686
878
|
it('Finds the record invalid (spec)', async () => {
|
|
687
879
|
const validator = await (0, _fieldExclusion.default)(config);
|
|
688
|
-
const
|
|
689
|
-
|
|
880
|
+
const {
|
|
881
|
+
valid,
|
|
882
|
+
message
|
|
883
|
+
} = await validator.validate(recordInvalid);
|
|
884
|
+
expect({
|
|
885
|
+
valid,
|
|
886
|
+
message
|
|
887
|
+
}).to.eql({
|
|
690
888
|
valid: false,
|
|
691
889
|
message: ['Field $650 should be excluded']
|
|
692
890
|
});
|
|
693
891
|
});
|
|
694
892
|
it('Finds the record invalid (spec)', async () => {
|
|
695
893
|
const validator = await (0, _fieldExclusion.default)(config);
|
|
696
|
-
const
|
|
697
|
-
|
|
894
|
+
const {
|
|
895
|
+
valid,
|
|
896
|
+
message
|
|
897
|
+
} = await validator.validate(recordInvalidMulti);
|
|
898
|
+
expect({
|
|
899
|
+
valid,
|
|
900
|
+
message
|
|
901
|
+
}).to.eql({
|
|
698
902
|
valid: false,
|
|
699
903
|
message: ['Field $648 should be excluded', 'Field $650 should be excluded', 'Field $650 should be excluded', 'Field $651 should be excluded', 'Field $655 should be excluded']
|
|
700
904
|
});
|
|
@@ -788,32 +992,56 @@ describe('field-exclusion', () => {
|
|
|
788
992
|
});
|
|
789
993
|
it('Finds the record valid - Ind1&Ind2', async () => {
|
|
790
994
|
const validator = await (0, _fieldExclusion.default)(configInd);
|
|
791
|
-
const
|
|
792
|
-
|
|
995
|
+
const {
|
|
996
|
+
valid,
|
|
997
|
+
message
|
|
998
|
+
} = await validator.validate(recordValid);
|
|
999
|
+
expect({
|
|
1000
|
+
valid,
|
|
1001
|
+
message
|
|
1002
|
+
}).to.eql({
|
|
793
1003
|
valid: true,
|
|
794
1004
|
message: []
|
|
795
1005
|
});
|
|
796
1006
|
});
|
|
797
1007
|
it('Finds the record valid - Value', async () => {
|
|
798
1008
|
const validator = await (0, _fieldExclusion.default)(configValue);
|
|
799
|
-
const
|
|
800
|
-
|
|
1009
|
+
const {
|
|
1010
|
+
valid,
|
|
1011
|
+
message
|
|
1012
|
+
} = await validator.validate(recordValid);
|
|
1013
|
+
expect({
|
|
1014
|
+
valid,
|
|
1015
|
+
message
|
|
1016
|
+
}).to.eql({
|
|
801
1017
|
valid: true,
|
|
802
1018
|
message: []
|
|
803
1019
|
});
|
|
804
1020
|
});
|
|
805
1021
|
it('Finds the record invalid - Ind', async () => {
|
|
806
1022
|
const validator = await (0, _fieldExclusion.default)(configInd);
|
|
807
|
-
const
|
|
808
|
-
|
|
1023
|
+
const {
|
|
1024
|
+
valid,
|
|
1025
|
+
message
|
|
1026
|
+
} = await validator.validate(recordIndInvalid);
|
|
1027
|
+
expect({
|
|
1028
|
+
valid,
|
|
1029
|
+
message
|
|
1030
|
+
}).to.eql({
|
|
809
1031
|
valid: false,
|
|
810
1032
|
message: ['Field $500 should be excluded']
|
|
811
1033
|
});
|
|
812
1034
|
});
|
|
813
1035
|
it('Finds the record invalid - Value', async () => {
|
|
814
1036
|
const validator = await (0, _fieldExclusion.default)(configValue);
|
|
815
|
-
const
|
|
816
|
-
|
|
1037
|
+
const {
|
|
1038
|
+
valid,
|
|
1039
|
+
message
|
|
1040
|
+
} = await validator.validate(recordValueInvalid);
|
|
1041
|
+
expect({
|
|
1042
|
+
valid,
|
|
1043
|
+
message
|
|
1044
|
+
}).to.eql({
|
|
817
1045
|
valid: false,
|
|
818
1046
|
message: ['Field $500 should be excluded']
|
|
819
1047
|
});
|
|
@@ -850,8 +1078,14 @@ describe('field-exclusion', () => {
|
|
|
850
1078
|
}]
|
|
851
1079
|
});
|
|
852
1080
|
const validator = await (0, _fieldExclusion.default)(config);
|
|
853
|
-
const
|
|
854
|
-
|
|
1081
|
+
const {
|
|
1082
|
+
valid,
|
|
1083
|
+
message
|
|
1084
|
+
} = await validator.validate(record);
|
|
1085
|
+
expect({
|
|
1086
|
+
valid,
|
|
1087
|
+
message
|
|
1088
|
+
}).to.eql({
|
|
855
1089
|
valid: false,
|
|
856
1090
|
message: ['Field $041 should be excluded']
|
|
857
1091
|
});
|