diff --git a/DEV.md b/DEV.md index 32bf6cf1..a059e33f 100644 --- a/DEV.md +++ b/DEV.md @@ -10,11 +10,12 @@ client would. So, we build the framework in a dedicated module, and then we incl | [spectrum](spectrum) | Framework | | [it](it) | Runs the same e2e suite with all the browsers, no testbook | | [it-grid](it-grid) | Runs the same e2e suite as the `it` module, pointing to a local embedded grid | +| [it-bidi](it-bidi) | Runs a bunch of tests with the `webSocketUrl` capability | | [it-testbook](it-testbook) | Runs a bunch of tests with a testbook | | [it-macos](it-macos) | Runs a bunch of tests specific to macOS (Safari) | | [it-appium](it-appium) | Runs a bunch of tests with Appium | | [verify-commons](verify-commons) | Contains common classes used in other verify modules | -| [verify-browsers](verify-browsers) | Verifies results of the `it`, `it-testbook`, and `it-grid` modules | +| [verify-browsers](verify-browsers) | Verifies results of the `it`, `it-testbook`, `it-grid`, and `it-bidi` modules | | [verify-macos](verify-macos) | Verifies results of the `it-macos` module | | [verify-appium](verify-appium) | Verifies results of the `it-appium` module | | [cleanup](cleanup) | Cleans each module after the execution | @@ -45,6 +46,7 @@ To avoid manual operations, at the end of the full build, the `cleanup` module w | spectrum | ✅ | ❌ | remove `SpectrumSessionListener` | | it | ❌ | ✅ | add `SpectrumSessionListener` | | it-grid | ❌ | ✅ | add `SpectrumSessionListener` | +| it-bidi | ❌ | ✅ | add `SpectrumSessionListener` | | it-testbook | ❌ | ✅ | add `SpectrumSessionListener` | | it-appium | ❌ | ✅ | add `SpectrumSessionListener` | | verify-browsers | ✅ | ✅ | add `SpectrumSessionListener` | @@ -116,13 +118,13 @@ The [checkstyle plugin](https://maven.apache.org/plugins/maven-checkstyle-plugin These are the available profiles you can find in the [pom.xml](pom.xml): -| Profile | Description | -|----------------|--------------------------------------------------------------| -| all | runs the full build. Active by default | -| framework-only | builds the framework, skipping unit tests | -| browsers | runs tests in the `it`, `it-testbook`, and `it-grid` modules | -| macos | runs tests in the `it-macos` module | -| appium | runs tests in the `it-appium` module | +| Profile | Description | +|----------------|-------------------------------------------------------------------------| +| all | runs the full build. Active by default | +| framework-only | builds the framework, skipping unit tests | +| browsers | runs tests in the `it`, `it-testbook`, `it-grid`, and `it-bidi` modules | +| macos | runs tests in the `it-macos` module | +| appium | runs tests in the `it-appium` module | You can leverage them to run specific groups of submodules. It's better to leverage these profiles instead of limiting the execution to single modules with `-pl ` in order to build the related `verify-*` and `cleanup` modules as well. diff --git a/cleanup/pom.xml b/cleanup/pom.xml index 094c3258..57b2abe5 100644 --- a/cleanup/pom.xml +++ b/cleanup/pom.xml @@ -174,6 +174,24 @@ + + Copy LauncherSessionListener to "it-bidi" module's classes + clean + + copy-resources + + + ../it-bidi/target/classes/META-INF/services + + + ${spectrumMetaInfServicesFolder} + + ${launcherSessionListener} + + + + + diff --git a/it-bidi/pom.xml b/it-bidi/pom.xml new file mode 100644 index 00000000..a2882fb2 --- /dev/null +++ b/it-bidi/pom.xml @@ -0,0 +1,151 @@ + + + 4.0.0 + + + io.github.giulong + spectrum-aggregate + ${revision} + + + it-bidi + + + + 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-bidi/src/test/java/io/github/giulong/spectrum/it/pages/CheckboxPage.java b/it-bidi/src/test/java/io/github/giulong/spectrum/it/pages/CheckboxPage.java new file mode 100644 index 00000000..82864c2b --- /dev/null +++ b/it-bidi/src/test/java/io/github/giulong/spectrum/it/pages/CheckboxPage.java @@ -0,0 +1,32 @@ +package io.github.giulong.spectrum.it.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-bidi/src/test/java/io/github/giulong/spectrum/it/pages/LandingPage.java b/it-bidi/src/test/java/io/github/giulong/spectrum/it/pages/LandingPage.java new file mode 100644 index 00000000..51799a76 --- /dev/null +++ b/it-bidi/src/test/java/io/github/giulong/spectrum/it/pages/LandingPage.java @@ -0,0 +1,32 @@ +package io.github.giulong.spectrum.it.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-bidi/src/test/java/io/github/giulong/spectrum/it/tests/BiDiCheckboxIT.java b/it-bidi/src/test/java/io/github/giulong/spectrum/it/tests/BiDiCheckboxIT.java new file mode 100644 index 00000000..f7f71c4d --- /dev/null +++ b/it-bidi/src/test/java/io/github/giulong/spectrum/it/tests/BiDiCheckboxIT.java @@ -0,0 +1,29 @@ +package io.github.giulong.spectrum.it.tests; + +import io.github.giulong.spectrum.SpectrumTest; +import io.github.giulong.spectrum.it.pages.CheckboxPage; +import io.github.giulong.spectrum.it.pages.LandingPage; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.openqa.selenium.bidi.module.Network; +import org.openqa.selenium.bidi.network.AddInterceptParameters; + +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.openqa.selenium.bidi.network.InterceptPhase.BEFORE_REQUEST_SENT; + +@SuppressWarnings("unused") +@DisplayName("Checkbox Page") +public class BiDiCheckboxIT extends SpectrumTest { + + private LandingPage landingPage; + + private CheckboxPage checkboxPage; + + @Test + public void testWithNoDisplayName() { + try (Network network = new Network(driver)) { + String intercept = network.addIntercept(new AddInterceptParameters(BEFORE_REQUEST_SENT)); + assertNotNull(intercept); + } + } +} diff --git a/it-bidi/src/test/resources/banner.txt b/it-bidi/src/test/resources/banner.txt new file mode 100644 index 00000000..db968727 --- /dev/null +++ b/it-bidi/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-bidi/src/test/resources/configuration.yaml b/it-bidi/src/test/resources/configuration.yaml new file mode 100644 index 00000000..cf6496d1 --- /dev/null +++ b/it-bidi/src/test/resources/configuration.yaml @@ -0,0 +1,37 @@ +application: + baseUrl: https://the-internet.herokuapp.com/ + +drivers: + waits: + implicit: 2 + downloadTimeout: 5 + chrome: + args: + - --headless=new + capabilities: + webSocketUrl: true + firefox: + args: + - -headless + capabilities: + webSocketUrl: true + edge: + args: + - --headless=new + experimentalOptions: + binary: ${EDGE_BINARY:-} + capabilities: + webSocketUrl: true + +video: + frames: + - autoAfter + - manual + skipDuplicateFrames: false + +extent: + theme: DARK + fileName: report-${spectrum.driver:-chrome}.html + inline: true + sort: + name: { } diff --git a/it-bidi/src/test/resources/filtered/properties.yaml b/it-bidi/src/test/resources/filtered/properties.yaml new file mode 100644 index 00000000..b34a324e --- /dev/null +++ b/it-bidi/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/it-bidi/src/test/resources/js/report.js b/it-bidi/src/test/resources/js/report.js new file mode 100644 index 00000000..a8df5a75 --- /dev/null +++ b/it-bidi/src/test/resources/js/report.js @@ -0,0 +1,3 @@ +document + .querySelectorAll("video") + .forEach(video => video.classList.add("class-added-from-js")); diff --git a/it-bidi/src/test/resources/logback-test.xml b/it-bidi/src/test/resources/logback-test.xml new file mode 100644 index 00000000..82e80c29 --- /dev/null +++ b/it-bidi/src/test/resources/logback-test.xml @@ -0,0 +1,16 @@ + + + + + + + + + ${COLOR_PATTERN} + + + + + + + diff --git a/pom.xml b/pom.xml index a14602c3..73c2bf0f 100644 --- a/pom.xml +++ b/pom.xml @@ -64,6 +64,7 @@ spectrum it it-grid + it-bidi it-testbook it-macos it-appium @@ -88,6 +89,7 @@ it it-grid + it-bidi it-testbook verify-commons verify-browsers diff --git a/spectrum/pom.xml b/spectrum/pom.xml index 57480eeb..e24a80f9 100644 --- a/spectrum/pom.xml +++ b/spectrum/pom.xml @@ -200,13 +200,28 @@ org.apache.maven.plugins maven-dependency-plugin + + + copy-mockito-agent + process-test-classes + + copy-dependencies + + + org.mockito + mockito-core + true + ${project.build.directory}/agent + + + org.apache.maven.plugins maven-surefire-plugin @{argLine} - -javaagent:${org.mockito:mockito-core:jar} + -javaagent:${project.build.directory}/agent/mockito-core.jar --add-opens java.base/java.util=ALL-UNNAMED --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/sun.nio.fs=ALL-UNNAMED diff --git a/spectrum/src/main/java/io/github/giulong/spectrum/drivers/Firefox.java b/spectrum/src/main/java/io/github/giulong/spectrum/drivers/Firefox.java index f208358a..dbd51eac 100644 --- a/spectrum/src/main/java/io/github/giulong/spectrum/drivers/Firefox.java +++ b/spectrum/src/main/java/io/github/giulong/spectrum/drivers/Firefox.java @@ -23,19 +23,18 @@ void buildCapabilities() { final Configuration.Drivers.Firefox firefox = configuration.getDrivers().getFirefox(); final String binary = firefox.getBinary(); - capabilities = new FirefoxOptions() - .addArguments(firefox.getArgs()); + capabilities = new FirefoxOptions().addArguments(firefox.getArgs()); if (binary != null) { capabilities.setBinary(binary); } firefox - .getPreferences() - .forEach(this::addPreference); - } + .getCapabilities() + .forEach(capabilities::setCapability); - void addPreference(final String key, final Object value) { - capabilities.addPreference(key, value instanceof Boolean || value instanceof Integer ? value : String.valueOf(value)); + firefox + .getPreferences() + .forEach(capabilities::addPreference); } } diff --git a/spectrum/src/main/java/io/github/giulong/spectrum/internals/jackson/deserializers/InterpolatedObjectDeserializer.java b/spectrum/src/main/java/io/github/giulong/spectrum/internals/jackson/deserializers/InterpolatedObjectDeserializer.java index aa091daa..f414e2a6 100644 --- a/spectrum/src/main/java/io/github/giulong/spectrum/internals/jackson/deserializers/InterpolatedObjectDeserializer.java +++ b/spectrum/src/main/java/io/github/giulong/spectrum/internals/jackson/deserializers/InterpolatedObjectDeserializer.java @@ -45,6 +45,7 @@ public Object deserialize(final JsonParser jsonParser, final DeserializationCont return switch (jsonNodeType) { case NUMBER -> jsonNode.numberValue(); + case BOOLEAN -> jsonNode.booleanValue(); case STRING -> traverse(jsonNode.textValue(), currentName); case OBJECT -> traverse(objectMapper.convertValue(jsonNode, Map.class), currentName); case ARRAY -> traverse(objectMapper.convertValue(jsonNode, List.class), currentName); 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 4a7d7775..271ed628 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 @@ -268,6 +268,9 @@ public static class Firefox { @JsonPropertyDescription("Firefox's preferences") private Map preferences; + @JsonPropertyDescription("Firefox's capabilities") + private Map capabilities; + @JsonPropertyDescription("Firefox service options") private Service service; diff --git a/spectrum/src/main/resources/yaml/configuration.default.yaml b/spectrum/src/main/resources/yaml/configuration.default.yaml index 250d10e2..02ba6a08 100644 --- a/spectrum/src/main/resources/yaml/configuration.default.yaml +++ b/spectrum/src/main/resources/yaml/configuration.default.yaml @@ -113,6 +113,7 @@ drivers: browser.download.dir: ${downloadsFolder} browser.helperApps.neverAsk.saveToDisk: application/pdf pdfjs.disabled: true + capabilities: { } service: allowHosts: null logLevel: ERROR diff --git a/spectrum/src/test/java/io/github/giulong/spectrum/drivers/FirefoxTest.java b/spectrum/src/test/java/io/github/giulong/spectrum/drivers/FirefoxTest.java index 71e033de..6d18d389 100644 --- a/spectrum/src/test/java/io/github/giulong/spectrum/drivers/FirefoxTest.java +++ b/spectrum/src/test/java/io/github/giulong/spectrum/drivers/FirefoxTest.java @@ -5,9 +5,6 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.MethodSource; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.MockedConstruction; @@ -19,10 +16,8 @@ import java.io.File; import java.util.List; import java.util.Map; -import java.util.stream.Stream; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.params.provider.Arguments.arguments; import static org.mockito.Mockito.*; class FirefoxTest { @@ -90,7 +85,8 @@ void buildCapabilitiesFrom() { when(driversConfig.getFirefox()).thenReturn(firefoxConfig); when(firefoxConfig.getBinary()).thenReturn(binary); when(firefoxConfig.getArgs()).thenReturn(arguments); - when(firefoxConfig.getPreferences()).thenReturn(Map.of("one", "value")); + when(firefoxConfig.getPreferences()).thenReturn(Map.of("preference", "value1")); + when(firefoxConfig.getCapabilities()).thenReturn(Map.of("capability", "value2")); MockedConstruction firefoxOptionsMockedConstruction = mockConstruction(FirefoxOptions.class, (mock, context) -> { when(mock.addArguments(arguments)).thenReturn(mock); @@ -100,8 +96,10 @@ void buildCapabilitiesFrom() { firefox.buildCapabilities(); final FirefoxOptions localFirefoxOptions = firefoxOptionsMockedConstruction.constructed().getFirst(); - verify(localFirefoxOptions).addPreference("one", "value"); + verify(localFirefoxOptions).addPreference("preference", "value1"); verify(localFirefoxOptions).setBinary(binary); + verify(localFirefoxOptions).setCapability("capability", (Object) "value2"); + assertEquals(localFirefoxOptions, Reflections.getFieldValue("capabilities", firefox)); firefoxOptionsMockedConstruction.close(); @@ -115,49 +113,21 @@ void buildCapabilitiesFromNoBinary() { when(configuration.getDrivers()).thenReturn(driversConfig); when(driversConfig.getFirefox()).thenReturn(firefoxConfig); when(firefoxConfig.getArgs()).thenReturn(arguments); - when(firefoxConfig.getPreferences()).thenReturn(Map.of("one", "value")); + when(firefoxConfig.getPreferences()).thenReturn(Map.of("preference", "value1")); + when(firefoxConfig.getCapabilities()).thenReturn(Map.of("capability", "value2")); - MockedConstruction firefoxOptionsMockedConstruction = mockConstruction(FirefoxOptions.class, (mock, context) -> { - when(mock.addArguments(arguments)).thenReturn(mock); - }); + final MockedConstruction firefoxOptionsMockedConstruction = mockConstruction(FirefoxOptions.class, + (mock, context) -> when(mock.addArguments(arguments)).thenReturn(mock)); firefox.buildCapabilities(); final FirefoxOptions localFirefoxOptions = firefoxOptionsMockedConstruction.constructed().getFirst(); - verify(localFirefoxOptions).addPreference("one", "value"); + verify(localFirefoxOptions).addPreference("preference", "value1"); verify(localFirefoxOptions, never()).setBinary(anyString()); + verify(localFirefoxOptions).setCapability("capability", (Object) "value2"); + assertEquals(localFirefoxOptions, Reflections.getFieldValue("capabilities", firefox)); firefoxOptionsMockedConstruction.close(); } - - @DisplayName("addPreference should add the correct preference based on the value type") - @ParameterizedTest(name = "with value {0} we expect {1}") - @MethodSource("valuesProvider") - void addPreference(final Object value, final Object expected) { - firefox.capabilities = firefoxOptions; - - firefox.addPreference("key", value); - verify(firefoxOptions).addPreference("key", expected); - } - - static Stream valuesProvider() { - final DummyObject dummyObject = new DummyObject(); - - return Stream.of( - arguments(true, true), - arguments(123, 123), - arguments("123", "123"), - arguments("true", "true"), - arguments(dummyObject, dummyObject.toString()) - ); - } - - private static final class DummyObject { - - @Override - public String toString() { - return "toString"; - } - } } diff --git a/spectrum/src/test/java/io/github/giulong/spectrum/internals/jackson/deserializers/InterpolatedObjectDeserializerTest.java b/spectrum/src/test/java/io/github/giulong/spectrum/internals/jackson/deserializers/InterpolatedObjectDeserializerTest.java index 78fb9e75..372034a3 100644 --- a/spectrum/src/test/java/io/github/giulong/spectrum/internals/jackson/deserializers/InterpolatedObjectDeserializerTest.java +++ b/spectrum/src/test/java/io/github/giulong/spectrum/internals/jackson/deserializers/InterpolatedObjectDeserializerTest.java @@ -115,6 +115,20 @@ void deserializeNumbers(final Number expected) throws IOException { assertEquals(expected, interpolatedObjectDeserializer.deserialize(jsonParser, deserializationContext)); } + @DisplayName("deserialize should return the booleanValue when the value is a boolean") + @ParameterizedTest(name = "with value {0}") + @ValueSource(booleans = {true, false}) + void deserializeBooleans(final boolean expected) throws IOException { + final String currentName = "currentName"; + + when(jsonParser.readValueAsTree()).thenReturn(jsonNode); + when(jsonParser.currentName()).thenReturn(currentName); + when(jsonNode.getNodeType()).thenReturn(BOOLEAN); + when(jsonNode.booleanValue()).thenReturn(expected); + + assertEquals(expected, interpolatedObjectDeserializer.deserialize(jsonParser, deserializationContext)); + } + @Test @DisplayName("deserialize should traverse the map and interpolate each entry") void deserializeMap() throws IOException { @@ -217,7 +231,7 @@ void deserializeListWithNestedMapsAndLists() throws IOException { @DisplayName("deserialize should return the jsonNode when the value is not string, number, object, array") @ParameterizedTest(name = "with value {0} we expect {1}") - @EnumSource(value = JsonNodeType.class, mode = EXCLUDE, names = {"STRING", "NUMBER", "OBJECT", "ARRAY"}) + @EnumSource(value = JsonNodeType.class, mode = EXCLUDE, names = {"STRING", "NUMBER", "OBJECT", "ARRAY", "BOOLEAN"}) void deserializeDefault(final JsonNodeType jsonNodeType) throws IOException { when(jsonParser.readValueAsTree()).thenReturn(jsonNode); when(jsonParser.currentName()).thenReturn("currentName"); diff --git a/verify-browsers/src/test/java/io/github/giulong/spectrum/verify_browsers/unit/ItBiDiVerifierTest.java b/verify-browsers/src/test/java/io/github/giulong/spectrum/verify_browsers/unit/ItBiDiVerifierTest.java new file mode 100644 index 00000000..52a14e3c --- /dev/null +++ b/verify-browsers/src/test/java/io/github/giulong/spectrum/verify_browsers/unit/ItBiDiVerifierTest.java @@ -0,0 +1,36 @@ +package io.github.giulong.spectrum.verify_browsers.unit; + +import io.github.giulong.spectrum.verify_commons.FailsafeReportsVerifier; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +@DisplayName("It Bidi Module Verifier") +public class ItBiDiVerifierTest { + + private static final FailsafeReportsVerifier FAILSAFE_REPORTS_VERIFIER = FailsafeReportsVerifier.getInstance(); + + private static final int COMPLETED = 1; + private static final int ERRORS = 0; + private static final int FAILURES = 0; + private static final int SKIPPED = 0; + + @Test + @DisplayName("chrome should have run with the correct results") + public void verifyChrome() { + assertTrue(FAILSAFE_REPORTS_VERIFIER.verifyResultsAre("it-bidi", "chrome", COMPLETED, ERRORS, FAILURES, SKIPPED), "CHROME"); + } + + @Test + @DisplayName("firefox should have run with the correct results") + public void verifyFirefox() { + assertTrue(FAILSAFE_REPORTS_VERIFIER.verifyResultsAre("it-bidi", "firefox", COMPLETED, ERRORS, FAILURES, SKIPPED), "FIREFOX"); + } + + @Test + @DisplayName("edge should have run with the correct results") + public void verifyEdge() { + assertTrue(FAILSAFE_REPORTS_VERIFIER.verifyResultsAre("it-bidi", "edge", COMPLETED, ERRORS, FAILURES, SKIPPED), "EDGE"); + } +}