import { t } from "@/locales";
import { mockedGetLabs, mockLabsApi } from "@/testutils/mock-lab";
import {
  mockedAppRouterInstance,
  mockNextNavigationModule,
} from "@/testutils/mock-next-navigation";
import { renderServerComponent } from "@/testutils/render-server-component";
import { withRscPageEssentials } from "@/testutils/rsc-essentials";
import { act } from "@testing-library/react";
import { expect, test } from "vitest";

mockLabsApi();
mockNextNavigationModule();

test("app router: /", async () => {
  mockedGetLabs.mockReturnValue(Promise.resolve([]));

  const { ProvidersWrapper } = await import("@/testutils/providers");

  const { page, metadata } = await withRscPageEssentials(
    () => import("@/app/(main)/(default-lang)/page"),
    {
      pathname: "/",
      params: {},
    }
  );

  expect(metadata?.description).toBe(t("en", "home.seo.description"));

  const ui = await renderServerComponent(page, {
    wrapper: ProvidersWrapper,
  });

  const startLab = ui.queryByRole("button", { name: "Start Lab" })!;
  act(() => {
    startLab.click();
  });

  expect(mockedAppRouterInstance.push).toHaveBeenCalledExactlyOnceWith(
    "/labs",
    { scroll: undefined }
  );
});

test("app router: /ja", async () => {
  mockedGetLabs.mockReturnValue(Promise.resolve([]));

  const { ProvidersWrapper } = await import("@/testutils/providers");

  const { page, metadata } = await withRscPageEssentials(
    () => import("@/app/(main)/[lang]/page"),
    {
      pathname: "/ja",
      params: {
        lang: "ja",
      },
    }
  );

  const ui = await renderServerComponent(page, {
    wrapper: ProvidersWrapper,
  });

  expect(metadata?.description).toBe(t("ja", "home.seo.description"));

  const startLab = ui.queryByRole("button", { name: "演習を開始" })!;
  act(() => {
    startLab.click();
  });

  expect(mockedAppRouterInstance.push).toHaveBeenCalledExactlyOnceWith(
    "/ja/labs",
    { scroll: undefined }
  );
});
