Refactor test to reuse EtsScraper proxyLogin/proxyImport directly

- Make proxyLogin accept (proxyHost, username, password) parameters
- Remove duplicated HTTP logic from ImportTest
- Test now calls same methods as production code

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
Niko 2026-05-05 15:44:24 +08:00
parent b5ecdde2ab
commit 28c2263601
2 changed files with 6 additions and 80 deletions

View File

@ -431,7 +431,7 @@ public class EtsScraper {
}
public static void autoImportBill(Path filePath) {
String token = proxyLogin();
String token = proxyLogin(PROXY_HOST, USERNAME, PASSWORD);
if (token == null) {
System.out.println("[-] Proxy login failed, skipping import");
return;
@ -439,16 +439,16 @@ public class EtsScraper {
proxyImport(filePath, token);
}
public static String proxyLogin() {
public static String proxyLogin(String proxyHost, String username, String password) {
try {
String loginUrl = PROXY_HOST + "/api/auth/login?username=" + USERNAME + "&password=" + PASSWORD;
String loginUrl = proxyHost + "/api/auth/login?username=" + username + "&password=" + password;
java.net.URI uri = java.net.URI.create(loginUrl);
java.net.http.HttpClient client = java.net.http.HttpClient.newBuilder()
.connectTimeout(java.time.Duration.ofSeconds(10))
.build();
java.net.http.HttpRequest request = java.net.http.HttpRequest.newBuilder()
.uri(uri)
.GET()
.POST(java.net.http.HttpRequest.BodyPublishers.noBody())
.header("Content-Type", "application/json")
.build();
java.net.http.HttpResponse<String> response = client.send(request, java.net.http.HttpResponse.BodyHandlers.ofString());

View File

@ -4,12 +4,6 @@ import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
import java.io.File;
import java.io.FileInputStream;
import java.io.OutputStream;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.file.Path;
import static org.junit.jupiter.api.Assertions.*;
@ -34,77 +28,9 @@ class ImportTest {
}
assertTrue(testFile.exists(), "Test file must exist");
String token = proxyLogin(testFile);
String token = EtsScraper.proxyLogin(PROXY_HOST, USERNAME, PASSWORD);
assertNotNull(token);
String result = proxyImport(testFile, token);
assertNotNull(result);
System.out.println("[+] Import result: " + result);
assertTrue(result.contains("\"code\""), "Response should contain code field");
}
private String proxyLogin(File testFile) throws Exception {
String loginUrl = PROXY_HOST + "/api/auth/login?username=" + USERNAME + "&password=" + PASSWORD;
HttpClient client = HttpClient.newBuilder()
.connectTimeout(java.time.Duration.ofSeconds(10))
.build();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(loginUrl))
.POST(HttpRequest.BodyPublishers.noBody())
.header("Content-Type", "application/json")
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
String body = response.body();
System.out.println("[+] Login response: " + body);
int tokenIdx = body.indexOf("\"accessToken\"");
if (tokenIdx < 0) {
throw new AssertionError("No accessToken in login response: " + body);
}
int colonStart = body.indexOf("\":", tokenIdx);
int quoteStart = body.indexOf("\"", colonStart + 2);
int quoteEnd = body.indexOf("\"", quoteStart + 1);
return body.substring(quoteStart + 1, quoteEnd);
}
private String proxyImport(File file, String token) throws Exception {
String boundary = "----FormBoundary" + System.currentTimeMillis();
String boundaryLine = "--" + boundary;
java.io.ByteArrayOutputStream out = new java.io.ByteArrayOutputStream();
OutputStream os = out;
os.write((boundaryLine + "\r\n").getBytes());
os.write(("Content-Disposition: form-data; name=\"file\"; filename=\"" + file.getName() + "\"\r\n").getBytes());
os.write("Content-Type: application/octet-stream\r\n\r\n".getBytes());
os.flush();
try (FileInputStream fis = new FileInputStream(file)) {
byte[] buf = new byte[8192];
int n;
while ((n = fis.read(buf)) > 0) {
os.write(buf, 0, n);
}
}
os.flush();
os.write(("\r\n" + boundaryLine + "--\r\n").getBytes());
os.flush();
byte[] entityBytes = out.toByteArray();
HttpClient client = HttpClient.newBuilder()
.connectTimeout(java.time.Duration.ofSeconds(60))
.build();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(PROXY_HOST + "/api/bill/import"))
.header("Content-Type", "multipart/form-data; boundary=" + boundary)
.header("authorization", token)
.POST(HttpRequest.BodyPublishers.ofByteArray(entityBytes))
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println("[+] Import response (" + response.statusCode() + "): " + response.body());
assertEquals(200, response.statusCode(), "Import request should succeed");
return response.body();
EtsScraper.proxyImport(testFile.toPath(), token);
}
}