From b8fa6db4e9c8de8b2c25d8a781cb4d644dd22717 Mon Sep 17 00:00:00 2001 From: Nil MALHOMME Date: Tue, 13 Oct 2026 21:22:33 +0200 Subject: [PATCH 1/2] feat: support multiple report formats in configuration Updated the reporting configuration to accept an array of report formats, allowing users to specify multiple formats such as "html", "json", and "pretty". This change maintains backward compatibility by wrapping single string formats into a list. --- .../ktestify/config/FrameworkConfig.java | 26 ++++++++++-- src/main/resources/application.conf.template | 3 +- src/main/resources/reference.conf | 4 +- .../ktestify/config/FrameworkConfigTest.java | 40 ++++++++++++++----- 4 files changed, 56 insertions(+), 17 deletions(-) diff --git a/src/main/java/io/github/ktestify/config/FrameworkConfig.java b/src/main/java/io/github/ktestify/config/FrameworkConfig.java index d16a9c7..5a1c59b 100644 --- a/src/main/java/io/github/ktestify/config/FrameworkConfig.java +++ b/src/main/java/io/github/ktestify/config/FrameworkConfig.java @@ -16,11 +16,14 @@ package io.github.ktestify.config; import com.typesafe.config.Config; +import com.typesafe.config.ConfigValueType; +import lombok.Getter; + import java.nio.file.Path; import java.nio.file.Paths; import java.time.Duration; +import java.util.List; import java.util.Optional; -import lombok.Getter; /** * Framework-specific configuration. @@ -53,7 +56,7 @@ public final class FrameworkConfig { // Reporting private final boolean enableReporting; - private final String reportFormat; + private final List reportFormats; private final String reportOutputDirectory; FrameworkConfig(Config config) { @@ -81,10 +84,27 @@ public final class FrameworkConfig { // Reporting Config reportConfig = config.getConfig("reporting"); this.enableReporting = reportConfig.getBoolean("enabled"); - this.reportFormat = reportConfig.getString("format"); + this.reportFormats = readReportFormats(reportConfig); this.reportOutputDirectory = reportConfig.getString("output"); } + /** + * Reads the configured report formats. + * + *

{@code ktestify.framework.reporting.format} accepts either a single string ({@code format = "html"}) or an + * array of strings ({@code format = ["html", "json"]}). A single string is wrapped into a one-element list so + * existing configurations keep working. + * + * @param reportConfig the reporting config section + * @return the configured report formats, never null + */ + private static List readReportFormats(Config reportConfig) { + if (reportConfig.getValue("format").valueType() == ConfigValueType.STRING) { + return List.of(reportConfig.getString("format")); + } + return List.copyOf(reportConfig.getStringList("format")); + } + private Optional getOptionalString(Config config, String path) { if (config.hasPath(path) && !config.getIsNull(path)) { String value = config.getString(path); diff --git a/src/main/resources/application.conf.template b/src/main/resources/application.conf.template index 0e406ee..8417cf9 100644 --- a/src/main/resources/application.conf.template +++ b/src/main/resources/application.conf.template @@ -89,7 +89,8 @@ ktestify { # Reporting settings reporting { enabled = true - format = "html" + # One or more report formats: html, json, pretty + format = ["html"] output = "target/test-output" } } diff --git a/src/main/resources/reference.conf b/src/main/resources/reference.conf index 19835b3..747074f 100644 --- a/src/main/resources/reference.conf +++ b/src/main/resources/reference.conf @@ -160,8 +160,8 @@ ktestify { # Reporting settings reporting { enabled = true - # Format: html, json, cucumber - format = "html" + # Report formats: html, json, pretty. Single value or array, e.g. ["html", "json"] + format = ["html"] # Directory for test output/reports output = "src/target/reports/report.html" output = ${?KTESTIFY_OUTPUT_DIR} diff --git a/src/test/java/io/github/ktestify/config/FrameworkConfigTest.java b/src/test/java/io/github/ktestify/config/FrameworkConfigTest.java index 46cf0d6..f0e0f07 100644 --- a/src/test/java/io/github/ktestify/config/FrameworkConfigTest.java +++ b/src/test/java/io/github/ktestify/config/FrameworkConfigTest.java @@ -15,16 +15,14 @@ */ package io.github.ktestify.config; -import static org.junit.jupiter.api.Assertions.*; +import org.junit.jupiter.api.*; import java.nio.file.Path; import java.nio.file.Paths; import java.time.Duration; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; /** * Comprehensive unit tests for FrameworkConfig. Tests all getters, timeout conversions, path resolution, and edge @@ -342,9 +340,9 @@ void shouldGetEnableReporting() { } @Test - @DisplayName("Should get report format") - void shouldGetReportFormat() { - assertEquals("html", frameworkConfig.getReportFormat()); + @DisplayName("Should get default report formats") + void shouldGetDefaultReportFormats() { + assertEquals(List.of("html"), frameworkConfig.getReportFormats()); } @Test @@ -360,16 +358,36 @@ void shouldHandleDisabledReporting() { @Test @DisplayName("Should handle different report formats") void shouldHandleDifferentReportFormats() { - String[] formats = {"html", "json", "cucumber"}; + String[] formats = {"html", "json", "pretty"}; for (String format : formats) { KtestifyConfig config = ConfigBuilder.create() .set("ktestify.framework.reporting.format", format) .build(); - assertEquals(format, config.getFramework().getReportFormat()); + assertEquals(List.of(format), config.getFramework().getReportFormats()); } } + + @Test + @DisplayName("Should accept an array of report formats") + void shouldAcceptArrayOfReportFormats() { + KtestifyConfig config = ConfigBuilder.create() + .set("ktestify.framework.reporting.format", List.of("html", "json")) + .build(); + + assertEquals(List.of("html", "json"), config.getFramework().getReportFormats()); + } + + @Test + @DisplayName("Should handle an empty array of report formats") + void shouldHandleEmptyArrayOfReportFormats() { + KtestifyConfig config = ConfigBuilder.create() + .set("ktestify.framework.reporting.format", List.of()) + .build(); + + assertTrue(config.getFramework().getReportFormats().isEmpty()); + } } // ========================================== From 67f03346089e89bf73d6bdfac8122fcbbfc69a4b Mon Sep 17 00:00:00 2001 From: Nil MALHOMME Date: Tue, 13 Oct 2026 21:23:01 +0200 Subject: [PATCH 2/2] style: spotless --- src/main/java/io/github/ktestify/config/FrameworkConfig.java | 3 +-- .../java/io/github/ktestify/config/FrameworkConfigTest.java | 5 ++--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/main/java/io/github/ktestify/config/FrameworkConfig.java b/src/main/java/io/github/ktestify/config/FrameworkConfig.java index 5a1c59b..d68d728 100644 --- a/src/main/java/io/github/ktestify/config/FrameworkConfig.java +++ b/src/main/java/io/github/ktestify/config/FrameworkConfig.java @@ -17,13 +17,12 @@ import com.typesafe.config.Config; import com.typesafe.config.ConfigValueType; -import lombok.Getter; - import java.nio.file.Path; import java.nio.file.Paths; import java.time.Duration; import java.util.List; import java.util.Optional; +import lombok.Getter; /** * Framework-specific configuration. diff --git a/src/test/java/io/github/ktestify/config/FrameworkConfigTest.java b/src/test/java/io/github/ktestify/config/FrameworkConfigTest.java index f0e0f07..0504a38 100644 --- a/src/test/java/io/github/ktestify/config/FrameworkConfigTest.java +++ b/src/test/java/io/github/ktestify/config/FrameworkConfigTest.java @@ -15,14 +15,13 @@ */ package io.github.ktestify.config; -import org.junit.jupiter.api.*; +import static org.junit.jupiter.api.Assertions.*; import java.nio.file.Path; import java.nio.file.Paths; import java.time.Duration; import java.util.List; - -import static org.junit.jupiter.api.Assertions.*; +import org.junit.jupiter.api.*; /** * Comprehensive unit tests for FrameworkConfig. Tests all getters, timeout conversions, path resolution, and edge