// file.only
/* eslint-disable global-require */
jest.mock("./stepDefinitionPath.js", () => () => "stepDefinitionPath");
jest.mock("glob", () => ({
  sync(pattern) {
    return pattern;
  },
}));

let getConfig;

describe("getStepDefinitionsPaths", () => {
  beforeEach(() => {
    jest.resetModules();
    ({ getConfig } = require("./getConfig"));
    jest.unmock("path");
    jest.mock("./getConfig");
  });
  it("should return the default common folder", () => {
    getConfig.mockReturnValue({
      nonGlobalStepDefinitions: true,
    });

    const { getStepDefinitionsPaths } = require("./getStepDefinitionsPaths");

    const actual = getStepDefinitionsPaths("/path");
    const expected = "stepDefinitionPath/common/**/*.+(js|ts|tsx)";
    expect(actual).to.include(expected);
  });

  it("should return the common folder defined by the developer", () => {
    jest.spyOn(process, "cwd").mockImplementation(() => "/cwd/");

    getConfig.mockReturnValue({
      nonGlobalStepDefinitions: true,
      commonPath: "myPath/",
    });

    const { getStepDefinitionsPaths } = require("./getStepDefinitionsPaths");

    const actual = getStepDefinitionsPaths("/path");
    const expected = "/cwd/myPath/**/*.+(js|ts|tsx)";
    expect(actual).to.include(expected);
  });
  it("should return the default non global step definition pattern", () => {
    getConfig.mockReturnValue({
      nonGlobalStepDefinitions: true,
    });
    // eslint-disable-next-line global-require
    const { getStepDefinitionsPaths } = require("./getStepDefinitionsPaths");
    const path = "stepDefinitionPath/test.feature";
    const actual = getStepDefinitionsPaths(path);
    const expected = "stepDefinitionPath/test/**/*.+(js|ts|tsx)";

    expect(actual).to.include(expected);
  });

  describe("nonGlobalStepBaseDir is defined", () => {
    const path = "stepDefinitionPath/test.feature";
    const config = {
      nonGlobalStepDefinitions: true,
      nonGlobalStepBaseDir: "nonGlobalStepBaseDir",
    };

    beforeEach(() => {
      jest.spyOn(process, "cwd").mockImplementation(() => "cwd");
    });

    it("should return the overriden non global step definition pattern and default common folder", () => {
      getConfig.mockReturnValue(config);

      const { getStepDefinitionsPaths } = require("./getStepDefinitionsPaths");
      const actual = getStepDefinitionsPaths(path);

      const expectedNonGlobalDefinitionPattern =
        "cwd/nonGlobalStepBaseDir/test/**/*.+(js|ts|tsx)";
      const expectedCommonPath =
        "cwd/nonGlobalStepBaseDir/common/**/*.+(js|ts|tsx)";

      expect(actual).to.include(expectedNonGlobalDefinitionPattern);
      expect(actual).to.include(expectedCommonPath);
      expect(actual).to.not.include(
        "stepDefinitionPath/test/**/*.+(js|ts|tsx)"
      );
    });

    it("should return common folder defined by the dev and based on nonGlobalStepBaseDir", () => {
      getConfig.mockReturnValue({ ...config, commonPath: "commonPath/" });

      const { getStepDefinitionsPaths } = require("./getStepDefinitionsPaths");
      const actual = getStepDefinitionsPaths(path);

      const expectedCommonPath =
        "cwd/nonGlobalStepBaseDir/commonPath/**/*.+(js|ts|tsx)";

      expect(actual).to.include(expectedCommonPath);
    });
  });
});
