@forge/react
11.13.0-next.0-experimental-bf21d1e11.13.0-next.1
out/hooks/__test__/usePermissions.test.js~
out/hooks/__test__/usePermissions.test.jsModified+25
Index: package/out/hooks/__test__/usePermissions.test.js
===================================================================
--- package/out/hooks/__test__/usePermissions.test.js
+++ package/out/hooks/__test__/usePermissions.test.js
@@ -739,8 +739,33 @@
expect(result.current.hasPermission).toBe(false);
expect(result.current.missingPermissions?.external?.fetch?.client).toEqual(['http://example.com']);
});
});
+ describe('Input shape validation', () => {
+ beforeEach(() => {
+ mockGetContext.mockResolvedValue({
+ permissions: { scopes: ['read:confluence-content'] }
+ });
+ });
+ it.each([
+ [{ scopes: 'read:confluence-content' }, 'scopes should be an array, not a string'],
+ [{ external: 'https://api.example.com' }, 'external should be an object, not a string'],
+ [{ external: { fetch: ['https://api.example.com'] } }, 'external.fetch should be an object, not an array'],
+ [
+ { external: { fetch: { backend: 'https://api.zoom.com' } } },
+ 'external.fetch.backend should be an array, not a string'
+ ]
+ ])('should set error for invalid input %#', async (requiredPermissions, expectedMessage) => {
+ const { result } = (0, react_hooks_1.renderHook)(() => (0, usePermissions_1.usePermissions)(requiredPermissions));
+ await (0, react_hooks_1.act)(async () => {
+ await new Promise((resolve) => setTimeout(resolve, 10));
+ });
+ expect(result.current.isLoading).toBe(false);
+ expect(result.current.hasPermission).toBe(false);
+ expect(result.current.error).toBeInstanceOf(TypeError);
+ expect(result.current.error?.message).toBe(expectedMessage);
+ });
+ });
describe('Edge cases', () => {
it('should handle empty required permissions', async () => {
const mockContext = {
permissions: {