@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 CHANGED
@@ -11,29 +11,29 @@ trigger:
11
11
  steps:
12
12
 
13
13
  - name: audit
14
- image: node:12
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:12
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:12
26
+ image: node:14
27
27
  commands:
28
28
  - npm test
29
29
 
30
30
  - name: check-coverage
31
- image: node:12
31
+ image: node:14
32
32
  commands:
33
33
  - npm run coverage
34
34
 
35
35
  - name: build
36
- image: node:12
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: 0339c92abcdf85cbe1e7a4e072804b64610cdff1fefa8b7dc462d7b7646f9b28
90
+ hmac: 976ccc627b05500d5bcf91a1ccdc5c2b0cdfdd18e151220f1a7ca985542cb2d0
91
91
 
92
92
  ...
@@ -79,7 +79,8 @@ function forEach(obj, fun) {
79
79
  }
80
80
 
81
81
  function isRegExp(re) {
82
- return re instanceof RegExp;
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
- configValid(config.map(e => isRegExp(e) ? {
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, config, false),
97
- fix: record => excludeFields(record, config, true)
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 result = await validator.validate(recordValid);
314
- expect(result).to.eql({
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 result = await validator.validate(recordInvalid);
322
- expect(result).to.eql({
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 result = await validator.validate(recordInvalidDouble);
330
- expect(result).to.eql({
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 result = await validator.validate(recordValid);
436
- expect(result).to.eql({
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 result = await validator.validate(recordInvalid);
444
- expect(result).to.eql({
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 result = await validator.validate(recordInvalidDouble);
452
- expect(result).to.eql({
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 result = await validator.validate(recordValid);
538
- expect(result).to.eql({
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 result = await validator.validate(recordInvalid);
546
- expect(result).to.eql({
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 result = await validator.validate(recordValid);
681
- expect(result).to.eql({
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 result = await validator.validate(recordInvalid);
689
- expect(result).to.eql({
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 result = await validator.validate(recordInvalidMulti);
697
- expect(result).to.eql({
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 result = await validator.validate(recordValid);
792
- expect(result).to.eql({
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 result = await validator.validate(recordValid);
800
- expect(result).to.eql({
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 result = await validator.validate(recordIndInvalid);
808
- expect(result).to.eql({
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 result = await validator.validate(recordValueInvalid);
816
- expect(result).to.eql({
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 result = await validator.validate(record);
854
- expect(result).to.eql({
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
  });