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.
- package/README.md +19 -15
- package/bin/status.js +1 -1
- package/dist/config/ServerConfiguration.d.ts.map +1 -1
- package/dist/config/ServerConfiguration.js +23 -2
- package/dist/config/ServerConfiguration.js.map +1 -1
- package/docs/INSTALLATION.md +4 -2
- package/docs/TROUBLESHOOTING.md +2 -1
- package/docs/developer/TESTING.md +24 -19
- package/docs/integrations/claude-desktop.md +9 -4
- package/docs/user-guides/DXT_INSTALLATION.md +2 -1
- package/package.json +28 -29
- package/src/config/ServerConfiguration.ts +22 -2
- package/dist/ajv-patch.js +0 -34
- package/dist/cache/__tests__/CacheInvalidation.test.d.ts +0 -5
- package/dist/cache/__tests__/CacheInvalidation.test.d.ts.map +0 -1
- package/dist/cache/__tests__/CacheInvalidation.test.js +0 -238
- package/dist/cache/__tests__/CacheInvalidation.test.js.map +0 -1
- package/dist/cache/__tests__/CacheManager.test.d.ts +0 -5
- package/dist/cache/__tests__/CacheManager.test.d.ts.map +0 -1
- package/dist/cache/__tests__/CacheManager.test.js +0 -233
- package/dist/cache/__tests__/CacheManager.test.js.map +0 -1
- package/dist/cache/__tests__/CachedWordPressClient.test.d.ts +0 -5
- package/dist/cache/__tests__/CachedWordPressClient.test.d.ts.map +0 -1
- package/dist/cache/__tests__/CachedWordPressClient.test.js +0 -231
- package/dist/cache/__tests__/CachedWordPressClient.test.js.map +0 -1
- package/dist/cache/__tests__/HttpCacheWrapper.test.d.ts +0 -5
- package/dist/cache/__tests__/HttpCacheWrapper.test.d.ts.map +0 -1
- package/dist/cache/__tests__/HttpCacheWrapper.test.js +0 -300
- package/dist/cache/__tests__/HttpCacheWrapper.test.js.map +0 -1
- 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 +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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"}
|