Skip to content

Commit 8faa5de

Browse files
authored
feat(sdk-middleware-auth): add request timeout for sdk-middleware-auth (#1716)
1 parent 1167644 commit 8faa5de

File tree

14 files changed

+457
-141
lines changed

14 files changed

+457
-141
lines changed

integration-tests/cli/personal-data-erasure.it.js

Lines changed: 43 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -106,18 +106,49 @@ describe('personal data erasure', () => {
106106
const data = await personalDataErasure.getCustomerData(customerId)
107107

108108
expect(data).toHaveLength(11)
109-
expect(data).toContainEqual(expect.objectContaining({type: 'CartCreated'}))
110-
expect(data).toContainEqual(expect.objectContaining({type: 'PaymentCreated'}))
111-
expect(data).toContainEqual(expect.objectContaining({type: 'CustomerCreated'}))
112-
expect(data).toContainEqual(expect.objectContaining({type: 'ReviewCreated'}))
113-
expect(data).toContainEqual(expect.objectContaining({type: 'OrderCreated'}))
114-
expect(data).toContainEqual(expect.objectContaining({type: 'CartCreated'}))
115-
expect(data).toContainEqual(expect.objectContaining({type: 'Order'}))
116-
expect(data).toContainEqual(expect.objectContaining({type: 'Cart'}))
117-
expect(data).toContainEqual(expect.objectContaining({email: 'foo@bar.de'}))
118-
expect(data).toContainEqual(expect.objectContaining({amountPlanned: { type: 'centPrecision', currencyCode: 'EUR', centAmount: 100, fractionDigits: 2}}))
119-
expect(data).toContainEqual(expect.objectContaining({name: {de: 'deutscherListenName', en: 'englishListName'}}))
120-
expect(data).toContainEqual(expect.objectContaining({text: 'Review text'}))
109+
expect(data).toContainEqual(
110+
expect.objectContaining({ type: 'CartCreated' })
111+
)
112+
expect(data).toContainEqual(
113+
expect.objectContaining({ type: 'PaymentCreated' })
114+
)
115+
expect(data).toContainEqual(
116+
expect.objectContaining({ type: 'CustomerCreated' })
117+
)
118+
expect(data).toContainEqual(
119+
expect.objectContaining({ type: 'ReviewCreated' })
120+
)
121+
expect(data).toContainEqual(
122+
expect.objectContaining({ type: 'OrderCreated' })
123+
)
124+
expect(data).toContainEqual(
125+
expect.objectContaining({ type: 'CartCreated' })
126+
)
127+
expect(data).toContainEqual(
128+
expect.objectContaining({ type: 'Order' })
129+
)
130+
expect(data).toContainEqual(expect.objectContaining({ type: 'Cart' }))
131+
expect(data).toContainEqual(
132+
expect.objectContaining({ email: 'foo@bar.de' })
133+
)
134+
expect(data).toContainEqual(
135+
expect.objectContaining({
136+
amountPlanned: {
137+
type: 'centPrecision',
138+
currencyCode: 'EUR',
139+
centAmount: 100,
140+
fractionDigits: 2,
141+
},
142+
})
143+
)
144+
expect(data).toContainEqual(
145+
expect.objectContaining({
146+
name: { de: 'deutscherListenName', en: 'englishListName' },
147+
})
148+
)
149+
expect(data).toContainEqual(
150+
expect.objectContaining({ text: 'Review text' })
151+
)
121152
})
122153
})
123154

integration-tests/sdk/auth-middleware.it.js

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -217,9 +217,7 @@ describe('Auth Middleware Flows', () => {
217217
({
218218
body: { results: carts },
219219
request: {
220-
headers: {
221-
Authorization: token,
222-
},
220+
headers: { Authorization: token },
223221
},
224222
}) => {
225223
// Assert that a different token was used to fetch the carts

integration-tests/sdk/auth.it.js

Lines changed: 29 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -288,39 +288,36 @@ describe('Auth Flows', () => {
288288
})
289289

290290
it('should tokenProvider work even after changing fetchTokenInfo funtion', async () => {
291-
const onTokenInfoRefreshedMock = jest.fn()
292-
293-
const tokenProvider = new TokenProvider(
294-
{
295-
sdkAuth: authClient,
296-
onTokenInfoRefreshed: onTokenInfoRefreshedMock,
297-
}
298-
)
299-
tokenProvider.fetchTokenInfo = (sdkAuth) =>
300-
sdkAuth.refreshTokenFlow(encodeURIComponent("invalid refresh token"));
301-
302-
try {
303-
await tokenProvider.getAccessToken()
304-
} catch (err) {
305-
expect(err.toString()).toEqual(
306-
expect.stringContaining(
307-
'BadRequest: The refresh token was not found. It may have expired.'
308-
)
309-
)
310-
tokenProvider.fetchTokenInfo = (sdkAuth) =>
311-
sdkAuth.anonymousFlow();
312-
const tokenInfo = await tokenProvider.getTokenInfo();
313-
314-
// check returned properties
315-
expect(tokenInfo).toHaveProperty('access_token')
316-
expect(tokenInfo.scope).toMatch(
317-
`manage_project:${projectKey} anonymous_id`
291+
const onTokenInfoRefreshedMock = jest.fn()
292+
293+
const tokenProvider = new TokenProvider({
294+
sdkAuth: authClient,
295+
onTokenInfoRefreshed: onTokenInfoRefreshedMock,
296+
})
297+
tokenProvider.fetchTokenInfo = (sdkAuth) =>
298+
sdkAuth.refreshTokenFlow(encodeURIComponent('invalid refresh token'))
299+
300+
try {
301+
await tokenProvider.getAccessToken()
302+
} catch (err) {
303+
expect(err.toString()).toEqual(
304+
expect.stringContaining(
305+
'BadRequest: The refresh token was not found. It may have expired.'
318306
)
319-
expect(tokenInfo).toHaveProperty('expires_in')
320-
expect(tokenInfo).toHaveProperty('expires_at')
321-
expect(tokenInfo).toHaveProperty('refresh_token')
322-
expect(tokenInfo).toHaveProperty('token_type', 'Bearer')
323-
}
307+
)
308+
tokenProvider.fetchTokenInfo = (sdkAuth) => sdkAuth.anonymousFlow()
309+
const tokenInfo = await tokenProvider.getTokenInfo()
310+
311+
// check returned properties
312+
expect(tokenInfo).toHaveProperty('access_token')
313+
expect(tokenInfo.scope).toMatch(
314+
`manage_project:${projectKey} anonymous_id`
315+
)
316+
expect(tokenInfo).toHaveProperty('expires_in')
317+
expect(tokenInfo).toHaveProperty('expires_at')
318+
expect(tokenInfo).toHaveProperty('refresh_token')
319+
expect(tokenInfo).toHaveProperty('token_type', 'Bearer')
320+
}
324321
})
325322
})
326323

packages/sdk-auth/src/tokenProvider.js

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -76,13 +76,15 @@ export default class TokenProvider {
7676
this.fetchTokenInfo(this.sdkAuth)
7777
)
7878

79-
return this.fetchTokenInfoPromise.then((tokenInfo) => {
80-
this.fetchTokenInfoPromise = null
81-
return tokenInfo
82-
}).catch((error) => {
79+
return this.fetchTokenInfoPromise
80+
.then((tokenInfo) => {
81+
this.fetchTokenInfoPromise = null
82+
return tokenInfo
83+
})
84+
.catch((error) => {
8385
this.fetchTokenInfoPromise = null
8486
throw error
85-
})
87+
})
8688
}
8789

8890
_performRefreshTokenFlow(refreshToken: string): Promise<TokenInfo> {
@@ -91,34 +93,36 @@ export default class TokenProvider {
9193

9294
this.refreshTokenFlowPromise = this.sdkAuth.refreshTokenFlow(refreshToken)
9395

94-
return this.refreshTokenFlowPromise.then((refreshTokenInfo) => {
95-
this.refreshTokenFlowPromise = null
96-
return refreshTokenInfo
97-
}).catch((error) => {
98-
this.refreshTokenFlowPromise = null;
96+
return this.refreshTokenFlowPromise
97+
.then((refreshTokenInfo) => {
98+
this.refreshTokenFlowPromise = null
99+
return refreshTokenInfo
100+
})
101+
.catch((error) => {
102+
this.refreshTokenFlowPromise = null
99103
throw error
100-
})
104+
})
101105
}
102106

103107
_refreshToken(oldTokenInfo: TokenInfo): Promise<TokenInfo> {
104108
let newTokenInfo
105109

106-
if (!oldTokenInfo?.['refresh_token'] && !this.fetchTokenInfo)
110+
if (!oldTokenInfo?.refresh_token && !this.fetchTokenInfo)
107111
return Promise.reject(
108112
new Error(
109113
'Property "refresh_token" and "fetchTokenInfo" method are missing'
110114
)
111115
)
112116

113117
// perform refreshTokenFlow if we have refresh token otherwise call getTokenInfo method
114-
const newTokenPromise = oldTokenInfo?.['refresh_token']
118+
const newTokenPromise = oldTokenInfo?.refresh_token
115119
? this._performRefreshTokenFlow(oldTokenInfo.refresh_token)
116120
: this._performFetchTokenInfo()
117121

118122
return newTokenPromise
119123
.then((tokenInfo: TokenInfo): void => {
120124
newTokenInfo = tokenInfo
121-
if (oldTokenInfo?.['refresh_token'])
125+
if (oldTokenInfo?.refresh_token)
122126
newTokenInfo.refresh_token = oldTokenInfo.refresh_token
123127
return this.onTokenInfoRefreshed?.(newTokenInfo, oldTokenInfo)
124128
})

packages/sdk-auth/test/token-provider.spec.js

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -42,32 +42,32 @@ describe('Token Provider', () => {
4242
})
4343

4444
test('should clear cache after _performFetchTokenInfo rejects', async () => {
45-
const _tokenProvider = new TokenProvider({
46-
sdkAuth,
47-
fetchTokenInfo: jest
48-
.fn()
49-
.mockImplementation(() => Promise.reject(new Error("Invalid Token"))),
50-
})
51-
expect(_tokenProvider.fetchTokenInfoPromise).toBeFalsy();
52-
try {
53-
await _tokenProvider._performFetchTokenInfo()
54-
} catch(e) {
55-
expect(_tokenProvider.fetchTokenInfoPromise).toBeFalsy();
56-
}
45+
const _tokenProvider = new TokenProvider({
46+
sdkAuth,
47+
fetchTokenInfo: jest
48+
.fn()
49+
.mockImplementation(() => Promise.reject(new Error('Invalid Token'))),
50+
})
51+
expect(_tokenProvider.fetchTokenInfoPromise).toBeFalsy()
52+
try {
53+
await _tokenProvider._performFetchTokenInfo()
54+
} catch (e) {
55+
expect(_tokenProvider.fetchTokenInfoPromise).toBeFalsy()
56+
}
5757
})
5858
test('should clear cache after _performRefreshTokenFlow rejects', async () => {
59-
const _tokenProvider = new TokenProvider({
60-
sdkAuth,
61-
fetchTokenInfo: jest
62-
.fn()
63-
.mockImplementation(() => Promise.reject(new Error("Invalid Token"))),
64-
})
65-
expect(_tokenProvider.refreshTokenFlowPromise).toBeFalsy();
66-
try {
67-
await _tokenProvider._performRefreshTokenFlow("invalid refresh token")
68-
} catch(e) {
69-
expect(_tokenProvider.refreshTokenFlowPromise).toBeFalsy();
70-
}
59+
const _tokenProvider = new TokenProvider({
60+
sdkAuth,
61+
fetchTokenInfo: jest
62+
.fn()
63+
.mockImplementation(() => Promise.reject(new Error('Invalid Token'))),
64+
})
65+
expect(_tokenProvider.refreshTokenFlowPromise).toBeFalsy()
66+
try {
67+
await _tokenProvider._performRefreshTokenFlow('invalid refresh token')
68+
} catch (e) {
69+
expect(_tokenProvider.refreshTokenFlowPromise).toBeFalsy()
70+
}
7171
})
7272

7373
test('should throw an error when refreshing without "refresh_token" property', async () => {

packages/sdk-middleware-auth/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
"node-fetch": "^2.3.0"
3737
},
3838
"devDependencies": {
39+
"abort-controller": "^3.0.0",
3940
"nock": "12.0.3"
4041
}
4142
}

packages/sdk-middleware-auth/src/anonymous-session-flow.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ export default function createAuthMiddlewareForAnonymousSessionFlow(
3333
return
3434
}
3535
const params = {
36+
...options,
3637
request,
3738
response,
3839
...buildRequestForAnonymousSessionFlow(options),

0 commit comments

Comments
 (0)