import { OfferResponse } from "@azure/cosmos";
import { Offer, SDKOfferDefinition } from "../Contracts/DataModels";
import * as OfferUtility from "./OfferUtility";

describe("parseSDKOfferResponse", () => {
  it("manual throughput", () => {
    const mockOfferDefinition = {
      content: {
        offerThroughput: 500,
        collectionThroughputInfo: {
          minimumRUForCollection: 400,
          numPhysicalPartitions: 1,
        },
      },
      id: "test",
    } as SDKOfferDefinition;

    const mockResponse = {
      resource: mockOfferDefinition,
    } as OfferResponse;

    const expectedResult: Offer = {
      manualThroughput: 500,
      autoscaleMaxThroughput: undefined,
      minimumThroughput: 400,
      id: "test",
      offerDefinition: mockOfferDefinition,
      offerReplacePending: false,
    };

    expect(OfferUtility.parseSDKOfferResponse(mockResponse)).toEqual(expectedResult);
  });

  it("offerContent not defined", () => {
    const mockOfferDefinition = {
      id: "test",
    } as SDKOfferDefinition;

    const mockResponse = {
      resource: mockOfferDefinition,
    } as OfferResponse;

    expect(OfferUtility.parseSDKOfferResponse(mockResponse)).toEqual(undefined);
  });

  it("offerDefinition is null", () => {
    const mockResponse = {
      resource: undefined,
    } as OfferResponse;

    expect(OfferUtility.parseSDKOfferResponse(mockResponse)).toEqual(undefined);
  });

  it("autoscale throughput", () => {
    const mockOfferDefinition = {
      content: {
        offerThroughput: 400,
        collectionThroughputInfo: {
          minimumRUForCollection: 400,
          numPhysicalPartitions: 1,
        },
        offerAutopilotSettings: {
          maxThroughput: 5000,
        },
      },
      id: "test",
    } as SDKOfferDefinition;

    const mockResponse = {
      resource: mockOfferDefinition,
    } as OfferResponse;

    const expectedResult: Offer = {
      manualThroughput: undefined,
      autoscaleMaxThroughput: 5000,
      minimumThroughput: 400,
      id: "test",
      offerDefinition: mockOfferDefinition,
      offerReplacePending: false,
    };

    expect(OfferUtility.parseSDKOfferResponse(mockResponse)).toEqual(expectedResult);
  });
});
