From c4e1f898e693b9c0a688babb47079805fd5167a2 Mon Sep 17 00:00:00 2001 From: uchagani Date: Tue, 23 Jan 2024 20:36:37 -0500 Subject: [PATCH] Remove setters from Options. Add tests for custom fixtures (#1436) --- .../playwright/junit/OptionsFactory.java | 5 +++ .../playwright/junit/UsePlaywright.java | 2 +- .../junit/impl/BrowserExtension.java | 2 +- .../playwright/junit/impl/DefaultOptions.java | 11 ++++++ .../junit/impl/OptionsExtension.java | 3 +- .../com/microsoft/playwright/FixtureTest.java | 16 +++++++++ .../microsoft/playwright/ServerLifecycle.java | 34 ++++++++++++++++++ .../TestPlaywrightCustomFixtures.java | 35 +++++++++++++++++++ .../TestPlaywrightCustomOptionFixtures.java | 35 +++++++++++++++++++ 9 files changed, 140 insertions(+), 3 deletions(-) create mode 100644 playwright/src/main/java/com/microsoft/playwright/junit/OptionsFactory.java create mode 100644 playwright/src/main/java/com/microsoft/playwright/junit/impl/DefaultOptions.java create mode 100644 playwright/src/test/java/com/microsoft/playwright/FixtureTest.java create mode 100644 playwright/src/test/java/com/microsoft/playwright/ServerLifecycle.java create mode 100644 playwright/src/test/java/com/microsoft/playwright/TestPlaywrightCustomFixtures.java create mode 100644 playwright/src/test/java/com/microsoft/playwright/TestPlaywrightCustomOptionFixtures.java diff --git a/playwright/src/main/java/com/microsoft/playwright/junit/OptionsFactory.java b/playwright/src/main/java/com/microsoft/playwright/junit/OptionsFactory.java new file mode 100644 index 00000000..1cd33985 --- /dev/null +++ b/playwright/src/main/java/com/microsoft/playwright/junit/OptionsFactory.java @@ -0,0 +1,5 @@ +package com.microsoft.playwright.junit; + +public interface OptionsFactory { + Options getOptions(); +} diff --git a/playwright/src/main/java/com/microsoft/playwright/junit/UsePlaywright.java b/playwright/src/main/java/com/microsoft/playwright/junit/UsePlaywright.java index 32380512..898422fd 100644 --- a/playwright/src/main/java/com/microsoft/playwright/junit/UsePlaywright.java +++ b/playwright/src/main/java/com/microsoft/playwright/junit/UsePlaywright.java @@ -13,5 +13,5 @@ import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface UsePlaywright { - Class options() default Options.class; + Class value() default DefaultOptions.class; } diff --git a/playwright/src/main/java/com/microsoft/playwright/junit/impl/BrowserExtension.java b/playwright/src/main/java/com/microsoft/playwright/junit/impl/BrowserExtension.java index 64862c17..af0a32eb 100644 --- a/playwright/src/main/java/com/microsoft/playwright/junit/impl/BrowserExtension.java +++ b/playwright/src/main/java/com/microsoft/playwright/junit/impl/BrowserExtension.java @@ -71,7 +71,7 @@ public class BrowserExtension implements ParameterResolver, AfterAllCallback { } if (options.getChannel() != null) { - options.setChannel(options.getChannel()); + launchOptions.setChannel(options.getChannel()); } return launchOptions; diff --git a/playwright/src/main/java/com/microsoft/playwright/junit/impl/DefaultOptions.java b/playwright/src/main/java/com/microsoft/playwright/junit/impl/DefaultOptions.java new file mode 100644 index 00000000..848ef362 --- /dev/null +++ b/playwright/src/main/java/com/microsoft/playwright/junit/impl/DefaultOptions.java @@ -0,0 +1,11 @@ +package com.microsoft.playwright.junit.impl; + +import com.microsoft.playwright.junit.Options; +import com.microsoft.playwright.junit.OptionsFactory; + +public class DefaultOptions implements OptionsFactory { + @Override + public Options getOptions() { + return new Options(); + } +} diff --git a/playwright/src/main/java/com/microsoft/playwright/junit/impl/OptionsExtension.java b/playwright/src/main/java/com/microsoft/playwright/junit/impl/OptionsExtension.java index 3cd67eb6..774dcc33 100644 --- a/playwright/src/main/java/com/microsoft/playwright/junit/impl/OptionsExtension.java +++ b/playwright/src/main/java/com/microsoft/playwright/junit/impl/OptionsExtension.java @@ -2,6 +2,7 @@ package com.microsoft.playwright.junit.impl; import com.microsoft.playwright.PlaywrightException; import com.microsoft.playwright.junit.Options; +import com.microsoft.playwright.junit.OptionsFactory; import com.microsoft.playwright.junit.UsePlaywright; import org.junit.jupiter.api.extension.AfterAllCallback; import org.junit.jupiter.api.extension.ExtensionContext; @@ -24,7 +25,7 @@ public class OptionsExtension implements AfterAllCallback { UsePlaywright usePlaywrightAnnotation = getUsePlaywrightAnnotation(extensionContext); try { - options = usePlaywrightAnnotation.options().newInstance(); + options = usePlaywrightAnnotation.value().newInstance().getOptions(); threadLocalOptions.set(options); } catch (InstantiationException | IllegalAccessException e) { throw new PlaywrightException("Failed to create options", e); diff --git a/playwright/src/test/java/com/microsoft/playwright/FixtureTest.java b/playwright/src/test/java/com/microsoft/playwright/FixtureTest.java new file mode 100644 index 00000000..8788af0c --- /dev/null +++ b/playwright/src/test/java/com/microsoft/playwright/FixtureTest.java @@ -0,0 +1,16 @@ +package com.microsoft.playwright; + +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.extension.ExtendWith; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@ExtendWith(ServerLifecycle.class) +@Tag("fixtures") +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +public @interface FixtureTest { +} diff --git a/playwright/src/test/java/com/microsoft/playwright/ServerLifecycle.java b/playwright/src/test/java/com/microsoft/playwright/ServerLifecycle.java new file mode 100644 index 00000000..dde151e8 --- /dev/null +++ b/playwright/src/test/java/com/microsoft/playwright/ServerLifecycle.java @@ -0,0 +1,34 @@ +package com.microsoft.playwright; + +import org.junit.jupiter.api.extension.AfterAllCallback; +import org.junit.jupiter.api.extension.BeforeAllCallback; +import org.junit.jupiter.api.extension.ExtensionContext; + +import java.util.HashMap; +import java.util.Map; + +import static com.microsoft.playwright.Utils.nextFreePort; + +public class ServerLifecycle implements BeforeAllCallback, AfterAllCallback { + // This is a public map so that objects outside test scope can access the server. + // For example, nested classes inside test classes that define custom options and need the server. + public static Map, Server> serverMap; + + static { + serverMap = new HashMap<>(); + } + + @Override + public void afterAll(ExtensionContext extensionContext) { + Server server = serverMap.get(extensionContext.getRequiredTestClass()); + if (server != null) { + server.stop(); + } + } + + @Override + public void beforeAll(ExtensionContext extensionContext) throws Exception { + Server server = Server.createHttp(nextFreePort()); + serverMap.put(extensionContext.getRequiredTestClass(), server); + } +} diff --git a/playwright/src/test/java/com/microsoft/playwright/TestPlaywrightCustomFixtures.java b/playwright/src/test/java/com/microsoft/playwright/TestPlaywrightCustomFixtures.java new file mode 100644 index 00000000..f72c7b58 --- /dev/null +++ b/playwright/src/test/java/com/microsoft/playwright/TestPlaywrightCustomFixtures.java @@ -0,0 +1,35 @@ +package com.microsoft.playwright; + +import com.microsoft.playwright.junit.Options; +import com.microsoft.playwright.junit.OptionsFactory; +import com.microsoft.playwright.junit.UsePlaywright; +import org.junit.jupiter.api.Test; + +import java.util.regex.Pattern; + +import static com.microsoft.playwright.ServerLifecycle.serverMap; +import static com.microsoft.playwright.assertions.PlaywrightAssertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; + +@FixtureTest +@UsePlaywright(TestPlaywrightCustomFixtures.CustomOptions.class) +public class TestPlaywrightCustomFixtures { + + public static class CustomOptions implements OptionsFactory { + @Override + public Options getOptions() { + return new Options().setBaseUrl(serverMap.get(TestPlaywrightCustomFixtures.class).EMPTY_PAGE).setBrowserName("firefox"); + } + } + + @Test + public void testCustomBrowser(Browser browser) { + assertEquals(browser.browserType().name(), "firefox"); + } + + @Test + public void testBaseUrl(Page page) { + page.navigate("/"); + assertThat(page).hasURL(Pattern.compile("localhost")); + } +} diff --git a/playwright/src/test/java/com/microsoft/playwright/TestPlaywrightCustomOptionFixtures.java b/playwright/src/test/java/com/microsoft/playwright/TestPlaywrightCustomOptionFixtures.java new file mode 100644 index 00000000..ce1663b2 --- /dev/null +++ b/playwright/src/test/java/com/microsoft/playwright/TestPlaywrightCustomOptionFixtures.java @@ -0,0 +1,35 @@ +package com.microsoft.playwright; + +import com.microsoft.playwright.junit.Options; +import com.microsoft.playwright.junit.OptionsFactory; +import com.microsoft.playwright.junit.UsePlaywright; +import org.junit.jupiter.api.Test; + +import java.util.regex.Pattern; + +import static com.microsoft.playwright.ServerLifecycle.serverMap; +import static com.microsoft.playwright.assertions.PlaywrightAssertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertTrue; + +@FixtureTest +@UsePlaywright(TestPlaywrightCustomOptionFixtures.CustomOptions.class) +public class TestPlaywrightCustomOptionFixtures { + public static class CustomOptions implements OptionsFactory { + @Override + public Options getOptions() { + return new Options().setChannel("chrome").setApiRequestOptions(new APIRequest.NewContextOptions().setBaseURL(serverMap.get(TestPlaywrightCustomOptionFixtures.class).EMPTY_PAGE)).setContextOption(new Browser.NewContextOptions().setBaseURL(serverMap.get(TestPlaywrightCustomOptionFixtures.class).EMPTY_PAGE)); + } + } + + @Test + void testCustomBrowserContext(Page page) { + page.navigate("/"); + assertThat(page).hasURL(Pattern.compile("localhost")); + } + + @Test + void testCustomAPIRequestOptions(APIRequestContext apiRequestContext) { + APIResponse response = apiRequestContext.get("/"); + assertTrue(response.url().contains("localhost")); + } +}