This repository was archived by the owner on Feb 24, 2026. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathtest-rate-limit.js
More file actions
121 lines (103 loc) · 3.65 KB
/
test-rate-limit.js
File metadata and controls
121 lines (103 loc) · 3.65 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
/**
* Test script to verify API rate limiting
*
* Without an API key, the API should allow 10 requests per minute.
* The 11th request within a minute should return a 429 status code.
*/
const API_BASE_URL = process.env.VITE_API_BASE_URL || 'https://lib-btaageoapi-dev-app-01.oit.umn.edu/api/v1';
const SEARCH_ENDPOINT = `${API_BASE_URL}/search`;
async function makeRequest(requestNumber) {
const url = new URL(SEARCH_ENDPOINT);
url.searchParams.set('format', 'json');
url.searchParams.set('search_field', 'all_fields');
url.searchParams.set('q', 'test');
url.searchParams.set('page', '1');
url.searchParams.set('per_page', '10');
const startTime = Date.now();
try {
const response = await fetch(url.toString(), {
headers: {
'Accept': 'application/vnd.api+json, application/json',
},
mode: 'cors',
});
const endTime = Date.now();
const duration = endTime - startTime;
console.log(`Request ${requestNumber}: Status ${response.status} (${duration}ms)`);
if (!response.ok) {
const text = await response.text();
try {
const json = JSON.parse(text);
console.log(` Error details:`, json);
} catch (e) {
console.log(` Error text:`, text.substring(0, 200));
}
}
return {
requestNumber,
status: response.status,
ok: response.ok,
duration,
};
} catch (error) {
const endTime = Date.now();
const duration = endTime - startTime;
console.error(`Request ${requestNumber} failed:`, error.message);
return {
requestNumber,
status: null,
ok: false,
error: error.message,
duration,
};
}
}
async function testRateLimiting() {
console.log('Testing API rate limiting...');
console.log(`API Endpoint: ${SEARCH_ENDPOINT}`);
console.log('Making 11 requests without an API key...\n');
const results = [];
// Make 11 requests in quick succession
for (let i = 1; i <= 11; i++) {
const result = await makeRequest(i);
results.push(result);
// Small delay to avoid overwhelming, but keep requests within the same minute
if (i < 11) {
await new Promise(resolve => setTimeout(resolve, 100)); // 100ms delay
}
}
console.log('\n=== Test Results ===');
results.forEach(result => {
const status = result.status || 'ERROR';
const statusText = result.ok ? '✓' : (result.status === 429 ? '⚠️ (RATE LIMITED)' : '✗');
console.log(`Request ${result.requestNumber}: ${status} ${statusText}`);
});
console.log('\n=== Analysis ===');
const successfulRequests = results.filter(r => r.ok).length;
const rateLimitedRequests = results.filter(r => r.status === 429).length;
const errorRequests = results.filter(r => !r.ok && r.status !== 429).length;
console.log(`Successful requests: ${successfulRequests}`);
console.log(`Rate limited requests (429): ${rateLimitedRequests}`);
console.log(`Other errors: ${errorRequests}`);
// Check if the 11th request was rate limited
const request11 = results.find(r => r.requestNumber === 11);
if (request11?.status === 429) {
console.log('\n✅ SUCCESS: The 11th request correctly returned 429 (Rate Limited)');
return true;
} else if (request11?.ok) {
console.log('\n❌ FAILURE: The 11th request succeeded, but should have been rate limited (429)');
return false;
} else {
console.log(`\n⚠️ UNEXPECTED: The 11th request returned status ${request11?.status || 'ERROR'}`);
return false;
}
}
// Run the test
testRateLimiting()
.then(success => {
process.exit(success ? 0 : 1);
})
.catch(error => {
console.error('Test failed with error:', error);
process.exit(1);
});