All Downloads are FREE. Search and download functionalities are using the official Maven repository.

info.novatec.testit.webtester.junit5.extensions.pages.PageInitializerExtension Maven / Gradle / Ivy

package info.novatec.testit.webtester.junit5.extensions.pages;

import java.lang.reflect.Field;
import java.util.List;
import java.util.Map;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.extension.BeforeEachCallback;
import org.junit.jupiter.api.extension.Extension;
import org.junit.jupiter.api.extension.ExtensionContext;

import lombok.extern.slf4j.Slf4j;

import info.novatec.testit.webtester.browser.Browser;
import info.novatec.testit.webtester.junit5.extensions.BaseExtension;
import info.novatec.testit.webtester.junit5.extensions.NoManagedBrowserException;
import info.novatec.testit.webtester.junit5.extensions.NoManagedBrowserForNameException;
import info.novatec.testit.webtester.junit5.extensions.browsers.Managed;
import info.novatec.testit.webtester.pages.Page;


/**
 * This {@link Extension} initializes {@link Page} instances into fields annotated with {@link Initialized}. This is done
 * before the first {@link BeforeEach} method is invoked.
 * 

* In case the test is declaring multiple {@link Managed} {@link Browser} instances each must have a unique name and the * {@link Initialized#source()} property must be specified! *

* Example: *

 * @EnableWebTesterExtensions
 * public class FooTest {
 *
 *     @Managed
 *     Browser browser;
 *
 *     @Initialized
 *     FooPage page;
 *
 * }
 *
 * @EnableWebTesterExtensions
 * public class BarTest {
 *
 *     @Managed("b1")
 *     Browser browser1;
 *     @Managed("b2")
 *     Browser browser2;
 *
 *     @Initialized(source="b2")
 *     BarPage page;
 *
 * }
 * 
* * @see Initialized * @since 2.1 */ @Slf4j public class PageInitializerExtension extends BaseExtension implements BeforeEachCallback { @Override @SuppressWarnings("PMD.SignatureDeclareThrowsException") public void beforeEach(ExtensionContext context) throws Exception { executeHandlingUndeclaredThrowables(context, this::createPagesForAnnotatedFields); } private void createPagesForAnnotatedFields(ExtensionContext context) { List pageFields = getModel(context).getPageFields(); if (pageFields.isEmpty()) { log.debug("no pages to initialize"); return; } Map map = getModel(context).getNamedBrowserFields(); if (map.isEmpty()) { throw new NoManagedBrowserException(); } Object testInstance = context.getRequiredTestInstance(); pageFields.forEach(pageField -> { String browserName = getBrowserName(pageField); Field browserField = map.get(browserName); if (browserField == null) { throw new NoManagedBrowserForNameException(browserName); } Browser browser = getValue(browserField, testInstance); Page page = createPage(pageField, browser); setValue(pageField, testInstance, page); log.debug("initialized field '{} {}' with new page instance from '{}' browser", pageField.getType().getSimpleName(), pageField.getName(), browserName); }); } private String getBrowserName(Field pageField) { return pageField.getAnnotation(Initialized.class).source(); } @SuppressWarnings("unchecked") private Page createPage(Field pageField, Browser browser) { return browser.create(( Class ) pageField.getType()); } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy