Skip to content
This repository was archived by the owner on Feb 24, 2018. It is now read-only.

Commit a3bda93

Browse files
committed
Mock out project deps for more trustworthy coverage
And simplify module mocking.
1 parent 892f5a8 commit a3bda93

File tree

3 files changed

+79
-39
lines changed

3 files changed

+79
-39
lines changed

src/CognitoUser.authenticateUser.test.js

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,10 +183,50 @@ function hexToBase64(hex) {
183183
return sjcl.codec.base64.fromBits(sjcl.codec.hex.toBits(hex));
184184
}
185185

186+
class MockResultBase {
187+
constructor(...params) {
188+
this.params = params;
189+
}
190+
}
191+
192+
class MockCognitoTokenBase extends MockResultBase {}
193+
class MockCognitoAccessToken extends MockCognitoTokenBase {
194+
getJwtToken() {
195+
return this.params[0].AccessToken;
196+
}
197+
}
198+
class MockCognitoIdToken extends MockCognitoTokenBase {
199+
getJwtToken() {
200+
return this.params[0].IdToken;
201+
}
202+
}
203+
class MockCognitoRefreshToken extends MockCognitoTokenBase {
204+
getToken() {
205+
return this.params[0].RefreshToken;
206+
}
207+
}
208+
class MockCognitoUserSession extends MockResultBase {
209+
getAccessToken() {
210+
return this.params[0].AccessToken;
211+
}
212+
213+
getIdToken() {
214+
return this.params[0].IdToken;
215+
}
216+
217+
getRefreshToken() {
218+
return this.params[0].RefreshToken;
219+
}
220+
}
221+
186222
function createUser({ pool = new MockUserPool() } = {}, ...requestConfigs) {
187223
pool.client = new MockClient(...requestConfigs); // eslint-disable-line no-param-reassign
188224
const CognitoUser = requireDefaultWithModuleMocks('./CognitoUser', {
189225
'./AuthenticationHelper': MockAuthenticationHelper,
226+
'./CognitoAccessToken': MockCognitoAccessToken,
227+
'./CognitoIdToken': MockCognitoIdToken,
228+
'./CognitoRefreshToken': MockCognitoRefreshToken,
229+
'./CognitoUserSession': MockCognitoUserSession,
190230
'./DateHelper': MockDateHelper,
191231
});
192232
return new CognitoUser({ Username: constructorUsername, Pool: pool });

src/CognitoUser.test.js

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -56,16 +56,18 @@ class MockSession {
5656
}
5757
}
5858

59-
function createUser({ pool = new MockUserPool(), session } = {}, ...requestConfigs) {
59+
function createUser({ pool = new MockUserPool(), session, mocks } = {}, ...requestConfigs) {
6060
pool.client = new MockClient(...requestConfigs); // eslint-disable-line no-param-reassign
61-
const CognitoUser = requireDefaultWithModuleMocks('./CognitoUser', {
62-
// Nothing yet
63-
});
61+
const CognitoUser = requireDefaultWithModuleMocks('./CognitoUser', mocks);
6462
const user = new CognitoUser({ Username, Pool: pool });
6563
user.signInUserSession = session;
6664
return user;
6765
}
6866

67+
function createSignedInUserWithMocks(mocks, ...requests) {
68+
return createUser({ session: new MockSession(), mocks }, ...requests);
69+
}
70+
6971
function createSignedInUser(...requests) {
7072
return createUser({ session: new MockSession() }, ...requests);
7173
}
@@ -249,15 +251,26 @@ test.cb(updateAttributesMacro, false);
249251
test.cb(updateAttributesMacro, true);
250252

251253
function getUserAttributesMacro(t, succeeds) {
254+
class MockCognitoUserAttribute {
255+
constructor(...params) {
256+
this.params = params;
257+
}
258+
}
259+
252260
const expectedError = createExpectedErrorFromSuccess(succeeds);
253261
const responseResult = succeeds ? { UserAttributes: attributes } : null;
254-
const user = createSignedInUser([expectedError, responseResult]);
262+
263+
const user = createSignedInUserWithMocks(
264+
{
265+
'./CognitoUserAttribute': MockCognitoUserAttribute,
266+
},
267+
[expectedError, responseResult]);
255268

256269
user.getUserAttributes((err, result) => {
257270
t.is(err, expectedError);
258271
if (succeeds) {
259-
// Only check for Name, Value properties, don't assert the results are CognitoUserAttributes.
260-
t.deepEqual(result.map(({ Name, Value }) => ({ Name, Value })), attributes);
272+
t.true(Array.isArray(result) && result.every(i => i instanceof MockCognitoUserAttribute));
273+
t.deepEqual(result.map(i => i.params[0]), attributes);
261274
} else {
262275
t.falsy(result);
263276
}

src/_helpers.test.js

Lines changed: 19 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import test from 'ava';
44
import { stub } from 'sinon';
5-
import mockRequire from 'mock-require';
5+
import mockRequire, { reRequire } from 'mock-require';
66

77
export class MockClient {
88
constructor(...requestConfigs) {
@@ -80,42 +80,29 @@ test.afterEach.always(t => {
8080
delete global.window;
8181
});
8282

83-
function shouldMock(path) {
84-
return path.startsWith(__dirname) && !path.endsWith('.test.js');
85-
}
83+
const defaultMocks = {
84+
'aws-sdk/clients/cognitoidentityserviceprovider': MockClient,
85+
'./AuthenticationDetails': null,
86+
'./AuthenticationHelper': null,
87+
'./CognitoAccessToken': null,
88+
'./CognitoIdToken': null,
89+
'./CognitoRefreshToken': null,
90+
'./CognitoUser': null,
91+
'./CognitoUserAttribute': null,
92+
'./CognitoUserPool': null,
93+
'./CognitoUserSession': null,
94+
'./DateHelper': null,
95+
};
8696

8797
function requireWithModuleMocks(request, moduleMocks = {}) {
88-
const unmockedCache = Object.create(null);
89-
90-
// Remove require.cache entries that may be using the unmocked modules
91-
Object.keys(require.cache).forEach(path => {
92-
if (shouldMock(path)) {
93-
delete require.cache[path];
94-
}
95-
});
96-
97-
// Always mock AWS SDK
98-
mockRequire('aws-sdk/clients/cognitoidentityserviceprovider', MockClient);
99-
100-
// Mock other modules
101-
Object.keys(moduleMocks).forEach(name => {
102-
mockRequire(name, moduleMocks[name]);
103-
});
104-
105-
const mockedModule = require(request);
106-
107-
// Restore require.cache to previous state
108-
Object.keys(require.cache).forEach(path => {
109-
if (shouldMock(path)) {
110-
if (Object.prototype.hasOwnProperty.call(unmockedCache, path)) {
111-
require.cache[path] = unmockedCache[path];
112-
} else {
113-
delete require.cache[path];
114-
}
98+
const allModuleMocks = Object.assign({}, defaultMocks, moduleMocks);
99+
Object.keys(allModuleMocks).forEach(mockRequest => {
100+
if (mockRequest !== request) {
101+
mockRequire(mockRequest, allModuleMocks[mockRequest]);
115102
}
116103
});
117104

118-
return mockedModule;
105+
return reRequire(request);
119106
}
120107

121108
export function requireDefaultWithModuleMocks(request, moduleMocks) {

0 commit comments

Comments
 (0)