Skip to content

Commit

Permalink
Stub octokit and npm publish + add tests
Browse files Browse the repository at this point in the history
  • Loading branch information
webpro committed Jan 3, 2019
1 parent 93b1fe5 commit 29b2bcc
Show file tree
Hide file tree
Showing 4 changed files with 228 additions and 134 deletions.
51 changes: 31 additions & 20 deletions test/github-client.js
Expand Up @@ -2,13 +2,16 @@ const path = require('path');
const test = require('tape');
const sinon = require('sinon');
const proxyquire = require('proxyquire');
const sh = require('shelljs');
const GitHubApi = require('./mock/github');
const GitHubApi = require('@octokit/rest');
const githubRequestMock = require('./mock/github.request');

const GitHubApiStub = sinon.stub().returns(new GitHubApi());
const githubRequestStub = sinon.stub().callsFake(githubRequestMock);
const githubApi = new GitHubApi();
githubApi.hook.wrap('request', githubRequestStub);
const GithubApiStub = sinon.stub().returns(githubApi);

const GitHub = proxyquire('../lib/github-client', {
'@octokit/rest': GitHubApiStub
'@octokit/rest': GithubApiStub
});

test('validate', async t => {
Expand All @@ -18,7 +21,6 @@ test('validate', async t => {
t.throws(() => github.validate(), /Environment variable "MY_GITHUB_TOKEN" is required for GitHub releases/);
process.env[tokenRef] = '123';
t.doesNotThrow(() => github.validate());
GitHubApiStub.resetHistory();
t.end();
});

Expand All @@ -29,6 +31,7 @@ test('release + uploadAssets', async t => {
const tagName = 'v${version}';

const github = new GitHub({
release: true,
remoteUrl,
tagName,
assets: path.resolve('test/resources', asset)
Expand All @@ -43,23 +46,31 @@ test('release + uploadAssets', async t => {

const [uploadResult] = await github.uploadAssets();

t.equal(uploadResult.name, asset);
t.equal(uploadResult.state, 'uploaded');
t.equal(uploadResult.browser_download_url, `${remoteUrl}/releases/download/v${version}/${asset}`);

t.equal(GitHubApiStub.callCount, 1);
t.deepEqual(GitHubApiStub.firstCall.args[0], {
t.equal(GithubApiStub.callCount, 1);
t.deepEqual(GithubApiStub.firstCall.args[0], {
version: '3.0.0',
url: 'https://api.github.com',
timeout: 0,
headers: { 'user-agent': 'webpro/release-it' }
});

GitHubApiStub.resetHistory();
t.equal(githubRequestStub.callCount, 2);
t.equal(githubRequestStub.firstCall.lastArg.owner, 'webpro');
t.equal(githubRequestStub.firstCall.lastArg.repo, 'release-it-test');
t.equal(githubRequestStub.firstCall.lastArg.tag_name, 'v2.0.1');
t.equal(githubRequestStub.firstCall.lastArg.name, 'Release 2.0.1');
t.equal(githubRequestStub.secondCall.lastArg.name, 'file1');

t.equal(uploadResult.name, asset);
t.equal(uploadResult.state, 'uploaded');
t.equal(uploadResult.browser_download_url, `${remoteUrl}/releases/download/v${version}/${asset}`);

GithubApiStub.resetHistory();
githubRequestStub.resetHistory();
t.end();
});

test('release + uploadAssets (enterprise)', async t => {
test('release (enterprise)', async t => {
const github = new GitHub({
remoteUrl: 'https://github.my-GHE-enabled-company.com/user/repo'
});
Expand All @@ -68,14 +79,14 @@ test('release + uploadAssets (enterprise)', async t => {
version: '1'
});

t.equal(GitHubApiStub.callCount, 1);
t.equal(GitHubApiStub.firstCall.args[0].url, 'https://github.my-GHE-enabled-company.com/api/v3');
t.equal(GithubApiStub.callCount, 1);
t.equal(GithubApiStub.firstCall.args[0].url, 'https://github.my-GHE-enabled-company.com/api/v3');

GitHubApiStub.resetHistory();
GithubApiStub.resetHistory();
t.end();
});

test('release + uploadAssets (override host)', async t => {
test('release (override host)', async t => {
const github = new GitHub({
remoteUrl: 'https://github.my-GHE-enabled-company.com/user/repo',
host: 'my-custom-host.org'
Expand All @@ -85,9 +96,9 @@ test('release + uploadAssets (override host)', async t => {
version: '1'
});

t.equal(GitHubApiStub.callCount, 1);
t.equal(GitHubApiStub.firstCall.args[0].url, 'https://my-custom-host.org/api/v3');
t.equal(GithubApiStub.callCount, 1);
t.equal(GithubApiStub.firstCall.args[0].url, 'https://my-custom-host.org/api/v3');

GitHubApiStub.resetHistory();
GithubApiStub.resetHistory();
t.end();
});
103 changes: 0 additions & 103 deletions test/mock/github.js

This file was deleted.

44 changes: 44 additions & 0 deletions test/mock/github.request.js
@@ -0,0 +1,44 @@
const uuid = require('uuid/v4');
const releases = {};

module.exports = (request, options) => {
const { url } = options;
if (url === '/repos/:owner/:repo/releases') {
const id = uuid();
const { tag_name, name, body, prerelease, draft, owner, repo } = options;
releases[id] = {
id,
tag_name,
name,
body,
prerelease,
draft,
upload_url: `https://uploads.github.com/repos/${owner}/${repo}/releases/${id}/assets{?name,label}`,
html_url: `https://github.com/${owner}/${repo}/releases/tag/${tag_name}`
};
return {
data: releases[id],
headers: {
location: `https://api.github.com/repos/${owner}/${repo}/releases/${id}`
}
};
} else if (url.startsWith('https://uploads.github.com/repos')) {
const assetId = uuid();
const { name } = options;
const [, owner, repo, id] = url.match(/\/repos\/([^/]+)\/([^/]+)\/releases\/([^/]+).*/);
const { tag_name } = releases[id];
return {
data: {
id: assetId,
url: `https://api.github.com/repos/${owner}/${repo}/releases/assets/${assetId}`,
name,
label: '',
state: 'uploaded',
size: options.headers['content-length'],
browser_download_url: `https://github.com/${owner}/${repo}/releases/download/${tag_name}/${name}`
}
};
} else {
return {};
}
};

0 comments on commit 29b2bcc

Please sign in to comment.