import {
act,
assertEquals,
cleanup,
fireEvent,
render,
screen,
} from "./setup.ts";
import LoginFrame from "../../islands/LoginFrame.tsx";
// Mock fetch to prevent actual network calls
const originalFetch = globalThis.fetch;
function mockFetch(response = { success: false }) {
globalThis.fetch = () =>
Promise.resolve(
new Response(JSON.stringify(response), {
headers: { "Content-Type": "application/json" },
}),
);
}
function restoreFetch() {
globalThis.fetch = originalFetch;
}
// Mock $loading to prevent errors
function mockLoading() {
globalThis.$loading = { show: () => {}, hide: () => {} };
}
function restoreLoading() {
delete globalThis.$loading;
}
Deno.test({
name: "LoginFrame - login mode renders email and password inputs",
async fn() {
mockFetch();
const { container } = render();
// Wait for useEffect to settle
await act(async () => {});
assertEquals(screen.getByPlaceholderText("Your email") !== null, true);
assertEquals(screen.getByPlaceholderText("Your password") !== null, true);
cleanup();
restoreFetch();
},
sanitizeResources: false,
sanitizeOps: false,
});
Deno.test({
name: "LoginFrame - login mode renders Sign in button",
async fn() {
mockFetch();
const { container } = render();
await act(async () => {});
assertEquals(screen.getByText("Sign in").tagName, "BUTTON");
cleanup();
restoreFetch();
},
sanitizeResources: false,
sanitizeOps: false,
});
Deno.test({
name: "LoginFrame - login mode renders Go Register button",
async fn() {
mockFetch();
render();
await act(async () => {});
assertEquals(screen.getByText("Go Register").tagName, "BUTTON");
cleanup();
restoreFetch();
},
sanitizeResources: false,
sanitizeOps: false,
});
Deno.test({
name: "LoginFrame - login mode does not render confirm password",
async fn() {
mockFetch();
render();
await act(async () => {});
const confirmInput = screen.queryByPlaceholderText("Confirm your password");
assertEquals(confirmInput, null);
cleanup();
restoreFetch();
},
sanitizeResources: false,
sanitizeOps: false,
});
Deno.test({
name: "LoginFrame - register mode renders confirm password input",
fn() {
mockFetch();
render();
assertEquals(
screen.getByPlaceholderText("Confirm your password") !== null,
true,
);
cleanup();
restoreFetch();
},
sanitizeResources: false,
sanitizeOps: false,
});
Deno.test({
name: "LoginFrame - register mode renders Register button",
fn() {
mockFetch();
render();
assertEquals(screen.getByText("Register").tagName, "BUTTON");
cleanup();
restoreFetch();
},
sanitizeResources: false,
sanitizeOps: false,
});
Deno.test({
name: "LoginFrame - register mode renders Go Login button",
fn() {
mockFetch();
render();
assertEquals(screen.getByText("Go Login").tagName, "BUTTON");
cleanup();
restoreFetch();
},
sanitizeResources: false,
sanitizeOps: false,
});
Deno.test({
name: "LoginFrame - submit with empty fields sets error state",
async fn() {
mockFetch();
mockLoading();
render();
await act(async () => {});
const submitBtn = screen.getByText("Sign in");
await act(async () => {
fireEvent.click(submitBtn);
});
// Check that error borders appear on empty inputs
const emailInput = screen.getByPlaceholderText("Your email");
const passwordInput = screen.getByPlaceholderText("Your password");
assertEquals(emailInput.className.includes("border-red-600"), true);
assertEquals(passwordInput.className.includes("border-red-600"), true);
cleanup();
restoreFetch();
restoreLoading();
},
sanitizeResources: false,
sanitizeOps: false,
});
Deno.test({
name: "LoginFrame - typing clears error state",
async fn() {
mockFetch();
mockLoading();
render();
await act(async () => {});
// Trigger error
await act(async () => {
fireEvent.click(screen.getByText("Sign in"));
});
const emailInput = screen.getByPlaceholderText("Your email");
assertEquals(emailInput.className.includes("border-red-600"), true);
// Type into the email input to clear error
await act(async () => {
fireEvent.input(emailInput, { target: { value: "test@email.com" } });
});
assertEquals(emailInput.className.includes("border-red-600"), false);
cleanup();
restoreFetch();
restoreLoading();
},
sanitizeResources: false,
sanitizeOps: false,
});