1
0

Typwarnungen und Raw Types bereinigt

This commit is contained in:
2026-04-09 08:03:28 +02:00
parent cd1deb9f92
commit 4a21b23312
3 changed files with 30 additions and 32 deletions

View File

@@ -2,6 +2,7 @@ package de.gecheckt.pdf.umbenenner.adapter.out.ai;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@@ -75,7 +76,6 @@ class AnthropicClaudeAdapterIntegrationTest {
*/
@Test
@DisplayName("claudeProviderIdentifierLandsInAttemptHistory: ai_provider=claude in attempt history after successful run")
@SuppressWarnings("unchecked")
void claudeProviderIdentifierLandsInAttemptHistory(@TempDir Path tempDir) throws Exception {
// --- Infrastructure setup ---
Path sourceFolder = Files.createDirectories(tempDir.resolve("source"));
@@ -118,8 +118,7 @@ class AnthropicClaudeAdapterIntegrationTest {
HttpResponse<String> mockHttpResponse = mock(HttpResponse.class);
when(mockHttpResponse.statusCode()).thenReturn(200);
when(mockHttpResponse.body()).thenReturn(anthropicResponseBody);
when(mockHttpClient.send(any(HttpRequest.class), any()))
.thenReturn((HttpResponse) mockHttpResponse);
doReturn(mockHttpResponse).when(mockHttpClient).send(any(HttpRequest.class), any());
// --- Create the Claude adapter with the mocked HTTP client ---
ProviderConfiguration claudeConfig = new ProviderConfiguration(

View File

@@ -3,6 +3,7 @@ package de.gecheckt.pdf.umbenenner.adapter.out.ai;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -93,7 +94,7 @@ class AnthropicClaudeHttpAdapterTest {
void claudeAdapterBuildsCorrectRequest() throws Exception {
HttpResponse<String> httpResponse = mockHttpResponse(200, buildAnthropicSuccessResponse(
"{\"date\":\"2024-01-15\",\"title\":\"Testititel\",\"reasoning\":\"Test\"}"));
when(httpClient.send(any(HttpRequest.class), any())).thenReturn((HttpResponse) httpResponse);
doReturn(httpResponse).when(httpClient).send(any(HttpRequest.class), any());
AiRequestRepresentation request = createTestRequest("System-Prompt", "Dokumenttext");
adapter.invoke(request);
@@ -165,7 +166,7 @@ class AnthropicClaudeHttpAdapterTest {
HttpResponse<String> httpResponse = mockHttpResponse(200,
buildAnthropicSuccessResponse("{\"title\":\"T\",\"reasoning\":\"R\"}"));
when(httpClient.send(any(HttpRequest.class), any())).thenReturn((HttpResponse) httpResponse);
doReturn(httpResponse).when(httpClient).send(any(HttpRequest.class), any());
adapterWithEnvKey.invoke(createTestRequest("prompt", "doc"));
@@ -195,7 +196,7 @@ class AnthropicClaudeHttpAdapterTest {
HttpResponse<String> httpResponse = mockHttpResponse(200,
buildAnthropicSuccessResponse("{\"title\":\"T\",\"reasoning\":\"R\"}"));
when(httpClient.send(any(HttpRequest.class), any())).thenReturn((HttpResponse) httpResponse);
doReturn(httpResponse).when(httpClient).send(any(HttpRequest.class), any());
adapterWithPropertiesKey.invoke(createTestRequest("prompt", "doc"));
@@ -249,7 +250,7 @@ class AnthropicClaudeHttpAdapterTest {
String blockText = "{\"date\":\"2024-01-15\",\"title\":\"Rechnung\",\"reasoning\":\"Test\"}";
String responseBody = buildAnthropicSuccessResponse(blockText);
HttpResponse<String> httpResponse = mockHttpResponse(200, responseBody);
when(httpClient.send(any(HttpRequest.class), any())).thenReturn((HttpResponse) httpResponse);
doReturn(httpResponse).when(httpClient).send(any(HttpRequest.class), any());
AiInvocationResult result = adapter.invoke(createTestRequest("prompt", "doc"));
@@ -288,7 +289,7 @@ class AnthropicClaudeHttpAdapterTest {
responseJson.put("stop_reason", "end_turn");
HttpResponse<String> httpResponse = mockHttpResponse(200, responseJson.toString());
when(httpClient.send(any(HttpRequest.class), any())).thenReturn((HttpResponse) httpResponse);
doReturn(httpResponse).when(httpClient).send(any(HttpRequest.class), any());
AiInvocationResult result = adapter.invoke(createTestRequest("prompt", "doc"));
@@ -334,7 +335,7 @@ class AnthropicClaudeHttpAdapterTest {
responseJson.put("stop_reason", "end_turn");
HttpResponse<String> httpResponse = mockHttpResponse(200, responseJson.toString());
when(httpClient.send(any(HttpRequest.class), any())).thenReturn((HttpResponse) httpResponse);
doReturn(httpResponse).when(httpClient).send(any(HttpRequest.class), any());
AiInvocationResult result = adapter.invoke(createTestRequest("prompt", "doc"));
@@ -366,7 +367,7 @@ class AnthropicClaudeHttpAdapterTest {
+ "}";
HttpResponse<String> httpResponse = mockHttpResponse(200, noTextBlockResponse);
when(httpClient.send(any(HttpRequest.class), any())).thenReturn((HttpResponse) httpResponse);
doReturn(httpResponse).when(httpClient).send(any(HttpRequest.class), any());
AiInvocationResult result = adapter.invoke(createTestRequest("prompt", "doc"));
@@ -386,7 +387,7 @@ class AnthropicClaudeHttpAdapterTest {
@DisplayName("claudeAdapterMapsHttp401AsTechnical: HTTP 401 yields technical failure")
void claudeAdapterMapsHttp401AsTechnical() throws Exception {
HttpResponse<String> httpResponse = mockHttpResponse(401, null);
when(httpClient.send(any(HttpRequest.class), any())).thenReturn((HttpResponse) httpResponse);
doReturn(httpResponse).when(httpClient).send(any(HttpRequest.class), any());
AiInvocationResult result = adapter.invoke(createTestRequest("prompt", "doc"));
@@ -405,7 +406,7 @@ class AnthropicClaudeHttpAdapterTest {
@DisplayName("claudeAdapterMapsHttp429AsTechnical: HTTP 429 yields technical failure")
void claudeAdapterMapsHttp429AsTechnical() throws Exception {
HttpResponse<String> httpResponse = mockHttpResponse(429, null);
when(httpClient.send(any(HttpRequest.class), any())).thenReturn((HttpResponse) httpResponse);
doReturn(httpResponse).when(httpClient).send(any(HttpRequest.class), any());
AiInvocationResult result = adapter.invoke(createTestRequest("prompt", "doc"));
@@ -424,7 +425,7 @@ class AnthropicClaudeHttpAdapterTest {
@DisplayName("claudeAdapterMapsHttp500AsTechnical: HTTP 500 yields technical failure")
void claudeAdapterMapsHttp500AsTechnical() throws Exception {
HttpResponse<String> httpResponse = mockHttpResponse(500, null);
when(httpClient.send(any(HttpRequest.class), any())).thenReturn((HttpResponse) httpResponse);
doReturn(httpResponse).when(httpClient).send(any(HttpRequest.class), any());
AiInvocationResult result = adapter.invoke(createTestRequest("prompt", "doc"));
@@ -465,7 +466,7 @@ class AnthropicClaudeHttpAdapterTest {
void claudeAdapterMapsUnparseableJsonAsTechnical() throws Exception {
HttpResponse<String> httpResponse = mockHttpResponse(200,
"<html><body>Service unavailable</body></html>");
when(httpClient.send(any(HttpRequest.class), any())).thenReturn((HttpResponse) httpResponse);
doReturn(httpResponse).when(httpClient).send(any(HttpRequest.class), any());
AiInvocationResult result = adapter.invoke(createTestRequest("prompt", "doc"));
@@ -482,7 +483,7 @@ class AnthropicClaudeHttpAdapterTest {
void testConfiguredModelIsUsedInRequestBody() throws Exception {
HttpResponse<String> httpResponse = mockHttpResponse(200,
buildAnthropicSuccessResponse("{\"title\":\"T\",\"reasoning\":\"R\"}"));
when(httpClient.send(any(HttpRequest.class), any())).thenReturn((HttpResponse) httpResponse);
doReturn(httpResponse).when(httpClient).send(any(HttpRequest.class), any());
adapter.invoke(createTestRequest("prompt", "doc"));
@@ -495,7 +496,7 @@ class AnthropicClaudeHttpAdapterTest {
void testConfiguredTimeoutIsUsedInRequest() throws Exception {
HttpResponse<String> httpResponse = mockHttpResponse(200,
buildAnthropicSuccessResponse("{\"title\":\"T\",\"reasoning\":\"R\"}"));
when(httpClient.send(any(HttpRequest.class), any())).thenReturn((HttpResponse) httpResponse);
doReturn(httpResponse).when(httpClient).send(any(HttpRequest.class), any());
adapter.invoke(createTestRequest("prompt", "doc"));
@@ -512,7 +513,7 @@ class AnthropicClaudeHttpAdapterTest {
void testPromptContentGoesToSystemFieldDocumentTextToUserMessage() throws Exception {
HttpResponse<String> httpResponse = mockHttpResponse(200,
buildAnthropicSuccessResponse("{\"title\":\"T\",\"reasoning\":\"R\"}"));
when(httpClient.send(any(HttpRequest.class), any())).thenReturn((HttpResponse) httpResponse);
doReturn(httpResponse).when(httpClient).send(any(HttpRequest.class), any());
String promptContent = "Du bist ein Assistent zur Dokumentenbenennung.";
String documentText = "Rechnungstext des Dokuments.";
@@ -590,7 +591,7 @@ class AnthropicClaudeHttpAdapterTest {
HttpResponse<String> httpResponse = mockHttpResponse(200,
buildAnthropicSuccessResponse("{\"title\":\"T\",\"reasoning\":\"R\"}"));
when(httpClient.send(any(HttpRequest.class), any())).thenReturn((HttpResponse) httpResponse);
doReturn(httpResponse).when(httpClient).send(any(HttpRequest.class), any());
adapterWithDefault.invoke(createTestRequest("p", "d"));

View File

@@ -86,7 +86,7 @@ class OpenAiHttpAdapterTest {
// Arrange
String responseBody = "{\"choices\":[{\"message\":{\"content\":\"test response\"}}]}";
HttpResponse<String> httpResponse = mockHttpResponse(200, responseBody);
when(httpClient.send(any(HttpRequest.class), any())).thenReturn((HttpResponse) httpResponse);
doReturn(httpResponse).when(httpClient).send(any(HttpRequest.class), any());
AiRequestRepresentation request = createTestRequest("Test prompt", "Test document");
@@ -105,7 +105,7 @@ class OpenAiHttpAdapterTest {
void testNon200HttpStatusReturnsTechnicalFailure() throws Exception {
// Arrange
HttpResponse<String> httpResponse = mockHttpResponse(500, null);
when(httpClient.send(any(HttpRequest.class), any())).thenReturn((HttpResponse) httpResponse);
doReturn(httpResponse).when(httpClient).send(any(HttpRequest.class), any());
AiRequestRepresentation request = createTestRequest("Test prompt", "Test document");
@@ -214,7 +214,7 @@ class OpenAiHttpAdapterTest {
void testConfiguredTimeoutIsUsedInRequest() throws Exception {
// Arrange
HttpResponse<String> httpResponse = mockHttpResponse(200, "{}");
when(httpClient.send(any(HttpRequest.class), any())).thenReturn((HttpResponse) httpResponse);
doReturn(httpResponse).when(httpClient).send(any(HttpRequest.class), any());
AiRequestRepresentation request = createTestRequest("Test prompt", "Test document");
@@ -238,7 +238,7 @@ class OpenAiHttpAdapterTest {
void testConfiguredBaseUrlIsUsedInEndpoint() throws Exception {
// Arrange
HttpResponse<String> httpResponse = mockHttpResponse(200, "{}");
when(httpClient.send(any(HttpRequest.class), any())).thenReturn((HttpResponse) httpResponse);
doReturn(httpResponse).when(httpClient).send(any(HttpRequest.class), any());
AiRequestRepresentation request = createTestRequest("Test prompt", "Test document");
@@ -261,7 +261,7 @@ class OpenAiHttpAdapterTest {
// Arrange
AiRequestRepresentation request = createTestRequest("Test prompt", "Test document");
HttpResponse<String> httpResponse = mockHttpResponse(200, "{}");
when(httpClient.send(any(HttpRequest.class), any())).thenReturn((HttpResponse) httpResponse);
doReturn(httpResponse).when(httpClient).send(any(HttpRequest.class), any());
// Act - invoke to trigger actual request building
adapter.invoke(request);
@@ -287,7 +287,7 @@ class OpenAiHttpAdapterTest {
void testEffectiveApiKeyIsUsedInAuthorizationHeader() throws Exception {
// Arrange
HttpResponse<String> httpResponse = mockHttpResponse(200, "{}");
when(httpClient.send(any(HttpRequest.class), any())).thenReturn((HttpResponse) httpResponse);
doReturn(httpResponse).when(httpClient).send(any(HttpRequest.class), any());
AiRequestRepresentation request = createTestRequest("Test prompt", "Test document");
@@ -324,7 +324,7 @@ class OpenAiHttpAdapterTest {
);
HttpResponse<String> httpResponse = mockHttpResponse(200, "{}");
when(httpClient.send(any(HttpRequest.class), any())).thenReturn((HttpResponse) httpResponse);
doReturn(httpResponse).when(httpClient).send(any(HttpRequest.class), any());
// Act - invoke to trigger actual request building
adapter.invoke(request);
@@ -362,7 +362,7 @@ class OpenAiHttpAdapterTest {
void testSuccessPreservesRequest() throws Exception {
// Arrange
HttpResponse<String> httpResponse = mockHttpResponse(200, "{\"result\":\"ok\"}");
when(httpClient.send(any(HttpRequest.class), any())).thenReturn((HttpResponse) httpResponse);
doReturn(httpResponse).when(httpClient).send(any(HttpRequest.class), any());
AiRequestRepresentation request = createTestRequest("Test prompt", "Test document");
@@ -459,7 +459,7 @@ class OpenAiHttpAdapterTest {
httpClient);
HttpResponse<String> httpResponse = mockHttpResponse(200, "{}");
when(httpClient.send(any(HttpRequest.class), any())).thenReturn((HttpResponse) httpResponse);
doReturn(httpResponse).when(httpClient).send(any(HttpRequest.class), any());
AiRequestRepresentation request = createTestRequest("Test prompt", "Test document");
@@ -487,7 +487,7 @@ class OpenAiHttpAdapterTest {
OpenAiHttpAdapter nsAdapter = new OpenAiHttpAdapter(nsConfig, httpClient);
HttpResponse<String> httpResponse = mockHttpResponse(200, "{}");
when(httpClient.send(any(HttpRequest.class), any())).thenReturn((HttpResponse) httpResponse);
doReturn(httpResponse).when(httpClient).send(any(HttpRequest.class), any());
AiRequestRepresentation request = createTestRequest("prompt", "document");
nsAdapter.invoke(request);
@@ -531,8 +531,7 @@ class OpenAiHttpAdapterTest {
// Success case: HTTP 200 must produce AiInvocationSuccess with raw body
String successBody = "{\"choices\":[{\"message\":{\"content\":\"result\"}}]}";
HttpResponse<String> successResponse = mockHttpResponse(200, successBody);
when(httpClient.send(any(HttpRequest.class), any()))
.thenReturn((HttpResponse) successResponse);
doReturn(successResponse).when(httpClient).send(any(HttpRequest.class), any());
AiInvocationResult result = adapter.invoke(createTestRequest("p", "d"));
assertThat(result).isInstanceOf(AiInvocationSuccess.class);
@@ -540,8 +539,7 @@ class OpenAiHttpAdapterTest {
// Non-200 case: HTTP 429 must produce AiInvocationTechnicalFailure with HTTP_429 reason
HttpResponse<String> rateLimitedResponse = mockHttpResponse(429, null);
when(httpClient.send(any(HttpRequest.class), any()))
.thenReturn((HttpResponse) rateLimitedResponse);
doReturn(rateLimitedResponse).when(httpClient).send(any(HttpRequest.class), any());
result = adapter.invoke(createTestRequest("p", "d"));
assertThat(result).isInstanceOf(AiInvocationTechnicalFailure.class);
assertThat(((AiInvocationTechnicalFailure) result).failureReason()).isEqualTo("HTTP_429");