implement permission too

Signed-off-by: Fredrik Adelöw <freben@gmail.com>
This commit is contained in:
Fredrik Adelöw
2024-10-09 12:09:36 +02:00
parent b52715bc2e
commit e39f72f813
17 changed files with 279 additions and 110 deletions
+1
View File
@@ -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.
@@ -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', () => {
<TestApiProvider
apis={[
[starredEntitiesApiRef, new MockStarredEntitiesApi()],
[permissionApiRef, mockPermissionApi],
[permissionApiRef, mockApis.permission()],
]}
>
<EntityProvider entity={entity}>
+46 -10
View File
@@ -144,6 +144,36 @@ export namespace mockApis {
partialImpl?: Partial<IdentityApi> | undefined,
) => ApiMock<IdentityApi>;
}
// (undocumented)
export function permission(options?: {
authorize?:
| AuthorizeResult.ALLOW
| AuthorizeResult.DENY
| ((
request: EvaluatePermissionRequest,
) => AuthorizeResult.ALLOW | AuthorizeResult.DENY);
}): jest.Mocked<PermissionApi>;
// (undocumented)
export namespace permission {
const // (undocumented)
factory: (
options?:
| {
authorize?:
| AuthorizeResult.DENY
| AuthorizeResult.ALLOW
| ((
request: EvaluatePermissionRequest,
) => AuthorizeResult.DENY | AuthorizeResult.ALLOW)
| undefined;
}
| undefined,
) => ApiFactory<PermissionApi, PermissionApi, {}>;
const // (undocumented)
mock: (
partialImpl?: Partial<PermissionApi> | undefined,
) => ApiMock<PermissionApi>;
}
}
// @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".
```
@@ -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 {
@@ -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);
});
});
});
@@ -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<TApi, TArgs extends unknown[]>(
@@ -226,4 +235,37 @@ export namespace mockApis {
export const factory = simpleFactory(identityApiRef, identity);
export const mock = simpleMock(identityApiRef, identityMockSkeleton);
}
const permissionMockSkeleton = (): jest.Mocked<PermissionApi> => ({
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);
}
}
@@ -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}
@@ -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('<AboutCard />', () => {
const catalogApi = catalogApiMock.mock();
@@ -411,10 +411,6 @@ describe('<AboutCard />', () => {
},
};
mockAuthorize.mockImplementation(async () => ({
result: AuthorizeResult.ALLOW,
}));
await renderInTestApp(
<TestApiProvider
apis={[
@@ -423,7 +419,7 @@ describe('<AboutCard />', () => {
ScmIntegrationsApi.fromConfig(new ConfigReader({})),
],
[catalogApiRef, catalogApi],
[permissionApiRef, mockPermissionApi],
[permissionApiRef, mockApis.permission()],
]}
>
<EntityProvider entity={entity}>
@@ -466,10 +462,6 @@ describe('<AboutCard />', () => {
},
};
mockAuthorize.mockImplementation(async () => ({
result: AuthorizeResult.DENY,
}));
await renderInTestApp(
<TestApiProvider
apis={[
@@ -478,7 +470,10 @@ describe('<AboutCard />', () => {
ScmIntegrationsApi.fromConfig(new ConfigReader({})),
],
[catalogApiRef, catalogApi],
[permissionApiRef, mockPermissionApi],
[
permissionApiRef,
mockApis.permission({ authorize: AuthorizeResult.DENY }),
],
]}
>
<EntityProvider entity={entity}>
@@ -766,9 +761,6 @@ describe('<AboutCard />', () => {
namespace: 'default',
},
};
mockAuthorize.mockImplementation(async () => ({
result: AuthorizeResult.ALLOW,
}));
await renderInTestApp(
<TestApiProvider
apis={[
@@ -788,7 +780,7 @@ describe('<AboutCard />', () => {
),
],
[catalogApiRef, catalogApi],
[permissionApiRef, mockPermissionApi],
[permissionApiRef, mockApis.permission()],
]}
>
<EntityProvider entity={entity}>
@@ -819,9 +811,6 @@ describe('<AboutCard />', () => {
namespace: 'default',
},
};
mockAuthorize.mockImplementation(async () => ({
result: AuthorizeResult.DENY,
}));
await renderInTestApp(
<SWRConfig value={{ provider: () => new Map() }}>
<TestApiProvider
@@ -842,7 +831,10 @@ describe('<AboutCard />', () => {
),
],
[catalogApiRef, catalogApi],
[permissionApiRef, mockPermissionApi],
[
permissionApiRef,
mockApis.permission({ authorize: AuthorizeResult.DENY }),
],
]}
>
<EntityProvider entity={entity}>
@@ -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}
@@ -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(
<TestApiProvider apis={[[permissionApiRef, mockPermissionApi]]}>
<TestApiProvider apis={[[permissionApiRef, mockApis.permission()]]}>
<EntityProvider
entity={{ apiVersion: 'a', kind: 'b', metadata: { name: 'c' } }}
children={children}
@@ -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';
@@ -25,11 +25,9 @@ import { fireEvent, screen } from '@testing-library/react';
import * as React from 'react';
import { UnregisterEntity } from './UnregisterEntity';
const mockPermissionApi = new MockPermissionApi();
function render(children: React.ReactNode) {
return renderInTestApp(
<TestApiProvider apis={[[permissionApiRef, mockPermissionApi]]}>
<TestApiProvider apis={[[permissionApiRef, mockApis.permission()]]}>
<EntityProvider
entity={{ apiVersion: 'a', kind: 'b', metadata: { name: 'c' } }}
children={children}
@@ -32,7 +32,7 @@ import {
import { catalogApiMock } from '@backstage/plugin-catalog-react/testUtils';
import { permissionApiRef } from '@backstage/plugin-permission-react';
import {
MockPermissionApi,
mockApis,
renderInTestApp,
TestApiProvider,
TestApiRegistry,
@@ -51,16 +51,16 @@ describe('EntityLayout', () => {
},
} 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(
<ApiProvider apis={mockApis}>
<ApiProvider apis={apis}>
<EntityProvider entity={mockEntity}>
<EntityLayout>
<EntityLayout.Route path="/" title="tabbed-test-title">
@@ -93,7 +93,7 @@ describe('EntityLayout', () => {
} as Entity;
await renderInTestApp(
<ApiProvider apis={mockApis}>
<ApiProvider apis={apis}>
<EntityProvider entity={mockEntityWithTitle}>
<EntityLayout>
<EntityLayout.Route path="/" title="tabbed-test-title">
@@ -117,7 +117,7 @@ describe('EntityLayout', () => {
it('renders default error message when entity is not found', async () => {
await renderInTestApp(
<ApiProvider apis={mockApis}>
<ApiProvider apis={apis}>
<AsyncEntityProvider loading={false}>
<EntityLayout>
<EntityLayout.Route path="/" title="tabbed-test-title">
@@ -142,7 +142,7 @@ describe('EntityLayout', () => {
it('renders custom message when entity is not found', async () => {
await renderInTestApp(
<ApiProvider apis={mockApis}>
<ApiProvider apis={apis}>
<AsyncEntityProvider loading={false}>
<EntityLayout
NotFoundComponent={<div>Oppps.. Your entity was not found</div>}
@@ -171,7 +171,7 @@ describe('EntityLayout', () => {
it('navigates when user clicks different tab', async () => {
await renderInTestApp(
<ApiProvider apis={mockApis}>
<ApiProvider apis={apis}>
<EntityProvider entity={mockEntity}>
<EntityLayout>
<EntityLayout.Route path="/" title="tabbed-test-title">
@@ -211,7 +211,7 @@ describe('EntityLayout', () => {
const shouldNotRenderTab = (e: Entity) => e.metadata.name === 'some-entity';
await renderInTestApp(
<ApiProvider apis={mockApis}>
<ApiProvider apis={apis}>
<EntityProvider entity={mockEntity}>
<EntityLayout>
<EntityLayout.Route path="/" title="tabbed-test-title">
@@ -254,7 +254,7 @@ describe('EntityLayout', () => {
relations: [{ type: 'ownedBy', targetRef: mockTargetRef }],
};
await renderInTestApp(
<ApiProvider apis={mockApis}>
<ApiProvider apis={apis}>
<EntityProvider entity={ownerEntity}>
<EntityLayout>
<EntityLayout.Route path="/" title="tabbed-test-title">
@@ -327,7 +327,7 @@ describe('EntityLayout - CleanUpAfterRemoval', () => {
[catalogApiRef, catalogApi],
[alertApiRef, alertApi],
[starredEntitiesApiRef, new MockStarredEntitiesApi()],
[permissionApiRef, new MockPermissionApi()],
[permissionApiRef, mockApis.permission()],
]}
>
<EntityProvider entity={entity}>
@@ -378,7 +378,7 @@ describe('EntityLayout - CleanUpAfterRemoval', () => {
[catalogApiRef, catalogApi],
[alertApiRef, alertApi],
[starredEntitiesApiRef, new MockStarredEntitiesApi()],
[permissionApiRef, new MockPermissionApi()],
[permissionApiRef, mockApis.permission()],
]}
>
<EntityProvider entity={entity}>
@@ -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()],
]}
>
<EntityProvider entity={groupA}>
@@ -212,7 +216,7 @@ describe('MemberTab Test', () => {
apis={[
[catalogApiRef, mockedCatalogApiSupportingGroups],
[starredEntitiesApiRef, mockedStarredEntitiesApi],
[permissionApiRef, {}],
[permissionApiRef, mockApis.permission()],
]}
>
<EntityProvider entity={groupA}>
@@ -238,7 +242,7 @@ describe('MemberTab Test', () => {
apis={[
[catalogApiRef, mockedCatalogApiSupportingGroups],
[starredEntitiesApiRef, mockedStarredEntitiesApi],
[permissionApiRef, {}],
[permissionApiRef, mockApis.permission()],
]}
>
<EntityProvider entity={groupA}>
@@ -273,7 +277,7 @@ describe('MemberTab Test', () => {
apis={[
[catalogApiRef, mockedCatalogApiSupportingGroups],
[starredEntitiesApiRef, mockedStarredEntitiesApi],
[permissionApiRef, {}],
[permissionApiRef, mockApis.permission()],
]}
>
<EntityProvider entity={groupA}>
@@ -308,7 +312,7 @@ describe('MemberTab Test', () => {
apis={[
[catalogApiRef, mockedCatalogApiSupportingGroups],
[starredEntitiesApiRef, mockedStarredEntitiesApi],
[permissionApiRef, {}],
[permissionApiRef, mockApis.permission()],
]}
>
<EntityProvider entity={groupA}>
@@ -366,7 +370,7 @@ describe('MemberTab Test', () => {
apis={[
[catalogApiRef, mockedCatalogApiSupportingGroups],
[starredEntitiesApiRef, mockedStarredEntitiesApi],
[permissionApiRef, {}],
[permissionApiRef, mockApis.permission()],
]}
>
<EntityProvider entity={groupA}>
@@ -406,7 +410,7 @@ describe('MemberTab Test', () => {
apis={[
[catalogApiRef, mockedCatalogApiSupportingGroups],
[starredEntitiesApiRef, mockedStarredEntitiesApi],
[permissionApiRef, {}],
[permissionApiRef, mockApis.permission()],
]}
>
<EntityProvider entity={groupA}>
@@ -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();
});
});
@@ -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()],
]}
>
<TemplateCard template={mockTemplate} />
@@ -84,7 +85,7 @@ describe('TemplateCard', () => {
storageApi: MockStorageApi.create(),
}),
],
[permissionApiRef, new MockPermissionApi()],
[permissionApiRef, mockApis.permission()],
]}
>
<TemplateCard template={mockTemplate} />
@@ -116,7 +117,7 @@ describe('TemplateCard', () => {
storageApi: MockStorageApi.create(),
}),
],
[permissionApiRef, new MockPermissionApi()],
[permissionApiRef, mockApis.permission()],
]}
>
<TemplateCard template={mockTemplate} />
@@ -146,7 +147,7 @@ describe('TemplateCard', () => {
storageApi: MockStorageApi.create(),
}),
],
[permissionApiRef, new MockPermissionApi()],
[permissionApiRef, mockApis.permission()],
]}
>
<TemplateCard template={mockTemplate} />
@@ -182,7 +183,7 @@ describe('TemplateCard', () => {
storageApi: MockStorageApi.create(),
}),
],
[permissionApiRef, new MockPermissionApi()],
[permissionApiRef, mockApis.permission()],
]}
>
<TemplateCard template={mockTemplate} />
@@ -222,7 +223,7 @@ describe('TemplateCard', () => {
storageApi: MockStorageApi.create(),
}),
],
[permissionApiRef, new MockPermissionApi()],
[permissionApiRef, mockApis.permission()],
]}
>
<TemplateCard template={mockTemplate} />
@@ -267,7 +268,7 @@ describe('TemplateCard', () => {
storageApi: MockStorageApi.create(),
}),
],
[permissionApiRef, new MockPermissionApi()],
[permissionApiRef, mockApis.permission()],
]}
>
<TemplateCard template={mockTemplate} additionalLinks={[]} />
@@ -316,7 +317,7 @@ describe('TemplateCard', () => {
storageApi: MockStorageApi.create(),
}),
],
[permissionApiRef, new MockPermissionApi()],
[permissionApiRef, mockApis.permission()],
]}
>
<TemplateCard template={mockTemplate} additionalLinks={[]} />
@@ -359,7 +360,7 @@ describe('TemplateCard', () => {
storageApi: MockStorageApi.create(),
}),
],
[permissionApiRef, new MockPermissionApi()],
[permissionApiRef, mockApis.permission()],
]}
>
<TemplateCard template={mockTemplate} />
@@ -399,7 +400,7 @@ describe('TemplateCard', () => {
storageApi: MockStorageApi.create(),
}),
],
[permissionApiRef, new MockPermissionApi()],
[permissionApiRef, mockApis.permission()],
]}
>
<TemplateCard template={mockTemplate} onSelected={mockOnSelected} />
@@ -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(
<SWRConfig value={{ provider: () => new Map() }}>
@@ -442,7 +440,10 @@ describe('TemplateCard', () => {
storageApi: MockStorageApi.create(),
}),
],
[permissionApiRef, new MockPermissionApi(mockAuthorize)],
[
permissionApiRef,
mockApis.permission({ authorize: AuthorizeResult.DENY }),
],
]}
>
<TemplateCard template={mockTemplate} onSelected={mockOnSelected} />
@@ -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()],
]}
>
<TemplateListPage />
@@ -77,7 +78,7 @@ describe('TemplateListPage', () => {
storageApi: MockStorageApi.create(),
}),
],
[permissionApiRef, {}],
[permissionApiRef, mockApis.permission()],
]}
>
<TemplateListPage />
@@ -100,7 +101,7 @@ describe('TemplateListPage', () => {
storageApi: MockStorageApi.create(),
}),
],
[permissionApiRef, {}],
[permissionApiRef, mockApis.permission()],
]}
>
<TemplateListPage />
@@ -122,7 +123,7 @@ describe('TemplateListPage', () => {
storageApi: MockStorageApi.create(),
}),
],
[permissionApiRef, {}],
[permissionApiRef, mockApis.permission()],
]}
>
<TemplateListPage />
@@ -145,7 +146,7 @@ describe('TemplateListPage', () => {
storageApi: MockStorageApi.create(),
}),
],
[permissionApiRef, {}],
[permissionApiRef, mockApis.permission()],
]}
>
<TemplateListPage />
@@ -167,7 +168,7 @@ describe('TemplateListPage', () => {
storageApi: MockStorageApi.create(),
}),
],
[permissionApiRef, {}],
[permissionApiRef, mockApis.permission()],
]}
>
<TemplateListPage />
@@ -188,7 +189,7 @@ describe('TemplateListPage', () => {
storageApi: MockStorageApi.create(),
}),
],
[permissionApiRef, {}],
[permissionApiRef, mockApis.permission()],
]}
>
<TemplateListPage
@@ -19,7 +19,7 @@ import React from 'react';
import {
renderInTestApp,
TestApiProvider,
MockPermissionApi,
mockApis,
} from '@backstage/test-utils';
import { scaffolderApiRef } from '@backstage/plugin-scaffolder-react';
import { act, fireEvent, waitFor, within } from '@testing-library/react';
@@ -70,7 +70,7 @@ describe('OngoingTask', () => {
<TestApiProvider
apis={[
[scaffolderApiRef, mockScaffolderApi],
[permissionApiRef, permissionApi || new MockPermissionApi()],
[permissionApiRef, permissionApi || mockApis.permission()],
]}
>
<OngoingTask />
@@ -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;