request-client.test.ts 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. import axios from 'axios';
  2. import MockAdapter from 'axios-mock-adapter';
  3. import { afterEach, beforeEach, describe, expect, it } from 'vitest';
  4. import { RequestClient } from './request-client';
  5. describe('requestClient', () => {
  6. let mock: MockAdapter;
  7. let requestClient: RequestClient;
  8. beforeEach(() => {
  9. mock = new MockAdapter(axios);
  10. requestClient = new RequestClient();
  11. });
  12. afterEach(() => {
  13. mock.reset();
  14. });
  15. it('should successfully make a GET request', async () => {
  16. mock.onGet('test/url').reply(200, { data: 'response' });
  17. const response = await requestClient.get('test/url');
  18. expect(response.data).toEqual({ data: 'response' });
  19. });
  20. it('should successfully make a POST request', async () => {
  21. const postData = { key: 'value' };
  22. const mockData = { data: 'response' };
  23. mock.onPost('/test/post', postData).reply(200, mockData);
  24. const response = await requestClient.post('/test/post', postData);
  25. expect(response.data).toEqual(mockData);
  26. });
  27. it('should successfully make a PUT request', async () => {
  28. const putData = { key: 'updatedValue' };
  29. const mockData = { data: 'updated response' };
  30. mock.onPut('/test/put', putData).reply(200, mockData);
  31. const response = await requestClient.put('/test/put', putData);
  32. expect(response.data).toEqual(mockData);
  33. });
  34. it('should successfully make a DELETE request', async () => {
  35. const mockData = { data: 'delete response' };
  36. mock.onDelete('/test/delete').reply(200, mockData);
  37. const response = await requestClient.delete('/test/delete');
  38. expect(response.data).toEqual(mockData);
  39. });
  40. it('should return different response types', async () => {
  41. const mockData = { code: 0, msg: 'ok', data: 'response' };
  42. mock.onGet('/test/diff').reply(200, mockData);
  43. const responseRaw = await requestClient.get('/test/diff', {
  44. responseReturn: 'raw',
  45. });
  46. expect(responseRaw.status).toBe(200);
  47. expect(responseRaw.data).toEqual(mockData);
  48. const responseBody = await requestClient.get('/test/diff', {
  49. responseReturn: 'body',
  50. });
  51. expect(responseBody.code).toEqual(mockData.code);
  52. expect(responseBody.msg).toEqual(mockData.msg);
  53. expect(responseBody.data).toEqual(mockData.data);
  54. const responseData = await requestClient.get('/test/diff', {
  55. responseReturn: 'data',
  56. });
  57. expect(responseData).toEqual(mockData.data);
  58. });
  59. it('should handle network errors', async () => {
  60. mock.onGet('/test/error').networkError();
  61. try {
  62. await requestClient.get('/test/error');
  63. expect(true).toBe(false);
  64. } catch (error: any) {
  65. expect(error.isAxiosError).toBe(true);
  66. expect(error.message).toBe('Network Error');
  67. }
  68. });
  69. it('should handle timeout', async () => {
  70. mock.onGet('/test/timeout').timeout();
  71. try {
  72. await requestClient.get('/test/timeout');
  73. expect(true).toBe(false);
  74. } catch (error: any) {
  75. expect(error.isAxiosError).toBe(true);
  76. expect(error.code).toBe('ECONNABORTED');
  77. }
  78. });
  79. it('should successfully upload a file', async () => {
  80. const fileData = new Blob(['file contents'], { type: 'text/plain' });
  81. mock.onPost('/test/upload').reply((config) => {
  82. return config.data instanceof FormData && config.data.has('file')
  83. ? [200, { data: 'file uploaded' }]
  84. : [400, { error: 'Bad Request' }];
  85. });
  86. const response = await requestClient.upload('/test/upload', {
  87. file: fileData,
  88. });
  89. expect(response.data).toEqual({ data: 'file uploaded' });
  90. });
  91. it('should successfully download a file as a blob', async () => {
  92. const mockFileContent = new Blob(['mock file content'], {
  93. type: 'text/plain',
  94. });
  95. mock.onGet('/test/download').reply(200, mockFileContent);
  96. const res = await requestClient.download('/test/download');
  97. expect(res.data).toBeInstanceOf(Blob);
  98. });
  99. });