src/phone-number.spec.js
var TestUtil = {
compile: function(html, initialScope) {
var container;
inject(function($compile, $rootScope) {
if (angular.isDefined(initialScope)) {
angular.extend($rootScope, initialScope);
}
container = $compile(html)($rootScope);
$rootScope.$apply();
});
return container;
}
};
describe('phonenumber', function() {
beforeEach(module('cwill747.phonenumber'));
it('should register a $parser and a $formatter', function() {
var input = TestUtil.compile('<input ng-model="model">');
var model = input.controller('ngModel');
var maskedInput = TestUtil.compile('<input type="text" ng-model="maskedModel" phone-number country-code="us">');
var maskedModel = maskedInput.controller('ngModel');
expect(maskedModel.$parsers.length).toBe(model.$parsers.length + 2);
expect(maskedModel.$formatters.length).toBe(model.$formatters.length + 2);
});
it('should format initial model values', function() {
var input = TestUtil.compile('<input type="text" ng-model="model" phone-number ' +
'country-code="us">', {
model: '3011201034'
});
var model = input.controller('ngModel');
expect(model.$viewValue).toBe('(301) 120-1034');
});
it('should fail silently with a non-valid country code', function() {
var input = TestUtil.compile('<input type="text" ng-model="model" phone-number ' +
'country-code="xx">', {
model: '3011201034'
});
var model = input.controller('ngModel');
expect(model.$valid).toBeFalsy();
});
it('should format the number as it is typed', function() {
var input = TestUtil.compile('<input type="text" ng-model="model" phone-number ' +
'country-code="us">');
var model = input.controller('ngModel');
var tests = [
{key: '1', viewValue: '1', modelValue: '1'},
{key: '2', viewValue: '12', modelValue: '12'},
{key: '3', viewValue: '1 23', modelValue: '123'},
{key: '4', viewValue: '1 234', modelValue: '1234'},
{key: '5', viewValue: '1 234-5', modelValue: '12345'},
{key: '6', viewValue: '1 234-56', modelValue: '123456'},
{key: '7', viewValue: '1 234-567', modelValue: '1234567'},
{key: '8', viewValue: '1 234-567-8', modelValue: '12345678'},
{key: '9', viewValue: '1 234-567-89', modelValue: '123456789'},
{key: '0', viewValue: '1 234-567-890', modelValue: '1234567890'},
{key: '1', viewValue: '1 234-567-8901', modelValue: '12345678901'}
];
for (var i = 0; i < tests.length - 1; i++) {
input.val(tests[i].modelValue).triggerHandler('input');
expect(model.$viewValue).toBe(tests[i].viewValue);
expect(model.$modelValue).toBe(tests[i].modelValue);
expect(model.$valid).toBeFalsy();
}
input.val(tests[tests.length - 1].modelValue).triggerHandler('input');
expect(model.$viewValue).toBe(tests[tests.length - 1].viewValue);
expect(model.$modelValue).toBe(tests[tests.length - 1].modelValue);
expect(model.$valid).toBeTruthy();
});
it('should ignore non digits', function() {
var input = TestUtil.compile('<input type="text" ng-model="model" phone-number ' +
'country-code="us">');
var model = input.controller('ngModel');
var tests = [
{value: '@', viewValue: '', modelValue: ''},
{value: '2-', viewValue: '2', modelValue: '2'},
{value: '23a', viewValue: '23', modelValue: '23'},
{value: '23_34', viewValue: '233-4', modelValue: '2334'},
{value: '23346!', viewValue: '233-46', modelValue: '23346'},
{value: '23346!32400', viewValue: '(233) 463-2400', modelValue: '2334632400'}
];
tests.forEach(function(test) {
input.val(test.value).triggerHandler('input');
expect(model.$viewValue).toBe(test.viewValue);
expect(model.$modelValue).toBe(test.modelValue);
});
});
it('should strip out any garbage characters from the model and the view', function() {
var input = TestUtil.compile('<input type="text" ng-model="model" phone-number ' +
'country-code="us">');
var model = input.controller('ngModel');
input.val('-----()----9sDF_').triggerHandler('input');
expect(model.$viewValue).toBe('9');
expect(model.$modelValue).toBe('9');
});
});
describe('mock libphonenumber', function() {
var $log;
var $window;
beforeEach(module('cwill747.phonenumber'));
beforeEach(inject(function(_$log_, _$window_) {
$log = _$log_;
$window = _$window_;
$window.phoneUtils = {
formatAsTyped: function() {
throw 'ERROR';
}
};
}));
it('should error if libphonenumber throws', function() {
TestUtil.compile('<input type="text" ng-model="model" phone-number ' +
'country-code="us">', {
model: '3011201034'
});
expect($log.debug.logs[1][0]).toEqual('ERROR');
});
});