blob: 87f671a60e3146d81c073c30dc8e52496eed5712 [file] [log] [blame]
Matteo Scandoloc49f53c2016-04-20 11:38:42 -07001/**
2 * © OpenCORD
3 *
4 * Created by teone on 4/18/16.
5 */
6
7(function () {
8 'use strict';
9
Matteo Scandolo2aca9ab2016-05-26 15:09:55 -070010 let element, scope, isolatedScope, rootScope, compile;
11
12 const compileElement = () => {
13
14 if(!scope){
15 scope = rootScope.$new();
16 }
17
18 element = angular.element(`<xos-form config="config" ng-model="model"></xos-form>`);
19 compile(element)(scope);
20 scope.$digest();
21 isolatedScope = element.isolateScope().vm;
22 }
23
Matteo Scandoloc49f53c2016-04-20 11:38:42 -070024 describe('The xos.helper module', function(){
25
Matteo Scandolo2e804cb2016-04-27 16:29:33 -070026 describe('The xos-form component', () => {
Matteo Scandoloc49f53c2016-04-20 11:38:42 -070027
Matteo Scandoloc49f53c2016-04-20 11:38:42 -070028
29 beforeEach(module('xos.helpers'));
30
Matteo Scandolo2aca9ab2016-05-26 15:09:55 -070031 beforeEach(inject(($compile, $rootScope) => {
32 rootScope = $rootScope;
33 compile = $compile;
34 }));
35
Matteo Scandolobe136072016-06-03 16:58:43 -070036 it('should throw an error if no config is specified', () => {
Matteo Scandoloc49f53c2016-04-20 11:38:42 -070037 function errorFunctionWrapper(){
Matteo Scandolo2aca9ab2016-05-26 15:09:55 -070038 compileElement();
Matteo Scandoloc49f53c2016-04-20 11:38:42 -070039 }
40 expect(errorFunctionWrapper).toThrow(new Error('[xosForm] Please provide a configuration via the "config" attribute'));
Matteo Scandolobe136072016-06-03 16:58:43 -070041 });
Matteo Scandoloc49f53c2016-04-20 11:38:42 -070042
Matteo Scandolobe136072016-06-03 16:58:43 -070043 it('should throw an error if no actions is specified', () => {
Matteo Scandoloc49f53c2016-04-20 11:38:42 -070044 function errorFunctionWrapper(){
Matteo Scandolobe136072016-06-03 16:58:43 -070045 scope = rootScope.$new();
Matteo Scandoloc49f53c2016-04-20 11:38:42 -070046 scope.config = 'green';
Matteo Scandolo2aca9ab2016-05-26 15:09:55 -070047 compileElement();
Matteo Scandoloc49f53c2016-04-20 11:38:42 -070048 }
49 expect(errorFunctionWrapper).toThrow(new Error('[xosForm] Please provide an action list in the configuration'));
Matteo Scandolobe136072016-06-03 16:58:43 -070050 });
Matteo Scandoloc49f53c2016-04-20 11:38:42 -070051
52 describe('when correctly configured', () => {
53
54 let cb = jasmine.createSpy('callback');
55
Matteo Scandolo2aca9ab2016-05-26 15:09:55 -070056 beforeEach(inject(($rootScope) => {
Matteo Scandoloc49f53c2016-04-20 11:38:42 -070057
58 scope = $rootScope.$new();
59
60 scope.config = {
61 exclude: ['excludedField'],
Matteo Scandolo28e49b72016-04-22 14:14:03 -070062 formName: 'testForm',
Matteo Scandoloc49f53c2016-04-20 11:38:42 -070063 actions: [
64 {
65 label: 'Save',
66 icon: 'ok', // refers to bootstraps glyphicon
67 cb: cb,
68 class: 'success'
69 }
70 ],
Matteo Scandolo824a7cb2016-04-20 12:24:52 -070071 fields: {
72 first_name: {
73 label: 'Custom Label'
Matteo Scandoloc49f53c2016-04-20 11:38:42 -070074 }
Matteo Scandolo824a7cb2016-04-20 12:24:52 -070075 }
Matteo Scandoloc49f53c2016-04-20 11:38:42 -070076 };
77
78 scope.model = {
79 id: 1,
80 first_name: 'Jhon',
81 last_name: 'Snow',
82 age: 25,
Matteo Scandolofb667b02016-04-20 16:36:17 -070083 email: 'test@onlab.us',
Matteo Scandoloc49f53c2016-04-20 11:38:42 -070084 birthDate: '2016-04-18T23:44:16.883181Z',
85 enabled: true,
86 role: 'user', //select
87 a_permissions: [
Matteo Scandoloc49f53c2016-04-20 11:38:42 -070088 ],
Matteo Scandolo741d6b42016-05-25 16:02:16 -070089 object_field: {
90 string: 'bar',
91 number: 1,
92 email: 'teo@onlab.us'
Matteo Scandoloc49f53c2016-04-20 11:38:42 -070093 }
94 };
95
Matteo Scandolo2aca9ab2016-05-26 15:09:55 -070096 compileElement();
Matteo Scandoloc49f53c2016-04-20 11:38:42 -070097 }));
98
99 it('should add excluded properties to the list', () => {
100 let expected = ['id', 'validators', 'created', 'updated', 'deleted', 'backend_status', 'excludedField'];
101 expect(isolatedScope.excludedField).toEqual(expected);
102 });
103
Matteo Scandolodf23cdb2016-05-25 17:37:37 -0700104 it('should render 10 input field', () => {
Matteo Scandolofb667b02016-04-20 16:36:17 -0700105 // boolean are in the form model, but are not input
106 expect(Object.keys(isolatedScope.formField).length).toEqual(9);
Matteo Scandoloc49f53c2016-04-20 11:38:42 -0700107 var field = element[0].getElementsByTagName('input');
Matteo Scandolo741d6b42016-05-25 16:02:16 -0700108 expect(field.length).toEqual(10);
Matteo Scandoloc49f53c2016-04-20 11:38:42 -0700109 });
110
Matteo Scandolofb667b02016-04-20 16:36:17 -0700111 it('should render 1 boolean field', () => {
arpiagariucd3b0d52016-06-10 13:28:34 -0700112 expect($(element).find('.boolean-field > a').length).toEqual(2)
Matteo Scandolofb667b02016-04-20 16:36:17 -0700113 });
114
Matteo Scandoloc49f53c2016-04-20 11:38:42 -0700115 it('when clicking on action should invoke callback', () => {
Matteo Scandolofb667b02016-04-20 16:36:17 -0700116 var link = $(element).find('[role="button"]');
arpiagariucd3b0d52016-06-10 13:28:34 -0700117 //console.log(link);
Matteo Scandoloc49f53c2016-04-20 11:38:42 -0700118 link.click();
arpiagariucd3b0d52016-06-10 13:28:34 -0700119 // TODO : Check correct parameters
120 expect(cb).toHaveBeenCalled();
121
Matteo Scandoloc49f53c2016-04-20 11:38:42 -0700122 });
123
124 it('should set a custom label', () => {
125 let nameField = element[0].getElementsByClassName('form-group')[0];
126 let label = angular.element(nameField.getElementsByTagName('label')[0]).text()
127 expect(label).toEqual('Custom Label:');
128 });
Matteo Scandoloc49f53c2016-04-20 11:38:42 -0700129
Matteo Scandolob389f7a2016-04-20 14:59:39 -0700130 it('should use the correct input type', () => {
131 expect($(element).find('[name="age"]')).toHaveAttr('type', 'number');
132 expect($(element).find('[name="birthDate"]')).toHaveAttr('type', 'date');
Matteo Scandolofb667b02016-04-20 16:36:17 -0700133 expect($(element).find('[name="email"]')).toHaveAttr('type', 'email');
134 });
135
arpiagariucd3b0d52016-06-10 13:28:34 -0700136 xdescribe('the boolean field test', () => {
Matteo Scandolofb667b02016-04-20 16:36:17 -0700137
138 let setFalse, setTrue;
139
140 beforeEach(() => {
141 setFalse= $(element).find('.boolean-field > button:first-child');
142 setTrue = $(element).find('.boolean-field > button:last-child');
143 });
144
145 it('should change value to false', () => {
146 expect(isolatedScope.ngModel.enabled).toEqual(true);
arpiagariucd3b0d52016-06-10 13:28:34 -0700147 setFalse.click();
Matteo Scandolofb667b02016-04-20 16:36:17 -0700148 expect(isolatedScope.ngModel.enabled).toEqual(false);
149 });
150
Matteo Scandolo741d6b42016-05-25 16:02:16 -0700151 it('should change value to true', () => {
Matteo Scandolofb667b02016-04-20 16:36:17 -0700152 isolatedScope.ngModel.enabled = false;
153 scope.$apply();
154 expect(isolatedScope.ngModel.enabled).toEqual(false);
155 setTrue.click()
156 expect(isolatedScope.ngModel.enabled).toEqual(true);
157 });
Matteo Scandolob389f7a2016-04-20 14:59:39 -0700158 });
Matteo Scandolo28e49b72016-04-22 14:14:03 -0700159
Matteo Scandolo2aca9ab2016-05-26 15:09:55 -0700160 describe('when a deep model is passed', () => {
161
162 beforeEach(inject(($rootScope) => {
163
164 scope = $rootScope.$new();
165
166 scope.config = {
167 exclude: ['excludedField'],
168 formName: 'testForm',
169 actions: [
170 {
171 label: 'Save',
172 icon: 'ok', // refers to bootstraps glyphicon
173 cb: cb,
174 class: 'success'
175 }
176 ],
177 fields: {
178 object_field: {
179 field_one: {
180 label: 'Custom Label'
181 }
182 }
183 }
184 };
185
186 scope.model = {
187 object_field: {
188 field_one: 'bar',
189 number: 1,
190 email: 'teo@onlab.us'
191 }
192 };
193
194 compileElement();
195 }));
196
197 it('should print nested field', () => {
198 expect($(element).find('input').length).toBe(3);
199 });
200
201 xit('should configure nested fields', () => {
202 let custom_label = $(element).find('input[name=field_one]').parent().find('label');
203 expect(custom_label.text()).toBe('Custom Label');
204 });
205 });
Matteo Scandolob389f7a2016-04-20 14:59:39 -0700206 });
arpiagariucd3b0d52016-06-10 13:28:34 -0700207 describe('when correctly configured for feedback', () => {
208
Matteo Scandolob2a1a182016-06-15 14:53:33 -0700209 let fb = jasmine.createSpy('feedback').and.callFake(function(statusFlag) {
210 if(statusFlag){
211 scope.config.feedback.show = true;
212 scope.config.feedback.message = 'Form Submitted';
213 scope.config.feedback.type = 'success';
214 }
215 else {
216 scope.config.feedback.show = true;
217 scope.config.feedback.message = 'Error';
218 scope.config.feedback.type = 'danger';
arpiagariucd3b0d52016-06-10 13:28:34 -0700219
Matteo Scandolob2a1a182016-06-15 14:53:33 -0700220 }
221 });
arpiagariucd3b0d52016-06-10 13:28:34 -0700222
Matteo Scandolob2a1a182016-06-15 14:53:33 -0700223 beforeEach(()=> {
224 scope = rootScope.$new();
225 scope.config =
226 {
arpiagariucd3b0d52016-06-10 13:28:34 -0700227
arpiagariucd3b0d52016-06-10 13:28:34 -0700228 feedback: {
229 show: false,
230 message: 'Form submitted successfully !!!',
231 type: 'success'
232 },
233 actions: [
234 {
235 label: 'Save',
236 icon: 'ok', // refers to bootstraps glyphicon
Matteo Scandolob2a1a182016-06-15 14:53:33 -0700237 cb: () => {},
arpiagariucd3b0d52016-06-10 13:28:34 -0700238 class: 'success'
239 }
Matteo Scandolob2a1a182016-06-15 14:53:33 -0700240 ]
arpiagariucd3b0d52016-06-10 13:28:34 -0700241 };
Matteo Scandolob2a1a182016-06-15 14:53:33 -0700242 scope.model={};
arpiagariucd3b0d52016-06-10 13:28:34 -0700243 compileElement();
arpiagariucd3b0d52016-06-10 13:28:34 -0700244 });
245
Matteo Scandolob2a1a182016-06-15 14:53:33 -0700246 it('should not show feedback when loaded', () => {
247 expect($(element).find('xos-alert > div')).toHaveClass('alert alert-success ng-hide');
arpiagariucd3b0d52016-06-10 13:28:34 -0700248 });
249
Matteo Scandolob2a1a182016-06-15 14:53:33 -0700250 it('should show a success feedback', () => {
251 fb(true);
252 scope.$digest();
253 expect(isolatedScope.config.feedback.type).toEqual('success');
254 expect(fb).toHaveBeenCalledWith(true);
255 expect($(element).find('xos-alert > div')).toHaveClass('alert alert-success');
arpiagariucd3b0d52016-06-10 13:28:34 -0700256 });
257
Matteo Scandolob2a1a182016-06-15 14:53:33 -0700258 it('should show an error feedback', function() {
259 fb(false);
260 scope.$digest();
261 expect(isolatedScope.config.feedback.type).toEqual('danger');
262 expect(fb).toHaveBeenCalledWith(false);
263 expect($(element).find('xos-alert > div')).toHaveClass('alert alert-danger');
arpiagariucd3b0d52016-06-10 13:28:34 -0700264 });
265 });
266
Matteo Scandoloc49f53c2016-04-20 11:38:42 -0700267 });
268 });
269})();