@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,530 +0,0 @@
1
- // packages/abilities/src/tests/api.test.ts
2
- import { dispatch, select, resolveSelect } from "@wordpress/data";
3
- import apiFetch from "@wordpress/api-fetch";
4
- import {
5
- getAbilities,
6
- getAbility,
7
- getAbilityCategories,
8
- getAbilityCategory,
9
- registerAbility,
10
- unregisterAbility,
11
- executeAbility
12
- } from "../api";
13
- import { store } from "../store";
14
- jest.mock("@wordpress/data", () => ({
15
- dispatch: jest.fn(),
16
- select: jest.fn(),
17
- resolveSelect: jest.fn()
18
- }));
19
- jest.mock("@wordpress/api-fetch");
20
- jest.mock("../store", () => ({
21
- store: "abilities-api/store"
22
- }));
23
- describe("API functions", () => {
24
- beforeEach(() => {
25
- jest.clearAllMocks();
26
- });
27
- describe("getAbilities", () => {
28
- it("should resolve and return all abilities from the store", async () => {
29
- const mockAbilities = [
30
- {
31
- name: "test/ability1",
32
- label: "Test Ability 1",
33
- description: "First test ability",
34
- category: "test-category",
35
- input_schema: { type: "object" },
36
- output_schema: { type: "object" }
37
- },
38
- {
39
- name: "test/ability2",
40
- label: "Test Ability 2",
41
- description: "Second test ability",
42
- category: "test-category",
43
- input_schema: { type: "object" },
44
- output_schema: { type: "object" }
45
- }
46
- ];
47
- const mockGetAbilities = jest.fn().mockResolvedValue(mockAbilities);
48
- resolveSelect.mockReturnValue({
49
- getAbilities: mockGetAbilities
50
- });
51
- const result = await getAbilities();
52
- expect(resolveSelect).toHaveBeenCalledWith(store);
53
- expect(mockGetAbilities).toHaveBeenCalled();
54
- expect(result).toEqual(mockAbilities);
55
- });
56
- it("should pass category parameter to store when filtering", async () => {
57
- const mockAbilities = [
58
- {
59
- name: "test/ability1",
60
- label: "Test Ability 1",
61
- description: "First test ability",
62
- category: "data-retrieval",
63
- input_schema: { type: "object" },
64
- output_schema: { type: "object" }
65
- },
66
- {
67
- name: "test/ability2",
68
- label: "Test Ability 2",
69
- description: "Second test ability",
70
- category: "data-retrieval",
71
- input_schema: { type: "object" },
72
- output_schema: { type: "object" }
73
- }
74
- ];
75
- const mockGetAbilities = jest.fn().mockResolvedValue(mockAbilities);
76
- resolveSelect.mockReturnValue({
77
- getAbilities: mockGetAbilities
78
- });
79
- const result = await getAbilities({ category: "data-retrieval" });
80
- expect(resolveSelect).toHaveBeenCalledWith(store);
81
- expect(mockGetAbilities).toHaveBeenCalledWith({
82
- category: "data-retrieval"
83
- });
84
- expect(result).toEqual(mockAbilities);
85
- });
86
- });
87
- describe("getAbility", () => {
88
- it("should return a specific ability by name", async () => {
89
- const mockAbility = {
90
- name: "test/ability",
91
- label: "Test Ability",
92
- description: "Test ability description",
93
- category: "test-category",
94
- input_schema: { type: "object" },
95
- output_schema: { type: "object" }
96
- };
97
- const mockGetAbility = jest.fn().mockResolvedValue(mockAbility);
98
- resolveSelect.mockReturnValue({
99
- getAbility: mockGetAbility
100
- });
101
- const result = await getAbility("test/ability");
102
- expect(resolveSelect).toHaveBeenCalledWith(store);
103
- expect(mockGetAbility).toHaveBeenCalledWith("test/ability");
104
- expect(result).toEqual(mockAbility);
105
- });
106
- it("should return null if ability not found", async () => {
107
- const mockGetAbility = jest.fn().mockResolvedValue(null);
108
- resolveSelect.mockReturnValue({
109
- getAbility: mockGetAbility
110
- });
111
- const result = await getAbility("non-existent");
112
- expect(mockGetAbility).toHaveBeenCalledWith("non-existent");
113
- expect(result).toBeNull();
114
- });
115
- });
116
- describe("registerAbility", () => {
117
- it("should register a client-side ability with a callback", () => {
118
- const mockRegisterAbility = jest.fn();
119
- dispatch.mockReturnValue({
120
- registerAbility: mockRegisterAbility
121
- });
122
- select.mockReturnValue({
123
- getAbility: jest.fn().mockReturnValue(null)
124
- });
125
- const ability = {
126
- name: "test/client-ability",
127
- label: "Client Ability",
128
- description: "Test client ability",
129
- category: "test-category",
130
- input_schema: { type: "object" },
131
- output_schema: { type: "object" },
132
- callback: jest.fn()
133
- };
134
- registerAbility(ability);
135
- expect(dispatch).toHaveBeenCalledWith(store);
136
- expect(mockRegisterAbility).toHaveBeenCalledWith(ability);
137
- });
138
- });
139
- describe("unregisterAbility", () => {
140
- it("should unregister an ability", () => {
141
- const mockUnregisterAbility = jest.fn();
142
- dispatch.mockReturnValue({
143
- unregisterAbility: mockUnregisterAbility
144
- });
145
- unregisterAbility("test/ability");
146
- expect(dispatch).toHaveBeenCalledWith(store);
147
- expect(mockUnregisterAbility).toHaveBeenCalledWith(
148
- "test/ability"
149
- );
150
- });
151
- });
152
- describe("executeAbility", () => {
153
- it("should execute a server-side ability via API", async () => {
154
- const mockAbility = {
155
- name: "test/server-ability",
156
- label: "Server Ability",
157
- description: "Test server ability",
158
- category: "test-category",
159
- input_schema: {
160
- type: "object",
161
- properties: {
162
- message: { type: "string" }
163
- },
164
- required: ["message"]
165
- },
166
- output_schema: { type: "object" }
167
- };
168
- const mockGetAbility = jest.fn().mockResolvedValue(mockAbility);
169
- resolveSelect.mockReturnValue({
170
- getAbility: mockGetAbility
171
- });
172
- const mockResponse = { success: true, result: "test" };
173
- apiFetch.mockResolvedValue(
174
- mockResponse
175
- );
176
- const input = { message: "Hello" };
177
- const result = await executeAbility("test/server-ability", input);
178
- expect(mockGetAbility).toHaveBeenCalledWith(
179
- "test/server-ability"
180
- );
181
- expect(apiFetch).toHaveBeenCalledWith({
182
- path: "/wp-abilities/v1/abilities/test/server-ability/run",
183
- method: "POST",
184
- data: { input }
185
- });
186
- expect(result).toEqual(mockResponse);
187
- });
188
- it("should execute a client-side ability locally", async () => {
189
- const mockCallback = jest.fn().mockResolvedValue({ success: true });
190
- const mockAbility = {
191
- name: "test/client-ability",
192
- label: "Client Ability",
193
- description: "Test client ability",
194
- category: "test-category",
195
- input_schema: { type: "object" },
196
- output_schema: { type: "object" },
197
- callback: mockCallback
198
- };
199
- const mockGetAbility = jest.fn().mockResolvedValue(mockAbility);
200
- resolveSelect.mockReturnValue({
201
- getAbility: mockGetAbility
202
- });
203
- const input = { test: "data" };
204
- const result = await executeAbility("test/client-ability", input);
205
- expect(mockGetAbility).toHaveBeenCalledWith(
206
- "test/client-ability"
207
- );
208
- expect(mockCallback).toHaveBeenCalledWith(input);
209
- expect(apiFetch).not.toHaveBeenCalled();
210
- expect(result).toEqual({ success: true });
211
- });
212
- it("should throw error if ability not found", async () => {
213
- const mockGetAbility = jest.fn().mockResolvedValue(null);
214
- resolveSelect.mockReturnValue({
215
- getAbility: mockGetAbility
216
- });
217
- await expect(
218
- executeAbility("non-existent", {})
219
- ).rejects.toThrow("Ability not found: non-existent");
220
- });
221
- it("should validate input for client abilities", async () => {
222
- const mockCallback = jest.fn();
223
- const mockAbility = {
224
- name: "test/client-ability",
225
- label: "Client Ability",
226
- description: "Test client ability",
227
- category: "test-category",
228
- input_schema: {
229
- type: "object",
230
- properties: {
231
- message: { type: "string" }
232
- },
233
- required: ["message"]
234
- },
235
- output_schema: { type: "object" },
236
- callback: mockCallback
237
- };
238
- const mockGetAbility = jest.fn().mockResolvedValue(mockAbility);
239
- resolveSelect.mockReturnValue({
240
- getAbility: mockGetAbility
241
- });
242
- await expect(
243
- executeAbility("test/client-ability", {})
244
- ).rejects.toThrow("invalid input");
245
- });
246
- it("should execute a read-only ability via GET", async () => {
247
- const mockAbility = {
248
- name: "test/read-only",
249
- label: "Read-only Ability",
250
- description: "Test read-only ability.",
251
- category: "test-category",
252
- input_schema: {
253
- type: "object",
254
- properties: {
255
- id: { type: "string" },
256
- format: { type: "string" }
257
- }
258
- },
259
- output_schema: { type: "object" },
260
- meta: {
261
- annotations: { readonly: true }
262
- }
263
- };
264
- const mockGetAbility = jest.fn().mockResolvedValue(mockAbility);
265
- resolveSelect.mockReturnValue({
266
- getAbility: mockGetAbility
267
- });
268
- const mockResponse = { data: "read-only data" };
269
- apiFetch.mockResolvedValue(
270
- mockResponse
271
- );
272
- const input = { id: "123", format: "json" };
273
- const result = await executeAbility("test/read-only", input);
274
- expect(apiFetch).toHaveBeenCalledWith({
275
- path: "/wp-abilities/v1/abilities/test/read-only/run?input%5Bid%5D=123&input%5Bformat%5D=json",
276
- method: "GET"
277
- });
278
- expect(result).toEqual(mockResponse);
279
- });
280
- it("should execute a read-only ability with empty input", async () => {
281
- const mockAbility = {
282
- name: "test/read-only",
283
- label: "Read-only Ability",
284
- description: "Test read-only ability.",
285
- category: "test-category",
286
- input_schema: { type: "object" },
287
- output_schema: { type: "object" },
288
- meta: {
289
- annotations: { readonly: true }
290
- }
291
- };
292
- const mockGetAbility = jest.fn().mockResolvedValue(mockAbility);
293
- resolveSelect.mockReturnValue({
294
- getAbility: mockGetAbility
295
- });
296
- const mockResponse = { data: "read-only data" };
297
- apiFetch.mockResolvedValue(
298
- mockResponse
299
- );
300
- const result = await executeAbility("test/read-only", {});
301
- expect(apiFetch).toHaveBeenCalledWith({
302
- path: "/wp-abilities/v1/abilities/test/read-only/run?",
303
- method: "GET"
304
- });
305
- expect(result).toEqual(mockResponse);
306
- });
307
- it("should execute a destructive idempotent ability via DELETE", async () => {
308
- const mockAbility = {
309
- name: "test/destructive",
310
- label: "Destructive Ability",
311
- description: "Test destructive idempotent ability.",
312
- category: "test-category",
313
- input_schema: {
314
- type: "object",
315
- properties: {
316
- id: { type: "string" },
317
- format: { type: "string" }
318
- }
319
- },
320
- output_schema: { type: "string" },
321
- meta: {
322
- annotations: {
323
- destructive: true,
324
- idempotent: true
325
- }
326
- }
327
- };
328
- const mockGetAbility = jest.fn().mockResolvedValue(mockAbility);
329
- resolveSelect.mockReturnValue({
330
- getAbility: mockGetAbility
331
- });
332
- const mockResponse = "Item deleted successfully.";
333
- apiFetch.mockResolvedValue(
334
- mockResponse
335
- );
336
- const input = { id: "123", format: "json" };
337
- const result = await executeAbility("test/destructive", input);
338
- expect(apiFetch).toHaveBeenCalledWith({
339
- path: "/wp-abilities/v1/abilities/test/destructive/run?input%5Bid%5D=123&input%5Bformat%5D=json",
340
- method: "DELETE"
341
- });
342
- expect(result).toEqual(mockResponse);
343
- });
344
- it("should handle errors in client ability execution", async () => {
345
- const consoleErrorSpy = jest.spyOn(console, "error").mockImplementation();
346
- const executionError = new Error("Execution failed");
347
- const mockCallback = jest.fn().mockRejectedValue(executionError);
348
- const mockAbility = {
349
- name: "test/client-ability",
350
- label: "Client Ability",
351
- description: "Test client ability",
352
- category: "test-category",
353
- input_schema: { type: "object" },
354
- output_schema: { type: "object" },
355
- callback: mockCallback
356
- };
357
- const mockGetAbility = jest.fn().mockResolvedValue(mockAbility);
358
- resolveSelect.mockReturnValue({
359
- getAbility: mockGetAbility
360
- });
361
- await expect(
362
- executeAbility("test/client-ability", {})
363
- ).rejects.toThrow("Execution failed");
364
- expect(consoleErrorSpy).toHaveBeenCalledWith(
365
- "Error executing client ability test/client-ability:",
366
- executionError
367
- );
368
- consoleErrorSpy.mockRestore();
369
- });
370
- it("should handle errors in server ability execution", async () => {
371
- const consoleErrorSpy = jest.spyOn(console, "error").mockImplementation();
372
- const apiError = new Error("API request failed");
373
- const mockAbility = {
374
- name: "test/server-ability",
375
- label: "Server Ability",
376
- description: "Test server ability",
377
- category: "test-category",
378
- input_schema: { type: "object" },
379
- output_schema: { type: "object" }
380
- };
381
- const mockGetAbility = jest.fn().mockResolvedValue(mockAbility);
382
- resolveSelect.mockReturnValue({
383
- getAbility: mockGetAbility
384
- });
385
- apiFetch.mockRejectedValue(apiError);
386
- await expect(
387
- executeAbility("test/server-ability", {})
388
- ).rejects.toThrow("API request failed");
389
- expect(consoleErrorSpy).toHaveBeenCalledWith(
390
- "Error executing ability test/server-ability:",
391
- apiError
392
- );
393
- consoleErrorSpy.mockRestore();
394
- });
395
- it("should execute ability without callback as server ability", async () => {
396
- const mockAbility = {
397
- name: "test/ability",
398
- label: "Test Ability",
399
- description: "Test ability without callback",
400
- category: "test-category",
401
- input_schema: { type: "object" },
402
- output_schema: { type: "object" }
403
- // No callback - should execute as server ability
404
- };
405
- const mockGetAbility = jest.fn().mockResolvedValue(mockAbility);
406
- resolveSelect.mockReturnValue({
407
- getAbility: mockGetAbility
408
- });
409
- const mockResponse = { success: true };
410
- apiFetch.mockResolvedValue(
411
- mockResponse
412
- );
413
- const result = await executeAbility("test/ability", {
414
- data: "test"
415
- });
416
- expect(apiFetch).toHaveBeenCalledWith({
417
- path: "/wp-abilities/v1/abilities/test/ability/run",
418
- method: "POST",
419
- data: { input: { data: "test" } }
420
- });
421
- expect(result).toEqual(mockResponse);
422
- });
423
- it("should validate output for client abilities", async () => {
424
- const mockCallback = jest.fn().mockResolvedValue({ invalid: "response" });
425
- const mockAbility = {
426
- name: "test/client-ability",
427
- label: "Client Ability",
428
- description: "Test client ability",
429
- category: "test-category",
430
- input_schema: { type: "object" },
431
- output_schema: {
432
- type: "object",
433
- properties: {
434
- result: { type: "string" }
435
- },
436
- required: ["result"]
437
- },
438
- callback: mockCallback
439
- };
440
- const mockGetAbility = jest.fn().mockResolvedValue(mockAbility);
441
- resolveSelect.mockReturnValue({
442
- getAbility: mockGetAbility
443
- });
444
- await expect(
445
- executeAbility("test/client-ability", {})
446
- ).rejects.toThrow("invalid output");
447
- });
448
- });
449
- describe("getAbilityCategories", () => {
450
- it("should resolve and return all categories from the store", async () => {
451
- const mockCategories = [
452
- {
453
- slug: "data-retrieval",
454
- label: "Data Retrieval",
455
- description: "Abilities that retrieve data"
456
- },
457
- {
458
- slug: "user-management",
459
- label: "User Management",
460
- description: "Abilities for managing users"
461
- }
462
- ];
463
- const mockGetAbilityCategories = jest.fn().mockResolvedValue(mockCategories);
464
- resolveSelect.mockReturnValue({
465
- getAbilityCategories: mockGetAbilityCategories
466
- });
467
- const result = await getAbilityCategories();
468
- expect(resolveSelect).toHaveBeenCalledWith(store);
469
- expect(mockGetAbilityCategories).toHaveBeenCalled();
470
- expect(result).toEqual(mockCategories);
471
- });
472
- it("should return empty array when no categories exist", async () => {
473
- const mockGetAbilityCategories = jest.fn().mockResolvedValue([]);
474
- resolveSelect.mockReturnValue({
475
- getAbilityCategories: mockGetAbilityCategories
476
- });
477
- const result = await getAbilityCategories();
478
- expect(result).toEqual([]);
479
- });
480
- });
481
- describe("getAbilityCategory", () => {
482
- it("should return a specific category by slug", async () => {
483
- const mockCategory = {
484
- slug: "data-retrieval",
485
- label: "Data Retrieval",
486
- description: "Abilities that retrieve data"
487
- };
488
- const mockGetAbilityCategory = jest.fn().mockResolvedValue(mockCategory);
489
- resolveSelect.mockReturnValue({
490
- getAbilityCategory: mockGetAbilityCategory
491
- });
492
- const result = await getAbilityCategory("data-retrieval");
493
- expect(resolveSelect).toHaveBeenCalledWith(store);
494
- expect(mockGetAbilityCategory).toHaveBeenCalledWith(
495
- "data-retrieval"
496
- );
497
- expect(result).toEqual(mockCategory);
498
- });
499
- it("should return null if category not found", async () => {
500
- const mockGetAbilityCategory = jest.fn().mockResolvedValue(null);
501
- resolveSelect.mockReturnValue({
502
- getAbilityCategory: mockGetAbilityCategory
503
- });
504
- const result = await getAbilityCategory("non-existent");
505
- expect(mockGetAbilityCategory).toHaveBeenCalledWith(
506
- "non-existent"
507
- );
508
- expect(result).toBeNull();
509
- });
510
- it("should handle categories with meta", async () => {
511
- const mockCategory = {
512
- slug: "user-management",
513
- label: "User Management",
514
- description: "Abilities for managing users",
515
- meta: {
516
- priority: "high"
517
- }
518
- };
519
- const mockGetAbilityCategory = jest.fn().mockResolvedValue(mockCategory);
520
- resolveSelect.mockReturnValue({
521
- getAbilityCategory: mockGetAbilityCategory
522
- });
523
- const result = await getAbilityCategory("user-management");
524
- expect(result).toEqual(mockCategory);
525
- expect(result?.meta).toBeDefined();
526
- expect(result?.meta?.priority).toBe("high");
527
- });
528
- });
529
- });
530
- //# sourceMappingURL=api.test.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/tests/api.test.ts"],
4
- "sourcesContent": ["/**\n * Tests for API functions.\n */\n\n/**\n * WordPress dependencies\n */\nimport { dispatch, select, resolveSelect } from '@wordpress/data';\nimport apiFetch from '@wordpress/api-fetch';\n\n/**\n * Internal dependencies\n */\nimport {\n\tgetAbilities,\n\tgetAbility,\n\tgetAbilityCategories,\n\tgetAbilityCategory,\n\tregisterAbility,\n\tunregisterAbility,\n\texecuteAbility,\n} from '../api';\nimport { store } from '../store';\nimport type { Ability, AbilityCategory } from '../types';\n\n// Mock WordPress dependencies\njest.mock( '@wordpress/data', () => ( {\n\tdispatch: jest.fn(),\n\tselect: jest.fn(),\n\tresolveSelect: jest.fn(),\n} ) );\n\njest.mock( '@wordpress/api-fetch' );\n\njest.mock( '../store', () => ( {\n\tstore: 'abilities-api/store',\n} ) );\n\ndescribe( 'API functions', () => {\n\tbeforeEach( () => {\n\t\tjest.clearAllMocks();\n\t} );\n\n\tdescribe( 'getAbilities', () => {\n\t\tit( 'should resolve and return all abilities from the store', 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\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 mockGetAbilities = jest\n\t\t\t\t.fn()\n\t\t\t\t.mockResolvedValue( mockAbilities );\n\t\t\t( resolveSelect as jest.Mock ).mockReturnValue( {\n\t\t\t\tgetAbilities: mockGetAbilities,\n\t\t\t} );\n\n\t\t\tconst result = await getAbilities();\n\n\t\t\texpect( resolveSelect ).toHaveBeenCalledWith( store );\n\t\t\texpect( mockGetAbilities ).toHaveBeenCalled();\n\t\t\texpect( result ).toEqual( mockAbilities );\n\t\t} );\n\n\t\tit( 'should pass category parameter to store when filtering', 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: '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\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: '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 mockGetAbilities = jest\n\t\t\t\t.fn()\n\t\t\t\t.mockResolvedValue( mockAbilities );\n\t\t\t( resolveSelect as jest.Mock ).mockReturnValue( {\n\t\t\t\tgetAbilities: mockGetAbilities,\n\t\t\t} );\n\n\t\t\tconst result = await getAbilities( { category: 'data-retrieval' } );\n\n\t\t\texpect( resolveSelect ).toHaveBeenCalledWith( store );\n\t\t\texpect( mockGetAbilities ).toHaveBeenCalledWith( {\n\t\t\t\tcategory: 'data-retrieval',\n\t\t\t} );\n\t\t\texpect( result ).toEqual( mockAbilities );\n\t\t} );\n\t} );\n\n\tdescribe( 'getAbility', () => {\n\t\tit( 'should return a specific ability by name', 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 mockGetAbility = jest.fn().mockResolvedValue( mockAbility );\n\t\t\t( resolveSelect as jest.Mock ).mockReturnValue( {\n\t\t\t\tgetAbility: mockGetAbility,\n\t\t\t} );\n\n\t\t\tconst result = await getAbility( 'test/ability' );\n\n\t\t\texpect( resolveSelect ).toHaveBeenCalledWith( store );\n\t\t\texpect( mockGetAbility ).toHaveBeenCalledWith( 'test/ability' );\n\t\t\texpect( result ).toEqual( mockAbility );\n\t\t} );\n\n\t\tit( 'should return null if ability not found', async () => {\n\t\t\tconst mockGetAbility = jest.fn().mockResolvedValue( null );\n\t\t\t( resolveSelect as jest.Mock ).mockReturnValue( {\n\t\t\t\tgetAbility: mockGetAbility,\n\t\t\t} );\n\n\t\t\tconst result = await getAbility( 'non-existent' );\n\n\t\t\texpect( mockGetAbility ).toHaveBeenCalledWith( 'non-existent' );\n\t\t\texpect( result ).toBeNull();\n\t\t} );\n\t} );\n\n\tdescribe( 'registerAbility', () => {\n\t\tit( 'should register a client-side ability with a callback', () => {\n\t\t\tconst mockRegisterAbility = jest.fn();\n\t\t\t( dispatch as jest.Mock ).mockReturnValue( {\n\t\t\t\tregisterAbility: mockRegisterAbility,\n\t\t\t} );\n\n\t\t\t// Mock select to return no existing ability\n\t\t\t( select as jest.Mock ).mockReturnValue( {\n\t\t\t\tgetAbility: jest.fn().mockReturnValue( null ),\n\t\t\t} );\n\n\t\t\tconst ability = {\n\t\t\t\tname: 'test/client-ability',\n\t\t\t\tlabel: 'Client Ability',\n\t\t\t\tdescription: 'Test client 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\tcallback: jest.fn(),\n\t\t\t};\n\n\t\t\tregisterAbility( ability );\n\n\t\t\texpect( dispatch ).toHaveBeenCalledWith( store );\n\t\t\texpect( mockRegisterAbility ).toHaveBeenCalledWith( ability );\n\t\t} );\n\t} );\n\n\tdescribe( 'unregisterAbility', () => {\n\t\tit( 'should unregister an ability', () => {\n\t\t\tconst mockUnregisterAbility = jest.fn();\n\t\t\t( dispatch as jest.Mock ).mockReturnValue( {\n\t\t\t\tunregisterAbility: mockUnregisterAbility,\n\t\t\t} );\n\n\t\t\tunregisterAbility( 'test/ability' );\n\n\t\t\texpect( dispatch ).toHaveBeenCalledWith( store );\n\t\t\texpect( mockUnregisterAbility ).toHaveBeenCalledWith(\n\t\t\t\t'test/ability'\n\t\t\t);\n\t\t} );\n\t} );\n\n\tdescribe( 'executeAbility', () => {\n\t\tit( 'should execute a server-side ability via API', async () => {\n\t\t\tconst mockAbility: Ability = {\n\t\t\t\tname: 'test/server-ability',\n\t\t\t\tlabel: 'Server Ability',\n\t\t\t\tdescription: 'Test server ability',\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\trequired: [ 'message' ],\n\t\t\t\t},\n\t\t\t\toutput_schema: { type: 'object' },\n\t\t\t};\n\n\t\t\tconst mockGetAbility = jest.fn().mockResolvedValue( mockAbility );\n\t\t\t( resolveSelect as jest.Mock ).mockReturnValue( {\n\t\t\t\tgetAbility: mockGetAbility,\n\t\t\t} );\n\n\t\t\tconst mockResponse = { success: true, result: 'test' };\n\t\t\t( apiFetch as unknown as jest.Mock ).mockResolvedValue(\n\t\t\t\tmockResponse\n\t\t\t);\n\n\t\t\tconst input = { message: 'Hello' };\n\t\t\tconst result = await executeAbility( 'test/server-ability', input );\n\n\t\t\texpect( mockGetAbility ).toHaveBeenCalledWith(\n\t\t\t\t'test/server-ability'\n\t\t\t);\n\t\t\texpect( apiFetch ).toHaveBeenCalledWith( {\n\t\t\t\tpath: '/wp-abilities/v1/abilities/test/server-ability/run',\n\t\t\t\tmethod: 'POST',\n\t\t\t\tdata: { input },\n\t\t\t} );\n\t\t\texpect( result ).toEqual( mockResponse );\n\t\t} );\n\n\t\tit( 'should execute a client-side ability locally', async () => {\n\t\t\tconst mockCallback = jest\n\t\t\t\t.fn()\n\t\t\t\t.mockResolvedValue( { success: true } );\n\t\t\tconst mockAbility: Ability = {\n\t\t\t\tname: 'test/client-ability',\n\t\t\t\tlabel: 'Client Ability',\n\t\t\t\tdescription: 'Test client 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\tcallback: mockCallback,\n\t\t\t};\n\n\t\t\tconst mockGetAbility = jest.fn().mockResolvedValue( mockAbility );\n\t\t\t( resolveSelect as jest.Mock ).mockReturnValue( {\n\t\t\t\tgetAbility: mockGetAbility,\n\t\t\t} );\n\n\t\t\tconst input = { test: 'data' };\n\t\t\tconst result = await executeAbility( 'test/client-ability', input );\n\n\t\t\texpect( mockGetAbility ).toHaveBeenCalledWith(\n\t\t\t\t'test/client-ability'\n\t\t\t);\n\t\t\texpect( mockCallback ).toHaveBeenCalledWith( input );\n\t\t\texpect( apiFetch ).not.toHaveBeenCalled();\n\t\t\texpect( result ).toEqual( { success: true } );\n\t\t} );\n\n\t\tit( 'should throw error if ability not found', async () => {\n\t\t\tconst mockGetAbility = jest.fn().mockResolvedValue( null );\n\t\t\t( resolveSelect as jest.Mock ).mockReturnValue( {\n\t\t\t\tgetAbility: mockGetAbility,\n\t\t\t} );\n\n\t\t\tawait expect(\n\t\t\t\texecuteAbility( 'non-existent', {} )\n\t\t\t).rejects.toThrow( 'Ability not found: non-existent' );\n\t\t} );\n\n\t\tit( 'should validate input for client abilities', async () => {\n\t\t\tconst mockCallback = jest.fn();\n\t\t\tconst mockAbility: Ability = {\n\t\t\t\tname: 'test/client-ability',\n\t\t\t\tlabel: 'Client Ability',\n\t\t\t\tdescription: 'Test client ability',\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\trequired: [ 'message' ],\n\t\t\t\t},\n\t\t\t\toutput_schema: { type: 'object' },\n\t\t\t\tcallback: mockCallback,\n\t\t\t};\n\n\t\t\tconst mockGetAbility = jest.fn().mockResolvedValue( mockAbility );\n\t\t\t( resolveSelect as jest.Mock ).mockReturnValue( {\n\t\t\t\tgetAbility: mockGetAbility,\n\t\t\t} );\n\n\t\t\tawait expect(\n\t\t\t\texecuteAbility( 'test/client-ability', {} )\n\t\t\t).rejects.toThrow( 'invalid input' );\n\t\t} );\n\n\t\tit( 'should execute a read-only ability via GET', async () => {\n\t\t\tconst mockAbility: Ability = {\n\t\t\t\tname: 'test/read-only',\n\t\t\t\tlabel: 'Read-only Ability',\n\t\t\t\tdescription: 'Test read-only ability.',\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\tid: { type: 'string' },\n\t\t\t\t\t\tformat: { type: 'string' },\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\toutput_schema: { type: 'object' },\n\t\t\t\tmeta: {\n\t\t\t\t\tannotations: { readonly: true },\n\t\t\t\t},\n\t\t\t};\n\n\t\t\tconst mockGetAbility = jest.fn().mockResolvedValue( mockAbility );\n\t\t\t( resolveSelect as jest.Mock ).mockReturnValue( {\n\t\t\t\tgetAbility: mockGetAbility,\n\t\t\t} );\n\n\t\t\tconst mockResponse = { data: 'read-only data' };\n\t\t\t( apiFetch as unknown as jest.Mock ).mockResolvedValue(\n\t\t\t\tmockResponse\n\t\t\t);\n\n\t\t\tconst input = { id: '123', format: 'json' };\n\t\t\tconst result = await executeAbility( 'test/read-only', input );\n\n\t\t\texpect( apiFetch ).toHaveBeenCalledWith( {\n\t\t\t\tpath: '/wp-abilities/v1/abilities/test/read-only/run?input%5Bid%5D=123&input%5Bformat%5D=json',\n\t\t\t\tmethod: 'GET',\n\t\t\t} );\n\t\t\texpect( result ).toEqual( mockResponse );\n\t\t} );\n\n\t\tit( 'should execute a read-only ability with empty input', async () => {\n\t\t\tconst mockAbility: Ability = {\n\t\t\t\tname: 'test/read-only',\n\t\t\t\tlabel: 'Read-only Ability',\n\t\t\t\tdescription: 'Test read-only 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\tmeta: {\n\t\t\t\t\tannotations: { readonly: true },\n\t\t\t\t},\n\t\t\t};\n\n\t\t\tconst mockGetAbility = jest.fn().mockResolvedValue( mockAbility );\n\t\t\t( resolveSelect as jest.Mock ).mockReturnValue( {\n\t\t\t\tgetAbility: mockGetAbility,\n\t\t\t} );\n\n\t\t\tconst mockResponse = { data: 'read-only data' };\n\t\t\t( apiFetch as unknown as jest.Mock ).mockResolvedValue(\n\t\t\t\tmockResponse\n\t\t\t);\n\n\t\t\tconst result = await executeAbility( 'test/read-only', {} );\n\n\t\t\texpect( apiFetch ).toHaveBeenCalledWith( {\n\t\t\t\tpath: '/wp-abilities/v1/abilities/test/read-only/run?',\n\t\t\t\tmethod: 'GET',\n\t\t\t} );\n\t\t\texpect( result ).toEqual( mockResponse );\n\t\t} );\n\n\t\tit( 'should execute a destructive idempotent ability via DELETE', async () => {\n\t\t\tconst mockAbility: Ability = {\n\t\t\t\tname: 'test/destructive',\n\t\t\t\tlabel: 'Destructive Ability',\n\t\t\t\tdescription: 'Test destructive idempotent ability.',\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\tid: { type: 'string' },\n\t\t\t\t\t\tformat: { type: 'string' },\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\toutput_schema: { type: 'string' },\n\t\t\t\tmeta: {\n\t\t\t\t\tannotations: {\n\t\t\t\t\t\tdestructive: true,\n\t\t\t\t\t\tidempotent: true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t};\n\n\t\t\tconst mockGetAbility = jest.fn().mockResolvedValue( mockAbility );\n\t\t\t( resolveSelect as jest.Mock ).mockReturnValue( {\n\t\t\t\tgetAbility: mockGetAbility,\n\t\t\t} );\n\n\t\t\tconst mockResponse = 'Item deleted successfully.';\n\t\t\t( apiFetch as unknown as jest.Mock ).mockResolvedValue(\n\t\t\t\tmockResponse\n\t\t\t);\n\n\t\t\tconst input = { id: '123', format: 'json' };\n\t\t\tconst result = await executeAbility( 'test/destructive', input );\n\n\t\t\texpect( apiFetch ).toHaveBeenCalledWith( {\n\t\t\t\tpath: '/wp-abilities/v1/abilities/test/destructive/run?input%5Bid%5D=123&input%5Bformat%5D=json',\n\t\t\t\tmethod: 'DELETE',\n\t\t\t} );\n\t\t\texpect( result ).toEqual( mockResponse );\n\t\t} );\n\n\t\tit( 'should handle errors in client ability execution', async () => {\n\t\t\tconst consoleErrorSpy = jest\n\t\t\t\t.spyOn( console, 'error' )\n\t\t\t\t.mockImplementation();\n\t\t\tconst executionError = new Error( 'Execution failed' );\n\t\t\tconst mockCallback = jest.fn().mockRejectedValue( executionError );\n\n\t\t\tconst mockAbility: Ability = {\n\t\t\t\tname: 'test/client-ability',\n\t\t\t\tlabel: 'Client Ability',\n\t\t\t\tdescription: 'Test client 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\tcallback: mockCallback,\n\t\t\t};\n\n\t\t\tconst mockGetAbility = jest.fn().mockResolvedValue( mockAbility );\n\t\t\t( resolveSelect as jest.Mock ).mockReturnValue( {\n\t\t\t\tgetAbility: mockGetAbility,\n\t\t\t} );\n\n\t\t\tawait expect(\n\t\t\t\texecuteAbility( 'test/client-ability', {} )\n\t\t\t).rejects.toThrow( 'Execution failed' );\n\n\t\t\texpect( consoleErrorSpy ).toHaveBeenCalledWith(\n\t\t\t\t'Error executing client ability test/client-ability:',\n\t\t\t\texecutionError\n\t\t\t);\n\n\t\t\tconsoleErrorSpy.mockRestore();\n\t\t} );\n\n\t\tit( 'should handle errors in server ability execution', async () => {\n\t\t\tconst consoleErrorSpy = jest\n\t\t\t\t.spyOn( console, 'error' )\n\t\t\t\t.mockImplementation();\n\t\t\tconst apiError = new Error( 'API request failed' );\n\n\t\t\tconst mockAbility: Ability = {\n\t\t\t\tname: 'test/server-ability',\n\t\t\t\tlabel: 'Server Ability',\n\t\t\t\tdescription: 'Test server 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 mockGetAbility = jest.fn().mockResolvedValue( mockAbility );\n\t\t\t( resolveSelect as jest.Mock ).mockReturnValue( {\n\t\t\t\tgetAbility: mockGetAbility,\n\t\t\t} );\n\n\t\t\t( apiFetch as unknown as jest.Mock ).mockRejectedValue( apiError );\n\n\t\t\tawait expect(\n\t\t\t\texecuteAbility( 'test/server-ability', {} )\n\t\t\t).rejects.toThrow( 'API request failed' );\n\n\t\t\texpect( consoleErrorSpy ).toHaveBeenCalledWith(\n\t\t\t\t'Error executing ability test/server-ability:',\n\t\t\t\tapiError\n\t\t\t);\n\n\t\t\tconsoleErrorSpy.mockRestore();\n\t\t} );\n\n\t\tit( 'should execute ability without callback as server 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 without callback',\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\t// No callback - should execute as server ability\n\t\t\t};\n\n\t\t\tconst mockGetAbility = jest.fn().mockResolvedValue( mockAbility );\n\t\t\t( resolveSelect as jest.Mock ).mockReturnValue( {\n\t\t\t\tgetAbility: mockGetAbility,\n\t\t\t} );\n\n\t\t\tconst mockResponse = { success: true };\n\t\t\t( apiFetch as unknown as jest.Mock ).mockResolvedValue(\n\t\t\t\tmockResponse\n\t\t\t);\n\n\t\t\tconst result = await executeAbility( 'test/ability', {\n\t\t\t\tdata: 'test',\n\t\t\t} );\n\n\t\t\texpect( apiFetch ).toHaveBeenCalledWith( {\n\t\t\t\tpath: '/wp-abilities/v1/abilities/test/ability/run',\n\t\t\t\tmethod: 'POST',\n\t\t\t\tdata: { input: { data: 'test' } },\n\t\t\t} );\n\t\t\texpect( result ).toEqual( mockResponse );\n\t\t} );\n\n\t\tit( 'should validate output for client abilities', async () => {\n\t\t\tconst mockCallback = jest\n\t\t\t\t.fn()\n\t\t\t\t.mockResolvedValue( { invalid: 'response' } );\n\t\t\tconst mockAbility: Ability = {\n\t\t\t\tname: 'test/client-ability',\n\t\t\t\tlabel: 'Client Ability',\n\t\t\t\tdescription: 'Test client ability',\n\t\t\t\tcategory: 'test-category',\n\t\t\t\tinput_schema: { type: 'object' },\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\tresult: { type: 'string' },\n\t\t\t\t\t},\n\t\t\t\t\trequired: [ 'result' ],\n\t\t\t\t},\n\t\t\t\tcallback: mockCallback,\n\t\t\t};\n\n\t\t\tconst mockGetAbility = jest.fn().mockResolvedValue( mockAbility );\n\t\t\t( resolveSelect as jest.Mock ).mockReturnValue( {\n\t\t\t\tgetAbility: mockGetAbility,\n\t\t\t} );\n\n\t\t\tawait expect(\n\t\t\t\texecuteAbility( 'test/client-ability', {} )\n\t\t\t).rejects.toThrow( 'invalid output' );\n\t\t} );\n\t} );\n\n\tdescribe( 'getAbilityCategories', () => {\n\t\tit( 'should resolve and return all categories from the store', 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 mockGetAbilityCategories = jest\n\t\t\t\t.fn()\n\t\t\t\t.mockResolvedValue( mockCategories );\n\t\t\t( resolveSelect as jest.Mock ).mockReturnValue( {\n\t\t\t\tgetAbilityCategories: mockGetAbilityCategories,\n\t\t\t} );\n\n\t\t\tconst result = await getAbilityCategories();\n\n\t\t\texpect( resolveSelect ).toHaveBeenCalledWith( store );\n\t\t\texpect( mockGetAbilityCategories ).toHaveBeenCalled();\n\t\t\texpect( result ).toEqual( mockCategories );\n\t\t} );\n\n\t\tit( 'should return empty array when no categories exist', async () => {\n\t\t\tconst mockGetAbilityCategories = jest.fn().mockResolvedValue( [] );\n\t\t\t( resolveSelect as jest.Mock ).mockReturnValue( {\n\t\t\t\tgetAbilityCategories: mockGetAbilityCategories,\n\t\t\t} );\n\n\t\t\tconst result = await getAbilityCategories();\n\n\t\t\texpect( result ).toEqual( [] );\n\t\t} );\n\t} );\n\n\tdescribe( 'getAbilityCategory', () => {\n\t\tit( 'should return a specific category by slug', 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 mockGetAbilityCategory = jest\n\t\t\t\t.fn()\n\t\t\t\t.mockResolvedValue( mockCategory );\n\t\t\t( resolveSelect as jest.Mock ).mockReturnValue( {\n\t\t\t\tgetAbilityCategory: mockGetAbilityCategory,\n\t\t\t} );\n\n\t\t\tconst result = await getAbilityCategory( 'data-retrieval' );\n\n\t\t\texpect( resolveSelect ).toHaveBeenCalledWith( store );\n\t\t\texpect( mockGetAbilityCategory ).toHaveBeenCalledWith(\n\t\t\t\t'data-retrieval'\n\t\t\t);\n\t\t\texpect( result ).toEqual( mockCategory );\n\t\t} );\n\n\t\tit( 'should return null if category not found', async () => {\n\t\t\tconst mockGetAbilityCategory = jest.fn().mockResolvedValue( null );\n\t\t\t( resolveSelect as jest.Mock ).mockReturnValue( {\n\t\t\t\tgetAbilityCategory: mockGetAbilityCategory,\n\t\t\t} );\n\n\t\t\tconst result = await getAbilityCategory( 'non-existent' );\n\n\t\t\texpect( mockGetAbilityCategory ).toHaveBeenCalledWith(\n\t\t\t\t'non-existent'\n\t\t\t);\n\t\t\texpect( result ).toBeNull();\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 mockGetAbilityCategory = jest\n\t\t\t\t.fn()\n\t\t\t\t.mockResolvedValue( mockCategory );\n\t\t\t( resolveSelect as jest.Mock ).mockReturnValue( {\n\t\t\t\tgetAbilityCategory: mockGetAbilityCategory,\n\t\t\t} );\n\n\t\t\tconst result = await getAbilityCategory( 'user-management' );\n\n\t\t\texpect( result ).toEqual( mockCategory );\n\t\t\texpect( result?.meta ).toBeDefined();\n\t\t\texpect( result?.meta?.priority ).toBe( 'high' );\n\t\t} );\n\t} );\n} );\n"],
5
- "mappings": "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",
6
- "names": []
7
- }