151e560a29acd9c2605cb58200e6fca1859af451
[portal/sdk.git] /
1 'use strict';
2
3 describe('Factory: WidgetModel', function () {
4
5   // load the service's module
6   beforeEach(module('ui.dashboard'));
7
8   // instantiate service
9   var WidgetModel;
10   beforeEach(inject(function (_WidgetModel_) {
11     WidgetModel = _WidgetModel_;
12   }));
13
14   it('should be a function', function() {
15     expect(typeof WidgetModel).toEqual('function');
16   });
17
18   describe('the constructor', function() {
19     var m, Class, Class2, overrides;
20
21     beforeEach(function() {
22       Class = {
23         name: 'TestWidget', 
24         attrs: {},
25         dataAttrName: 'attr-name',
26         dataModelType: function TestType() {},
27         dataModelOptions: {},
28         style: { width: '10em' },
29         settingsModalOptions: {},
30         onSettingsClose: function() {},
31         onSettingsDismiss: function() {},
32         funkyChicken: {
33           cool: false,
34           fun: true
35         }
36       };
37
38       Class2 = {
39         name: 'TestWidget2',
40         attrs: {},
41         dataAttrName: 'attr-name',
42         dataModelType: function TestType() {},
43         dataModelOptions: {},
44         style: { width: '10em' },
45         templateUrl: 'my/url.html',
46         template: '<div>some template</div>'
47       };
48
49       overrides = {
50         style: {
51           width: '15em'
52         }
53       };
54       spyOn(WidgetModel.prototype, 'setWidth');
55       m = new WidgetModel(Class, overrides);
56     });
57
58     it('should copy class defaults, so that changes on an instance do not change the Class', function() {
59       m.style.width = '20em';
60       expect(Class.style.width).toEqual('10em');
61     });
62
63     it('should call setWidth', function() {
64       expect(WidgetModel.prototype.setWidth).toHaveBeenCalled();
65     });
66
67     it('should take overrides as precedent over Class defaults', function() {
68       expect(m.style.width).toEqual('15em');
69     });
70
71     it('should copy arbitrary data from the widget definition', function() {
72       expect(m.funkyChicken.cool).toEqual(false);
73       expect(m.funkyChicken.fun).toEqual(true);
74       expect(m.funkyChicken===Class.funkyChicken).toEqual(false);
75     });
76
77     it('should set templateUrl if and only if it is present on Class', function() {
78       var m2 = new WidgetModel(Class2, overrides);
79       expect(m2.templateUrl).toEqual('my/url.html');
80     });
81
82     it('should set template if and only if it is present on Class', function() {
83       delete Class2.templateUrl;
84       var m2 = new WidgetModel(Class2, overrides);
85       expect(m2.template).toEqual('<div>some template</div>');
86     });
87
88     it('should look for directive if neither templateUrl nor template is found on Class', function() {
89       delete Class2.templateUrl;
90       delete Class2.template;
91       Class2.directive = 'ng-bind';
92       var m2 = new WidgetModel(Class2, overrides);
93       expect(m2.directive).toEqual('ng-bind');
94     });
95
96     it('should set the name as directive if templateUrl, template, and directive are not defined', function() {
97       delete Class2.templateUrl;
98       delete Class2.template;
99       var m2 = new WidgetModel(Class2, overrides);
100       expect(m2.directive).toEqual('TestWidget2');
101     });
102
103     it('should not require overrides', function() {
104       var fn = function() {
105         var m2 = new WidgetModel(Class);
106       }
107       expect(fn).not.toThrow();
108     });
109
110     it('should copy references to settingsModalOptions, onSettingsClose, onSettingsDismiss', function() {
111       var m = new WidgetModel(Class);
112       expect(m.settingsModalOptions).toEqual(Class.settingsModalOptions);
113       expect(m.onSettingsClose).toEqual(Class.onSettingsClose);
114       expect(m.onSettingsDismiss).toEqual(Class.onSettingsDismiss);
115     });
116
117   });
118
119   describe('setWidth method', function() {
120
121     var context, setWidth;
122
123     beforeEach(function() {
124       context = new WidgetModel({});
125       setWidth = WidgetModel.prototype.setWidth;
126     });
127     
128     it('should take one argument as a string with units', function() {
129       setWidth.call(context, '100px');
130       expect(context.containerStyle.width).toEqual('100px');
131     });
132
133     it('should take two args as a number and string as units', function() {
134       setWidth.call(context, 100, 'px');
135       expect(context.containerStyle.width).toEqual('100px');
136     });
137
138     it('should return false and not set anything if width is less than 0', function() {
139       var result = setWidth.call(context, -100, 'em');
140       expect(result).toEqual(false);
141       expect(context.containerStyle.width).not.toEqual('-100em');
142     });
143
144     it('should assume % if no unit is given', function() {
145       setWidth.call(context, 50);
146       expect(context.containerStyle.width).toEqual('50%');
147     });
148
149     it('should force greater than 0% and less than or equal 100%', function() {
150       setWidth.call(context, '110%');
151       expect(context.containerStyle.width).toEqual('100%');
152     });
153
154   });
155
156 });