@wp-tester/phpunit 0.0.1 → 0.0.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.
@@ -0,0 +1,25 @@
1
+ import type { ResolvedEnvironment } from '@wp-tester/config';
2
+ /**
3
+ * Download WordPress test library from GitHub and cache it locally
4
+ * Uses temp directory with atomic rename to prevent race conditions
5
+ *
6
+ * @param version - WordPress version (e.g., "6.9" or "6.4.1")
7
+ * @param baseCacheDir - Optional base cache directory (for testing)
8
+ * @returns Path to cached test library directory
9
+ */
10
+ export declare function downloadWordPressTestLib(version: string, baseCacheDir?: string): Promise<string>;
11
+ /**
12
+ * Mount WordPress test library to environment and add initialization steps
13
+ *
14
+ * IMPORTANT: This function is designed for UNIT TESTS ONLY.
15
+ * For integration tests, use the standard WordPress installation (wp-load.php).
16
+ *
17
+ * The WordPress test library provides test utilities and a clean test database,
18
+ * but expects to control WordPress initialization itself. Integration tests that
19
+ * load WordPress before the test library's bootstrap can cause conflicts.
20
+ *
21
+ * @param environment - Environment configuration
22
+ * @returns Environment with test library mount and initialization steps added
23
+ */
24
+ export declare function mountWordPressTestLibrary(environment: ResolvedEnvironment): Promise<ResolvedEnvironment>;
25
+ //# sourceMappingURL=wordpress-test-lib.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wordpress-test-lib.d.ts","sourceRoot":"","sources":["../src/wordpress-test-lib.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAsH7D;;;;;;;GAOG;AACH,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,MAAM,EACf,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,MAAM,CAAC,CA6HjB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,yBAAyB,CAC7C,WAAW,EAAE,mBAAmB,GAC/B,OAAO,CAAC,mBAAmB,CAAC,CAiE9B"}
@@ -0,0 +1,280 @@
1
+ import * as fs from 'node:fs';
2
+ import * as path from 'node:path';
3
+ import * as os from 'node:os';
4
+ import * as crypto from 'node:crypto';
5
+ import * as yauzl from 'yauzl';
6
+ import { cacheFetch } from './cache-fetch.js';
7
+ import { resolveWordPressRelease } from '@wp-playground/wordpress';
8
+ /**
9
+ * Calculate checksum of a file
10
+ */
11
+ function calculateFileChecksum(filePath) {
12
+ const content = fs.readFileSync(filePath);
13
+ return crypto.createHash('sha256').update(content).digest('hex');
14
+ }
15
+ /**
16
+ * Find the closest matching WordPress test library version tag
17
+ * WordPress might use 6.9, but wordpress-develop uses 6.9.0
18
+ *
19
+ * Falls back to assuming exact tag exists if GitHub API is unavailable
20
+ */
21
+ async function findMatchingTag(requestedVersion) {
22
+ try {
23
+ const response = await fetch('https://api.github.com/repos/WordPress/wordpress-develop/tags?per_page=100', {
24
+ headers: {
25
+ 'User-Agent': 'wp-tester',
26
+ 'Accept': 'application/vnd.github.v3+json'
27
+ }
28
+ });
29
+ // Check for non-200 status codes
30
+ if (!response.ok) {
31
+ console.warn(`GitHub API returned status ${response.status}. Attempting fallback version resolution.`);
32
+ const fallbackTag = inferTagName(requestedVersion);
33
+ if (fallbackTag) {
34
+ return fallbackTag;
35
+ }
36
+ throw new Error(`GitHub API returned status ${response.status} and could not infer tag name for version ${requestedVersion}`);
37
+ }
38
+ const tags = await response.json();
39
+ // Try exact match first
40
+ const exactMatch = tags.find(tag => tag.name === requestedVersion);
41
+ if (exactMatch) {
42
+ return exactMatch.name;
43
+ }
44
+ // Parse version to try X.Y.0 pattern
45
+ const versionMatch = requestedVersion.match(/^(\d+\.\d+)(?:\.(\d+))?$/);
46
+ if (versionMatch) {
47
+ const [, baseVersion, patch] = versionMatch;
48
+ // If no patch version provided (e.g., "6.9"), try X.Y.0
49
+ if (!patch) {
50
+ const tagWithZero = tags.find((tag) => tag.name === `${baseVersion}.0`);
51
+ if (tagWithZero) {
52
+ return tagWithZero.name;
53
+ }
54
+ }
55
+ // Try to find closest patch version
56
+ const matchingTags = tags.filter((tag) => tag.name.startsWith(`${baseVersion}.`));
57
+ if (matchingTags.length > 0) {
58
+ const closest = matchingTags[0];
59
+ return closest.name;
60
+ }
61
+ }
62
+ throw new Error(`No matching WordPress test library tag found for version ${requestedVersion}`);
63
+ }
64
+ catch (error) {
65
+ // Fallback on any error (network, parse, etc.)
66
+ if (error instanceof Error && error.message.includes('GitHub API returned status')) {
67
+ // Already handled above, just rethrow if no fallback
68
+ throw error;
69
+ }
70
+ console.warn(`Failed to fetch GitHub tags: ${error instanceof Error ? error.message : 'Unknown error'}. Attempting fallback version resolution.`);
71
+ const fallbackTag = inferTagName(requestedVersion);
72
+ if (fallbackTag) {
73
+ return fallbackTag;
74
+ }
75
+ throw error;
76
+ }
77
+ }
78
+ /**
79
+ * Infer the tag name from a version string when GitHub API is unavailable
80
+ * Converts "6.9" to "6.9.0", keeps "6.4.1" as is
81
+ */
82
+ function inferTagName(version) {
83
+ const versionMatch = version.match(/^(\d+\.\d+)(?:\.(\d+))?$/);
84
+ if (!versionMatch) {
85
+ return null; // Invalid version format
86
+ }
87
+ const [, baseVersion, patch] = versionMatch;
88
+ // If no patch version, assume .0
89
+ if (!patch) {
90
+ return `${baseVersion}.0`;
91
+ }
92
+ // Already has patch version, use as-is
93
+ return version;
94
+ }
95
+ /**
96
+ * Download WordPress test library from GitHub and cache it locally
97
+ * Uses temp directory with atomic rename to prevent race conditions
98
+ *
99
+ * @param version - WordPress version (e.g., "6.9" or "6.4.1")
100
+ * @param baseCacheDir - Optional base cache directory (for testing)
101
+ * @returns Path to cached test library directory
102
+ */
103
+ export async function downloadWordPressTestLib(version, baseCacheDir) {
104
+ const cacheBase = baseCacheDir || path.join(os.homedir(), '.wp-tester', 'cache');
105
+ // Find the matching tag on GitHub (e.g., "6.9" -> "6.9.0")
106
+ const actualTag = await findMatchingTag(version);
107
+ const finalDir = path.join(cacheBase, 'test-lib', actualTag);
108
+ const checksumFile = path.join(finalDir, '.checksum');
109
+ const url = `https://github.com/WordPress/wordpress-develop/archive/refs/tags/${actualTag}.zip`;
110
+ // Download and cache the zip file (cache expires after 24 hours by default)
111
+ const zipPath = await cacheFetch({
112
+ baseCacheDir: cacheBase,
113
+ cacheKey: `test-lib-zip/${actualTag}`,
114
+ url,
115
+ });
116
+ // Calculate checksum of the zip file
117
+ const currentChecksum = calculateFileChecksum(zipPath);
118
+ // Check if we already have this exact version extracted
119
+ if (fs.existsSync(checksumFile)) {
120
+ const existingChecksum = fs.readFileSync(checksumFile, 'utf-8').trim();
121
+ if (existingChecksum === currentChecksum) {
122
+ // Already extracted with same checksum, return existing directory
123
+ return finalDir;
124
+ }
125
+ }
126
+ // Extract to temporary directory first
127
+ const tempDir = fs.mkdtempSync(path.join(cacheBase, `temp-${actualTag}-`));
128
+ try {
129
+ // Extract zip file using yauzl (lightweight zip parser)
130
+ await new Promise((resolve, reject) => {
131
+ yauzl.open(zipPath, { lazyEntries: true }, (err, zipfile) => {
132
+ if (err || !zipfile) {
133
+ reject(err || new Error('Failed to open zip file'));
134
+ return;
135
+ }
136
+ const testPrefix = 'tests/phpunit/';
137
+ let extractedFiles = 0;
138
+ zipfile.readEntry();
139
+ zipfile.on('entry', (entry) => {
140
+ // Skip directories
141
+ if (/\/$/.test(entry.fileName)) {
142
+ zipfile.readEntry();
143
+ return;
144
+ }
145
+ // Only extract files from tests/phpunit/
146
+ if (entry.fileName.includes(testPrefix)) {
147
+ const idx = entry.fileName.indexOf(testPrefix);
148
+ if (idx !== -1) {
149
+ const relativePath = entry.fileName.substring(idx + testPrefix.length);
150
+ const targetPath = path.join(tempDir, relativePath);
151
+ // Ensure parent directory exists
152
+ fs.mkdirSync(path.dirname(targetPath), { recursive: true });
153
+ // Extract file
154
+ zipfile.openReadStream(entry, (err, readStream) => {
155
+ if (err || !readStream) {
156
+ reject(err || new Error('Failed to read zip entry'));
157
+ return;
158
+ }
159
+ const writeStream = fs.createWriteStream(targetPath);
160
+ readStream.pipe(writeStream);
161
+ writeStream.on('close', () => {
162
+ extractedFiles++;
163
+ zipfile.readEntry();
164
+ });
165
+ writeStream.on('error', reject);
166
+ readStream.on('error', reject);
167
+ });
168
+ return;
169
+ }
170
+ }
171
+ zipfile.readEntry();
172
+ });
173
+ zipfile.on('end', () => {
174
+ if (extractedFiles === 0) {
175
+ reject(new Error('No test files found in archive'));
176
+ }
177
+ else {
178
+ resolve();
179
+ }
180
+ });
181
+ zipfile.on('error', reject);
182
+ });
183
+ });
184
+ // Write checksum file
185
+ fs.writeFileSync(path.join(tempDir, '.checksum'), currentChecksum);
186
+ // Atomic operation: remove old directory and rename temp to final
187
+ // If final directory exists, remove it
188
+ if (fs.existsSync(finalDir)) {
189
+ fs.rmSync(finalDir, { recursive: true, force: true });
190
+ }
191
+ // Ensure parent directory exists
192
+ fs.mkdirSync(path.dirname(finalDir), { recursive: true });
193
+ // Rename is atomic on most filesystems - if multiple processes try this,
194
+ // only one will succeed, others will fail and retry
195
+ fs.renameSync(tempDir, finalDir);
196
+ return finalDir;
197
+ }
198
+ catch (error) {
199
+ // Clean up temp directory on failure
200
+ if (fs.existsSync(tempDir)) {
201
+ fs.rmSync(tempDir, { recursive: true, force: true });
202
+ }
203
+ throw new Error(`Failed to download WordPress test library version ${version} (tag: ${actualTag}). Please ensure the version exists in the WordPress repository: ${error.message}`);
204
+ }
205
+ }
206
+ /**
207
+ * Mount WordPress test library to environment and add initialization steps
208
+ *
209
+ * IMPORTANT: This function is designed for UNIT TESTS ONLY.
210
+ * For integration tests, use the standard WordPress installation (wp-load.php).
211
+ *
212
+ * The WordPress test library provides test utilities and a clean test database,
213
+ * but expects to control WordPress initialization itself. Integration tests that
214
+ * load WordPress before the test library's bootstrap can cause conflicts.
215
+ *
216
+ * @param environment - Environment configuration
217
+ * @returns Environment with test library mount and initialization steps added
218
+ */
219
+ export async function mountWordPressTestLibrary(environment) {
220
+ // Resolve WordPress version from environment
221
+ const wpRelease = await resolveWordPressRelease(environment.blueprint.preferredVersions.wp);
222
+ const wpVersion = wpRelease.version;
223
+ // Download and cache test library
224
+ const cachePath = await downloadWordPressTestLib(wpVersion);
225
+ // Create wp-tests-config.php content
226
+ const wpTestsConfig = `<?php
227
+ /* Path to the WordPress codebase you'd like to test. */
228
+ define( 'ABSPATH', '/wordpress/' );
229
+
230
+ // Test Database - Use separate database to avoid conflicts with main WordPress installation
231
+ // The test library's install.php drops all tables, so we need isolation
232
+ define( 'DB_NAME', 'wordpress_test' );
233
+ define( 'DB_USER', 'root' );
234
+ define( 'DB_PASSWORD', '' );
235
+ define( 'DB_HOST', 'localhost' );
236
+ define( 'DB_CHARSET', 'utf8' );
237
+ define( 'DB_COLLATE', '' );
238
+
239
+ $table_prefix = 'wptests_';
240
+
241
+ // Use a generic domain that tests can override via update_option('home')
242
+ // Don't use Playground's actual domain here as it prevents tests from
243
+ // dynamically changing the home URL for mock HTTP requests
244
+ define( 'WP_TESTS_DOMAIN', 'example.org' );
245
+ define( 'WP_TESTS_EMAIL', 'admin@example.org' );
246
+ define( 'WP_TESTS_TITLE', 'Test Blog' );
247
+
248
+ define( 'WP_PHP_BINARY', 'php' );
249
+ define( 'WPLANG', '' );
250
+ `;
251
+ // Build blueprint steps for initialization
252
+ // For unit tests, we only need to write the wp-tests-config.php file
253
+ // WordPress initialization is handled by the user's bootstrap via test library's bootstrap
254
+ const initSteps = [
255
+ // Write wp-tests-config.php
256
+ {
257
+ step: 'writeFile',
258
+ path: '/tmp/wordpress-tests-lib/wp-tests-config.php',
259
+ data: wpTestsConfig,
260
+ },
261
+ ];
262
+ // Add initialization steps to blueprint
263
+ const existingSteps = environment.blueprint.steps || [];
264
+ // Return environment copy with test library mount and initialization steps added
265
+ return {
266
+ ...environment,
267
+ blueprint: {
268
+ ...environment.blueprint,
269
+ steps: [...existingSteps, ...initSteps],
270
+ },
271
+ mounts: [
272
+ ...environment.mounts,
273
+ {
274
+ hostPath: cachePath,
275
+ vfsPath: '/tmp/wordpress-tests-lib',
276
+ },
277
+ ],
278
+ };
279
+ }
280
+ //# sourceMappingURL=wordpress-test-lib.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wordpress-test-lib.js","sourceRoot":"","sources":["../src/wordpress-test-lib.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wp-tester/phpunit",
3
- "version": "0.0.1",
3
+ "version": "0.0.2",
4
4
  "description": "PHPUnit test runner for WordPress projects",
5
5
  "type": "module",
6
6
  "private": false,
@@ -20,15 +20,18 @@
20
20
  "build": "node ../../scripts/build-package.js",
21
21
  "test": "vitest run",
22
22
  "test:watch": "vitest",
23
+ "test:real-world": "vitest run real-world-plugins",
24
+ "test:compatibility": "vitest run --config vitest.compatibility.config.ts",
23
25
  "lint": "eslint .",
24
26
  "lint:fix": "eslint . --fix",
25
27
  "type-check": "tsc --noEmit"
26
28
  },
27
29
  "dependencies": {
28
- "@wp-tester/config": "^0.0.1",
29
- "@wp-tester/results": "^0.0.1",
30
- "@wp-tester/runtime": "^0.0.1",
31
- "xml2js": "^0.6.2"
30
+ "@wp-tester/config": "^0.0.2",
31
+ "@wp-tester/results": "^0.0.2",
32
+ "@wp-tester/runtime": "^0.0.2",
33
+ "xml2js": "^0.6.2",
34
+ "yauzl": "*"
32
35
  },
33
36
  "devDependencies": {
34
37
  "@types/xml2js": "^0.4.14",