import GitClientFactory from "@bp/service/git/git-client-factory";
import { GitPullRequest, GitClientType } from "@bp/service/git/git.types";
import GitHubClient from "@bp/service/git/github/github-client";
import { MERGED_PR_FIXTURE, REPO, TARGET_OWNER } from "../../../support/mock/github-data";
import { mockGitHubClient } from "../../../support/mock/git-client-mock-support";

describe("github service", () => {

  let gitClient: GitHubClient;

  beforeAll(() => {
    // init git service
    GitClientFactory.reset();
    GitClientFactory.getOrCreate(GitClientType.GITHUB, "whatever", "http://localhost/api/v3");
  });

  beforeEach(() => {
    // mock github api calls
    mockGitHubClient("http://localhost/api/v3");

    gitClient = GitClientFactory.getClient() as GitHubClient;
  });

  test("get pull request: success", async () => {
    const res: GitPullRequest = await gitClient.getPullRequest(TARGET_OWNER, REPO, MERGED_PR_FIXTURE.number);
    expect(res.sourceRepo).toEqual({
      owner: "fork",
      project: "reponame",
      cloneUrl: "https://github.com/fork/reponame.git"
    });
    expect(res.targetRepo).toEqual({
      owner: "owner",
      project: "reponame",
      cloneUrl: "https://github.com/owner/reponame.git"
    });
    expect(res.title).toBe("PR Title");
    expect(res.commits!.length).toBe(1);
    expect(res.commits).toEqual(["28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc"]);
  });

});