2014-09-30 14:56:33 -04:00
|
|
|
import {ddescribe, describe, it, iit, xit, expect, beforeEach} from 'test_lib/test_lib';
|
2014-10-10 15:44:56 -04:00
|
|
|
import {Injector, Inject, InjectPromise, bind, Key} from 'di/di';
|
2015-02-02 19:25:34 -05:00
|
|
|
import {Promise, PromiseWrapper} from 'facade/src/async';
|
2014-09-30 14:56:33 -04:00
|
|
|
|
2014-10-07 10:34:07 -04:00
|
|
|
class UserList {
|
|
|
|
}
|
2014-09-30 14:56:33 -04:00
|
|
|
|
|
|
|
function fetchUsers() {
|
2014-10-10 15:44:56 -04:00
|
|
|
return PromiseWrapper.resolve(new UserList());
|
2014-09-30 14:56:33 -04:00
|
|
|
}
|
|
|
|
|
2014-10-07 10:34:07 -04:00
|
|
|
class SynchronousUserList {
|
|
|
|
}
|
2014-09-30 14:56:33 -04:00
|
|
|
|
|
|
|
class UserController {
|
2014-11-22 00:19:23 -05:00
|
|
|
list:UserList;
|
2014-09-30 14:56:33 -04:00
|
|
|
constructor(list:UserList) {
|
|
|
|
this.list = list;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-10-05 16:25:42 -04:00
|
|
|
class AsyncUserController {
|
2014-11-22 00:19:23 -05:00
|
|
|
userList;
|
2014-10-10 15:44:56 -04:00
|
|
|
constructor(@InjectPromise(UserList) userList) {
|
2014-10-05 16:25:42 -04:00
|
|
|
this.userList = userList;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-10-07 10:34:07 -04:00
|
|
|
export function main() {
|
2014-09-30 14:56:33 -04:00
|
|
|
describe("async injection", function () {
|
|
|
|
|
2014-10-05 16:25:42 -04:00
|
|
|
describe("asyncGet", function () {
|
2014-10-10 15:44:56 -04:00
|
|
|
it('should return a promise', function () {
|
2014-10-05 16:25:42 -04:00
|
|
|
var injector = new Injector([
|
2014-10-09 11:35:13 -04:00
|
|
|
bind(UserList).toAsyncFactory(fetchUsers)
|
2014-10-05 16:25:42 -04:00
|
|
|
]);
|
|
|
|
var p = injector.asyncGet(UserList);
|
2014-10-10 15:44:56 -04:00
|
|
|
expect(p).toBePromise();
|
2014-10-05 16:25:42 -04:00
|
|
|
});
|
2014-09-30 14:56:33 -04:00
|
|
|
|
2014-10-10 15:44:56 -04:00
|
|
|
it('should return a promise when the binding is sync', function () {
|
2014-10-05 16:25:42 -04:00
|
|
|
var injector = new Injector([
|
|
|
|
SynchronousUserList
|
|
|
|
]);
|
|
|
|
var p = injector.asyncGet(SynchronousUserList);
|
2014-10-10 15:44:56 -04:00
|
|
|
expect(p).toBePromise();
|
2014-10-05 16:25:42 -04:00
|
|
|
});
|
2014-09-30 14:56:33 -04:00
|
|
|
|
2014-10-10 15:44:56 -04:00
|
|
|
it("should return a promise when the binding is sync (from cache)", function () {
|
2014-10-07 10:42:27 -04:00
|
|
|
var injector = new Injector([
|
|
|
|
UserList
|
|
|
|
]);
|
|
|
|
expect(injector.get(UserList)).toBeAnInstanceOf(UserList);
|
2014-10-10 15:44:56 -04:00
|
|
|
expect(injector.asyncGet(UserList)).toBePromise();
|
2014-10-07 10:42:27 -04:00
|
|
|
});
|
|
|
|
|
2014-10-07 10:34:07 -04:00
|
|
|
it('should return the injector', function (done) {
|
2014-10-05 16:25:42 -04:00
|
|
|
var injector = new Injector([]);
|
|
|
|
var p = injector.asyncGet(Injector);
|
2014-10-07 10:34:07 -04:00
|
|
|
p.then(function (injector) {
|
2014-10-07 10:03:06 -04:00
|
|
|
expect(injector).toBe(injector);
|
|
|
|
done();
|
|
|
|
});
|
2014-10-05 16:25:42 -04:00
|
|
|
});
|
|
|
|
|
2014-10-10 15:44:56 -04:00
|
|
|
it('should return a promise when instantiating a sync binding ' +
|
2014-10-07 10:34:07 -04:00
|
|
|
'with an async dependency', function (done) {
|
2014-10-05 16:25:42 -04:00
|
|
|
var injector = new Injector([
|
2014-10-09 11:35:13 -04:00
|
|
|
bind(UserList).toAsyncFactory(fetchUsers),
|
2014-10-05 16:25:42 -04:00
|
|
|
UserController
|
|
|
|
]);
|
2014-09-30 14:56:33 -04:00
|
|
|
|
2014-10-07 10:34:07 -04:00
|
|
|
injector.asyncGet(UserController).then(function (userController) {
|
2014-10-05 16:25:42 -04:00
|
|
|
expect(userController).toBeAnInstanceOf(UserController);
|
|
|
|
expect(userController.list).toBeAnInstanceOf(UserList);
|
|
|
|
done();
|
|
|
|
});
|
|
|
|
});
|
2014-10-06 11:36:22 -04:00
|
|
|
|
|
|
|
it("should create only one instance (async + async)", function (done) {
|
|
|
|
var injector = new Injector([
|
2014-10-09 11:35:13 -04:00
|
|
|
bind(UserList).toAsyncFactory(fetchUsers)
|
2014-10-06 11:36:22 -04:00
|
|
|
]);
|
|
|
|
|
|
|
|
var ul1 = injector.asyncGet(UserList);
|
|
|
|
var ul2 = injector.asyncGet(UserList);
|
|
|
|
|
2014-10-10 15:44:56 -04:00
|
|
|
PromiseWrapper.all([ul1, ul2]).then(function (uls) {
|
2014-10-06 11:36:22 -04:00
|
|
|
expect(uls[0]).toBe(uls[1]);
|
|
|
|
done();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
it("should create only one instance (sync + async)", function (done) {
|
|
|
|
var injector = new Injector([
|
|
|
|
UserList
|
|
|
|
]);
|
|
|
|
|
2014-10-10 15:44:56 -04:00
|
|
|
var promise = injector.asyncGet(UserList);
|
2014-10-06 11:36:22 -04:00
|
|
|
var ul = injector.get(UserList);
|
|
|
|
|
2014-10-10 15:44:56 -04:00
|
|
|
expect(promise).toBePromise();
|
2014-10-06 11:36:22 -04:00
|
|
|
expect(ul).toBeAnInstanceOf(UserList);
|
|
|
|
|
2014-10-10 15:44:56 -04:00
|
|
|
promise.then(function (ful) {
|
2014-10-06 11:36:22 -04:00
|
|
|
expect(ful).toBe(ul);
|
|
|
|
done();
|
|
|
|
});
|
|
|
|
});
|
2014-10-07 09:04:11 -04:00
|
|
|
|
2014-10-07 10:34:07 -04:00
|
|
|
it('should show the full path when error happens in a constructor', function (done) {
|
2014-10-07 09:04:11 -04:00
|
|
|
var injector = new Injector([
|
|
|
|
UserController,
|
2014-10-09 11:35:13 -04:00
|
|
|
bind(UserList).toAsyncFactory(function () {
|
2014-10-07 10:34:07 -04:00
|
|
|
throw "Broken UserList";
|
|
|
|
})
|
2014-10-07 09:04:11 -04:00
|
|
|
]);
|
|
|
|
|
2014-10-10 15:44:56 -04:00
|
|
|
var promise = injector.asyncGet(UserController);
|
|
|
|
PromiseWrapper.then(promise, null, function (e) {
|
2014-10-07 09:04:11 -04:00
|
|
|
expect(e.message).toContain("Error during instantiation of UserList! (UserController -> UserList)");
|
|
|
|
done();
|
|
|
|
});
|
|
|
|
});
|
2014-09-30 14:56:33 -04:00
|
|
|
});
|
|
|
|
|
2014-10-05 16:25:42 -04:00
|
|
|
describe("get", function () {
|
2014-10-07 10:34:07 -04:00
|
|
|
it('should throw when instantiating an async binding', function () {
|
2014-10-05 16:25:42 -04:00
|
|
|
var injector = new Injector([
|
2014-10-09 11:35:13 -04:00
|
|
|
bind(UserList).toAsyncFactory(fetchUsers)
|
2014-10-05 16:25:42 -04:00
|
|
|
]);
|
2014-09-30 14:56:33 -04:00
|
|
|
|
2014-10-05 16:25:42 -04:00
|
|
|
expect(() => injector.get(UserList))
|
2014-10-10 15:44:56 -04:00
|
|
|
.toThrowError('Cannot instantiate UserList synchronously. It is provided as a promise!');
|
2014-09-30 14:56:33 -04:00
|
|
|
});
|
|
|
|
|
2014-10-07 10:34:07 -04:00
|
|
|
it('should throw when instantiating a sync binding with an dependency', function () {
|
2014-10-05 16:25:42 -04:00
|
|
|
var injector = new Injector([
|
2014-10-09 11:35:13 -04:00
|
|
|
bind(UserList).toAsyncFactory(fetchUsers),
|
2014-10-05 16:25:42 -04:00
|
|
|
UserController
|
|
|
|
]);
|
|
|
|
|
|
|
|
expect(() => injector.get(UserController))
|
2014-10-10 15:44:56 -04:00
|
|
|
.toThrowError('Cannot instantiate UserList synchronously. It is provided as a promise! (UserController -> UserList)');
|
2014-10-05 16:25:42 -04:00
|
|
|
});
|
|
|
|
|
2014-10-10 15:44:56 -04:00
|
|
|
it('should resolve synchronously when an async dependency requested as a promise', function () {
|
2014-10-05 16:25:42 -04:00
|
|
|
var injector = new Injector([
|
2014-10-09 11:35:13 -04:00
|
|
|
bind(UserList).toAsyncFactory(fetchUsers),
|
2014-10-05 16:25:42 -04:00
|
|
|
AsyncUserController
|
|
|
|
]);
|
|
|
|
var controller = injector.get(AsyncUserController);
|
2014-09-30 14:56:33 -04:00
|
|
|
|
2014-10-05 16:25:42 -04:00
|
|
|
expect(controller).toBeAnInstanceOf(AsyncUserController);
|
2014-10-10 15:44:56 -04:00
|
|
|
expect(controller.userList).toBePromise();
|
2014-10-05 16:25:42 -04:00
|
|
|
});
|
|
|
|
|
2014-10-10 15:44:56 -04:00
|
|
|
it('should wrap sync dependencies into promises if required', function () {
|
2014-10-05 16:25:42 -04:00
|
|
|
var injector = new Injector([
|
2014-10-09 11:35:13 -04:00
|
|
|
bind(UserList).toFactory(() => new UserList()),
|
2014-10-05 16:25:42 -04:00
|
|
|
AsyncUserController
|
|
|
|
]);
|
|
|
|
var controller = injector.get(AsyncUserController);
|
|
|
|
|
|
|
|
expect(controller).toBeAnInstanceOf(AsyncUserController);
|
2014-10-10 15:44:56 -04:00
|
|
|
expect(controller.userList).toBePromise();
|
2014-10-05 16:25:42 -04:00
|
|
|
});
|
2014-09-30 14:56:33 -04:00
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|