tests: added some more tests for the github publish action

Signed-off-by: Johan Haals <johan.haals@gmail.com>
This commit is contained in:
blam
2021-02-25 16:58:32 +01:00
committed by Johan Haals
parent ebab16aa30
commit c630401572
2 changed files with 211 additions and 2 deletions
@@ -0,0 +1,204 @@
/*
* Copyright 2020 Spotify AB
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
jest.mock('../../../stages/publish/helpers');
jest.mock('@octokit/rest');
import { createPublishGithubAction } from './github';
import { ScmIntegrations } from '@backstage/integration';
import { ConfigReader } from '@backstage/config';
import { getVoidLogger } from '@backstage/backend-common';
import { PassThrough } from 'stream';
import { initRepoAndPush } from '../../../stages/publish/helpers';
describe('Github Publish Action', () => {
const integrations = ScmIntegrations.fromConfig(
new ConfigReader({
integrations: {
github: [
{ host: 'github.com', token: 'tokenlols' },
{ host: 'ghe.github.com' },
],
},
}),
);
const action = createPublishGithubAction({ integrations });
const mockContext = {
input: {
repoUrl: 'github.com?repo=repo&owner=owner',
description: 'description',
repoVisibility: 'private',
},
workspacePath: 'lol',
logger: getVoidLogger(),
logStream: new PassThrough(),
output: jest.fn(),
createTemporaryDirectory: jest.fn(),
};
const { mockGithubClient } = require('@octokit/rest');
beforeEach(() => {
jest.restoreAllMocks();
});
it('should throw an error when the repoUrl is not well formed', async () => {
await expect(
action.handler({
...mockContext,
input: { repoUrl: 'github.com?repo=bob' },
}),
).rejects.toThrow(/missing owner/);
await expect(
action.handler({
...mockContext,
input: { repoUrl: 'github.com?owner=owner' },
}),
).rejects.toThrow(/missing repo/);
});
it('should throw if there is no integration config provided', async () => {
await expect(
action.handler({
...mockContext,
input: { repoUrl: 'missing.com?repo=bob&owner=owner' },
}),
).rejects.toThrow(/No matching integration configuration/);
});
it('should throw if there is no token in the integration config that is returned', async () => {
await expect(
action.handler({
...mockContext,
input: {
repoUrl: 'ghe.github.com?repo=bob&owner=owner',
},
}),
).rejects.toThrow(/No token available for host/);
});
it('should call the githubApis with the correct values for createInOrg', async () => {
mockGithubClient.users.getByUsername.mockResolvedValue({
data: { type: 'Organization' },
});
mockGithubClient.repos.createInOrg.mockResolvedValue({ data: {} });
await action.handler(mockContext);
expect(mockGithubClient.repos.createInOrg).toHaveBeenCalledWith({
description: 'description',
name: 'repo',
org: 'owner',
private: true,
visibility: 'private',
});
await action.handler({
...mockContext,
input: {
...mockContext.input,
repoVisibility: 'public',
},
});
expect(mockGithubClient.repos.createInOrg).toHaveBeenCalledWith({
description: 'description',
name: 'repo',
org: 'owner',
private: false,
visibility: 'public',
});
});
it('should call the githubApis with the correct values for createForAuthenticatedUser', async () => {
mockGithubClient.users.getByUsername.mockResolvedValue({
data: { type: 'User' },
});
mockGithubClient.repos.createForAuthenticatedUser.mockResolvedValue({
data: {},
});
await action.handler(mockContext);
expect(
mockGithubClient.repos.createForAuthenticatedUser,
).toHaveBeenCalledWith({
description: 'description',
name: 'repo',
private: true,
});
await action.handler({
...mockContext,
input: {
...mockContext.input,
repoVisibility: 'public',
},
});
expect(
mockGithubClient.repos.createForAuthenticatedUser,
).toHaveBeenCalledWith({
description: 'description',
name: 'repo',
private: false,
});
});
it('should call initRepoAndPush with the correct values', async () => {
mockGithubClient.users.getByUsername.mockResolvedValue({
data: { type: 'User' },
});
mockGithubClient.repos.createForAuthenticatedUser.mockResolvedValue({
data: {
clone_url: 'https://github.com/clone/url.git',
html_url: 'https://github.com/html/url',
},
});
await action.handler(mockContext);
expect(initRepoAndPush).toHaveBeenCalledWith({
dir: mockContext.workspacePath,
remoteUrl: 'https://github.com/clone/url.git',
auth: { username: 'x-access-token', password: 'tokenlols' },
logger: mockContext.logger,
});
});
it('should call output with the remoteUrl and the repoContentsUrl', async () => {
mockGithubClient.users.getByUsername.mockResolvedValue({
data: { type: 'User' },
});
mockGithubClient.repos.createForAuthenticatedUser.mockResolvedValue({
data: {
clone_url: 'https://github.com/clone/url.git',
html_url: 'https://github.com/html/url',
},
});
await action.handler(mockContext);
expect(mockContext.output).toHaveBeenCalledWith(
'remoteUrl',
'https://github.com/clone/url.git',
);
expect(mockContext.output).toHaveBeenCalledWith(
'repoContentsUrl',
'https://github.com/html/url/blob/master',
);
});
});
@@ -82,7 +82,12 @@ export function createPublishGithubAction(options: {
},
},
async handler(ctx) {
const { repoUrl, description, access, repoVisibility } = ctx.input;
const {
repoUrl,
description,
access,
repoVisibility = 'private',
} = ctx.input;
const { owner, repo, host } = parseRepoUrl(repoUrl);
@@ -150,7 +155,7 @@ export function createPublishGithubAction(options: {
}
const remoteUrl = data.clone_url;
const repoContentsUrl = `${data?.html_url}/blob/master`;
const repoContentsUrl = `${data.html_url}/blob/master`;
await initRepoAndPush({
dir: ctx.workspacePath,