import { test, expect } from "@playwright/test";

const { uniq } = require("lodash");

const RouterConfig = require("../../config/routes").default;

const BASE_URL = `http://localhost:${process.env.PORT || 8001}`;

function formatter(routes, parentPath = "") {
  const fixedParentPath = parentPath.replace(/\/{1,}/g, "/");
  let result = [];
  routes.forEach((item) => {
    if (item.path && !item.path.startsWith("/")) {
      result.push(`${fixedParentPath}/${item.path}`.replace(/\/{1,}/g, "/"));
    }

    if (item.path && item.path.startsWith("/")) {
      result.push(`${item.path}`.replace(/\/{1,}/g, "/"));
    }

    if (item.routes) {
      result = result.concat(
        formatter(
          item.routes,
          item.path ? `${fixedParentPath}/${item.path}` : parentPath
        )
      );
    }
  });
  return uniq(result.filter((item) => !!item));
}

const testPage = (path, page) => async () => {
  await page.evaluate(() => {
    localStorage.setItem("antd-pro-authority", '["admin"]');
  });
  await page.goto(`${BASE_URL}${path}`);
  await page.waitForSelector("footer", {
    timeout: 2000,
  });
  const haveFooter = await page.evaluate(
    () => document.getElementsByTagName("footer").length > 0
  );
  expect(haveFooter).toBeTruthy();
};

const routers = formatter(RouterConfig);
routers.forEach((route) => {
  test(`test route page ${route}`, async ({ page }) => {
    await testPage(route, page);
  });
});
