2015-05-22 15:32:49 -04:00
|
|
|
import {
|
|
|
|
ddescribe,
|
|
|
|
describe,
|
2015-05-30 14:56:00 -04:00
|
|
|
fakeAsync,
|
|
|
|
flushMicrotasks,
|
2015-05-22 15:32:49 -04:00
|
|
|
it,
|
|
|
|
iit,
|
|
|
|
xit,
|
|
|
|
expect,
|
|
|
|
beforeEach,
|
|
|
|
afterEach,
|
|
|
|
el,
|
|
|
|
AsyncTestCompleter,
|
|
|
|
inject
|
|
|
|
} from 'angular2/test_lib';
|
2015-06-17 17:45:40 -04:00
|
|
|
|
|
|
|
import {QueryList} from 'angular2/angular2';
|
|
|
|
|
2015-05-30 14:56:00 -04:00
|
|
|
import {
|
|
|
|
ControlGroup,
|
|
|
|
Control,
|
2015-06-10 16:51:44 -04:00
|
|
|
NgControlName,
|
|
|
|
NgControlGroup,
|
|
|
|
NgFormModel,
|
2015-05-30 14:56:00 -04:00
|
|
|
ControlValueAccessor,
|
|
|
|
Validators,
|
2015-06-10 16:51:44 -04:00
|
|
|
NgForm,
|
2015-06-17 17:45:40 -04:00
|
|
|
NgModel,
|
|
|
|
NgFormControl,
|
|
|
|
NgRequiredValidator
|
2015-05-30 14:56:00 -04:00
|
|
|
} from 'angular2/forms';
|
|
|
|
|
|
|
|
class DummyControlValueAccessor implements ControlValueAccessor {
|
|
|
|
writtenValue;
|
|
|
|
|
|
|
|
registerOnChange(fn) {}
|
2015-06-02 11:41:33 -04:00
|
|
|
registerOnTouched(fn) {}
|
2015-05-30 14:56:00 -04:00
|
|
|
|
|
|
|
writeValue(obj: any): void { this.writtenValue = obj; }
|
|
|
|
}
|
2015-05-11 15:00:56 -04:00
|
|
|
|
|
|
|
export function main() {
|
|
|
|
describe("Form Directives", () => {
|
2015-06-10 16:51:44 -04:00
|
|
|
describe("NgFormModel", () => {
|
2015-05-30 14:56:00 -04:00
|
|
|
var form;
|
|
|
|
var formModel;
|
|
|
|
var loginControlDir;
|
|
|
|
|
|
|
|
beforeEach(() => {
|
2015-06-10 16:51:44 -04:00
|
|
|
form = new NgFormModel();
|
2015-05-30 14:56:00 -04:00
|
|
|
formModel = new ControlGroup({"login": new Control(null)});
|
|
|
|
form.form = formModel;
|
|
|
|
|
2015-06-17 17:45:40 -04:00
|
|
|
loginControlDir = new NgControlName(form, new QueryList<any>());
|
2015-05-30 14:56:00 -04:00
|
|
|
loginControlDir.name = "login";
|
|
|
|
loginControlDir.valueAccessor = new DummyControlValueAccessor();
|
|
|
|
});
|
|
|
|
|
2015-07-07 18:53:16 -04:00
|
|
|
it("should reexport control properties", () => {
|
|
|
|
expect(form.control).toBe(formModel);
|
|
|
|
expect(form.value).toBe(formModel.value);
|
|
|
|
expect(form.valid).toBe(formModel.valid);
|
|
|
|
expect(form.errors).toBe(formModel.errors);
|
|
|
|
expect(form.pristine).toBe(formModel.pristine);
|
|
|
|
expect(form.dirty).toBe(formModel.dirty);
|
|
|
|
expect(form.touched).toBe(formModel.touched);
|
|
|
|
expect(form.untouched).toBe(formModel.untouched);
|
|
|
|
});
|
|
|
|
|
2015-05-30 14:56:00 -04:00
|
|
|
describe("addControl", () => {
|
|
|
|
it("should throw when no control found", () => {
|
2015-06-17 17:45:40 -04:00
|
|
|
var dir = new NgControlName(form, null);
|
2015-05-30 14:56:00 -04:00
|
|
|
dir.name = "invalidName";
|
|
|
|
|
|
|
|
expect(() => form.addControl(dir))
|
|
|
|
.toThrowError(new RegExp("Cannot find control 'invalidName'"));
|
|
|
|
});
|
|
|
|
|
|
|
|
it("should throw when no value accessor", () => {
|
2015-06-17 17:45:40 -04:00
|
|
|
var dir = new NgControlName(form, null);
|
2015-05-30 14:56:00 -04:00
|
|
|
dir.name = "login";
|
|
|
|
|
|
|
|
expect(() => form.addControl(dir))
|
|
|
|
.toThrowError(new RegExp("No value accessor for 'login'"));
|
|
|
|
});
|
|
|
|
|
|
|
|
it("should set up validator", () => {
|
2015-06-17 17:45:40 -04:00
|
|
|
loginControlDir.ngValidators.reset([new NgRequiredValidator()]);
|
2015-05-30 14:56:00 -04:00
|
|
|
|
|
|
|
expect(formModel.find(["login"]).valid).toBe(true);
|
|
|
|
|
|
|
|
// this will add the required validator and recalculate the validity
|
|
|
|
form.addControl(loginControlDir);
|
|
|
|
|
|
|
|
expect(formModel.find(["login"]).valid).toBe(false);
|
|
|
|
});
|
|
|
|
|
|
|
|
it("should write value to the DOM", () => {
|
2015-06-01 13:41:50 -04:00
|
|
|
formModel.find(["login"]).updateValue("initValue");
|
2015-05-30 14:56:00 -04:00
|
|
|
|
|
|
|
form.addControl(loginControlDir);
|
|
|
|
|
|
|
|
expect((<any>loginControlDir.valueAccessor).writtenValue).toEqual("initValue");
|
|
|
|
});
|
|
|
|
|
|
|
|
it("should add the directive to the list of directives included in the form", () => {
|
|
|
|
form.addControl(loginControlDir);
|
|
|
|
expect(form.directives).toEqual([loginControlDir]);
|
|
|
|
});
|
2015-05-11 15:00:56 -04:00
|
|
|
});
|
|
|
|
|
2015-05-30 14:56:00 -04:00
|
|
|
describe("removeControl", () => {
|
|
|
|
it("should remove the directive to the list of directives included in the form", () => {
|
|
|
|
form.addControl(loginControlDir);
|
|
|
|
form.removeControl(loginControlDir);
|
|
|
|
expect(form.directives).toEqual([]);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
2015-08-28 00:19:56 -04:00
|
|
|
describe("onChanges", () => {
|
2015-05-30 14:56:00 -04:00
|
|
|
it("should update dom values of all the directives", () => {
|
|
|
|
form.addControl(loginControlDir);
|
|
|
|
|
2015-06-01 13:41:50 -04:00
|
|
|
formModel.find(["login"]).updateValue("new value");
|
2015-05-30 14:56:00 -04:00
|
|
|
|
2015-08-28 00:19:56 -04:00
|
|
|
form.onChanges(null);
|
2015-05-30 14:56:00 -04:00
|
|
|
|
|
|
|
expect((<any>loginControlDir.valueAccessor).writtenValue).toEqual("new value");
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
2015-06-10 16:51:44 -04:00
|
|
|
describe("NgForm", () => {
|
2015-05-30 14:56:00 -04:00
|
|
|
var form;
|
|
|
|
var formModel;
|
|
|
|
var loginControlDir;
|
|
|
|
var personControlGroupDir;
|
|
|
|
|
|
|
|
beforeEach(() => {
|
2015-06-10 16:51:44 -04:00
|
|
|
form = new NgForm();
|
2015-05-30 14:56:00 -04:00
|
|
|
formModel = form.form;
|
|
|
|
|
2015-06-10 16:51:44 -04:00
|
|
|
personControlGroupDir = new NgControlGroup(form);
|
2015-05-30 14:56:00 -04:00
|
|
|
personControlGroupDir.name = "person";
|
|
|
|
|
2015-06-17 17:45:40 -04:00
|
|
|
loginControlDir = new NgControlName(personControlGroupDir, null);
|
2015-05-30 14:56:00 -04:00
|
|
|
loginControlDir.name = "login";
|
|
|
|
loginControlDir.valueAccessor = new DummyControlValueAccessor();
|
|
|
|
});
|
|
|
|
|
2015-07-07 18:53:16 -04:00
|
|
|
it("should reexport control properties", () => {
|
|
|
|
expect(form.control).toBe(formModel);
|
|
|
|
expect(form.value).toBe(formModel.value);
|
|
|
|
expect(form.valid).toBe(formModel.valid);
|
|
|
|
expect(form.errors).toBe(formModel.errors);
|
|
|
|
expect(form.pristine).toBe(formModel.pristine);
|
|
|
|
expect(form.dirty).toBe(formModel.dirty);
|
|
|
|
expect(form.touched).toBe(formModel.touched);
|
|
|
|
expect(form.untouched).toBe(formModel.untouched);
|
|
|
|
});
|
|
|
|
|
2015-05-30 14:56:00 -04:00
|
|
|
describe("addControl & addControlGroup", () => {
|
|
|
|
it("should create a control with the given name", fakeAsync(() => {
|
|
|
|
form.addControlGroup(personControlGroupDir);
|
|
|
|
form.addControl(loginControlDir);
|
|
|
|
|
|
|
|
flushMicrotasks();
|
|
|
|
|
|
|
|
expect(formModel.find(["person", "login"])).not.toBeNull;
|
|
|
|
}));
|
|
|
|
|
|
|
|
// should update the form's value and validity
|
|
|
|
});
|
|
|
|
|
|
|
|
describe("removeControl & removeControlGroup", () => {
|
|
|
|
it("should remove control", fakeAsync(() => {
|
|
|
|
form.addControlGroup(personControlGroupDir);
|
|
|
|
form.addControl(loginControlDir);
|
|
|
|
|
|
|
|
form.removeControlGroup(personControlGroupDir);
|
|
|
|
form.removeControl(loginControlDir);
|
|
|
|
|
|
|
|
flushMicrotasks();
|
|
|
|
|
|
|
|
expect(formModel.find(["person"])).toBeNull();
|
|
|
|
expect(formModel.find(["person", "login"])).toBeNull();
|
|
|
|
}));
|
|
|
|
|
|
|
|
// should update the form's value and validity
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
2015-07-07 18:53:16 -04:00
|
|
|
describe("NgControlGroup", () => {
|
|
|
|
var formModel;
|
|
|
|
var controlGroupDir;
|
|
|
|
|
|
|
|
beforeEach(() => {
|
|
|
|
formModel = new ControlGroup({"login": new Control(null)});
|
|
|
|
|
|
|
|
var parent = new NgFormModel();
|
|
|
|
parent.form = new ControlGroup({"group": formModel});
|
|
|
|
controlGroupDir = new NgControlGroup(parent);
|
|
|
|
controlGroupDir.name = "group";
|
|
|
|
});
|
|
|
|
|
|
|
|
it("should reexport control properties", () => {
|
|
|
|
expect(controlGroupDir.control).toBe(formModel);
|
|
|
|
expect(controlGroupDir.value).toBe(formModel.value);
|
|
|
|
expect(controlGroupDir.valid).toBe(formModel.valid);
|
|
|
|
expect(controlGroupDir.errors).toBe(formModel.errors);
|
|
|
|
expect(controlGroupDir.pristine).toBe(formModel.pristine);
|
|
|
|
expect(controlGroupDir.dirty).toBe(formModel.dirty);
|
|
|
|
expect(controlGroupDir.touched).toBe(formModel.touched);
|
|
|
|
expect(controlGroupDir.untouched).toBe(formModel.untouched);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
2015-06-10 16:51:44 -04:00
|
|
|
describe("NgFormControl", () => {
|
2015-05-30 14:56:00 -04:00
|
|
|
var controlDir;
|
|
|
|
var control;
|
|
|
|
|
|
|
|
beforeEach(() => {
|
2015-06-17 17:45:40 -04:00
|
|
|
controlDir = new NgFormControl(new QueryList<any>());
|
2015-05-30 14:56:00 -04:00
|
|
|
controlDir.valueAccessor = new DummyControlValueAccessor();
|
|
|
|
|
|
|
|
control = new Control(null);
|
2015-06-03 14:56:01 -04:00
|
|
|
controlDir.form = control;
|
2015-05-30 14:56:00 -04:00
|
|
|
});
|
|
|
|
|
2015-07-07 18:53:16 -04:00
|
|
|
it("should reexport control properties", () => {
|
|
|
|
expect(controlDir.control).toBe(control);
|
|
|
|
expect(controlDir.value).toBe(control.value);
|
|
|
|
expect(controlDir.valid).toBe(control.valid);
|
|
|
|
expect(controlDir.errors).toBe(control.errors);
|
|
|
|
expect(controlDir.pristine).toBe(control.pristine);
|
|
|
|
expect(controlDir.dirty).toBe(control.dirty);
|
|
|
|
expect(controlDir.touched).toBe(control.touched);
|
|
|
|
expect(controlDir.untouched).toBe(control.untouched);
|
|
|
|
});
|
|
|
|
|
2015-05-30 14:56:00 -04:00
|
|
|
it("should set up validator", () => {
|
2015-06-17 17:45:40 -04:00
|
|
|
controlDir.ngValidators.reset([new NgRequiredValidator()]);
|
2015-05-30 14:56:00 -04:00
|
|
|
|
|
|
|
expect(control.valid).toBe(true);
|
|
|
|
|
|
|
|
// this will add the required validator and recalculate the validity
|
2015-08-28 00:19:56 -04:00
|
|
|
controlDir.onChanges({});
|
2015-05-11 15:00:56 -04:00
|
|
|
|
2015-05-30 14:56:00 -04:00
|
|
|
expect(control.valid).toBe(false);
|
2015-05-11 15:00:56 -04:00
|
|
|
});
|
|
|
|
});
|
2015-06-17 17:45:40 -04:00
|
|
|
|
|
|
|
describe("NgModel", () => {
|
|
|
|
var ngModel;
|
|
|
|
|
|
|
|
beforeEach(() => {
|
|
|
|
ngModel = new NgModel(new QueryList<any>());
|
|
|
|
ngModel.valueAccessor = new DummyControlValueAccessor();
|
|
|
|
});
|
|
|
|
|
2015-07-07 18:53:16 -04:00
|
|
|
it("should reexport control properties", () => {
|
|
|
|
var control = ngModel.control;
|
|
|
|
expect(ngModel.control).toBe(control);
|
|
|
|
expect(ngModel.value).toBe(control.value);
|
|
|
|
expect(ngModel.valid).toBe(control.valid);
|
|
|
|
expect(ngModel.errors).toBe(control.errors);
|
|
|
|
expect(ngModel.pristine).toBe(control.pristine);
|
|
|
|
expect(ngModel.dirty).toBe(control.dirty);
|
|
|
|
expect(ngModel.touched).toBe(control.touched);
|
|
|
|
expect(ngModel.untouched).toBe(control.untouched);
|
|
|
|
});
|
|
|
|
|
2015-06-17 17:45:40 -04:00
|
|
|
it("should set up validator", () => {
|
|
|
|
ngModel.ngValidators.reset([new NgRequiredValidator()]);
|
|
|
|
|
|
|
|
expect(ngModel.control.valid).toBe(true);
|
|
|
|
|
|
|
|
// this will add the required validator and recalculate the validity
|
2015-08-28 00:19:56 -04:00
|
|
|
ngModel.onChanges({});
|
2015-06-17 17:45:40 -04:00
|
|
|
|
|
|
|
expect(ngModel.control.valid).toBe(false);
|
|
|
|
});
|
|
|
|
});
|
2015-07-07 18:53:16 -04:00
|
|
|
|
|
|
|
describe("NgControlName", () => {
|
|
|
|
var formModel;
|
|
|
|
var controlNameDir;
|
|
|
|
|
|
|
|
beforeEach(() => {
|
|
|
|
formModel = new Control("name");
|
|
|
|
|
|
|
|
var parent = new NgFormModel();
|
|
|
|
parent.form = new ControlGroup({"name": formModel});
|
|
|
|
controlNameDir = new NgControlName(parent, new QueryList<any>());
|
|
|
|
controlNameDir.name = "name";
|
|
|
|
});
|
|
|
|
|
|
|
|
it("should reexport control properties", () => {
|
|
|
|
expect(controlNameDir.control).toBe(formModel);
|
|
|
|
expect(controlNameDir.value).toBe(formModel.value);
|
|
|
|
expect(controlNameDir.valid).toBe(formModel.valid);
|
|
|
|
expect(controlNameDir.errors).toBe(formModel.errors);
|
|
|
|
expect(controlNameDir.pristine).toBe(formModel.pristine);
|
|
|
|
expect(controlNameDir.dirty).toBe(formModel.dirty);
|
|
|
|
expect(controlNameDir.touched).toBe(formModel.touched);
|
|
|
|
expect(controlNameDir.untouched).toBe(formModel.untouched);
|
|
|
|
});
|
|
|
|
});
|
2015-05-11 15:00:56 -04:00
|
|
|
});
|
|
|
|
}
|