mcp-wordpress 2.5.0 → 2.5.2

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.
Files changed (30) hide show
  1. package/README.md +19 -15
  2. package/bin/status.js +1 -1
  3. package/dist/config/ServerConfiguration.d.ts.map +1 -1
  4. package/dist/config/ServerConfiguration.js +23 -2
  5. package/dist/config/ServerConfiguration.js.map +1 -1
  6. package/docs/INSTALLATION.md +4 -2
  7. package/docs/TROUBLESHOOTING.md +2 -1
  8. package/docs/developer/TESTING.md +24 -19
  9. package/docs/integrations/claude-desktop.md +9 -4
  10. package/docs/user-guides/DXT_INSTALLATION.md +2 -1
  11. package/package.json +28 -29
  12. package/src/config/ServerConfiguration.ts +22 -2
  13. package/dist/ajv-patch.js +0 -34
  14. package/dist/cache/__tests__/CacheInvalidation.test.d.ts +0 -5
  15. package/dist/cache/__tests__/CacheInvalidation.test.d.ts.map +0 -1
  16. package/dist/cache/__tests__/CacheInvalidation.test.js +0 -238
  17. package/dist/cache/__tests__/CacheInvalidation.test.js.map +0 -1
  18. package/dist/cache/__tests__/CacheManager.test.d.ts +0 -5
  19. package/dist/cache/__tests__/CacheManager.test.d.ts.map +0 -1
  20. package/dist/cache/__tests__/CacheManager.test.js +0 -233
  21. package/dist/cache/__tests__/CacheManager.test.js.map +0 -1
  22. package/dist/cache/__tests__/CachedWordPressClient.test.d.ts +0 -5
  23. package/dist/cache/__tests__/CachedWordPressClient.test.d.ts.map +0 -1
  24. package/dist/cache/__tests__/CachedWordPressClient.test.js +0 -231
  25. package/dist/cache/__tests__/CachedWordPressClient.test.js.map +0 -1
  26. package/dist/cache/__tests__/HttpCacheWrapper.test.d.ts +0 -5
  27. package/dist/cache/__tests__/HttpCacheWrapper.test.d.ts.map +0 -1
  28. package/dist/cache/__tests__/HttpCacheWrapper.test.js +0 -300
  29. package/dist/cache/__tests__/HttpCacheWrapper.test.js.map +0 -1
  30. package/dist/dxt-entry.cjs +0 -81
@@ -1,231 +0,0 @@
1
- /**
2
- * Tests for CachedWordPressClient
3
- */
4
- import { CachedWordPressClient } from "../index.js";
5
- // Mock the base WordPress client
6
- jest.mock("../../client/api.js", () => {
7
- return {
8
- WordPressClient: jest.fn().mockImplementation(() => ({
9
- baseUrl: "https://example.com",
10
- auth: { method: "app-password", username: "test", appPassword: "test" },
11
- jwtToken: null,
12
- request: jest.fn(),
13
- getPosts: jest.fn(),
14
- getPost: jest.fn(),
15
- createPost: jest.fn(),
16
- updatePost: jest.fn(),
17
- deletePost: jest.fn(),
18
- getCurrentUser: jest.fn(),
19
- getCategories: jest.fn(),
20
- getTags: jest.fn(),
21
- getSiteSettings: jest.fn(),
22
- })),
23
- };
24
- });
25
- describe("CachedWordPressClient", () => {
26
- let client;
27
- let config;
28
- beforeEach(() => {
29
- config = {
30
- baseUrl: "https://example.com",
31
- auth: {
32
- method: "app-password",
33
- username: "test",
34
- appPassword: "test-password",
35
- },
36
- };
37
- client = new CachedWordPressClient(config, "test-site");
38
- });
39
- afterEach(() => {
40
- client.clearCache();
41
- jest.clearAllMocks();
42
- });
43
- describe("Initialization", () => {
44
- test("should initialize with caching system", () => {
45
- expect(client).toBeDefined();
46
- expect(client["cacheManager"]).toBeDefined();
47
- expect(client["httpCache"]).toBeDefined();
48
- expect(client["cacheInvalidation"]).toBeDefined();
49
- });
50
- test("should use provided site ID", () => {
51
- const customClient = new CachedWordPressClient(config, "custom-site");
52
- expect(customClient["siteId"]).toBe("custom-site");
53
- });
54
- test("should default to \"default\" site ID", () => {
55
- const defaultClient = new CachedWordPressClient(config);
56
- expect(defaultClient["siteId"]).toBe("default");
57
- });
58
- });
59
- describe("GET Request Caching", () => {
60
- test("should cache GET requests", async () => {
61
- const mockResponse = [{ id: 1, title: "Test Post" }];
62
- client.request = jest
63
- .fn()
64
- .mockImplementationOnce(async () => mockResponse)
65
- .mockImplementationOnce(async () => mockResponse);
66
- // First call should hit the API
67
- const result1 = await client.getPosts();
68
- expect(result1).toEqual(mockResponse);
69
- // Second call should use cache (mocked request should only be called once)
70
- const result2 = await client.getPosts();
71
- expect(result2).toEqual(mockResponse);
72
- // Verify the underlying request was only called once due to caching
73
- expect(client.request).toHaveBeenCalledTimes(1);
74
- });
75
- test("should cache individual post requests", async () => {
76
- const mockPost = { id: 1, title: "Test Post" };
77
- client.request = jest.fn().mockResolvedValue(mockPost);
78
- const result1 = await client.getPost(1);
79
- const result2 = await client.getPost(1);
80
- expect(result1).toEqual(mockPost);
81
- expect(result2).toEqual(mockPost);
82
- expect(client.request).toHaveBeenCalledTimes(1);
83
- });
84
- });
85
- describe("Write Operations and Cache Invalidation", () => {
86
- test("should invalidate cache on post creation", async () => {
87
- const mockPost = { id: 1, title: "New Post" };
88
- const mockCreateData = { title: "New Post", content: "Content" };
89
- // Mock the parent class methods
90
- const _originalCreatePost = client.createPost;
91
- client.createPost = jest.fn().mockResolvedValue(mockPost);
92
- const invalidateSpy = jest.spyOn(client["cacheInvalidation"], "invalidateResource");
93
- await client.createPost(mockCreateData);
94
- expect(invalidateSpy).toHaveBeenCalledWith("posts", 1, "create");
95
- });
96
- test("should invalidate cache on post update", async () => {
97
- const mockPost = { id: 1, title: "Updated Post" };
98
- const mockUpdateData = { id: 1, title: "Updated Post" };
99
- client.updatePost = jest.fn().mockResolvedValue(mockPost);
100
- const invalidateSpy = jest.spyOn(client["cacheInvalidation"], "invalidateResource");
101
- await client.updatePost(mockUpdateData);
102
- expect(invalidateSpy).toHaveBeenCalledWith("posts", 1, "update");
103
- });
104
- test("should invalidate cache on post deletion", async () => {
105
- client.deletePost = jest.fn().mockResolvedValue(undefined);
106
- const invalidateSpy = jest.spyOn(client["cacheInvalidation"], "invalidateResource");
107
- await client.deletePost(1);
108
- expect(invalidateSpy).toHaveBeenCalledWith("posts", 1, "delete");
109
- });
110
- });
111
- describe("Cache Configuration by Endpoint Type", () => {
112
- test("should use static caching for site settings", async () => {
113
- const mockSettings = { title: "Test Site" };
114
- client.request = jest.fn().mockResolvedValue(mockSettings);
115
- await client.getSiteSettings();
116
- // Verify request was made with static cache configuration
117
- expect(client.request).toHaveBeenCalledWith("GET", "settings");
118
- });
119
- test("should use semi-static caching for categories", async () => {
120
- const mockCategories = [{ id: 1, name: "Test Category" }];
121
- client.request = jest.fn().mockResolvedValue(mockCategories);
122
- await client.getCategories();
123
- expect(client.request).toHaveBeenCalledWith("GET", "categories", null, { params: {} });
124
- });
125
- test("should use session caching for current user", async () => {
126
- const mockUser = { id: 1, username: "testuser" };
127
- client.request = jest.fn().mockResolvedValue(mockUser);
128
- await client.getCurrentUser();
129
- expect(client.request).toHaveBeenCalledWith("GET", "users/me");
130
- });
131
- });
132
- describe("Cache Management", () => {
133
- test("should clear all cache", () => {
134
- const clearSpy = jest.spyOn(client["httpCache"], "invalidateAll");
135
- const result = client.clearCache();
136
- expect(clearSpy).toHaveBeenCalled();
137
- expect(typeof result).toBe("number");
138
- });
139
- test("should clear cache by pattern", () => {
140
- const pattern = "posts.*";
141
- const clearPatternSpy = jest.spyOn(client["httpCache"], "invalidatePattern");
142
- const result = client.clearCachePattern(pattern);
143
- expect(clearPatternSpy).toHaveBeenCalledWith(pattern);
144
- expect(typeof result).toBe("number");
145
- });
146
- test("should provide cache statistics", () => {
147
- const stats = client.getCacheStats();
148
- expect(stats).toHaveProperty("cache");
149
- expect(stats).toHaveProperty("invalidation");
150
- expect(stats.cache).toHaveProperty("hits");
151
- expect(stats.cache).toHaveProperty("misses");
152
- expect(stats.cache).toHaveProperty("totalSize");
153
- expect(stats.invalidation).toHaveProperty("queueSize");
154
- });
155
- test("should warm cache with essential data", async () => {
156
- // Mock all the methods that warmCache calls
157
- client.getCurrentUser = jest.fn().mockResolvedValue({ id: 1 });
158
- client.getCategories = jest.fn().mockResolvedValue([]);
159
- client.getTags = jest.fn().mockResolvedValue([]);
160
- client.getSiteSettings = jest.fn().mockResolvedValue({});
161
- await client.warmCache();
162
- expect(client.getCurrentUser).toHaveBeenCalled();
163
- expect(client.getCategories).toHaveBeenCalled();
164
- expect(client.getTags).toHaveBeenCalled();
165
- expect(client.getSiteSettings).toHaveBeenCalled();
166
- });
167
- test("should handle cache warming errors gracefully", async () => {
168
- client.getCurrentUser = jest
169
- .fn()
170
- .mockRejectedValue(new Error("Auth failed"));
171
- client.getCategories = jest.fn().mockResolvedValue([]);
172
- client.getTags = jest.fn().mockResolvedValue([]);
173
- client.getSiteSettings = jest.fn().mockResolvedValue({});
174
- // Should not throw despite getCurrentUser failing
175
- await expect(client.warmCache()).resolves.toBeUndefined();
176
- expect(client.getCategories).toHaveBeenCalled();
177
- expect(client.getTags).toHaveBeenCalled();
178
- expect(client.getSiteSettings).toHaveBeenCalled();
179
- });
180
- });
181
- describe("Cache Key Generation", () => {
182
- test("should generate different cache keys for different parameters", async () => {
183
- const mockPosts = [{ id: 1 }];
184
- client.request = jest.fn().mockResolvedValue(mockPosts);
185
- // Make requests with different parameters
186
- await client.getPosts({ per_page: 10 });
187
- await client.getPosts({ per_page: 20 });
188
- // Should make two separate requests due to different cache keys
189
- expect(client.request).toHaveBeenCalledTimes(2);
190
- });
191
- test("should use same cache key for identical parameters", async () => {
192
- const mockPosts = [{ id: 1 }];
193
- client.request = jest.fn().mockResolvedValue(mockPosts);
194
- const params = { per_page: 10, status: ["publish"] };
195
- await client.getPosts(params);
196
- await client.getPosts(params);
197
- // Should only make one request due to caching
198
- expect(client.request).toHaveBeenCalledTimes(1);
199
- });
200
- });
201
- describe("Helper Methods", () => {
202
- test("should extract resource from endpoint", () => {
203
- const resource1 = client.extractResourceFromEndpoint("posts");
204
- const resource2 = client.extractResourceFromEndpoint("posts/123");
205
- const resource3 = client.extractResourceFromEndpoint("categories");
206
- expect(resource1).toBe("posts");
207
- expect(resource2).toBe("posts");
208
- expect(resource3).toBe("categories");
209
- });
210
- test("should extract ID from endpoint", () => {
211
- const id1 = client.extractIdFromEndpoint("posts/123");
212
- const id2 = client.extractIdFromEndpoint("posts/123/revisions");
213
- const id3 = client.extractIdFromEndpoint("posts");
214
- expect(id1).toBe(123);
215
- expect(id2).toBe(123);
216
- expect(id3).toBeUndefined();
217
- });
218
- test("should identify endpoint types correctly", () => {
219
- expect(client.isStaticEndpoint("settings")).toBe(true);
220
- expect(client.isStaticEndpoint("types")).toBe(true);
221
- expect(client.isStaticEndpoint("posts")).toBe(false);
222
- expect(client.isSemiStaticEndpoint("categories")).toBe(true);
223
- expect(client.isSemiStaticEndpoint("tags")).toBe(true);
224
- expect(client.isSemiStaticEndpoint("posts")).toBe(false);
225
- expect(client.isSessionEndpoint("users/me")).toBe(true);
226
- expect(client.isSessionEndpoint("application-passwords")).toBe(true);
227
- expect(client.isSessionEndpoint("posts")).toBe(false);
228
- });
229
- });
230
- });
231
- //# sourceMappingURL=CachedWordPressClient.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"CachedWordPressClient.test.js","sourceRoot":"","sources":["../../../src/cache/__tests__/CachedWordPressClient.test.ts"],"names":[],"mappings":"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"}
@@ -1,5 +0,0 @@
1
- /**
2
- * Tests for HttpCacheWrapper
3
- */
4
- export {};
5
- //# sourceMappingURL=HttpCacheWrapper.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"HttpCacheWrapper.test.d.ts","sourceRoot":"","sources":["../../../src/cache/__tests__/HttpCacheWrapper.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -1,300 +0,0 @@
1
- /**
2
- * Tests for HttpCacheWrapper
3
- */
4
- import { CacheManager } from "../CacheManager.js";
5
- import { HttpCacheWrapper } from "../HttpCacheWrapper.js";
6
- describe("HttpCacheWrapper", () => {
7
- let cacheManager;
8
- let httpCache;
9
- let mockRequestFn;
10
- beforeEach(() => {
11
- cacheManager = new CacheManager({
12
- maxSize: 100,
13
- defaultTTL: 1000,
14
- enableLRU: true,
15
- enableStats: true,
16
- });
17
- httpCache = new HttpCacheWrapper(cacheManager, "test-site");
18
- mockRequestFn = jest.fn();
19
- });
20
- afterEach(() => {
21
- cacheManager.clear();
22
- jest.clearAllMocks();
23
- });
24
- describe("Request Caching", () => {
25
- test("should cache GET requests", async () => {
26
- const mockResponse = {
27
- data: { id: 1, title: "Test Post" },
28
- status: 200,
29
- headers: {},
30
- };
31
- mockRequestFn.mockResolvedValue(mockResponse);
32
- const requestOptions = {
33
- method: "GET",
34
- url: "https://example.com/wp-json/wp/v2/posts",
35
- headers: {},
36
- params: {},
37
- };
38
- // First request should hit the API
39
- const result1 = await httpCache.request(mockRequestFn, requestOptions);
40
- expect(mockRequestFn).toHaveBeenCalledTimes(1);
41
- expect(result1.data).toEqual(mockResponse.data);
42
- expect(result1.cached).toBe(false);
43
- // Second request should use cache
44
- const result2 = await httpCache.request(mockRequestFn, requestOptions);
45
- expect(mockRequestFn).toHaveBeenCalledTimes(1); // No additional call
46
- expect(result2.data).toEqual(mockResponse.data);
47
- expect(result2.cached).toBe(true);
48
- });
49
- test("should not cache non-GET requests", async () => {
50
- const mockResponse = {
51
- data: { id: 1, title: "Test Post" },
52
- status: 201,
53
- headers: {},
54
- };
55
- mockRequestFn.mockResolvedValue(mockResponse);
56
- const requestOptions = {
57
- method: "POST",
58
- url: "https://example.com/wp-json/wp/v2/posts",
59
- headers: {},
60
- params: {},
61
- data: { title: "New Post" },
62
- };
63
- // Both requests should hit the API
64
- const result1 = await httpCache.request(mockRequestFn, requestOptions);
65
- const result2 = await httpCache.request(mockRequestFn, requestOptions);
66
- expect(mockRequestFn).toHaveBeenCalledTimes(2);
67
- expect(result1.cached).toBeUndefined();
68
- expect(result2.cached).toBeUndefined();
69
- });
70
- test("should not cache error responses", async () => {
71
- const errorResponse = {
72
- data: { error: "Not found" },
73
- status: 404,
74
- headers: {},
75
- };
76
- mockRequestFn.mockResolvedValue(errorResponse);
77
- const requestOptions = {
78
- method: "GET",
79
- url: "https://example.com/wp-json/wp/v2/posts/999",
80
- headers: {},
81
- params: {},
82
- };
83
- // Both requests should hit the API (no caching of 404)
84
- await httpCache.request(mockRequestFn, requestOptions);
85
- await httpCache.request(mockRequestFn, requestOptions);
86
- expect(mockRequestFn).toHaveBeenCalledTimes(2);
87
- });
88
- test("should generate ETags for responses", async () => {
89
- const mockResponse = {
90
- data: { id: 1, title: "Test Post" },
91
- status: 200,
92
- headers: {},
93
- };
94
- mockRequestFn.mockResolvedValue(mockResponse);
95
- const requestOptions = {
96
- method: "GET",
97
- url: "https://example.com/wp-json/wp/v2/posts/1",
98
- headers: {},
99
- params: {},
100
- };
101
- const result = await httpCache.request(mockRequestFn, requestOptions);
102
- expect(result.headers.etag).toBeDefined();
103
- expect(result.headers.etag).toMatch(/^"[a-f0-9]{32}"$/);
104
- expect(result.headers["last-modified"]).toBeDefined();
105
- expect(result.headers["cache-control"]).toBeDefined();
106
- });
107
- });
108
- describe("Cache Invalidation", () => {
109
- test("should invalidate specific endpoint", async () => {
110
- // Cache a response
111
- const mockResponse = {
112
- data: { id: 1, title: "Test Post" },
113
- status: 200,
114
- headers: {},
115
- };
116
- mockRequestFn.mockResolvedValue(mockResponse);
117
- const requestOptions = {
118
- method: "GET",
119
- url: "https://example.com/wp-json/wp/v2/posts/1",
120
- headers: {},
121
- params: {},
122
- };
123
- await httpCache.request(mockRequestFn, requestOptions);
124
- expect(mockRequestFn).toHaveBeenCalledTimes(1);
125
- // Verify cache hit
126
- await httpCache.request(mockRequestFn, requestOptions);
127
- expect(mockRequestFn).toHaveBeenCalledTimes(1);
128
- // Invalidate cache
129
- httpCache.invalidate("posts/1");
130
- // Should hit API again
131
- await httpCache.request(mockRequestFn, requestOptions);
132
- expect(mockRequestFn).toHaveBeenCalledTimes(2);
133
- });
134
- test("should invalidate by pattern", async () => {
135
- // Cache multiple responses
136
- const responses = [
137
- { url: "posts", data: [{ id: 1 }, { id: 2 }] },
138
- { url: "posts/1", data: { id: 1 } },
139
- { url: "pages/1", data: { id: 1 } },
140
- ];
141
- for (const response of responses) {
142
- mockRequestFn.mockResolvedValueOnce({
143
- data: response.data,
144
- status: 200,
145
- headers: {},
146
- });
147
- await httpCache.request(mockRequestFn, {
148
- method: "GET",
149
- url: `https://example.com/wp-json/wp/v2/${response.url}`,
150
- headers: {},
151
- params: {},
152
- });
153
- }
154
- expect(mockRequestFn).toHaveBeenCalledTimes(3);
155
- // Invalidate all posts
156
- const invalidated = httpCache.invalidatePattern("posts");
157
- expect(invalidated).toBe(2); // Should invalidate 2 post-related entries
158
- // Verify pages cache still works
159
- await httpCache.request(mockRequestFn, {
160
- method: "GET",
161
- url: "https://example.com/wp-json/wp/v2/pages/1",
162
- headers: {},
163
- params: {},
164
- });
165
- expect(mockRequestFn).toHaveBeenCalledTimes(3); // No new call for pages
166
- });
167
- test("should invalidate all cache for site", async () => {
168
- // Cache some responses
169
- const mockResponse = {
170
- data: { id: 1 },
171
- status: 200,
172
- headers: {},
173
- };
174
- mockRequestFn.mockResolvedValue(mockResponse);
175
- await httpCache.request(mockRequestFn, {
176
- method: "GET",
177
- url: "https://example.com/wp-json/wp/v2/posts",
178
- headers: {},
179
- params: {},
180
- });
181
- await httpCache.request(mockRequestFn, {
182
- method: "GET",
183
- url: "https://example.com/wp-json/wp/v2/pages",
184
- headers: {},
185
- params: {},
186
- });
187
- expect(mockRequestFn).toHaveBeenCalledTimes(2);
188
- // Clear all cache
189
- const invalidated = httpCache.invalidateAll();
190
- expect(invalidated).toBeGreaterThan(0);
191
- // Verify cache is cleared
192
- await httpCache.request(mockRequestFn, {
193
- method: "GET",
194
- url: "https://example.com/wp-json/wp/v2/posts",
195
- headers: {},
196
- params: {},
197
- });
198
- expect(mockRequestFn).toHaveBeenCalledTimes(3);
199
- });
200
- });
201
- describe("Cache Warming", () => {
202
- test("should pre-warm cache with data", () => {
203
- const endpoint = "posts";
204
- const data = [
205
- { id: 1, title: "Post 1" },
206
- { id: 2, title: "Post 2" },
207
- ];
208
- const params = { per_page: 10 };
209
- httpCache.warm(endpoint, data, params);
210
- // Verify cache entry exists
211
- const cacheKey = cacheManager.generateKey("test-site", endpoint, params);
212
- const cached = cacheManager.get(cacheKey);
213
- expect(cached).toBeDefined();
214
- // Test cache structure without conditional expects
215
- const cachedEntry = cached;
216
- expect(cachedEntry).toHaveProperty("data");
217
- expect(cachedEntry).toHaveProperty("etag");
218
- expect(cachedEntry).toHaveProperty("lastModified");
219
- expect(cachedEntry.data).toEqual(data);
220
- });
221
- test("should use warmed cache for requests", async () => {
222
- const endpoint = "posts";
223
- const data = [{ id: 1, title: "Post 1" }];
224
- httpCache.warm(endpoint, data);
225
- const result = await httpCache.request(mockRequestFn, {
226
- method: "GET",
227
- url: "https://example.com/wp-json/wp/v2/posts",
228
- headers: {},
229
- params: {},
230
- });
231
- expect(mockRequestFn).not.toHaveBeenCalled();
232
- expect(result.data).toEqual(data);
233
- expect(result.cached).toBe(true);
234
- });
235
- });
236
- describe("Cache Statistics", () => {
237
- test("should return cache statistics", async () => {
238
- const mockResponse = {
239
- data: { id: 1 },
240
- status: 200,
241
- headers: {},
242
- };
243
- mockRequestFn.mockResolvedValue(mockResponse);
244
- // Generate some cache activity
245
- await httpCache.request(mockRequestFn, {
246
- method: "GET",
247
- url: "https://example.com/wp-json/wp/v2/posts/1",
248
- headers: {},
249
- params: {},
250
- });
251
- await httpCache.request(mockRequestFn, {
252
- method: "GET",
253
- url: "https://example.com/wp-json/wp/v2/posts/1",
254
- headers: {},
255
- params: {},
256
- });
257
- const stats = httpCache.getStats();
258
- expect(stats.hits).toBe(1);
259
- expect(stats.misses).toBe(1);
260
- expect(stats.totalSize).toBe(1);
261
- expect(stats.hitRate).toBe(0.5);
262
- });
263
- });
264
- describe("URL and Endpoint Extraction", () => {
265
- test("should extract endpoint from WordPress API URLs", async () => {
266
- const testCases = [
267
- {
268
- url: "https://example.com/wp-json/wp/v2/posts",
269
- expectedEndpoint: "posts",
270
- },
271
- {
272
- url: "https://example.com/wp-json/wp/v2/posts/123",
273
- expectedEndpoint: "posts/123",
274
- },
275
- {
276
- url: "https://example.com/wp-json/wp/v2/categories?per_page=10",
277
- expectedEndpoint: "categories",
278
- },
279
- ];
280
- const mockResponse = {
281
- data: {},
282
- status: 200,
283
- headers: {},
284
- };
285
- mockRequestFn.mockResolvedValue(mockResponse);
286
- for (const testCase of testCases) {
287
- await httpCache.request(mockRequestFn, {
288
- method: "GET",
289
- url: testCase.url,
290
- headers: {},
291
- params: {},
292
- });
293
- // Verify cache key contains the correct endpoint
294
- const stats = httpCache.getStats();
295
- expect(stats.totalSize).toBeGreaterThan(0);
296
- }
297
- });
298
- });
299
- });
300
- //# sourceMappingURL=HttpCacheWrapper.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"HttpCacheWrapper.test.js","sourceRoot":"","sources":["../../../src/cache/__tests__/HttpCacheWrapper.test.ts"],"names":[],"mappings":"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"}