import React from "react";
import { screen, render, act } from "@testing-library/react";
import { BasicTestUpload } from "./TestComponents";
import userEvent from "@testing-library/user-event";
test("It uploads a file correctly", async () => {
global.xhrOpen = jest.fn();
global.xhrSend = jest.fn();
render();
//loading is hidden
expect(screen.queryByText("loading")).toEqual(null);
//upload a file into the input
const file = new File(["hello"], "hello.png", { type: "image/png" });
userEvent.upload(screen.getByLabelText("upload"), file);
//loading is now shown
screen.getByText("loading");
await act(() => new Promise((resolve) => setTimeout(resolve, 0)));
expect(global.xhrOpen.mock.calls[0][0]).toEqual("POST");
expect(global.xhrOpen.mock.calls[0][1]).toEqual("github.gov");
//check the type sent to the server
expect(global.xhrSend.mock.calls[0][0].name).toEqual("hello.png");
expect(global.xhrSend.mock.calls[0][0].type).toEqual("image/png");
});
test("Renders done after upload is complete", async () => {
global.xhrListener = jest.fn();
render();
//upload a file into the input
const file = new File(["hello"], "hello.png", { type: "image/png" });
userEvent.upload(screen.getByLabelText("upload"), file);
//wait for the next tick
await act(() => new Promise((resolve) => setTimeout(resolve, 0)));
expect(global.xhrListener.mock.calls[1][0]).toEqual("load");
expect(screen.queryByText("done")).toEqual(null);
//call the load method on the xhr mock
act(() => global.xhrListener.mock.calls[1][1]());
expect(screen.getByText("done")).toBeTruthy();
});
test("Renders upload progress", async () => {
global.xhrListener = jest.fn();
render();
//upload a file into the input
const file = new File(["hello"], "hello.png", { type: "image/png" });
userEvent.upload(screen.getByLabelText("upload"), file);
//wait for the next tick
await act(() => new Promise((resolve) => setTimeout(resolve, 0)));
expect(global.xhrListener.mock.calls[0][0]).toEqual("progress");
expect(screen.queryByText("done")).toEqual(null);
//call the load method on the xhr mock
act(() => global.xhrListener.mock.calls[0][1]({ loaded: 20, total: 100 }));
expect(screen.getByText("loading")).toBeTruthy();
expect(screen.getByText("20% progress")).toBeTruthy();
});
test("Renders error message if xhr fails", async () => {
global.xhrListener = jest.fn();
render();
//upload a file into the input
const file = new File(["hello"], "hello.png", { type: "image/png" });
userEvent.upload(screen.getByLabelText("upload"), file);
//wait for the next tick
await act(() => new Promise((resolve) => setTimeout(resolve, 0)));
expect(global.xhrListener.mock.calls[2][0]).toEqual("error");
expect(screen.queryByText("bad error!")).toEqual(null);
//call the load method on the xhr mock
act(() => global.xhrListener.mock.calls[2][1]("bad error!"));
expect(screen.getByText("bad error!")).toBeTruthy();
});
test("Renders error message if xhr aborts", async () => {
global.xhrListener = jest.fn();
render();
//upload a file into the input
const file = new File(["hello"], "hello.png", { type: "image/png" });
userEvent.upload(screen.getByLabelText("upload"), file);
//wait for the next tick
await act(() => new Promise((resolve) => setTimeout(resolve, 0)));
expect(global.xhrListener.mock.calls[3][0]).toEqual("abort");
expect(screen.queryByText("bad abort!")).toEqual(null);
//call the load method on the xhr mock
act(() => global.xhrListener.mock.calls[3][1]("bad abort!"));
expect(screen.getByText("bad abort!")).toBeTruthy();
});
test("Skips upload if options return null", async () => {
let skipOptions = jest.fn();
render(
);
//upload a file into the input
const file = new File(["hello"], "hello.png", { type: "image/png" });
userEvent.upload(screen.getByLabelText("upload"), file);
//wait for the next tick
await act(() => new Promise((resolve) => setTimeout(resolve, 0)));
expect(skipOptions.mock.calls.length).toEqual(1);
});