Simon Hunt

GUI - Angular:: Example unit test for custom filter.

Change-Id: I82863bebe2f9e89097f2d2cedcc866cb884e304d
1 +// ch09-01-time-ago.js
2 +
3 +angular.module('filterApp', [])
4 + .filter('timeAgo', [function () {
5 + var _m = 1000 * 60,
6 + _h = _m * 60,
7 + _d = _h * 24,
8 + _mon = _d * 30;
9 +
10 + return function (ts, ignoreSecs) {
11 + var showSecs = !ignoreSecs,
12 + now = new Date().getTime(),
13 + diff = now - ts;
14 +
15 + if (diff < _m && showSecs) {
16 + return 'seconds ago';
17 + } else if (diff < _h) {
18 + return 'minutes ago';
19 + } else if (diff < _d) {
20 + return 'hours ago';
21 + } else if (diff < _mon) {
22 + return 'days ago';
23 + } else {
24 + return 'months ago';
25 + }
26 + }
27 + }]);
1 +// ch09-01-time-agoSpec.js
2 +
3 +describe('timeAgo Filter', function () {
4 + beforeEach(module('filterApp'));
5 +
6 + var filter;
7 + beforeEach(inject(function (timeAgoFilter) {
8 + filter = timeAgoFilter;
9 + }));
10 +
11 + it('should respond based on timestamp', function() {
12 + // The presence of new Date().getTime() makes it slightly
13 + // hard to unit test deterministically.
14 + // Ideally, we would inject a dateProvider into the timeAgo
15 + // filter, but we are trying to keep it simple for now.
16 + // So, we assume that our tests are fast enough to execute
17 + // in mere milliseconds.
18 +
19 + var t = new Date().getTime();
20 + t -= 10000;
21 + expect(filter(t)).toEqual('seconds ago');
22 + expect(filter(t, true)).toEqual('minutes ago');
23 +
24 + var fmin = t - 1000 * 60;
25 + expect(filter(fmin)).toEqual('minutes ago');
26 + expect(filter(fmin, true)).toEqual('minutes ago');
27 +
28 + var fhour = t - 1000 * 60 * 68;
29 + expect(filter(fhour)).toEqual('hours ago');
30 + expect(filter(fhour, true)).toEqual('hours ago');
31 +
32 + var fday = t - 1000 * 60 * 60 * 26;
33 + expect(filter(fday)).toEqual('days ago');
34 + expect(filter(fday, true)).toEqual('days ago');
35 +
36 + var fmon = t - 1000 * 60 * 60 * 24 * 34;
37 + expect(filter(fmon)).toEqual('months ago');
38 + expect(filter(fmon, true)).toEqual('months ago');
39 + });
40 +});