1
0

Grenzfalltests für StartConfigurationValidator ergänzt

This commit is contained in:
2026-04-02 17:31:14 +02:00
parent ceee085055
commit 0c0faf2286
3 changed files with 357 additions and 1 deletions

1
.gitignore vendored
View File

@@ -71,3 +71,4 @@ Desktop.ini
# ========================================================= # =========================================================
hs_err_pid* hs_err_pid*
replay_pid* replay_pid*
/review-input.zip

View File

@@ -343,6 +343,64 @@ class StartConfigurationValidatorTest {
assertTrue(exception.getMessage().contains("max.text.characters: must be > 0")); assertTrue(exception.getMessage().contains("max.text.characters: must be > 0"));
} }
@Test
void validate_maxRetriesTransientZeroIsValid() throws Exception {
Path sourceFolder = Files.createDirectory(tempDir.resolve("source"));
Path targetFolder = Files.createDirectory(tempDir.resolve("target"));
Path sqliteFile = Files.createFile(tempDir.resolve("db.sqlite"));
Path promptTemplateFile = Files.createFile(tempDir.resolve("prompt.txt"));
StartConfiguration config = new StartConfiguration(
sourceFolder,
targetFolder,
sqliteFile,
URI.create("https://api.example.com"),
"gpt-4",
30,
0, // maxRetriesTransient = 0 ist gültig
100,
50000,
promptTemplateFile,
null,
null,
"INFO",
"test-api-key"
);
assertDoesNotThrow(() -> validator.validate(config));
}
@Test
void validate_failsWhenMaxTextCharactersIsZero() throws Exception {
Path sourceFolder = Files.createDirectory(tempDir.resolve("source"));
Path targetFolder = Files.createDirectory(tempDir.resolve("target"));
Path sqliteFile = Files.createFile(tempDir.resolve("db.sqlite"));
Path promptTemplateFile = Files.createFile(tempDir.resolve("prompt.txt"));
StartConfiguration config = new StartConfiguration(
sourceFolder,
targetFolder,
sqliteFile,
URI.create("https://api.example.com"),
"gpt-4",
30,
3,
100,
0, // maxTextCharacters = 0 ist ungültig
promptTemplateFile,
null,
null,
"INFO",
"test-api-key"
);
InvalidStartConfigurationException exception = assertThrows(
InvalidStartConfigurationException.class,
() -> validator.validate(config)
);
assertTrue(exception.getMessage().contains("max.text.characters: must be > 0"));
}
@Test @Test
void validate_failsWhenSourceFolderDoesNotExist() throws Exception { void validate_failsWhenSourceFolderDoesNotExist() throws Exception {
Path targetFolder = Files.createDirectory(tempDir.resolve("target")); Path targetFolder = Files.createDirectory(tempDir.resolve("target"));
@@ -832,4 +890,295 @@ class StartConfigurationValidatorTest {
assertDoesNotThrow(() -> validatorWithMock.validate(config), assertDoesNotThrow(() -> validatorWithMock.validate(config),
"Validation should succeed when source folder checker returns null"); "Validation should succeed when source folder checker returns null");
} }
// Neue Tests zur Verbesserung der Abdeckung
@Test
void validate_failsWhenSqliteFileHasNoParent() throws Exception {
Path sourceFolder = Files.createDirectory(tempDir.resolve("source"));
Path targetFolder = Files.createDirectory(tempDir.resolve("target"));
Path promptTemplateFile = Files.createFile(tempDir.resolve("prompt.txt"));
// Ein Pfad ohne Parent (z.B. einfacher Dateiname)
Path sqliteFileWithoutParent = Path.of("db.sqlite");
StartConfiguration config = new StartConfiguration(
sourceFolder,
targetFolder,
sqliteFileWithoutParent,
URI.create("https://api.example.com"),
"gpt-4",
30,
3,
100,
50000,
promptTemplateFile,
null,
null,
"INFO",
"test-api-key"
);
InvalidStartConfigurationException exception = assertThrows(
InvalidStartConfigurationException.class,
() -> validator.validate(config)
);
assertTrue(exception.getMessage().contains("sqlite.file: has no parent directory"));
}
@Test
void validate_failsWhenSqliteFileParentIsNotDirectory() throws Exception {
Path sourceFolder = Files.createDirectory(tempDir.resolve("source"));
Path targetFolder = Files.createDirectory(tempDir.resolve("target"));
Path promptTemplateFile = Files.createFile(tempDir.resolve("prompt.txt"));
// Erstelle eine Datei und versuche dann, eine Unterdatei davon zu erstellen
Path parentFile = Files.createFile(tempDir.resolve("parentFile.txt"));
Path sqliteFileWithFileAsParent = parentFile.resolve("db.sqlite");
StartConfiguration config = new StartConfiguration(
sourceFolder,
targetFolder,
sqliteFileWithFileAsParent,
URI.create("https://api.example.com"),
"gpt-4",
30,
3,
100,
50000,
promptTemplateFile,
null,
null,
"INFO",
"test-api-key"
);
InvalidStartConfigurationException exception = assertThrows(
InvalidStartConfigurationException.class,
() -> validator.validate(config)
);
assertTrue(exception.getMessage().contains("sqlite.file: parent is not a directory"));
}
@Test
void validate_apiModelBlankString() throws Exception {
Path sourceFolder = Files.createDirectory(tempDir.resolve("source"));
Path targetFolder = Files.createDirectory(tempDir.resolve("target"));
Path sqliteFile = Files.createFile(tempDir.resolve("db.sqlite"));
Path promptTemplateFile = Files.createFile(tempDir.resolve("prompt.txt"));
StartConfiguration config = new StartConfiguration(
sourceFolder,
targetFolder,
sqliteFile,
URI.create("https://api.example.com"),
" ", // Blank string
30,
3,
100,
50000,
promptTemplateFile,
null,
null,
"INFO",
"test-api-key"
);
InvalidStartConfigurationException exception = assertThrows(
InvalidStartConfigurationException.class,
() -> validator.validate(config)
);
assertTrue(exception.getMessage().contains("api.model: must not be null or blank"));
}
@Test
void validate_apiModelEmptyString() throws Exception {
Path sourceFolder = Files.createDirectory(tempDir.resolve("source"));
Path targetFolder = Files.createDirectory(tempDir.resolve("target"));
Path sqliteFile = Files.createFile(tempDir.resolve("db.sqlite"));
Path promptTemplateFile = Files.createFile(tempDir.resolve("prompt.txt"));
StartConfiguration config = new StartConfiguration(
sourceFolder,
targetFolder,
sqliteFile,
URI.create("https://api.example.com"),
"", // Empty string
30,
3,
100,
50000,
promptTemplateFile,
null,
null,
"INFO",
"test-api-key"
);
InvalidStartConfigurationException exception = assertThrows(
InvalidStartConfigurationException.class,
() -> validator.validate(config)
);
assertTrue(exception.getMessage().contains("api.model: must not be null or blank"));
}
@Test
void validate_runtimeLockFileParentDoesNotExist() throws Exception {
Path sourceFolder = Files.createDirectory(tempDir.resolve("source"));
Path targetFolder = Files.createDirectory(tempDir.resolve("target"));
Path sqliteFile = Files.createFile(tempDir.resolve("db.sqlite"));
Path promptTemplateFile = Files.createFile(tempDir.resolve("prompt.txt"));
StartConfiguration config = new StartConfiguration(
sourceFolder,
targetFolder,
sqliteFile,
URI.create("https://api.example.com"),
"gpt-4",
30,
3,
100,
50000,
promptTemplateFile,
tempDir.resolve("nonexistent/lock.lock"), // Lock file mit nicht existierendem Parent
null,
"INFO",
"test-api-key"
);
InvalidStartConfigurationException exception = assertThrows(
InvalidStartConfigurationException.class,
() -> validator.validate(config)
);
assertTrue(exception.getMessage().contains("runtime.lock.file: parent directory does not exist"));
}
@Test
void validate_runtimeLockFileParentIsNotDirectory() throws Exception {
Path sourceFolder = Files.createDirectory(tempDir.resolve("source"));
Path targetFolder = Files.createDirectory(tempDir.resolve("target"));
Path sqliteFile = Files.createFile(tempDir.resolve("db.sqlite"));
Path promptTemplateFile = Files.createFile(tempDir.resolve("prompt.txt"));
// Erstelle eine Datei und versuche dann, eine Unterdatei davon zu erstellen
Path parentFile = Files.createFile(tempDir.resolve("parentFile.txt"));
Path lockFileWithFileAsParent = parentFile.resolve("lock.lock");
StartConfiguration config = new StartConfiguration(
sourceFolder,
targetFolder,
sqliteFile,
URI.create("https://api.example.com"),
"gpt-4",
30,
3,
100,
50000,
promptTemplateFile,
lockFileWithFileAsParent, // Lock file mit Datei als Parent
null,
"INFO",
"test-api-key"
);
InvalidStartConfigurationException exception = assertThrows(
InvalidStartConfigurationException.class,
() -> validator.validate(config)
);
assertTrue(exception.getMessage().contains("runtime.lock.file: parent is not a directory"));
}
@Test
void validate_logDirectoryExistsButIsNotDirectory() throws Exception {
Path sourceFolder = Files.createDirectory(tempDir.resolve("source"));
Path targetFolder = Files.createDirectory(tempDir.resolve("target"));
Path sqliteFile = Files.createFile(tempDir.resolve("db.sqlite"));
Path promptTemplateFile = Files.createFile(tempDir.resolve("prompt.txt"));
// Erstelle eine Datei, die als Log-Verzeichnis verwendet wird
Path logFileInsteadOfDirectory = Files.createFile(tempDir.resolve("logfile.txt"));
StartConfiguration config = new StartConfiguration(
sourceFolder,
targetFolder,
sqliteFile,
URI.create("https://api.example.com"),
"gpt-4",
30,
3,
100,
50000,
promptTemplateFile,
null,
logFileInsteadOfDirectory, // Datei statt Verzeichnis
"INFO",
"test-api-key"
);
InvalidStartConfigurationException exception = assertThrows(
InvalidStartConfigurationException.class,
() -> validator.validate(config)
);
assertTrue(exception.getMessage().contains("log.directory: exists but is not a directory"));
}
@Test
void validate_apiBaseUrlHttpScheme() throws Exception {
Path sourceFolder = Files.createDirectory(tempDir.resolve("source"));
Path targetFolder = Files.createDirectory(tempDir.resolve("target"));
Path sqliteFile = Files.createFile(tempDir.resolve("db.sqlite"));
Path promptTemplateFile = Files.createFile(tempDir.resolve("prompt.txt"));
StartConfiguration config = new StartConfiguration(
sourceFolder,
targetFolder,
sqliteFile,
URI.create("http://api.example.com"), // HTTP statt HTTPS
"gpt-4",
30,
3,
100,
50000,
promptTemplateFile,
null,
null,
"INFO",
"test-api-key"
);
assertDoesNotThrow(() -> validator.validate(config),
"HTTP scheme should be valid");
}
@Test
void validate_apiBaseUrlNullScheme() throws Exception {
Path sourceFolder = Files.createDirectory(tempDir.resolve("source"));
Path targetFolder = Files.createDirectory(tempDir.resolve("target"));
Path sqliteFile = Files.createFile(tempDir.resolve("db.sqlite"));
Path promptTemplateFile = Files.createFile(tempDir.resolve("prompt.txt"));
StartConfiguration config = new StartConfiguration(
sourceFolder,
targetFolder,
sqliteFile,
URI.create("//api.example.com"), // Kein Schema
"gpt-4",
30,
3,
100,
50000,
promptTemplateFile,
null,
null,
"INFO",
"test-api-key"
);
InvalidStartConfigurationException exception = assertThrows(
InvalidStartConfigurationException.class,
() -> validator.validate(config)
);
// Bei einer URI ohne Schema ist sie nicht absolut, daher kommt zuerst diese Fehlermeldung
assertTrue(exception.getMessage().contains("api.baseUrl: must be an absolute URI"));
}
} }

6
review-input/.gitignore vendored Normal file
View File

@@ -0,0 +1,6 @@
/jacoco-aggregate.xml
/pdf-umbenenner-adapter-in-cli-mutations.xml
/pdf-umbenenner-adapter-out-mutations.xml
/pdf-umbenenner-application-mutations.xml
/pdf-umbenenner-bootstrap-mutations.xml
/pdf-umbenenner-domain-mutations.xml