insert_snippet.test.js 2.8 KB
Newer Older
1 2 3 4
const assert = require('assert');
const sinon = require('sinon');
const vscode = require('vscode');
const simpleGit = require('simple-git');
5
const { graphql } = require('msw');
6 7
const { insertSnippet } = require('../../src/commands/insert_snippet');
const { tokenService } = require('../../src/services/token_service');
8 9
const snippetsResponse = require('./fixtures/graphql/snippets.json');
const { getServer, createTextEndpoint } = require('./test_infrastructure/mock_server');
10
const { GITLAB_URL, REMOTE } = require('./test_infrastructure/constants');
11 12 13 14
const {
  createAndOpenFile,
  closeAndDeleteFile,
  simulateQuickPickChoice,
15
  getRepositoryRoot,
16
  updateRepositoryStatus,
17 18 19 20 21 22 23
} = require('./test_infrastructure/helpers');

describe('Insert snippet', async () => {
  let server;
  let testFileUri;
  const sandbox = sinon.createSandbox();

24
  before(async () => {
25 26 27 28 29 30
    server = getServer([
      createTextEndpoint(
        '/projects/278964/snippets/111/files/master/test.js/raw',
        'snippet content',
      ),
      createTextEndpoint(
31
        '/projects/278964/snippets/222/files/main/test2.js/raw',
32 33 34 35 36 37 38 39
        'second blob content',
      ),
      graphql.query('GetSnippets', (req, res, ctx) => {
        if (req.variables.projectPath === 'gitlab-org/gitlab')
          return res(ctx.data(snippetsResponse));
        return res(ctx.data({ project: null }));
      }),
    ]);
40
    await tokenService.setToken(GITLAB_URL, 'abcd-secret');
41 42 43 44
  });

  beforeEach(async () => {
    server.resetHandlers();
45
    testFileUri = vscode.Uri.parse(`${getRepositoryRoot()}/newfile.js`);
46 47 48 49
    await createAndOpenFile(testFileUri);
  });

  afterEach(async () => {
50
    const git = simpleGit(getRepositoryRoot());
51 52 53 54 55 56
    await git.removeRemote(REMOTE.NAME);
    await git.addRemote(REMOTE.NAME, REMOTE.URL);
    sandbox.restore();
    await closeAndDeleteFile(testFileUri);
  });

57
  after(async () => {
58
    server.close();
59
    await tokenService.setToken(GITLAB_URL, undefined);
60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
  });

  it('inserts snippet when there is only one blob', async () => {
    simulateQuickPickChoice(sandbox, 0);
    await insertSnippet();

    assert.strictEqual(vscode.window.activeTextEditor.document.getText(), 'snippet content');
  });

  it('inserts snippet when there are multiple blobs', async () => {
    simulateQuickPickChoice(sandbox, 1);
    await insertSnippet();

    assert.strictEqual(vscode.window.activeTextEditor.document.getText(), 'second blob content');
  });

  it('throws an error when it cannot find GitLab project', async () => {
77
    const git = simpleGit(getRepositoryRoot());
78 79
    await git.removeRemote(REMOTE.NAME);
    await git.addRemote(REMOTE.NAME, 'git@test.gitlab.com:gitlab-org/nonexistent.git');
80
    await updateRepositoryStatus();
81 82 83
    await assert.rejects(insertSnippet(), /Project gitlab-org\/nonexistent was not found./);
  });
});