-
-
Notifications
You must be signed in to change notification settings - Fork 40
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
refactor(js,browser): reuse createRequester (#332)
- Loading branch information
Showing
10 changed files
with
103 additions
and
21 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
File renamed without changes.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,74 @@ | ||
import { LogtoRequestError } from '@logto/js'; | ||
|
||
import { createRequester } from './requester'; | ||
|
||
describe('createRequester', () => { | ||
describe('successful response', () => { | ||
test('should return data', async () => { | ||
const data = { foo: 'bar' }; | ||
const fetchFunction = jest.fn().mockResolvedValue({ | ||
ok: true, | ||
json: async () => data, | ||
}); | ||
const requester = createRequester(fetchFunction); | ||
await expect(requester('foo')).resolves.toEqual(data); | ||
}); | ||
}); | ||
|
||
describe('request error', () => { | ||
test('failing response json with code and message should throw LogtoRequestError with same code and message', async () => { | ||
const code = 'some error code'; | ||
const message = 'some error message'; | ||
const fetchFunction = jest.fn().mockResolvedValue({ | ||
ok: false, | ||
json: async () => ({ code, message }), | ||
}); | ||
const requester = createRequester(fetchFunction); | ||
await expect(requester('foo')).rejects.toMatchError(new LogtoRequestError(code, message)); | ||
}); | ||
|
||
test('failing response json with only code should throw StructError', async () => { | ||
const fetchFunction = jest.fn().mockResolvedValue({ | ||
ok: false, | ||
json: async () => { | ||
throw new TypeError('without message'); | ||
}, | ||
}); | ||
const requester = createRequester(fetchFunction); | ||
await expect(requester('foo')).rejects.toThrowError(TypeError); | ||
}); | ||
|
||
test('failing response json with only message should throw StructError', async () => { | ||
const fetchFunction = jest.fn().mockResolvedValue({ | ||
ok: false, | ||
json: async () => { | ||
throw new TypeError('without code'); | ||
}, | ||
}); | ||
const requester = createRequester(fetchFunction); | ||
await expect(requester('foo')).rejects.toThrowError(TypeError); | ||
}); | ||
|
||
test('failing response json without code and message should throw StructError', async () => { | ||
const fetchFunction = jest.fn().mockResolvedValue({ | ||
ok: false, | ||
json: async () => { | ||
throw new TypeError('without code and message'); | ||
}, | ||
}); | ||
const requester = createRequester(fetchFunction); | ||
await expect(requester('foo')).rejects.toThrowError(TypeError); | ||
}); | ||
|
||
test('failing response with non-json text should throw TypeError', async () => { | ||
const fetchFunction = jest.fn().mockResolvedValue({ | ||
ok: false, | ||
json: async () => { | ||
throw new TypeError('not json content'); | ||
}, | ||
}); | ||
const requester = createRequester(fetchFunction); | ||
await expect(requester('foo')).rejects.toThrowError(TypeError); | ||
}); | ||
}); | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
import { LogtoRequestError, LogtoRequestErrorBody, Requester } from '@logto/js'; | ||
|
||
export const createRequester = (fetchFunction: typeof fetch): Requester => { | ||
return async <T>(...args: Parameters<typeof fetch>): Promise<T> => { | ||
const response = await fetchFunction(...args); | ||
|
||
if (!response.ok) { | ||
// Expected request error from server | ||
const { code, message } = await response.json<LogtoRequestErrorBody>(); | ||
throw new LogtoRequestError(code, message); | ||
} | ||
|
||
return response.json<T>(); | ||
}; | ||
}; |
This file was deleted.
Oops, something went wrong.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.