import { describe, expect, it } from "vitest";
import { paragraphs, safeHref, safeImageUrl } from "../block-data";

describe("safeHref", () => {
  it("keeps in-page anchors and root-relative paths", () => {
    expect(safeHref("#products")).toBe("#products");
    expect(safeHref("/about")).toBe("/about");
  });

  it("keeps http, https, mailto and tel URLs", () => {
    expect(safeHref("https://example.com/x")).toBe("https://example.com/x");
    expect(safeHref("http://example.com")).toBe("http://example.com");
    expect(safeHref("mailto:hi@example.com")).toBe("mailto:hi@example.com");
    expect(safeHref("tel:+15555550123")).toBe("tel:+15555550123");
  });

  it("drops javascript: and data: URLs a seller could paste in", () => {
    expect(safeHref("javascript:alert(1)")).toBeNull();
    expect(safeHref("JavaScript:alert(1)")).toBeNull();
    expect(safeHref("data:text/html,<script>alert(1)</script>")).toBeNull();
    expect(safeHref("vbscript:msgbox(1)")).toBeNull();
  });

  it("treats blank input as absent", () => {
    expect(safeHref("")).toBeNull();
    expect(safeHref("   ")).toBeNull();
    expect(safeHref(null)).toBeNull();
  });
});

describe("safeImageUrl", () => {
  it("only accepts absolute http(s) URLs", () => {
    expect(safeImageUrl("https://cdn.test/a.jpg")).toBe("https://cdn.test/a.jpg");
    expect(safeImageUrl("/local.jpg")).toBeNull();
    expect(safeImageUrl("javascript:alert(1)")).toBeNull();
    expect(safeImageUrl(null)).toBeNull();
  });
});

describe("paragraphs", () => {
  it("splits on blank lines and drops empties", () => {
    expect(paragraphs("One\n\nTwo\n\n\nThree")).toEqual(["One", "Two", "Three"]);
  });

  it("keeps single newlines inside a paragraph", () => {
    expect(paragraphs("Line one\nLine two")).toEqual(["Line one\nLine two"]);
  });

  it("returns nothing for empty input", () => {
    expect(paragraphs(null)).toEqual([]);
    expect(paragraphs("   ")).toEqual([]);
  });
});
