blob: 32e91bef992cde14574127a72939483fcc000415 [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
10 describe('The xos.helper module', function(){
11
12 describe('The XosFormHelper service', () => {
13 let service;
14
15 let fields = [
16 'id',
17 'name',
Matteo Scandolob389f7a2016-04-20 14:59:39 -070018 'mail',
Matteo Scandoloc49f53c2016-04-20 11:38:42 -070019 'active',
20 'created',
21 'custom'
22 ];
23
24 let modelField = {
25 id: {},
26 name: {},
Matteo Scandolob389f7a2016-04-20 14:59:39 -070027 mail: {},
Matteo Scandoloc49f53c2016-04-20 11:38:42 -070028 active: {},
29 created: {},
30 custom: {}
31 };
32
33 let model = {
34 id: 1,
35 name: 'test',
Matteo Scandolob389f7a2016-04-20 14:59:39 -070036 mail: 'test@onlab.us',
Matteo Scandoloc49f53c2016-04-20 11:38:42 -070037 active: true,
38 created: '2016-04-18T23:44:16.883181Z',
39 custom: 'MyCustomValue'
40 };
41
42 let customField = {
43 custom: {
44 label: 'Custom Label',
45 type: 'number',
46 validators: {}
47 }
48 };
49
50 let formObject = {
51 id: {
52 label: 'Id:',
53 type: 'number',
54 validators: {}
55 },
56 name: {
57 label: 'Name:',
58 type: 'string',
59 validators: {}
60 },
Matteo Scandolob389f7a2016-04-20 14:59:39 -070061 mail: {
62 label: 'Mail:',
63 type: 'email',
64 validators: {}
65 },
Matteo Scandoloc49f53c2016-04-20 11:38:42 -070066 active: {
67 label: 'Active:',
68 type: 'boolean',
69 validators: {}
70 },
71 created: {
72 label: 'Created:',
73 type: 'date',
74 validators: {}
75 },
76 custom: {
77 label: 'Custom Label:',
78 type: 'number',
79 validators: {}
80 }
81 };
82
83 // load the application module
84 beforeEach(module('xos.helpers'));
85
86 // inject the cartService
87 beforeEach(inject(function (_XosFormHelpers_) {
88 // The injector unwraps the underscores (_) from around the parameter names when matching
89 service = _XosFormHelpers_;
90 }));
91
Matteo Scandolob389f7a2016-04-20 14:59:39 -070092 describe('the _isEmail method', () => {
93 it('should return true', () => {
94 expect(service._isEmail('test@onlab.us')).toEqual(true);
95 });
96 it('should return false', () => {
97 expect(service._isEmail('testonlab.us')).toEqual(false);
98 expect(service._isEmail('test@onlab')).toEqual(false);
99 });
100 });
101
Matteo Scandoloc49f53c2016-04-20 11:38:42 -0700102 describe('the _getFieldFormat method', () => {
Matteo Scandolo824a7cb2016-04-20 12:24:52 -0700103 it('should return string', () => {
Matteo Scandoloc49f53c2016-04-20 11:38:42 -0700104 expect(service._getFieldFormat('string')).toEqual('string');
105 });
Matteo Scandolob389f7a2016-04-20 14:59:39 -0700106 it('should return mail', () => {
107 expect(service._getFieldFormat('test@onlab.us')).toEqual('email');
108 });
Matteo Scandoloc49f53c2016-04-20 11:38:42 -0700109 it('should return number', () => {
110 expect(service._getFieldFormat(1)).toEqual('number');
111 expect(service._getFieldFormat('1')).toEqual('number');
112 });
Matteo Scandolo824a7cb2016-04-20 12:24:52 -0700113 it('should return boolean', () => {
Matteo Scandoloc49f53c2016-04-20 11:38:42 -0700114 expect(service._getFieldFormat(false)).toEqual('boolean');
115 expect(service._getFieldFormat(true)).toEqual('boolean');
116 });
117
118 it('should return date', () => {
119 expect(service._getFieldFormat('2016-04-19T23:09:1092Z')).toEqual('string');
120 expect(service._getFieldFormat(new Date())).toEqual('date');
121 expect(service._getFieldFormat('2016-04-19T23:09:10.208092Z')).toEqual('date');
122 });
123 });
124
Matteo Scandolo824a7cb2016-04-20 12:24:52 -0700125 it('should convert the fields array in an empty form object', () => {
Matteo Scandoloc49f53c2016-04-20 11:38:42 -0700126 expect(service.parseModelField(fields)).toEqual(modelField);
127 });
128
Matteo Scandolo824a7cb2016-04-20 12:24:52 -0700129 it('should combine modelField and customField in a form object', () => {
Matteo Scandoloc49f53c2016-04-20 11:38:42 -0700130 expect(service.buildFormStructure(modelField, customField, model)).toEqual(formObject);
131 });
132 });
133
Matteo Scandolo824a7cb2016-04-20 12:24:52 -0700134 describe('The xos-form component', () => {
Matteo Scandoloc49f53c2016-04-20 11:38:42 -0700135
136 let element, scope, isolatedScope;
137
138 beforeEach(module('xos.helpers'));
139
140 it('should throw an error if no config is specified', inject(($compile, $rootScope) => {
141 function errorFunctionWrapper(){
142 $compile(angular.element('<xos-form></xos-form>'))($rootScope);
143 $rootScope.$digest();
144 }
145 expect(errorFunctionWrapper).toThrow(new Error('[xosForm] Please provide a configuration via the "config" attribute'));
146 }));
147
148 it('should throw an error if no actions is specified', inject(($compile, $rootScope) => {
149 function errorFunctionWrapper(){
150 let scope = $rootScope.$new();
151 scope.config = 'green';
152 $compile(angular.element('<xos-form config="config"></xos-form>'))(scope);
153 $rootScope.$digest();
154 }
155 expect(errorFunctionWrapper).toThrow(new Error('[xosForm] Please provide an action list in the configuration'));
156 }));
157
158 describe('when correctly configured', () => {
159
160 let cb = jasmine.createSpy('callback');
161
162 beforeEach(inject(($compile, $rootScope) => {
163
164
165 scope = $rootScope.$new();
166
167 scope.config = {
168 exclude: ['excludedField'],
169 actions: [
170 {
171 label: 'Save',
172 icon: 'ok', // refers to bootstraps glyphicon
173 cb: cb,
174 class: 'success'
175 }
176 ],
Matteo Scandolo824a7cb2016-04-20 12:24:52 -0700177 fields: {
178 first_name: {
179 label: 'Custom Label'
Matteo Scandoloc49f53c2016-04-20 11:38:42 -0700180 }
Matteo Scandolo824a7cb2016-04-20 12:24:52 -0700181 }
Matteo Scandoloc49f53c2016-04-20 11:38:42 -0700182 };
183
184 scope.model = {
185 id: 1,
186 first_name: 'Jhon',
187 last_name: 'Snow',
188 age: 25,
Matteo Scandolofb667b02016-04-20 16:36:17 -0700189 email: 'test@onlab.us',
Matteo Scandoloc49f53c2016-04-20 11:38:42 -0700190 birthDate: '2016-04-18T23:44:16.883181Z',
191 enabled: true,
192 role: 'user', //select
193 a_permissions: [
194
195 ],
196 o_permissions: {
197
198 }
199 };
200
201 element = angular.element(`<xos-form config="config" ng-model="model"></xos-form>`);
202 $compile(element)(scope);
203 scope.$digest();
204 isolatedScope = element.isolateScope().vm;
205 }));
206
207 it('should add excluded properties to the list', () => {
208 let expected = ['id', 'validators', 'created', 'updated', 'deleted', 'backend_status', 'excludedField'];
209 expect(isolatedScope.excludedField).toEqual(expected);
210 });
211
Matteo Scandolofb667b02016-04-20 16:36:17 -0700212 it('should render 8 input field', () => {
213 // boolean are in the form model, but are not input
214 expect(Object.keys(isolatedScope.formField).length).toEqual(9);
Matteo Scandoloc49f53c2016-04-20 11:38:42 -0700215 var field = element[0].getElementsByTagName('input');
216 expect(field.length).toEqual(8);
217 });
218
Matteo Scandolofb667b02016-04-20 16:36:17 -0700219 it('should render 1 boolean field', () => {
220 expect($(element).find('.boolean-field > button').length).toEqual(2)
221 });
222
Matteo Scandoloc49f53c2016-04-20 11:38:42 -0700223 it('when clicking on action should invoke callback', () => {
Matteo Scandolofb667b02016-04-20 16:36:17 -0700224 var link = $(element).find('[role="button"]');
Matteo Scandoloc49f53c2016-04-20 11:38:42 -0700225 link.click();
226 expect(cb).toHaveBeenCalledWith(scope.model);
227 });
228
229 it('should set a custom label', () => {
230 let nameField = element[0].getElementsByClassName('form-group')[0];
231 let label = angular.element(nameField.getElementsByTagName('label')[0]).text()
232 expect(label).toEqual('Custom Label:');
233 });
Matteo Scandoloc49f53c2016-04-20 11:38:42 -0700234
Matteo Scandolob389f7a2016-04-20 14:59:39 -0700235 it('should use the correct input type', () => {
236 expect($(element).find('[name="age"]')).toHaveAttr('type', 'number');
237 expect($(element).find('[name="birthDate"]')).toHaveAttr('type', 'date');
Matteo Scandolofb667b02016-04-20 16:36:17 -0700238 expect($(element).find('[name="email"]')).toHaveAttr('type', 'email');
239 });
240
241 describe('the boolean field', () => {
242
243 let setFalse, setTrue;
244
245 beforeEach(() => {
246 setFalse= $(element).find('.boolean-field > button:first-child');
247 setTrue = $(element).find('.boolean-field > button:last-child');
248 });
249
250 it('should change value to false', () => {
251 expect(isolatedScope.ngModel.enabled).toEqual(true);
252 setFalse.click()
253 expect(isolatedScope.ngModel.enabled).toEqual(false);
254 });
255
256 it('should change value to false', () => {
257 isolatedScope.ngModel.enabled = false;
258 scope.$apply();
259 expect(isolatedScope.ngModel.enabled).toEqual(false);
260 setTrue.click()
261 expect(isolatedScope.ngModel.enabled).toEqual(true);
262 });
Matteo Scandolob389f7a2016-04-20 14:59:39 -0700263 });
264 });
Matteo Scandoloc49f53c2016-04-20 11:38:42 -0700265 });
266 });
267})();