Skip to content
This repository was archived by the owner on Mar 14, 2023. It is now read-only.

Commit ba4b4b7

Browse files
dougflipDoug DiFilippo
authored and
Doug DiFilippo
committed
Merge pull request #6 from dougflip/dd/component-helpers
Adds dngComponent to help bootstrap components
2 parents 7a9ae1d + 657412b commit ba4b4b7

File tree

8 files changed

+211
-48
lines changed

8 files changed

+211
-48
lines changed

dist/dng-test-utils.js

Lines changed: 66 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ module.exports =
4545
/* 0 */
4646
/***/ function(module, exports, __webpack_require__) {
4747

48-
"use strict";
48+
'use strict';
4949

5050
Object.defineProperty(exports, "__esModule", {
5151
value: true
@@ -59,7 +59,11 @@ module.exports =
5959

6060
var _dngDefer2 = _interopRequireDefault(_dngDefer);
6161

62-
var _dngModule = __webpack_require__(3);
62+
var _dngComponent = __webpack_require__(3);
63+
64+
var _dngComponent2 = _interopRequireDefault(_dngComponent);
65+
66+
var _dngModule = __webpack_require__(4);
6367

6468
var _dngModule2 = _interopRequireDefault(_dngModule);
6569

@@ -68,14 +72,15 @@ module.exports =
6872
// FIXME: Is there any way around this?
6973
var ng = window.angular;
7074

71-
var dngTestModule = ng.module('dngTestUtils', []).factory('dngDefer', _dngDefer2.default).factory('dngNullMock', function () {
75+
var dngTestModule = ng.module('dngTestUtils', []).factory('dngDefer', _dngDefer2.default).factory('dngComponent', _dngComponent2.default).factory('dngNullMock', function () {
7276
return _dngNullMock2.default;
7377
});
7478

7579
exports.default = {
7680
name: dngTestModule.name,
7781
nullMock: _dngNullMock2.default,
78-
init: _dngModule2.default.init
82+
init: _dngModule2.default.init,
83+
initWithKarmaTemplates: _dngModule2.default.initWithKarmaTemplates
7984
};
8085

8186
/***/ },
@@ -180,6 +185,55 @@ module.exports =
180185

181186
/***/ },
182187
/* 3 */
188+
/***/ function(module, exports) {
189+
190+
"use strict";
191+
192+
Object.defineProperty(exports, "__esModule", {
193+
value: true
194+
});
195+
var angular = window.angular;
196+
197+
exports.default = function ($rootScope, $compile) {
198+
function digest(fn) {
199+
fn();
200+
$rootScope.$digest();
201+
}
202+
203+
function createScope() {
204+
var bindings = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
205+
206+
var scope = $rootScope.$new();
207+
return angular.extend(scope, bindings);
208+
}
209+
210+
function createWithScope(markup, scope) {
211+
var $el = $compile(angular.element(markup))(scope);
212+
$rootScope.$digest();
213+
return $el;
214+
}
215+
216+
function createWithBindings(markup, bindings) {
217+
var scope = createScope(bindings);
218+
var $el = createWithScope(markup, scope);
219+
return { $el: $el, scope: scope };
220+
}
221+
222+
function create(markup) {
223+
return createWithScope(markup, createScope());
224+
}
225+
226+
return {
227+
digest: digest,
228+
createScope: createScope,
229+
createWithScope: createWithScope,
230+
createWithBindings: createWithBindings,
231+
create: create
232+
};
233+
};
234+
235+
/***/ },
236+
/* 4 */
183237
/***/ function(module, exports) {
184238

185239
'use strict';
@@ -270,9 +324,16 @@ module.exports =
270324
return initAll([moduleUnderTestName], nullMocks, customMocks);
271325
};
272326

327+
var initWithKarmaTemplates = function initWithKarmaTemplates(moduleUnderTestName) {
328+
var nullMocks = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
329+
var customMocks = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
330+
return initAll([moduleUnderTestName, 'karmaTemplates'], nullMocks, customMocks);
331+
};
332+
273333
exports.default = {
274334
initAll: initAll,
275-
init: init
335+
init: init,
336+
initWithKarmaTemplates: initWithKarmaTemplates
276337
};
277338

278339
/***/ }

docs/dng-component.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
dngComponent
2+
==============
3+
4+
I'll add better documentation in the future, but at least wanted to have this file as a placeholder.
5+
Check out the [source](../src/dng-component.js) and the super basic test at the end of the
6+
[test file](../test/dng-test-utils_test.js).

package.json

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,14 @@
11
{
22
"name": "dng-test-utils",
3-
"version": "1.1.1",
3+
"version": "1.2.0",
44
"description": "Angular Test Utilities",
55
"main": "dist/dng-test-utils.js",
66
"scripts": {
77
"test": "karma start",
88
"build": "webpack",
99
"prepublish": "npm run build"
1010
},
11-
"keywords": [
12-
"Angular",
13-
"Unit-Test",
14-
"Karma"
15-
],
11+
"keywords": ["Angular", "Unit-Test", "Karma"],
1612
"author": "dougflip <douglasdifilippo@gmail.com>",
1713
"license": "MIT",
1814
"devDependencies": {

src/dng-component.js

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
const angular = window.angular;
2+
3+
export default ($rootScope, $compile) => {
4+
function digest(fn) {
5+
fn();
6+
$rootScope.$digest();
7+
}
8+
9+
function createScope(bindings = {}) {
10+
const scope = $rootScope.$new();
11+
return angular.extend(scope, bindings);
12+
}
13+
14+
function createWithScope(markup, scope) {
15+
const $el = $compile(angular.element(markup))(scope);
16+
$rootScope.$digest();
17+
const isolateScope = $el.isolateScope();
18+
return { $el, scope, isolateScope };
19+
}
20+
21+
function createWithBindings(markup, bindings) {
22+
return createWithScope(markup, createScope(bindings));
23+
}
24+
25+
function create(markup) {
26+
return createWithScope(markup, createScope());
27+
}
28+
29+
return {
30+
digest,
31+
createScope,
32+
createWithScope,
33+
createWithBindings,
34+
create,
35+
};
36+
};

src/dng-module.js

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,19 @@ const ngMock = window.angular.mock;
1616
* without the need to inject `dngMocks` everywhere.
1717
*/
1818
const createDngMocks = (nullMocks, customMocks) => $injector => {
19-
return angular.extend({},
19+
return angular.extend(
20+
{},
2021
customMocks,
21-
nullMocks.reduce((acc, x) => angular.extend({
22-
[x]: $injector.get(x)
23-
}, acc), {})
22+
nullMocks.reduce(
23+
(acc, x) =>
24+
angular.extend(
25+
{
26+
[x]: $injector.get(x),
27+
},
28+
acc
29+
),
30+
{}
31+
)
2432
);
2533
};
2634

@@ -32,7 +40,8 @@ const createDngMocks = (nullMocks, customMocks) => $injector => {
3240
* NOTE: You should use this OR register dngTestUtils by hand.
3341
*/
3442
const createTestModule = (deps, nullMocks = [], customMocks = {}) => {
35-
return angular.module('dngTestUtils.module', deps.concat('dngTestUtils'))
43+
return angular
44+
.module('dngTestUtils.module', deps.concat('dngTestUtils'))
3645
.factory('dngMocks', createDngMocks(nullMocks, customMocks));
3746
};
3847

@@ -50,20 +59,24 @@ const registerAll = (deps, nullMocks, customMocks = {}) => {
5059
ngMock.module(testMod.name);
5160

5261
// register customMocks (those that aren't nullMocked but need to exist)
53-
ngMock.module(customMocks)
54-
}
62+
ngMock.module(customMocks);
63+
};
5564

5665
/**
5766
* Convenience wrapper over `register` to return it as a function.
5867
* This is nice when using in `beforeEach` calls that expect a function.
5968
*/
60-
const initAll = (deps, nullMocks = [], customMocks = {}) =>
61-
() => registerAll(deps, nullMocks, customMocks);
69+
const initAll = (deps, nullMocks = [], customMocks = {}) => () =>
70+
registerAll(deps, nullMocks, customMocks);
6271

6372
const init = (moduleUnderTestName, nullMocks = [], customMocks = {}) =>
6473
initAll([moduleUnderTestName], nullMocks, customMocks);
6574

75+
const initWithKarmaTemplates = (moduleUnderTestName, nullMocks = [], customMocks = {}) =>
76+
initAll([moduleUnderTestName, 'karmaTemplates'], nullMocks, customMocks);
77+
6678
export default {
6779
initAll,
68-
init
69-
}
80+
init,
81+
initWithKarmaTemplates,
82+
};

src/dng-test-utils.js

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,20 @@
1-
import nullMock from "./dng-null-mock";
2-
import promiseGenerator from "./dng-defer";
1+
import nullMock from './dng-null-mock';
2+
import promiseGenerator from './dng-defer';
3+
import dngComponent from './dng-component';
34
import dngModule from './dng-module';
45

56
// FIXME: Is there any way around this?
67
const ng = window.angular;
78

8-
const dngTestModule = ng.module('dngTestUtils', [])
9+
const dngTestModule = ng
10+
.module('dngTestUtils', [])
911
.factory('dngDefer', promiseGenerator)
12+
.factory('dngComponent', dngComponent)
1013
.factory('dngNullMock', () => nullMock);
1114

1215
export default {
1316
name: dngTestModule.name,
1417
nullMock: nullMock,
15-
init: dngModule.init
16-
}
18+
init: dngModule.init,
19+
initWithKarmaTemplates: dngModule.initWithKarmaTemplates,
20+
};

test/dng-test-utils_test.js

Lines changed: 53 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ describe('DngTestUtils', () => {
2222
* This is essentially forwarded to angular.mock.module
2323
*/
2424
const customMocks = {
25-
customDependency: jasmine.createSpyObj('localDep', ['methodName'])
25+
customDependency: jasmine.createSpyObj('localDep', ['methodName']),
2626
};
2727

2828
/**
@@ -34,9 +34,11 @@ describe('DngTestUtils', () => {
3434
* You probably won't need to do module stuff anymore
3535
* But this is here just to ensure it works in case it is needed.
3636
*/
37-
beforeEach(ngMock.module($provide => {
38-
// just making sure this is available if needed...
39-
}));
37+
beforeEach(
38+
ngMock.module($provide => {
39+
// just making sure this is available if needed...
40+
})
41+
);
4042

4143
/**
4244
* The call to `dngTestUtils.init` creates a new injectable named `dngMocks`.
@@ -45,7 +47,7 @@ describe('DngTestUtils', () => {
4547
* in the specific places where you need it.
4648
* We'll alias in this example.
4749
*/
48-
beforeEach(ngMock.inject(dngMocks => sutMocks = dngMocks));
50+
beforeEach(ngMock.inject(dngMocks => (sutMocks = dngMocks)));
4951

5052
/**
5153
* Verify that `dngMocks` (aliased to sutMocks in this test) has BOTH null mocks
@@ -65,9 +67,11 @@ describe('DngTestUtils', () => {
6567
describe('defer', () => {
6668
let deferred;
6769

68-
beforeEach(ngMock.inject(dngDefer => {
69-
deferred = dngDefer.defer();
70-
}));
70+
beforeEach(
71+
ngMock.inject(dngDefer => {
72+
deferred = dngDefer.defer();
73+
})
74+
);
7175

7276
it('should create a deferred which can be resolved', done => {
7377
deferred.promise.then(x => {
@@ -89,9 +93,11 @@ describe('DngTestUtils', () => {
8993
describe('deferSpy', () => {
9094
let promiseToSquare;
9195

92-
beforeEach(ngMock.inject(dngDefer => {
93-
promiseToSquare = dngDefer.deferSpy(sutMocks.promiseMath.promiseToSquare);
94-
}));
96+
beforeEach(
97+
ngMock.inject(dngDefer => {
98+
promiseToSquare = dngDefer.deferSpy(sutMocks.promiseMath.promiseToSquare);
99+
})
100+
);
95101

96102
it('should create a deferred which can be resolved', done => {
97103
sutMocks.promiseMath.promiseToSquare().then(x => {
@@ -114,10 +120,12 @@ describe('DngTestUtils', () => {
114120
let modalSpy;
115121
let modalDeferred;
116122

117-
beforeEach(ngMock.inject(dngDefer => {
118-
modalSpy = jasmine.createSpyObj('modalSpy', ['open']);
119-
modalDeferred = dngDefer.deferSpyWithResult(modalSpy.open);
120-
}));
123+
beforeEach(
124+
ngMock.inject(dngDefer => {
125+
modalSpy = jasmine.createSpyObj('modalSpy', ['open']);
126+
modalDeferred = dngDefer.deferSpyWithResult(modalSpy.open);
127+
})
128+
);
121129

122130
it('should create a deferred under a "result" property which can be resolved', done => {
123131
modalSpy.open().result.then(x => {
@@ -136,4 +144,34 @@ describe('DngTestUtils', () => {
136144
});
137145
});
138146
});
147+
148+
/**
149+
* Very basic example of creating a component with bindings in order to inspect the HTML.
150+
* I'll add more eventually, but wanted at least something basic to get this out.
151+
* See [dng-component](../src/dng-component) for the full API
152+
*/
153+
describe('dngComponent', () => {
154+
let $el;
155+
let scope;
156+
let isolateScope;
157+
let digest;
158+
159+
beforeEach(
160+
ngMock.inject(dngComponent => {
161+
digest = dngComponent.digest;
162+
const bindings = { name: 'World' };
163+
const markup = `<say-hello name="name"></say-hello>`;
164+
({ $el, scope, isolateScope } = dngComponent.createWithBindings(markup, bindings));
165+
})
166+
);
167+
168+
it('should properly create the component', () => {
169+
expect($el.text()).toContain('Hello World!');
170+
});
171+
172+
it('should provide a digest helper to test updates', () => {
173+
digest(() => (scope.name = 'Angular'));
174+
expect($el.text()).toContain('Hello Angular!');
175+
});
176+
});
139177
});

0 commit comments

Comments
 (0)