From d50a02bf7d4c1c3c019a407e6462c1416b6375de Mon Sep 17 00:00:00 2001 From: bnechyporenko Date: Sun, 18 Feb 2024 13:43:00 +0100 Subject: [PATCH] Introducing createMockActionContext for scaffolder Signed-off-by: bnechyporenko --- packages/scaffolder-test-utils/.eslintrc.js | 1 + packages/scaffolder-test-utils/CHANGELOG.md | 1 + packages/scaffolder-test-utils/README.md | 12 +++++ packages/scaffolder-test-utils/api-report.md | 18 +++++++ .../scaffolder-test-utils/catalog-info.yaml | 9 ++++ packages/scaffolder-test-utils/knip-report.md | 2 + packages/scaffolder-test-utils/package.json | 48 +++++++++++++++++++ .../src/actions/index.ts | 17 +++++++ .../src/actions/mockActionConext.ts | 46 ++++++++++++++++++ packages/scaffolder-test-utils/src/index.ts | 17 +++++++ .../package.json | 3 +- .../src/actions/azure.test.ts | 17 ++----- yarn.lock | 18 +++++++ 13 files changed, 196 insertions(+), 13 deletions(-) create mode 100644 packages/scaffolder-test-utils/.eslintrc.js create mode 100644 packages/scaffolder-test-utils/CHANGELOG.md create mode 100644 packages/scaffolder-test-utils/README.md create mode 100644 packages/scaffolder-test-utils/api-report.md create mode 100644 packages/scaffolder-test-utils/catalog-info.yaml create mode 100644 packages/scaffolder-test-utils/knip-report.md create mode 100644 packages/scaffolder-test-utils/package.json create mode 100644 packages/scaffolder-test-utils/src/actions/index.ts create mode 100644 packages/scaffolder-test-utils/src/actions/mockActionConext.ts create mode 100644 packages/scaffolder-test-utils/src/index.ts diff --git a/packages/scaffolder-test-utils/.eslintrc.js b/packages/scaffolder-test-utils/.eslintrc.js new file mode 100644 index 0000000000..e2a53a6ad2 --- /dev/null +++ b/packages/scaffolder-test-utils/.eslintrc.js @@ -0,0 +1 @@ +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); diff --git a/packages/scaffolder-test-utils/CHANGELOG.md b/packages/scaffolder-test-utils/CHANGELOG.md new file mode 100644 index 0000000000..e290a56ced --- /dev/null +++ b/packages/scaffolder-test-utils/CHANGELOG.md @@ -0,0 +1 @@ +# @backstage/scaffolder-test-utils diff --git a/packages/scaffolder-test-utils/README.md b/packages/scaffolder-test-utils/README.md new file mode 100644 index 0000000000..e5810058b3 --- /dev/null +++ b/packages/scaffolder-test-utils/README.md @@ -0,0 +1,12 @@ +# @backstage/scaffolder-test-utils + +Contains utilities that can be used when testing scaffolder features. + +## Installation + +Install the package via Yarn into your own packages: + +```sh +cd # if within a monorepo +yarn add --dev @backstage/scaffolder-test-utils +``` diff --git a/packages/scaffolder-test-utils/api-report.md b/packages/scaffolder-test-utils/api-report.md new file mode 100644 index 0000000000..b95b020f1c --- /dev/null +++ b/packages/scaffolder-test-utils/api-report.md @@ -0,0 +1,18 @@ +## API Report File for "@backstage/scaffolder-test-utils" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts +import { ActionContext } from '@backstage/plugin-scaffolder-node'; +import { JsonObject } from '@backstage/types'; + +// @public +export const createMockActionContext: < + TActionInput extends JsonObject = JsonObject, + TActionOutput extends JsonObject = JsonObject, +>( + input?: TActionInput | undefined, +) => ActionContext; + +// (No @packageDocumentation comment for this package) +``` diff --git a/packages/scaffolder-test-utils/catalog-info.yaml b/packages/scaffolder-test-utils/catalog-info.yaml new file mode 100644 index 0000000000..596e9b1f64 --- /dev/null +++ b/packages/scaffolder-test-utils/catalog-info.yaml @@ -0,0 +1,9 @@ +apiVersion: backstage.io/v1alpha1 +kind: Component +metadata: + name: backstage-scaffolder-test-utils + title: '@backstage/scaffolder-test-utils' +spec: + lifecycle: experimental + type: backstage-node-library + owner: maintainers diff --git a/packages/scaffolder-test-utils/knip-report.md b/packages/scaffolder-test-utils/knip-report.md new file mode 100644 index 0000000000..2661c35327 --- /dev/null +++ b/packages/scaffolder-test-utils/knip-report.md @@ -0,0 +1,2 @@ +# Knip report + diff --git a/packages/scaffolder-test-utils/package.json b/packages/scaffolder-test-utils/package.json new file mode 100644 index 0000000000..9db983d828 --- /dev/null +++ b/packages/scaffolder-test-utils/package.json @@ -0,0 +1,48 @@ +{ + "name": "@backstage/scaffolder-test-utils", + "version": "0.0.1", + "main": "src/index.ts", + "types": "src/index.ts", + "license": "Apache-2.0", + "publishConfig": { + "access": "public", + "main": "dist/index.esm.js", + "types": "dist/index.d.ts" + }, + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "packages/scaffolder-test-utils" + }, + "backstage": { + "role": "node-library" + }, + "sideEffects": false, + "scripts": { + "start": "backstage-cli package start", + "build": "backstage-cli package build", + "lint": "backstage-cli package lint", + "test": "backstage-cli package test", + "clean": "backstage-cli package clean", + "prepack": "backstage-cli package prepack", + "postpack": "backstage-cli package postpack" + }, + "devDependencies": { + "@backstage/cli": "workspace:^", + "@testing-library/jest-dom": "^6.0.0", + "@types/react": "*" + }, + "files": [ + "dist" + ], + "dependencies": { + "@backstage/backend-common": "workspace:^", + "@backstage/backend-test-utils": "workspace:^", + "@backstage/plugin-scaffolder-node": "workspace:^", + "@backstage/test-utils": "workspace:^", + "@backstage/types": "workspace:^" + }, + "peerDependencies": { + "@types/jest": "*" + } +} diff --git a/packages/scaffolder-test-utils/src/actions/index.ts b/packages/scaffolder-test-utils/src/actions/index.ts new file mode 100644 index 0000000000..161bae8521 --- /dev/null +++ b/packages/scaffolder-test-utils/src/actions/index.ts @@ -0,0 +1,17 @@ +/* + * Copyright 2020 The Backstage Authors + * + * 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. + */ + +export { createMockActionContext } from './mockActionConext'; diff --git a/packages/scaffolder-test-utils/src/actions/mockActionConext.ts b/packages/scaffolder-test-utils/src/actions/mockActionConext.ts new file mode 100644 index 0000000000..a838c091f8 --- /dev/null +++ b/packages/scaffolder-test-utils/src/actions/mockActionConext.ts @@ -0,0 +1,46 @@ +/* + * Copyright 2023 The Backstage Authors + * + * 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. + */ + +import { PassThrough } from 'stream'; +import { getVoidLogger } from '@backstage/backend-common'; +import { createMockDirectory } from '@backstage/backend-test-utils'; +import { JsonObject } from '@backstage/types'; +import { ActionContext } from '@backstage/plugin-scaffolder-node'; + +/** + * A utility method to create a mock action context for scaffolder actions. + * + * @param input - a schema for user input parameters + * + * @public + */ +export const createMockActionContext = < + TActionInput extends JsonObject = JsonObject, + TActionOutput extends JsonObject = JsonObject, +>( + input?: TActionInput, +): ActionContext => { + const mockDir = createMockDirectory(); + + return { + workspacePath: mockDir.path, + logger: getVoidLogger(), + logStream: new PassThrough(), + output: jest.fn(), + createTemporaryDirectory: jest.fn(), + input: (input ? input : {}) as TActionInput, + }; +}; diff --git a/packages/scaffolder-test-utils/src/index.ts b/packages/scaffolder-test-utils/src/index.ts new file mode 100644 index 0000000000..19eae8d569 --- /dev/null +++ b/packages/scaffolder-test-utils/src/index.ts @@ -0,0 +1,17 @@ +/* + * Copyright 2020 The Backstage Authors + * + * 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. + */ + +export * from './actions'; diff --git a/plugins/scaffolder-backend-module-azure/package.json b/plugins/scaffolder-backend-module-azure/package.json index 26be04f108..2bbcedf897 100644 --- a/plugins/scaffolder-backend-module-azure/package.json +++ b/plugins/scaffolder-backend-module-azure/package.json @@ -47,7 +47,8 @@ "yaml": "^2.0.0" }, "devDependencies": { - "@backstage/cli": "workspace:^" + "@backstage/cli": "workspace:^", + "@backstage/scaffolder-test-utils": "workspace:^" }, "files": [ "dist" diff --git a/plugins/scaffolder-backend-module-azure/src/actions/azure.test.ts b/plugins/scaffolder-backend-module-azure/src/actions/azure.test.ts index 4401e01007..0dbacaf699 100644 --- a/plugins/scaffolder-backend-module-azure/src/actions/azure.test.ts +++ b/plugins/scaffolder-backend-module-azure/src/actions/azure.test.ts @@ -34,10 +34,9 @@ jest.mock('@backstage/plugin-scaffolder-node', () => { import { createPublishAzureAction } from './azure'; import { ScmIntegrations } from '@backstage/integration'; import { ConfigReader } from '@backstage/config'; -import { getVoidLogger } from '@backstage/backend-common'; import { WebApi } from 'azure-devops-node-api'; -import { PassThrough } from 'stream'; import { initRepoAndPush } from '@backstage/plugin-scaffolder-node'; +import { createMockActionContext } from '@backstage/scaffolder-test-utils'; describe('publish:azure', () => { const config = new ConfigReader({ @@ -54,16 +53,10 @@ describe('publish:azure', () => { const integrations = ScmIntegrations.fromConfig(config); const action = createPublishAzureAction({ integrations, config }); - const mockContext = { - input: { - repoUrl: 'dev.azure.com?repo=repo&owner=owner&organization=org', - }, - workspacePath: 'lol', - logger: getVoidLogger(), - logStream: new PassThrough(), - output: jest.fn(), - createTemporaryDirectory: jest.fn(), - }; + + const mockContext = createMockActionContext({ + repoUrl: 'dev.azure.com?repo=repo&owner=owner&organization=org', + }); const mockGitClient = { createRepository: jest.fn(), diff --git a/yarn.lock b/yarn.lock index 3b404940a9..f6a737a69f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8209,6 +8209,7 @@ __metadata: "@backstage/errors": "workspace:^" "@backstage/integration": "workspace:^" "@backstage/plugin-scaffolder-node": "workspace:^" + "@backstage/scaffolder-test-utils": "workspace:^" azure-devops-node-api: ^12.0.0 yaml: ^2.0.0 languageName: unknown @@ -9864,6 +9865,23 @@ __metadata: languageName: unknown linkType: soft +"@backstage/scaffolder-test-utils@workspace:^, @backstage/scaffolder-test-utils@workspace:packages/scaffolder-test-utils": + version: 0.0.0-use.local + resolution: "@backstage/scaffolder-test-utils@workspace:packages/scaffolder-test-utils" + dependencies: + "@backstage/backend-common": "workspace:^" + "@backstage/backend-test-utils": "workspace:^" + "@backstage/cli": "workspace:^" + "@backstage/plugin-scaffolder-node": "workspace:^" + "@backstage/test-utils": "workspace:^" + "@backstage/types": "workspace:^" + "@testing-library/jest-dom": ^6.0.0 + "@types/react": "*" + peerDependencies: + "@types/jest": "*" + languageName: unknown + linkType: soft + "@backstage/test-utils@workspace:^, @backstage/test-utils@workspace:packages/test-utils": version: 0.0.0-use.local resolution: "@backstage/test-utils@workspace:packages/test-utils"