From e39f72f813783c459a60ee754785631b0fc02776 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Wed, 9 Oct 2024 12:09:36 +0200 Subject: [PATCH] implement permission too MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .changeset/thin-chairs-ring.md | 1 + .../components/catalog/EntityPage.test.tsx | 5 +- packages/test-utils/report.api.md | 56 +++++++++-- .../apis/PermissionApi/MockPermissionApi.ts | 1 + .../src/testUtils/apis/mockApis.test.tsx | 98 +++++++++++++++++++ .../test-utils/src/testUtils/apis/mockApis.ts | 42 ++++++++ .../DefaultApiExplorerPage.test.tsx | 4 +- .../components/AboutCard/AboutCard.test.tsx | 38 +++---- .../CatalogPage/DefaultCatalogPage.test.tsx | 3 +- .../EntityContextMenu.test.tsx | 6 +- .../UnregisterEntity.test.tsx | 6 +- .../EntityLayout/EntityLayout.test.tsx | 24 ++--- .../MembersList/MembersListCard.test.tsx | 20 ++-- .../src/hooks/usePermission.test.tsx | 28 +++--- .../TemplateCard/TemplateCard.test.tsx | 31 +++--- .../TemplateListPage.test.tsx | 15 +-- .../OngoingTask/OngoingTask.test.tsx | 11 +-- 17 files changed, 279 insertions(+), 110 deletions(-) diff --git a/.changeset/thin-chairs-ring.md b/.changeset/thin-chairs-ring.md index df388a7365..dc3c7a0a25 100644 --- a/.changeset/thin-chairs-ring.md +++ b/.changeset/thin-chairs-ring.md @@ -7,3 +7,4 @@ Added a `mockApis` export, which will replace the `MockX` API implementation cla - Deprecated `MockAnalyticsApi`, please use `mockApis.analytics` instead. - Deprecated `MockConfigApi`, please use `mockApis.config` instead. +- Deprecated `MockPermissionApi`, please use `mockApis.permission` instead. diff --git a/packages/app/src/components/catalog/EntityPage.test.tsx b/packages/app/src/components/catalog/EntityPage.test.tsx index 5d2b23b007..0943a82efb 100644 --- a/packages/app/src/components/catalog/EntityPage.test.tsx +++ b/packages/app/src/components/catalog/EntityPage.test.tsx @@ -22,7 +22,7 @@ import { } from '@backstage/plugin-catalog-react'; import { permissionApiRef } from '@backstage/plugin-permission-react'; import { - MockPermissionApi, + mockApis, renderInTestApp, TestApiProvider, } from '@backstage/test-utils'; @@ -46,7 +46,6 @@ describe('EntityPage Test', () => { }, }; - const mockPermissionApi = new MockPermissionApi(); const rootRouteRef = catalogPlugin.routes.catalogIndex; describe('cicdContent', () => { @@ -55,7 +54,7 @@ describe('EntityPage Test', () => { diff --git a/packages/test-utils/report.api.md b/packages/test-utils/report.api.md index f570aacde4..4f29b2cdc1 100644 --- a/packages/test-utils/report.api.md +++ b/packages/test-utils/report.api.md @@ -144,6 +144,36 @@ export namespace mockApis { partialImpl?: Partial | undefined, ) => ApiMock; } + // (undocumented) + export function permission(options?: { + authorize?: + | AuthorizeResult.ALLOW + | AuthorizeResult.DENY + | (( + request: EvaluatePermissionRequest, + ) => AuthorizeResult.ALLOW | AuthorizeResult.DENY); + }): jest.Mocked; + // (undocumented) + export namespace permission { + const // (undocumented) + factory: ( + options?: + | { + authorize?: + | AuthorizeResult.DENY + | AuthorizeResult.ALLOW + | (( + request: EvaluatePermissionRequest, + ) => AuthorizeResult.DENY | AuthorizeResult.ALLOW) + | undefined; + } + | undefined, + ) => ApiFactory; + const // (undocumented) + mock: ( + partialImpl?: Partial | undefined, + ) => ApiMock; + } } // @public @deprecated @@ -215,7 +245,9 @@ export interface MockFetchApiOptions { }; } -// @public +// Warning: (ae-unresolved-link) The @link reference could not be resolved: No member was found with name "permissions" +// +// @public @deprecated export class MockPermissionApi implements PermissionApi { constructor( requestHandler?: ( @@ -351,19 +383,23 @@ export function wrapInTestApp( // src/testUtils/apis/ErrorApi/MockErrorApi.d.ts:29:5 - (ae-undocumented) Missing documentation for "error$". // src/testUtils/apis/ErrorApi/MockErrorApi.d.ts:33:5 - (ae-undocumented) Missing documentation for "getErrors". // src/testUtils/apis/ErrorApi/MockErrorApi.d.ts:34:5 - (ae-undocumented) Missing documentation for "waitForError". -// src/testUtils/apis/PermissionApi/MockPermissionApi.d.ts:13:5 - (ae-undocumented) Missing documentation for "authorize". +// src/testUtils/apis/PermissionApi/MockPermissionApi.d.ts:14:5 - (ae-undocumented) Missing documentation for "authorize". // src/testUtils/apis/StorageApi/MockStorageApi.d.ts:19:5 - (ae-undocumented) Missing documentation for "create". // src/testUtils/apis/StorageApi/MockStorageApi.d.ts:20:5 - (ae-undocumented) Missing documentation for "forBucket". // src/testUtils/apis/StorageApi/MockStorageApi.d.ts:21:5 - (ae-undocumented) Missing documentation for "snapshot". // src/testUtils/apis/StorageApi/MockStorageApi.d.ts:22:5 - (ae-undocumented) Missing documentation for "set". // src/testUtils/apis/StorageApi/MockStorageApi.d.ts:23:5 - (ae-undocumented) Missing documentation for "remove". // src/testUtils/apis/StorageApi/MockStorageApi.d.ts:24:5 - (ae-undocumented) Missing documentation for "observe$". -// src/testUtils/apis/mockApis.d.ts:44:5 - (ae-undocumented) Missing documentation for "analytics". -// src/testUtils/apis/mockApis.d.ts:45:5 - (ae-undocumented) Missing documentation for "analytics". -// src/testUtils/apis/mockApis.d.ts:46:15 - (ae-undocumented) Missing documentation for "factory". -// src/testUtils/apis/mockApis.d.ts:47:15 - (ae-undocumented) Missing documentation for "mock". -// src/testUtils/apis/mockApis.d.ts:98:5 - (ae-undocumented) Missing documentation for "identity". -// src/testUtils/apis/mockApis.d.ts:106:5 - (ae-undocumented) Missing documentation for "identity". -// src/testUtils/apis/mockApis.d.ts:107:15 - (ae-undocumented) Missing documentation for "factory". -// src/testUtils/apis/mockApis.d.ts:115:15 - (ae-undocumented) Missing documentation for "mock". +// src/testUtils/apis/mockApis.d.ts:46:5 - (ae-undocumented) Missing documentation for "analytics". +// src/testUtils/apis/mockApis.d.ts:47:5 - (ae-undocumented) Missing documentation for "analytics". +// src/testUtils/apis/mockApis.d.ts:48:15 - (ae-undocumented) Missing documentation for "factory". +// src/testUtils/apis/mockApis.d.ts:49:15 - (ae-undocumented) Missing documentation for "mock". +// src/testUtils/apis/mockApis.d.ts:100:5 - (ae-undocumented) Missing documentation for "identity". +// src/testUtils/apis/mockApis.d.ts:108:5 - (ae-undocumented) Missing documentation for "identity". +// src/testUtils/apis/mockApis.d.ts:109:15 - (ae-undocumented) Missing documentation for "factory". +// src/testUtils/apis/mockApis.d.ts:117:15 - (ae-undocumented) Missing documentation for "mock". +// src/testUtils/apis/mockApis.d.ts:119:5 - (ae-undocumented) Missing documentation for "permission". +// src/testUtils/apis/mockApis.d.ts:122:5 - (ae-undocumented) Missing documentation for "permission". +// src/testUtils/apis/mockApis.d.ts:123:15 - (ae-undocumented) Missing documentation for "factory". +// src/testUtils/apis/mockApis.d.ts:126:15 - (ae-undocumented) Missing documentation for "mock". ``` diff --git a/packages/test-utils/src/testUtils/apis/PermissionApi/MockPermissionApi.ts b/packages/test-utils/src/testUtils/apis/PermissionApi/MockPermissionApi.ts index 163af5dd53..3e5e4c9875 100644 --- a/packages/test-utils/src/testUtils/apis/PermissionApi/MockPermissionApi.ts +++ b/packages/test-utils/src/testUtils/apis/PermissionApi/MockPermissionApi.ts @@ -26,6 +26,7 @@ import { * {@link @backstage/plugin-permission-react#PermissionApi}. Supply a * requestHandler function to override the mock result returned for a given * request. + * @deprecated Use {@link mockApis.permissions} instead * @public */ export class MockPermissionApi implements PermissionApi { diff --git a/packages/test-utils/src/testUtils/apis/mockApis.test.tsx b/packages/test-utils/src/testUtils/apis/mockApis.test.tsx index f9286897b4..f64aae9901 100644 --- a/packages/test-utils/src/testUtils/apis/mockApis.test.tsx +++ b/packages/test-utils/src/testUtils/apis/mockApis.test.tsx @@ -14,6 +14,10 @@ * limitations under the License. */ +import { + AuthorizeResult, + createPermission, +} from '@backstage/plugin-permission-common'; import { mockApis } from './mockApis'; describe('mockApis', () => { @@ -157,4 +161,98 @@ describe('mockApis', () => { expect(notEmpty.signOut).toHaveBeenCalledTimes(1); }); }); + + describe('permission', () => { + it('can create an instance and make assertions on it', async () => { + // default allow + const permission1 = mockApis.permission(); + await expect( + permission1.authorize({ + permission: createPermission({ + name: 'permission.1', + attributes: {}, + }), + }), + ).resolves.toEqual({ result: AuthorizeResult.ALLOW }); + expect(permission1.authorize).toHaveBeenCalledTimes(1); + + // static value + const permission2 = mockApis.permission({ + authorize: AuthorizeResult.DENY, + }); + await expect( + permission2.authorize({ + permission: createPermission({ + name: 'permission.1', + attributes: {}, + }), + }), + ).resolves.toEqual({ result: AuthorizeResult.DENY }); + expect(permission2.authorize).toHaveBeenCalledTimes(1); + + // callback form + const permission3 = mockApis.permission({ + authorize: req => + req.permission.name === 'permission.1' + ? AuthorizeResult.ALLOW + : AuthorizeResult.DENY, + }); + await expect( + permission3.authorize({ + permission: createPermission({ + name: 'permission.1', + attributes: {}, + }), + }), + ).resolves.toEqual({ result: AuthorizeResult.ALLOW }); + await expect( + permission3.authorize({ + permission: createPermission({ + name: 'permission.2', + attributes: {}, + }), + }), + ).resolves.toEqual({ result: AuthorizeResult.DENY }); + expect(permission3.authorize).toHaveBeenCalledTimes(2); + }); + + it('can create a mock and make assertions on it', async () => { + const empty = mockApis.permission.mock(); + expect( + empty.authorize({ + permission: createPermission({ + name: 'permission.1', + attributes: {}, + }), + }), + ).toBeUndefined(); + expect(empty.authorize).toHaveBeenCalledTimes(1); + + const notEmpty = mockApis.permission.mock({ + authorize: async req => ({ + result: + req.permission.name === 'permission.1' + ? AuthorizeResult.ALLOW + : AuthorizeResult.DENY, + }), + }); + await expect( + notEmpty.authorize({ + permission: createPermission({ + name: 'permission.1', + attributes: {}, + }), + }), + ).resolves.toEqual({ result: AuthorizeResult.ALLOW }); + await expect( + notEmpty.authorize({ + permission: createPermission({ + name: 'permission.2', + attributes: {}, + }), + }), + ).resolves.toEqual({ result: AuthorizeResult.DENY }); + expect(notEmpty.authorize).toHaveBeenCalledTimes(2); + }); + }); }); diff --git a/packages/test-utils/src/testUtils/apis/mockApis.ts b/packages/test-utils/src/testUtils/apis/mockApis.ts index e47ee4ec3e..7ed886d577 100644 --- a/packages/test-utils/src/testUtils/apis/mockApis.ts +++ b/packages/test-utils/src/testUtils/apis/mockApis.ts @@ -26,8 +26,17 @@ import { createApiFactory, identityApiRef, } from '@backstage/core-plugin-api'; +import { + AuthorizeResult, + EvaluatePermissionRequest, +} from '@backstage/plugin-permission-common'; +import { + PermissionApi, + permissionApiRef, +} from '@backstage/plugin-permission-react'; import { JsonObject } from '@backstage/types'; import { ApiMock } from './ApiMock'; +import { MockPermissionApi } from './PermissionApi'; /** @internal */ function simpleFactory( @@ -226,4 +235,37 @@ export namespace mockApis { export const factory = simpleFactory(identityApiRef, identity); export const mock = simpleMock(identityApiRef, identityMockSkeleton); } + + const permissionMockSkeleton = (): jest.Mocked => ({ + authorize: jest.fn(), + }); + export function permission(options?: { + authorize?: + | AuthorizeResult.ALLOW + | AuthorizeResult.DENY + | (( + request: EvaluatePermissionRequest, + ) => AuthorizeResult.ALLOW | AuthorizeResult.DENY); + }) { + const authorizeInput = options?.authorize; + let authorize: ( + request: EvaluatePermissionRequest, + ) => AuthorizeResult.ALLOW | AuthorizeResult.DENY; + if (authorizeInput === undefined) { + authorize = () => AuthorizeResult.ALLOW; + } else if (typeof authorizeInput === 'function') { + authorize = authorizeInput; + } else { + authorize = () => authorizeInput; + } + return simpleInstance( + permissionApiRef, + new MockPermissionApi(authorize), + permissionMockSkeleton, + ); + } + export namespace permission { + export const factory = simpleFactory(permissionApiRef, permission); + export const mock = simpleMock(permissionApiRef, permissionMockSkeleton); + } } diff --git a/plugins/api-docs/src/components/ApiExplorerPage/DefaultApiExplorerPage.test.tsx b/plugins/api-docs/src/components/ApiExplorerPage/DefaultApiExplorerPage.test.tsx index b8d8b07436..7847ac8336 100644 --- a/plugins/api-docs/src/components/ApiExplorerPage/DefaultApiExplorerPage.test.tsx +++ b/plugins/api-docs/src/components/ApiExplorerPage/DefaultApiExplorerPage.test.tsx @@ -28,7 +28,7 @@ import { } from '@backstage/plugin-catalog-react'; import { catalogApiMock } from '@backstage/plugin-catalog-react/testUtils'; import { - MockPermissionApi, + mockApis, MockStorageApi, TestApiProvider, renderInTestApp, @@ -96,7 +96,7 @@ describe('DefaultApiExplorerPage', () => { new DefaultStarredEntitiesApi({ storageApi }), ], [apiDocsConfigRef, apiDocsConfig], - [permissionApiRef, new MockPermissionApi()], + [permissionApiRef, mockApis.permission()], ]} > {children} diff --git a/plugins/catalog/src/components/AboutCard/AboutCard.test.tsx b/plugins/catalog/src/components/AboutCard/AboutCard.test.tsx index b175593b68..87f35bbc3e 100644 --- a/plugins/catalog/src/components/AboutCard/AboutCard.test.tsx +++ b/plugins/catalog/src/components/AboutCard/AboutCard.test.tsx @@ -24,7 +24,11 @@ import { ScmIntegrationsApi, scmIntegrationsApiRef, } from '@backstage/integration-react'; -import { TestApiProvider, renderInTestApp } from '@backstage/test-utils'; +import { + TestApiProvider, + mockApis, + renderInTestApp, +} from '@backstage/test-utils'; import { createFromTemplateRouteRef, viewTechDocRouteRef } from '../../routes'; import { AboutCard } from './AboutCard'; @@ -37,10 +41,6 @@ import { permissionApiRef } from '@backstage/plugin-permission-react'; import { AuthorizeResult } from '@backstage/plugin-permission-common'; import { SWRConfig } from 'swr'; -const mockAuthorize = jest.fn(); - -const mockPermissionApi = { authorize: mockAuthorize }; - describe('', () => { const catalogApi = catalogApiMock.mock(); @@ -411,10 +411,6 @@ describe('', () => { }, }; - mockAuthorize.mockImplementation(async () => ({ - result: AuthorizeResult.ALLOW, - })); - await renderInTestApp( ', () => { ScmIntegrationsApi.fromConfig(new ConfigReader({})), ], [catalogApiRef, catalogApi], - [permissionApiRef, mockPermissionApi], + [permissionApiRef, mockApis.permission()], ]} > @@ -466,10 +462,6 @@ describe('', () => { }, }; - mockAuthorize.mockImplementation(async () => ({ - result: AuthorizeResult.DENY, - })); - await renderInTestApp( ', () => { ScmIntegrationsApi.fromConfig(new ConfigReader({})), ], [catalogApiRef, catalogApi], - [permissionApiRef, mockPermissionApi], + [ + permissionApiRef, + mockApis.permission({ authorize: AuthorizeResult.DENY }), + ], ]} > @@ -766,9 +761,6 @@ describe('', () => { namespace: 'default', }, }; - mockAuthorize.mockImplementation(async () => ({ - result: AuthorizeResult.ALLOW, - })); await renderInTestApp( ', () => { ), ], [catalogApiRef, catalogApi], - [permissionApiRef, mockPermissionApi], + [permissionApiRef, mockApis.permission()], ]} > @@ -819,9 +811,6 @@ describe('', () => { namespace: 'default', }, }; - mockAuthorize.mockImplementation(async () => ({ - result: AuthorizeResult.DENY, - })); await renderInTestApp( new Map() }}> ', () => { ), ], [catalogApiRef, catalogApi], - [permissionApiRef, mockPermissionApi], + [ + permissionApiRef, + mockApis.permission({ authorize: AuthorizeResult.DENY }), + ], ]} > diff --git a/plugins/catalog/src/components/CatalogPage/DefaultCatalogPage.test.tsx b/plugins/catalog/src/components/CatalogPage/DefaultCatalogPage.test.tsx index a5ced77749..38310bbbf5 100644 --- a/plugins/catalog/src/components/CatalogPage/DefaultCatalogPage.test.tsx +++ b/plugins/catalog/src/components/CatalogPage/DefaultCatalogPage.test.tsx @@ -26,7 +26,6 @@ import { } from '@backstage/plugin-catalog-react'; import { mockBreakpoint } from '@backstage/core-components/testUtils'; import { - MockPermissionApi, MockStorageApi, TestApiProvider, mockApis, @@ -177,7 +176,7 @@ describe('DefaultCatalogPage', () => { [identityApiRef, identityApi], [storageApiRef, storageApi], [starredEntitiesApiRef, new MockStarredEntitiesApi()], - [permissionApiRef, new MockPermissionApi()], + [permissionApiRef, mockApis.permission()], ]} > {children} diff --git a/plugins/catalog/src/components/EntityContextMenu/EntityContextMenu.test.tsx b/plugins/catalog/src/components/EntityContextMenu/EntityContextMenu.test.tsx index f7220cb1ea..4725f35c86 100644 --- a/plugins/catalog/src/components/EntityContextMenu/EntityContextMenu.test.tsx +++ b/plugins/catalog/src/components/EntityContextMenu/EntityContextMenu.test.tsx @@ -17,7 +17,7 @@ import { EntityProvider } from '@backstage/plugin-catalog-react'; import { permissionApiRef } from '@backstage/plugin-permission-react'; import { - MockPermissionApi, + mockApis, renderInTestApp, TestApiProvider, } from '@backstage/test-utils'; @@ -26,11 +26,9 @@ import { fireEvent, screen } from '@testing-library/react'; import * as React from 'react'; import { EntityContextMenu } from './EntityContextMenu'; -const mockPermissionApi = new MockPermissionApi(); - function render(children: React.ReactNode) { return renderInTestApp( - + + { }, } as Entity; - const mockApis = TestApiRegistry.from( + const apis = TestApiRegistry.from( [catalogApiRef, catalogApiMock()], [alertApiRef, {} as AlertApi], [starredEntitiesApiRef, new MockStarredEntitiesApi()], - [permissionApiRef, new MockPermissionApi()], + [permissionApiRef, mockApis.permission()], ); it('renders simplest case', async () => { await renderInTestApp( - + @@ -93,7 +93,7 @@ describe('EntityLayout', () => { } as Entity; await renderInTestApp( - + @@ -117,7 +117,7 @@ describe('EntityLayout', () => { it('renders default error message when entity is not found', async () => { await renderInTestApp( - + @@ -142,7 +142,7 @@ describe('EntityLayout', () => { it('renders custom message when entity is not found', async () => { await renderInTestApp( - + Oppps.. Your entity was not found} @@ -171,7 +171,7 @@ describe('EntityLayout', () => { it('navigates when user clicks different tab', async () => { await renderInTestApp( - + @@ -211,7 +211,7 @@ describe('EntityLayout', () => { const shouldNotRenderTab = (e: Entity) => e.metadata.name === 'some-entity'; await renderInTestApp( - + @@ -254,7 +254,7 @@ describe('EntityLayout', () => { relations: [{ type: 'ownedBy', targetRef: mockTargetRef }], }; await renderInTestApp( - + @@ -327,7 +327,7 @@ describe('EntityLayout - CleanUpAfterRemoval', () => { [catalogApiRef, catalogApi], [alertApiRef, alertApi], [starredEntitiesApiRef, new MockStarredEntitiesApi()], - [permissionApiRef, new MockPermissionApi()], + [permissionApiRef, mockApis.permission()], ]} > @@ -378,7 +378,7 @@ describe('EntityLayout - CleanUpAfterRemoval', () => { [catalogApiRef, catalogApi], [alertApiRef, alertApi], [starredEntitiesApiRef, new MockStarredEntitiesApi()], - [permissionApiRef, new MockPermissionApi()], + [permissionApiRef, mockApis.permission()], ]} > diff --git a/plugins/org/src/components/Cards/Group/MembersList/MembersListCard.test.tsx b/plugins/org/src/components/Cards/Group/MembersList/MembersListCard.test.tsx index 6b8261e015..04de321c50 100644 --- a/plugins/org/src/components/Cards/Group/MembersList/MembersListCard.test.tsx +++ b/plugins/org/src/components/Cards/Group/MembersList/MembersListCard.test.tsx @@ -22,7 +22,11 @@ import { StarredEntitiesApi, starredEntitiesApiRef, } from '@backstage/plugin-catalog-react'; -import { renderInTestApp, TestApiProvider } from '@backstage/test-utils'; +import { + mockApis, + renderInTestApp, + TestApiProvider, +} from '@backstage/test-utils'; import React from 'react'; import { MembersListCard } from './MembersListCard'; import { @@ -184,7 +188,7 @@ describe('MemberTab Test', () => { apis={[ [catalogApiRef, mockedCatalogApiSupportingGroups], [starredEntitiesApiRef, mockedStarredEntitiesApi], - [permissionApiRef, {}], + [permissionApiRef, mockApis.permission()], ]} > @@ -212,7 +216,7 @@ describe('MemberTab Test', () => { apis={[ [catalogApiRef, mockedCatalogApiSupportingGroups], [starredEntitiesApiRef, mockedStarredEntitiesApi], - [permissionApiRef, {}], + [permissionApiRef, mockApis.permission()], ]} > @@ -238,7 +242,7 @@ describe('MemberTab Test', () => { apis={[ [catalogApiRef, mockedCatalogApiSupportingGroups], [starredEntitiesApiRef, mockedStarredEntitiesApi], - [permissionApiRef, {}], + [permissionApiRef, mockApis.permission()], ]} > @@ -273,7 +277,7 @@ describe('MemberTab Test', () => { apis={[ [catalogApiRef, mockedCatalogApiSupportingGroups], [starredEntitiesApiRef, mockedStarredEntitiesApi], - [permissionApiRef, {}], + [permissionApiRef, mockApis.permission()], ]} > @@ -308,7 +312,7 @@ describe('MemberTab Test', () => { apis={[ [catalogApiRef, mockedCatalogApiSupportingGroups], [starredEntitiesApiRef, mockedStarredEntitiesApi], - [permissionApiRef, {}], + [permissionApiRef, mockApis.permission()], ]} > @@ -366,7 +370,7 @@ describe('MemberTab Test', () => { apis={[ [catalogApiRef, mockedCatalogApiSupportingGroups], [starredEntitiesApiRef, mockedStarredEntitiesApi], - [permissionApiRef, {}], + [permissionApiRef, mockApis.permission()], ]} > @@ -406,7 +410,7 @@ describe('MemberTab Test', () => { apis={[ [catalogApiRef, mockedCatalogApiSupportingGroups], [starredEntitiesApiRef, mockedStarredEntitiesApi], - [permissionApiRef, {}], + [permissionApiRef, mockApis.permission()], ]} > diff --git a/plugins/permission-react/src/hooks/usePermission.test.tsx b/plugins/permission-react/src/hooks/usePermission.test.tsx index 1987382f47..e4a0c82eab 100644 --- a/plugins/permission-react/src/hooks/usePermission.test.tsx +++ b/plugins/permission-react/src/hooks/usePermission.test.tsx @@ -21,7 +21,7 @@ import { AuthorizeResult, createPermission, } from '@backstage/plugin-permission-common'; -import { TestApiProvider } from '@backstage/test-utils'; +import { TestApiProvider, mockApis } from '@backstage/test-utils'; import { PermissionApi, permissionApiRef } from '../apis'; import { SWRConfig } from 'swr'; @@ -52,36 +52,36 @@ function renderComponent(mockApi: PermissionApi) { } describe('usePermission', () => { - const mockPermissionApi = { authorize: jest.fn() }; - it('Returns loading when permissionApi has not yet responded.', () => { - mockPermissionApi.authorize.mockReturnValueOnce(new Promise(() => {})); + const permissionApi = mockApis.permission.mock({ + authorize: async () => new Promise(() => {}), + }); - const { getByText } = renderComponent(mockPermissionApi); + const { getByText } = renderComponent(permissionApi); - expect(mockPermissionApi.authorize).toHaveBeenCalledWith({ permission }); + expect(permissionApi.authorize).toHaveBeenCalledWith({ permission }); expect(getByText('loading')).toBeTruthy(); }); it('Returns allowed when permissionApi allows authorization.', async () => { - mockPermissionApi.authorize.mockResolvedValueOnce({ - result: AuthorizeResult.ALLOW, + const permissionApi = mockApis.permission({ + authorize: AuthorizeResult.ALLOW, }); - const { findByText } = renderComponent(mockPermissionApi); + const { findByText } = renderComponent(permissionApi); - expect(mockPermissionApi.authorize).toHaveBeenCalledWith({ permission }); + expect(permissionApi.authorize).toHaveBeenCalledWith({ permission }); expect(await findByText('content')).toBeTruthy(); }); it('Returns not allowed when permissionApi denies authorization.', async () => { - mockPermissionApi.authorize.mockResolvedValueOnce({ - result: AuthorizeResult.DENY, + const permissionApi = mockApis.permission({ + authorize: AuthorizeResult.DENY, }); - const { findByText } = renderComponent(mockPermissionApi); + const { findByText } = renderComponent(permissionApi); - expect(mockPermissionApi.authorize).toHaveBeenCalledWith({ permission }); + expect(permissionApi.authorize).toHaveBeenCalledWith({ permission }); await expect(findByText('content')).rejects.toThrow(); }); }); diff --git a/plugins/scaffolder-react/src/next/components/TemplateCard/TemplateCard.test.tsx b/plugins/scaffolder-react/src/next/components/TemplateCard/TemplateCard.test.tsx index febdc7c99e..5b2324b222 100644 --- a/plugins/scaffolder-react/src/next/components/TemplateCard/TemplateCard.test.tsx +++ b/plugins/scaffolder-react/src/next/components/TemplateCard/TemplateCard.test.tsx @@ -13,13 +13,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + import { DefaultStarredEntitiesApi } from '@backstage/plugin-catalog'; import { entityRouteRef, starredEntitiesApiRef, } from '@backstage/plugin-catalog-react'; import { - MockPermissionApi, + mockApis, MockStorageApi, renderInTestApp, TestApiProvider, @@ -54,7 +55,7 @@ describe('TemplateCard', () => { storageApi: MockStorageApi.create(), }), ], - [permissionApiRef, new MockPermissionApi()], + [permissionApiRef, mockApis.permission()], ]} > @@ -84,7 +85,7 @@ describe('TemplateCard', () => { storageApi: MockStorageApi.create(), }), ], - [permissionApiRef, new MockPermissionApi()], + [permissionApiRef, mockApis.permission()], ]} > @@ -116,7 +117,7 @@ describe('TemplateCard', () => { storageApi: MockStorageApi.create(), }), ], - [permissionApiRef, new MockPermissionApi()], + [permissionApiRef, mockApis.permission()], ]} > @@ -146,7 +147,7 @@ describe('TemplateCard', () => { storageApi: MockStorageApi.create(), }), ], - [permissionApiRef, new MockPermissionApi()], + [permissionApiRef, mockApis.permission()], ]} > @@ -182,7 +183,7 @@ describe('TemplateCard', () => { storageApi: MockStorageApi.create(), }), ], - [permissionApiRef, new MockPermissionApi()], + [permissionApiRef, mockApis.permission()], ]} > @@ -222,7 +223,7 @@ describe('TemplateCard', () => { storageApi: MockStorageApi.create(), }), ], - [permissionApiRef, new MockPermissionApi()], + [permissionApiRef, mockApis.permission()], ]} > @@ -267,7 +268,7 @@ describe('TemplateCard', () => { storageApi: MockStorageApi.create(), }), ], - [permissionApiRef, new MockPermissionApi()], + [permissionApiRef, mockApis.permission()], ]} > @@ -316,7 +317,7 @@ describe('TemplateCard', () => { storageApi: MockStorageApi.create(), }), ], - [permissionApiRef, new MockPermissionApi()], + [permissionApiRef, mockApis.permission()], ]} > @@ -359,7 +360,7 @@ describe('TemplateCard', () => { storageApi: MockStorageApi.create(), }), ], - [permissionApiRef, new MockPermissionApi()], + [permissionApiRef, mockApis.permission()], ]} > @@ -399,7 +400,7 @@ describe('TemplateCard', () => { storageApi: MockStorageApi.create(), }), ], - [permissionApiRef, new MockPermissionApi()], + [permissionApiRef, mockApis.permission()], ]} > @@ -428,9 +429,6 @@ describe('TemplateCard', () => { }, }; const mockOnSelected = jest.fn(); - const mockAuthorize = jest - .fn() - .mockImplementation(async () => ({ result: AuthorizeResult.DENY })); // SWR used by the usePermission hook needs cache to be reset for each test const { queryByText } = await renderInTestApp( new Map() }}> @@ -442,7 +440,10 @@ describe('TemplateCard', () => { storageApi: MockStorageApi.create(), }), ], - [permissionApiRef, new MockPermissionApi(mockAuthorize)], + [ + permissionApiRef, + mockApis.permission({ authorize: AuthorizeResult.DENY }), + ], ]} > diff --git a/plugins/scaffolder/src/alpha/components/TemplateListPage/TemplateListPage.test.tsx b/plugins/scaffolder/src/alpha/components/TemplateListPage/TemplateListPage.test.tsx index 6079ec2e1d..a02c90f687 100644 --- a/plugins/scaffolder/src/alpha/components/TemplateListPage/TemplateListPage.test.tsx +++ b/plugins/scaffolder/src/alpha/components/TemplateListPage/TemplateListPage.test.tsx @@ -25,6 +25,7 @@ import { MockStorageApi, renderInTestApp, TestApiProvider, + mockApis, } from '@backstage/test-utils'; import React from 'react'; import { rootRouteRef } from '../../../routes'; @@ -55,7 +56,7 @@ describe('TemplateListPage', () => { storageApi: MockStorageApi.create(), }), ], - [permissionApiRef, {}], + [permissionApiRef, mockApis.permission()], ]} > @@ -77,7 +78,7 @@ describe('TemplateListPage', () => { storageApi: MockStorageApi.create(), }), ], - [permissionApiRef, {}], + [permissionApiRef, mockApis.permission()], ]} > @@ -100,7 +101,7 @@ describe('TemplateListPage', () => { storageApi: MockStorageApi.create(), }), ], - [permissionApiRef, {}], + [permissionApiRef, mockApis.permission()], ]} > @@ -122,7 +123,7 @@ describe('TemplateListPage', () => { storageApi: MockStorageApi.create(), }), ], - [permissionApiRef, {}], + [permissionApiRef, mockApis.permission()], ]} > @@ -145,7 +146,7 @@ describe('TemplateListPage', () => { storageApi: MockStorageApi.create(), }), ], - [permissionApiRef, {}], + [permissionApiRef, mockApis.permission()], ]} > @@ -167,7 +168,7 @@ describe('TemplateListPage', () => { storageApi: MockStorageApi.create(), }), ], - [permissionApiRef, {}], + [permissionApiRef, mockApis.permission()], ]} > @@ -188,7 +189,7 @@ describe('TemplateListPage', () => { storageApi: MockStorageApi.create(), }), ], - [permissionApiRef, {}], + [permissionApiRef, mockApis.permission()], ]} > { @@ -146,10 +146,9 @@ describe('OngoingTask', () => { }); it('should have cancel and start over buttons be disabled without the proper permissions', async () => { - const mockAuthorize = jest - .fn() - .mockImplementation(async () => ({ result: AuthorizeResult.DENY })); - const permissionApi: PermissionApi = { authorize: mockAuthorize }; + const permissionApi = mockApis.permission({ + authorize: AuthorizeResult.DENY, + }); const rendered = await render(permissionApi); const { getByTestId } = rendered;