fixed httpclient

This commit is contained in:
Bojan Kucera 2025-06-04 16:37:28 -04:00
parent a282dac6cd
commit 557c157228
10 changed files with 603 additions and 427 deletions

View file

@ -56,7 +56,6 @@ describe('HttpClient', () => {
const response = await clientWithBase.get('/posts/1');
expect(response.status).toBe(200);
});
test('should merge headers', async () => {
const clientWithHeaders = new HttpClient({
defaultHeaders: {
@ -72,6 +71,107 @@ describe('HttpClient', () => {
expect(response.status).toBe(200);
});
test('should make PUT request', async () => {
const response = await client.put('https://jsonplaceholder.typicode.com/posts/1', {
id: 1,
title: 'Updated Post',
body: 'Updated content',
userId: 1,
});
expect(response.status).toBe(200);
expect(response.data).toHaveProperty('id');
expect(response.data).toHaveProperty('title', 'Updated Post');
});
test('should make DELETE request', async () => {
const response = await client.delete('https://jsonplaceholder.typicode.com/posts/1');
expect(response.status).toBe(200);
// JSONPlaceholder typically returns an empty object for DELETE
expect(response.data).toEqual({});
});
test('should make PATCH request', async () => {
const response = await client.patch('https://jsonplaceholder.typicode.com/posts/1', {
title: 'Patched Title',
});
expect(response.status).toBe(200);
expect(response.data).toHaveProperty('title', 'Patched Title');
});
test('should handle HTTP redirect', async () => {
// Using httpbin.org to test redirect
const response = await client.get('https://httpbin.org/redirect-to?url=https://httpbin.org/get');
expect(response.status).toBe(200);
expect(response.data).toBeDefined();
});
test('should handle custom status validation', async () => {
const customClient = new HttpClient({
validateStatus: (status) => status < 500,
});
// This 404 should not throw because we're allowing any status < 500
const response = await customClient.get('https://jsonplaceholder.typicode.com/posts/999999');
expect(response.status).toBe(404);
});
test('should retry failed requests', async () => {
const retryClient = new HttpClient({
retries: 2,
retryDelay: 100,
});
// Using a deliberately wrong URL that will fail
await expect(
retryClient.get('https://nonexistent-domain-123456789.com')
).rejects.toThrow();
// We can't easily test a successful retry without mocking,
// but at least we can confirm it handles failures gracefully
});
test('should send query parameters', async () => {
const params = {
userId: 1,
completed: false,
};
const response = await client.get('https://jsonplaceholder.typicode.com/todos', {
params,
});
expect(response.status).toBe(200);
expect(Array.isArray(response.data)).toBe(true);
if (response.data.length > 0) {
expect(response.data[0].userId).toBe(1);
}
});
test('should handle form data', async () => {
const formData = new FormData();
formData.append('title', 'Form Data Test');
formData.append('body', 'This is a test with form data');
formData.append('userId', '1');
const response = await client.post('https://jsonplaceholder.typicode.com/posts', formData);
expect(response.status).toBe(201);
expect(response.data).toHaveProperty('id');
});
test('should handle request timeout configuration', async () => {
const client1 = new HttpClient();
const client2 = new HttpClient({ timeout: 5000 });
// Just ensure they can both make a request without errors
await expect(client1.get('https://jsonplaceholder.typicode.com/posts/1')).resolves.toBeDefined();
await expect(client2.get('https://jsonplaceholder.typicode.com/posts/1')).resolves.toBeDefined();
});
});
describe('RateLimiter', () => {
@ -165,7 +265,6 @@ describe('ProxyManager', () => {
expect(() => ProxyManager.validateConfig(invalidConfig)).toThrow('Invalid proxy port');
});
test('should create HTTP proxy agent', () => {
const config: ProxyConfig = {
type: 'http',
@ -175,6 +274,7 @@ describe('ProxyManager', () => {
const agent = ProxyManager.createAgent(config);
expect(agent).toBeDefined();
expect(agent).toBeDefined();
});
test('should create SOCKS proxy agent', () => {
@ -184,6 +284,18 @@ describe('ProxyManager', () => {
port: 1080,
};
const agent = ProxyManager.createAgent(config); expect(agent).toBeDefined();
});
test('should handle authenticated proxy', () => {
const config: ProxyConfig = {
type: 'http',
host: 'proxy.example.com',
port: 8080,
username: 'user',
password: 'pass'
};
const agent = ProxyManager.createAgent(config);
expect(agent).toBeDefined();
});