60 lines
1.8 KiB
TypeScript
60 lines
1.8 KiB
TypeScript
import { tap, expect } from '@git.zone/tstest/tapbundle';
|
|
import { SmartRequest } from '../ts/index.js';
|
|
|
|
tap.test('should clear timeout when request completes before timeout', async () => {
|
|
// Set a long timeout that would keep the process alive if not cleared
|
|
const response = await SmartRequest.create()
|
|
.url('https://httpbin.org/delay/1') // 1 second delay
|
|
.timeout(10000) // 10 second timeout (much longer than needed)
|
|
.get();
|
|
|
|
const data = await response.json();
|
|
expect(data).toBeDefined();
|
|
|
|
// The test should complete quickly, not wait for the 10 second timeout
|
|
// If the timeout isn't cleared, the process would hang for 10 seconds
|
|
});
|
|
|
|
tap.test('should timeout when request takes longer than timeout', async () => {
|
|
let errorThrown = false;
|
|
|
|
try {
|
|
// Try to fetch with a very short timeout
|
|
await SmartRequest.create()
|
|
.url('https://httpbin.org/delay/3') // 3 second delay
|
|
.timeout(100) // 100ms timeout (will fail)
|
|
.get();
|
|
} catch (error) {
|
|
errorThrown = true;
|
|
expect(error.message).toContain('Request timed out');
|
|
}
|
|
|
|
expect(errorThrown).toBeTrue();
|
|
});
|
|
|
|
tap.test('should not leak timers with multiple successful requests', async () => {
|
|
// Make multiple requests with timeouts to ensure no timer leaks
|
|
const promises = [];
|
|
|
|
for (let i = 0; i < 5; i++) {
|
|
promises.push(
|
|
SmartRequest.create()
|
|
.url('https://httpbin.org/get')
|
|
.timeout(5000) // 5 second timeout
|
|
.get()
|
|
.then(response => response.json())
|
|
);
|
|
}
|
|
|
|
const results = await Promise.all(promises);
|
|
|
|
// All requests should complete successfully
|
|
expect(results).toHaveLength(5);
|
|
results.forEach(result => {
|
|
expect(result).toBeDefined();
|
|
});
|
|
|
|
// Process should exit cleanly after this test without hanging
|
|
});
|
|
|
|
export default tap.start(); |