import {
  resourceExists,
  resourceRedirectsToSecureLogin,
} from "../checkResource";

import Href from "../../../models/href/Href";

const mockXMLHttpRequest = () => {
  const mock = {
    open: jest.fn(),
    addEventListener: jest.fn(),
    setRequestHeader: jest.fn(),
    send: jest.fn(),
    getResponseHeader: jest.fn(),

    upload: {
      addEventListener: jest.fn(),
    },
  };

  jest.spyOn(global, "XMLHttpRequest").mockImplementation(() => mock);

  return mock;
};

describe("checkResource", () => {
  it("indicates a resource exists if it has a status code other then 404", () => {
    const mock = mockXMLHttpRequest();
    mock.status = 200;

    const exists = resourceExists("/");
    expect(exists).toBe(true);

    const hrefExists = resourceExists(new Href("/caseview"));
    expect(hrefExists).toBe(true);
  });

  it("indicates a resource does not exists if it has a status code of 404", () => {
    const mock = mockXMLHttpRequest();
    mock.status = 404;

    const exists = resourceExists("/");
    expect(exists).toBe(false);

    const hrefExists = resourceExists(new Href("/caseview"));
    expect(hrefExists).toBe(false);
  });

  it("indicates resource request redirects to secureLogin", () => {
    const mock = mockXMLHttpRequest();
    mock.responseURL = "/BeInformed/secureLogin";
    mock.status = 400;

    const toLogin = resourceRedirectsToSecureLogin("/");
    expect(toLogin).toBe(true);

    const hrefToLogin = resourceExists(new Href("/caseview"));
    expect(hrefToLogin).toBe(true);
  });
});
