@wordpress/abilities 0.1.1-next.dc3f6d3c1.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.
- package/CHANGELOG.md +9 -0
- package/LICENSE.md +788 -0
- package/README.md +302 -0
- package/build/api.js +189 -0
- package/build/api.js.map +7 -0
- package/build/index.js +53 -0
- package/build/index.js.map +7 -0
- package/build/store/actions.js +183 -0
- package/build/store/actions.js.map +7 -0
- package/build/store/constants.js +58 -0
- package/build/store/constants.js.map +7 -0
- package/build/store/index.js +77 -0
- package/build/store/index.js.map +7 -0
- package/build/store/reducer.js +126 -0
- package/build/store/reducer.js.map +7 -0
- package/build/store/resolvers.js +107 -0
- package/build/store/resolvers.js.map +7 -0
- package/build/store/selectors.js +64 -0
- package/build/store/selectors.js.map +7 -0
- package/build/store/tests/actions.test.js +792 -0
- package/build/store/tests/actions.test.js.map +7 -0
- package/build/store/tests/reducer.test.js +743 -0
- package/build/store/tests/reducer.test.js.map +7 -0
- package/build/store/tests/resolvers.test.js +520 -0
- package/build/store/tests/resolvers.test.js.map +7 -0
- package/build/store/tests/selectors.test.js +349 -0
- package/build/store/tests/selectors.test.js.map +7 -0
- package/build/tests/api.test.js +546 -0
- package/build/tests/api.test.js.map +7 -0
- package/build/tests/validation.test.js +453 -0
- package/build/tests/validation.test.js.map +7 -0
- package/build/types.js +19 -0
- package/build/types.js.map +7 -0
- package/build/validation.js +144 -0
- package/build/validation.js.map +7 -0
- package/build-module/api.js +146 -0
- package/build-module/api.js.map +7 -0
- package/build-module/index.js +28 -0
- package/build-module/index.js.map +7 -0
- package/build-module/store/actions.js +161 -0
- package/build-module/store/actions.js.map +7 -0
- package/build-module/store/constants.js +24 -0
- package/build-module/store/constants.js.map +7 -0
- package/build-module/store/index.js +47 -0
- package/build-module/store/index.js.map +7 -0
- package/build-module/store/reducer.js +112 -0
- package/build-module/store/reducer.js.map +7 -0
- package/build-module/store/resolvers.js +84 -0
- package/build-module/store/resolvers.js.map +7 -0
- package/build-module/store/selectors.js +36 -0
- package/build-module/store/selectors.js.map +7 -0
- package/build-module/store/tests/actions.test.js +804 -0
- package/build-module/store/tests/actions.test.js.map +7 -0
- package/build-module/store/tests/reducer.test.js +726 -0
- package/build-module/store/tests/reducer.test.js.map +7 -0
- package/build-module/store/tests/resolvers.test.js +523 -0
- package/build-module/store/tests/resolvers.test.js.map +7 -0
- package/build-module/store/tests/selectors.test.js +352 -0
- package/build-module/store/tests/selectors.test.js.map +7 -0
- package/build-module/tests/api.test.js +530 -0
- package/build-module/tests/api.test.js.map +7 -0
- package/build-module/tests/validation.test.js +451 -0
- package/build-module/tests/validation.test.js.map +7 -0
- package/build-module/types.js +1 -0
- package/build-module/types.js.map +7 -0
- package/build-module/validation.js +109 -0
- package/build-module/validation.js.map +7 -0
- package/build-types/api.d.ts +138 -0
- package/build-types/api.d.ts.map +1 -0
- package/build-types/index.d.ts +41 -0
- package/build-types/index.d.ts.map +1 -0
- package/build-types/store/actions.d.ts +76 -0
- package/build-types/store/actions.d.ts.map +1 -0
- package/build-types/store/constants.d.ts +14 -0
- package/build-types/store/constants.d.ts.map +1 -0
- package/build-types/store/index.d.ts +7 -0
- package/build-types/store/index.d.ts.map +1 -0
- package/build-types/store/reducer.d.ts +22 -0
- package/build-types/store/reducer.d.ts.map +1 -0
- package/build-types/store/resolvers.d.ts +47 -0
- package/build-types/store/resolvers.d.ts.map +1 -0
- package/build-types/store/selectors.d.ts +37 -0
- package/build-types/store/selectors.d.ts.map +1 -0
- package/build-types/types.d.ts +163 -0
- package/build-types/types.d.ts.map +1 -0
- package/build-types/validation.d.ts +23 -0
- package/build-types/validation.d.ts.map +1 -0
- package/package.json +52 -0
- package/src/api.ts +339 -0
- package/src/index.ts +65 -0
- package/src/store/actions.ts +247 -0
- package/src/store/constants.ts +15 -0
- package/src/store/index.ts +55 -0
- package/src/store/reducer.ts +184 -0
- package/src/store/resolvers.ts +151 -0
- package/src/store/selectors.ts +82 -0
- package/src/store/tests/actions.test.ts +950 -0
- package/src/store/tests/reducer.test.ts +861 -0
- package/src/store/tests/resolvers.test.ts +642 -0
- package/src/store/tests/selectors.test.ts +412 -0
- package/src/tests/api.test.ts +655 -0
- package/src/tests/validation.test.ts +532 -0
- package/src/types.ts +190 -0
- package/src/validation.ts +207 -0
|
@@ -0,0 +1,412 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for store selectors.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Internal dependencies
|
|
7
|
+
*/
|
|
8
|
+
import {
|
|
9
|
+
getAbilities,
|
|
10
|
+
getAbility,
|
|
11
|
+
getAbilityCategories,
|
|
12
|
+
getAbilityCategory,
|
|
13
|
+
} from '../selectors';
|
|
14
|
+
import type { AbilitiesState } from '../../types';
|
|
15
|
+
|
|
16
|
+
describe( 'Store Selectors', () => {
|
|
17
|
+
describe( 'getAbilities', () => {
|
|
18
|
+
it( 'should return all abilities as an array', () => {
|
|
19
|
+
const state: AbilitiesState = {
|
|
20
|
+
abilitiesByName: {
|
|
21
|
+
'test/ability1': {
|
|
22
|
+
name: 'test/ability1',
|
|
23
|
+
label: 'Test Ability 1',
|
|
24
|
+
description: 'First test ability',
|
|
25
|
+
category: 'test-category',
|
|
26
|
+
input_schema: { type: 'object' },
|
|
27
|
+
output_schema: { type: 'object' },
|
|
28
|
+
},
|
|
29
|
+
'test/ability2': {
|
|
30
|
+
name: 'test/ability2',
|
|
31
|
+
label: 'Test Ability 2',
|
|
32
|
+
description: 'Second test ability',
|
|
33
|
+
category: 'test-category',
|
|
34
|
+
input_schema: { type: 'object' },
|
|
35
|
+
output_schema: { type: 'object' },
|
|
36
|
+
callback: jest.fn(),
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
categoriesBySlug: {},
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
const abilities = getAbilities( state );
|
|
43
|
+
|
|
44
|
+
expect( abilities ).toHaveLength( 2 );
|
|
45
|
+
expect( abilities ).toContainEqual(
|
|
46
|
+
state.abilitiesByName[ 'test/ability1' ]
|
|
47
|
+
);
|
|
48
|
+
expect( abilities ).toContainEqual(
|
|
49
|
+
state.abilitiesByName[ 'test/ability2' ]
|
|
50
|
+
);
|
|
51
|
+
} );
|
|
52
|
+
|
|
53
|
+
it( 'should return empty array when no abilities exist', () => {
|
|
54
|
+
const state: AbilitiesState = {
|
|
55
|
+
abilitiesByName: {},
|
|
56
|
+
categoriesBySlug: {},
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
const abilities = getAbilities( state );
|
|
60
|
+
|
|
61
|
+
expect( abilities ).toEqual( [] );
|
|
62
|
+
} );
|
|
63
|
+
|
|
64
|
+
it( 'should memoize results when state unchanged', () => {
|
|
65
|
+
const state: AbilitiesState = {
|
|
66
|
+
abilitiesByName: {
|
|
67
|
+
'test/ability': {
|
|
68
|
+
name: 'test/ability',
|
|
69
|
+
label: 'Test Ability',
|
|
70
|
+
description: 'Test ability',
|
|
71
|
+
category: 'test-category',
|
|
72
|
+
input_schema: { type: 'object' },
|
|
73
|
+
output_schema: { type: 'object' },
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
categoriesBySlug: {},
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
const result1 = getAbilities( state );
|
|
80
|
+
const result2 = getAbilities( state );
|
|
81
|
+
|
|
82
|
+
// Should return the same reference when state unchanged
|
|
83
|
+
expect( result1 ).toBe( result2 );
|
|
84
|
+
} );
|
|
85
|
+
|
|
86
|
+
it( 'should return new array reference when state changes', () => {
|
|
87
|
+
const state1: AbilitiesState = {
|
|
88
|
+
abilitiesByName: {
|
|
89
|
+
'test/ability1': {
|
|
90
|
+
name: 'test/ability1',
|
|
91
|
+
label: 'Test Ability 1',
|
|
92
|
+
description: 'Test ability',
|
|
93
|
+
category: 'test-category',
|
|
94
|
+
input_schema: { type: 'object' },
|
|
95
|
+
output_schema: { type: 'object' },
|
|
96
|
+
},
|
|
97
|
+
},
|
|
98
|
+
categoriesBySlug: {},
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
const state2: AbilitiesState = {
|
|
102
|
+
abilitiesByName: {
|
|
103
|
+
...state1.abilitiesByName,
|
|
104
|
+
'test/ability2': {
|
|
105
|
+
name: 'test/ability2',
|
|
106
|
+
label: 'Test Ability 2',
|
|
107
|
+
description: 'Another test ability',
|
|
108
|
+
category: 'test-category',
|
|
109
|
+
input_schema: { type: 'object' },
|
|
110
|
+
output_schema: { type: 'object' },
|
|
111
|
+
},
|
|
112
|
+
},
|
|
113
|
+
categoriesBySlug: {},
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
const result1 = getAbilities( state1 );
|
|
117
|
+
const result2 = getAbilities( state2 );
|
|
118
|
+
|
|
119
|
+
// Should return different references when state changes
|
|
120
|
+
expect( result1 ).not.toBe( result2 );
|
|
121
|
+
expect( result1 ).toHaveLength( 1 );
|
|
122
|
+
expect( result2 ).toHaveLength( 2 );
|
|
123
|
+
} );
|
|
124
|
+
|
|
125
|
+
it( 'should filter abilities by category when category is provided', () => {
|
|
126
|
+
const state: AbilitiesState = {
|
|
127
|
+
abilitiesByName: {
|
|
128
|
+
'test/ability1': {
|
|
129
|
+
name: 'test/ability1',
|
|
130
|
+
label: 'Test Ability 1',
|
|
131
|
+
description: 'First test ability',
|
|
132
|
+
category: 'data-retrieval',
|
|
133
|
+
input_schema: { type: 'object' },
|
|
134
|
+
output_schema: { type: 'object' },
|
|
135
|
+
},
|
|
136
|
+
'test/ability2': {
|
|
137
|
+
name: 'test/ability2',
|
|
138
|
+
label: 'Test Ability 2',
|
|
139
|
+
description: 'Second test ability',
|
|
140
|
+
category: 'data-retrieval',
|
|
141
|
+
input_schema: { type: 'object' },
|
|
142
|
+
output_schema: { type: 'object' },
|
|
143
|
+
},
|
|
144
|
+
'test/ability3': {
|
|
145
|
+
name: 'test/ability3',
|
|
146
|
+
label: 'Test Ability 3',
|
|
147
|
+
description: 'Third test ability',
|
|
148
|
+
category: 'user-management',
|
|
149
|
+
input_schema: { type: 'object' },
|
|
150
|
+
output_schema: { type: 'object' },
|
|
151
|
+
},
|
|
152
|
+
},
|
|
153
|
+
categoriesBySlug: {},
|
|
154
|
+
};
|
|
155
|
+
|
|
156
|
+
const result = getAbilities( state, {
|
|
157
|
+
category: 'data-retrieval',
|
|
158
|
+
} );
|
|
159
|
+
|
|
160
|
+
expect( result ).toHaveLength( 2 );
|
|
161
|
+
expect( result ).toContainEqual(
|
|
162
|
+
expect.objectContaining( { name: 'test/ability1' } )
|
|
163
|
+
);
|
|
164
|
+
expect( result ).toContainEqual(
|
|
165
|
+
expect.objectContaining( { name: 'test/ability2' } )
|
|
166
|
+
);
|
|
167
|
+
expect( result ).not.toContainEqual(
|
|
168
|
+
expect.objectContaining( { name: 'test/ability3' } )
|
|
169
|
+
);
|
|
170
|
+
} );
|
|
171
|
+
|
|
172
|
+
it( 'should return empty array when no abilities match category', () => {
|
|
173
|
+
const state: AbilitiesState = {
|
|
174
|
+
abilitiesByName: {
|
|
175
|
+
'test/ability1': {
|
|
176
|
+
name: 'test/ability1',
|
|
177
|
+
label: 'Test Ability 1',
|
|
178
|
+
description: 'First test ability',
|
|
179
|
+
category: 'data-retrieval',
|
|
180
|
+
input_schema: { type: 'object' },
|
|
181
|
+
output_schema: { type: 'object' },
|
|
182
|
+
},
|
|
183
|
+
},
|
|
184
|
+
categoriesBySlug: {},
|
|
185
|
+
};
|
|
186
|
+
|
|
187
|
+
const result = getAbilities( state, {
|
|
188
|
+
category: 'non-existent-category',
|
|
189
|
+
} );
|
|
190
|
+
|
|
191
|
+
expect( result ).toEqual( [] );
|
|
192
|
+
} );
|
|
193
|
+
} );
|
|
194
|
+
|
|
195
|
+
describe( 'getAbility', () => {
|
|
196
|
+
const state: AbilitiesState = {
|
|
197
|
+
abilitiesByName: {
|
|
198
|
+
'test/ability1': {
|
|
199
|
+
name: 'test/ability1',
|
|
200
|
+
label: 'Test Ability 1',
|
|
201
|
+
description: 'First test ability',
|
|
202
|
+
category: 'test-category',
|
|
203
|
+
input_schema: { type: 'object' },
|
|
204
|
+
output_schema: { type: 'object' },
|
|
205
|
+
},
|
|
206
|
+
'test/ability2': {
|
|
207
|
+
name: 'test/ability2',
|
|
208
|
+
label: 'Test Ability 2',
|
|
209
|
+
description: 'Second test ability',
|
|
210
|
+
category: 'test-category',
|
|
211
|
+
input_schema: { type: 'object' },
|
|
212
|
+
output_schema: { type: 'object' },
|
|
213
|
+
callback: jest.fn(),
|
|
214
|
+
},
|
|
215
|
+
},
|
|
216
|
+
categoriesBySlug: {},
|
|
217
|
+
};
|
|
218
|
+
|
|
219
|
+
it( 'should return a specific ability by name', () => {
|
|
220
|
+
const ability = getAbility( state, 'test/ability1' );
|
|
221
|
+
|
|
222
|
+
expect( ability ).toEqual(
|
|
223
|
+
state.abilitiesByName[ 'test/ability1' ]
|
|
224
|
+
);
|
|
225
|
+
} );
|
|
226
|
+
|
|
227
|
+
it( 'should return null if ability not found', () => {
|
|
228
|
+
const ability = getAbility( state, 'non-existent' );
|
|
229
|
+
|
|
230
|
+
expect( ability ).toBeUndefined();
|
|
231
|
+
} );
|
|
232
|
+
|
|
233
|
+
it( 'should handle empty state', () => {
|
|
234
|
+
const emptyState: AbilitiesState = {
|
|
235
|
+
abilitiesByName: {},
|
|
236
|
+
categoriesBySlug: {},
|
|
237
|
+
};
|
|
238
|
+
|
|
239
|
+
const ability = getAbility( emptyState, 'test/ability' );
|
|
240
|
+
|
|
241
|
+
expect( ability ).toBeUndefined();
|
|
242
|
+
} );
|
|
243
|
+
|
|
244
|
+
it( 'should return client abilities with callbacks', () => {
|
|
245
|
+
const ability = getAbility( state, 'test/ability2' );
|
|
246
|
+
|
|
247
|
+
expect( ability ).toEqual(
|
|
248
|
+
state.abilitiesByName[ 'test/ability2' ]
|
|
249
|
+
);
|
|
250
|
+
expect( ability?.callback ).toBeDefined();
|
|
251
|
+
} );
|
|
252
|
+
|
|
253
|
+
it( 'should handle valid namespaced ability names correctly', () => {
|
|
254
|
+
const stateWithNamespaced: AbilitiesState = {
|
|
255
|
+
abilitiesByName: {
|
|
256
|
+
'my-plugin/feature-action': {
|
|
257
|
+
name: 'my-plugin/feature-action',
|
|
258
|
+
label: 'Namespaced Action',
|
|
259
|
+
description: 'Namespaced ability',
|
|
260
|
+
category: 'test-category',
|
|
261
|
+
input_schema: { type: 'object' },
|
|
262
|
+
output_schema: { type: 'object' },
|
|
263
|
+
},
|
|
264
|
+
},
|
|
265
|
+
categoriesBySlug: {},
|
|
266
|
+
};
|
|
267
|
+
|
|
268
|
+
const ability = getAbility(
|
|
269
|
+
stateWithNamespaced,
|
|
270
|
+
'my-plugin/feature-action'
|
|
271
|
+
);
|
|
272
|
+
|
|
273
|
+
expect( ability ).toEqual(
|
|
274
|
+
stateWithNamespaced.abilitiesByName[
|
|
275
|
+
'my-plugin/feature-action'
|
|
276
|
+
]
|
|
277
|
+
);
|
|
278
|
+
} );
|
|
279
|
+
} );
|
|
280
|
+
|
|
281
|
+
describe( 'getAbilityCategories', () => {
|
|
282
|
+
it( 'should return all categories as an array', () => {
|
|
283
|
+
const state: AbilitiesState = {
|
|
284
|
+
abilitiesByName: {},
|
|
285
|
+
categoriesBySlug: {
|
|
286
|
+
'data-retrieval': {
|
|
287
|
+
slug: 'data-retrieval',
|
|
288
|
+
label: 'Data Retrieval',
|
|
289
|
+
description: 'Abilities that retrieve data',
|
|
290
|
+
},
|
|
291
|
+
'user-management': {
|
|
292
|
+
slug: 'user-management',
|
|
293
|
+
label: 'User Management',
|
|
294
|
+
description: 'Abilities for managing users',
|
|
295
|
+
},
|
|
296
|
+
},
|
|
297
|
+
};
|
|
298
|
+
|
|
299
|
+
const categories = getAbilityCategories( state );
|
|
300
|
+
|
|
301
|
+
expect( categories ).toHaveLength( 2 );
|
|
302
|
+
expect( categories ).toContainEqual(
|
|
303
|
+
state.categoriesBySlug[ 'data-retrieval' ]
|
|
304
|
+
);
|
|
305
|
+
expect( categories ).toContainEqual(
|
|
306
|
+
state.categoriesBySlug[ 'user-management' ]
|
|
307
|
+
);
|
|
308
|
+
} );
|
|
309
|
+
|
|
310
|
+
it( 'should return empty array when no categories exist', () => {
|
|
311
|
+
const state: AbilitiesState = {
|
|
312
|
+
abilitiesByName: {},
|
|
313
|
+
categoriesBySlug: {},
|
|
314
|
+
};
|
|
315
|
+
|
|
316
|
+
const categories = getAbilityCategories( state );
|
|
317
|
+
|
|
318
|
+
expect( categories ).toEqual( [] );
|
|
319
|
+
} );
|
|
320
|
+
} );
|
|
321
|
+
|
|
322
|
+
describe( 'getAbilityCategory', () => {
|
|
323
|
+
const state: AbilitiesState = {
|
|
324
|
+
abilitiesByName: {},
|
|
325
|
+
categoriesBySlug: {
|
|
326
|
+
'data-retrieval': {
|
|
327
|
+
slug: 'data-retrieval',
|
|
328
|
+
label: 'Data Retrieval',
|
|
329
|
+
description: 'Abilities that retrieve data',
|
|
330
|
+
},
|
|
331
|
+
'user-management': {
|
|
332
|
+
slug: 'user-management',
|
|
333
|
+
label: 'User Management',
|
|
334
|
+
description: 'Abilities for managing users',
|
|
335
|
+
meta: {
|
|
336
|
+
priority: 'high',
|
|
337
|
+
},
|
|
338
|
+
},
|
|
339
|
+
},
|
|
340
|
+
};
|
|
341
|
+
|
|
342
|
+
it( 'should return a specific category by slug', () => {
|
|
343
|
+
const category = getAbilityCategory( state, 'data-retrieval' );
|
|
344
|
+
|
|
345
|
+
expect( category ).toEqual(
|
|
346
|
+
state.categoriesBySlug[ 'data-retrieval' ]
|
|
347
|
+
);
|
|
348
|
+
} );
|
|
349
|
+
|
|
350
|
+
it( 'should return null if category not found', () => {
|
|
351
|
+
const category = getAbilityCategory( state, 'non-existent' );
|
|
352
|
+
|
|
353
|
+
expect( category ).toBeUndefined();
|
|
354
|
+
} );
|
|
355
|
+
|
|
356
|
+
it( 'should handle empty state', () => {
|
|
357
|
+
const emptyState: AbilitiesState = {
|
|
358
|
+
abilitiesByName: {},
|
|
359
|
+
categoriesBySlug: {},
|
|
360
|
+
};
|
|
361
|
+
|
|
362
|
+
const category = getAbilityCategory( emptyState, 'data-retrieval' );
|
|
363
|
+
|
|
364
|
+
expect( category ).toBeUndefined();
|
|
365
|
+
} );
|
|
366
|
+
|
|
367
|
+
it( 'should return categories with meta', () => {
|
|
368
|
+
const category = getAbilityCategory( state, 'user-management' );
|
|
369
|
+
|
|
370
|
+
expect( category ).toEqual(
|
|
371
|
+
state.categoriesBySlug[ 'user-management' ]
|
|
372
|
+
);
|
|
373
|
+
expect( category?.meta ).toBeDefined();
|
|
374
|
+
expect( category?.meta?.priority ).toBe( 'high' );
|
|
375
|
+
} );
|
|
376
|
+
|
|
377
|
+
it( 'should handle valid category slug formats', () => {
|
|
378
|
+
const stateWithVariousSlugs: AbilitiesState = {
|
|
379
|
+
abilitiesByName: {},
|
|
380
|
+
categoriesBySlug: {
|
|
381
|
+
simple: {
|
|
382
|
+
slug: 'simple',
|
|
383
|
+
label: 'Simple',
|
|
384
|
+
description: 'Simple slug',
|
|
385
|
+
},
|
|
386
|
+
'with-dashes': {
|
|
387
|
+
slug: 'with-dashes',
|
|
388
|
+
label: 'With Dashes',
|
|
389
|
+
description: 'Slug with dashes',
|
|
390
|
+
},
|
|
391
|
+
with123: {
|
|
392
|
+
slug: 'with123',
|
|
393
|
+
label: 'With Numbers',
|
|
394
|
+
description: 'Slug with numbers',
|
|
395
|
+
},
|
|
396
|
+
},
|
|
397
|
+
};
|
|
398
|
+
|
|
399
|
+
expect(
|
|
400
|
+
getAbilityCategory( stateWithVariousSlugs, 'simple' )
|
|
401
|
+
).toEqual( stateWithVariousSlugs.categoriesBySlug.simple );
|
|
402
|
+
expect(
|
|
403
|
+
getAbilityCategory( stateWithVariousSlugs, 'with-dashes' )
|
|
404
|
+
).toEqual(
|
|
405
|
+
stateWithVariousSlugs.categoriesBySlug[ 'with-dashes' ]
|
|
406
|
+
);
|
|
407
|
+
expect(
|
|
408
|
+
getAbilityCategory( stateWithVariousSlugs, 'with123' )
|
|
409
|
+
).toEqual( stateWithVariousSlugs.categoriesBySlug.with123 );
|
|
410
|
+
} );
|
|
411
|
+
} );
|
|
412
|
+
} );
|