'use strict'; /* globals generateInputCompilerHelper: false, defaultModelOptions: false */ describe('ngModelOptions', function() { describe('defaultModelOptions', function() { it('should provide default values', function() { expect(defaultModelOptions.getOption('updateOn')).toEqual(''); expect(defaultModelOptions.getOption('updateOnDefault')).toEqual(true); expect(defaultModelOptions.getOption('debounce')).toBe(0); expect(defaultModelOptions.getOption('getterSetter')).toBe(false); expect(defaultModelOptions.getOption('allowInvalid')).toBe(false); expect(defaultModelOptions.getOption('timezone')).toBe(null); }); }); describe('directive', function() { describe('basic usage', function() { var helper = {}, $rootScope, $compile, $timeout, $q; generateInputCompilerHelper(helper); beforeEach(inject(function(_$compile_, _$rootScope_, _$timeout_, _$q_) { $compile = _$compile_; $rootScope = _$rootScope_; $timeout = _$timeout_; $q = _$q_; })); describe('should fall back to `defaultModelOptions`', function() { it('if there is no `ngModelOptions` directive', function() { var inputElm = helper.compileInput( ''); var inputOptions = $rootScope.form.alias.$options; expect(inputOptions.getOption('updateOn')).toEqual(defaultModelOptions.getOption('updateOn')); expect(inputOptions.getOption('updateOnDefault')).toEqual(defaultModelOptions.getOption('updateOnDefault')); expect(inputOptions.getOption('debounce')).toEqual(defaultModelOptions.getOption('debounce')); expect(inputOptions.getOption('getterSetter')).toEqual(defaultModelOptions.getOption('getterSetter')); expect(inputOptions.getOption('allowInvalid')).toEqual(defaultModelOptions.getOption('allowInvalid')); expect(inputOptions.getOption('timezone')).toEqual(defaultModelOptions.getOption('timezone')); }); it('if `ngModelOptions` on the same element does not specify the option', function() { var inputElm = helper.compileInput( ''); var inputOptions = $rootScope.form.alias.$options; expect(inputOptions.getOption('debounce')).toEqual(defaultModelOptions.getOption('debounce')); expect(inputOptions.getOption('updateOnDefault')).toBe(false); expect(inputOptions.getOption('updateOnDefault')).not.toEqual(defaultModelOptions.getOption('updateOnDefault')); }); it('if the first `ngModelOptions` ancestor does not specify the option', function() { var form = $compile('
' + '' + '
')($rootScope); var inputOptions = $rootScope.form.alias.$options; expect(inputOptions.getOption('debounce')).toEqual(defaultModelOptions.getOption('debounce')); expect(inputOptions.getOption('updateOnDefault')).toBe(false); expect(inputOptions.getOption('updateOnDefault')).not.toEqual(defaultModelOptions.getOption('updateOnDefault')); dealoc(form); }); }); describe('sharing and inheritance', function() { it('should not inherit options from ancestor `ngModelOptions` directives by default', function() { var container = $compile( '
' + '
' + '' + '
' + '
')($rootScope); var form = container.find('form'); var input = container.find('input'); var containerOptions = container.controller('ngModelOptions').$options; var formOptions = form.controller('ngModelOptions').$options; var inputOptions = input.controller('ngModelOptions').$options; expect(containerOptions.getOption('allowInvalid')).toEqual(true); expect(formOptions.getOption('allowInvalid')).toEqual(false); expect(inputOptions.getOption('allowInvalid')).toEqual(false); expect(containerOptions.getOption('updateOn')).toEqual(''); expect(containerOptions.getOption('updateOnDefault')).toEqual(true); expect(formOptions.getOption('updateOn')).toEqual('blur'); expect(formOptions.getOption('updateOnDefault')).toEqual(false); expect(inputOptions.getOption('updateOn')).toEqual(''); expect(inputOptions.getOption('updateOnDefault')).toEqual(true); dealoc(container); }); it('should inherit options that are marked with "$inherit" from the nearest ancestor `ngModelOptions` directive', function() { var container = $compile( '
' + '
' + '' + '
' + '
')($rootScope); var form = container.find('form'); var input = container.find('input'); var containerOptions = container.controller('ngModelOptions').$options; var formOptions = form.controller('ngModelOptions').$options; var inputOptions = input.controller('ngModelOptions').$options; expect(containerOptions.getOption('allowInvalid')).toEqual(true); expect(formOptions.getOption('allowInvalid')).toEqual(true); expect(inputOptions.getOption('allowInvalid')).toEqual(false); expect(containerOptions.getOption('updateOn')).toEqual(''); expect(containerOptions.getOption('updateOnDefault')).toEqual(true); expect(formOptions.getOption('updateOn')).toEqual('blur'); expect(formOptions.getOption('updateOnDefault')).toEqual(false); expect(inputOptions.getOption('updateOn')).toEqual(''); expect(inputOptions.getOption('updateOnDefault')).toEqual(true); dealoc(container); }); it('should inherit all unspecified options if the options object contains a `"*"` property with value "$inherit"', function() { var container = $compile( '
' + '
' + '' + '
' + '
')($rootScope); var form = container.find('form'); var input = container.find('input'); var containerOptions = container.controller('ngModelOptions').$options; var formOptions = form.controller('ngModelOptions').$options; var inputOptions = input.controller('ngModelOptions').$options; expect(containerOptions.getOption('allowInvalid')).toEqual(true); expect(formOptions.getOption('allowInvalid')).toEqual(true); expect(inputOptions.getOption('allowInvalid')).toEqual(false); expect(containerOptions.getOption('debounce')).toEqual(100); expect(formOptions.getOption('debounce')).toEqual(100); expect(inputOptions.getOption('debounce')).toEqual(0); expect(containerOptions.getOption('updateOn')).toEqual('keyup'); expect(containerOptions.getOption('updateOnDefault')).toEqual(false); expect(formOptions.getOption('updateOn')).toEqual('blur'); expect(formOptions.getOption('updateOnDefault')).toEqual(false); expect(inputOptions.getOption('updateOn')).toEqual(''); expect(inputOptions.getOption('updateOnDefault')).toEqual(true); dealoc(container); }); it('should correctly inherit default and another specified event for `updateOn`', function() { var container = $compile( '
' + '' + '
')($rootScope); var input = container.find('input'); var inputOptions = input.controller('ngModelOptions').$options; expect(inputOptions.getOption('updateOn')).toEqual('blur'); expect(inputOptions.getOption('updateOnDefault')).toEqual(true); dealoc(container); }); it('should `updateOnDefault` as well if we have `updateOn: "$inherit"`', function() { var container = $compile( '
' + '' + '
' + '' + '
' + '
')($rootScope); var input1 = container.find('input').eq(0); var inputOptions1 = input1.controller('ngModelOptions').$options; expect(inputOptions1.getOption('updateOn')).toEqual('keyup'); expect(inputOptions1.getOption('updateOnDefault')).toEqual(false); var input2 = container.find('input').eq(1); var inputOptions2 = input2.controller('ngModelOptions').$options; expect(inputOptions2.getOption('updateOn')).toEqual('blur'); expect(inputOptions2.getOption('updateOnDefault')).toEqual(true); dealoc(container); }); it('should make a copy of the options object', function() { $rootScope.options = {updateOn: 'default'}; var inputElm = helper.compileInput( ''); expect($rootScope.options).toEqual({updateOn: 'default'}); expect($rootScope.form.alias.$options).not.toBe($rootScope.options); }); it('should be retrieved from an ancestor element containing an `ngModelOptions` directive', function() { var doc = $compile( '
' + '' + '
')($rootScope); $rootScope.$digest(); var inputElm = doc.find('input'); helper.changeGivenInputTo(inputElm, 'a'); expect($rootScope.name).toEqual(undefined); browserTrigger(inputElm, 'blur'); expect($rootScope.name).toBeUndefined(); $timeout.flush(2000); expect($rootScope.name).toBeUndefined(); $timeout.flush(9000); expect($rootScope.name).toEqual('a'); dealoc(doc); }); it('should allow sharing options between multiple inputs', function() { $rootScope.options = {updateOn: 'default'}; var inputElm = helper.compileInput( '' + ''); helper.changeGivenInputTo(inputElm.eq(0), 'a'); helper.changeGivenInputTo(inputElm.eq(1), 'b'); expect($rootScope.name1).toEqual('a'); expect($rootScope.name2).toEqual('b'); }); }); describe('updateOn', function() { it('should allow overriding the model update trigger event on text inputs', function() { var inputElm = helper.compileInput( ''); helper.changeInputValueTo('a'); expect($rootScope.name).toBeUndefined(); browserTrigger(inputElm, 'blur'); expect($rootScope.name).toEqual('a'); }); it('should not dirty the input if nothing was changed before updateOn trigger', function() { var inputElm = helper.compileInput( ''); browserTrigger(inputElm, 'blur'); expect($rootScope.form.alias.$pristine).toBeTruthy(); }); it('should allow overriding the model update trigger event on text areas', function() { var inputElm = helper.compileInput( '