create_snippet_patch.test.ts 2.4 KB
Newer Older
T
Tomas Vik 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
import * as vscode from 'vscode';
import { createSnippetPatch } from './create_snippet_patch';
import { WrappedRepository } from '../git/wrapped_repository';
import { project } from '../test_utils/entities';
import { gitExtensionWrapper } from '../git/git_extension_wrapper';
import { asMock } from '../test_utils/as_mock';
import { createSnippet } from '../gitlab_service';
import { openUrl } from '../openers';

jest.mock('../git/git_extension_wrapper');
jest.mock('../gitlab_service');
jest.mock('../openers');

const SNIPPET_URL = 'https://gitlab.com/test-group/test-project/-/snippets/2146265';
const DIFF_OUTPUT = 'diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml';

describe('create snippet patch', () => {
  let wrappedRepository: WrappedRepository;

  beforeEach(() => {
    const mockRepository: Partial<WrappedRepository> = {
      lastCommitSha: 'abcd1234567',
      getTrackingBranchName: async () => 'tracking-branch-name',
      getProject: async () => project,
      diff: async () => DIFF_OUTPUT,
    };
    wrappedRepository = mockRepository as WrappedRepository;
    asMock(gitExtensionWrapper.getActiveRepositoryOrSelectOne).mockResolvedValue(wrappedRepository);
    asMock(vscode.window.showInputBox).mockResolvedValue('snippet_name');
    asMock(vscode.window.showQuickPick).mockImplementation(options =>
      options.filter((o: any) => o.type === 'private').pop(),
    );
    asMock(createSnippet).mockResolvedValue({
      web_url: SNIPPET_URL,
    });
  });

  afterEach(() => {
    jest.resetAllMocks();
  });

  it('creates a snippet patch and opens it in a browser', async () => {
    await createSnippetPatch();
    expect(openUrl).toHaveBeenCalledWith(SNIPPET_URL);
  });

  describe('populating the create snippet request', () => {
    let formData: Record<string, string>;
    beforeEach(async () => {
      await createSnippetPatch();
      [[, formData]] = asMock(createSnippet).mock.calls;
    });

    it('prepends "patch: " to the user input to create snippet title', () => {
      expect(formData.title).toBe('patch: snippet_name');
    });

    it('appends ".patch" to the user input to create snippet file name', () => {
      expect(formData.file_name).toBe('snippet_name.patch');
    });

    it("sets user's choice of visibility (private selected in test setup)", () => {
      expect(formData.visibility).toBe('private');
    });

    it('sets the diff command output as the blob content', () => {
      expect(formData.content).toBe(DIFF_OUTPUT);
    });
  });
});