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:
parent
b5ecdde2ab
commit
28c2263601
@ -431,7 +431,7 @@ public class EtsScraper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static void autoImportBill(Path filePath) {
|
public static void autoImportBill(Path filePath) {
|
||||||
String token = proxyLogin();
|
String token = proxyLogin(PROXY_HOST, USERNAME, PASSWORD);
|
||||||
if (token == null) {
|
if (token == null) {
|
||||||
System.out.println("[-] Proxy login failed, skipping import");
|
System.out.println("[-] Proxy login failed, skipping import");
|
||||||
return;
|
return;
|
||||||
@ -439,16 +439,16 @@ public class EtsScraper {
|
|||||||
proxyImport(filePath, token);
|
proxyImport(filePath, token);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String proxyLogin() {
|
public static String proxyLogin(String proxyHost, String username, String password) {
|
||||||
try {
|
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.URI uri = java.net.URI.create(loginUrl);
|
||||||
java.net.http.HttpClient client = java.net.http.HttpClient.newBuilder()
|
java.net.http.HttpClient client = java.net.http.HttpClient.newBuilder()
|
||||||
.connectTimeout(java.time.Duration.ofSeconds(10))
|
.connectTimeout(java.time.Duration.ofSeconds(10))
|
||||||
.build();
|
.build();
|
||||||
java.net.http.HttpRequest request = java.net.http.HttpRequest.newBuilder()
|
java.net.http.HttpRequest request = java.net.http.HttpRequest.newBuilder()
|
||||||
.uri(uri)
|
.uri(uri)
|
||||||
.GET()
|
.POST(java.net.http.HttpRequest.BodyPublishers.noBody())
|
||||||
.header("Content-Type", "application/json")
|
.header("Content-Type", "application/json")
|
||||||
.build();
|
.build();
|
||||||
java.net.http.HttpResponse<String> response = client.send(request, java.net.http.HttpResponse.BodyHandlers.ofString());
|
java.net.http.HttpResponse<String> response = client.send(request, java.net.http.HttpResponse.BodyHandlers.ofString());
|
||||||
|
|||||||
@ -4,12 +4,6 @@ import org.junit.jupiter.api.Test;
|
|||||||
import org.junit.jupiter.api.io.TempDir;
|
import org.junit.jupiter.api.io.TempDir;
|
||||||
|
|
||||||
import java.io.File;
|
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 java.nio.file.Path;
|
||||||
|
|
||||||
import static org.junit.jupiter.api.Assertions.*;
|
import static org.junit.jupiter.api.Assertions.*;
|
||||||
@ -34,77 +28,9 @@ class ImportTest {
|
|||||||
}
|
}
|
||||||
assertTrue(testFile.exists(), "Test file must exist");
|
assertTrue(testFile.exists(), "Test file must exist");
|
||||||
|
|
||||||
String token = proxyLogin(testFile);
|
String token = EtsScraper.proxyLogin(PROXY_HOST, USERNAME, PASSWORD);
|
||||||
assertNotNull(token);
|
assertNotNull(token);
|
||||||
|
|
||||||
String result = proxyImport(testFile, token);
|
EtsScraper.proxyImport(testFile.toPath(), 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();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user