Use msw for mocking external Bitbucket apis

This commit is contained in:
Mathias Åhsberg
2021-01-04 14:57:07 +00:00
parent 2c7ff367e4
commit 082f1703f4
8 changed files with 66 additions and 46 deletions
+1 -1
View File
@@ -1,5 +1,5 @@
---
'@backstage/plugin-scaffolder-backend': minor
'@backstage/plugin-scaffolder-backend': patch
---
Add scaffolding support for Bitbucket Cloud and Server.
+3 -1
View File
@@ -59,12 +59,14 @@
},
"devDependencies": {
"@backstage/cli": "^0.4.3",
"@backstage/test-utils": "^0.1.5",
"@octokit/types": "^5.4.1",
"@types/fs-extra": "^9.0.1",
"@types/git-url-parse": "^9.0.0",
"@types/supertest": "^2.0.8",
"supertest": "^4.0.2",
"yaml": "^1.10.0"
"yaml": "^1.10.0",
"msw": "^0.21.2"
},
"files": [
"dist",
@@ -44,7 +44,7 @@ describe('BitbucketPreparer', () => {
metadata: {
annotations: {
[LOCATION_ANNOTATION]:
'bitbucket/api:https://bitbucket.org/backstage-project/backstage-repo',
'bitbucket:https://bitbucket.org/backstage-project/backstage-repo',
},
name: 'graphql-starter',
title: 'GraphQL Service',
@@ -42,7 +42,7 @@ export class BitbucketPreparer implements PreparerBase {
const workingDirectory = opts?.workingDirectory ?? os.tmpdir();
const { logger } = opts;
if (!['bitbucket/api', 'url'].includes(protocol)) {
if (!['bitbucket', 'url'].includes(protocol)) {
throw new InputError(
`Wrong location protocol: ${protocol}, should be 'url'`,
);
@@ -86,7 +86,7 @@ export class Preparers implements PreparerBuilder {
preparers.register('gitlab', gitlabPreparer);
preparers.register('gitlab/api', gitlabPreparer);
preparers.register('azure/api', azurePreparer);
preparers.register('bitbucket/api', bitbucketPreparer);
preparers.register('bitbucket', bitbucketPreparer);
const githubConfig = config.getOptionalConfig('scaffolder.github');
if (githubConfig) {
@@ -14,44 +14,55 @@
* limitations under the License.
*/
const mockResponse = jest.fn();
jest.mock('./helpers');
jest.mock('cross-fetch', () => mockResponse);
import { BitbucketPublisher } from './bitbucket';
import { initRepoAndPush } from './helpers';
import { getVoidLogger } from '@backstage/backend-common';
import { rest } from 'msw';
import { setupServer } from 'msw/node';
import { msw } from '@backstage/test-utils';
describe('Bitbucket Publisher', () => {
const logger = getVoidLogger();
const server = setupServer();
msw.setupDefaultHandlers(server);
beforeEach(() => {
jest.clearAllMocks();
});
describe('publish: createRemoteInBitbucketCloud', () => {
it('should create repo in bitbucket cloud', async () => {
server.use(
rest.post(
'https://api.bitbucket.org/2.0/repositories/project/repo',
(_, res, ctx) =>
res(
ctx.status(200),
ctx.set('Content-Type', 'application/json'),
ctx.json({
links: {
html: {
href: 'https://bitbucket.org/project/repo',
},
clone: [
{
name: 'https',
href: 'https://bitbucket.org/project/repo',
},
],
},
}),
),
),
);
const publisher = new BitbucketPublisher(
'https://bitbucket.org',
'fake-user',
'fake-token',
);
mockResponse.mockResolvedValue({
status: 200,
json: () =>
Promise.resolve({
links: {
html: {
href: 'https://bitbucket.org/project/repo',
},
clone: [
{
name: 'https',
href: 'https://bitbucket.org/project/repo',
},
],
},
}),
});
const result = await publisher.publish({
values: {
@@ -78,31 +89,38 @@ describe('Bitbucket Publisher', () => {
});
describe('publish: createRemoteInBitbucketServer', () => {
it('should create repo in bitbucket server', async () => {
server.use(
rest.post(
'https://bitbucket.mycompany.com/rest/api/1.0/projects/project/repos',
(_, res, ctx) =>
res(
ctx.status(201),
ctx.set('Content-Type', 'application/json'),
ctx.json({
links: {
self: [
{
href:
'https://bitbucket.mycompany.com/projects/project/repos/repo',
},
],
clone: [
{
name: 'http',
href: 'https://bitbucket.mycompany.com/scm/project/repo',
},
],
},
}),
),
),
);
const publisher = new BitbucketPublisher(
'https://bitbucket.mycompany.com',
'fake-user',
'fake-token',
);
mockResponse.mockResolvedValue({
status: 201,
json: () =>
Promise.resolve({
links: {
self: [
{
href:
'https://bitbucket.mycompany.com/projects/project/repos/repo',
},
],
clone: [
{
name: 'http',
href: 'https://bitbucket.mycompany.com/scm/project/repo',
},
],
},
}),
});
const result = await publisher.publish({
values: {
@@ -178,7 +178,7 @@ export class Publishers implements PublisherBuilder {
bitbucketUsername,
bitbucketToken,
);
publishers.register('bitbucket/api', bitbucketPublisher);
publishers.register('bitbucket', bitbucketPublisher);
} catch (e) {
const providerName = 'bitbucket';
if (process.env.NODE_ENV !== 'development') {
@@ -19,4 +19,4 @@ export type RemoteProtocol =
| 'gitlab'
| 'gitlab/api'
| 'azure/api'
| 'bitbucket/api';
| 'bitbucket';