@wordpress/abilities 0.1.1-next.dc3f6d3c1.0 → 0.2.1-next.8b30e05b0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/store/tests/resolvers.test.ts"],
4
- "sourcesContent": ["/**\n * Tests for store resolvers.\n */\n\n/**\n * WordPress dependencies\n */\nimport { store as coreStore } from '@wordpress/core-data';\n\n/**\n * Internal dependencies\n */\nimport {\n\tgetAbilities,\n\tgetAbility,\n\tgetAbilityCategories,\n\tgetAbilityCategory,\n} from '../resolvers';\nimport { receiveAbilities, receiveCategories } from '../actions';\nimport { ENTITY_KIND, ENTITY_NAME, ENTITY_NAME_CATEGORIES } from '../constants';\nimport type { Ability, AbilityCategory } from '../../types';\n\n// Mock the WordPress core data store\njest.mock( '@wordpress/core-data', () => ( {\n\tstore: 'core',\n} ) );\n\ndescribe( 'Store Resolvers', () => {\n\tlet mockDispatch: jest.Mock;\n\tlet mockRegistry: any;\n\tlet mockSelect: any;\n\n\tbeforeEach( () => {\n\t\tmockDispatch = jest.fn();\n\t\tmockSelect = jest.fn();\n\t\tmockRegistry = {\n\t\t\tresolveSelect: jest.fn(),\n\t\t\tselect: jest.fn(),\n\t\t};\n\t} );\n\n\tdescribe( 'getAbilities', () => {\n\t\tit( 'should fetch and dispatch abilities from the server', async () => {\n\t\t\tconst mockAbilities: Ability[] = [\n\t\t\t\t{\n\t\t\t\t\tname: 'test/ability1',\n\t\t\t\t\tlabel: 'Test Ability 1',\n\t\t\t\t\tdescription: 'First test ability',\n\t\t\t\t\tcategory: 'test-category',\n\t\t\t\t\tinput_schema: { type: 'object' },\n\t\t\t\t\toutput_schema: { type: 'object' },\n\t\t\t\t},\n\t\t\t];\n\n\t\t\tconst mockResolveSelect = {\n\t\t\t\tgetEntityRecords: jest.fn().mockResolvedValue( mockAbilities ),\n\t\t\t};\n\n\t\t\tconst mockSelectInstance = {\n\t\t\t\tgetAbilities: jest.fn().mockReturnValue( [] ), // Store is empty\n\t\t\t};\n\n\t\t\tmockRegistry.resolveSelect.mockReturnValue( mockResolveSelect );\n\n\t\t\tconst resolver = getAbilities();\n\t\t\tawait resolver( {\n\t\t\t\tdispatch: mockDispatch,\n\t\t\t\tregistry: mockRegistry,\n\t\t\t\tselect: mockSelectInstance,\n\t\t\t} );\n\n\t\t\texpect( mockRegistry.resolveSelect ).toHaveBeenCalledWith(\n\t\t\t\tcoreStore\n\t\t\t);\n\t\t\texpect( mockResolveSelect.getEntityRecords ).toHaveBeenCalledWith(\n\t\t\t\tENTITY_KIND,\n\t\t\t\tENTITY_NAME,\n\t\t\t\t{ per_page: -1 }\n\t\t\t);\n\t\t\texpect( mockDispatch ).toHaveBeenCalledWith(\n\t\t\t\treceiveAbilities( mockAbilities )\n\t\t\t);\n\t\t} );\n\n\t\tit( 'should not fetch if store already has abilities', async () => {\n\t\t\tconst existingAbilities: Ability[] = [\n\t\t\t\t{\n\t\t\t\t\tname: 'test/ability1',\n\t\t\t\t\tlabel: 'Test Ability 1',\n\t\t\t\t\tdescription: 'First test ability',\n\t\t\t\t\tcategory: 'data-retrieval',\n\t\t\t\t\tinput_schema: { type: 'object' },\n\t\t\t\t\toutput_schema: { type: 'object' },\n\t\t\t\t},\n\t\t\t];\n\n\t\t\tconst mockResolveSelect = {\n\t\t\t\tgetEntityRecords: jest.fn(),\n\t\t\t};\n\n\t\t\tconst mockSelectInstance = {\n\t\t\t\tgetAbilities: jest.fn().mockReturnValue( existingAbilities ), // Store has data\n\t\t\t};\n\n\t\t\tmockRegistry.resolveSelect.mockReturnValue( mockResolveSelect );\n\n\t\t\tconst resolver = getAbilities( { category: 'data-retrieval' } );\n\t\t\tawait resolver( {\n\t\t\t\tdispatch: mockDispatch,\n\t\t\t\tregistry: mockRegistry,\n\t\t\t\tselect: mockSelectInstance,\n\t\t\t} );\n\n\t\t\t// Should not fetch since store already has abilities\n\t\t\texpect( mockResolveSelect.getEntityRecords ).not.toHaveBeenCalled();\n\t\t\texpect( mockDispatch ).not.toHaveBeenCalled();\n\t\t} );\n\n\t\tit( 'should handle empty abilities', async () => {\n\t\t\tconst mockResolveSelect = {\n\t\t\t\tgetEntityRecords: jest.fn().mockResolvedValue( [] ),\n\t\t\t};\n\n\t\t\tconst mockSelectInstance = {\n\t\t\t\tgetAbilities: jest.fn().mockReturnValue( [] ), // Store is empty\n\t\t\t};\n\n\t\t\tmockRegistry.resolveSelect.mockReturnValue( mockResolveSelect );\n\n\t\t\tconst resolver = getAbilities();\n\t\t\tawait resolver( {\n\t\t\t\tdispatch: mockDispatch,\n\t\t\t\tregistry: mockRegistry,\n\t\t\t\tselect: mockSelectInstance,\n\t\t\t} );\n\n\t\t\texpect( mockDispatch ).toHaveBeenCalledWith(\n\t\t\t\treceiveAbilities( [] )\n\t\t\t);\n\t\t} );\n\n\t\tit( 'should handle null response', async () => {\n\t\t\tconst mockResolveSelect = {\n\t\t\t\tgetEntityRecords: jest.fn().mockResolvedValue( null ),\n\t\t\t};\n\n\t\t\tconst mockSelectInstance = {\n\t\t\t\tgetAbilities: jest.fn().mockReturnValue( [] ), // Store is empty\n\t\t\t};\n\n\t\t\tmockRegistry.resolveSelect.mockReturnValue( mockResolveSelect );\n\n\t\t\tconst resolver = getAbilities();\n\t\t\tawait resolver( {\n\t\t\t\tdispatch: mockDispatch,\n\t\t\t\tregistry: mockRegistry,\n\t\t\t\tselect: mockSelectInstance,\n\t\t\t} );\n\n\t\t\texpect( mockDispatch ).toHaveBeenCalledWith(\n\t\t\t\treceiveAbilities( [] )\n\t\t\t);\n\t\t} );\n\n\t\tit( 'should fetch all abilities in a single request', async () => {\n\t\t\tconst allAbilities: Ability[] = [\n\t\t\t\t{\n\t\t\t\t\tname: 'test/ability1',\n\t\t\t\t\tlabel: 'Test Ability 1',\n\t\t\t\t\tdescription: 'First test ability',\n\t\t\t\t\tcategory: 'test-category',\n\t\t\t\t\tinput_schema: { type: 'object' },\n\t\t\t\t\toutput_schema: { type: 'object' },\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: 'test/ability2',\n\t\t\t\t\tlabel: 'Test Ability 2',\n\t\t\t\t\tdescription: 'Second test ability',\n\t\t\t\t\tcategory: 'test-category',\n\t\t\t\t\tinput_schema: { type: 'object' },\n\t\t\t\t\toutput_schema: { type: 'object' },\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tname: 'test/ability3',\n\t\t\t\t\tlabel: 'Test Ability 3',\n\t\t\t\t\tdescription: 'Third test ability',\n\t\t\t\t\tcategory: 'test-category',\n\t\t\t\t\tinput_schema: { type: 'object' },\n\t\t\t\t\toutput_schema: { type: 'object' },\n\t\t\t\t},\n\t\t\t];\n\n\t\t\tconst mockResolveSelect = {\n\t\t\t\tgetEntityRecords: jest.fn().mockResolvedValue( allAbilities ),\n\t\t\t};\n\n\t\t\tconst mockSelectInstance = {\n\t\t\t\tgetAbilities: jest.fn().mockReturnValue( [] ), // Store is empty\n\t\t\t};\n\n\t\t\tmockRegistry.resolveSelect.mockReturnValue( mockResolveSelect );\n\n\t\t\tconst resolver = getAbilities();\n\t\t\tawait resolver( {\n\t\t\t\tdispatch: mockDispatch,\n\t\t\t\tregistry: mockRegistry,\n\t\t\t\tselect: mockSelectInstance,\n\t\t\t} );\n\n\t\t\t// Should fetch all abilities in one request with per_page: -1\n\t\t\texpect( mockResolveSelect.getEntityRecords ).toHaveBeenCalledTimes(\n\t\t\t\t1\n\t\t\t);\n\t\t\texpect(\n\t\t\t\tmockResolveSelect.getEntityRecords\n\t\t\t).toHaveBeenNthCalledWith( 1, ENTITY_KIND, ENTITY_NAME, {\n\t\t\t\tper_page: -1,\n\t\t\t} );\n\n\t\t\t// Should dispatch all abilities\n\t\t\texpect( mockDispatch ).toHaveBeenCalledWith(\n\t\t\t\treceiveAbilities( allAbilities )\n\t\t\t);\n\t\t} );\n\t} );\n\n\tdescribe( 'getAbility', () => {\n\t\tit( 'should fetch and dispatch a specific ability', async () => {\n\t\t\tconst mockAbility: Ability = {\n\t\t\t\tname: 'test/ability',\n\t\t\t\tlabel: 'Test Ability',\n\t\t\t\tdescription: 'Test ability description',\n\t\t\t\tcategory: 'test-category',\n\t\t\t\tinput_schema: { type: 'object' },\n\t\t\t\toutput_schema: { type: 'object' },\n\t\t\t};\n\n\t\t\tconst mockResolveSelect = {\n\t\t\t\tgetEntityRecord: jest.fn().mockResolvedValue( mockAbility ),\n\t\t\t};\n\n\t\t\tmockRegistry.resolveSelect.mockReturnValue( mockResolveSelect );\n\t\t\tmockSelect.getAbility = jest.fn().mockReturnValue( null ); // Ability not in store\n\n\t\t\tconst resolver = getAbility( 'test/ability' );\n\t\t\tawait resolver( {\n\t\t\t\tdispatch: mockDispatch,\n\t\t\t\tregistry: mockRegistry,\n\t\t\t\tselect: mockSelect,\n\t\t\t} );\n\n\t\t\texpect( mockSelect.getAbility ).toHaveBeenCalledWith(\n\t\t\t\t'test/ability'\n\t\t\t);\n\t\t\texpect( mockRegistry.resolveSelect ).toHaveBeenCalledWith(\n\t\t\t\tcoreStore\n\t\t\t);\n\t\t\texpect( mockResolveSelect.getEntityRecord ).toHaveBeenCalledWith(\n\t\t\t\tENTITY_KIND,\n\t\t\t\tENTITY_NAME,\n\t\t\t\t'test/ability'\n\t\t\t);\n\t\t\t// registerAbility returns a thunk, so we just verify dispatch was called\n\t\t\texpect( mockDispatch ).toHaveBeenCalled();\n\t\t\texpect( typeof mockDispatch.mock.calls[ 0 ][ 0 ] ).toBe(\n\t\t\t\t'function'\n\t\t\t);\n\t\t} );\n\n\t\tit( 'should not fetch if ability already exists in store', async () => {\n\t\t\tconst existingAbility: Ability = {\n\t\t\t\tname: 'test/ability',\n\t\t\t\tlabel: 'Test Ability',\n\t\t\t\tdescription: 'Already in store',\n\t\t\t\tcategory: 'test-category',\n\t\t\t\tinput_schema: { type: 'object' },\n\t\t\t\toutput_schema: { type: 'object' },\n\t\t\t\tcallback: jest.fn(),\n\t\t\t};\n\n\t\t\tmockSelect.getAbility = jest\n\t\t\t\t.fn()\n\t\t\t\t.mockReturnValue( existingAbility );\n\n\t\t\tconst resolver = getAbility( 'test/ability' );\n\t\t\tawait resolver( {\n\t\t\t\tdispatch: mockDispatch,\n\t\t\t\tregistry: mockRegistry,\n\t\t\t\tselect: mockSelect,\n\t\t\t} );\n\n\t\t\texpect( mockSelect.getAbility ).toHaveBeenCalledWith(\n\t\t\t\t'test/ability'\n\t\t\t);\n\t\t\texpect( mockRegistry.resolveSelect ).not.toHaveBeenCalled();\n\t\t\texpect( mockDispatch ).not.toHaveBeenCalled();\n\t\t} );\n\n\t\tit( 'should handle non-existent abilities', async () => {\n\t\t\tconst mockResolveSelect = {\n\t\t\t\tgetEntityRecord: jest.fn().mockResolvedValue( null ),\n\t\t\t};\n\n\t\t\tmockRegistry.resolveSelect.mockReturnValue( mockResolveSelect );\n\t\t\tmockSelect.getAbility = jest.fn().mockReturnValue( null );\n\n\t\t\tconst resolver = getAbility( 'non-existent' );\n\t\t\tawait resolver( {\n\t\t\t\tdispatch: mockDispatch,\n\t\t\t\tregistry: mockRegistry,\n\t\t\t\tselect: mockSelect,\n\t\t\t} );\n\n\t\t\texpect( mockResolveSelect.getEntityRecord ).toHaveBeenCalledWith(\n\t\t\t\tENTITY_KIND,\n\t\t\t\tENTITY_NAME,\n\t\t\t\t'non-existent'\n\t\t\t);\n\t\t\texpect( mockDispatch ).not.toHaveBeenCalled();\n\t\t} );\n\n\t\tit( 'should handle valid namespaced ability names', async () => {\n\t\t\tconst mockAbility: Ability = {\n\t\t\t\tname: 'my-plugin/feature-action',\n\t\t\t\tlabel: 'Namespaced Action',\n\t\t\t\tdescription: 'Namespaced ability',\n\t\t\t\tcategory: 'test-category',\n\t\t\t\tinput_schema: { type: 'object' },\n\t\t\t\toutput_schema: { type: 'object' },\n\t\t\t};\n\n\t\t\tconst mockResolveSelect = {\n\t\t\t\tgetEntityRecord: jest.fn().mockResolvedValue( mockAbility ),\n\t\t\t};\n\n\t\t\tmockRegistry.resolveSelect.mockReturnValue( mockResolveSelect );\n\t\t\tmockSelect.getAbility = jest.fn().mockReturnValue( null );\n\n\t\t\tconst resolver = getAbility( 'my-plugin/feature-action' );\n\t\t\tawait resolver( {\n\t\t\t\tdispatch: mockDispatch,\n\t\t\t\tregistry: mockRegistry,\n\t\t\t\tselect: mockSelect,\n\t\t\t} );\n\n\t\t\texpect( mockResolveSelect.getEntityRecord ).toHaveBeenCalledWith(\n\t\t\t\tENTITY_KIND,\n\t\t\t\tENTITY_NAME,\n\t\t\t\t'my-plugin/feature-action'\n\t\t\t);\n\t\t\t// registerAbility returns a thunk, so we just verify dispatch was called\n\t\t\texpect( mockDispatch ).toHaveBeenCalled();\n\t\t\texpect( typeof mockDispatch.mock.calls[ 0 ][ 0 ] ).toBe(\n\t\t\t\t'function'\n\t\t\t);\n\t\t} );\n\t} );\n\n\tdescribe( 'getAbilityCategories', () => {\n\t\tit( 'should fetch and dispatch categories from the server', async () => {\n\t\t\tconst mockCategories: AbilityCategory[] = [\n\t\t\t\t{\n\t\t\t\t\tslug: 'data-retrieval',\n\t\t\t\t\tlabel: 'Data Retrieval',\n\t\t\t\t\tdescription: 'Abilities that retrieve data',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tslug: 'user-management',\n\t\t\t\t\tlabel: 'User Management',\n\t\t\t\t\tdescription: 'Abilities for managing users',\n\t\t\t\t},\n\t\t\t];\n\n\t\t\tconst mockResolveSelect = {\n\t\t\t\tgetEntityRecords: jest.fn().mockResolvedValue( mockCategories ),\n\t\t\t};\n\n\t\t\tconst mockSelectInstance = {\n\t\t\t\tgetAbilityCategories: jest.fn().mockReturnValue( [] ),\n\t\t\t};\n\n\t\t\tmockRegistry.resolveSelect.mockReturnValue( mockResolveSelect );\n\n\t\t\tconst resolver = getAbilityCategories();\n\t\t\tawait resolver( {\n\t\t\t\tdispatch: mockDispatch,\n\t\t\t\tregistry: mockRegistry,\n\t\t\t\tselect: mockSelectInstance,\n\t\t\t} );\n\n\t\t\texpect( mockRegistry.resolveSelect ).toHaveBeenCalledWith(\n\t\t\t\tcoreStore\n\t\t\t);\n\t\t\texpect( mockResolveSelect.getEntityRecords ).toHaveBeenCalledWith(\n\t\t\t\tENTITY_KIND,\n\t\t\t\tENTITY_NAME_CATEGORIES,\n\t\t\t\t{ per_page: -1 }\n\t\t\t);\n\t\t\texpect( mockDispatch ).toHaveBeenCalledWith(\n\t\t\t\treceiveCategories( mockCategories )\n\t\t\t);\n\t\t} );\n\n\t\tit( 'should not fetch if store already has categories', async () => {\n\t\t\tconst existingCategories: AbilityCategory[] = [\n\t\t\t\t{\n\t\t\t\t\tslug: 'data-retrieval',\n\t\t\t\t\tlabel: 'Data Retrieval',\n\t\t\t\t\tdescription: 'Abilities that retrieve data',\n\t\t\t\t},\n\t\t\t];\n\n\t\t\tconst mockResolveSelect = {\n\t\t\t\tgetEntityRecords: jest.fn(),\n\t\t\t};\n\n\t\t\tconst mockSelectInstance = {\n\t\t\t\tgetAbilityCategories: jest\n\t\t\t\t\t.fn()\n\t\t\t\t\t.mockReturnValue( existingCategories ),\n\t\t\t};\n\n\t\t\tmockRegistry.resolveSelect.mockReturnValue( mockResolveSelect );\n\n\t\t\tconst resolver = getAbilityCategories();\n\t\t\tawait resolver( {\n\t\t\t\tdispatch: mockDispatch,\n\t\t\t\tregistry: mockRegistry,\n\t\t\t\tselect: mockSelectInstance,\n\t\t\t} );\n\n\t\t\t// Should not fetch since store already has categories\n\t\t\texpect( mockResolveSelect.getEntityRecords ).not.toHaveBeenCalled();\n\t\t\texpect( mockDispatch ).not.toHaveBeenCalled();\n\t\t} );\n\n\t\tit( 'should fetch from server even when only client-registered categories exist', async () => {\n\t\t\t// This tests the scenario where a client category is registered first\n\t\t\t// The resolver should still fetch server categories\n\t\t\tconst clientOnlyCategories: AbilityCategory[] = [\n\t\t\t\t{\n\t\t\t\t\tslug: 'client-category',\n\t\t\t\t\tlabel: 'Client Category',\n\t\t\t\t\tdescription: 'A category registered on the client',\n\t\t\t\t\tmeta: {\n\t\t\t\t\t\t_clientRegistered: true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t];\n\n\t\t\tconst serverCategories: AbilityCategory[] = [\n\t\t\t\t{\n\t\t\t\t\tslug: 'data-retrieval',\n\t\t\t\t\tlabel: 'Data Retrieval',\n\t\t\t\t\tdescription: 'Server category',\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tslug: 'user-management',\n\t\t\t\t\tlabel: 'User Management',\n\t\t\t\t\tdescription: 'Another server category',\n\t\t\t\t},\n\t\t\t];\n\n\t\t\tconst mockResolveSelect = {\n\t\t\t\tgetEntityRecords: jest\n\t\t\t\t\t.fn()\n\t\t\t\t\t.mockResolvedValue( serverCategories ),\n\t\t\t};\n\n\t\t\tconst mockSelectInstance = {\n\t\t\t\tgetAbilityCategories: jest\n\t\t\t\t\t.fn()\n\t\t\t\t\t.mockReturnValue( clientOnlyCategories ),\n\t\t\t};\n\n\t\t\tmockRegistry.resolveSelect.mockReturnValue( mockResolveSelect );\n\n\t\t\tconst resolver = getAbilityCategories();\n\t\t\tawait resolver( {\n\t\t\t\tdispatch: mockDispatch,\n\t\t\t\tregistry: mockRegistry,\n\t\t\t\tselect: mockSelectInstance,\n\t\t\t} );\n\n\t\t\t// Should fetch from server because only client categories exist\n\t\t\texpect( mockRegistry.resolveSelect ).toHaveBeenCalledWith(\n\t\t\t\tcoreStore\n\t\t\t);\n\t\t\texpect( mockResolveSelect.getEntityRecords ).toHaveBeenCalledWith(\n\t\t\t\tENTITY_KIND,\n\t\t\t\tENTITY_NAME_CATEGORIES,\n\t\t\t\t{ per_page: -1 }\n\t\t\t);\n\t\t\texpect( mockDispatch ).toHaveBeenCalledWith(\n\t\t\t\treceiveCategories( serverCategories )\n\t\t\t);\n\t\t} );\n\n\t\tit( 'should handle null response', async () => {\n\t\t\tconst mockResolveSelect = {\n\t\t\t\tgetEntityRecords: jest.fn().mockResolvedValue( null ),\n\t\t\t};\n\n\t\t\tconst mockSelectInstance = {\n\t\t\t\tgetAbilityCategories: jest.fn().mockReturnValue( [] ),\n\t\t\t};\n\n\t\t\tmockRegistry.resolveSelect.mockReturnValue( mockResolveSelect );\n\n\t\t\tconst resolver = getAbilityCategories();\n\t\t\tawait resolver( {\n\t\t\t\tdispatch: mockDispatch,\n\t\t\t\tregistry: mockRegistry,\n\t\t\t\tselect: mockSelectInstance,\n\t\t\t} );\n\n\t\t\texpect( mockDispatch ).toHaveBeenCalledWith(\n\t\t\t\treceiveCategories( [] )\n\t\t\t);\n\t\t} );\n\t} );\n\n\tdescribe( 'getAbilityCategory', () => {\n\t\tit( 'should fetch and dispatch a specific category', async () => {\n\t\t\tconst mockCategory: AbilityCategory = {\n\t\t\t\tslug: 'data-retrieval',\n\t\t\t\tlabel: 'Data Retrieval',\n\t\t\t\tdescription: 'Abilities that retrieve data',\n\t\t\t};\n\n\t\t\tconst mockResolveSelect = {\n\t\t\t\tgetEntityRecord: jest.fn().mockResolvedValue( mockCategory ),\n\t\t\t};\n\n\t\t\tmockRegistry.resolveSelect.mockReturnValue( mockResolveSelect );\n\t\t\tmockSelect.getAbilityCategory = jest.fn().mockReturnValue( null );\n\n\t\t\tconst resolver = getAbilityCategory( 'data-retrieval' );\n\t\t\tawait resolver( {\n\t\t\t\tdispatch: mockDispatch,\n\t\t\t\tregistry: mockRegistry,\n\t\t\t\tselect: mockSelect,\n\t\t\t} );\n\n\t\t\texpect( mockSelect.getAbilityCategory ).toHaveBeenCalledWith(\n\t\t\t\t'data-retrieval'\n\t\t\t);\n\t\t\texpect( mockRegistry.resolveSelect ).toHaveBeenCalledWith(\n\t\t\t\tcoreStore\n\t\t\t);\n\t\t\texpect( mockResolveSelect.getEntityRecord ).toHaveBeenCalledWith(\n\t\t\t\tENTITY_KIND,\n\t\t\t\tENTITY_NAME_CATEGORIES,\n\t\t\t\t'data-retrieval'\n\t\t\t);\n\t\t\t// registerAbilityCategory returns a thunk, so we just verify dispatch was called\n\t\t\texpect( mockDispatch ).toHaveBeenCalled();\n\t\t\texpect( typeof mockDispatch.mock.calls[ 0 ][ 0 ] ).toBe(\n\t\t\t\t'function'\n\t\t\t);\n\t\t} );\n\n\t\tit( 'should not fetch if category already exists in store', async () => {\n\t\t\tconst existingCategory: AbilityCategory = {\n\t\t\t\tslug: 'data-retrieval',\n\t\t\t\tlabel: 'Data Retrieval',\n\t\t\t\tdescription: 'Already in store',\n\t\t\t};\n\n\t\t\tmockSelect.getAbilityCategory = jest\n\t\t\t\t.fn()\n\t\t\t\t.mockReturnValue( existingCategory );\n\n\t\t\tconst resolver = getAbilityCategory( 'data-retrieval' );\n\t\t\tawait resolver( {\n\t\t\t\tdispatch: mockDispatch,\n\t\t\t\tregistry: mockRegistry,\n\t\t\t\tselect: mockSelect,\n\t\t\t} );\n\n\t\t\texpect( mockSelect.getAbilityCategory ).toHaveBeenCalledWith(\n\t\t\t\t'data-retrieval'\n\t\t\t);\n\t\t\texpect( mockRegistry.resolveSelect ).not.toHaveBeenCalled();\n\t\t\texpect( mockDispatch ).not.toHaveBeenCalled();\n\t\t} );\n\n\t\tit( 'should handle non-existent categories', async () => {\n\t\t\tconst mockResolveSelect = {\n\t\t\t\tgetEntityRecord: jest.fn().mockResolvedValue( null ),\n\t\t\t};\n\n\t\t\tmockRegistry.resolveSelect.mockReturnValue( mockResolveSelect );\n\t\t\tmockSelect.getAbilityCategory = jest.fn().mockReturnValue( null );\n\n\t\t\tconst resolver = getAbilityCategory( 'non-existent' );\n\t\t\tawait resolver( {\n\t\t\t\tdispatch: mockDispatch,\n\t\t\t\tregistry: mockRegistry,\n\t\t\t\tselect: mockSelect,\n\t\t\t} );\n\n\t\t\texpect( mockResolveSelect.getEntityRecord ).toHaveBeenCalledWith(\n\t\t\t\tENTITY_KIND,\n\t\t\t\tENTITY_NAME_CATEGORIES,\n\t\t\t\t'non-existent'\n\t\t\t);\n\t\t\texpect( mockDispatch ).not.toHaveBeenCalled();\n\t\t} );\n\n\t\tit( 'should handle categories with meta', async () => {\n\t\t\tconst mockCategory: AbilityCategory = {\n\t\t\t\tslug: 'user-management',\n\t\t\t\tlabel: 'User Management',\n\t\t\t\tdescription: 'Abilities for managing users',\n\t\t\t\tmeta: {\n\t\t\t\t\tpriority: 'high',\n\t\t\t\t},\n\t\t\t};\n\n\t\t\tconst mockResolveSelect = {\n\t\t\t\tgetEntityRecord: jest.fn().mockResolvedValue( mockCategory ),\n\t\t\t};\n\n\t\t\tmockRegistry.resolveSelect.mockReturnValue( mockResolveSelect );\n\t\t\tmockSelect.getAbilityCategory = jest.fn().mockReturnValue( null );\n\n\t\t\tconst resolver = getAbilityCategory( 'user-management' );\n\t\t\tawait resolver( {\n\t\t\t\tdispatch: mockDispatch,\n\t\t\t\tregistry: mockRegistry,\n\t\t\t\tselect: mockSelect,\n\t\t\t} );\n\n\t\t\t// registerAbilityCategory returns a thunk, so we just verify dispatch was called\n\t\t\texpect( mockDispatch ).toHaveBeenCalled();\n\t\t\texpect( typeof mockDispatch.mock.calls[ 0 ][ 0 ] ).toBe(\n\t\t\t\t'function'\n\t\t\t);\n\t\t} );\n\t} );\n} );\n"],
5
- "mappings": "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",
6
- "names": ["coreStore"]
7
- }
@@ -1,349 +0,0 @@
1
- "use strict";
2
-
3
- // packages/abilities/src/store/tests/selectors.test.ts
4
- var import_selectors = require("../selectors");
5
- describe("Store Selectors", () => {
6
- describe("getAbilities", () => {
7
- it("should return all abilities as an array", () => {
8
- const state = {
9
- abilitiesByName: {
10
- "test/ability1": {
11
- name: "test/ability1",
12
- label: "Test Ability 1",
13
- description: "First test ability",
14
- category: "test-category",
15
- input_schema: { type: "object" },
16
- output_schema: { type: "object" }
17
- },
18
- "test/ability2": {
19
- name: "test/ability2",
20
- label: "Test Ability 2",
21
- description: "Second test ability",
22
- category: "test-category",
23
- input_schema: { type: "object" },
24
- output_schema: { type: "object" },
25
- callback: jest.fn()
26
- }
27
- },
28
- categoriesBySlug: {}
29
- };
30
- const abilities = (0, import_selectors.getAbilities)(state);
31
- expect(abilities).toHaveLength(2);
32
- expect(abilities).toContainEqual(
33
- state.abilitiesByName["test/ability1"]
34
- );
35
- expect(abilities).toContainEqual(
36
- state.abilitiesByName["test/ability2"]
37
- );
38
- });
39
- it("should return empty array when no abilities exist", () => {
40
- const state = {
41
- abilitiesByName: {},
42
- categoriesBySlug: {}
43
- };
44
- const abilities = (0, import_selectors.getAbilities)(state);
45
- expect(abilities).toEqual([]);
46
- });
47
- it("should memoize results when state unchanged", () => {
48
- const state = {
49
- abilitiesByName: {
50
- "test/ability": {
51
- name: "test/ability",
52
- label: "Test Ability",
53
- description: "Test ability",
54
- category: "test-category",
55
- input_schema: { type: "object" },
56
- output_schema: { type: "object" }
57
- }
58
- },
59
- categoriesBySlug: {}
60
- };
61
- const result1 = (0, import_selectors.getAbilities)(state);
62
- const result2 = (0, import_selectors.getAbilities)(state);
63
- expect(result1).toBe(result2);
64
- });
65
- it("should return new array reference when state changes", () => {
66
- const state1 = {
67
- abilitiesByName: {
68
- "test/ability1": {
69
- name: "test/ability1",
70
- label: "Test Ability 1",
71
- description: "Test ability",
72
- category: "test-category",
73
- input_schema: { type: "object" },
74
- output_schema: { type: "object" }
75
- }
76
- },
77
- categoriesBySlug: {}
78
- };
79
- const state2 = {
80
- abilitiesByName: {
81
- ...state1.abilitiesByName,
82
- "test/ability2": {
83
- name: "test/ability2",
84
- label: "Test Ability 2",
85
- description: "Another test ability",
86
- category: "test-category",
87
- input_schema: { type: "object" },
88
- output_schema: { type: "object" }
89
- }
90
- },
91
- categoriesBySlug: {}
92
- };
93
- const result1 = (0, import_selectors.getAbilities)(state1);
94
- const result2 = (0, import_selectors.getAbilities)(state2);
95
- expect(result1).not.toBe(result2);
96
- expect(result1).toHaveLength(1);
97
- expect(result2).toHaveLength(2);
98
- });
99
- it("should filter abilities by category when category is provided", () => {
100
- const state = {
101
- abilitiesByName: {
102
- "test/ability1": {
103
- name: "test/ability1",
104
- label: "Test Ability 1",
105
- description: "First test ability",
106
- category: "data-retrieval",
107
- input_schema: { type: "object" },
108
- output_schema: { type: "object" }
109
- },
110
- "test/ability2": {
111
- name: "test/ability2",
112
- label: "Test Ability 2",
113
- description: "Second test ability",
114
- category: "data-retrieval",
115
- input_schema: { type: "object" },
116
- output_schema: { type: "object" }
117
- },
118
- "test/ability3": {
119
- name: "test/ability3",
120
- label: "Test Ability 3",
121
- description: "Third test ability",
122
- category: "user-management",
123
- input_schema: { type: "object" },
124
- output_schema: { type: "object" }
125
- }
126
- },
127
- categoriesBySlug: {}
128
- };
129
- const result = (0, import_selectors.getAbilities)(state, {
130
- category: "data-retrieval"
131
- });
132
- expect(result).toHaveLength(2);
133
- expect(result).toContainEqual(
134
- expect.objectContaining({ name: "test/ability1" })
135
- );
136
- expect(result).toContainEqual(
137
- expect.objectContaining({ name: "test/ability2" })
138
- );
139
- expect(result).not.toContainEqual(
140
- expect.objectContaining({ name: "test/ability3" })
141
- );
142
- });
143
- it("should return empty array when no abilities match category", () => {
144
- const state = {
145
- abilitiesByName: {
146
- "test/ability1": {
147
- name: "test/ability1",
148
- label: "Test Ability 1",
149
- description: "First test ability",
150
- category: "data-retrieval",
151
- input_schema: { type: "object" },
152
- output_schema: { type: "object" }
153
- }
154
- },
155
- categoriesBySlug: {}
156
- };
157
- const result = (0, import_selectors.getAbilities)(state, {
158
- category: "non-existent-category"
159
- });
160
- expect(result).toEqual([]);
161
- });
162
- });
163
- describe("getAbility", () => {
164
- const state = {
165
- abilitiesByName: {
166
- "test/ability1": {
167
- name: "test/ability1",
168
- label: "Test Ability 1",
169
- description: "First test ability",
170
- category: "test-category",
171
- input_schema: { type: "object" },
172
- output_schema: { type: "object" }
173
- },
174
- "test/ability2": {
175
- name: "test/ability2",
176
- label: "Test Ability 2",
177
- description: "Second test ability",
178
- category: "test-category",
179
- input_schema: { type: "object" },
180
- output_schema: { type: "object" },
181
- callback: jest.fn()
182
- }
183
- },
184
- categoriesBySlug: {}
185
- };
186
- it("should return a specific ability by name", () => {
187
- const ability = (0, import_selectors.getAbility)(state, "test/ability1");
188
- expect(ability).toEqual(
189
- state.abilitiesByName["test/ability1"]
190
- );
191
- });
192
- it("should return null if ability not found", () => {
193
- const ability = (0, import_selectors.getAbility)(state, "non-existent");
194
- expect(ability).toBeUndefined();
195
- });
196
- it("should handle empty state", () => {
197
- const emptyState = {
198
- abilitiesByName: {},
199
- categoriesBySlug: {}
200
- };
201
- const ability = (0, import_selectors.getAbility)(emptyState, "test/ability");
202
- expect(ability).toBeUndefined();
203
- });
204
- it("should return client abilities with callbacks", () => {
205
- const ability = (0, import_selectors.getAbility)(state, "test/ability2");
206
- expect(ability).toEqual(
207
- state.abilitiesByName["test/ability2"]
208
- );
209
- expect(ability?.callback).toBeDefined();
210
- });
211
- it("should handle valid namespaced ability names correctly", () => {
212
- const stateWithNamespaced = {
213
- abilitiesByName: {
214
- "my-plugin/feature-action": {
215
- name: "my-plugin/feature-action",
216
- label: "Namespaced Action",
217
- description: "Namespaced ability",
218
- category: "test-category",
219
- input_schema: { type: "object" },
220
- output_schema: { type: "object" }
221
- }
222
- },
223
- categoriesBySlug: {}
224
- };
225
- const ability = (0, import_selectors.getAbility)(
226
- stateWithNamespaced,
227
- "my-plugin/feature-action"
228
- );
229
- expect(ability).toEqual(
230
- stateWithNamespaced.abilitiesByName["my-plugin/feature-action"]
231
- );
232
- });
233
- });
234
- describe("getAbilityCategories", () => {
235
- it("should return all categories as an array", () => {
236
- const state = {
237
- abilitiesByName: {},
238
- categoriesBySlug: {
239
- "data-retrieval": {
240
- slug: "data-retrieval",
241
- label: "Data Retrieval",
242
- description: "Abilities that retrieve data"
243
- },
244
- "user-management": {
245
- slug: "user-management",
246
- label: "User Management",
247
- description: "Abilities for managing users"
248
- }
249
- }
250
- };
251
- const categories = (0, import_selectors.getAbilityCategories)(state);
252
- expect(categories).toHaveLength(2);
253
- expect(categories).toContainEqual(
254
- state.categoriesBySlug["data-retrieval"]
255
- );
256
- expect(categories).toContainEqual(
257
- state.categoriesBySlug["user-management"]
258
- );
259
- });
260
- it("should return empty array when no categories exist", () => {
261
- const state = {
262
- abilitiesByName: {},
263
- categoriesBySlug: {}
264
- };
265
- const categories = (0, import_selectors.getAbilityCategories)(state);
266
- expect(categories).toEqual([]);
267
- });
268
- });
269
- describe("getAbilityCategory", () => {
270
- const state = {
271
- abilitiesByName: {},
272
- categoriesBySlug: {
273
- "data-retrieval": {
274
- slug: "data-retrieval",
275
- label: "Data Retrieval",
276
- description: "Abilities that retrieve data"
277
- },
278
- "user-management": {
279
- slug: "user-management",
280
- label: "User Management",
281
- description: "Abilities for managing users",
282
- meta: {
283
- priority: "high"
284
- }
285
- }
286
- }
287
- };
288
- it("should return a specific category by slug", () => {
289
- const category = (0, import_selectors.getAbilityCategory)(state, "data-retrieval");
290
- expect(category).toEqual(
291
- state.categoriesBySlug["data-retrieval"]
292
- );
293
- });
294
- it("should return null if category not found", () => {
295
- const category = (0, import_selectors.getAbilityCategory)(state, "non-existent");
296
- expect(category).toBeUndefined();
297
- });
298
- it("should handle empty state", () => {
299
- const emptyState = {
300
- abilitiesByName: {},
301
- categoriesBySlug: {}
302
- };
303
- const category = (0, import_selectors.getAbilityCategory)(emptyState, "data-retrieval");
304
- expect(category).toBeUndefined();
305
- });
306
- it("should return categories with meta", () => {
307
- const category = (0, import_selectors.getAbilityCategory)(state, "user-management");
308
- expect(category).toEqual(
309
- state.categoriesBySlug["user-management"]
310
- );
311
- expect(category?.meta).toBeDefined();
312
- expect(category?.meta?.priority).toBe("high");
313
- });
314
- it("should handle valid category slug formats", () => {
315
- const stateWithVariousSlugs = {
316
- abilitiesByName: {},
317
- categoriesBySlug: {
318
- simple: {
319
- slug: "simple",
320
- label: "Simple",
321
- description: "Simple slug"
322
- },
323
- "with-dashes": {
324
- slug: "with-dashes",
325
- label: "With Dashes",
326
- description: "Slug with dashes"
327
- },
328
- with123: {
329
- slug: "with123",
330
- label: "With Numbers",
331
- description: "Slug with numbers"
332
- }
333
- }
334
- };
335
- expect(
336
- (0, import_selectors.getAbilityCategory)(stateWithVariousSlugs, "simple")
337
- ).toEqual(stateWithVariousSlugs.categoriesBySlug.simple);
338
- expect(
339
- (0, import_selectors.getAbilityCategory)(stateWithVariousSlugs, "with-dashes")
340
- ).toEqual(
341
- stateWithVariousSlugs.categoriesBySlug["with-dashes"]
342
- );
343
- expect(
344
- (0, import_selectors.getAbilityCategory)(stateWithVariousSlugs, "with123")
345
- ).toEqual(stateWithVariousSlugs.categoriesBySlug.with123);
346
- });
347
- });
348
- });
349
- //# sourceMappingURL=selectors.test.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/store/tests/selectors.test.ts"],
4
- "sourcesContent": ["/**\n * Tests for store selectors.\n */\n\n/**\n * Internal dependencies\n */\nimport {\n\tgetAbilities,\n\tgetAbility,\n\tgetAbilityCategories,\n\tgetAbilityCategory,\n} from '../selectors';\nimport type { AbilitiesState } from '../../types';\n\ndescribe( 'Store Selectors', () => {\n\tdescribe( 'getAbilities', () => {\n\t\tit( 'should return all abilities as an array', () => {\n\t\t\tconst state: AbilitiesState = {\n\t\t\t\tabilitiesByName: {\n\t\t\t\t\t'test/ability1': {\n\t\t\t\t\t\tname: 'test/ability1',\n\t\t\t\t\t\tlabel: 'Test Ability 1',\n\t\t\t\t\t\tdescription: 'First test ability',\n\t\t\t\t\t\tcategory: 'test-category',\n\t\t\t\t\t\tinput_schema: { type: 'object' },\n\t\t\t\t\t\toutput_schema: { type: 'object' },\n\t\t\t\t\t},\n\t\t\t\t\t'test/ability2': {\n\t\t\t\t\t\tname: 'test/ability2',\n\t\t\t\t\t\tlabel: 'Test Ability 2',\n\t\t\t\t\t\tdescription: 'Second test ability',\n\t\t\t\t\t\tcategory: 'test-category',\n\t\t\t\t\t\tinput_schema: { type: 'object' },\n\t\t\t\t\t\toutput_schema: { type: 'object' },\n\t\t\t\t\t\tcallback: jest.fn(),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tcategoriesBySlug: {},\n\t\t\t};\n\n\t\t\tconst abilities = getAbilities( state );\n\n\t\t\texpect( abilities ).toHaveLength( 2 );\n\t\t\texpect( abilities ).toContainEqual(\n\t\t\t\tstate.abilitiesByName[ 'test/ability1' ]\n\t\t\t);\n\t\t\texpect( abilities ).toContainEqual(\n\t\t\t\tstate.abilitiesByName[ 'test/ability2' ]\n\t\t\t);\n\t\t} );\n\n\t\tit( 'should return empty array when no abilities exist', () => {\n\t\t\tconst state: AbilitiesState = {\n\t\t\t\tabilitiesByName: {},\n\t\t\t\tcategoriesBySlug: {},\n\t\t\t};\n\n\t\t\tconst abilities = getAbilities( state );\n\n\t\t\texpect( abilities ).toEqual( [] );\n\t\t} );\n\n\t\tit( 'should memoize results when state unchanged', () => {\n\t\t\tconst state: AbilitiesState = {\n\t\t\t\tabilitiesByName: {\n\t\t\t\t\t'test/ability': {\n\t\t\t\t\t\tname: 'test/ability',\n\t\t\t\t\t\tlabel: 'Test Ability',\n\t\t\t\t\t\tdescription: 'Test ability',\n\t\t\t\t\t\tcategory: 'test-category',\n\t\t\t\t\t\tinput_schema: { type: 'object' },\n\t\t\t\t\t\toutput_schema: { type: 'object' },\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tcategoriesBySlug: {},\n\t\t\t};\n\n\t\t\tconst result1 = getAbilities( state );\n\t\t\tconst result2 = getAbilities( state );\n\n\t\t\t// Should return the same reference when state unchanged\n\t\t\texpect( result1 ).toBe( result2 );\n\t\t} );\n\n\t\tit( 'should return new array reference when state changes', () => {\n\t\t\tconst state1: AbilitiesState = {\n\t\t\t\tabilitiesByName: {\n\t\t\t\t\t'test/ability1': {\n\t\t\t\t\t\tname: 'test/ability1',\n\t\t\t\t\t\tlabel: 'Test Ability 1',\n\t\t\t\t\t\tdescription: 'Test ability',\n\t\t\t\t\t\tcategory: 'test-category',\n\t\t\t\t\t\tinput_schema: { type: 'object' },\n\t\t\t\t\t\toutput_schema: { type: 'object' },\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tcategoriesBySlug: {},\n\t\t\t};\n\n\t\t\tconst state2: AbilitiesState = {\n\t\t\t\tabilitiesByName: {\n\t\t\t\t\t...state1.abilitiesByName,\n\t\t\t\t\t'test/ability2': {\n\t\t\t\t\t\tname: 'test/ability2',\n\t\t\t\t\t\tlabel: 'Test Ability 2',\n\t\t\t\t\t\tdescription: 'Another test ability',\n\t\t\t\t\t\tcategory: 'test-category',\n\t\t\t\t\t\tinput_schema: { type: 'object' },\n\t\t\t\t\t\toutput_schema: { type: 'object' },\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tcategoriesBySlug: {},\n\t\t\t};\n\n\t\t\tconst result1 = getAbilities( state1 );\n\t\t\tconst result2 = getAbilities( state2 );\n\n\t\t\t// Should return different references when state changes\n\t\t\texpect( result1 ).not.toBe( result2 );\n\t\t\texpect( result1 ).toHaveLength( 1 );\n\t\t\texpect( result2 ).toHaveLength( 2 );\n\t\t} );\n\n\t\tit( 'should filter abilities by category when category is provided', () => {\n\t\t\tconst state: AbilitiesState = {\n\t\t\t\tabilitiesByName: {\n\t\t\t\t\t'test/ability1': {\n\t\t\t\t\t\tname: 'test/ability1',\n\t\t\t\t\t\tlabel: 'Test Ability 1',\n\t\t\t\t\t\tdescription: 'First test ability',\n\t\t\t\t\t\tcategory: 'data-retrieval',\n\t\t\t\t\t\tinput_schema: { type: 'object' },\n\t\t\t\t\t\toutput_schema: { type: 'object' },\n\t\t\t\t\t},\n\t\t\t\t\t'test/ability2': {\n\t\t\t\t\t\tname: 'test/ability2',\n\t\t\t\t\t\tlabel: 'Test Ability 2',\n\t\t\t\t\t\tdescription: 'Second test ability',\n\t\t\t\t\t\tcategory: 'data-retrieval',\n\t\t\t\t\t\tinput_schema: { type: 'object' },\n\t\t\t\t\t\toutput_schema: { type: 'object' },\n\t\t\t\t\t},\n\t\t\t\t\t'test/ability3': {\n\t\t\t\t\t\tname: 'test/ability3',\n\t\t\t\t\t\tlabel: 'Test Ability 3',\n\t\t\t\t\t\tdescription: 'Third test ability',\n\t\t\t\t\t\tcategory: 'user-management',\n\t\t\t\t\t\tinput_schema: { type: 'object' },\n\t\t\t\t\t\toutput_schema: { type: 'object' },\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tcategoriesBySlug: {},\n\t\t\t};\n\n\t\t\tconst result = getAbilities( state, {\n\t\t\t\tcategory: 'data-retrieval',\n\t\t\t} );\n\n\t\t\texpect( result ).toHaveLength( 2 );\n\t\t\texpect( result ).toContainEqual(\n\t\t\t\texpect.objectContaining( { name: 'test/ability1' } )\n\t\t\t);\n\t\t\texpect( result ).toContainEqual(\n\t\t\t\texpect.objectContaining( { name: 'test/ability2' } )\n\t\t\t);\n\t\t\texpect( result ).not.toContainEqual(\n\t\t\t\texpect.objectContaining( { name: 'test/ability3' } )\n\t\t\t);\n\t\t} );\n\n\t\tit( 'should return empty array when no abilities match category', () => {\n\t\t\tconst state: AbilitiesState = {\n\t\t\t\tabilitiesByName: {\n\t\t\t\t\t'test/ability1': {\n\t\t\t\t\t\tname: 'test/ability1',\n\t\t\t\t\t\tlabel: 'Test Ability 1',\n\t\t\t\t\t\tdescription: 'First test ability',\n\t\t\t\t\t\tcategory: 'data-retrieval',\n\t\t\t\t\t\tinput_schema: { type: 'object' },\n\t\t\t\t\t\toutput_schema: { type: 'object' },\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tcategoriesBySlug: {},\n\t\t\t};\n\n\t\t\tconst result = getAbilities( state, {\n\t\t\t\tcategory: 'non-existent-category',\n\t\t\t} );\n\n\t\t\texpect( result ).toEqual( [] );\n\t\t} );\n\t} );\n\n\tdescribe( 'getAbility', () => {\n\t\tconst state: AbilitiesState = {\n\t\t\tabilitiesByName: {\n\t\t\t\t'test/ability1': {\n\t\t\t\t\tname: 'test/ability1',\n\t\t\t\t\tlabel: 'Test Ability 1',\n\t\t\t\t\tdescription: 'First test ability',\n\t\t\t\t\tcategory: 'test-category',\n\t\t\t\t\tinput_schema: { type: 'object' },\n\t\t\t\t\toutput_schema: { type: 'object' },\n\t\t\t\t},\n\t\t\t\t'test/ability2': {\n\t\t\t\t\tname: 'test/ability2',\n\t\t\t\t\tlabel: 'Test Ability 2',\n\t\t\t\t\tdescription: 'Second test ability',\n\t\t\t\t\tcategory: 'test-category',\n\t\t\t\t\tinput_schema: { type: 'object' },\n\t\t\t\t\toutput_schema: { type: 'object' },\n\t\t\t\t\tcallback: jest.fn(),\n\t\t\t\t},\n\t\t\t},\n\t\t\tcategoriesBySlug: {},\n\t\t};\n\n\t\tit( 'should return a specific ability by name', () => {\n\t\t\tconst ability = getAbility( state, 'test/ability1' );\n\n\t\t\texpect( ability ).toEqual(\n\t\t\t\tstate.abilitiesByName[ 'test/ability1' ]\n\t\t\t);\n\t\t} );\n\n\t\tit( 'should return null if ability not found', () => {\n\t\t\tconst ability = getAbility( state, 'non-existent' );\n\n\t\t\texpect( ability ).toBeUndefined();\n\t\t} );\n\n\t\tit( 'should handle empty state', () => {\n\t\t\tconst emptyState: AbilitiesState = {\n\t\t\t\tabilitiesByName: {},\n\t\t\t\tcategoriesBySlug: {},\n\t\t\t};\n\n\t\t\tconst ability = getAbility( emptyState, 'test/ability' );\n\n\t\t\texpect( ability ).toBeUndefined();\n\t\t} );\n\n\t\tit( 'should return client abilities with callbacks', () => {\n\t\t\tconst ability = getAbility( state, 'test/ability2' );\n\n\t\t\texpect( ability ).toEqual(\n\t\t\t\tstate.abilitiesByName[ 'test/ability2' ]\n\t\t\t);\n\t\t\texpect( ability?.callback ).toBeDefined();\n\t\t} );\n\n\t\tit( 'should handle valid namespaced ability names correctly', () => {\n\t\t\tconst stateWithNamespaced: AbilitiesState = {\n\t\t\t\tabilitiesByName: {\n\t\t\t\t\t'my-plugin/feature-action': {\n\t\t\t\t\t\tname: 'my-plugin/feature-action',\n\t\t\t\t\t\tlabel: 'Namespaced Action',\n\t\t\t\t\t\tdescription: 'Namespaced ability',\n\t\t\t\t\t\tcategory: 'test-category',\n\t\t\t\t\t\tinput_schema: { type: 'object' },\n\t\t\t\t\t\toutput_schema: { type: 'object' },\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tcategoriesBySlug: {},\n\t\t\t};\n\n\t\t\tconst ability = getAbility(\n\t\t\t\tstateWithNamespaced,\n\t\t\t\t'my-plugin/feature-action'\n\t\t\t);\n\n\t\t\texpect( ability ).toEqual(\n\t\t\t\tstateWithNamespaced.abilitiesByName[\n\t\t\t\t\t'my-plugin/feature-action'\n\t\t\t\t]\n\t\t\t);\n\t\t} );\n\t} );\n\n\tdescribe( 'getAbilityCategories', () => {\n\t\tit( 'should return all categories as an array', () => {\n\t\t\tconst state: AbilitiesState = {\n\t\t\t\tabilitiesByName: {},\n\t\t\t\tcategoriesBySlug: {\n\t\t\t\t\t'data-retrieval': {\n\t\t\t\t\t\tslug: 'data-retrieval',\n\t\t\t\t\t\tlabel: 'Data Retrieval',\n\t\t\t\t\t\tdescription: 'Abilities that retrieve data',\n\t\t\t\t\t},\n\t\t\t\t\t'user-management': {\n\t\t\t\t\t\tslug: 'user-management',\n\t\t\t\t\t\tlabel: 'User Management',\n\t\t\t\t\t\tdescription: 'Abilities for managing users',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t};\n\n\t\t\tconst categories = getAbilityCategories( state );\n\n\t\t\texpect( categories ).toHaveLength( 2 );\n\t\t\texpect( categories ).toContainEqual(\n\t\t\t\tstate.categoriesBySlug[ 'data-retrieval' ]\n\t\t\t);\n\t\t\texpect( categories ).toContainEqual(\n\t\t\t\tstate.categoriesBySlug[ 'user-management' ]\n\t\t\t);\n\t\t} );\n\n\t\tit( 'should return empty array when no categories exist', () => {\n\t\t\tconst state: AbilitiesState = {\n\t\t\t\tabilitiesByName: {},\n\t\t\t\tcategoriesBySlug: {},\n\t\t\t};\n\n\t\t\tconst categories = getAbilityCategories( state );\n\n\t\t\texpect( categories ).toEqual( [] );\n\t\t} );\n\t} );\n\n\tdescribe( 'getAbilityCategory', () => {\n\t\tconst state: AbilitiesState = {\n\t\t\tabilitiesByName: {},\n\t\t\tcategoriesBySlug: {\n\t\t\t\t'data-retrieval': {\n\t\t\t\t\tslug: 'data-retrieval',\n\t\t\t\t\tlabel: 'Data Retrieval',\n\t\t\t\t\tdescription: 'Abilities that retrieve data',\n\t\t\t\t},\n\t\t\t\t'user-management': {\n\t\t\t\t\tslug: 'user-management',\n\t\t\t\t\tlabel: 'User Management',\n\t\t\t\t\tdescription: 'Abilities for managing users',\n\t\t\t\t\tmeta: {\n\t\t\t\t\t\tpriority: 'high',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\n\t\tit( 'should return a specific category by slug', () => {\n\t\t\tconst category = getAbilityCategory( state, 'data-retrieval' );\n\n\t\t\texpect( category ).toEqual(\n\t\t\t\tstate.categoriesBySlug[ 'data-retrieval' ]\n\t\t\t);\n\t\t} );\n\n\t\tit( 'should return null if category not found', () => {\n\t\t\tconst category = getAbilityCategory( state, 'non-existent' );\n\n\t\t\texpect( category ).toBeUndefined();\n\t\t} );\n\n\t\tit( 'should handle empty state', () => {\n\t\t\tconst emptyState: AbilitiesState = {\n\t\t\t\tabilitiesByName: {},\n\t\t\t\tcategoriesBySlug: {},\n\t\t\t};\n\n\t\t\tconst category = getAbilityCategory( emptyState, 'data-retrieval' );\n\n\t\t\texpect( category ).toBeUndefined();\n\t\t} );\n\n\t\tit( 'should return categories with meta', () => {\n\t\t\tconst category = getAbilityCategory( state, 'user-management' );\n\n\t\t\texpect( category ).toEqual(\n\t\t\t\tstate.categoriesBySlug[ 'user-management' ]\n\t\t\t);\n\t\t\texpect( category?.meta ).toBeDefined();\n\t\t\texpect( category?.meta?.priority ).toBe( 'high' );\n\t\t} );\n\n\t\tit( 'should handle valid category slug formats', () => {\n\t\t\tconst stateWithVariousSlugs: AbilitiesState = {\n\t\t\t\tabilitiesByName: {},\n\t\t\t\tcategoriesBySlug: {\n\t\t\t\t\tsimple: {\n\t\t\t\t\t\tslug: 'simple',\n\t\t\t\t\t\tlabel: 'Simple',\n\t\t\t\t\t\tdescription: 'Simple slug',\n\t\t\t\t\t},\n\t\t\t\t\t'with-dashes': {\n\t\t\t\t\t\tslug: 'with-dashes',\n\t\t\t\t\t\tlabel: 'With Dashes',\n\t\t\t\t\t\tdescription: 'Slug with dashes',\n\t\t\t\t\t},\n\t\t\t\t\twith123: {\n\t\t\t\t\t\tslug: 'with123',\n\t\t\t\t\t\tlabel: 'With Numbers',\n\t\t\t\t\t\tdescription: 'Slug with numbers',\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t};\n\n\t\t\texpect(\n\t\t\t\tgetAbilityCategory( stateWithVariousSlugs, 'simple' )\n\t\t\t).toEqual( stateWithVariousSlugs.categoriesBySlug.simple );\n\t\t\texpect(\n\t\t\t\tgetAbilityCategory( stateWithVariousSlugs, 'with-dashes' )\n\t\t\t).toEqual(\n\t\t\t\tstateWithVariousSlugs.categoriesBySlug[ 'with-dashes' ]\n\t\t\t);\n\t\t\texpect(\n\t\t\t\tgetAbilityCategory( stateWithVariousSlugs, 'with123' )\n\t\t\t).toEqual( stateWithVariousSlugs.categoriesBySlug.with123 );\n\t\t} );\n\t} );\n} );\n"],
5
- "mappings": "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",
6
- "names": []
7
- }