From 43bd72f9a4e8096df0cf34edf0c432107913934d Mon Sep 17 00:00:00 2001 From: Giulio Longfils Date: Fri, 27 Jun 2025 20:44:49 +0200 Subject: [PATCH 001/100] chore: adding lombok.nonNull.exceptionType = JDK to lombok.config to make JaCoCo correctly show branch coverage --- lombok.config | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lombok.config b/lombok.config index 21458e8dc..f2865f663 100644 --- a/lombok.config +++ b/lombok.config @@ -1,2 +1,3 @@ lombok.addLombokGeneratedAnnotation = true -config.stopBubbling = true \ No newline at end of file +lombok.nonNull.exceptionType = JDK +config.stopBubbling = true From c0d9094ddb34e7ca7fe744e93e788344a44548d7 Mon Sep 17 00:00:00 2001 From: Giulio Longfils Date: Fri, 27 Jun 2025 20:50:39 +0200 Subject: [PATCH 002/100] feat: introducing configuration key to override screenshots folder --- .../extensions/resolvers/TestDataResolver.java | 9 ++++++--- .../giulong/spectrum/utils/Configuration.java | 3 +++ .../resources/yaml/configuration.default.yaml | 1 + .../resolvers/TestDataResolverTest.java | 16 +++++++++++++++- 4 files changed, 25 insertions(+), 4 deletions(-) diff --git a/spectrum/src/main/java/io/github/giulong/spectrum/extensions/resolvers/TestDataResolver.java b/spectrum/src/main/java/io/github/giulong/spectrum/extensions/resolvers/TestDataResolver.java index ef3a6262f..68f4143e8 100644 --- a/spectrum/src/main/java/io/github/giulong/spectrum/extensions/resolvers/TestDataResolver.java +++ b/spectrum/src/main/java/io/github/giulong/spectrum/extensions/resolvers/TestDataResolver.java @@ -32,6 +32,7 @@ public TestData resolveParameter(final ParameterContext arg0, final ExtensionCon final ExtensionContext.Store store = context.getStore(GLOBAL); final Configuration configuration = context.getRoot().getStore(GLOBAL).get(CONFIGURATION, Configuration.class); + final String screenshotsFolder = configuration.getApplication().getScreenshotsFolder(); final Configuration.Extent extent = configuration.getExtent(); final String reportFolder = extent.getReportFolder(); final Class clazz = context.getRequiredTestClass(); @@ -41,7 +42,7 @@ public TestData resolveParameter(final ParameterContext arg0, final ExtensionCon final String displayName = fileUtils.sanitize(joinTestDisplayNamesIn(context)); final String testId = buildTestIdFrom(className, displayName); final String fileName = fileUtils.removeExtensionFrom(extent.getFileName()); - final Path screenshotFolderPath = getScreenshotFolderPathForCurrentTest(reportFolder, fileName, classDisplayName, displayName); + final Path screenshotFolderPath = getScreenshotFolderPathForCurrentTest(screenshotsFolder, reportFolder, fileName, classDisplayName, displayName); final Path videoPath = getVideoPathForCurrentTest(configuration.getVideo().isDisabled(), reportFolder, fileName, classDisplayName, displayName); final TestData testData = TestData .builder() @@ -79,8 +80,10 @@ public static String joinTestDisplayNamesIn(final ExtensionContext context) { return String.join(" ", displayNames.reversed()); } - Path getScreenshotFolderPathForCurrentTest(final String reportsFolder, final String extentFileName, final String className, final String methodName) { - return fileUtils.deleteContentOf(Path.of(reportsFolder, extentFileName, "screenshots", className, methodName).toAbsolutePath()); + Path getScreenshotFolderPathForCurrentTest(final String screenshotsFolder, final String reportsFolder, final String extentFileName, + final String className, final String methodName) { + final Path basePath = screenshotsFolder != null ? Path.of(screenshotsFolder) : Path.of(reportsFolder, extentFileName); + return fileUtils.deleteContentOf(basePath.toAbsolutePath().resolve("screenshots").resolve(className).resolve(methodName)); } Path getVideoPathForCurrentTest(final boolean disabled, final String reportsFolder, final String extentFileName, final String className, final String methodName) { diff --git a/spectrum/src/main/java/io/github/giulong/spectrum/utils/Configuration.java b/spectrum/src/main/java/io/github/giulong/spectrum/utils/Configuration.java index 78a8afa14..3a2fa2ea7 100644 --- a/spectrum/src/main/java/io/github/giulong/spectrum/utils/Configuration.java +++ b/spectrum/src/main/java/io/github/giulong/spectrum/utils/Configuration.java @@ -111,6 +111,9 @@ public static class Application { @JsonPropertyDescription("Application's under test base url") private String baseUrl; + @JsonPropertyDescription("Path where to save screenshots. If not provided, screenshots are saved in the target folder.") + private String screenshotsFolder; + @JsonPropertyDescription("Highlight the web elements the test interacts with. Useful to visually debug the execution") private Highlight highlight; diff --git a/spectrum/src/main/resources/yaml/configuration.default.yaml b/spectrum/src/main/resources/yaml/configuration.default.yaml index 7d41d5712..a9d690fb2 100644 --- a/spectrum/src/main/resources/yaml/configuration.default.yaml +++ b/spectrum/src/main/resources/yaml/configuration.default.yaml @@ -16,6 +16,7 @@ runtime: # Application under test application: baseUrl: http://localhost:8080 # Application's under test base url + screenshotsFolder: null # Path where to save screenshots. If not provided, screenshots are saved in the target folder. highlight: # Highlight the web elements the test interacts with. Useful to visually debug the execution js: js/highlight.js # Path to the js used to highlight. Relative to the resources folder diff --git a/spectrum/src/test/java/io/github/giulong/spectrum/extensions/resolvers/TestDataResolverTest.java b/spectrum/src/test/java/io/github/giulong/spectrum/extensions/resolvers/TestDataResolverTest.java index c64893d8b..a46b836e9 100644 --- a/spectrum/src/test/java/io/github/giulong/spectrum/extensions/resolvers/TestDataResolverTest.java +++ b/spectrum/src/test/java/io/github/giulong/spectrum/extensions/resolvers/TestDataResolverTest.java @@ -31,6 +31,7 @@ class TestDataResolverTest { private static final String CLASS_NAME = "className"; private static final String METHOD_NAME = "methodName"; private static final String REPORTS_FOLDER = "reportsFolder"; + private static final String SCREENSHOTS_FOLDER = "screenshotsFolder"; private static MockedStatic testDataMockedStatic; @@ -73,6 +74,9 @@ class TestDataResolverTest { @Mock private TestData.TestDataBuilder testDataBuilder; + @Mock + private Configuration.Application application; + @Mock private TestData testData; @@ -138,6 +142,7 @@ void resolveParameter() throws NoSuchMethodException { when(context.getRoot()).thenReturn(rootContext); when(rootContext.getStore(GLOBAL)).thenReturn(rootStore); when(rootStore.get(CONFIGURATION, Configuration.class)).thenReturn(configuration); + when(configuration.getApplication()).thenReturn(application); when(configuration.getExtent()).thenReturn(extent); when(extent.getReportFolder()).thenReturn(REPORTS_FOLDER); when(extent.getFileName()).thenReturn(fileName); @@ -169,7 +174,16 @@ void getScreenshotFolderPathForCurrentTest() { final String extentFileName = "extentFileName"; when(fileUtils.deleteContentOf(Path.of(REPORTS_FOLDER, extentFileName, "screenshots", CLASS_NAME, METHOD_NAME).toAbsolutePath())).thenReturn(path); - assertEquals(path, testDataResolver.getScreenshotFolderPathForCurrentTest(REPORTS_FOLDER, extentFileName, CLASS_NAME, METHOD_NAME)); + assertEquals(path, testDataResolver.getScreenshotFolderPathForCurrentTest(null, REPORTS_FOLDER, extentFileName, CLASS_NAME, METHOD_NAME)); + } + + @Test + @DisplayName("getScreenshotFolderPathForCurrentTest should return the path for the current test and create the dirs if screenshotPath is provided") + void getScreenshotFolderPathForCurrentTestScreenshotPathProvided() { + final String extentFileName = "extentFileName"; + + when(fileUtils.deleteContentOf(Path.of(SCREENSHOTS_FOLDER, "screenshots", CLASS_NAME, METHOD_NAME).toAbsolutePath())).thenReturn(path); + assertEquals(path, testDataResolver.getScreenshotFolderPathForCurrentTest(SCREENSHOTS_FOLDER, REPORTS_FOLDER, extentFileName, CLASS_NAME, METHOD_NAME)); } @Test From 189bcb082c6c3adf49630adc323d4cd070ef55b1 Mon Sep 17 00:00:00 2001 From: Giulio Longfils Date: Sat, 28 Jun 2025 00:00:07 +0200 Subject: [PATCH 003/100] refactor: replacing uuid with incremental number as screenshots suffix --- .../io/github/giulong/spectrum/SpectrumEntity.java | 2 +- .../io/github/giulong/spectrum/types/TestData.java | 5 +++++ .../io/github/giulong/spectrum/utils/FileUtils.java | 6 +++--- .../utils/web_driver_events/ScreenshotConsumer.java | 2 +- .../io/github/giulong/spectrum/SpectrumEntityTest.java | 10 +++++----- .../github/giulong/spectrum/utils/FileUtilsTest.java | 8 ++++++-- .../web_driver_events/ScreenshotConsumerTest.java | 2 +- 7 files changed, 22 insertions(+), 13 deletions(-) diff --git a/spectrum/src/main/java/io/github/giulong/spectrum/SpectrumEntity.java b/spectrum/src/main/java/io/github/giulong/spectrum/SpectrumEntity.java index acc41d2b9..2ee741d35 100644 --- a/spectrum/src/main/java/io/github/giulong/spectrum/SpectrumEntity.java +++ b/spectrum/src/main/java/io/github/giulong/spectrum/SpectrumEntity.java @@ -178,7 +178,7 @@ public T screenshotFail(final String msg) { */ @SneakyThrows public Media addScreenshotToReport(final String msg, final Status status) { - final String fileName = fileUtils.getScreenshotNameFrom(MANUAL, statefulExtentTest); + final String fileName = fileUtils.getScreenshotNameFrom(MANUAL, statefulExtentTest, testData); final Path screenshotPath = testData.getScreenshotFolderPath().resolve(fileName); Files.write(screenshotPath, ((TakesScreenshot) driver).getScreenshotAs(BYTES)); diff --git a/spectrum/src/main/java/io/github/giulong/spectrum/types/TestData.java b/spectrum/src/main/java/io/github/giulong/spectrum/types/TestData.java index 9481e4e2e..eaf38938f 100644 --- a/spectrum/src/main/java/io/github/giulong/spectrum/types/TestData.java +++ b/spectrum/src/main/java/io/github/giulong/spectrum/types/TestData.java @@ -16,6 +16,7 @@ public class TestData { private String testId; private Path screenshotFolderPath; private Path videoPath; + private int screenshotNumber; @Setter private int frameNumber; @@ -25,4 +26,8 @@ public class TestData { @Setter private String displayName; + + public int getAndIncrementScreenshotNumber() { + return screenshotNumber++; + } } diff --git a/spectrum/src/main/java/io/github/giulong/spectrum/utils/FileUtils.java b/spectrum/src/main/java/io/github/giulong/spectrum/utils/FileUtils.java index 558414ab4..c9a3e8ad5 100644 --- a/spectrum/src/main/java/io/github/giulong/spectrum/utils/FileUtils.java +++ b/spectrum/src/main/java/io/github/giulong/spectrum/utils/FileUtils.java @@ -1,6 +1,7 @@ package io.github.giulong.spectrum.utils; import io.github.giulong.spectrum.enums.Frame; +import io.github.giulong.spectrum.types.TestData; import lombok.NoArgsConstructor; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; @@ -20,7 +21,6 @@ import java.util.stream.Stream; import static java.util.Comparator.reverseOrder; -import static java.util.UUID.randomUUID; import static lombok.AccessLevel.PRIVATE; @Slf4j @@ -130,7 +130,7 @@ public FileTime getCreationTimeOf(final File file) { return Files.readAttributes(file.toPath(), BasicFileAttributes.class).creationTime(); } - public String getScreenshotNameFrom(final Frame frame, final StatefulExtentTest statefulExtentTest) { - return String.format("%s-%s-%s.png", frame.getValue(), statefulExtentTest.getDisplayName(), randomUUID()); + public String getScreenshotNameFrom(final Frame frame, final StatefulExtentTest statefulExtentTest, final TestData testData) { + return String.format("%s-%s-%d.png", frame.getValue(), statefulExtentTest.getDisplayName(), testData.getAndIncrementScreenshotNumber()); } } diff --git a/spectrum/src/main/java/io/github/giulong/spectrum/utils/web_driver_events/ScreenshotConsumer.java b/spectrum/src/main/java/io/github/giulong/spectrum/utils/web_driver_events/ScreenshotConsumer.java index 31a92d273..0f8ee12ab 100644 --- a/spectrum/src/main/java/io/github/giulong/spectrum/utils/web_driver_events/ScreenshotConsumer.java +++ b/spectrum/src/main/java/io/github/giulong/spectrum/utils/web_driver_events/ScreenshotConsumer.java @@ -32,7 +32,7 @@ public void accept(final WebDriverEvent webDriverEvent) { final Frame frame = webDriverEvent.getFrame(); if (video.shouldRecord(frame)) { - final String fileName = fileUtils.getScreenshotNameFrom(frame, statefulExtentTest); + final String fileName = fileUtils.getScreenshotNameFrom(frame, statefulExtentTest, testData); final Path screenshotPath = testData.getScreenshotFolderPath().resolve(fileName); final Path path = Files.write(screenshotPath, driver.getScreenshotAs(BYTES)); log.trace("Recording frame {} for event '{}' at {}", frame, webDriverEvent.getMessage(), path); diff --git a/spectrum/src/test/java/io/github/giulong/spectrum/SpectrumEntityTest.java b/spectrum/src/test/java/io/github/giulong/spectrum/SpectrumEntityTest.java index fabab6ed2..10dd2eeb2 100644 --- a/spectrum/src/test/java/io/github/giulong/spectrum/SpectrumEntityTest.java +++ b/spectrum/src/test/java/io/github/giulong/spectrum/SpectrumEntityTest.java @@ -149,11 +149,11 @@ void afterEach() { @SneakyThrows private void addScreenshotToReportStubs() { - when(fileUtils.getScreenshotNameFrom(MANUAL, statefulExtentTest)).thenReturn(screenshotName); + when(fileUtils.getScreenshotNameFrom(MANUAL, statefulExtentTest, testData)).thenReturn(screenshotName); when(testData.getScreenshotFolderPath()).thenReturn(path); when(((TakesScreenshot) webDriver).getScreenshotAs(BYTES)).thenReturn(new byte[]{1, 2, 3}); - when(fileUtils.getScreenshotNameFrom(MANUAL, statefulExtentTest)).thenReturn(screenshotName); + when(fileUtils.getScreenshotNameFrom(MANUAL, statefulExtentTest, testData)).thenReturn(screenshotName); when(testData.getScreenshotFolderPath()).thenReturn(reportsFolder); when(reportsFolder.resolve(screenshotName)).thenReturn(path); when(statefulExtentTest.getCurrentNode()).thenReturn(extentTest); @@ -210,11 +210,11 @@ void hover() { @Test @DisplayName("screenshot should delegate to addScreenshotToReport") void screenshot() { - when(fileUtils.getScreenshotNameFrom(MANUAL, statefulExtentTest)).thenReturn(screenshotName); + when(fileUtils.getScreenshotNameFrom(MANUAL, statefulExtentTest, testData)).thenReturn(screenshotName); when(testData.getScreenshotFolderPath()).thenReturn(path); when(((TakesScreenshot) webDriver).getScreenshotAs(BYTES)).thenReturn(new byte[]{1, 2, 3}); - when(fileUtils.getScreenshotNameFrom(MANUAL, statefulExtentTest)).thenReturn(screenshotName); + when(fileUtils.getScreenshotNameFrom(MANUAL, statefulExtentTest, testData)).thenReturn(screenshotName); when(testData.getScreenshotFolderPath()).thenReturn(reportsFolder); when(reportsFolder.resolve(screenshotName)).thenReturn(path); when(statefulExtentTest.getCurrentNode()).thenReturn(extentTest); @@ -273,7 +273,7 @@ void failWithScreenshot() { void addScreenshotToReport() { final Status status = INFO; - when(fileUtils.getScreenshotNameFrom(MANUAL, statefulExtentTest)).thenReturn(screenshotName); + when(fileUtils.getScreenshotNameFrom(MANUAL, statefulExtentTest, testData)).thenReturn(screenshotName); when(testData.getScreenshotFolderPath()).thenReturn(reportsFolder); when(reportsFolder.resolve(screenshotName)).thenReturn(path); when(statefulExtentTest.getCurrentNode()).thenReturn(extentTest); diff --git a/spectrum/src/test/java/io/github/giulong/spectrum/utils/FileUtilsTest.java b/spectrum/src/test/java/io/github/giulong/spectrum/utils/FileUtilsTest.java index 73dca806e..0eade823e 100644 --- a/spectrum/src/test/java/io/github/giulong/spectrum/utils/FileUtilsTest.java +++ b/spectrum/src/test/java/io/github/giulong/spectrum/utils/FileUtilsTest.java @@ -1,5 +1,6 @@ package io.github.giulong.spectrum.utils; +import io.github.giulong.spectrum.types.TestData; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; @@ -26,7 +27,6 @@ class FileUtilsTest { private static final String DISPLAY_NAME = "displayName"; - private static final String UUID_REGEX = AUTO_AFTER.getValue() + "-" + DISPLAY_NAME + "-([a-f0-9]{8}(-[a-f0-9]{4}){4}[a-f0-9]{8})\\.png"; @Mock private BasicFileAttributes basicFileAttributes; @@ -46,6 +46,9 @@ class FileUtilsTest { @Mock private StatefulExtentTest statefulExtentTest; + @Mock + private TestData testData; + @InjectMocks private FileUtils fileUtils; @@ -238,7 +241,8 @@ void getCreationTimeOf() throws IOException { @DisplayName("getScreenshotNameFrom should return the name for the provided frame and display name") void getScreenshotNameFrom() { when(statefulExtentTest.getDisplayName()).thenReturn(DISPLAY_NAME); + when(testData.getAndIncrementScreenshotNumber()).thenReturn(123); - assertThat(fileUtils.getScreenshotNameFrom(AUTO_AFTER, statefulExtentTest), matchesPattern(UUID_REGEX)); + assertEquals(fileUtils.getScreenshotNameFrom(AUTO_AFTER, statefulExtentTest, testData), "autoAfter-displayName-123.png"); } } diff --git a/spectrum/src/test/java/io/github/giulong/spectrum/utils/web_driver_events/ScreenshotConsumerTest.java b/spectrum/src/test/java/io/github/giulong/spectrum/utils/web_driver_events/ScreenshotConsumerTest.java index 1ce1dc924..f3571ab5e 100644 --- a/spectrum/src/test/java/io/github/giulong/spectrum/utils/web_driver_events/ScreenshotConsumerTest.java +++ b/spectrum/src/test/java/io/github/giulong/spectrum/utils/web_driver_events/ScreenshotConsumerTest.java @@ -80,7 +80,7 @@ void accept() { when(driver.getScreenshotAs(BYTES)).thenReturn(new byte[]{1, 2, 3}); when(webDriverEvent.getFrame()).thenReturn(frame); - when(fileUtils.getScreenshotNameFrom(frame, statefulExtentTest)).thenReturn(fileName); + when(fileUtils.getScreenshotNameFrom(frame, statefulExtentTest, testData)).thenReturn(fileName); screenshotConsumer.accept(webDriverEvent); From 171c033085b06148bbb258a955f42743d97e677e Mon Sep 17 00:00:00 2001 From: Giulio Longfils Date: Sun, 29 Jun 2025 13:41:52 +0200 Subject: [PATCH 004/100] refactor: deleting logback-test.xml from it modules --- it-appium/src/test/resources/logback-test.xml | 25 ------------------- it-bidi/src/test/resources/logback-test.xml | 15 ----------- it-grid/src/test/resources/logback-test.xml | 25 ------------------- it-macos/src/test/resources/logback-test.xml | 25 ------------------- .../src/test/resources/logback-test.xml | 25 ------------------- it/src/test/resources/logback-test.xml | 15 ----------- spectrum/src/test/resources/logback-test.xml | 15 ----------- 7 files changed, 145 deletions(-) delete mode 100644 it-appium/src/test/resources/logback-test.xml delete mode 100644 it-bidi/src/test/resources/logback-test.xml delete mode 100644 it-grid/src/test/resources/logback-test.xml delete mode 100644 it-macos/src/test/resources/logback-test.xml delete mode 100644 it-testbook/src/test/resources/logback-test.xml delete mode 100644 it/src/test/resources/logback-test.xml delete mode 100644 spectrum/src/test/resources/logback-test.xml diff --git a/it-appium/src/test/resources/logback-test.xml b/it-appium/src/test/resources/logback-test.xml deleted file mode 100644 index f42375332..000000000 --- a/it-appium/src/test/resources/logback-test.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - ${COLOR_PATTERN} - - - - - ${FILE_PATH}/spectrum.log - - ${PATTERN} - - - - - - - - diff --git a/it-bidi/src/test/resources/logback-test.xml b/it-bidi/src/test/resources/logback-test.xml deleted file mode 100644 index 2b93afa3a..000000000 --- a/it-bidi/src/test/resources/logback-test.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - ${COLOR_PATTERN} - - - - - - - diff --git a/it-grid/src/test/resources/logback-test.xml b/it-grid/src/test/resources/logback-test.xml deleted file mode 100644 index f42375332..000000000 --- a/it-grid/src/test/resources/logback-test.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - ${COLOR_PATTERN} - - - - - ${FILE_PATH}/spectrum.log - - ${PATTERN} - - - - - - - - diff --git a/it-macos/src/test/resources/logback-test.xml b/it-macos/src/test/resources/logback-test.xml deleted file mode 100644 index f42375332..000000000 --- a/it-macos/src/test/resources/logback-test.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - ${COLOR_PATTERN} - - - - - ${FILE_PATH}/spectrum.log - - ${PATTERN} - - - - - - - - diff --git a/it-testbook/src/test/resources/logback-test.xml b/it-testbook/src/test/resources/logback-test.xml deleted file mode 100644 index f42375332..000000000 --- a/it-testbook/src/test/resources/logback-test.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - ${COLOR_PATTERN} - - - - - ${FILE_PATH}/spectrum.log - - ${PATTERN} - - - - - - - - diff --git a/it/src/test/resources/logback-test.xml b/it/src/test/resources/logback-test.xml deleted file mode 100644 index 2b93afa3a..000000000 --- a/it/src/test/resources/logback-test.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - ${COLOR_PATTERN} - - - - - - - diff --git a/spectrum/src/test/resources/logback-test.xml b/spectrum/src/test/resources/logback-test.xml deleted file mode 100644 index 7decac196..000000000 --- a/spectrum/src/test/resources/logback-test.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - ${COLOR_PATTERN} - - - - - - - From 9166bbf93fd3af0c3f02174e91595ecfe2efdd0e Mon Sep 17 00:00:00 2001 From: Giulio Longfils Date: Sun, 29 Jun 2025 20:08:16 +0200 Subject: [PATCH 005/100] refactor: leveraging Files.notExists instead of explicitly negating Files.exists --- .../java/io/github/giulong/spectrum/utils/FileUtils.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/spectrum/src/main/java/io/github/giulong/spectrum/utils/FileUtils.java b/spectrum/src/main/java/io/github/giulong/spectrum/utils/FileUtils.java index c9a3e8ad5..2297ea1ab 100644 --- a/spectrum/src/main/java/io/github/giulong/spectrum/utils/FileUtils.java +++ b/spectrum/src/main/java/io/github/giulong/spectrum/utils/FileUtils.java @@ -72,7 +72,7 @@ public String removeExtensionFrom(final String fileName) { @SneakyThrows public Path delete(final Path path) { - if (!Files.exists(path)) { + if (Files.notExists(path)) { log.debug("Avoid deleting non-existing path '{}'", path); return path; } @@ -133,4 +133,8 @@ public FileTime getCreationTimeOf(final File file) { public String getScreenshotNameFrom(final Frame frame, final StatefulExtentTest statefulExtentTest, final TestData testData) { return String.format("%s-%s-%d.png", frame.getValue(), statefulExtentTest.getDisplayName(), testData.getAndIncrementScreenshotNumber()); } + + public String getVisualRegressionScreenshotNameFrom(final Frame frame, final StatefulExtentTest statefulExtentTest, final TestData testData) { + return String.format("%s-%s-%d-failed.png", frame.getValue(), statefulExtentTest.getDisplayName(), testData.getScreenshotNumber()); + } } From 40ecfc3857cb89d8e65351d52961df29f2082227 Mon Sep 17 00:00:00 2001 From: Giulio Longfils Date: Mon, 30 Jun 2025 22:56:49 +0200 Subject: [PATCH 006/100] refactor: simplifying screenshot names removing leading frame value --- .../io/github/giulong/spectrum/SpectrumEntity.java | 2 +- .../io/github/giulong/spectrum/utils/FileUtils.java | 9 ++++----- .../spectrum/utils/events/VideoDynamicConsumer.java | 4 ++-- .../utils/web_driver_events/ScreenshotConsumer.java | 2 +- .../io/github/giulong/spectrum/SpectrumEntityTest.java | 10 +++++----- .../github/giulong/spectrum/utils/FileUtilsTest.java | 3 +-- .../utils/events/VideoDynamicConsumerTest.java | 4 ++-- .../web_driver_events/ScreenshotConsumerTest.java | 2 +- 8 files changed, 17 insertions(+), 19 deletions(-) diff --git a/spectrum/src/main/java/io/github/giulong/spectrum/SpectrumEntity.java b/spectrum/src/main/java/io/github/giulong/spectrum/SpectrumEntity.java index 2ee741d35..f2a237348 100644 --- a/spectrum/src/main/java/io/github/giulong/spectrum/SpectrumEntity.java +++ b/spectrum/src/main/java/io/github/giulong/spectrum/SpectrumEntity.java @@ -178,7 +178,7 @@ public T screenshotFail(final String msg) { */ @SneakyThrows public Media addScreenshotToReport(final String msg, final Status status) { - final String fileName = fileUtils.getScreenshotNameFrom(MANUAL, statefulExtentTest, testData); + final String fileName = fileUtils.getScreenshotNameFrom(statefulExtentTest, testData); final Path screenshotPath = testData.getScreenshotFolderPath().resolve(fileName); Files.write(screenshotPath, ((TakesScreenshot) driver).getScreenshotAs(BYTES)); diff --git a/spectrum/src/main/java/io/github/giulong/spectrum/utils/FileUtils.java b/spectrum/src/main/java/io/github/giulong/spectrum/utils/FileUtils.java index 2297ea1ab..99dee6015 100644 --- a/spectrum/src/main/java/io/github/giulong/spectrum/utils/FileUtils.java +++ b/spectrum/src/main/java/io/github/giulong/spectrum/utils/FileUtils.java @@ -1,6 +1,5 @@ package io.github.giulong.spectrum.utils; -import io.github.giulong.spectrum.enums.Frame; import io.github.giulong.spectrum.types.TestData; import lombok.NoArgsConstructor; import lombok.SneakyThrows; @@ -130,11 +129,11 @@ public FileTime getCreationTimeOf(final File file) { return Files.readAttributes(file.toPath(), BasicFileAttributes.class).creationTime(); } - public String getScreenshotNameFrom(final Frame frame, final StatefulExtentTest statefulExtentTest, final TestData testData) { - return String.format("%s-%s-%d.png", frame.getValue(), statefulExtentTest.getDisplayName(), testData.getAndIncrementScreenshotNumber()); + public String getScreenshotNameFrom(final StatefulExtentTest statefulExtentTest, final TestData testData) { + return String.format("%s-%d.png", statefulExtentTest.getDisplayName(), testData.getAndIncrementScreenshotNumber()); } - public String getVisualRegressionScreenshotNameFrom(final Frame frame, final StatefulExtentTest statefulExtentTest, final TestData testData) { - return String.format("%s-%s-%d-failed.png", frame.getValue(), statefulExtentTest.getDisplayName(), testData.getScreenshotNumber()); + public String getVisualRegressionScreenshotNameFrom(final StatefulExtentTest statefulExtentTest, final TestData testData) { + return String.format("%s-%d-failed.png", statefulExtentTest.getDisplayName(), testData.getScreenshotNumber()); } } diff --git a/spectrum/src/main/java/io/github/giulong/spectrum/utils/events/VideoDynamicConsumer.java b/spectrum/src/main/java/io/github/giulong/spectrum/utils/events/VideoDynamicConsumer.java index 553e41fe7..a066570d0 100644 --- a/spectrum/src/main/java/io/github/giulong/spectrum/utils/events/VideoDynamicConsumer.java +++ b/spectrum/src/main/java/io/github/giulong/spectrum/utils/events/VideoDynamicConsumer.java @@ -12,7 +12,7 @@ @JsonView(Internal.class) public class VideoDynamicConsumer extends VideoConsumer { - private static final Pattern PATTERN = Pattern.compile("[A-Za-z]+-(?.*)-([a-f0-9]{8}(-[a-f0-9]{4}){4}[a-f0-9]{8})\\.png"); + private static final Pattern SCREENSHOT_NAME_PATTERN = Pattern.compile("(?.*)-\\d+\\.png"); private String lastFrameDisplayName; @@ -29,7 +29,7 @@ protected Path getVideoPathFrom(final TestData testData) { @Override protected boolean filter(final File file, final TestData testData) { - final Matcher matcher = PATTERN.matcher(file.getName()); + final Matcher matcher = SCREENSHOT_NAME_PATTERN.matcher(file.getName()); return matcher.find() && testData.getDisplayName().equals(matcher.group("displayName")); } diff --git a/spectrum/src/main/java/io/github/giulong/spectrum/utils/web_driver_events/ScreenshotConsumer.java b/spectrum/src/main/java/io/github/giulong/spectrum/utils/web_driver_events/ScreenshotConsumer.java index 0f8ee12ab..192133d14 100644 --- a/spectrum/src/main/java/io/github/giulong/spectrum/utils/web_driver_events/ScreenshotConsumer.java +++ b/spectrum/src/main/java/io/github/giulong/spectrum/utils/web_driver_events/ScreenshotConsumer.java @@ -32,7 +32,7 @@ public void accept(final WebDriverEvent webDriverEvent) { final Frame frame = webDriverEvent.getFrame(); if (video.shouldRecord(frame)) { - final String fileName = fileUtils.getScreenshotNameFrom(frame, statefulExtentTest, testData); + final String fileName = fileUtils.getScreenshotNameFrom(statefulExtentTest, testData); final Path screenshotPath = testData.getScreenshotFolderPath().resolve(fileName); final Path path = Files.write(screenshotPath, driver.getScreenshotAs(BYTES)); log.trace("Recording frame {} for event '{}' at {}", frame, webDriverEvent.getMessage(), path); diff --git a/spectrum/src/test/java/io/github/giulong/spectrum/SpectrumEntityTest.java b/spectrum/src/test/java/io/github/giulong/spectrum/SpectrumEntityTest.java index 10dd2eeb2..df28d8623 100644 --- a/spectrum/src/test/java/io/github/giulong/spectrum/SpectrumEntityTest.java +++ b/spectrum/src/test/java/io/github/giulong/spectrum/SpectrumEntityTest.java @@ -149,11 +149,11 @@ void afterEach() { @SneakyThrows private void addScreenshotToReportStubs() { - when(fileUtils.getScreenshotNameFrom(MANUAL, statefulExtentTest, testData)).thenReturn(screenshotName); + when(fileUtils.getScreenshotNameFrom(statefulExtentTest, testData)).thenReturn(screenshotName); when(testData.getScreenshotFolderPath()).thenReturn(path); when(((TakesScreenshot) webDriver).getScreenshotAs(BYTES)).thenReturn(new byte[]{1, 2, 3}); - when(fileUtils.getScreenshotNameFrom(MANUAL, statefulExtentTest, testData)).thenReturn(screenshotName); + when(fileUtils.getScreenshotNameFrom(statefulExtentTest, testData)).thenReturn(screenshotName); when(testData.getScreenshotFolderPath()).thenReturn(reportsFolder); when(reportsFolder.resolve(screenshotName)).thenReturn(path); when(statefulExtentTest.getCurrentNode()).thenReturn(extentTest); @@ -210,11 +210,11 @@ void hover() { @Test @DisplayName("screenshot should delegate to addScreenshotToReport") void screenshot() { - when(fileUtils.getScreenshotNameFrom(MANUAL, statefulExtentTest, testData)).thenReturn(screenshotName); + when(fileUtils.getScreenshotNameFrom(statefulExtentTest, testData)).thenReturn(screenshotName); when(testData.getScreenshotFolderPath()).thenReturn(path); when(((TakesScreenshot) webDriver).getScreenshotAs(BYTES)).thenReturn(new byte[]{1, 2, 3}); - when(fileUtils.getScreenshotNameFrom(MANUAL, statefulExtentTest, testData)).thenReturn(screenshotName); + when(fileUtils.getScreenshotNameFrom(statefulExtentTest, testData)).thenReturn(screenshotName); when(testData.getScreenshotFolderPath()).thenReturn(reportsFolder); when(reportsFolder.resolve(screenshotName)).thenReturn(path); when(statefulExtentTest.getCurrentNode()).thenReturn(extentTest); @@ -273,7 +273,7 @@ void failWithScreenshot() { void addScreenshotToReport() { final Status status = INFO; - when(fileUtils.getScreenshotNameFrom(MANUAL, statefulExtentTest, testData)).thenReturn(screenshotName); + when(fileUtils.getScreenshotNameFrom(statefulExtentTest, testData)).thenReturn(screenshotName); when(testData.getScreenshotFolderPath()).thenReturn(reportsFolder); when(reportsFolder.resolve(screenshotName)).thenReturn(path); when(statefulExtentTest.getCurrentNode()).thenReturn(extentTest); diff --git a/spectrum/src/test/java/io/github/giulong/spectrum/utils/FileUtilsTest.java b/spectrum/src/test/java/io/github/giulong/spectrum/utils/FileUtilsTest.java index 0eade823e..bae380e05 100644 --- a/spectrum/src/test/java/io/github/giulong/spectrum/utils/FileUtilsTest.java +++ b/spectrum/src/test/java/io/github/giulong/spectrum/utils/FileUtilsTest.java @@ -16,7 +16,6 @@ import java.nio.file.attribute.FileTime; import java.util.stream.Stream; -import static io.github.giulong.spectrum.enums.Frame.AUTO_AFTER; import static java.lang.System.lineSeparator; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.matchesPattern; @@ -243,6 +242,6 @@ void getScreenshotNameFrom() { when(statefulExtentTest.getDisplayName()).thenReturn(DISPLAY_NAME); when(testData.getAndIncrementScreenshotNumber()).thenReturn(123); - assertEquals(fileUtils.getScreenshotNameFrom(AUTO_AFTER, statefulExtentTest, testData), "autoAfter-displayName-123.png"); + assertEquals(fileUtils.getScreenshotNameFrom(statefulExtentTest, testData), "displayName-123.png"); } } diff --git a/spectrum/src/test/java/io/github/giulong/spectrum/utils/events/VideoDynamicConsumerTest.java b/spectrum/src/test/java/io/github/giulong/spectrum/utils/events/VideoDynamicConsumerTest.java index 2e1275567..fce197cfe 100644 --- a/spectrum/src/test/java/io/github/giulong/spectrum/utils/events/VideoDynamicConsumerTest.java +++ b/spectrum/src/test/java/io/github/giulong/spectrum/utils/events/VideoDynamicConsumerTest.java @@ -99,8 +99,8 @@ void filter(final String fileName, final boolean expected) { static Stream valuesProvider() { return Stream.of( - arguments("abc-displayName-def12345-1234-1234-1234-123412345678.png", true), - arguments("abc-notMatchingDisplayName-def12345-1234-1234-1234-123412345678.png", false), + arguments("displayName-123.png", true), + arguments("notMatchingDisplayName-123.png", false), arguments("notMatchingAtAll", false) ); } diff --git a/spectrum/src/test/java/io/github/giulong/spectrum/utils/web_driver_events/ScreenshotConsumerTest.java b/spectrum/src/test/java/io/github/giulong/spectrum/utils/web_driver_events/ScreenshotConsumerTest.java index f3571ab5e..b3207ddf8 100644 --- a/spectrum/src/test/java/io/github/giulong/spectrum/utils/web_driver_events/ScreenshotConsumerTest.java +++ b/spectrum/src/test/java/io/github/giulong/spectrum/utils/web_driver_events/ScreenshotConsumerTest.java @@ -80,7 +80,7 @@ void accept() { when(driver.getScreenshotAs(BYTES)).thenReturn(new byte[]{1, 2, 3}); when(webDriverEvent.getFrame()).thenReturn(frame); - when(fileUtils.getScreenshotNameFrom(frame, statefulExtentTest, testData)).thenReturn(fileName); + when(fileUtils.getScreenshotNameFrom(statefulExtentTest, testData)).thenReturn(fileName); screenshotConsumer.accept(webDriverEvent); From f434c986b4eeb1e7f48835f23cf7717ff7996b90 Mon Sep 17 00:00:00 2001 From: Giulio Longfils Date: Tue, 1 Jul 2025 20:17:22 +0200 Subject: [PATCH 007/100] refactor: simplifying video names by removing uuid --- .../extensions/resolvers/TestDataResolver.java | 3 +-- .../extensions/resolvers/TestDataResolverTest.java | 10 +++++----- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/spectrum/src/main/java/io/github/giulong/spectrum/extensions/resolvers/TestDataResolver.java b/spectrum/src/main/java/io/github/giulong/spectrum/extensions/resolvers/TestDataResolver.java index 68f4143e8..8335ac589 100644 --- a/spectrum/src/main/java/io/github/giulong/spectrum/extensions/resolvers/TestDataResolver.java +++ b/spectrum/src/main/java/io/github/giulong/spectrum/extensions/resolvers/TestDataResolver.java @@ -15,7 +15,6 @@ import java.util.List; import static io.github.giulong.spectrum.extensions.resolvers.ConfigurationResolver.CONFIGURATION; -import static java.util.UUID.randomUUID; import static org.junit.jupiter.api.extension.ExtensionContext.Namespace.GLOBAL; @Slf4j @@ -94,7 +93,7 @@ Path getVideoPathForCurrentTest(final boolean disabled, final String reportsFold return fileUtils .deleteContentOf(Path.of(reportsFolder, extentFileName, "videos", className, methodName).toAbsolutePath()) - .resolve(String.format("%s.mp4", randomUUID())); + .resolve("video.mp4"); } static String transformInKebabCase(final String string) { diff --git a/spectrum/src/test/java/io/github/giulong/spectrum/extensions/resolvers/TestDataResolverTest.java b/spectrum/src/test/java/io/github/giulong/spectrum/extensions/resolvers/TestDataResolverTest.java index a46b836e9..5938c36b2 100644 --- a/spectrum/src/test/java/io/github/giulong/spectrum/extensions/resolvers/TestDataResolverTest.java +++ b/spectrum/src/test/java/io/github/giulong/spectrum/extensions/resolvers/TestDataResolverTest.java @@ -1,7 +1,10 @@ package io.github.giulong.spectrum.extensions.resolvers; import io.github.giulong.spectrum.types.TestData; -import io.github.giulong.spectrum.utils.*; +import io.github.giulong.spectrum.utils.Configuration; +import io.github.giulong.spectrum.utils.ContextManager; +import io.github.giulong.spectrum.utils.FileUtils; +import io.github.giulong.spectrum.utils.Reflections; import io.github.giulong.spectrum.utils.video.Video; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; @@ -18,8 +21,6 @@ import static io.github.giulong.spectrum.extensions.resolvers.ConfigurationResolver.CONFIGURATION; import static io.github.giulong.spectrum.extensions.resolvers.TestDataResolver.TEST_DATA; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.matchesPattern; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.extension.ExtensionContext.Namespace.GLOBAL; @@ -27,7 +28,6 @@ class TestDataResolverTest { - private static final String UUID_REGEX = "([a-f0-9]{8}(-[a-f0-9]{4}){4}[a-f0-9]{8})\\.mp4"; private static final String CLASS_NAME = "className"; private static final String METHOD_NAME = "methodName"; private static final String REPORTS_FOLDER = "reportsFolder"; @@ -195,7 +195,7 @@ void getVideoPathForCurrentTest() { when(path.resolve(stringArgumentCaptor.capture())).thenReturn(path); assertEquals(path, testDataResolver.getVideoPathForCurrentTest(false, REPORTS_FOLDER, extentFileName, CLASS_NAME, METHOD_NAME)); - assertThat(stringArgumentCaptor.getValue(), matchesPattern(UUID_REGEX)); + assertEquals("video.mp4", stringArgumentCaptor.getValue()); } @Test From 3c97c72df07fd7fe8c38ffd78a6172410bb25d54 Mon Sep 17 00:00:00 2001 From: Giulio Longfils Date: Tue, 1 Jul 2025 22:08:37 +0200 Subject: [PATCH 008/100] Revert "refactor: simplifying video names by removing uuid" This reverts commit f434c986b4eeb1e7f48835f23cf7717ff7996b90. --- .../extensions/resolvers/TestDataResolver.java | 3 ++- .../extensions/resolvers/TestDataResolverTest.java | 10 +++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/spectrum/src/main/java/io/github/giulong/spectrum/extensions/resolvers/TestDataResolver.java b/spectrum/src/main/java/io/github/giulong/spectrum/extensions/resolvers/TestDataResolver.java index 8335ac589..68f4143e8 100644 --- a/spectrum/src/main/java/io/github/giulong/spectrum/extensions/resolvers/TestDataResolver.java +++ b/spectrum/src/main/java/io/github/giulong/spectrum/extensions/resolvers/TestDataResolver.java @@ -15,6 +15,7 @@ import java.util.List; import static io.github.giulong.spectrum.extensions.resolvers.ConfigurationResolver.CONFIGURATION; +import static java.util.UUID.randomUUID; import static org.junit.jupiter.api.extension.ExtensionContext.Namespace.GLOBAL; @Slf4j @@ -93,7 +94,7 @@ Path getVideoPathForCurrentTest(final boolean disabled, final String reportsFold return fileUtils .deleteContentOf(Path.of(reportsFolder, extentFileName, "videos", className, methodName).toAbsolutePath()) - .resolve("video.mp4"); + .resolve(String.format("%s.mp4", randomUUID())); } static String transformInKebabCase(final String string) { diff --git a/spectrum/src/test/java/io/github/giulong/spectrum/extensions/resolvers/TestDataResolverTest.java b/spectrum/src/test/java/io/github/giulong/spectrum/extensions/resolvers/TestDataResolverTest.java index 5938c36b2..a46b836e9 100644 --- a/spectrum/src/test/java/io/github/giulong/spectrum/extensions/resolvers/TestDataResolverTest.java +++ b/spectrum/src/test/java/io/github/giulong/spectrum/extensions/resolvers/TestDataResolverTest.java @@ -1,10 +1,7 @@ package io.github.giulong.spectrum.extensions.resolvers; import io.github.giulong.spectrum.types.TestData; -import io.github.giulong.spectrum.utils.Configuration; -import io.github.giulong.spectrum.utils.ContextManager; -import io.github.giulong.spectrum.utils.FileUtils; -import io.github.giulong.spectrum.utils.Reflections; +import io.github.giulong.spectrum.utils.*; import io.github.giulong.spectrum.utils.video.Video; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; @@ -21,6 +18,8 @@ import static io.github.giulong.spectrum.extensions.resolvers.ConfigurationResolver.CONFIGURATION; import static io.github.giulong.spectrum.extensions.resolvers.TestDataResolver.TEST_DATA; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.matchesPattern; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.extension.ExtensionContext.Namespace.GLOBAL; @@ -28,6 +27,7 @@ class TestDataResolverTest { + private static final String UUID_REGEX = "([a-f0-9]{8}(-[a-f0-9]{4}){4}[a-f0-9]{8})\\.mp4"; private static final String CLASS_NAME = "className"; private static final String METHOD_NAME = "methodName"; private static final String REPORTS_FOLDER = "reportsFolder"; @@ -195,7 +195,7 @@ void getVideoPathForCurrentTest() { when(path.resolve(stringArgumentCaptor.capture())).thenReturn(path); assertEquals(path, testDataResolver.getVideoPathForCurrentTest(false, REPORTS_FOLDER, extentFileName, CLASS_NAME, METHOD_NAME)); - assertEquals("video.mp4", stringArgumentCaptor.getValue()); + assertThat(stringArgumentCaptor.getValue(), matchesPattern(UUID_REGEX)); } @Test From 28004ada831ead5ffcc39b90643b4e881db61cd3 Mon Sep 17 00:00:00 2001 From: Giulio Longfils Date: Tue, 1 Jul 2025 22:20:31 +0200 Subject: [PATCH 009/100] Revert "refactor: replacing uuid with incremental number as screenshots suffix" This reverts commit 189bcb082c6c3adf49630adc323d4cd070ef55b1. --- .../main/java/io/github/giulong/spectrum/utils/FileUtils.java | 3 ++- .../java/io/github/giulong/spectrum/utils/FileUtilsTest.java | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/spectrum/src/main/java/io/github/giulong/spectrum/utils/FileUtils.java b/spectrum/src/main/java/io/github/giulong/spectrum/utils/FileUtils.java index 99dee6015..de433d05b 100644 --- a/spectrum/src/main/java/io/github/giulong/spectrum/utils/FileUtils.java +++ b/spectrum/src/main/java/io/github/giulong/spectrum/utils/FileUtils.java @@ -20,6 +20,7 @@ import java.util.stream.Stream; import static java.util.Comparator.reverseOrder; +import static java.util.UUID.randomUUID; import static lombok.AccessLevel.PRIVATE; @Slf4j @@ -130,7 +131,7 @@ public FileTime getCreationTimeOf(final File file) { } public String getScreenshotNameFrom(final StatefulExtentTest statefulExtentTest, final TestData testData) { - return String.format("%s-%d.png", statefulExtentTest.getDisplayName(), testData.getAndIncrementScreenshotNumber()); + return String.format("%s-%s.png", statefulExtentTest.getDisplayName(), randomUUID()); } public String getVisualRegressionScreenshotNameFrom(final StatefulExtentTest statefulExtentTest, final TestData testData) { diff --git a/spectrum/src/test/java/io/github/giulong/spectrum/utils/FileUtilsTest.java b/spectrum/src/test/java/io/github/giulong/spectrum/utils/FileUtilsTest.java index bae380e05..78c0d80a5 100644 --- a/spectrum/src/test/java/io/github/giulong/spectrum/utils/FileUtilsTest.java +++ b/spectrum/src/test/java/io/github/giulong/spectrum/utils/FileUtilsTest.java @@ -26,6 +26,7 @@ class FileUtilsTest { private static final String DISPLAY_NAME = "displayName"; + private static final String UUID_REGEX = DISPLAY_NAME + "-([a-f0-9]{8}(-[a-f0-9]{4}){4}[a-f0-9]{8})\\.png"; @Mock private BasicFileAttributes basicFileAttributes; @@ -240,8 +241,7 @@ void getCreationTimeOf() throws IOException { @DisplayName("getScreenshotNameFrom should return the name for the provided frame and display name") void getScreenshotNameFrom() { when(statefulExtentTest.getDisplayName()).thenReturn(DISPLAY_NAME); - when(testData.getAndIncrementScreenshotNumber()).thenReturn(123); - assertEquals(fileUtils.getScreenshotNameFrom(statefulExtentTest, testData), "displayName-123.png"); + assertThat(fileUtils.getScreenshotNameFrom(statefulExtentTest, testData), matchesPattern(UUID_REGEX)); } } From 3fab096cc53d0ee0a3fcf324faf245a63bc16fd5 Mon Sep 17 00:00:00 2001 From: Giulio Longfils Date: Sat, 2 Aug 2025 16:29:55 +0200 Subject: [PATCH 010/100] build: introducing it-visual-regression module --- it-visual-regression/pom.xml | 151 ++++++++++++++++++ .../pages/CheckboxPage.java | 32 ++++ .../pages/LandingPage.java | 32 ++++ .../tests/NavigationIT.java | 63 ++++++++ .../src/test/resources/banner.txt | 19 +++ .../src/test/resources/configuration.yaml | 24 +++ .../test/resources/filtered/properties.yaml | 3 + pom.xml | 2 + 8 files changed, 326 insertions(+) create mode 100644 it-visual-regression/pom.xml create mode 100644 it-visual-regression/src/test/java/io/github/giulong/spectrum/it_visual_regression/pages/CheckboxPage.java create mode 100644 it-visual-regression/src/test/java/io/github/giulong/spectrum/it_visual_regression/pages/LandingPage.java create mode 100644 it-visual-regression/src/test/java/io/github/giulong/spectrum/it_visual_regression/tests/NavigationIT.java create mode 100644 it-visual-regression/src/test/resources/banner.txt create mode 100644 it-visual-regression/src/test/resources/configuration.yaml create mode 100644 it-visual-regression/src/test/resources/filtered/properties.yaml diff --git a/it-visual-regression/pom.xml b/it-visual-regression/pom.xml new file mode 100644 index 000000000..45694c347 --- /dev/null +++ b/it-visual-regression/pom.xml @@ -0,0 +1,151 @@ + + + 4.0.0 + + + io.github.giulong + spectrum-aggregate + ${revision} + + + it-visual-regression + + + + io.github.giulong + spectrum + ${revision} + test + + + + + + + org.apache.maven.plugins + maven-clean-plugin + + + org.apache.maven.plugins + maven-resources-plugin + + + org.apache.maven.plugins + maven-compiler-plugin + + + org.apache.maven.plugins + maven-checkstyle-plugin + + + org.apache.maven.plugins + maven-surefire-plugin + + true + + + + org.apache.maven.plugins + maven-failsafe-plugin + + + + + + + chrome + + + browsersTests + + + + + + org.apache.maven.plugins + maven-failsafe-plugin + + + Chrome IT + + integration-test + + + chrome + + chrome + + target/failsafe-reports/failsafe-chrome.xml + + + + + + + + + firefox + + + browsersTests + + + + + + org.apache.maven.plugins + maven-failsafe-plugin + + + Firefox IT + + integration-test + + + firefox + + firefox + + target/failsafe-reports/failsafe-firefox.xml + + + + + + + + + edge + + + browsersTests + + + + + + org.apache.maven.plugins + maven-failsafe-plugin + + + Edge IT + + integration-test + + + edge + + edge + + target/failsafe-reports/failsafe-edge.xml + + + + + + + + + diff --git a/it-visual-regression/src/test/java/io/github/giulong/spectrum/it_visual_regression/pages/CheckboxPage.java b/it-visual-regression/src/test/java/io/github/giulong/spectrum/it_visual_regression/pages/CheckboxPage.java new file mode 100644 index 000000000..e6eb2579e --- /dev/null +++ b/it-visual-regression/src/test/java/io/github/giulong/spectrum/it_visual_regression/pages/CheckboxPage.java @@ -0,0 +1,32 @@ +package io.github.giulong.spectrum.it_visual_regression.pages; + +import io.github.giulong.spectrum.SpectrumPage; +import io.github.giulong.spectrum.interfaces.Endpoint; +import lombok.Getter; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.support.FindBy; +import org.openqa.selenium.support.FindBys; + +import java.util.List; + +import static org.openqa.selenium.support.ui.ExpectedConditions.*; + +@Getter +@Endpoint("checkboxes") +public class CheckboxPage extends SpectrumPage { + + @FindBys({ + @FindBy(id = "checkboxes"), + @FindBy(tagName = "input") + }) + private List checkboxes; + + @Override + public CheckboxPage waitForPageLoading() { + pageLoadWait.until(and( + urlToBe("https://the-internet.herokuapp.com/checkboxes"), + visibilityOfAllElements(checkboxes))); + + return this; + } +} diff --git a/it-visual-regression/src/test/java/io/github/giulong/spectrum/it_visual_regression/pages/LandingPage.java b/it-visual-regression/src/test/java/io/github/giulong/spectrum/it_visual_regression/pages/LandingPage.java new file mode 100644 index 000000000..893d4dbb4 --- /dev/null +++ b/it-visual-regression/src/test/java/io/github/giulong/spectrum/it_visual_regression/pages/LandingPage.java @@ -0,0 +1,32 @@ +package io.github.giulong.spectrum.it_visual_regression.pages; + +import io.github.giulong.spectrum.SpectrumPage; +import lombok.Getter; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.support.FindBy; + +@Getter +@SuppressWarnings("unused") +public class LandingPage extends SpectrumPage { + + @FindBy(id = "login") + private WebElement form; + + @FindBy(tagName = "h1") + private WebElement title; + + @FindBy(linkText = "A/B Testing") + private WebElement abTestLink; + + @FindBy(linkText = "Add/Remove Elements") + private WebElement addRemoveElementsLink; + + @FindBy(linkText = "Broken Images") + private WebElement brokenImagesLink; + + @FindBy(linkText = "Checkboxes") + private WebElement checkboxLink; + + @FindBy(linkText = "Form Authentication") + private WebElement formLoginLink; +} diff --git a/it-visual-regression/src/test/java/io/github/giulong/spectrum/it_visual_regression/tests/NavigationIT.java b/it-visual-regression/src/test/java/io/github/giulong/spectrum/it_visual_regression/tests/NavigationIT.java new file mode 100644 index 000000000..5d3dc0cbb --- /dev/null +++ b/it-visual-regression/src/test/java/io/github/giulong/spectrum/it_visual_regression/tests/NavigationIT.java @@ -0,0 +1,63 @@ +package io.github.giulong.spectrum.it_visual_regression.tests; + +import io.github.giulong.spectrum.SpectrumTest; +import io.github.giulong.spectrum.it_visual_regression.pages.CheckboxPage; +import io.github.giulong.spectrum.it_visual_regression.pages.LandingPage; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.openqa.selenium.WebElement; + +import static org.junit.jupiter.api.Assertions.*; + +@DisplayName("Navigation") +class NavigationIT extends SpectrumTest { + + // You just need to declare your pages here: Spectrum will take care of instantiating them + // and will inject all the needed fields like the driver + private LandingPage landingPage; + + private CheckboxPage checkboxPage; + + @Test + @DisplayName("Test to show navigation and produced video") + void testWithNoDisplayName() { + // Open the base url of the application under test + driver.get(configuration.getApplication().getBaseUrl()); + assertEquals("Welcome to the-internet", landingPage.getTitle().getText()); + + landingPage.getAbTestLink().click(); + screenshot(); + driver.navigate().back(); + screenshot(); + + landingPage.getAddRemoveElementsLink().click(); + screenshot(); + driver.navigate().back(); + screenshot(); + + landingPage.getBrokenImagesLink().click(); + screenshot(); + driver.navigate().back(); + screenshot(); + + landingPage.getCheckboxLink().click(); + + final WebElement firstCheckbox = checkboxPage.getCheckboxes().getFirst(); + final WebElement secondCheckbox = checkboxPage.getCheckboxes().get(1); + + assertFalse(firstCheckbox.isSelected()); + assertTrue(secondCheckbox.isSelected()); + + screenshot(); + firstCheckbox.click(); + screenshot(); + firstCheckbox.click(); + screenshot(); + firstCheckbox.click(); + screenshot(); + assertTrue(firstCheckbox.isSelected()); + + // Take a screenshot with a custom message + screenshotInfo("After checking the first checkbox"); + } +} diff --git a/it-visual-regression/src/test/resources/banner.txt b/it-visual-regression/src/test/resources/banner.txt new file mode 100644 index 000000000..db9687271 --- /dev/null +++ b/it-visual-regression/src/test/resources/banner.txt @@ -0,0 +1,19 @@ +<#assign length = 19 + name?length> +<#assign pad = length + (54 - length)/2> + +====================================================== + +${"START MODULE ${name?upper_case} TESTS"?left_pad(pad)} + +====================================================== + __________________________________________________ + / ____ _ \ +| / ___| _ __ ___ ___| |_ _ __ _ _ _ __ ___ | +| \___ \| '_ \ / _ \/ __| __| '__| | | | '_ ` _ \ | +| ___) | |_) | __/ (__| |_| | | |_| | | | | | | | +| |____/| .__/ \___|\___|\__|_| \__,_|_| |_| |_| | +| ******|_|${" Version: ${version}"?left_pad(39, "*")} | +| | +| Please consider giving a GitHub star: | +| ${url?right_pad(44)}| + \__________________________________________________/ diff --git a/it-visual-regression/src/test/resources/configuration.yaml b/it-visual-regression/src/test/resources/configuration.yaml new file mode 100644 index 000000000..719f4cfce --- /dev/null +++ b/it-visual-regression/src/test/resources/configuration.yaml @@ -0,0 +1,24 @@ +application: + baseUrl: https://the-internet.herokuapp.com/ + +visualRegression: { } + +video: + frames: + - autoBefore + - manual + +drivers: + chrome: + args: + - --headless=new + firefox: + args: + - -headless + edge: + args: + - --headless=new + +extent: + theme: DARK + fileName: report-${spectrum.driver:-chrome}.html diff --git a/it-visual-regression/src/test/resources/filtered/properties.yaml b/it-visual-regression/src/test/resources/filtered/properties.yaml new file mode 100644 index 000000000..b34a324ea --- /dev/null +++ b/it-visual-regression/src/test/resources/filtered/properties.yaml @@ -0,0 +1,3 @@ +name: ${project.artifactId} +version: ${project.version} +url: https://github.com/giulong/spectrum diff --git a/pom.xml b/pom.xml index 31a37104e..fdbe010ff 100644 --- a/pom.xml +++ b/pom.xml @@ -69,6 +69,7 @@ it-testbook it-macos it-appium + it-visual-regression verify-commons verify-browsers verify-macos @@ -92,6 +93,7 @@ it-grid it-bidi it-testbook + it-visual-regression verify-commons verify-browsers cleanup From 2226036adb6b8330b7bb06e63dfa49b5241379f8 Mon Sep 17 00:00:00 2001 From: Giulio Longfils Date: Thu, 7 Aug 2025 22:51:01 +0200 Subject: [PATCH 011/100] refactor: moving TestData under utils package --- .../main/java/io/github/giulong/spectrum/SpectrumEntity.java | 2 +- .../spectrum/extensions/interceptors/SpectrumInterceptor.java | 2 +- .../giulong/spectrum/extensions/resolvers/DriverResolver.java | 2 +- .../extensions/resolvers/StatefulExtentTestResolver.java | 2 +- .../giulong/spectrum/extensions/resolvers/TestDataResolver.java | 2 +- .../java/io/github/giulong/spectrum/utils/ExtentReporter.java | 1 - .../main/java/io/github/giulong/spectrum/utils/FileUtils.java | 1 - .../main/java/io/github/giulong/spectrum/utils/HtmlUtils.java | 1 - .../io/github/giulong/spectrum/{types => utils}/TestData.java | 2 +- .../github/giulong/spectrum/utils/events/TestBookConsumer.java | 2 +- .../giulong/spectrum/utils/events/video/VideoBaseConsumer.java | 2 +- .../giulong/spectrum/utils/events/video/VideoConsumer.java | 2 +- .../spectrum/utils/events/video/VideoDynamicConsumer.java | 2 +- .../spectrum/utils/events/video/VideoDynamicFinalizer.java | 2 +- .../spectrum/utils/events/video/VideoDynamicInitConsumer.java | 2 +- .../giulong/spectrum/utils/events/video/VideoFinalizer.java | 2 +- .../giulong/spectrum/utils/events/video/VideoInitConsumer.java | 2 +- .../main/java/io/github/giulong/spectrum/utils/video/Video.java | 2 +- .../spectrum/utils/web_driver_events/HtmlReportConsumer.java | 2 +- .../spectrum/utils/web_driver_events/TestStepsConsumer.java | 2 +- .../java/io/github/giulong/spectrum/SpectrumEntityTest.java | 2 +- .../extensions/interceptors/SpectrumInterceptorTest.java | 2 +- .../spectrum/extensions/resolvers/DriverResolverTest.java | 2 +- .../extensions/resolvers/StatefulExtentTestResolverTest.java | 2 +- .../spectrum/extensions/resolvers/TestDataResolverTest.java | 2 +- .../io/github/giulong/spectrum/utils/ExtentReporterTest.java | 1 - .../java/io/github/giulong/spectrum/utils/HtmlUtilsTest.java | 1 - .../giulong/spectrum/utils/events/TestBookConsumerTest.java | 2 +- .../spectrum/utils/events/video/VideoBaseConsumerTest.java | 2 +- .../giulong/spectrum/utils/events/video/VideoConsumerTest.java | 2 +- .../spectrum/utils/events/video/VideoDynamicConsumerTest.java | 2 +- .../spectrum/utils/events/video/VideoDynamicFinalizerTest.java | 2 +- .../utils/events/video/VideoDynamicInitConsumerTest.java | 2 +- .../giulong/spectrum/utils/events/video/VideoFinalizerTest.java | 2 +- .../spectrum/utils/events/video/VideoInitConsumerTest.java | 2 +- .../java/io/github/giulong/spectrum/utils/video/VideoTest.java | 2 +- .../utils/web_driver_events/HtmlReportConsumerTest.java | 2 +- .../spectrum/utils/web_driver_events/TestStepsConsumerTest.java | 2 +- 38 files changed, 33 insertions(+), 38 deletions(-) rename spectrum/src/main/java/io/github/giulong/spectrum/{types => utils}/TestData.java (94%) diff --git a/spectrum/src/main/java/io/github/giulong/spectrum/SpectrumEntity.java b/spectrum/src/main/java/io/github/giulong/spectrum/SpectrumEntity.java index 35213ba4f..dd4e1f8ea 100644 --- a/spectrum/src/main/java/io/github/giulong/spectrum/SpectrumEntity.java +++ b/spectrum/src/main/java/io/github/giulong/spectrum/SpectrumEntity.java @@ -5,7 +5,7 @@ import com.aventstack.extentreports.Status; import com.aventstack.extentreports.model.Media; import io.github.giulong.spectrum.interfaces.Shared; -import io.github.giulong.spectrum.types.TestData; +import io.github.giulong.spectrum.utils.TestData; import io.github.giulong.spectrum.utils.*; import io.github.giulong.spectrum.utils.events.EventsDispatcher; import io.github.giulong.spectrum.utils.js.Js; diff --git a/spectrum/src/main/java/io/github/giulong/spectrum/extensions/interceptors/SpectrumInterceptor.java b/spectrum/src/main/java/io/github/giulong/spectrum/extensions/interceptors/SpectrumInterceptor.java index e7ef1b8e9..96f2a583a 100644 --- a/spectrum/src/main/java/io/github/giulong/spectrum/extensions/interceptors/SpectrumInterceptor.java +++ b/spectrum/src/main/java/io/github/giulong/spectrum/extensions/interceptors/SpectrumInterceptor.java @@ -1,7 +1,7 @@ package io.github.giulong.spectrum.extensions.interceptors; import com.aventstack.extentreports.ExtentTest; -import io.github.giulong.spectrum.types.TestData; +import io.github.giulong.spectrum.utils.TestData; import io.github.giulong.spectrum.utils.*; import io.github.giulong.spectrum.utils.events.EventsDispatcher; import io.github.giulong.spectrum.utils.video.Video; diff --git a/spectrum/src/main/java/io/github/giulong/spectrum/extensions/resolvers/DriverResolver.java b/spectrum/src/main/java/io/github/giulong/spectrum/extensions/resolvers/DriverResolver.java index 6b5af3cfd..3aec0239e 100644 --- a/spectrum/src/main/java/io/github/giulong/spectrum/extensions/resolvers/DriverResolver.java +++ b/spectrum/src/main/java/io/github/giulong/spectrum/extensions/resolvers/DriverResolver.java @@ -2,7 +2,7 @@ import io.github.giulong.spectrum.internals.web_driver_listeners.AutoWaitWebDriverListener; import io.github.giulong.spectrum.internals.web_driver_listeners.EventsWebDriverListener; -import io.github.giulong.spectrum.types.TestData; +import io.github.giulong.spectrum.utils.TestData; import io.github.giulong.spectrum.utils.Configuration; import io.github.giulong.spectrum.utils.ContextManager; import io.github.giulong.spectrum.utils.FileUtils; diff --git a/spectrum/src/main/java/io/github/giulong/spectrum/extensions/resolvers/StatefulExtentTestResolver.java b/spectrum/src/main/java/io/github/giulong/spectrum/extensions/resolvers/StatefulExtentTestResolver.java index 54a7358f5..42d5b6d36 100644 --- a/spectrum/src/main/java/io/github/giulong/spectrum/extensions/resolvers/StatefulExtentTestResolver.java +++ b/spectrum/src/main/java/io/github/giulong/spectrum/extensions/resolvers/StatefulExtentTestResolver.java @@ -3,7 +3,7 @@ import com.aventstack.extentreports.ExtentTest; import io.github.giulong.spectrum.utils.ContextManager; import io.github.giulong.spectrum.utils.StatefulExtentTest; -import io.github.giulong.spectrum.types.TestData; +import io.github.giulong.spectrum.utils.TestData; import io.github.giulong.spectrum.utils.Configuration; import io.github.giulong.spectrum.utils.ExtentReporter; import io.github.giulong.spectrum.utils.video.Video; diff --git a/spectrum/src/main/java/io/github/giulong/spectrum/extensions/resolvers/TestDataResolver.java b/spectrum/src/main/java/io/github/giulong/spectrum/extensions/resolvers/TestDataResolver.java index 7c27df9dc..e8c824f07 100644 --- a/spectrum/src/main/java/io/github/giulong/spectrum/extensions/resolvers/TestDataResolver.java +++ b/spectrum/src/main/java/io/github/giulong/spectrum/extensions/resolvers/TestDataResolver.java @@ -1,6 +1,6 @@ package io.github.giulong.spectrum.extensions.resolvers; -import io.github.giulong.spectrum.types.TestData; +import io.github.giulong.spectrum.utils.TestData; import io.github.giulong.spectrum.utils.ContextManager; import io.github.giulong.spectrum.utils.FileUtils; import lombok.extern.slf4j.Slf4j; diff --git a/spectrum/src/main/java/io/github/giulong/spectrum/utils/ExtentReporter.java b/spectrum/src/main/java/io/github/giulong/spectrum/utils/ExtentReporter.java index b663075b2..611e5a398 100644 --- a/spectrum/src/main/java/io/github/giulong/spectrum/utils/ExtentReporter.java +++ b/spectrum/src/main/java/io/github/giulong/spectrum/utils/ExtentReporter.java @@ -12,7 +12,6 @@ import io.github.giulong.spectrum.SpectrumTest; import io.github.giulong.spectrum.interfaces.SessionHook; import io.github.giulong.spectrum.interfaces.reports.CanProduceMetadata; -import io.github.giulong.spectrum.types.TestData; import io.github.giulong.spectrum.utils.video.Video; import lombok.Getter; import lombok.NoArgsConstructor; diff --git a/spectrum/src/main/java/io/github/giulong/spectrum/utils/FileUtils.java b/spectrum/src/main/java/io/github/giulong/spectrum/utils/FileUtils.java index 88ec0ee08..16c3e4d03 100644 --- a/spectrum/src/main/java/io/github/giulong/spectrum/utils/FileUtils.java +++ b/spectrum/src/main/java/io/github/giulong/spectrum/utils/FileUtils.java @@ -1,6 +1,5 @@ package io.github.giulong.spectrum.utils; -import io.github.giulong.spectrum.types.TestData; import lombok.NoArgsConstructor; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; diff --git a/spectrum/src/main/java/io/github/giulong/spectrum/utils/HtmlUtils.java b/spectrum/src/main/java/io/github/giulong/spectrum/utils/HtmlUtils.java index 6640963fd..8b22075ff 100644 --- a/spectrum/src/main/java/io/github/giulong/spectrum/utils/HtmlUtils.java +++ b/spectrum/src/main/java/io/github/giulong/spectrum/utils/HtmlUtils.java @@ -1,7 +1,6 @@ package io.github.giulong.spectrum.utils; import io.github.giulong.spectrum.interfaces.SessionHook; -import io.github.giulong.spectrum.types.TestData; import lombok.NoArgsConstructor; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; diff --git a/spectrum/src/main/java/io/github/giulong/spectrum/types/TestData.java b/spectrum/src/main/java/io/github/giulong/spectrum/utils/TestData.java similarity index 94% rename from spectrum/src/main/java/io/github/giulong/spectrum/types/TestData.java rename to spectrum/src/main/java/io/github/giulong/spectrum/utils/TestData.java index 9d039501a..03e20237f 100644 --- a/spectrum/src/main/java/io/github/giulong/spectrum/types/TestData.java +++ b/spectrum/src/main/java/io/github/giulong/spectrum/utils/TestData.java @@ -1,4 +1,4 @@ -package io.github.giulong.spectrum.types; +package io.github.giulong.spectrum.utils; import lombok.Builder; import lombok.Getter; diff --git a/spectrum/src/main/java/io/github/giulong/spectrum/utils/events/TestBookConsumer.java b/spectrum/src/main/java/io/github/giulong/spectrum/utils/events/TestBookConsumer.java index e2d208042..b4c06aff0 100644 --- a/spectrum/src/main/java/io/github/giulong/spectrum/utils/events/TestBookConsumer.java +++ b/spectrum/src/main/java/io/github/giulong/spectrum/utils/events/TestBookConsumer.java @@ -3,7 +3,7 @@ import com.fasterxml.jackson.annotation.JsonView; import io.github.giulong.spectrum.internals.jackson.views.Views.Internal; import io.github.giulong.spectrum.pojos.events.Event; -import io.github.giulong.spectrum.types.TestData; +import io.github.giulong.spectrum.utils.TestData; import io.github.giulong.spectrum.utils.Configuration; import io.github.giulong.spectrum.utils.ContextManager; import io.github.giulong.spectrum.utils.testbook.TestBook; diff --git a/spectrum/src/main/java/io/github/giulong/spectrum/utils/events/video/VideoBaseConsumer.java b/spectrum/src/main/java/io/github/giulong/spectrum/utils/events/video/VideoBaseConsumer.java index 8379100ea..900b1cc32 100644 --- a/spectrum/src/main/java/io/github/giulong/spectrum/utils/events/video/VideoBaseConsumer.java +++ b/spectrum/src/main/java/io/github/giulong/spectrum/utils/events/video/VideoBaseConsumer.java @@ -1,7 +1,7 @@ package io.github.giulong.spectrum.utils.events.video; import io.github.giulong.spectrum.pojos.events.Event; -import io.github.giulong.spectrum.types.TestData; +import io.github.giulong.spectrum.utils.TestData; import io.github.giulong.spectrum.utils.Configuration; import io.github.giulong.spectrum.utils.events.EventsConsumer; diff --git a/spectrum/src/main/java/io/github/giulong/spectrum/utils/events/video/VideoConsumer.java b/spectrum/src/main/java/io/github/giulong/spectrum/utils/events/video/VideoConsumer.java index 20ebf22ce..32b6927e8 100644 --- a/spectrum/src/main/java/io/github/giulong/spectrum/utils/events/video/VideoConsumer.java +++ b/spectrum/src/main/java/io/github/giulong/spectrum/utils/events/video/VideoConsumer.java @@ -3,7 +3,7 @@ import com.fasterxml.jackson.annotation.JsonView; import io.github.giulong.spectrum.internals.jackson.views.Views.Internal; import io.github.giulong.spectrum.pojos.events.Event; -import io.github.giulong.spectrum.types.TestData; +import io.github.giulong.spectrum.utils.TestData; import io.github.giulong.spectrum.utils.video.Video; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; diff --git a/spectrum/src/main/java/io/github/giulong/spectrum/utils/events/video/VideoDynamicConsumer.java b/spectrum/src/main/java/io/github/giulong/spectrum/utils/events/video/VideoDynamicConsumer.java index b601ac89c..c82db56a5 100644 --- a/spectrum/src/main/java/io/github/giulong/spectrum/utils/events/video/VideoDynamicConsumer.java +++ b/spectrum/src/main/java/io/github/giulong/spectrum/utils/events/video/VideoDynamicConsumer.java @@ -3,7 +3,7 @@ import com.fasterxml.jackson.annotation.JsonView; import io.github.giulong.spectrum.internals.jackson.views.Views.Internal; import io.github.giulong.spectrum.pojos.events.Event; -import io.github.giulong.spectrum.types.TestData; +import io.github.giulong.spectrum.utils.TestData; import org.junit.jupiter.api.extension.ExtensionContext; import java.nio.file.Path; diff --git a/spectrum/src/main/java/io/github/giulong/spectrum/utils/events/video/VideoDynamicFinalizer.java b/spectrum/src/main/java/io/github/giulong/spectrum/utils/events/video/VideoDynamicFinalizer.java index ab29a9e1c..1844eb793 100644 --- a/spectrum/src/main/java/io/github/giulong/spectrum/utils/events/video/VideoDynamicFinalizer.java +++ b/spectrum/src/main/java/io/github/giulong/spectrum/utils/events/video/VideoDynamicFinalizer.java @@ -2,7 +2,7 @@ import com.fasterxml.jackson.annotation.JsonView; import io.github.giulong.spectrum.internals.jackson.views.Views.Internal; -import io.github.giulong.spectrum.types.TestData; +import io.github.giulong.spectrum.utils.TestData; import java.nio.file.Path; diff --git a/spectrum/src/main/java/io/github/giulong/spectrum/utils/events/video/VideoDynamicInitConsumer.java b/spectrum/src/main/java/io/github/giulong/spectrum/utils/events/video/VideoDynamicInitConsumer.java index fb08656c1..fedd88b4e 100644 --- a/spectrum/src/main/java/io/github/giulong/spectrum/utils/events/video/VideoDynamicInitConsumer.java +++ b/spectrum/src/main/java/io/github/giulong/spectrum/utils/events/video/VideoDynamicInitConsumer.java @@ -2,7 +2,7 @@ import com.fasterxml.jackson.annotation.JsonView; import io.github.giulong.spectrum.internals.jackson.views.Views.Internal; -import io.github.giulong.spectrum.types.TestData; +import io.github.giulong.spectrum.utils.TestData; import java.nio.file.Path; diff --git a/spectrum/src/main/java/io/github/giulong/spectrum/utils/events/video/VideoFinalizer.java b/spectrum/src/main/java/io/github/giulong/spectrum/utils/events/video/VideoFinalizer.java index dddce1977..663b76447 100644 --- a/spectrum/src/main/java/io/github/giulong/spectrum/utils/events/video/VideoFinalizer.java +++ b/spectrum/src/main/java/io/github/giulong/spectrum/utils/events/video/VideoFinalizer.java @@ -3,7 +3,7 @@ import com.fasterxml.jackson.annotation.JsonView; import io.github.giulong.spectrum.internals.jackson.views.Views.Internal; import io.github.giulong.spectrum.pojos.events.Event; -import io.github.giulong.spectrum.types.TestData; +import io.github.giulong.spectrum.utils.TestData; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.jcodec.api.awt.AWTSequenceEncoder; diff --git a/spectrum/src/main/java/io/github/giulong/spectrum/utils/events/video/VideoInitConsumer.java b/spectrum/src/main/java/io/github/giulong/spectrum/utils/events/video/VideoInitConsumer.java index 7ec2b513f..704efa948 100644 --- a/spectrum/src/main/java/io/github/giulong/spectrum/utils/events/video/VideoInitConsumer.java +++ b/spectrum/src/main/java/io/github/giulong/spectrum/utils/events/video/VideoInitConsumer.java @@ -3,7 +3,7 @@ import com.fasterxml.jackson.annotation.JsonView; import io.github.giulong.spectrum.internals.jackson.views.Views.Internal; import io.github.giulong.spectrum.pojos.events.Event; -import io.github.giulong.spectrum.types.TestData; +import io.github.giulong.spectrum.utils.TestData; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; diff --git a/spectrum/src/main/java/io/github/giulong/spectrum/utils/video/Video.java b/spectrum/src/main/java/io/github/giulong/spectrum/utils/video/Video.java index a11f9fbb3..f2c6f0fdf 100644 --- a/spectrum/src/main/java/io/github/giulong/spectrum/utils/video/Video.java +++ b/spectrum/src/main/java/io/github/giulong/spectrum/utils/video/Video.java @@ -3,7 +3,7 @@ import com.fasterxml.jackson.annotation.JsonPropertyDescription; import io.github.giulong.spectrum.enums.Frame; import io.github.giulong.spectrum.interfaces.JsonSchemaTypes; -import io.github.giulong.spectrum.types.TestData; +import io.github.giulong.spectrum.utils.TestData; import lombok.Generated; import lombok.Getter; import lombok.extern.slf4j.Slf4j; diff --git a/spectrum/src/main/java/io/github/giulong/spectrum/utils/web_driver_events/HtmlReportConsumer.java b/spectrum/src/main/java/io/github/giulong/spectrum/utils/web_driver_events/HtmlReportConsumer.java index 52bf06ae9..c033bf24c 100644 --- a/spectrum/src/main/java/io/github/giulong/spectrum/utils/web_driver_events/HtmlReportConsumer.java +++ b/spectrum/src/main/java/io/github/giulong/spectrum/utils/web_driver_events/HtmlReportConsumer.java @@ -2,7 +2,7 @@ import com.aventstack.extentreports.ExtentTest; import io.github.giulong.spectrum.enums.Frame; -import io.github.giulong.spectrum.types.TestData; +import io.github.giulong.spectrum.utils.TestData; import io.github.giulong.spectrum.utils.HtmlUtils; import io.github.giulong.spectrum.utils.StatefulExtentTest; import io.github.giulong.spectrum.utils.video.Video; diff --git a/spectrum/src/main/java/io/github/giulong/spectrum/utils/web_driver_events/TestStepsConsumer.java b/spectrum/src/main/java/io/github/giulong/spectrum/utils/web_driver_events/TestStepsConsumer.java index 7cd0ad99a..f50f8d016 100644 --- a/spectrum/src/main/java/io/github/giulong/spectrum/utils/web_driver_events/TestStepsConsumer.java +++ b/spectrum/src/main/java/io/github/giulong/spectrum/utils/web_driver_events/TestStepsConsumer.java @@ -3,7 +3,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonPropertyDescription; import io.github.giulong.spectrum.pojos.events.Event; -import io.github.giulong.spectrum.types.TestData; +import io.github.giulong.spectrum.utils.TestData; import io.github.giulong.spectrum.utils.FileUtils; import io.github.giulong.spectrum.utils.FreeMarkerWrapper; import io.github.giulong.spectrum.utils.events.EventsConsumer; diff --git a/spectrum/src/test/java/io/github/giulong/spectrum/SpectrumEntityTest.java b/spectrum/src/test/java/io/github/giulong/spectrum/SpectrumEntityTest.java index 23a527d26..67eb4e684 100644 --- a/spectrum/src/test/java/io/github/giulong/spectrum/SpectrumEntityTest.java +++ b/spectrum/src/test/java/io/github/giulong/spectrum/SpectrumEntityTest.java @@ -5,7 +5,7 @@ import com.aventstack.extentreports.Status; import com.aventstack.extentreports.model.Media; import io.github.giulong.spectrum.interfaces.Shared; -import io.github.giulong.spectrum.types.TestData; +import io.github.giulong.spectrum.utils.TestData; import io.github.giulong.spectrum.utils.*; import io.github.giulong.spectrum.utils.events.EventsDispatcher; import io.github.giulong.spectrum.utils.video.Video; diff --git a/spectrum/src/test/java/io/github/giulong/spectrum/extensions/interceptors/SpectrumInterceptorTest.java b/spectrum/src/test/java/io/github/giulong/spectrum/extensions/interceptors/SpectrumInterceptorTest.java index 4e20feb3e..6b1e9e347 100644 --- a/spectrum/src/test/java/io/github/giulong/spectrum/extensions/interceptors/SpectrumInterceptorTest.java +++ b/spectrum/src/test/java/io/github/giulong/spectrum/extensions/interceptors/SpectrumInterceptorTest.java @@ -1,7 +1,7 @@ package io.github.giulong.spectrum.extensions.interceptors; import com.aventstack.extentreports.ExtentTest; -import io.github.giulong.spectrum.types.TestData; +import io.github.giulong.spectrum.utils.TestData; import io.github.giulong.spectrum.utils.*; import io.github.giulong.spectrum.utils.events.EventsDispatcher; import io.github.giulong.spectrum.utils.video.Video; diff --git a/spectrum/src/test/java/io/github/giulong/spectrum/extensions/resolvers/DriverResolverTest.java b/spectrum/src/test/java/io/github/giulong/spectrum/extensions/resolvers/DriverResolverTest.java index 035357cc5..a5be7f656 100644 --- a/spectrum/src/test/java/io/github/giulong/spectrum/extensions/resolvers/DriverResolverTest.java +++ b/spectrum/src/test/java/io/github/giulong/spectrum/extensions/resolvers/DriverResolverTest.java @@ -3,7 +3,7 @@ import io.github.giulong.spectrum.drivers.Driver; import io.github.giulong.spectrum.internals.web_driver_listeners.AutoWaitWebDriverListener; import io.github.giulong.spectrum.internals.web_driver_listeners.EventsWebDriverListener; -import io.github.giulong.spectrum.types.TestData; +import io.github.giulong.spectrum.utils.TestData; import io.github.giulong.spectrum.utils.*; import io.github.giulong.spectrum.utils.video.Video; import io.github.giulong.spectrum.utils.web_driver_events.*; diff --git a/spectrum/src/test/java/io/github/giulong/spectrum/extensions/resolvers/StatefulExtentTestResolverTest.java b/spectrum/src/test/java/io/github/giulong/spectrum/extensions/resolvers/StatefulExtentTestResolverTest.java index bcca8e670..407787bff 100644 --- a/spectrum/src/test/java/io/github/giulong/spectrum/extensions/resolvers/StatefulExtentTestResolverTest.java +++ b/spectrum/src/test/java/io/github/giulong/spectrum/extensions/resolvers/StatefulExtentTestResolverTest.java @@ -2,7 +2,7 @@ import com.aventstack.extentreports.ExtentTest; import io.github.giulong.spectrum.utils.*; -import io.github.giulong.spectrum.types.TestData; +import io.github.giulong.spectrum.utils.TestData; import io.github.giulong.spectrum.utils.video.Video; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; diff --git a/spectrum/src/test/java/io/github/giulong/spectrum/extensions/resolvers/TestDataResolverTest.java b/spectrum/src/test/java/io/github/giulong/spectrum/extensions/resolvers/TestDataResolverTest.java index a95919618..0c0123060 100644 --- a/spectrum/src/test/java/io/github/giulong/spectrum/extensions/resolvers/TestDataResolverTest.java +++ b/spectrum/src/test/java/io/github/giulong/spectrum/extensions/resolvers/TestDataResolverTest.java @@ -1,6 +1,6 @@ package io.github.giulong.spectrum.extensions.resolvers; -import io.github.giulong.spectrum.types.TestData; +import io.github.giulong.spectrum.utils.TestData; import io.github.giulong.spectrum.utils.ContextManager; import io.github.giulong.spectrum.utils.FileUtils; import io.github.giulong.spectrum.utils.Reflections; diff --git a/spectrum/src/test/java/io/github/giulong/spectrum/utils/ExtentReporterTest.java b/spectrum/src/test/java/io/github/giulong/spectrum/utils/ExtentReporterTest.java index e84dac7c2..ae8e25df2 100644 --- a/spectrum/src/test/java/io/github/giulong/spectrum/utils/ExtentReporterTest.java +++ b/spectrum/src/test/java/io/github/giulong/spectrum/utils/ExtentReporterTest.java @@ -9,7 +9,6 @@ import com.aventstack.extentreports.reporter.ExtentSparkReporter; import com.aventstack.extentreports.reporter.configuration.ExtentSparkReporterConfig; import io.github.giulong.spectrum.SpectrumTest; -import io.github.giulong.spectrum.types.TestData; import io.github.giulong.spectrum.utils.tests_comparators.TestsComparator; import io.github.giulong.spectrum.utils.video.Video; import lombok.SneakyThrows; diff --git a/spectrum/src/test/java/io/github/giulong/spectrum/utils/HtmlUtilsTest.java b/spectrum/src/test/java/io/github/giulong/spectrum/utils/HtmlUtilsTest.java index 5e19e248d..90f784113 100644 --- a/spectrum/src/test/java/io/github/giulong/spectrum/utils/HtmlUtilsTest.java +++ b/spectrum/src/test/java/io/github/giulong/spectrum/utils/HtmlUtilsTest.java @@ -1,6 +1,5 @@ package io.github.giulong.spectrum.utils; -import io.github.giulong.spectrum.types.TestData; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; diff --git a/spectrum/src/test/java/io/github/giulong/spectrum/utils/events/TestBookConsumerTest.java b/spectrum/src/test/java/io/github/giulong/spectrum/utils/events/TestBookConsumerTest.java index 717c60b17..379797e2e 100644 --- a/spectrum/src/test/java/io/github/giulong/spectrum/utils/events/TestBookConsumerTest.java +++ b/spectrum/src/test/java/io/github/giulong/spectrum/utils/events/TestBookConsumerTest.java @@ -2,7 +2,7 @@ import io.github.giulong.spectrum.enums.Result; import io.github.giulong.spectrum.pojos.events.Event; -import io.github.giulong.spectrum.types.TestData; +import io.github.giulong.spectrum.utils.TestData; import io.github.giulong.spectrum.utils.Configuration; import io.github.giulong.spectrum.utils.ContextManager; import io.github.giulong.spectrum.utils.Reflections; diff --git a/spectrum/src/test/java/io/github/giulong/spectrum/utils/events/video/VideoBaseConsumerTest.java b/spectrum/src/test/java/io/github/giulong/spectrum/utils/events/video/VideoBaseConsumerTest.java index af7b5c2d0..ffe13c7fc 100644 --- a/spectrum/src/test/java/io/github/giulong/spectrum/utils/events/video/VideoBaseConsumerTest.java +++ b/spectrum/src/test/java/io/github/giulong/spectrum/utils/events/video/VideoBaseConsumerTest.java @@ -2,7 +2,7 @@ import io.github.giulong.spectrum.enums.Result; import io.github.giulong.spectrum.pojos.events.Event; -import io.github.giulong.spectrum.types.TestData; +import io.github.giulong.spectrum.utils.TestData; import io.github.giulong.spectrum.utils.Configuration; import io.github.giulong.spectrum.utils.Reflections; import io.github.giulong.spectrum.utils.video.Video; diff --git a/spectrum/src/test/java/io/github/giulong/spectrum/utils/events/video/VideoConsumerTest.java b/spectrum/src/test/java/io/github/giulong/spectrum/utils/events/video/VideoConsumerTest.java index 1ad03bfcf..620afec67 100644 --- a/spectrum/src/test/java/io/github/giulong/spectrum/utils/events/video/VideoConsumerTest.java +++ b/spectrum/src/test/java/io/github/giulong/spectrum/utils/events/video/VideoConsumerTest.java @@ -1,7 +1,7 @@ package io.github.giulong.spectrum.utils.events.video; import io.github.giulong.spectrum.pojos.events.Event; -import io.github.giulong.spectrum.types.TestData; +import io.github.giulong.spectrum.utils.TestData; import io.github.giulong.spectrum.utils.Configuration; import io.github.giulong.spectrum.utils.Reflections; import io.github.giulong.spectrum.utils.video.Video; diff --git a/spectrum/src/test/java/io/github/giulong/spectrum/utils/events/video/VideoDynamicConsumerTest.java b/spectrum/src/test/java/io/github/giulong/spectrum/utils/events/video/VideoDynamicConsumerTest.java index 87b6c4cd9..a0ad48441 100644 --- a/spectrum/src/test/java/io/github/giulong/spectrum/utils/events/video/VideoDynamicConsumerTest.java +++ b/spectrum/src/test/java/io/github/giulong/spectrum/utils/events/video/VideoDynamicConsumerTest.java @@ -1,7 +1,7 @@ package io.github.giulong.spectrum.utils.events.video; import io.github.giulong.spectrum.pojos.events.Event; -import io.github.giulong.spectrum.types.TestData; +import io.github.giulong.spectrum.utils.TestData; import io.github.giulong.spectrum.utils.Configuration; import io.github.giulong.spectrum.utils.Reflections; import io.github.giulong.spectrum.utils.video.Video; diff --git a/spectrum/src/test/java/io/github/giulong/spectrum/utils/events/video/VideoDynamicFinalizerTest.java b/spectrum/src/test/java/io/github/giulong/spectrum/utils/events/video/VideoDynamicFinalizerTest.java index 13d5cdc87..3573c3785 100644 --- a/spectrum/src/test/java/io/github/giulong/spectrum/utils/events/video/VideoDynamicFinalizerTest.java +++ b/spectrum/src/test/java/io/github/giulong/spectrum/utils/events/video/VideoDynamicFinalizerTest.java @@ -1,6 +1,6 @@ package io.github.giulong.spectrum.utils.events.video; -import io.github.giulong.spectrum.types.TestData; +import io.github.giulong.spectrum.utils.TestData; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; diff --git a/spectrum/src/test/java/io/github/giulong/spectrum/utils/events/video/VideoDynamicInitConsumerTest.java b/spectrum/src/test/java/io/github/giulong/spectrum/utils/events/video/VideoDynamicInitConsumerTest.java index 9a91a929e..327f59845 100644 --- a/spectrum/src/test/java/io/github/giulong/spectrum/utils/events/video/VideoDynamicInitConsumerTest.java +++ b/spectrum/src/test/java/io/github/giulong/spectrum/utils/events/video/VideoDynamicInitConsumerTest.java @@ -1,6 +1,6 @@ package io.github.giulong.spectrum.utils.events.video; -import io.github.giulong.spectrum.types.TestData; +import io.github.giulong.spectrum.utils.TestData; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; diff --git a/spectrum/src/test/java/io/github/giulong/spectrum/utils/events/video/VideoFinalizerTest.java b/spectrum/src/test/java/io/github/giulong/spectrum/utils/events/video/VideoFinalizerTest.java index 295c81396..457fd9198 100644 --- a/spectrum/src/test/java/io/github/giulong/spectrum/utils/events/video/VideoFinalizerTest.java +++ b/spectrum/src/test/java/io/github/giulong/spectrum/utils/events/video/VideoFinalizerTest.java @@ -1,7 +1,7 @@ package io.github.giulong.spectrum.utils.events.video; import io.github.giulong.spectrum.pojos.events.Event; -import io.github.giulong.spectrum.types.TestData; +import io.github.giulong.spectrum.utils.TestData; import org.jcodec.api.awt.AWTSequenceEncoder; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; diff --git a/spectrum/src/test/java/io/github/giulong/spectrum/utils/events/video/VideoInitConsumerTest.java b/spectrum/src/test/java/io/github/giulong/spectrum/utils/events/video/VideoInitConsumerTest.java index c25559c20..8291ab204 100644 --- a/spectrum/src/test/java/io/github/giulong/spectrum/utils/events/video/VideoInitConsumerTest.java +++ b/spectrum/src/test/java/io/github/giulong/spectrum/utils/events/video/VideoInitConsumerTest.java @@ -1,7 +1,7 @@ package io.github.giulong.spectrum.utils.events.video; import io.github.giulong.spectrum.pojos.events.Event; -import io.github.giulong.spectrum.types.TestData; +import io.github.giulong.spectrum.utils.TestData; import org.jcodec.api.awt.AWTSequenceEncoder; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; diff --git a/spectrum/src/test/java/io/github/giulong/spectrum/utils/video/VideoTest.java b/spectrum/src/test/java/io/github/giulong/spectrum/utils/video/VideoTest.java index 1249ea9c6..56eb1b289 100644 --- a/spectrum/src/test/java/io/github/giulong/spectrum/utils/video/VideoTest.java +++ b/spectrum/src/test/java/io/github/giulong/spectrum/utils/video/VideoTest.java @@ -1,7 +1,7 @@ package io.github.giulong.spectrum.utils.video; import io.github.giulong.spectrum.enums.Frame; -import io.github.giulong.spectrum.types.TestData; +import io.github.giulong.spectrum.utils.TestData; import io.github.giulong.spectrum.utils.Reflections; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.params.ParameterizedTest; diff --git a/spectrum/src/test/java/io/github/giulong/spectrum/utils/web_driver_events/HtmlReportConsumerTest.java b/spectrum/src/test/java/io/github/giulong/spectrum/utils/web_driver_events/HtmlReportConsumerTest.java index 39b2f29f3..d6d14da1a 100644 --- a/spectrum/src/test/java/io/github/giulong/spectrum/utils/web_driver_events/HtmlReportConsumerTest.java +++ b/spectrum/src/test/java/io/github/giulong/spectrum/utils/web_driver_events/HtmlReportConsumerTest.java @@ -1,7 +1,7 @@ package io.github.giulong.spectrum.utils.web_driver_events; import com.aventstack.extentreports.ExtentTest; -import io.github.giulong.spectrum.types.TestData; +import io.github.giulong.spectrum.utils.TestData; import io.github.giulong.spectrum.utils.HtmlUtils; import io.github.giulong.spectrum.utils.Reflections; import io.github.giulong.spectrum.utils.StatefulExtentTest; diff --git a/spectrum/src/test/java/io/github/giulong/spectrum/utils/web_driver_events/TestStepsConsumerTest.java b/spectrum/src/test/java/io/github/giulong/spectrum/utils/web_driver_events/TestStepsConsumerTest.java index 866a5d9bf..f70ae30d8 100644 --- a/spectrum/src/test/java/io/github/giulong/spectrum/utils/web_driver_events/TestStepsConsumerTest.java +++ b/spectrum/src/test/java/io/github/giulong/spectrum/utils/web_driver_events/TestStepsConsumerTest.java @@ -3,7 +3,7 @@ import io.github.giulong.spectrum.enums.Result; import io.github.giulong.spectrum.pojos.events.Event; import io.github.giulong.spectrum.pojos.events.TestStep; -import io.github.giulong.spectrum.types.TestData; +import io.github.giulong.spectrum.utils.TestData; import io.github.giulong.spectrum.utils.FileUtils; import io.github.giulong.spectrum.utils.FreeMarkerWrapper; import io.github.giulong.spectrum.utils.Reflections; From df5063f6e601cda0eaa8cb9b2690ba4997569ff6 Mon Sep 17 00:00:00 2001 From: Giulio Longfils Date: Sat, 9 Aug 2025 18:35:48 +0200 Subject: [PATCH 012/100] refactor: renaming ExtentTestConsumer to ExtentTestEndConsumer and moving it in dedicated package --- docs/README.md | 6 +++--- .../giulong/spectrum/utils/events/EventsConsumer.java | 3 ++- .../ExtentTestEndConsumer.java} | 5 +++-- .../src/main/resources/yaml/configuration.default.yaml | 2 +- .../ExtentTestEndConsumerTest.java} | 10 +++++----- 5 files changed, 14 insertions(+), 12 deletions(-) rename spectrum/src/main/java/io/github/giulong/spectrum/utils/events/{ExtentTestConsumer.java => html_report/ExtentTestEndConsumer.java} (79%) rename spectrum/src/test/java/io/github/giulong/spectrum/utils/events/{ExtentTestConsumerTest.java => html_report/ExtentTestEndConsumerTest.java} (82%) diff --git a/docs/README.md b/docs/README.md index d9774f4bf..3684f5942 100644 --- a/docs/README.md +++ b/docs/README.md @@ -2470,19 +2470,19 @@ Spectrum will fire an event with: ## Tags -Tags are a set of strings used to group events together. For example, all test methods will have the "test" tag. +Tags are a set of strings used to group events together. For example, all test methods will have the `test` tag. This way, instead of attaching a consumer to a specific event (with primary and secondary id, for example) you can listen to all events tagged in a particular way, such as all the tests. > 💡 **Example**
> Check the `eventsConsumers` in the [configuration.default.yaml]({{ site.repository_url }}/spectrum/src/main/resources/yaml/configuration.default.yaml){:target="_blank"}. -> Internal consumers need to take actions after each test is done, meaning they listen to events tagged with "test": +> Internal consumers need to take actions after each test is done, meaning they listen to events tagged with `test`: {% include copyCode.html %} ```yaml eventsConsumers: - - extentTest: # We need to add an entry to the Extent Report once each test is done + - extentTestEnd: # We need to add an entry to the Html Report once each test is done events: - reason: after tags: [ test ] diff --git a/spectrum/src/main/java/io/github/giulong/spectrum/utils/events/EventsConsumer.java b/spectrum/src/main/java/io/github/giulong/spectrum/utils/events/EventsConsumer.java index 05cf84675..e43d430f0 100644 --- a/spectrum/src/main/java/io/github/giulong/spectrum/utils/events/EventsConsumer.java +++ b/spectrum/src/main/java/io/github/giulong/spectrum/utils/events/EventsConsumer.java @@ -4,6 +4,7 @@ import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonTypeInfo; import io.github.giulong.spectrum.pojos.events.Event; +import io.github.giulong.spectrum.utils.events.html_report.ExtentTestEndConsumer; import io.github.giulong.spectrum.utils.events.video.*; import io.github.giulong.spectrum.utils.web_driver_events.TestStepsConsumer; import lombok.Getter; @@ -20,7 +21,7 @@ @JsonSubTypes({ @JsonSubTypes.Type(value = SlackConsumer.class, name = "slack"), @JsonSubTypes.Type(value = TestBookConsumer.class, name = "testbook"), - @JsonSubTypes.Type(value = ExtentTestConsumer.class, name = "extentTest"), + @JsonSubTypes.Type(value = ExtentTestEndConsumer.class, name = "extentTestEnd"), @JsonSubTypes.Type(value = DriverConsumer.class, name = "driver"), @JsonSubTypes.Type(value = MailConsumer.class, name = "mail"), @JsonSubTypes.Type(value = VideoInitConsumer.class, name = "videoInit"), diff --git a/spectrum/src/main/java/io/github/giulong/spectrum/utils/events/ExtentTestConsumer.java b/spectrum/src/main/java/io/github/giulong/spectrum/utils/events/html_report/ExtentTestEndConsumer.java similarity index 79% rename from spectrum/src/main/java/io/github/giulong/spectrum/utils/events/ExtentTestConsumer.java rename to spectrum/src/main/java/io/github/giulong/spectrum/utils/events/html_report/ExtentTestEndConsumer.java index 6641347fa..32f38da3f 100644 --- a/spectrum/src/main/java/io/github/giulong/spectrum/utils/events/ExtentTestConsumer.java +++ b/spectrum/src/main/java/io/github/giulong/spectrum/utils/events/html_report/ExtentTestEndConsumer.java @@ -1,15 +1,16 @@ -package io.github.giulong.spectrum.utils.events; +package io.github.giulong.spectrum.utils.events.html_report; import com.aventstack.extentreports.Status; import com.fasterxml.jackson.annotation.JsonView; import io.github.giulong.spectrum.internals.jackson.views.Views.Internal; import io.github.giulong.spectrum.pojos.events.Event; import io.github.giulong.spectrum.utils.ExtentReporter; +import io.github.giulong.spectrum.utils.events.EventsConsumer; import lombok.extern.slf4j.Slf4j; @Slf4j @JsonView(Internal.class) -public class ExtentTestConsumer extends EventsConsumer { +public class ExtentTestEndConsumer extends EventsConsumer { private final ExtentReporter extentReporter = ExtentReporter.getInstance(); diff --git a/spectrum/src/main/resources/yaml/configuration.default.yaml b/spectrum/src/main/resources/yaml/configuration.default.yaml index 9d4a04ddc..3f955086a 100644 --- a/spectrum/src/main/resources/yaml/configuration.default.yaml +++ b/spectrum/src/main/resources/yaml/configuration.default.yaml @@ -493,7 +493,7 @@ eventsConsumers: events: - primaryId: screenshot reason: screenshot - - extentTest: # add an entry to the Extent Report once each test is done + - extentTestEnd: # add an entry to the Extent Report once each test is done events: - reason: after tags: [ test ] diff --git a/spectrum/src/test/java/io/github/giulong/spectrum/utils/events/ExtentTestConsumerTest.java b/spectrum/src/test/java/io/github/giulong/spectrum/utils/events/html_report/ExtentTestEndConsumerTest.java similarity index 82% rename from spectrum/src/test/java/io/github/giulong/spectrum/utils/events/ExtentTestConsumerTest.java rename to spectrum/src/test/java/io/github/giulong/spectrum/utils/events/html_report/ExtentTestEndConsumerTest.java index 413c9471c..a31019e29 100644 --- a/spectrum/src/test/java/io/github/giulong/spectrum/utils/events/ExtentTestConsumerTest.java +++ b/spectrum/src/test/java/io/github/giulong/spectrum/utils/events/html_report/ExtentTestEndConsumerTest.java @@ -1,4 +1,4 @@ -package io.github.giulong.spectrum.utils.events; +package io.github.giulong.spectrum.utils.events.html_report; import io.github.giulong.spectrum.pojos.events.Event; import io.github.giulong.spectrum.utils.ExtentReporter; @@ -15,7 +15,7 @@ import static io.github.giulong.spectrum.enums.Result.SUCCESSFUL; import static org.mockito.Mockito.*; -class ExtentTestConsumerTest { +class ExtentTestEndConsumerTest { private static MockedStatic extentReporterMockedStatic; @@ -29,11 +29,11 @@ class ExtentTestConsumerTest { private Event event; @InjectMocks - private ExtentTestConsumer extentTestConsumer; + private ExtentTestEndConsumer extentTestEndConsumer; @BeforeEach void beforeEach() { - Reflections.setField("extentReporter", extentTestConsumer, extentReporter); + Reflections.setField("extentReporter", extentTestEndConsumer, extentReporter); extentReporterMockedStatic = mockStatic(ExtentReporter.class); } @@ -48,7 +48,7 @@ void accept() { when(event.getResult()).thenReturn(SUCCESSFUL); when(event.getContext()).thenReturn(context); - extentTestConsumer.accept(event); + extentTestEndConsumer.accept(event); verify(extentReporter).logTestEnd(context, SUCCESSFUL.getStatus()); } From c01db119d3c23692c84ffa5d6ffce37c4db89a53 Mon Sep 17 00:00:00 2001 From: Giulio Longfils Date: Sun, 10 Aug 2025 15:48:38 +0200 Subject: [PATCH 013/100] refactor: few filters combined predicates --- .../spectrum/utils/events/EventsConsumer.java | 13 +++++++------ .../spectrum/utils/reporters/FileReporter.java | 4 ++-- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/spectrum/src/main/java/io/github/giulong/spectrum/utils/events/EventsConsumer.java b/spectrum/src/main/java/io/github/giulong/spectrum/utils/events/EventsConsumer.java index e43d430f0..e9916f5f3 100644 --- a/spectrum/src/main/java/io/github/giulong/spectrum/utils/events/EventsConsumer.java +++ b/spectrum/src/main/java/io/github/giulong/spectrum/utils/events/EventsConsumer.java @@ -12,6 +12,7 @@ import java.util.List; import java.util.function.Consumer; +import java.util.function.Predicate; import static com.fasterxml.jackson.annotation.JsonTypeInfo.As.WRAPPER_OBJECT; import static com.fasterxml.jackson.annotation.JsonTypeInfo.Id.NAME; @@ -46,15 +47,15 @@ public abstract class EventsConsumer implements Consumer { public void match(final Event event) { final String simpleName = getClass().getSimpleName(); + final Predicate accepts = e -> shouldAccept(event); + final Predicate matches = e -> findMatchFor(event, e); events .stream() - .peek(h -> log.debug("{}: checking if should run for {}", simpleName, event)) - .filter(h -> shouldAccept(event)) - .peek(h -> log.trace("{}: finding matchers for {}", simpleName, event)) - .filter(h -> findMatchFor(event, h)) - .peek(h -> log.debug("{} is consuming {}", simpleName, event)) - .forEach(h -> acceptSilently(event)); + .peek(e -> log.debug("{}: checking if should run for {}", simpleName, event)) + .filter(accepts.and(matches)) + .peek(e -> log.debug("{} is consuming {}", simpleName, event)) + .forEach(e -> acceptSilently(event)); } protected boolean shouldAccept(final Event event) { diff --git a/spectrum/src/main/java/io/github/giulong/spectrum/utils/reporters/FileReporter.java b/spectrum/src/main/java/io/github/giulong/spectrum/utils/reporters/FileReporter.java index fb5544d63..54eb57b36 100644 --- a/spectrum/src/main/java/io/github/giulong/spectrum/utils/reporters/FileReporter.java +++ b/spectrum/src/main/java/io/github/giulong/spectrum/utils/reporters/FileReporter.java @@ -64,8 +64,8 @@ public void cleanupOldReports() { final List files = Arrays .stream(folderContent) - .filter(not(File::isDirectory)) - .filter(file -> file.getName().endsWith(extension)) + .filter(not(File::isDirectory) + .and(file -> file.getName().endsWith(extension))) .toList(); retention.deleteArtifactsFrom(files, this); From 04daddd03807ed8839b08095e3a11d544766031a Mon Sep 17 00:00:00 2001 From: Giulio Longfils Date: Tue, 12 Aug 2025 11:54:17 +0200 Subject: [PATCH 014/100] refactor: screenshots map key is a String instead of Path --- .../io/github/giulong/spectrum/SpectrumEntity.java | 2 +- .../github/giulong/spectrum/utils/ContextManager.java | 3 +-- .../io/github/giulong/spectrum/utils/HtmlUtils.java | 4 ++-- .../github/giulong/spectrum/SpectrumEntityTest.java | 4 ++-- .../github/giulong/spectrum/utils/HtmlUtilsTest.java | 11 ++++------- 5 files changed, 10 insertions(+), 14 deletions(-) diff --git a/spectrum/src/main/java/io/github/giulong/spectrum/SpectrumEntity.java b/spectrum/src/main/java/io/github/giulong/spectrum/SpectrumEntity.java index dd4e1f8ea..e75185135 100644 --- a/spectrum/src/main/java/io/github/giulong/spectrum/SpectrumEntity.java +++ b/spectrum/src/main/java/io/github/giulong/spectrum/SpectrumEntity.java @@ -191,7 +191,7 @@ public void addScreenshotToReport(final String msg, final Status status) { final Path path = fileUtils.writeTempFile("screenshot", ".png", screenshot); final Media media = createScreenCaptureFromPath(path.toString()).build(); - contextManager.getScreenshots().put(path, screenshot); + contextManager.getScreenshots().put(path.toString(), screenshot); if (msg == null) { statefulExtentTest.getCurrentNode().log(status, (String) null, media); diff --git a/spectrum/src/main/java/io/github/giulong/spectrum/utils/ContextManager.java b/spectrum/src/main/java/io/github/giulong/spectrum/utils/ContextManager.java index e4d465b9a..5cfca7ef7 100644 --- a/spectrum/src/main/java/io/github/giulong/spectrum/utils/ContextManager.java +++ b/spectrum/src/main/java/io/github/giulong/spectrum/utils/ContextManager.java @@ -4,7 +4,6 @@ import lombok.NoArgsConstructor; import org.junit.jupiter.api.extension.ExtensionContext; -import java.nio.file.Path; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -22,7 +21,7 @@ public static ContextManager getInstance() { private final Map testContexts = new ConcurrentHashMap<>(); @Getter - private final Map screenshots = new ConcurrentHashMap<>(); + private final Map screenshots = new ConcurrentHashMap<>(); public TestContext initFor(final ExtensionContext context) { return initFor(context, new TestContext()); diff --git a/spectrum/src/main/java/io/github/giulong/spectrum/utils/HtmlUtils.java b/spectrum/src/main/java/io/github/giulong/spectrum/utils/HtmlUtils.java index 8b22075ff..6d5ff9ef5 100644 --- a/spectrum/src/main/java/io/github/giulong/spectrum/utils/HtmlUtils.java +++ b/spectrum/src/main/java/io/github/giulong/spectrum/utils/HtmlUtils.java @@ -61,12 +61,12 @@ public String buildFrameTagFor(final int number, final String content, final Tes @SneakyThrows public String inlineImagesOf(final String html) { final Matcher matcher = IMAGE_TAG.matcher(html); - final Map screenshots = contextManager.getScreenshots(); + final Map screenshots = contextManager.getScreenshots(); String inlineHtml = html; while (matcher.find()) { final String src = matcher.group(SRC); - final byte[] bytes = screenshots.get(Path.of(src)); + final byte[] bytes = screenshots.get(src); final String encoded = ENCODER.encodeToString(bytes); final String replacement = freeMarkerWrapper.interpolate(this.inlineImageTemplate, Map.of("encoded", encoded)); diff --git a/spectrum/src/test/java/io/github/giulong/spectrum/SpectrumEntityTest.java b/spectrum/src/test/java/io/github/giulong/spectrum/SpectrumEntityTest.java index 67eb4e684..bd8dbe1d9 100644 --- a/spectrum/src/test/java/io/github/giulong/spectrum/SpectrumEntityTest.java +++ b/spectrum/src/test/java/io/github/giulong/spectrum/SpectrumEntityTest.java @@ -133,7 +133,7 @@ class SpectrumEntityTest { private Media media; @Mock - private Map screenshots; + private Map screenshots; @Mock private MessageDigest messageDigest; @@ -324,7 +324,7 @@ void addScreenshotToReport() { spectrumEntity.addScreenshotToReport(msg, status); assertArrayEquals(bytes, byteArrayArgumentCaptor.getValue()); - verify(screenshots).put(path, bytes); + verify(screenshots).put(path.toString(), bytes); verify(eventsDispatcher).fire(SCREENSHOT, SCREENSHOT, Map.of(EXTENSION_CONTEXT, context, SCREENSHOT, bytes)); verify(extentTest).log(status, tag, media); verifyNoMoreInteractions(eventsDispatcher); diff --git a/spectrum/src/test/java/io/github/giulong/spectrum/utils/HtmlUtilsTest.java b/spectrum/src/test/java/io/github/giulong/spectrum/utils/HtmlUtilsTest.java index 90f784113..d0cfb7cb3 100644 --- a/spectrum/src/test/java/io/github/giulong/spectrum/utils/HtmlUtilsTest.java +++ b/spectrum/src/test/java/io/github/giulong/spectrum/utils/HtmlUtilsTest.java @@ -31,7 +31,7 @@ class HtmlUtilsTest { private ContextManager contextManager; @Mock - private Map screenshots; + private Map screenshots; @Mock private Path path; @@ -141,7 +141,6 @@ void inline() throws IOException { final String report = "abc