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
+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);
}
}