import { Mapper } from "../analyticsMapper";
import { fixtures } from "./fixtures";

jest.mock("@applicaster/zapp-react-native-utils/appUtils/contextKeysManager");

const AnalyticsMapper = new Mapper();

/**
 * Fixture Pair composed of expected input and expected output
 * first = input
 * second = output
 */
type Pair = {
  first: any;
  second: any;
};

// Test Runner
const setConfigRunMapTest = async (rules, events) => {
  AnalyticsMapper.setConfiguration(rules);

  return await Promise.all(
    events.map(async (pair: Pair) => {
      const result = await AnalyticsMapper.map(pair.first);
      expect(result).toEqual(pair.second || null);
    })
  );
};

describe("Analytics Mapper", () => {
  it("Returns event modified by regex rename rule", async () => {
    const rules = fixtures.eventRegexRules;

    await setConfigRunMapTest(rules, fixtures.eventRegexEvents);
  });

  it("Returns event modified by rename rule", async () => {
    const rules = fixtures.renameRules;

    await setConfigRunMapTest(rules, fixtures.renameEvents);
  });

  it("Returns event modified by ignore param rule", async () => {
    const rules = fixtures.ignoredParamsRules;

    await setConfigRunMapTest(rules, fixtures.ignoredParamsEvents);
  });

  it("Returns event modified by ignore event rule", async () => {
    const rules = fixtures.ignoredEventRules;

    await setConfigRunMapTest(rules, fixtures.ignoredEventEvents);
  });

  it("Returns event modified by context event rule", async () => {
    const rules = fixtures.contextRules;

    await setConfigRunMapTest(rules, fixtures.contextEvents);
  });

  it("Returns event modified by block unlisted event rule", async () => {
    const rules = fixtures.blockUnlistedEventRules;

    await setConfigRunMapTest(rules, fixtures.blockUnlistedEventEvents);
  });

  it("Returns event modified by block unlisted param rule", async () => {
    const rules = fixtures.blockUnlistedParamRules;

    await setConfigRunMapTest(rules, fixtures.blockUnlistedParamEvents);
  });

  it("Returns event modified by Analytics Custom Property", async () => {
    const rules = fixtures.ACPEventRules;
    await setConfigRunMapTest(rules, fixtures.ACPEventEvents);
  });
});
