@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: {