@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/actions.test.ts"],
4
- "sourcesContent": ["/**\n * Tests for store actions.\n */\n\n/**\n * WordPress dependencies\n */\nimport { resolveSelect } from '@wordpress/data';\n\n/**\n * Internal dependencies\n */\nimport {\n\treceiveAbilities,\n\tregisterAbility,\n\tunregisterAbility,\n\treceiveCategories,\n\tregisterAbilityCategory,\n\tunregisterAbilityCategory,\n} from '../actions';\nimport {\n\tRECEIVE_ABILITIES,\n\tREGISTER_ABILITY,\n\tUNREGISTER_ABILITY,\n\tRECEIVE_CATEGORIES,\n\tREGISTER_ABILITY_CATEGORY,\n\tUNREGISTER_ABILITY_CATEGORY,\n} from '../constants';\nimport type {\n\tAbility,\n\tAbilityCategory,\n\tAbilityCategoryArgs,\n} from '../../types';\n\n// Mock the WordPress data store\njest.mock( '@wordpress/data', () => ( {\n\tresolveSelect: jest.fn(),\n} ) );\n\ndescribe( 'Store Actions', () => {\n\tdescribe( 'receiveAbilities', () => {\n\t\tit( 'should create an action to receive abilities', () => {\n\t\t\tconst abilities: 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];\n\n\t\t\tconst action = receiveAbilities( abilities );\n\n\t\t\texpect( action ).toEqual( {\n\t\t\t\ttype: RECEIVE_ABILITIES,\n\t\t\t\tabilities,\n\t\t\t} );\n\t\t} );\n\n\t\tit( 'should handle empty abilities array', () => {\n\t\t\tconst abilities: Ability[] = [];\n\t\t\tconst action = receiveAbilities( abilities );\n\n\t\t\texpect( action ).toEqual( {\n\t\t\t\ttype: RECEIVE_ABILITIES,\n\t\t\t\tabilities: [],\n\t\t\t} );\n\t\t} );\n\t} );\n\n\tdescribe( 'registerAbility', () => {\n\t\tlet mockSelect: any;\n\t\tlet mockDispatch: jest.Mock;\n\n\t\tbeforeEach( () => {\n\t\t\tjest.clearAllMocks();\n\t\t\tconst defaultCategories = [\n\t\t\t\t{\n\t\t\t\t\tslug: 'test-category',\n\t\t\t\t\tlabel: 'Test Category',\n\t\t\t\t\tdescription: 'Test category for testing',\n\t\t\t\t},\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\tmockSelect = {\n\t\t\t\tgetAbility: jest.fn().mockReturnValue( null ),\n\t\t\t\tgetAbilityCategories: jest\n\t\t\t\t\t.fn()\n\t\t\t\t\t.mockReturnValue( defaultCategories ),\n\t\t\t\tgetAbilityCategory: jest.fn().mockImplementation( ( slug ) => {\n\t\t\t\t\tconst categories: Record< string, any > = {\n\t\t\t\t\t\t'test-category': {\n\t\t\t\t\t\t\tslug: 'test-category',\n\t\t\t\t\t\t\tlabel: 'Test Category',\n\t\t\t\t\t\t\tdescription: 'Test category for testing',\n\t\t\t\t\t\t},\n\t\t\t\t\t\t'data-retrieval': {\n\t\t\t\t\t\t\tslug: 'data-retrieval',\n\t\t\t\t\t\t\tlabel: 'Data Retrieval',\n\t\t\t\t\t\t\tdescription: 'Abilities that retrieve data',\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t\treturn categories[ slug ] || null;\n\t\t\t\t} ),\n\t\t\t};\n\t\t\tmockDispatch = jest.fn();\n\n\t\t\t// Mock resolveSelect to return categories\n\t\t\t( resolveSelect as jest.Mock ).mockReturnValue( {\n\t\t\t\tgetAbilityCategories: jest\n\t\t\t\t\t.fn()\n\t\t\t\t\t.mockResolvedValue( defaultCategories ),\n\t\t\t} );\n\t\t} );\n\n\t\tit( 'should register a valid client ability', async () => {\n\t\t\tconst ability: 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: {\n\t\t\t\t\ttype: 'object',\n\t\t\t\t\tproperties: {\n\t\t\t\t\t\tmessage: { type: 'string' },\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\toutput_schema: {\n\t\t\t\t\ttype: 'object',\n\t\t\t\t\tproperties: {\n\t\t\t\t\t\tsuccess: { type: 'boolean' },\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tcallback: jest.fn(),\n\t\t\t};\n\n\t\t\tconst action = registerAbility( ability );\n\t\t\tawait action( { select: mockSelect, dispatch: mockDispatch } );\n\n\t\t\texpect( mockDispatch ).toHaveBeenCalledWith( {\n\t\t\t\ttype: REGISTER_ABILITY,\n\t\t\t\tability,\n\t\t\t} );\n\t\t} );\n\n\t\tit( 'should register server-side abilities', async () => {\n\t\t\tconst ability: Ability = {\n\t\t\t\tname: 'test/server-ability',\n\t\t\t\tlabel: 'Server Ability',\n\t\t\t\tdescription: 'Server-side 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 action = registerAbility( ability );\n\t\t\tawait action( { select: mockSelect, dispatch: mockDispatch } );\n\n\t\t\texpect( mockDispatch ).toHaveBeenCalledWith( {\n\t\t\t\ttype: REGISTER_ABILITY,\n\t\t\t\tability,\n\t\t\t} );\n\t\t} );\n\n\t\tit( 'should validate and reject ability without name', async () => {\n\t\t\tconst ability: Ability = {\n\t\t\t\tname: '',\n\t\t\t\tlabel: 'Test Ability',\n\t\t\t\tdescription: 'Test description',\n\t\t\t\tcategory: 'test-category',\n\t\t\t\tcallback: jest.fn(),\n\t\t\t};\n\n\t\t\tconst action = registerAbility( ability );\n\n\t\t\tawait expect(\n\t\t\t\taction( { select: mockSelect, dispatch: mockDispatch } )\n\t\t\t).rejects.toThrow( 'Ability name is required' );\n\t\t\texpect( mockDispatch ).not.toHaveBeenCalled();\n\t\t} );\n\n\t\tit( 'should validate and reject ability with invalid name format', async () => {\n\t\t\tconst testCases = [\n\t\t\t\t'invalid', // No namespace\n\t\t\t\t'my-plugin/feature/action', // Multiple slashes\n\t\t\t\t'My-Plugin/feature', // Uppercase letters\n\t\t\t\t'my_plugin/feature', // Underscores not allowed\n\t\t\t\t'my-plugin/feature!', // Special characters not allowed\n\t\t\t\t'my plugin/feature', // Spaces not allowed\n\t\t\t];\n\n\t\t\tfor ( const invalidName of testCases ) {\n\t\t\t\tconst ability: Ability = {\n\t\t\t\t\tname: invalidName,\n\t\t\t\t\tlabel: 'Test Ability',\n\t\t\t\t\tdescription: 'Test description',\n\t\t\t\t\tcategory: 'test-category',\n\t\t\t\t\tcallback: jest.fn(),\n\t\t\t\t};\n\n\t\t\t\tconst action = registerAbility( ability );\n\n\t\t\t\tawait expect(\n\t\t\t\t\taction( { select: mockSelect, dispatch: mockDispatch } )\n\t\t\t\t).rejects.toThrow(\n\t\t\t\t\t'Ability name must be a string containing a namespace prefix'\n\t\t\t\t);\n\t\t\t\texpect( mockDispatch ).not.toHaveBeenCalled();\n\t\t\t\tmockDispatch.mockClear();\n\t\t\t}\n\t\t} );\n\n\t\tit( 'should validate and reject ability without label', async () => {\n\t\t\tconst ability: Ability = {\n\t\t\t\tname: 'test/ability',\n\t\t\t\tlabel: '',\n\t\t\t\tdescription: 'Test description',\n\t\t\t\tcategory: 'test-category',\n\t\t\t\tcallback: jest.fn(),\n\t\t\t};\n\n\t\t\tconst action = registerAbility( ability );\n\n\t\t\tawait expect(\n\t\t\t\taction( { select: mockSelect, dispatch: mockDispatch } )\n\t\t\t).rejects.toThrow( 'Ability \"test/ability\" must have a label' );\n\t\t\texpect( mockDispatch ).not.toHaveBeenCalled();\n\t\t} );\n\n\t\tit( 'should validate and reject ability without description', async () => {\n\t\t\tconst ability: Ability = {\n\t\t\t\tname: 'test/ability',\n\t\t\t\tlabel: 'Test Ability',\n\t\t\t\tdescription: '',\n\t\t\t\tcategory: 'test-category',\n\t\t\t\tcallback: jest.fn(),\n\t\t\t};\n\n\t\t\tconst action = registerAbility( ability );\n\n\t\t\tawait expect(\n\t\t\t\taction( { select: mockSelect, dispatch: mockDispatch } )\n\t\t\t).rejects.toThrow(\n\t\t\t\t'Ability \"test/ability\" must have a description'\n\t\t\t);\n\t\t\texpect( mockDispatch ).not.toHaveBeenCalled();\n\t\t} );\n\n\t\tit( 'should validate and reject ability without category', async () => {\n\t\t\tconst ability: Ability = {\n\t\t\t\tname: 'test/ability',\n\t\t\t\tlabel: 'Test Ability',\n\t\t\t\tdescription: 'Test description',\n\t\t\t\tcategory: '',\n\t\t\t\tcallback: jest.fn(),\n\t\t\t};\n\n\t\t\tconst action = registerAbility( ability );\n\n\t\t\tawait expect(\n\t\t\t\taction( { select: mockSelect, dispatch: mockDispatch } )\n\t\t\t).rejects.toThrow( 'Ability \"test/ability\" must have a category' );\n\t\t\texpect( mockDispatch ).not.toHaveBeenCalled();\n\t\t} );\n\n\t\tit( 'should validate and reject ability with invalid category format', async () => {\n\t\t\tconst testCases = [\n\t\t\t\t'Data-Retrieval', // Uppercase letters\n\t\t\t\t'data_retrieval', // Underscores not allowed\n\t\t\t\t'data.retrieval', // Dots not allowed\n\t\t\t\t'data/retrieval', // Slashes not allowed\n\t\t\t\t'-data-retrieval', // Leading dash\n\t\t\t\t'data-retrieval-', // Trailing dash\n\t\t\t\t'data--retrieval', // Double dash\n\t\t\t];\n\n\t\t\tfor ( const invalidCategory of testCases ) {\n\t\t\t\tconst ability: Ability = {\n\t\t\t\t\tname: 'test/ability',\n\t\t\t\t\tlabel: 'Test Ability',\n\t\t\t\t\tdescription: 'Test description',\n\t\t\t\t\tcategory: invalidCategory,\n\t\t\t\t\tcallback: jest.fn(),\n\t\t\t\t};\n\n\t\t\t\tconst action = registerAbility( ability );\n\n\t\t\t\tawait expect(\n\t\t\t\t\taction( { select: mockSelect, dispatch: mockDispatch } )\n\t\t\t\t).rejects.toThrow(\n\t\t\t\t\t'Ability \"test/ability\" has an invalid category. Category must be lowercase alphanumeric with dashes only'\n\t\t\t\t);\n\t\t\t\texpect( mockDispatch ).not.toHaveBeenCalled();\n\t\t\t\tmockDispatch.mockClear();\n\t\t\t}\n\t\t} );\n\n\t\tit( 'should accept ability with valid category format', async () => {\n\t\t\tconst validCategories = [\n\t\t\t\t'data-retrieval',\n\t\t\t\t'user-management',\n\t\t\t\t'analytics-123',\n\t\t\t\t'ecommerce',\n\t\t\t];\n\n\t\t\tfor ( const validCategory of validCategories ) {\n\t\t\t\tconst ability: Ability = {\n\t\t\t\t\tname: 'test/ability-' + validCategory,\n\t\t\t\t\tlabel: 'Test Ability',\n\t\t\t\t\tdescription: 'Test description',\n\t\t\t\t\tcategory: validCategory,\n\t\t\t\t\tcallback: jest.fn(),\n\t\t\t\t};\n\n\t\t\t\tconst categoriesForTest = [\n\t\t\t\t\t{\n\t\t\t\t\t\tslug: 'test-category',\n\t\t\t\t\t\tlabel: 'Test Category',\n\t\t\t\t\t\tdescription: 'Test category for testing',\n\t\t\t\t\t},\n\t\t\t\t\t{\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{\n\t\t\t\t\t\tslug: validCategory,\n\t\t\t\t\t\tlabel: 'Test Category',\n\t\t\t\t\t\tdescription: 'Test',\n\t\t\t\t\t},\n\t\t\t\t];\n\n\t\t\t\t// Mock both select and resolveSelect\n\t\t\t\tmockSelect.getAbilityCategories.mockReturnValue(\n\t\t\t\t\tcategoriesForTest\n\t\t\t\t);\n\t\t\t\t( resolveSelect as jest.Mock ).mockReturnValue( {\n\t\t\t\t\tgetAbilityCategories: jest\n\t\t\t\t\t\t.fn()\n\t\t\t\t\t\t.mockResolvedValue( categoriesForTest ),\n\t\t\t\t} );\n\n\t\t\t\tmockSelect.getAbility.mockReturnValue( null );\n\t\t\t\tmockDispatch.mockClear();\n\n\t\t\t\tconst action = registerAbility( ability );\n\t\t\t\tawait action( { select: mockSelect, dispatch: mockDispatch } );\n\n\t\t\t\texpect( mockDispatch ).toHaveBeenCalledWith( {\n\t\t\t\t\ttype: REGISTER_ABILITY,\n\t\t\t\t\tability,\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\n\t\tit( 'should validate and reject ability with non-existent category', async () => {\n\t\t\tmockSelect.getAbilityCategories.mockReturnValue( [\n\t\t\t\t{\n\t\t\t\t\tslug: 'test-category',\n\t\t\t\t\tlabel: 'Test Category',\n\t\t\t\t\tdescription: 'Test category for testing',\n\t\t\t\t},\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 ability: Ability = {\n\t\t\t\tname: 'test/ability',\n\t\t\t\tlabel: 'Test Ability',\n\t\t\t\tdescription: 'Test description',\n\t\t\t\tcategory: 'non-existent-category',\n\t\t\t\tcallback: jest.fn(),\n\t\t\t};\n\n\t\t\tconst action = registerAbility( ability );\n\n\t\t\tawait expect(\n\t\t\t\taction( { select: mockSelect, dispatch: mockDispatch } )\n\t\t\t).rejects.toThrow(\n\t\t\t\t'Ability \"test/ability\" references non-existent category \"non-existent-category\". Please register the category first.'\n\t\t\t);\n\t\t\texpect( mockDispatch ).not.toHaveBeenCalled();\n\t\t} );\n\n\t\tit( 'should accept ability with existing category', async () => {\n\t\t\tconst categoriesForTest = [\n\t\t\t\t{\n\t\t\t\t\tslug: 'test-category',\n\t\t\t\t\tlabel: 'Test Category',\n\t\t\t\t\tdescription: 'Test category for testing',\n\t\t\t\t},\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\tmockSelect.getAbilityCategories.mockReturnValue(\n\t\t\t\tcategoriesForTest\n\t\t\t);\n\t\t\t( resolveSelect as jest.Mock ).mockReturnValue( {\n\t\t\t\tgetAbilityCategories: jest\n\t\t\t\t\t.fn()\n\t\t\t\t\t.mockResolvedValue( categoriesForTest ),\n\t\t\t} );\n\n\t\t\tconst ability: Ability = {\n\t\t\t\tname: 'test/ability',\n\t\t\t\tlabel: 'Test Ability',\n\t\t\t\tdescription: 'Test description',\n\t\t\t\tcategory: 'data-retrieval',\n\t\t\t\tcallback: jest.fn(),\n\t\t\t};\n\n\t\t\tconst action = registerAbility( ability );\n\t\t\tawait action( { select: mockSelect, dispatch: mockDispatch } );\n\n\t\t\t// resolveSelect should have been called to load categories\n\t\t\texpect( resolveSelect ).toHaveBeenCalledWith( 'core/abilities' );\n\t\t\texpect( mockDispatch ).toHaveBeenCalledWith( {\n\t\t\t\ttype: REGISTER_ABILITY,\n\t\t\t\tability,\n\t\t\t} );\n\t\t} );\n\n\t\tit( 'should validate and reject ability with invalid callback', async () => {\n\t\t\tconst ability: Ability = {\n\t\t\t\tname: 'test/ability',\n\t\t\t\tlabel: 'Test Ability',\n\t\t\t\tdescription: 'Test description',\n\t\t\t\tcategory: 'test-category',\n\t\t\t\tcallback: 'not a function' as any,\n\t\t\t};\n\n\t\t\tconst action = registerAbility( ability );\n\n\t\t\tawait expect(\n\t\t\t\taction( { select: mockSelect, dispatch: mockDispatch } )\n\t\t\t).rejects.toThrow(\n\t\t\t\t'Ability \"test/ability\" has an invalid callback. Callback must be a function'\n\t\t\t);\n\t\t\texpect( mockDispatch ).not.toHaveBeenCalled();\n\t\t} );\n\n\t\tit( 'should validate and reject already registered ability', async () => {\n\t\t\tconst existingAbility: Ability = {\n\t\t\t\tname: 'test/ability',\n\t\t\t\tlabel: 'Existing Ability',\n\t\t\t\tdescription: 'Already registered',\n\t\t\t\tcategory: 'test-category',\n\t\t\t};\n\n\t\t\tmockSelect.getAbility.mockReturnValue( existingAbility );\n\n\t\t\tconst ability: Ability = {\n\t\t\t\tname: 'test/ability',\n\t\t\t\tlabel: 'Test Ability',\n\t\t\t\tdescription: 'Test description',\n\t\t\t\tcategory: 'test-category',\n\t\t\t\tcallback: jest.fn(),\n\t\t\t};\n\n\t\t\tconst action = registerAbility( ability );\n\n\t\t\tawait expect(\n\t\t\t\taction( { select: mockSelect, dispatch: mockDispatch } )\n\t\t\t).rejects.toThrow( 'Ability \"test/ability\" is already registered' );\n\t\t\texpect( mockDispatch ).not.toHaveBeenCalled();\n\t\t} );\n\n\t\tit( 'should load categories using resolveSelect before validation', async () => {\n\t\t\tconst categories = [\n\t\t\t\t{\n\t\t\t\t\tslug: 'test-category',\n\t\t\t\t\tlabel: 'Test Category',\n\t\t\t\t\tdescription: 'Test category',\n\t\t\t\t},\n\t\t\t];\n\n\t\t\t// Mock resolveSelect to return categories directly\n\t\t\t( resolveSelect as jest.Mock ).mockReturnValue( {\n\t\t\t\tgetAbilityCategories: jest.fn().mockResolvedValue( categories ),\n\t\t\t} );\n\n\t\t\tconst ability: Ability = {\n\t\t\t\tname: 'test/ability',\n\t\t\t\tlabel: 'Test Ability',\n\t\t\t\tdescription: 'Test description',\n\t\t\t\tcategory: 'test-category',\n\t\t\t\tcallback: jest.fn(),\n\t\t\t};\n\n\t\t\tconst action = registerAbility( ability );\n\t\t\tawait action( { select: mockSelect, dispatch: mockDispatch } );\n\n\t\t\t// Should have called resolveSelect to load categories\n\t\t\texpect( resolveSelect ).toHaveBeenCalledWith( 'core/abilities' );\n\t\t\t// Should have successfully registered\n\t\t\texpect( mockDispatch ).toHaveBeenCalledWith( {\n\t\t\t\ttype: REGISTER_ABILITY,\n\t\t\t\tability,\n\t\t\t} );\n\t\t} );\n\t} );\n\n\tdescribe( 'unregisterAbility', () => {\n\t\tit( 'should create an action to unregister an ability', () => {\n\t\t\tconst abilityName = 'test/ability';\n\t\t\tconst action = unregisterAbility( abilityName );\n\n\t\t\texpect( action ).toEqual( {\n\t\t\t\ttype: UNREGISTER_ABILITY,\n\t\t\t\tname: abilityName,\n\t\t\t} );\n\t\t} );\n\n\t\tit( 'should handle valid namespaced ability names', () => {\n\t\t\tconst abilityName = 'my-plugin/feature-action';\n\t\t\tconst action = unregisterAbility( abilityName );\n\n\t\t\texpect( action ).toEqual( {\n\t\t\t\ttype: UNREGISTER_ABILITY,\n\t\t\t\tname: abilityName,\n\t\t\t} );\n\t\t} );\n\t} );\n\n\tdescribe( 'receiveCategories', () => {\n\t\tit( 'should create an action to receive categories', () => {\n\t\t\tconst categories: 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 action = receiveCategories( categories );\n\n\t\t\texpect( action ).toEqual( {\n\t\t\t\ttype: RECEIVE_CATEGORIES,\n\t\t\t\tcategories,\n\t\t\t} );\n\t\t} );\n\n\t\tit( 'should handle empty categories array', () => {\n\t\t\tconst categories: AbilityCategory[] = [];\n\t\t\tconst action = receiveCategories( categories );\n\n\t\t\texpect( action ).toEqual( {\n\t\t\t\ttype: RECEIVE_CATEGORIES,\n\t\t\t\tcategories: [],\n\t\t\t} );\n\t\t} );\n\t} );\n\n\tdescribe( 'registerAbilityCategory', () => {\n\t\tlet mockSelect: any;\n\t\tlet mockDispatch: jest.Mock;\n\n\t\tbeforeEach( () => {\n\t\t\tjest.clearAllMocks();\n\t\t\tmockSelect = {\n\t\t\t\tgetAbilityCategory: jest.fn().mockReturnValue( null ),\n\t\t\t\tgetAbilityCategories: jest.fn().mockReturnValue( [] ),\n\t\t\t};\n\t\t\tmockDispatch = jest.fn();\n\n\t\t\t// Mock resolveSelect to return a mock that resolves the getAbilityCategories call\n\t\t\t( resolveSelect as jest.Mock ).mockReturnValue( {\n\t\t\t\tgetAbilityCategories: jest.fn().mockResolvedValue( undefined ),\n\t\t\t} );\n\t\t} );\n\n\t\tit( 'should register a valid category', async () => {\n\t\t\tconst slug = 'test-category';\n\t\t\tconst args: AbilityCategoryArgs = {\n\t\t\t\tlabel: 'Test Category',\n\t\t\t\tdescription: 'A test category for testing',\n\t\t\t};\n\n\t\t\tconst action = registerAbilityCategory( slug, args );\n\t\t\tawait action( { select: mockSelect, dispatch: mockDispatch } );\n\n\t\t\texpect( mockDispatch ).toHaveBeenCalledWith( {\n\t\t\t\ttype: REGISTER_ABILITY_CATEGORY,\n\t\t\t\tcategory: {\n\t\t\t\t\tslug,\n\t\t\t\t\tlabel: args.label,\n\t\t\t\t\tdescription: args.description,\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\t\t} );\n\n\t\tit( 'should register a category with meta', async () => {\n\t\t\tconst slug = 'test-category';\n\t\t\tconst args: AbilityCategoryArgs = {\n\t\t\t\tlabel: 'Test Category',\n\t\t\t\tdescription: 'A test category',\n\t\t\t\tmeta: { foo: 'bar', nested: { key: 'value' } },\n\t\t\t};\n\n\t\t\tconst action = registerAbilityCategory( slug, args );\n\t\t\tawait action( { select: mockSelect, dispatch: mockDispatch } );\n\n\t\t\texpect( mockDispatch ).toHaveBeenCalledWith( {\n\t\t\t\ttype: REGISTER_ABILITY_CATEGORY,\n\t\t\t\tcategory: {\n\t\t\t\t\tslug,\n\t\t\t\t\tlabel: args.label,\n\t\t\t\t\tdescription: args.description,\n\t\t\t\t\tmeta: {\n\t\t\t\t\t\t...args.meta,\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\t\t} );\n\n\t\tit( 'should validate and reject empty slug', async () => {\n\t\t\tconst args: AbilityCategoryArgs = {\n\t\t\t\tlabel: 'Test',\n\t\t\t\tdescription: 'Test',\n\t\t\t};\n\n\t\t\tconst action = registerAbilityCategory( '', args );\n\n\t\t\tawait expect(\n\t\t\t\taction( { select: mockSelect, dispatch: mockDispatch } )\n\t\t\t).rejects.toThrow( 'Category slug is required' );\n\t\t\texpect( mockDispatch ).not.toHaveBeenCalled();\n\t\t} );\n\n\t\tit( 'should validate and reject invalid slug formats', async () => {\n\t\t\tconst testCases = [\n\t\t\t\t'Data-Retrieval', // Uppercase\n\t\t\t\t'data_retrieval', // Underscores\n\t\t\t\t'data.retrieval', // Dots\n\t\t\t\t'data/retrieval', // Slashes\n\t\t\t\t'-data-retrieval', // Leading dash\n\t\t\t\t'data-retrieval-', // Trailing dash\n\t\t\t\t'data--retrieval', // Double dash\n\t\t\t\t'data retrieval', // Spaces\n\t\t\t\t'data!retrieval', // Special characters\n\t\t\t];\n\n\t\t\tconst args: AbilityCategoryArgs = {\n\t\t\t\tlabel: 'Test',\n\t\t\t\tdescription: 'Test',\n\t\t\t};\n\n\t\t\tfor ( const invalidSlug of testCases ) {\n\t\t\t\tconst action = registerAbilityCategory( invalidSlug, args );\n\n\t\t\t\tawait expect(\n\t\t\t\t\taction( { select: mockSelect, dispatch: mockDispatch } )\n\t\t\t\t).rejects.toThrow(\n\t\t\t\t\t'Category slug must contain only lowercase alphanumeric characters and dashes'\n\t\t\t\t);\n\t\t\t\texpect( mockDispatch ).not.toHaveBeenCalled();\n\t\t\t\tmockDispatch.mockClear();\n\t\t\t}\n\t\t} );\n\n\t\tit( 'should accept valid slug formats', async () => {\n\t\t\tconst validSlugs = [\n\t\t\t\t'data-retrieval',\n\t\t\t\t'user-management',\n\t\t\t\t'analytics-123',\n\t\t\t\t'ecommerce',\n\t\t\t\t'a',\n\t\t\t\t'123',\n\t\t\t\t'test-multiple-words-with-dashes',\n\t\t\t];\n\n\t\t\tconst args: AbilityCategoryArgs = {\n\t\t\t\tlabel: 'Test Category',\n\t\t\t\tdescription: 'Test description',\n\t\t\t};\n\n\t\t\tfor ( const validSlug of validSlugs ) {\n\t\t\t\tmockSelect.getAbilityCategory.mockReturnValue( null );\n\t\t\t\tmockDispatch.mockClear();\n\n\t\t\t\tconst action = registerAbilityCategory( validSlug, args );\n\t\t\t\tawait action( { select: mockSelect, dispatch: mockDispatch } );\n\n\t\t\t\texpect( mockDispatch ).toHaveBeenCalledWith( {\n\t\t\t\t\ttype: REGISTER_ABILITY_CATEGORY,\n\t\t\t\t\tcategory: {\n\t\t\t\t\t\tslug: validSlug,\n\t\t\t\t\t\tlabel: args.label,\n\t\t\t\t\t\tdescription: args.description,\n\t\t\t\t\t\tmeta: {\n\t\t\t\t\t\t\t_clientRegistered: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\n\t\tit( 'should validate and reject missing label', async () => {\n\t\t\tconst slug = 'test-category';\n\t\t\tconst args = {\n\t\t\t\tlabel: '',\n\t\t\t\tdescription: 'Test',\n\t\t\t} as AbilityCategoryArgs;\n\n\t\t\tconst action = registerAbilityCategory( slug, args );\n\n\t\t\tawait expect(\n\t\t\t\taction( { select: mockSelect, dispatch: mockDispatch } )\n\t\t\t).rejects.toThrow(\n\t\t\t\t'The category properties must contain a `label` string.'\n\t\t\t);\n\t\t\texpect( mockDispatch ).not.toHaveBeenCalled();\n\t\t} );\n\n\t\tit( 'should validate and reject non-string label', async () => {\n\t\t\tconst slug = 'test-category';\n\t\t\tconst args = {\n\t\t\t\tlabel: 123 as any,\n\t\t\t\tdescription: 'Test',\n\t\t\t};\n\n\t\t\tconst action = registerAbilityCategory( slug, args );\n\n\t\t\tawait expect(\n\t\t\t\taction( { select: mockSelect, dispatch: mockDispatch } )\n\t\t\t).rejects.toThrow(\n\t\t\t\t'The category properties must contain a `label` string.'\n\t\t\t);\n\t\t\texpect( mockDispatch ).not.toHaveBeenCalled();\n\t\t} );\n\n\t\tit( 'should validate and reject missing description', async () => {\n\t\t\tconst slug = 'test-category';\n\t\t\tconst args = {\n\t\t\t\tlabel: 'Test',\n\t\t\t\tdescription: '',\n\t\t\t} as AbilityCategoryArgs;\n\n\t\t\tconst action = registerAbilityCategory( slug, args );\n\n\t\t\tawait expect(\n\t\t\t\taction( { select: mockSelect, dispatch: mockDispatch } )\n\t\t\t).rejects.toThrow(\n\t\t\t\t'The category properties must contain a `description` string.'\n\t\t\t);\n\t\t\texpect( mockDispatch ).not.toHaveBeenCalled();\n\t\t} );\n\n\t\tit( 'should validate and reject non-string description', async () => {\n\t\t\tconst slug = 'test-category';\n\t\t\tconst args = {\n\t\t\t\tlabel: 'Test',\n\t\t\t\tdescription: 123 as any,\n\t\t\t};\n\n\t\t\tconst action = registerAbilityCategory( slug, args );\n\n\t\t\tawait expect(\n\t\t\t\taction( { select: mockSelect, dispatch: mockDispatch } )\n\t\t\t).rejects.toThrow(\n\t\t\t\t'The category properties must contain a `description` string.'\n\t\t\t);\n\t\t\texpect( mockDispatch ).not.toHaveBeenCalled();\n\t\t} );\n\n\t\tit( 'should validate and reject non-object meta', async () => {\n\t\t\tconst slug = 'test-category';\n\t\t\tconst args = {\n\t\t\t\tlabel: 'Test',\n\t\t\t\tdescription: 'Test',\n\t\t\t\tmeta: 'invalid' as any,\n\t\t\t};\n\n\t\t\tconst action = registerAbilityCategory( slug, args );\n\n\t\t\tawait expect(\n\t\t\t\taction( { select: mockSelect, dispatch: mockDispatch } )\n\t\t\t).rejects.toThrow(\n\t\t\t\t'The category properties should provide a valid `meta` object.'\n\t\t\t);\n\t\t\texpect( mockDispatch ).not.toHaveBeenCalled();\n\t\t} );\n\n\t\tit( 'should validate and reject array as meta', async () => {\n\t\t\tconst slug = 'test-category';\n\t\t\tconst args = {\n\t\t\t\tlabel: 'Test',\n\t\t\t\tdescription: 'Test',\n\t\t\t\tmeta: [ 'invalid' ] as any,\n\t\t\t};\n\n\t\t\tconst action = registerAbilityCategory( slug, args );\n\n\t\t\tawait expect(\n\t\t\t\taction( { select: mockSelect, dispatch: mockDispatch } )\n\t\t\t).rejects.toThrow(\n\t\t\t\t'The category properties should provide a valid `meta` object.'\n\t\t\t);\n\t\t\texpect( mockDispatch ).not.toHaveBeenCalled();\n\t\t} );\n\n\t\tit( 'should validate and reject already registered category', async () => {\n\t\t\tconst existingCategory: AbilityCategory = {\n\t\t\t\tslug: 'test-category',\n\t\t\t\tlabel: 'Existing Category',\n\t\t\t\tdescription: 'Already registered',\n\t\t\t};\n\n\t\t\tmockSelect.getAbilityCategory.mockReturnValue( existingCategory );\n\n\t\t\tconst args: AbilityCategoryArgs = {\n\t\t\t\tlabel: 'Test',\n\t\t\t\tdescription: 'Test',\n\t\t\t};\n\n\t\t\tconst action = registerAbilityCategory( 'test-category', args );\n\n\t\t\tawait expect(\n\t\t\t\taction( { select: mockSelect, dispatch: mockDispatch } )\n\t\t\t).rejects.toThrow(\n\t\t\t\t'Category \"test-category\" is already registered.'\n\t\t\t);\n\t\t\texpect( mockDispatch ).not.toHaveBeenCalled();\n\t\t} );\n\n\t\tit( 'should allow registering ability after registering category', async () => {\n\t\t\t// First register a category\n\t\t\tconst categorySlug = 'new-category';\n\t\t\tconst categoryArgs: AbilityCategoryArgs = {\n\t\t\t\tlabel: 'New Category',\n\t\t\t\tdescription: 'A newly registered category',\n\t\t\t};\n\n\t\t\tconst categoryAction = registerAbilityCategory(\n\t\t\t\tcategorySlug,\n\t\t\t\tcategoryArgs\n\t\t\t);\n\t\t\tawait categoryAction( {\n\t\t\t\tselect: mockSelect,\n\t\t\t\tdispatch: mockDispatch,\n\t\t\t} );\n\n\t\t\t// Verify category was registered\n\t\t\texpect( mockDispatch ).toHaveBeenCalledWith( {\n\t\t\t\ttype: REGISTER_ABILITY_CATEGORY,\n\t\t\t\tcategory: {\n\t\t\t\t\tslug: categorySlug,\n\t\t\t\t\tlabel: categoryArgs.label,\n\t\t\t\t\tdescription: categoryArgs.description,\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\t// Now mock that the category exists for ability registration\n\t\t\tconst categoriesWithNew = [\n\t\t\t\t{\n\t\t\t\t\tslug: categorySlug,\n\t\t\t\t\tlabel: categoryArgs.label,\n\t\t\t\t\tdescription: categoryArgs.description,\n\t\t\t\t},\n\t\t\t];\n\t\t\tmockSelect.getAbilityCategories = jest\n\t\t\t\t.fn()\n\t\t\t\t.mockReturnValue( categoriesWithNew );\n\t\t\t( resolveSelect as jest.Mock ).mockReturnValue( {\n\t\t\t\tgetAbilityCategories: jest\n\t\t\t\t\t.fn()\n\t\t\t\t\t.mockResolvedValue( categoriesWithNew ),\n\t\t\t} );\n\t\t\tmockSelect.getAbility = jest.fn().mockReturnValue( null );\n\t\t\tmockDispatch.mockClear();\n\n\t\t\t// Register an ability using the new category\n\t\t\tconst ability: Ability = {\n\t\t\t\tname: 'test/ability',\n\t\t\t\tlabel: 'Test Ability',\n\t\t\t\tdescription: 'Test description',\n\t\t\t\tcategory: categorySlug,\n\t\t\t\tcallback: jest.fn(),\n\t\t\t};\n\n\t\t\tconst abilityAction = registerAbility( ability );\n\t\t\tawait abilityAction( {\n\t\t\t\tselect: mockSelect,\n\t\t\t\tdispatch: mockDispatch,\n\t\t\t} );\n\n\t\t\t// Should successfully register with the new category\n\t\t\texpect( mockDispatch ).toHaveBeenCalledWith( {\n\t\t\t\ttype: REGISTER_ABILITY,\n\t\t\t\tability,\n\t\t\t} );\n\t\t} );\n\t} );\n\n\tdescribe( 'unregisterAbilityCategory', () => {\n\t\tit( 'should create an action to unregister a category', () => {\n\t\t\tconst slug = 'test-category';\n\t\t\tconst action = unregisterAbilityCategory( slug );\n\n\t\t\texpect( action ).toEqual( {\n\t\t\t\ttype: UNREGISTER_ABILITY_CATEGORY,\n\t\t\t\tslug,\n\t\t\t} );\n\t\t} );\n\n\t\tit( 'should handle valid category slugs', () => {\n\t\t\tconst slug = 'data-retrieval';\n\t\t\tconst action = unregisterAbilityCategory( slug );\n\n\t\t\texpect( action ).toEqual( {\n\t\t\t\ttype: UNREGISTER_ABILITY_CATEGORY,\n\t\t\t\tslug,\n\t\t\t} );\n\t\t} );\n\t} );\n} );\n"],
5
- "mappings": "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",
6
- "names": []
7
- }