From fb2188cd2a041768be664f899d32b856787a7b73 Mon Sep 17 00:00:00 2001 From: uchagani Date: Fri, 29 Sep 2023 19:41:01 -0400 Subject: [PATCH] feat(junit-playwright) (#1371) --- .../junit/BrowserContextFactory.java | 8 ++ .../playwright/junit/BrowserFactory.java | 8 ++ .../junit/DefaultBrowserContextFactory.java | 11 +++ .../junit/DefaultBrowserFactory.java | 45 +++++++++ .../junit/DefaultPlaywrightFactory.java | 10 ++ .../playwright/junit/PlaywrightFactory.java | 7 ++ .../playwright/junit/UsePlaywright.java | 23 +++++ .../junit/impl/BrowserContextExtension.java | 91 ++++++++++++++++++ .../junit/impl/BrowserExtension.java | 77 +++++++++++++++ .../playwright/junit/impl/ExtensionUtils.java | 21 +++++ .../playwright/junit/impl/PageExtension.java | 61 ++++++++++++ .../junit/impl/PlaywrightExtension.java | 77 +++++++++++++++ .../CustomBrowserContextFactory.java | 16 ++++ .../playwright/CustomBrowserFactory.java | 10 ++ .../TestFixturesWithCustomFactories.java | 93 +++++++++++++++++++ .../TestFixturesWithDefaultFactories.java | 92 ++++++++++++++++++ pom.xml | 11 +++ 17 files changed, 661 insertions(+) create mode 100644 playwright/src/main/java/com/microsoft/playwright/junit/BrowserContextFactory.java create mode 100644 playwright/src/main/java/com/microsoft/playwright/junit/BrowserFactory.java create mode 100644 playwright/src/main/java/com/microsoft/playwright/junit/DefaultBrowserContextFactory.java create mode 100644 playwright/src/main/java/com/microsoft/playwright/junit/DefaultBrowserFactory.java create mode 100644 playwright/src/main/java/com/microsoft/playwright/junit/DefaultPlaywrightFactory.java create mode 100644 playwright/src/main/java/com/microsoft/playwright/junit/PlaywrightFactory.java create mode 100644 playwright/src/main/java/com/microsoft/playwright/junit/UsePlaywright.java create mode 100644 playwright/src/main/java/com/microsoft/playwright/junit/impl/BrowserContextExtension.java create mode 100644 playwright/src/main/java/com/microsoft/playwright/junit/impl/BrowserExtension.java create mode 100644 playwright/src/main/java/com/microsoft/playwright/junit/impl/ExtensionUtils.java create mode 100644 playwright/src/main/java/com/microsoft/playwright/junit/impl/PageExtension.java create mode 100644 playwright/src/main/java/com/microsoft/playwright/junit/impl/PlaywrightExtension.java create mode 100644 playwright/src/test/java/com/microsoft/playwright/CustomBrowserContextFactory.java create mode 100644 playwright/src/test/java/com/microsoft/playwright/CustomBrowserFactory.java create mode 100644 playwright/src/test/java/com/microsoft/playwright/TestFixturesWithCustomFactories.java create mode 100644 playwright/src/test/java/com/microsoft/playwright/TestFixturesWithDefaultFactories.java diff --git a/playwright/src/main/java/com/microsoft/playwright/junit/BrowserContextFactory.java b/playwright/src/main/java/com/microsoft/playwright/junit/BrowserContextFactory.java new file mode 100644 index 00000000..8cc67267 --- /dev/null +++ b/playwright/src/main/java/com/microsoft/playwright/junit/BrowserContextFactory.java @@ -0,0 +1,8 @@ +package com.microsoft.playwright.junit; + +import com.microsoft.playwright.Browser; +import com.microsoft.playwright.BrowserContext; + +public interface BrowserContextFactory { + BrowserContext newBrowserContext(Browser browser); +} diff --git a/playwright/src/main/java/com/microsoft/playwright/junit/BrowserFactory.java b/playwright/src/main/java/com/microsoft/playwright/junit/BrowserFactory.java new file mode 100644 index 00000000..f5aa66ec --- /dev/null +++ b/playwright/src/main/java/com/microsoft/playwright/junit/BrowserFactory.java @@ -0,0 +1,8 @@ +package com.microsoft.playwright.junit; + +import com.microsoft.playwright.Browser; +import com.microsoft.playwright.Playwright; + +public interface BrowserFactory { + Browser newBrowser(Playwright playwright); +} diff --git a/playwright/src/main/java/com/microsoft/playwright/junit/DefaultBrowserContextFactory.java b/playwright/src/main/java/com/microsoft/playwright/junit/DefaultBrowserContextFactory.java new file mode 100644 index 00000000..89877b81 --- /dev/null +++ b/playwright/src/main/java/com/microsoft/playwright/junit/DefaultBrowserContextFactory.java @@ -0,0 +1,11 @@ +package com.microsoft.playwright.junit; + +import com.microsoft.playwright.Browser; +import com.microsoft.playwright.BrowserContext; + +public class DefaultBrowserContextFactory implements BrowserContextFactory { + @Override + public BrowserContext newBrowserContext(Browser browser) { + return browser.newContext(); + } +} diff --git a/playwright/src/main/java/com/microsoft/playwright/junit/DefaultBrowserFactory.java b/playwright/src/main/java/com/microsoft/playwright/junit/DefaultBrowserFactory.java new file mode 100644 index 00000000..9b076441 --- /dev/null +++ b/playwright/src/main/java/com/microsoft/playwright/junit/DefaultBrowserFactory.java @@ -0,0 +1,45 @@ +package com.microsoft.playwright.junit; + +import com.microsoft.playwright.Browser; +import com.microsoft.playwright.BrowserType; +import com.microsoft.playwright.Playwright; +import com.microsoft.playwright.PlaywrightException; + +public class DefaultBrowserFactory implements BrowserFactory { + private final boolean headed; + private final String browserEnv; + + public DefaultBrowserFactory() { + headed = isHeaded(); + browserEnv = getBrowserNameFromEnv(); + } + + @Override + public Browser newBrowser(Playwright playwright) { + BrowserType.LaunchOptions launchOptions = new BrowserType.LaunchOptions().setHeadless(!headed); + + switch (browserEnv) { + case "webkit": + return playwright.webkit().launch(launchOptions); + case "firefox": + return playwright.firefox().launch(launchOptions); + case "chromium": + return playwright.chromium().launch(launchOptions); + default: + throw new PlaywrightException("Invalid value set for BROWSER. Must be one of: chromium, firefox, webkit"); + } + } + + private static String getBrowserNameFromEnv() { + String browserName = System.getenv("BROWSER"); + if (browserName == null) { + browserName = "chromium"; + } + return browserName; + } + + private static boolean isHeaded() { + String headedEnv = System.getenv("HEADED"); + return headedEnv != null && !"0".equals(headedEnv) && !"false".equals(headedEnv); + } +} diff --git a/playwright/src/main/java/com/microsoft/playwright/junit/DefaultPlaywrightFactory.java b/playwright/src/main/java/com/microsoft/playwright/junit/DefaultPlaywrightFactory.java new file mode 100644 index 00000000..dccfd6b0 --- /dev/null +++ b/playwright/src/main/java/com/microsoft/playwright/junit/DefaultPlaywrightFactory.java @@ -0,0 +1,10 @@ +package com.microsoft.playwright.junit; + +import com.microsoft.playwright.Playwright; + +public class DefaultPlaywrightFactory implements PlaywrightFactory { + @Override + public Playwright newPlaywright() { + return Playwright.create(); + } +} diff --git a/playwright/src/main/java/com/microsoft/playwright/junit/PlaywrightFactory.java b/playwright/src/main/java/com/microsoft/playwright/junit/PlaywrightFactory.java new file mode 100644 index 00000000..70340c2d --- /dev/null +++ b/playwright/src/main/java/com/microsoft/playwright/junit/PlaywrightFactory.java @@ -0,0 +1,7 @@ +package com.microsoft.playwright.junit; + +import com.microsoft.playwright.Playwright; + +public interface PlaywrightFactory { + Playwright newPlaywright(); +} diff --git a/playwright/src/main/java/com/microsoft/playwright/junit/UsePlaywright.java b/playwright/src/main/java/com/microsoft/playwright/junit/UsePlaywright.java new file mode 100644 index 00000000..7200dd52 --- /dev/null +++ b/playwright/src/main/java/com/microsoft/playwright/junit/UsePlaywright.java @@ -0,0 +1,23 @@ +package com.microsoft.playwright.junit; + +import com.microsoft.playwright.junit.impl.BrowserContextExtension; +import com.microsoft.playwright.junit.impl.BrowserExtension; +import com.microsoft.playwright.junit.impl.PageExtension; +import com.microsoft.playwright.junit.impl.PlaywrightExtension; +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({PlaywrightExtension.class, BrowserExtension.class, BrowserContextExtension.class, PageExtension.class}) +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +public @interface UsePlaywright { + Class playwrightFactory() default DefaultPlaywrightFactory.class; + + Class browserFactory() default DefaultBrowserFactory.class; + + Class browserContextFactory() default DefaultBrowserContextFactory.class; +} diff --git a/playwright/src/main/java/com/microsoft/playwright/junit/impl/BrowserContextExtension.java b/playwright/src/main/java/com/microsoft/playwright/junit/impl/BrowserContextExtension.java new file mode 100644 index 00000000..d96151ce --- /dev/null +++ b/playwright/src/main/java/com/microsoft/playwright/junit/impl/BrowserContextExtension.java @@ -0,0 +1,91 @@ +package com.microsoft.playwright.junit.impl; + +import com.microsoft.playwright.Browser; +import com.microsoft.playwright.BrowserContext; +import com.microsoft.playwright.PlaywrightException; +import com.microsoft.playwright.junit.BrowserContextFactory; +import com.microsoft.playwright.junit.UsePlaywright; +import org.junit.jupiter.api.extension.*; + +import static com.microsoft.playwright.junit.impl.ExtensionUtils.*; + +public class BrowserContextExtension implements ParameterResolver, AfterEachCallback, AfterAllCallback { + private final static ThreadLocal threadLocalBrowserContext; + private final static ThreadLocal threadLocalBrowserContextFactory; + + static { + threadLocalBrowserContext = new ThreadLocal<>(); + threadLocalBrowserContextFactory = new ThreadLocal<>(); + } + + @Override + public void afterEach(ExtensionContext extensionContext) { + cleanupBrowserContext(); + } + + @Override + public void afterAll(ExtensionContext extensionContext) { + cleanupBrowserContextFactory(); + } + + @Override + public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException { + if (isClassHook(extensionContext) || !hasUsePlaywrightAnnotation(extensionContext)) { + return false; + } + Class clazz = parameterContext.getParameter().getType(); + return BrowserContext.class.equals(clazz); + } + + @Override + public Object resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException { + return getOrCreateBrowserContext(extensionContext); + } + + static BrowserContext getOrCreateBrowserContext(ExtensionContext extensionContext) { + BrowserContext browserContext = threadLocalBrowserContext.get(); + if (browserContext != null) { + return browserContext; + } + + Browser browser = BrowserExtension.getOrCreateBrowser(extensionContext); + BrowserContextFactory browserContextFactory = getBrowserContextFactoryInstance(extensionContext); + browserContext = browserContextFactory.newBrowserContext(browser); + threadLocalBrowserContext.set(browserContext); + return browserContext; + } + + private static BrowserContextFactory getBrowserContextFactoryInstance(ExtensionContext extensionContext) { + if (threadLocalBrowserContextFactory.get() != null) { + return threadLocalBrowserContextFactory.get(); + } + + UsePlaywright usePlaywrightAnnotation = getUsePlaywrightAnnotation(extensionContext); + + try { + BrowserContextFactory browserContextFactory = usePlaywrightAnnotation.browserContextFactory().newInstance(); + threadLocalBrowserContextFactory.set(browserContextFactory); + return browserContextFactory; + } catch (InstantiationException | IllegalAccessException e) { + throw new PlaywrightException("Unable to create an instance of the supplied BrowserContextFactory", e); + } + } + + private void cleanupBrowserContext() { + try { + BrowserContext browserContext = threadLocalBrowserContext.get(); + if (browserContext != null) { + browserContext.close(); + } + } finally { + threadLocalBrowserContext.remove(); + } + } + + private void cleanupBrowserContextFactory() { + BrowserContextFactory browserContextFactory = threadLocalBrowserContextFactory.get(); + if (browserContextFactory != null) { + threadLocalBrowserContextFactory.remove(); + } + } +} 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 new file mode 100644 index 00000000..0d079bba --- /dev/null +++ b/playwright/src/main/java/com/microsoft/playwright/junit/impl/BrowserExtension.java @@ -0,0 +1,77 @@ +package com.microsoft.playwright.junit.impl; + +import com.microsoft.playwright.Browser; +import com.microsoft.playwright.Playwright; +import com.microsoft.playwright.PlaywrightException; +import com.microsoft.playwright.junit.BrowserFactory; +import com.microsoft.playwright.junit.UsePlaywright; +import org.junit.jupiter.api.extension.*; + +import static com.microsoft.playwright.junit.impl.ExtensionUtils.getUsePlaywrightAnnotation; +import static com.microsoft.playwright.junit.impl.ExtensionUtils.hasUsePlaywrightAnnotation; + +public class BrowserExtension implements ParameterResolver, AfterAllCallback { + private static final ThreadLocal threadLocalBrowser; + private static final ThreadLocal threadLocalBrowserFactory; + + static { + threadLocalBrowser = new ThreadLocal<>(); + threadLocalBrowserFactory = new ThreadLocal<>(); + } + + @Override + public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException { + if (!hasUsePlaywrightAnnotation(extensionContext)) { + return false; + } + Class clazz = parameterContext.getParameter().getType(); + return Browser.class.equals(clazz); + } + + @Override + public Object resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException { + return getOrCreateBrowser(extensionContext); + } + + @Override + public void afterAll(ExtensionContext extensionContext) { + try { + Browser browser = threadLocalBrowser.get(); + if (browser != null) { + browser.close(); + } + } finally { + threadLocalBrowser.remove(); + threadLocalBrowserFactory.remove(); + } + } + + static Browser getOrCreateBrowser(ExtensionContext extensionContext) { + Browser browser = threadLocalBrowser.get(); + if (browser != null) { + return browser; + } + + Playwright playwright = PlaywrightExtension.getOrCreatePlaywright(extensionContext); + BrowserFactory browserFactory = getBrowserFactoryInstance(extensionContext); + browser = browserFactory.newBrowser(playwright); + threadLocalBrowser.set(browser); + return browser; + } + + private static BrowserFactory getBrowserFactoryInstance(ExtensionContext extensionContext) { + if (threadLocalBrowserFactory.get() != null) { + return threadLocalBrowserFactory.get(); + } + + UsePlaywright usePlaywrightAnnotation = getUsePlaywrightAnnotation(extensionContext); + + try { + BrowserFactory browserFactory = usePlaywrightAnnotation.browserFactory().newInstance(); + threadLocalBrowserFactory.set(browserFactory); + return browserFactory; + } catch (InstantiationException | IllegalAccessException e) { + throw new PlaywrightException("Unable to create an instance of the supplied BrowserFactory", e); + } + } +} diff --git a/playwright/src/main/java/com/microsoft/playwright/junit/impl/ExtensionUtils.java b/playwright/src/main/java/com/microsoft/playwright/junit/impl/ExtensionUtils.java new file mode 100644 index 00000000..352d005a --- /dev/null +++ b/playwright/src/main/java/com/microsoft/playwright/junit/impl/ExtensionUtils.java @@ -0,0 +1,21 @@ +package com.microsoft.playwright.junit.impl; + +import com.microsoft.playwright.junit.UsePlaywright; +import org.junit.jupiter.api.extension.ExtensionContext; +import org.junit.platform.commons.support.AnnotationSupport; + +import static org.junit.platform.commons.support.AnnotationSupport.findAnnotation; + +class ExtensionUtils { + static boolean hasUsePlaywrightAnnotation(ExtensionContext extensionContext) { + return AnnotationSupport.isAnnotated(extensionContext.getTestClass(), UsePlaywright.class); + } + + static UsePlaywright getUsePlaywrightAnnotation(ExtensionContext extensionContext) { + return findAnnotation(extensionContext.getTestClass(), UsePlaywright.class).get(); + } + + static boolean isClassHook(ExtensionContext extensionContext) { + return !extensionContext.getTestMethod().isPresent(); + } +} diff --git a/playwright/src/main/java/com/microsoft/playwright/junit/impl/PageExtension.java b/playwright/src/main/java/com/microsoft/playwright/junit/impl/PageExtension.java new file mode 100644 index 00000000..7b8b77a8 --- /dev/null +++ b/playwright/src/main/java/com/microsoft/playwright/junit/impl/PageExtension.java @@ -0,0 +1,61 @@ +package com.microsoft.playwright.junit.impl; + +import com.microsoft.playwright.BrowserContext; +import com.microsoft.playwright.Page; +import org.junit.jupiter.api.extension.*; + +import static com.microsoft.playwright.junit.impl.ExtensionUtils.hasUsePlaywrightAnnotation; +import static com.microsoft.playwright.junit.impl.ExtensionUtils.isClassHook; + +public class PageExtension implements ParameterResolver, AfterEachCallback { + private final static ThreadLocal threadLocalPage; + + static { + threadLocalPage = new ThreadLocal<>(); + } + + @Override + public void afterEach(ExtensionContext extensionContext) { + cleanupPage(); + } + + @Override + public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException { + if (isClassHook(extensionContext) || !hasUsePlaywrightAnnotation(extensionContext)) { + return false; + } + Class clazz = parameterContext.getParameter().getType(); + return Page.class.equals(clazz); + } + + @Override + public Object resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException { + return getOrCreatePage(extensionContext); + } + + private Page getOrCreatePage(ExtensionContext extensionContext) { + Page page = threadLocalPage.get(); + if (page != null) { + return page; + } + + BrowserContext browserContext = BrowserContextExtension.getOrCreateBrowserContext(extensionContext); + page = browserContext.newPage(); + threadLocalPage.set(page); + return page; + } + + private void cleanupPage() { + try { + Page page = threadLocalPage.get(); + if (page != null) { + if (!page.isClosed()) { + page.close(); + } + } + } finally { + threadLocalPage.remove(); + } + + } +} diff --git a/playwright/src/main/java/com/microsoft/playwright/junit/impl/PlaywrightExtension.java b/playwright/src/main/java/com/microsoft/playwright/junit/impl/PlaywrightExtension.java new file mode 100644 index 00000000..84671fc4 --- /dev/null +++ b/playwright/src/main/java/com/microsoft/playwright/junit/impl/PlaywrightExtension.java @@ -0,0 +1,77 @@ +package com.microsoft.playwright.junit.impl; + +import com.microsoft.playwright.Playwright; +import com.microsoft.playwright.PlaywrightException; +import com.microsoft.playwright.junit.PlaywrightFactory; +import com.microsoft.playwright.junit.UsePlaywright; +import org.junit.jupiter.api.extension.*; + +import static com.microsoft.playwright.junit.impl.ExtensionUtils.getUsePlaywrightAnnotation; +import static com.microsoft.playwright.junit.impl.ExtensionUtils.hasUsePlaywrightAnnotation; + +public class PlaywrightExtension implements ParameterResolver, AfterAllCallback { + private static final ThreadLocal threadLocalPlaywright; + private static final ThreadLocal threadLocalPlaywrightFactory; + + static { + threadLocalPlaywright = new ThreadLocal<>(); + threadLocalPlaywrightFactory = new ThreadLocal<>(); + } + + @Override + public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException { + if (!hasUsePlaywrightAnnotation(extensionContext)) { + return false; + } + Class clazz = parameterContext.getParameter().getType(); + return Playwright.class.equals(clazz); + } + + @Override + public Object resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException { + return getOrCreatePlaywright(extensionContext); + } + + @Override + public void afterAll(ExtensionContext extensionContext) { + closePlaywright(); + } + + static Playwright getOrCreatePlaywright(ExtensionContext extensionContext) { + Playwright playwright = threadLocalPlaywright.get(); + if (playwright != null) { + return playwright; + } + + PlaywrightFactory playwrightFactory = getPlaywrightFactoryInstance(extensionContext); + playwright = playwrightFactory.newPlaywright(); + threadLocalPlaywright.set(playwright); + return playwright; + } + + private static PlaywrightFactory getPlaywrightFactoryInstance(ExtensionContext extensionContext) { + if (threadLocalPlaywrightFactory.get() != null) { + return threadLocalPlaywrightFactory.get(); + } + + UsePlaywright usePlaywrightAnnotation = getUsePlaywrightAnnotation(extensionContext); + + try { + PlaywrightFactory playwrightFactory = usePlaywrightAnnotation.playwrightFactory().newInstance(); + threadLocalPlaywrightFactory.set(playwrightFactory); + return playwrightFactory; + } catch (InstantiationException | IllegalAccessException e) { + throw new PlaywrightException("Unable to create an instance of the supplied PlaywrightFactory", e); + } + } + + private static void closePlaywright() { + try { + if (threadLocalPlaywright.get() != null) { + threadLocalPlaywright.get().close(); + } + } finally { + threadLocalPlaywright.remove(); + } + } +} diff --git a/playwright/src/test/java/com/microsoft/playwright/CustomBrowserContextFactory.java b/playwright/src/test/java/com/microsoft/playwright/CustomBrowserContextFactory.java new file mode 100644 index 00000000..84f04413 --- /dev/null +++ b/playwright/src/test/java/com/microsoft/playwright/CustomBrowserContextFactory.java @@ -0,0 +1,16 @@ +package com.microsoft.playwright; + +import com.microsoft.playwright.junit.BrowserContextFactory; +import com.microsoft.playwright.options.Cookie; + +import java.util.Collections; + +public class CustomBrowserContextFactory implements BrowserContextFactory { + @Override + public BrowserContext newBrowserContext(Browser browser) { + BrowserContext context = browser.newContext(); + Cookie cookie = new Cookie("foo", "bar").setUrl("https://microsoft.com"); + context.addCookies(Collections.singletonList(cookie)); + return context; + } +} diff --git a/playwright/src/test/java/com/microsoft/playwright/CustomBrowserFactory.java b/playwright/src/test/java/com/microsoft/playwright/CustomBrowserFactory.java new file mode 100644 index 00000000..5a1d693b --- /dev/null +++ b/playwright/src/test/java/com/microsoft/playwright/CustomBrowserFactory.java @@ -0,0 +1,10 @@ +package com.microsoft.playwright; + +import com.microsoft.playwright.junit.BrowserFactory; + +public class CustomBrowserFactory implements BrowserFactory { + @Override + public Browser newBrowser(Playwright playwright) { + return playwright.firefox().launch(); + } +} diff --git a/playwright/src/test/java/com/microsoft/playwright/TestFixturesWithCustomFactories.java b/playwright/src/test/java/com/microsoft/playwright/TestFixturesWithCustomFactories.java new file mode 100644 index 00000000..4c641a26 --- /dev/null +++ b/playwright/src/test/java/com/microsoft/playwright/TestFixturesWithCustomFactories.java @@ -0,0 +1,93 @@ +package com.microsoft.playwright; + +import com.microsoft.playwright.junit.UsePlaywright; +import org.junit.jupiter.api.*; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +@UsePlaywright(browserFactory = CustomBrowserFactory.class, browserContextFactory = CustomBrowserContextFactory.class) +public class TestFixturesWithCustomFactories { + private static Playwright playwrightFromBeforeAll; + private static Browser browserFromBeforeAll; + private BrowserContext browserContextFromBeforeEach; + private Page pageFromBeforeEach; + + @BeforeAll + static void beforeAll(Playwright playwright, Browser browser) { + assertNotNull(playwright); + assertNotNull(browser); + assertEquals("firefox", browser.browserType().name()); + playwrightFromBeforeAll = playwright; + browserFromBeforeAll = browser; + } + + @AfterAll + static void afterAll(Playwright playwright, Browser browser) { + assertNotNull(playwright); + assertNotNull(browser); + assertEquals(playwrightFromBeforeAll, playwright); + assertEquals(browserFromBeforeAll, browser); + } + + @BeforeEach + void beforeEach(Playwright playwright, Browser browser, BrowserContext browserContext, Page page) { + assertNotNull(playwright); + assertNotNull(browser); + assertNotNull(browserContext); + assertNotNull(page); + assertEquals(playwrightFromBeforeAll, playwright); + assertEquals(browserFromBeforeAll, browser); + assertEquals(1, browserContext.cookies().size()); + assertEquals("foo", browserContext.cookies().get(0).name); + + this.browserContextFromBeforeEach = browserContext; + this.pageFromBeforeEach = page; + } + + @AfterEach + void afterEach(Playwright playwright, Browser browser, BrowserContext browserContext, Page page) { + assertNotNull(playwright); + assertNotNull(browser); + assertNotNull(browserContext); + assertNotNull(page); + assertEquals(playwrightFromBeforeAll, playwright); + assertEquals(browserFromBeforeAll, browser); + } + + @Test + void objectsAreSameFromBeforeAll(Playwright playwright, Browser browser) { + assertNotNull(playwright); + assertNotNull(browser); + assertEquals(playwrightFromBeforeAll, playwright); + assertEquals(browserFromBeforeAll, browser); + } + + @Test + void objectsAreSameFromBeforeEach(BrowserContext browserContext, Page page) { + assertNotNull(browserContext); + assertNotNull(page); + assertEquals(this.browserContextFromBeforeEach, browserContext); + assertEquals(this.pageFromBeforeEach, page); + } + + @Test + void duplicatePlaywrightReturnTheSameObject(Playwright playwright1, Playwright playwright2) { + assertEquals(playwright1, playwright2); + } + + @Test + void duplicateBrowserReturnTheSameObject(Browser browser1, Browser browser2) { + assertEquals(browser1, browser2); + } + + @Test + void duplicateBrowserContextReturnTheSameObject(BrowserContext browserContext1, BrowserContext browserContext2) { + assertEquals(browserContext1, browserContext2); + } + + @Test + void duplicatePageReturnTheSameObject(Page page1, Page page2) { + assertEquals(page1, page2); + } +} diff --git a/playwright/src/test/java/com/microsoft/playwright/TestFixturesWithDefaultFactories.java b/playwright/src/test/java/com/microsoft/playwright/TestFixturesWithDefaultFactories.java new file mode 100644 index 00000000..d4d1cff8 --- /dev/null +++ b/playwright/src/test/java/com/microsoft/playwright/TestFixturesWithDefaultFactories.java @@ -0,0 +1,92 @@ +package com.microsoft.playwright; + +import com.microsoft.playwright.junit.UsePlaywright; +import org.junit.jupiter.api.*; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +@UsePlaywright +public class TestFixturesWithDefaultFactories { + private static Playwright playwrightFromBeforeAll; + private static Browser browserFromBeforeAll; + private BrowserContext browserContextFromBeforeEach; + private Page pageFromBeforeEach; + + @BeforeAll + static void beforeAll(Playwright playwright, Browser browser) { + assertNotNull(playwright); + assertNotNull(browser); + String browserName = System.getenv("BROWSER") == null ? "chromium" : System.getenv("BROWSER"); + assertEquals(browserName, browser.browserType().name()); + playwrightFromBeforeAll = playwright; + browserFromBeforeAll = browser; + } + + @AfterAll + static void afterAll(Playwright playwright, Browser browser) { + assertNotNull(playwright); + assertNotNull(browser); + assertEquals(playwrightFromBeforeAll, playwright); + assertEquals(browserFromBeforeAll, browser); + } + + @BeforeEach + void beforeEach(Playwright playwright, Browser browser, BrowserContext browserContext, Page page) { + assertNotNull(playwright); + assertNotNull(browser); + assertNotNull(browserContext); + assertNotNull(page); + assertEquals(playwrightFromBeforeAll, playwright); + assertEquals(browserFromBeforeAll, browser); + + this.browserContextFromBeforeEach = browserContext; + this.pageFromBeforeEach = page; + } + + @AfterEach + void afterEach(Playwright playwright, Browser browser, BrowserContext browserContext, Page page) { + assertNotNull(playwright); + assertNotNull(browser); + assertNotNull(browserContext); + assertNotNull(page); + assertEquals(playwrightFromBeforeAll, playwright); + assertEquals(browserFromBeforeAll, browser); + } + + @Test + void objectsAreSameFromBeforeAll(Playwright playwright, Browser browser) { + assertNotNull(playwright); + assertNotNull(browser); + assertEquals(playwrightFromBeforeAll, playwright); + assertEquals(browserFromBeforeAll, browser); + } + + @Test + void objectsAreSameFromBeforeEach(BrowserContext browserContext, Page page) { + assertNotNull(browserContext); + assertNotNull(page); + assertEquals(this.browserContextFromBeforeEach, browserContext); + assertEquals(this.pageFromBeforeEach, page); + } + + @Test + void duplicatePlaywrightReturnTheSameObject(Playwright playwright1, Playwright playwright2) { + assertEquals(playwright1, playwright2); + } + + @Test + void duplicateBrowserReturnTheSameObject(Browser browser1, Browser browser2) { + assertEquals(browser1, browser2); + } + + @Test + void duplicateBrowserContextReturnTheSameObject(BrowserContext browserContext1, BrowserContext browserContext2) { + assertEquals(browserContext1, browserContext2); + } + + @Test + void duplicatePageReturnTheSameObject(Page page1, Page page2) { + assertEquals(page1, page2); + } +} diff --git a/pom.xml b/pom.xml index 36a099d1..f89c81c0 100644 --- a/pom.xml +++ b/pom.xml @@ -54,6 +54,11 @@ + + com.microsoft.playwright + playwright + ${project.version} + com.microsoft.playwright driver @@ -80,6 +85,12 @@ ${junit.version} test + + org.junit.jupiter + junit-jupiter-api + ${junit.version} + provided + org.java-websocket Java-WebSocket