summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJustin Worthe <justin.worthe@gmail.com>2015-12-13 22:09:06 +0200
committerJustin Worthe <justin.worthe@gmail.com>2015-12-13 22:09:06 +0200
commit3651725bb4d159f37ab891497094809471da4a06 (patch)
treea27845326d8e4cdc3a255305698ab42fb061d081
parentf40fb252a30d78740e5fbdb246e05cd8ff4f888b (diff)
Added tests for ID validator
-rw-r--r--.gitignore1
-rw-r--r--index.js12
-rw-r--r--package.json8
-rw-r--r--test/test.js60
4 files changed, 73 insertions, 8 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..3c3629e
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+node_modules
diff --git a/index.js b/index.js
index be7bf61..b05f2e1 100644
--- a/index.js
+++ b/index.js
@@ -50,7 +50,7 @@ function datePartValidate(idNumber) {
}
function controlDigitValidate(idNumber) {
- var checkDigit = parseInt(idNumber[idNumber.length - 1], 10);
+ var checkDigit = parseInt(idNumber[12], 10);
var oddDigitsSum = 0;
@@ -86,15 +86,15 @@ function parseDateOfBirth(idNumber) {
//get year, and assume century
var currentYear = new Date().getFullYear();
var currentCentury = Math.floor(currentYear/100)*100;
- var yearPart = currentCentury + Number(idNumber.substring(0,2));
+ var yearPart = currentCentury + parseInt(idNumber.substring(0,2), 10);
if (yearPart > currentYear) {
yearPart -= 100; //must be last century
}
//In Javascript, Jan=0. In ID Numbers, Jan=1.
- var monthPart = Number(idNumber.substring(2,4))-1;
+ var monthPart = parseInt(idNumber.substring(2,4), 10)-1;
- var dayPart = Number(idNumber.substring(4,6));
+ var dayPart = parseInt(idNumber.substring(4,6), 10);
var dateOfBirth = new Date(yearPart, monthPart, dayPart);
@@ -114,12 +114,12 @@ function parseIsFemale(idNumber) {
if (!regexpValidate(idNumber)) {
return undefined;
}
- return Number(idNumber[6]) <= 4;
+ return parseInt(idNumber[6], 10) <= 4;
}
function parseIsSouthAfricanCitizen(idNumber) {
if (!regexpValidate(idNumber)) {
return undefined;
}
- return Number(idNumber[6]) === 0;
+ return parseInt(idNumber[10], 10) === 0;
}
diff --git a/package.json b/package.json
index 35fea77..5517a4f 100644
--- a/package.json
+++ b/package.json
@@ -4,7 +4,7 @@
"description": "A library for parsing and validating South African ID Numbers. In South Africa, all residents are assigned an ID Number. From this number, you can derive some information, like ther person's date of birth and their sex. The number also includes a check digit, that you can use to check that it has been captured correctly.",
"main": "index.js",
"scripts": {
- "test": "echo \"Error: no test specified\" && exit 1"
+ "test": "mocha"
},
"keywords": [
"South",
@@ -13,5 +13,9 @@
"Number"
],
"author": "Justin Worthe <justin.worthe@gmail.com>",
- "license": "ISC"
+ "license": "ISC",
+ "dependencies": {
+ "chai": "^3.4.1",
+ "mocha": "^2.3.4"
+ }
}
diff --git a/test/test.js b/test/test.js
new file mode 100644
index 0000000..b4b481d
--- /dev/null
+++ b/test/test.js
@@ -0,0 +1,60 @@
+var expect = require('chai').expect;
+var saIdParser = require('../index.js');
+
+describe('South African ID Number Parsing', function() {
+ var validIdNumbers = [{
+ idNumber: '9001049818080',
+ dateOfBirth: new Date(1990, 0, 4),
+ isMale: true,
+ isFemale: false,
+ isSouthAfricanCitizen: true
+ }, {
+ idNumber: '1012311412187',
+ dateOfBirth: new Date(2010, 11, 31),
+ isMale: false,
+ isFemale: true,
+ isSouthAfricanCitizen: false
+ }];
+ var invalidIdNumbers = [{
+ idNumber: '9001049881080' //invalid check digit
+ }, {
+ idNumber: '9002302419087' //invalid date
+ }, {
+ idNumber: '9001049881a83' //has a character in there
+ }, {
+ idNumber: '90010498813' //wrong length
+ }];
+
+ it('should correctly validate valid ID numbers', function() {
+ validIdNumbers.forEach(function(validIdNumber) {
+ expect(saIdParser.validate(validIdNumber.idNumber)).to.equal(true);
+ });
+ });
+ it('should correctly validate invalid ID numbers', function() {
+ invalidIdNumbers.forEach(function(invalidIdNumber) {
+ expect(saIdParser.validate(invalidIdNumber.idNumber)).to.equal(false);
+ });
+ });
+
+ it('should parse valid date of birth correctly', function() {
+ validIdNumbers.forEach(function(validIdNumber) {
+ var parsedDate = saIdParser.parseDateOfBirth(validIdNumber.idNumber);
+ var expectedDate = validIdNumber.dateOfBirth;
+ expect(parsedDate.getTime()).to.equal(expectedDate.getTime());
+ });
+ });
+ it ('should parse valid gender correctly', function() {
+ validIdNumbers.forEach(function(validIdNumber) {
+ expect(saIdParser.parseIsMale(validIdNumber.idNumber))
+ .to.equal(validIdNumber.isMale);
+ expect(saIdParser.parseIsFemale(validIdNumber.idNumber))
+ .to.equal(validIdNumber.isFemale);
+ });
+ });
+ it ('should parse valid citizenship correctly', function() {
+ validIdNumbers.forEach(function(validIdNumber) {
+ expect(saIdParser.parseIsSouthAfricanCitizen(validIdNumber.idNumber))
+ .to.equal(validIdNumber.isSouthAfricanCitizen);
+ });
+ });
+});