|
| 1 | +import { AuthError } from '../src/lib/errors' |
1 | 2 | import {
|
2 | 3 | authClient as auth,
|
3 | 4 | authClientWithSession as authWithSession,
|
@@ -114,6 +115,89 @@ describe('GoTrueClient', () => {
|
114 | 115 | expect(refreshAccessTokenSpy).toBeCalledTimes(1)
|
115 | 116 | })
|
116 | 117 |
|
| 118 | + test('_callRefreshToken() should resolve all pending refresh requests and reset deferred upon AuthError', async () => { |
| 119 | + const { email, password } = mockUserCredentials() |
| 120 | + refreshAccessTokenSpy.mockImplementationOnce(() => |
| 121 | + Promise.resolve({ |
| 122 | + session: null, |
| 123 | + error: new AuthError('Something did not work as expected'), |
| 124 | + }) |
| 125 | + ) |
| 126 | + |
| 127 | + const { error, session } = await authWithSession.signUp({ |
| 128 | + email, |
| 129 | + password, |
| 130 | + }) |
| 131 | + |
| 132 | + expect(error).toBeNull() |
| 133 | + expect(session).not.toBeNull() |
| 134 | + |
| 135 | + const [{ session: session1, error: error1 }, { session: session2, error: error2 }] = |
| 136 | + await Promise.all([ |
| 137 | + // @ts-expect-error 'Allow access to private _callRefreshToken()' |
| 138 | + authWithSession._callRefreshToken(session?.refresh_token), |
| 139 | + // @ts-expect-error 'Allow access to private _callRefreshToken()' |
| 140 | + authWithSession._callRefreshToken(session?.refresh_token), |
| 141 | + ]) |
| 142 | + |
| 143 | + expect(error1).toHaveProperty('message') |
| 144 | + expect(error2).toHaveProperty('message') |
| 145 | + expect(session1).toBeNull() |
| 146 | + expect(session2).toBeNull() |
| 147 | + |
| 148 | + expect(refreshAccessTokenSpy).toBeCalledTimes(1) |
| 149 | + |
| 150 | + // verify the deferred has been reset and successive calls can be made |
| 151 | + // @ts-expect-error 'Allow access to private _callRefreshToken()' |
| 152 | + const { session: session3, error: error3 } = await authWithSession._callRefreshToken( |
| 153 | + session!.refresh_token |
| 154 | + ) |
| 155 | + |
| 156 | + expect(error3).toBeNull() |
| 157 | + expect(session3).toHaveProperty('access_token') |
| 158 | + }) |
| 159 | + |
| 160 | + test('_callRefreshToken() should reject all pending refresh requests and reset deferred upon any non AuthError', async () => { |
| 161 | + const mockError = new Error('Something did not work as expected') |
| 162 | + |
| 163 | + const { email, password } = mockUserCredentials() |
| 164 | + refreshAccessTokenSpy.mockImplementationOnce(() => Promise.reject(mockError)) |
| 165 | + |
| 166 | + const { error, session } = await authWithSession.signUp({ |
| 167 | + email, |
| 168 | + password, |
| 169 | + }) |
| 170 | + |
| 171 | + expect(error).toBeNull() |
| 172 | + expect(session).not.toBeNull() |
| 173 | + |
| 174 | + const [error1, error2] = |
| 175 | + await Promise.allSettled([ |
| 176 | + // @ts-expect-error 'Allow access to private _callRefreshToken()' |
| 177 | + authWithSession._callRefreshToken(session?.refresh_token), |
| 178 | + // @ts-expect-error 'Allow access to private _callRefreshToken()' |
| 179 | + authWithSession._callRefreshToken(session?.refresh_token), |
| 180 | + ]) |
| 181 | + |
| 182 | + expect(error1.status).toEqual('rejected') |
| 183 | + expect(error2.status).toEqual('rejected') |
| 184 | + |
| 185 | + // status === 'rejected' above makes sure it is a PromiseRejectedResult |
| 186 | + expect((error1 as PromiseRejectedResult).reason).toEqual(mockError) |
| 187 | + expect((error1 as PromiseRejectedResult).reason).toEqual(mockError) |
| 188 | + |
| 189 | + expect(refreshAccessTokenSpy).toBeCalledTimes(1) |
| 190 | + |
| 191 | + // vreify the deferred has been reset and successive calls can be made |
| 192 | + // @ts-expect-error 'Allow access to private _callRefreshToken()' |
| 193 | + const { session: session3, error: error3 } = await authWithSession._callRefreshToken( |
| 194 | + session!.refresh_token |
| 195 | + ) |
| 196 | + |
| 197 | + expect(error3).toBeNull() |
| 198 | + expect(session3).toHaveProperty('access_token') |
| 199 | + }) |
| 200 | + |
117 | 201 | test('getSessionFromUrl() can only be called from a browser', async () => {
|
118 | 202 | const { error, session } = await authWithSession.getSessionFromUrl()
|
119 | 203 |
|
|
0 commit comments