import * as DataModels from "../Contracts/DataModels";
import { userContext } from "../UserContext";
import { DefaultExperienceUtility } from "./DefaultExperienceUtility";

describe("Default Experience Utility", () => {
  describe("getDefaultExperienceFromApiKind()", () => {
    function runScenario(apiKind: number, expectedExperience: typeof userContext.apiType): void {
      const resolvedExperience = DefaultExperienceUtility.getDefaultExperienceFromApiKind(apiKind);
      expect(resolvedExperience).toEqual(expectedExperience);
    }

    describe("On SQL", () => {
      it("should return SQL", () => runScenario(DataModels.ApiKind.SQL, "SQL"));
    });

    describe("On MongoDB", () => {
      it("should return MongoDB", () => runScenario(DataModels.ApiKind.MongoDB, "Mongo"));
    });

    describe("On Table", () => {
      it("should return Table", () => runScenario(DataModels.ApiKind.Table, "Tables"));
    });

    describe("On Cassandra", () => {
      it("should return Cassandra", () => runScenario(DataModels.ApiKind.Cassandra, "Cassandra"));
    });

    describe("On Graph", () => {
      it("should return Graph", () => runScenario(DataModels.ApiKind.Graph, "Gremlin"));
    });

    describe("On unknown", () => {
      it("should return Default", () => runScenario(-1, "SQL"));
    });
  });

  describe("getApiKindFromDefaultExperience()", () => {
    function runScenario(defaultExperience: typeof userContext.apiType | null, expectedApiKind: number): void {
      const resolvedApiKind = DefaultExperienceUtility.getApiKindFromDefaultExperience(defaultExperience);
      expect(resolvedApiKind).toEqual(expectedApiKind);
    }

    describe("On SQL", () => {
      it("should return SQL", () => runScenario("SQL", DataModels.ApiKind.SQL));
    });

    describe("On MongoDB", () => {
      it("should return MongoDB", () => runScenario("Mongo", DataModels.ApiKind.MongoDB));
    });

    describe("On Table", () => {
      it("should return Table", () => runScenario("Tables", DataModels.ApiKind.Table));
    });

    describe("On Cassandra", () => {
      it("should return Cassandra", () => runScenario("Cassandra", DataModels.ApiKind.Cassandra));
    });

    describe("On Graph", () => {
      it("should return Graph", () => runScenario("Gremlin", DataModels.ApiKind.Graph));
    });

    describe("On null", () => {
      it("should return SQL", () => runScenario(null, DataModels.ApiKind.SQL));
    });
  });
});
