Newer
Older
express-blog / test / accessManagement.test.js
import { expect, test, vi, beforeEach } from "vitest";

beforeEach(() => {
  document.body.innerHTML = `
    <button id="generate-btn">Generate</button>
    <div id="result-container" class="hidden">
        <div id="link-output"></div>
        <button id="copy-link-btn">Copy</button>
    </div>
  `;

  // Mock Global Fetch
  global.fetch = vi.fn();
});

test("UI updates correctly on successful fetch", async () => {
  const mockData = { access_uri: "/access/uuid-123" };
  fetch.mockResolvedValue({
    ok: true,
    json: async () => mockData,
  });

  // Trigger Logic
  const { handleGeneration } = await import("../static/js/adminPortal.js");
  document.getElementById("generate-btn").click();

  // Await microtasks for fetch resolution
  await new Promise((resolve) => setTimeout(resolve, 0));

  const output = document.getElementById("link-output");
  const container = document.getElementById("result-container");

  expect(output.innerText).toContain("/access/uuid-123");
  expect(container.classList.contains("hidden")).toBe(false);
});

test("Handles network failure and displays error", async () => {
  fetch.mockResolvedValue({
    ok: false,
    status: 500,
  });

  document.getElementById("generate-btn").click();
  await new Promise((resolve) => setTimeout(resolve, 0));

  const output = document.getElementById("link-output");
  expect(output.innerText).toContain("Error: Execution Failed: 500");
});

test("Generate button is disabled during fetch and re-enabled after", async () => {
  let resolveFetch;
  const fetchPromise = new Promise((resolve) => {
    resolveFetch = resolve;
  });

  fetch.mockReturnValue(
    fetchPromise.then(() => ({
      ok: true,
      json: async () => ({ access_uri: "/test" }),
    })),
  );

  const btn = document.getElementById("generate-btn");
  btn.click();

  expect(btn.disabled).toBe(true);

  resolveFetch();
  await new Promise((resolve) => setTimeout(resolve, 0));

  expect(btn.disabled).toBe(false);
});