UNPKG

@fcgs/filerr-nach

Version:

nACH is a highly customizable Node.js module exposing a high & low-level API for generating ACH files for use within the ACH network

225 lines (194 loc) 8.96 kB
var chai = require('chai') , _ = require('lodash') , expect = chai.expect , validate = require('../lib/validate'); describe('Validate', function() { describe('Required Fields', function() { it('must have contents or an error is thrown', function() { var testObjectOne = { fieldOne: { name: 'fieldOne', width: 6, position: 9, required: true, type: 'alphanumeric', value: '' } }; // The function should throw an error since the field is required but the value is '' (empty string) expect(function() { validate.validateRequiredFields(testObjectOne) }).to.throw('fieldOne is a required field but its value is: '); // Change the value to a valid alphanumeric string testObjectOne.fieldOne.value = 'some value'; // Make sure the function doesn't throw an error. expect(function() { validate.validateRequiredFields(testObjectOne) }).not.to.throw('fieldOne is a required field but its value is: '); }); }); describe('Optional Fields', function() { it('can be left blank without throwing an error', function() { var testObjectOne = { fieldOne: { name: 'fieldOne', width: 6, position: 9, required: false, type: 'alphanumeric', value: '' } }; // The expect should not throw an error since the field is not required so an empty string is okay. expect(function() { validate.validateRequiredFields(testObjectOne) }).not.to.throw('fieldOne is a required field but its value is: '); }); }); describe('Lengths', function() { it('must not exceed their width (length) property', function() { var testObjectOne = { fieldOne: { name: 'fieldOne', width: 6, position: 9, required: false, type: 'alphanumeric', value: '1234567' } }; // The function should throw an error since the field's value exceeds its width. expect(function() { validate.validateLengths(testObjectOne) }).to.throw('fieldOne\'s length is 7, but it should be no greater than 6.'); // Change the field's value to a string within the field's maximum width. testObjectOne.fieldOne.value = 'isokay'; // Now that the value is within the field's limit, it shouldn't throw an error. expect(function() { validate.validateLengths(testObjectOne) }).not.to.throw('fieldOne\'s length is 7, but it should be no greater than 6.'); }); }); describe('Data Types (alpha)', function() { it('must correspond to the alpha data type', function() { var testObjectOne = { fieldOne: { name: 'fieldOne', width: 10, position: 9, required: false, type: 'alpha', value: '#199#' } }; // The function should throw an error since the field's data type doesn't match its contents. expect(function() { validate.validateDataTypes(testObjectOne) }).to.throw('fieldOne\'s data type is required to be alpha, but its contents don\'t reflect that.'); // Change the field's value to a string which corresponds to its data type testObjectOne.fieldOne.value = 'validvalue'; // Now that the value corresponds to its data type, it shouldn't throw an error. expect(function() { validate.validateDataTypes(testObjectOne) }).not.to.throw('fieldOne\'s data type is required to be alpha, but its contents don\'t reflect that.'); }); }); describe('Data Types (alphanumeric)', function() { it('must correspond to the alphanumeric data type', function() { var testObjectOne = { fieldOne: { name: 'fieldOne', width: 20, position: 9, required: false, type: 'alphanumeric', value: 'badData©' } }; // The function should throw an error since the field's data type doesn't match its contents. expect(function() { validate.validateDataTypes(testObjectOne) }).to.throw('fieldOne\'s data type is required to be alphanumeric, but its contents don\'t reflect that.'); // Change the field's value to a string which corresponds to its data type testObjectOne.fieldOne.value = '@val1dval!'; // Now that the value corresponds to its data type, it shouldn't throw an error. expect(function() { validate.validateDataTypes(testObjectOne) }).not.to.throw('fieldOne\'s data type is required to be alphanumeric, but its contents don\'t reflect that.'); }); }); describe('Data Types (numeric)', function() { it('must correspond to the numeric data type', function() { var testObjectOne = { fieldOne: { name: 'fieldOne', width: 15, position: 9, required: false, type: 'numeric', value: 'bad!Da$ta#' } }; // The function should throw an error since the field's data type doesn't match its contents. expect(function() { validate.validateDataTypes(testObjectOne) }).to.throw('fieldOne\'s data type is required to be numeric, but its contents don\'t reflect that.'); // Change the field's value to a string which corresponds to its data type testObjectOne.fieldOne.value = '98712043'; // Now that the value corresponds to its data type, it shouldn't throw an error. expect(function() { validate.validateDataTypes(testObjectOne) }).not.to.throw('fieldOne\'s data type is required to be numeric, but its contents don\'t reflect that.'); }); }); describe('Transaction Codes', function() { it('must be valid ACH codes', function() { var validTransactionCodes = ['22', '23', '24', '27', '28', '29', '32', '33', '34', '37', '38', '39'] , invalidTransactionCodes = ['21', '25', '26', '15', '82', '30', '31', '35', '36', '73', '18', '40']; // The function should not throw an error since all codes in the `validTransactionCodes` array are valid ACH transaction codes. _.forEach(validTransactionCodes, function(code) { expect(function() { validate.validateACHCode(code) }).not.to.throw('The ACH transaction code ' + code + ' is invalid. Please pass a valid 2-digit transaction code.'); }); // Now we should expect errors since we're passing an array of invalid transaction codes. _.forEach(invalidTransactionCodes, function(code) { expect(function() { validate.validateACHCode(code) }).to.throw('The ACH transaction code ' + code + ' is invalid. Please pass a valid 2-digit transaction code.'); }); }); }); describe('Service Class Codes', function() { it('must be valid ACH codes', function() { var validServiceClassCodes = ['200', '220', '225'] , invalidServiceClassCodes = ['201', '222', '219']; // The function should not throw an error since all codes in the `validServiceClassCodes` array are valid ACH service class codes. _.forEach(validServiceClassCodes, function(code) { expect(function() { validate.validateACHServiceClassCode(code) }).not.to.throw('The ACH service class code ' + code + ' is invalid. Please pass a valid 3-digit service class code.'); }); // Now we should expect errors since we're passing an array of invalid serivce class codes. _.forEach(invalidServiceClassCodes, function(code) { expect(function() { validate.validateACHServiceClassCode(code) }).to.throw('The ACH service class code ' + code + ' is invalid. Please pass a valid 3-digit service class code.'); }); }); }); describe('Routing Numbers (ABA Numbers)', function() { it('must be valid 9-digit routing numbers', function() { var validRoutingNumber = '281074114' , invalidRoutingNumber = '281074119'; // The function should not throw an error since this is a valid routing number. expect(function() { validate.validateRoutingNumber(validRoutingNumber) }).not.to.throw('The ABA routing number ' + validRoutingNumber + ' is invalid. Please ensure a valid 9-digit ABA routing number is passed.'); // The function should throw an error since this is not a valid routing number. expect(function() { validate.validateRoutingNumber(invalidRoutingNumber) }).to.throw('The ABA routing number ' + invalidRoutingNumber + ' is invalid. Please ensure a valid 9-digit ABA routing number is passed.'); }); }); });