import type { RequestInstance } from "request";
import { getProgressValue, getRequestEta } from "request";

export const testProgressSpy = (props: {
  spy: () => void;
  requestId: string;
  request: RequestInstance;
  startTimestamp: number;
  progressTimestamp?: number;
  total?: number;
  loaded?: number;
  timeLeft?: number;
}) => {
  const { spy, requestId, request, startTimestamp, total, loaded, timeLeft, progressTimestamp } = props;

  const totalValue = total ?? 1;
  const loadedValue = loaded ?? 0;

  const estimatedTime = getRequestEta(new Date(startTimestamp), new Date(progressTimestamp || startTimestamp), {
    total: totalValue,
    loaded: loadedValue,
  }).timeLeft;
  const timeToSend = loadedValue ? estimatedTime : null;

  expect(spy).toHaveBeenCalledTimes(1);
  expect(spy).toHaveBeenCalledWith({
    request,
    requestId,
    loaded: loadedValue,
    progress: getProgressValue({ total: totalValue, loaded: loadedValue }),
    sizeLeft: totalValue - loadedValue,
    startTimestamp,
    timeLeft: timeLeft ?? timeToSend,
    total: totalValue,
  });
};
