angular.js/test/service/formFactorySpec.js
Misko Hevery 48697a2b86 refactor(injector): turn scope into a service
- turn scope into a $rootScope service.
- injector is now a starting point for creating angular application.
- added inject() method which wraps jasmine its/beforeEach/afterEach,
  and which allows configuration and injection of services.
- refactor tests to use inject() where possible

BREAK:
- removed angular.scope() method
2011-11-14 16:39:31 -08:00

210 lines
6 KiB
JavaScript

'use strict';
describe('$formFactory', function() {
it('should have global form', inject(function($rootScope, $formFactory) {
expect($formFactory.rootForm).toBeTruthy();
expect($formFactory.rootForm.$createWidget).toBeTruthy();
}));
describe('new form', function() {
var form;
var scope;
var log;
function WidgetCtrl($formFactory){
this.$formFactory = $formFactory;
log += '<init>';
this.$render = function() {
log += '$render();';
};
this.$on('$validate', function(e){
log += '$validate();';
});
}
WidgetCtrl.$inject = ['$formFactory'];
WidgetCtrl.prototype = {
getFormFactory: function() {
return this.$formFactory;
}
};
beforeEach(inject(function($rootScope, $formFactory) {
log = '';
scope = $rootScope.$new();
form = $formFactory(scope);
}));
describe('$createWidget', function() {
var widget;
beforeEach(function() {
widget = form.$createWidget({
scope:scope,
model:'text',
alias:'text',
controller:WidgetCtrl
});
});
describe('data flow', function() {
it('should have status properties', inject(function($rootScope, $formFactory) {
expect(widget.$error).toEqual({});
expect(widget.$valid).toBe(true);
expect(widget.$invalid).toBe(false);
}));
it('should update view when model changes', inject(function($rootScope, $formFactory) {
scope.text = 'abc';
scope.$digest();
expect(log).toEqual('<init>$validate();$render();');
expect(widget.$modelValue).toEqual('abc');
scope.text = 'xyz';
scope.$digest();
expect(widget.$modelValue).toEqual('xyz');
}));
it('should have controller prototype methods', inject(function($rootScope, $formFactory) {
expect(widget.getFormFactory()).toEqual($formFactory);
}));
});
describe('validation', function() {
it('should update state on error', inject(function($rootScope, $formFactory) {
widget.$emit('$invalid', 'E');
expect(widget.$valid).toEqual(false);
expect(widget.$invalid).toEqual(true);
widget.$emit('$valid', 'E');
expect(widget.$valid).toEqual(true);
expect(widget.$invalid).toEqual(false);
}));
it('should have called the model setter before the validation', inject(function($rootScope, $formFactory) {
var modelValue;
widget.$on('$validate', function() {
modelValue = scope.text;
});
widget.$emit('$viewChange', 'abc');
expect(modelValue).toEqual('abc');
}));
describe('form', function() {
it('should invalidate form when widget is invalid', inject(function($rootScope, $formFactory) {
expect(form.$error).toEqual({});
expect(form.$valid).toEqual(true);
expect(form.$invalid).toEqual(false);
widget.$emit('$invalid', 'REASON');
expect(form.$error.REASON).toEqual([widget]);
expect(form.$valid).toEqual(false);
expect(form.$invalid).toEqual(true);
var widget2 = form.$createWidget({
scope:scope, model:'text',
alias:'text',
controller:WidgetCtrl
});
widget2.$emit('$invalid', 'REASON');
expect(form.$error.REASON).toEqual([widget, widget2]);
expect(form.$valid).toEqual(false);
expect(form.$invalid).toEqual(true);
widget.$emit('$valid', 'REASON');
expect(form.$error.REASON).toEqual([widget2]);
expect(form.$valid).toEqual(false);
expect(form.$invalid).toEqual(true);
widget2.$emit('$valid', 'REASON');
expect(form.$error).toEqual({});
expect(form.$valid).toEqual(true);
expect(form.$invalid).toEqual(false);
}));
});
});
describe('id assignment', function() {
it('should default to name expression', inject(function($rootScope, $formFactory) {
expect(form.text).toEqual(widget);
}));
it('should use ng:id', inject(function($rootScope, $formFactory) {
widget = form.$createWidget({
scope:scope,
model:'text',
alias:'my.id',
controller:WidgetCtrl
});
expect(form['my.id']).toEqual(widget);
}));
it('should not override existing names', inject(function($rootScope, $formFactory) {
var widget2 = form.$createWidget({
scope:scope,
model:'text',
alias:'text',
controller:WidgetCtrl
});
expect(form.text).toEqual(widget);
expect(widget2).not.toEqual(widget);
}));
});
describe('dealocation', function() {
it('should dealocate', inject(function($rootScope, $formFactory) {
var widget2 = form.$createWidget({
scope:scope,
model:'text',
alias:'myId',
controller:WidgetCtrl
});
expect(form.myId).toEqual(widget2);
var widget3 = form.$createWidget({
scope:scope,
model:'text',
alias:'myId',
controller:WidgetCtrl
});
expect(form.myId).toEqual(widget2);
widget3.$destroy();
expect(form.myId).toEqual(widget2);
widget2.$destroy();
expect(form.myId).toBeUndefined();
}));
it('should remove invalid fields from errors, when child widget removed', inject(function($rootScope, $formFactory) {
widget.$emit('$invalid', 'MyError');
expect(form.$error.MyError).toEqual([widget]);
expect(form.$invalid).toEqual(true);
widget.$destroy();
expect(form.$error.MyError).toBeUndefined();
expect(form.$invalid).toEqual(false);
}));
});
});
});
});