refactor(wpmc S7): tighten tests + cleanup bootstrap shims
tests / phpunit (push) Has been cancelled

- PluginBootS7Test idempotency: assertTrue(class_exists) instead of assertTrue(true)
- ZipArchiveBuildTest: try/finally cleanup + unzip exit-code check
- bootstrap.php: drop unused PUC shims (wp_remote_post, transient*)
- CHANGELOG.md: header references Keep a Changelog (was: mirrors readme.txt)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
Vladimir Bryzgalov
2026-05-17 12:31:07 +05:00
parent 3f08bf6a5e
commit 43815dea2d
4 changed files with 44 additions and 55 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
# Changelog # Changelog
All notable changes to wp-multi-city. Format mirrors `readme.txt`. All notable changes to wp-multi-city. Format follows [Keep a Changelog](https://keepachangelog.com/).
## [1.0.0] — 2026-05-17 ## [1.0.0] — 2026-05-17
+4 -1
View File
@@ -41,6 +41,9 @@ final class PluginBootS7Test extends TestCase
Plugin::instance()->boot(); Plugin::instance()->boot();
Plugin::instance()->boot(); Plugin::instance()->boot();
self::assertTrue(true, 'Double boot must not throw'); self::assertTrue(
class_exists('YahnisElsts\\PluginUpdateChecker\\v5\\PucFactory'),
'PucFactory must still be loaded after double boot()'
);
} }
} }
+39 -32
View File
@@ -25,40 +25,47 @@ final class ZipArchiveBuildTest extends BaseTestCase
exec($cmd, $out, $rc); exec($cmd, $out, $rc);
self::assertSame(0, $rc, 'git archive failed: ' . implode("\n", $out)); self::assertSame(0, $rc, 'git archive failed: ' . implode("\n", $out));
exec('unzip -l ' . escapeshellarg($zipPath), $listing); try {
$joined = implode("\n", $listing); $listing = [];
$unzipRc = 0;
exec('unzip -l ' . escapeshellarg($zipPath), $listing, $unzipRc);
self::assertSame(0, $unzipRc, 'unzip -l failed (is unzip installed?)');
$joined = implode("\n", $listing);
$required = [ $required = [
'wp-multi-city/wp-multi-city.php', 'wp-multi-city/wp-multi-city.php',
'wp-multi-city/includes/lib/plugin-update-checker/plugin-update-checker.php', 'wp-multi-city/includes/lib/plugin-update-checker/plugin-update-checker.php',
'wp-multi-city/wp-plugin-info.json', 'wp-multi-city/wp-plugin-info.json',
'wp-multi-city/readme.txt', 'wp-multi-city/readme.txt',
'wp-multi-city/README.md', 'wp-multi-city/README.md',
]; ];
foreach ($required as $path) { foreach ($required as $path) {
self::assertStringContainsString($path, $joined, "missing in archive: {$path}"); self::assertStringContainsString($path, $joined, "missing in archive: {$path}");
}
$forbidden = [
'tests/',
'docs/',
'composer.json',
'phpunit.xml.dist',
'patchwork.json',
'release.sh',
'CLAUDE.md',
'.gitattributes',
'.gitea/',
];
foreach ($forbidden as $path) {
self::assertStringNotContainsString(
'wp-multi-city/' . $path,
$joined,
"dev file leaked into archive: {$path}"
);
}
} finally {
if (file_exists($zipPath)) {
unlink($zipPath);
}
} }
$forbidden = [
'tests/',
'docs/',
'composer.json',
'phpunit.xml.dist',
'patchwork.json',
'release.sh',
'CLAUDE.md',
'.gitattributes',
'.gitea/',
];
foreach ($forbidden as $path) {
self::assertStringNotContainsString(
'wp-multi-city/' . $path,
$joined,
"dev file leaked into archive: {$path}"
);
}
unlink($zipPath);
} }
public function test_wp_plugin_info_json_is_valid(): void public function test_wp_plugin_info_json_is_valid(): void
-21
View File
@@ -68,21 +68,6 @@ if (!function_exists('update_option')) {
return true; return true;
} }
} }
if (!function_exists('set_transient')) {
function set_transient(string $key, $value, int $expiry = 0): bool {
return true;
}
}
if (!function_exists('get_transient')) {
function get_transient(string $key) {
return false;
}
}
if (!function_exists('delete_transient')) {
function delete_transient(string $key): bool {
return true;
}
}
if (!function_exists('wp_next_scheduled')) { if (!function_exists('wp_next_scheduled')) {
function wp_next_scheduled(string $hook, array $args = []) { function wp_next_scheduled(string $hook, array $args = []) {
return false; return false;
@@ -114,12 +99,6 @@ if (!function_exists('wp_remote_get')) {
return false; return false;
} }
} }
if (!function_exists('wp_remote_post')) {
function wp_remote_post(string $url, array $args = []) {
return false;
}
}
require_once __DIR__ . '/../includes/class-plugin.php'; require_once __DIR__ . '/../includes/class-plugin.php';
\WPMultiCity\Plugin::register_autoloader(); \WPMultiCity\Plugin::register_autoloader();