// Mock html2canvas before importing the module
const mockToDataURL = jest.fn();
const mockCanvas = {
toDataURL: mockToDataURL,
width: 100,
height: 100,
};
jest.mock("html2canvas", () => {
return jest.fn().mockResolvedValue(mockCanvas);
});
import html2canvas from "html2canvas";
const RNViewShotWeb = require("../RNViewShot.web")
.default as typeof import("../RNViewShot.web").default;
describe("RNViewShot.web", () => {
const mockElement = document.createElement("div");
beforeEach(() => {
jest.clearAllMocks();
mockToDataURL.mockReturnValue("data:image/png;base64,iVBOR...");
});
describe("captureRef", () => {
it("calls html2canvas with useCORS: true", async () => {
await RNViewShotWeb.captureRef(mockElement, {
format: "png",
quality: 1,
result: "data-uri",
});
expect(html2canvas).toHaveBeenCalledWith(mockElement, {
useCORS: true,
});
});
it("returns data-uri when result is data-uri", async () => {
mockToDataURL.mockReturnValue("data:image/png;base64,abc123");
const result = await RNViewShotWeb.captureRef(mockElement, {
format: "png",
quality: 1,
result: "data-uri",
});
expect(result).toBe("data:image/png;base64,abc123");
});
it("returns raw base64 when result is base64", async () => {
mockToDataURL.mockReturnValue("data:image/png;base64,abc123");
const result = await RNViewShotWeb.captureRef(mockElement, {
format: "png",
quality: 1,
result: "base64",
});
expect(result).toBe("abc123");
});
it("maps jpg format to image/jpeg MIME type", async () => {
await RNViewShotWeb.captureRef(mockElement, {
format: "jpg",
quality: 0.8,
result: "data-uri",
});
expect(mockToDataURL).toHaveBeenCalledWith("image/jpeg", 0.8);
});
it("uses image/png for png format", async () => {
await RNViewShotWeb.captureRef(mockElement, {
format: "png",
quality: 1,
result: "data-uri",
});
expect(mockToDataURL).toHaveBeenCalledWith("image/png", 1);
});
it("passes quality to toDataURL", async () => {
await RNViewShotWeb.captureRef(mockElement, {
format: "jpg",
quality: 0.5,
result: "data-uri",
});
expect(mockToDataURL).toHaveBeenCalledWith("image/jpeg", 0.5);
});
it("returns data-uri for tmpfile result (with warning)", async () => {
const warnSpy = jest.spyOn(console, "warn").mockImplementation();
mockToDataURL.mockReturnValue("data:image/png;base64,abc123");
const result = await RNViewShotWeb.captureRef(mockElement, {
format: "png",
quality: 1,
result: "tmpfile",
});
expect(result).toBe("data:image/png;base64,abc123");
expect(warnSpy).toHaveBeenCalledWith(
expect.stringContaining("Tmpfile is not implemented"),
);
warnSpy.mockRestore();
});
it("resizes canvas when width and height are provided", async () => {
const mockContext = {
drawImage: jest.fn(),
};
const spy = jest.spyOn(document, "createElement").mockReturnValueOnce({
getContext: () => mockContext,
width: 0,
height: 0,
toDataURL: mockToDataURL,
} as any);
await RNViewShotWeb.captureRef(mockElement, {
format: "png",
quality: 1,
result: "data-uri",
width: 200,
height: 300,
});
expect(mockContext.drawImage).toHaveBeenCalledWith(
mockCanvas,
0,
0,
200,
300,
);
spy.mockRestore();
});
});
describe("captureScreen", () => {
it("captures document.body", async () => {
await RNViewShotWeb.captureScreen({
format: "png",
quality: 1,
result: "data-uri",
});
expect(html2canvas).toHaveBeenCalledWith(document.body, {
useCORS: true,
});
});
});
describe("releaseCapture", () => {
it("is a no-op on web (does not throw)", () => {
expect(() => RNViewShotWeb.releaseCapture("test")).not.toThrow();
});
});
});