import 'dart:convert'; import 'dart:io'; class ApiTester { final String baseUrl; final HttpClient httpClient; ApiTester(this.baseUrl) : httpClient = HttpClient(); Future> makeRequest(String method, String path, [Map? body]) async { final uri = Uri.parse('$baseUrl$path'); print('\n๐Ÿ” $method $uri'); late HttpClientRequest request; switch (method.toUpperCase()) { case 'GET': request = await httpClient.getUrl(uri); break; case 'POST': request = await httpClient.postUrl(uri); break; case 'PUT': request = await httpClient.putUrl(uri); break; case 'DELETE': request = await httpClient.deleteUrl(uri); break; default: throw ArgumentError('Unsupported HTTP method: $method'); } request.headers.set('Content-Type', 'application/json'); if (body != null) { final jsonBody = jsonEncode(body); print('๐Ÿ“ค Request Body: $jsonBody'); request.write(jsonBody); } final response = await request.close(); final responseBody = await response.transform(utf8.decoder).join(); print('๐Ÿ“Š Status: ${response.statusCode}'); print('๐Ÿ“ฅ Response: $responseBody'); try { return { 'statusCode': response.statusCode, 'body': jsonDecode(responseBody), }; } catch (e) { return { 'statusCode': response.statusCode, 'body': responseBody, }; } } Future testAllEndpoints() async { print('๐Ÿš€ Starting API Tests for $baseUrl'); print('=' * 50); try { // Test 1: Create a peer print('\n๐Ÿ“‹ TEST 1: Create a new peer'); final createResponse = await makeRequest('POST', '/api/peers'); if (createResponse['statusCode'] != 200 || createResponse['body']['success'] != true) { print('โŒ Failed to create peer'); return; } final peer = createResponse['body']['peer'] as Map; final publicKey = peer['publicKey'] as String; final peerIP = peer['ip'] as String; print('โœ… Created peer successfully'); print(' Public Key: $publicKey'); print(' IP: $peerIP'); // Test 2: Set speed limit print('\n๐Ÿ“‹ TEST 2: Set speed limit (500 kbps)'); final speedResponse = await makeRequest('POST', '/api/peers/speed-limit', { 'publicKey': publicKey, 'speedKbps': 500, }); if (speedResponse['statusCode'] == 200 && speedResponse['body']['success'] == true) { print('โœ… Speed limit set successfully'); } else { print('โŒ Speed limit failed: ${speedResponse['body']}'); } // Test 3: Set data cap print('\n๐Ÿ“‹ TEST 3: Set data cap (1024 MB)'); final dataCapResponse = await makeRequest('POST', '/api/peers/data-cap', { 'publicKey': publicKey, 'dataCapMB': 1024, }); if (dataCapResponse['statusCode'] == 200 && dataCapResponse['body']['success'] == true) { print('โœ… Data cap set successfully'); } else { print('โŒ Data cap failed: ${dataCapResponse['body']}'); } // Test 4: Get peer config print('\n๐Ÿ“‹ TEST 4: Get peer config'); final configResponse = await makeRequest('POST', '/api/peers/config', { 'publicKey': publicKey, }); if (configResponse['statusCode'] == 404) { print('โœ… Config endpoint working (returns not implemented as expected)'); } else { print('โ“ Unexpected config response: ${configResponse['body']}'); } // Test 5: Delete peer print('\n๐Ÿ“‹ TEST 5: Delete peer'); final deleteResponse = await makeRequest('POST', '/api/peers/delete', { 'publicKey': publicKey, }); if (deleteResponse['statusCode'] == 200 && deleteResponse['body']['success'] == true) { print('โœ… Peer deleted successfully'); } else { print('โŒ Delete failed: ${deleteResponse['body']}'); } print('\n๐ŸŽ‰ All tests completed!'); } catch (e) { print('โŒ Test failed with error: $e'); } finally { httpClient.close(); } } } void main(List args) async { final serverUrl = args.isNotEmpty ? args[0] : 'http://51.38.64.5:3002'; print('๐Ÿงช Waylume Server API Tester'); print('Server: $serverUrl'); final tester = ApiTester(serverUrl); await tester.testAllEndpoints(); }