Update test specs to use Jasmine 3 (#2089)

* Updated Karma and Jasmine versions

* Added DOMObserver class. Supports promise-based testing of DOM changes

Update asynchronous test specs to use promises or done() instead of waitsFor/runs

* Modified ActionCapability to duplicate context object properties as own properties for better object equality comparisons

* Global find + replace to fix syntax issues

* Fixed various issues caused by non-deterministic runtime order of tests in Jasmine 3. Fixed issues caused by changes to determination of object equality

* Addressed review comments

* Resolved merge conflicts with master

* Fixed style errors

* Use spy.calls.count() instead of manually tracking
This commit is contained in:
Andrew Henry
2018-06-29 17:32:59 -07:00
committed by Pete Richards
parent 013eba744d
commit 433dee0314
305 changed files with 2866 additions and 3324 deletions

View File

@@ -28,14 +28,9 @@ define(
var mockProviders,
mockQ,
resolves,
mockCallback,
testUsers,
aggregator;
function callbackCalled() {
return mockCallback.calls.length > 0;
}
function resolveProviderPromises() {
['a', 'b', 'c'].forEach(function (id, i) {
resolves[id](testUsers[i]);
@@ -57,7 +52,7 @@ define(
['getUser']
);
mockProvider.getUser.andReturn(new Promise(function (r) {
mockProvider.getUser.and.returnValue(new Promise(function (r) {
resolves[id] = r;
}));
@@ -65,12 +60,10 @@ define(
});
mockQ = jasmine.createSpyObj('$q', ['all']);
mockQ.all.andCallFake(function (promises) {
mockQ.all.and.callFake(function (promises) {
return Promise.all(promises);
});
mockCallback = jasmine.createSpy('callback');
aggregator = new IdentityAggregator(
mockQ,
mockProviders
@@ -91,47 +84,44 @@ define(
});
it("returns the first result when it is defined", function () {
aggregator.getUser().then(mockCallback);
var promise = aggregator.getUser();
resolveProviderPromises();
waitsFor(callbackCalled);
runs(function () {
expect(mockCallback).toHaveBeenCalledWith(testUsers[0]);
return promise.then(function (user) {
expect(user).toEqual(testUsers[0]);
});
});
it("returns a later result when earlier results are undefined", function () {
testUsers[0] = undefined;
aggregator.getUser().then(mockCallback);
var promise = aggregator.getUser();
resolveProviderPromises();
waitsFor(callbackCalled);
runs(function () {
expect(mockCallback).toHaveBeenCalledWith(testUsers[1]);
return promise.then(function (user) {
expect(user).toEqual(testUsers[1]);
});
});
it("returns undefined when no providers expose users", function () {
testUsers = [undefined, undefined, undefined];
aggregator.getUser().then(mockCallback);
var promise = aggregator.getUser();
resolveProviderPromises();
waitsFor(callbackCalled);
runs(function () {
expect(mockCallback).toHaveBeenCalledWith(undefined);
return promise.then(function (user) {
expect(user).toBe(undefined);
});
});
it("returns undefined when there are no providers", function () {
new IdentityAggregator(mockQ, []).getUser().then(mockCallback);
waitsFor(callbackCalled);
runs(function () {
expect(mockCallback).toHaveBeenCalledWith(undefined);
var promise = new IdentityAggregator(mockQ, []).getUser();
return promise.then(function (user) {
expect(user).toBe(undefined);
});
});

View File

@@ -32,15 +32,9 @@ define(
mockCreationService,
mockParent,
mockCreatedObject,
mockCallback,
decorator;
function calledBack() {
return mockCallback.calls.length > 0;
}
beforeEach(function () {
mockCallback = jasmine.createSpy('callback');
mockIdentityService = jasmine.createSpyObj(
'identityService',
['getUser']
@@ -58,10 +52,10 @@ define(
['getCapability', 'getId', 'getModel', 'hasCapability', 'useCapability']
);
mockCreationService.createObject
.andReturn(Promise.resolve(mockCreatedObject));
.and.returnValue(Promise.resolve(mockCreatedObject));
mockIdentityService.getUser
.andReturn(Promise.resolve({ key: "test-user-id" }));
mockParent.getId.andReturn('test-id');
.and.returnValue(Promise.resolve({ key: "test-user-id" }));
mockParent.getId.and.returnValue('test-id');
decorator = new IdentityCreationDecorator(
mockIdentityService,
mockCreationService
@@ -71,33 +65,27 @@ define(
it("delegates to its decorated service when identity is available", function () {
var testModel = { someKey: "some value" };
decorator.createObject(testModel, mockParent)
.then(mockCallback);
waitsFor(calledBack);
runs(function () {
expect(mockCallback)
.toHaveBeenCalledWith(mockCreatedObject);
});
return decorator.createObject(testModel, mockParent)
.then(function (object) {
expect(object).toEqual(mockCreatedObject);
});
});
it("adds a creator property", function () {
var testModel = { someKey: "some value" };
decorator.createObject(testModel, mockParent)
.then(mockCallback);
return decorator.createObject(testModel, mockParent)
.then(function (object) {
expect(object)
.toEqual(mockCreatedObject);
waitsFor(calledBack);
runs(function () {
expect(mockCallback)
.toHaveBeenCalledWith(mockCreatedObject);
// Make sure arguments were delegated appropriately
expect(mockCreationService.createObject)
// Make sure arguments were delegated appropriately
expect(mockCreationService.createObject)
.toHaveBeenCalledWith(
{ someKey: "some value", creator: "test-user-id" },
mockParent
);
});
});
});
});

View File

@@ -36,13 +36,13 @@ define(
['getUser']
);
mockIdentityService.getUser.andReturn(mockPromise);
mockIdentityService.getUser.and.returnValue(mockPromise);
indicator = new IdentityIndicator(mockIdentityService);
});
it("shows information about the current user", function () {
mockPromise.then.mostRecentCall.args[0]({
mockPromise.then.calls.mostRecent().args[0]({
key: "testuserid",
name: "A User"
});
@@ -59,7 +59,7 @@ define(
});
it("shows nothing when there is no identity information", function () {
mockPromise.then.mostRecentCall.args[0](undefined);
mockPromise.then.calls.mostRecent().args[0](undefined);
expect(indicator.getCssClass()).toBeUndefined();
expect(indicator.getText()).toBeUndefined();
expect(indicator.getDescription()).toBeUndefined();

View File

@@ -28,16 +28,11 @@ define(
function (IdentityProvider) {
describe("IdentityProvider", function () {
var mockQ, mockCallback, provider;
function calledBack() {
return mockCallback.calls.length > 0;
}
var mockQ, provider;
beforeEach(function () {
mockCallback = jasmine.createSpy('callback');
mockQ = jasmine.createSpyObj('$q', ['when']);
mockQ.when.andCallFake(function (v) {
mockQ.when.and.callFake(function (v) {
return Promise.resolve(v);
});
@@ -45,11 +40,8 @@ define(
});
it("provides an undefined user", function () {
provider.getUser().then(mockCallback);
waitsFor(calledBack);
runs(function () {
expect(mockCallback).toHaveBeenCalledWith(undefined);
return provider.getUser().then(function (user) {
expect(user).toBe(undefined);
});
});