Skip to content

Commit f6d271e

Browse files
authored
Merge pull request #6 from CrossLead/unit-testing
Unit Test Coverage on Angular Services and Providers
2 parents a4bd531 + e8c2429 commit f6d271e

14 files changed

+181
-109
lines changed

dist/angular-zendesk-widget.js

Lines changed: 47 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,6 @@
11
(function(angular) {
22

3-
angular.module('zendeskWidget', [])
4-
.run([
5-
'$window',
6-
'zendeskWidgetSettings',
7-
function($window, zendeskWidgetSettings) {
8-
if (!zendeskWidgetSettings.accountUrl) {
9-
throw new Error('Missing accountUrl. Please set in app config via ZendeskWidgetProvider');
10-
}
11-
12-
var window = $window;
13-
14-
// Following is essentially a copy paste of JS portion of the Zendesk embed code
15-
// with our settings subbed in. For more info, see:
16-
// https://support.zendesk.com/hc/en-us/articles/203908456-Using-Web-Widget-to-embed-customer-service-in-your-website
17-
18-
/*eslint-disable */
19-
20-
window.zEmbed || function(e, t) {
21-
var n, o, d, i, s, a = [],
22-
r = document.createElement("iframe");
23-
window.zEmbed = function() {
24-
a.push(arguments)
25-
}, window.zE = window.zE || window.zEmbed, r.src = "javascript:false", r.title = "", r.role = "presentation", (r.frameElement || r).style.cssText = "display: none", d = document.getElementsByTagName("script"), d = d[d.length - 1], d.parentNode.insertBefore(r, d), i = r.contentWindow, s = i.document;
26-
try {
27-
o = s
28-
} catch (c) {
29-
n = document.domain, r.src = 'javascript:var d=document.open();d.domain="' + n + '";void(0);', o = s
30-
}
31-
o.open()._l = function() {
32-
var o = this.createElement("script");
33-
n && (this.domain = n), o.id = "js-iframe-async", o.src = e, this.t = +new Date, this.zendeskHost = t, this.zEQueue = a, this.body.appendChild(o)
34-
}, o.write('<body onload="document._l();">'), o.close()
35-
}("https://assets.zendesk.com/embeddable_framework/main.js", zendeskWidgetSettings.accountUrl);
36-
37-
/*eslint-enable */
38-
39-
$window.zE(function() {
40-
zendeskWidgetSettings.beforePageLoad($window.zE);
41-
});
42-
}
43-
]);
3+
angular.module('zendeskWidget', []);
444

455
})(angular);
466

@@ -98,3 +58,49 @@
9858
}]);
9959

10060
})(angular);
61+
62+
(function(angular) {
63+
64+
angular.module('zendeskWidget')
65+
.run([
66+
'$window',
67+
'zendeskWidgetSettings',
68+
function($window, zendeskWidgetSettings) {
69+
if (!zendeskWidgetSettings.accountUrl) {
70+
throw new Error('Missing accountUrl. Please set in app config via ZendeskWidgetProvider');
71+
}
72+
73+
var window = $window;
74+
75+
// Following is essentially a copy paste of JS portion of the Zendesk embed code
76+
// with our settings subbed in. For more info, see:
77+
// https://support.zendesk.com/hc/en-us/articles/203908456-Using-Web-Widget-to-embed-customer-service-in-your-website
78+
79+
/*eslint-disable */
80+
81+
window.zEmbed || function(e, t) {
82+
var n, o, d, i, s, a = [],
83+
r = document.createElement("iframe");
84+
window.zEmbed = function() {
85+
a.push(arguments)
86+
}, window.zE = window.zE || window.zEmbed, r.src = "javascript:false", r.title = "", r.role = "presentation", (r.frameElement || r).style.cssText = "display: none", d = document.getElementsByTagName("script"), d = d[d.length - 1], d.parentNode.insertBefore(r, d), i = r.contentWindow, s = i.document;
87+
try {
88+
o = s
89+
} catch (c) {
90+
n = document.domain, r.src = 'javascript:var d=document.open();d.domain="' + n + '";void(0);', o = s
91+
}
92+
o.open()._l = function() {
93+
var o = this.createElement("script");
94+
n && (this.domain = n), o.id = "js-iframe-async", o.src = e, this.t = +new Date, this.zendeskHost = t, this.zEQueue = a, this.body.appendChild(o)
95+
}, o.write('<body onload="document._l();">'), o.close()
96+
}("https://assets.zendesk.com/embeddable_framework/main.js", zendeskWidgetSettings.accountUrl);
97+
98+
/*eslint-enable */
99+
100+
$window.zE(function() {
101+
zendeskWidgetSettings.beforePageLoad($window.zE);
102+
});
103+
}
104+
]);
105+
106+
})(angular);

dist/angular-zendesk-widget.min.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

gulpfile.js

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,14 @@ var rootDirectory = path.resolve('./');
1919
var sourceDirectory = path.join(rootDirectory, './src');
2020

2121
var sourceFiles = [
22-
23-
// Make sure module files are handled first
22+
// Load angular module files first
2423
path.join(sourceDirectory, '/**/*.module.js'),
2524

26-
// Then add all JavaScript files
27-
path.join(sourceDirectory, '/**/*.js')
25+
// Next, add all angular services and providers
26+
path.join(sourceDirectory, '/**/*.service.js'),
27+
28+
// Then the angular run files last
29+
path.join(sourceDirectory, '/**/*.run.js')
2830
];
2931

3032
var lintFiles = [
@@ -47,7 +49,7 @@ gulp.task('build', function() {
4749
* Process
4850
*/
4951
gulp.task('process-all', function (done) {
50-
runSequence('lint', 'test-src', 'build', done);
52+
runSequence('lint', 'test-src', 'build', 'test-dist-concatenated', 'test-dist-minified', done);
5153
});
5254

5355
/**

karma-dist-concatenated.conf.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ module.exports = function(config) {
2424
'bower/angular/angular.js',
2525
'bower/angular-mocks/angular-mocks.js',
2626
'dist/angular-zendesk-widget.js',
27-
'test/unit/**/*.js'
27+
'test/integration/**/*Spec.js'
2828
],
2929

3030

karma-dist-minified.conf.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ module.exports = function(config) {
2424
'bower/angular/angular.js',
2525
'bower/angular-mocks/angular-mocks.js',
2626
'dist/angular-zendesk-widget.min.js',
27-
'test/unit/**/*.js'
27+
'test/integration/**/*Spec.js'
2828
],
2929

3030

karma-src.conf.js

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ module.exports = function(config) {
1616
'karma-jasmine',
1717
'karma-sinon-chai',
1818
'karma-chrome-launcher',
19-
'karma-spec-reporter'
19+
'karma-spec-reporter',
20+
'karma-coverage'
2021
],
2122

2223
// list of files / patterns to load in the browser
@@ -25,25 +26,32 @@ module.exports = function(config) {
2526
'bower/angular-mocks/angular-mocks.js',
2627
'src/**/*.module.js',
2728
'src/**/*.js',
28-
'test/unit/**/*.js'
29+
'test/unit/**/*Spec.js'
2930
],
3031

3132

3233
// list of files to exclude
3334
exclude: [
35+
'src/**/*.run.js'
3436
],
3537

3638

3739
// preprocess matching files before serving them to the browser
3840
// available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor
3941
preprocessors: {
42+
'src/**/*.js': ['coverage']
4043
},
4144

4245

4346
// test results reporter to use
4447
// possible values: 'dots', 'progress'
4548
// available reporters: https://npmjs.org/browse/keyword/karma-reporter
46-
reporters: ['progress', 'spec'],
49+
reporters: ['spec', 'coverage'],
50+
51+
52+
coverageReporter: {
53+
type: 'text'
54+
},
4755

4856

4957
// web server port

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
"karma-chai": "^0.1.0",
2929
"karma-chai-jquery": "^1.0.0",
3030
"karma-chrome-launcher": "^0.1.4",
31+
"karma-coverage": "^1.0.0",
3132
"karma-jasmine": "^0.3.6",
3233
"karma-jquery": "^0.1.0",
3334
"karma-sinon-chai": "^0.2.0",
Lines changed: 1 addition & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,5 @@
11
(function(angular) {
22

3-
angular.module('zendeskWidget', [])
4-
.run([
5-
'$window',
6-
'zendeskWidgetSettings',
7-
function($window, zendeskWidgetSettings) {
8-
if (!zendeskWidgetSettings.accountUrl) {
9-
throw new Error('Missing accountUrl. Please set in app config via ZendeskWidgetProvider');
10-
}
11-
12-
var window = $window;
13-
14-
// Following is essentially a copy paste of JS portion of the Zendesk embed code
15-
// with our settings subbed in. For more info, see:
16-
// https://support.zendesk.com/hc/en-us/articles/203908456-Using-Web-Widget-to-embed-customer-service-in-your-website
17-
18-
/*eslint-disable */
19-
20-
window.zEmbed || function(e, t) {
21-
var n, o, d, i, s, a = [],
22-
r = document.createElement("iframe");
23-
window.zEmbed = function() {
24-
a.push(arguments)
25-
}, window.zE = window.zE || window.zEmbed, r.src = "javascript:false", r.title = "", r.role = "presentation", (r.frameElement || r).style.cssText = "display: none", d = document.getElementsByTagName("script"), d = d[d.length - 1], d.parentNode.insertBefore(r, d), i = r.contentWindow, s = i.document;
26-
try {
27-
o = s
28-
} catch (c) {
29-
n = document.domain, r.src = 'javascript:var d=document.open();d.domain="' + n + '";void(0);', o = s
30-
}
31-
o.open()._l = function() {
32-
var o = this.createElement("script");
33-
n && (this.domain = n), o.id = "js-iframe-async", o.src = e, this.t = +new Date, this.zendeskHost = t, this.zEQueue = a, this.body.appendChild(o)
34-
}, o.write('<body onload="document._l();">'), o.close()
35-
}("https://assets.zendesk.com/embeddable_framework/main.js", zendeskWidgetSettings.accountUrl);
36-
37-
/*eslint-enable */
38-
39-
$window.zE(function() {
40-
zendeskWidgetSettings.beforePageLoad($window.zE);
41-
});
42-
}
43-
]);
3+
angular.module('zendeskWidget', []);
444

455
})(angular);
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
(function(angular) {
2+
3+
angular.module('zendeskWidget')
4+
.run([
5+
'$window',
6+
'zendeskWidgetSettings',
7+
function($window, zendeskWidgetSettings) {
8+
if (!zendeskWidgetSettings.accountUrl) {
9+
throw new Error('Missing accountUrl. Please set in app config via ZendeskWidgetProvider');
10+
}
11+
12+
var window = $window;
13+
14+
// Following is essentially a copy paste of JS portion of the Zendesk embed code
15+
// with our settings subbed in. For more info, see:
16+
// https://support.zendesk.com/hc/en-us/articles/203908456-Using-Web-Widget-to-embed-customer-service-in-your-website
17+
18+
/*eslint-disable */
19+
20+
window.zEmbed || function(e, t) {
21+
var n, o, d, i, s, a = [],
22+
r = document.createElement("iframe");
23+
window.zEmbed = function() {
24+
a.push(arguments)
25+
}, window.zE = window.zE || window.zEmbed, r.src = "javascript:false", r.title = "", r.role = "presentation", (r.frameElement || r).style.cssText = "display: none", d = document.getElementsByTagName("script"), d = d[d.length - 1], d.parentNode.insertBefore(r, d), i = r.contentWindow, s = i.document;
26+
try {
27+
o = s
28+
} catch (c) {
29+
n = document.domain, r.src = 'javascript:var d=document.open();d.domain="' + n + '";void(0);', o = s
30+
}
31+
o.open()._l = function() {
32+
var o = this.createElement("script");
33+
n && (this.domain = n), o.id = "js-iframe-async", o.src = e, this.t = +new Date, this.zendeskHost = t, this.zEQueue = a, this.body.appendChild(o)
34+
}, o.write('<body onload="document._l();">'), o.close()
35+
}("https://assets.zendesk.com/embeddable_framework/main.js", zendeskWidgetSettings.accountUrl);
36+
37+
/*eslint-enable */
38+
39+
$window.zE(function() {
40+
zendeskWidgetSettings.beforePageLoad($window.zE);
41+
});
42+
}
43+
]);
44+
45+
})(angular);

test/integration/zendeskWidgetSpec.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
describe('zendeskWidget', function() {
2+
'use strict';
3+
4+
beforeEach(module('zendeskWidget'));
5+
6+
it('throws an error when `accountUrl` is blank', function() {
7+
expect(function() { inject() }).toThrowError(
8+
'Missing accountUrl. Please set in app config via ZendeskWidgetProvider'
9+
);
10+
});
11+
});

test/unit/angular-zendesk-widget/zendeskWidgetSpec.js

Lines changed: 0 additions & 16 deletions
This file was deleted.
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
describe('ZendeskWidgetProvider', function() {
2+
'use strict';
3+
4+
var subject, mockService, $window;
5+
6+
beforeEach(module('zendeskWidget'));
7+
beforeEach(inject(function(_$window_, _ZendeskWidget_) {
8+
subject = _ZendeskWidget_;
9+
$window = _$window_;
10+
}));
11+
12+
describe('a set of API methods', function() {
13+
beforeEach(function() {
14+
var apiMethods = ['setLocale', 'identify', 'hide', 'show', 'activate'];
15+
mockService = jasmine.createSpyObj('MockZendeskWebWidgetAPI', apiMethods);
16+
$window.zE = mockService;
17+
});
18+
19+
it("delegates to Zendesk's Web Widget API", function() {
20+
var anyArgs = ['foo', 'bar', 'baz'];
21+
22+
subject.identify(anyArgs);
23+
subject.hide(anyArgs);
24+
subject.show(anyArgs);
25+
subject.activate(anyArgs);
26+
subject.setLocale(anyArgs);
27+
28+
expect(mockService.identify).toHaveBeenCalledWith(anyArgs);
29+
expect(mockService.hide).toHaveBeenCalledWith(anyArgs);
30+
expect(mockService.show).toHaveBeenCalledWith(anyArgs);
31+
expect(mockService.activate).toHaveBeenCalledWith(anyArgs);
32+
expect(mockService.setLocale).toHaveBeenCalledWith(anyArgs);
33+
});
34+
});
35+
})
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
describe('zendeskWidgetSettings', function() {
2+
'use strict';
3+
4+
var subject;
5+
6+
beforeEach(module('zendeskWidget'));
7+
beforeEach(inject(function(_zendeskWidgetSettings_) {
8+
subject = _zendeskWidgetSettings_;
9+
}));
10+
11+
describe('by default', function() {
12+
it('has a blank `accountUrl`', function() {
13+
expect(subject['accountUrl']).toEqual('');
14+
});
15+
16+
it('does a no-op on `beforePageLoad`', function() {
17+
expect(subject['beforePageLoad']).toEqual(angular.noop);
18+
});
19+
});
20+
})

0 commit comments

Comments
 (0)