Use msw for mocking external Bitbucket apis
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
---
|
||||
'@backstage/plugin-scaffolder-backend': minor
|
||||
'@backstage/plugin-scaffolder-backend': patch
|
||||
---
|
||||
|
||||
Add scaffolding support for Bitbucket Cloud and Server.
|
||||
|
||||
@@ -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';
|
||||
|
||||
Reference in New Issue
Block a user