Загрузка данных


package com.tests;

import com.google.common.collect.ImmutableMap;
import com.microsoft.playwright.*;
import com.microsoft.playwright.options.Cookie;
import com.pages.BasePage;
import com.utils.BasePageFactory;
import com.utils.BrowserManager;
import io.qameta.allure.Attachment;
import lombok.SneakyThrows;
import org.junit.jupiter.api.*;
import org.junit.jupiter.api.extension.AfterTestExecutionCallback;
import org.junit.jupiter.api.extension.RegisterExtension;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.Optional;
import static com.config.ConfigurationManager.config;
import static com.github.automatedowl.tools.AllureEnvironmentWriter.allureEnvironmentWriter;

@TestInstance(TestInstance.Lifecycle.PER_CLASS)
public abstract class BaseTest {
  protected Playwright playwright;
  protected Browser browser;
  protected BrowserContext browserContext;
  protected Page page;
  private boolean needVideo;

  @RegisterExtension
  AfterTestExecutionCallback callback =
      context -> {
        Optional<Throwable> exception = context.getExecutionException();
        if (exception.isPresent()) {
          needVideo = true;
          captureScreenshotOnFailure();
        }
      };

  // ЕДИНАЯ точка создания context
  protected BrowserContext createContext() {
    if (config().video()) {
      return browser.newContext(new Browser.NewContextOptions()
          .setRecordVideoDir(Paths.get(config().baseTestVideoPath()))
          .setRecordVideoSize(1280, 720)
          .setViewportSize(1920, 1080)
          .setIgnoreHTTPSErrors(true));
    } else {
      return browser.newContext(new Browser.NewContextOptions()
              .setViewportSize(1920, 1080)
              .setIgnoreHTTPSErrors(true));
    }
  }

  @BeforeEach
  public void setUp() {
    browserContext = createContext();
    acceptCookie();
    page = browserContext.newPage();
    page.setDefaultTimeout(config().timeout());
  }

  @AfterEach
  public void tearDown() {
    Path videoPath = null;
    if (page != null && page.video() != null) {
      videoPath = page.video().path();
    }
    if (page != null) {
      page.close();
    }
    if (browserContext != null) {
      browserContext.close();
    }
    if (config().video() && needVideo && videoPath != null) {
      captureVideo(videoPath);
    }

    needVideo = false;
  }

  @Attachment(value = "Test Video", type = "video/webm")
  @SneakyThrows
  private byte[] captureVideo(Path path) { return Files.readAllBytes(path); }

  @Attachment(value = "Failed Screenshot", type = "image/png")
  private byte[] captureScreenshotOnFailure() {
    return page.screenshot();
  }

  protected <T extends BasePage> T createInstance(Class<T> basePage) {
    return BasePageFactory.createInstance(page, basePage);
  }

  @BeforeAll
  public void initBrowser() {
    playwright = Playwright.create();
    browser = BrowserManager.getBrowser(playwright);

    allureEnvironmentWriter(
        ImmutableMap.<String, String>builder()
            .put("Platform", System.getProperty("os.name"))
            .put("Version", System.getProperty("os.version"))
            .put("Browser", config().browser().toUpperCase())
            .put("Context URL", config().baseUrl())
            .build(),
        config().allureResultsDir() + "/");
  }

  @AfterAll
  public void close() {
    browser.close();
    playwright.close();
  }

  /**
   * Принимаем куку
   */
  protected void acceptCookie() {
    browserContext.addCookies(List.of(
        new Cookie("cookies_agreement", "1")
            .setDomain(".portal-da.ru")
            .setPath("/")
    ));
  }

}


package com.tests;

import com.microsoft.playwright.options.Cookie;
import com.utils.api.AuthData;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import java.util.List;
import java.util.Map;
import static com.config.ConfigurationManager.config;
import static com.utils.api.UserHelper.loginUserAndExtractToken;

public abstract class AuthorizedTest extends BaseTest {
  protected String phone;

  @Override
  @BeforeEach
  public void setUp() {
    AuthData authData = loginUserAndExtractToken(phone);
    Assertions.assertNotNull(authData, "AuthData is null");
    browserContext = createContext();
    // добавляем headers ПОВЕРХ context
    browserContext.setExtraHTTPHeaders(Map.of(
        "auth-token", authData.getToken(),
        "Authorization", "Bearer " + authData.getToken(),
        "platform", "web_desktop"
    ));
    acceptCookie();
    // auth cookies
    Cookie tokenCookie = new Cookie("StagingHouseToken", authData.getToken())
        .setDomain(".portal-da.ru")
        .setPath("/");
    Cookie refreshCookie = new Cookie("StagingHouseRefreshToken", authData.getRefreshToken())
        .setDomain(".portal-da.ru")
        .setPath("/");
    browserContext.addCookies(List.of(tokenCookie, refreshCookie));
    page = browserContext.newPage();
    // инициализация домена
    page.navigate(config().baseUrl());
    // страховка для SSR
    page.evaluate("token => document.cookie = `StagingHouseToken=${token}; domain=.portal-da.ru; path=/`", authData.getToken());
    page.evaluate("rt => document.cookie = `StagingHouseRefreshToken=${rt}; domain=.portal-da.ru; path=/`", authData.getRefreshToken());
  }

}