Files
laralog/tests/Feature/PluginDependencyTest.php
T
ak 4f59afb7ce feat: 插件依赖强制校验 + 文章后台表单/表格注入 hook
- PluginManager: requires 依赖链校验(enable 需依赖已启用,disable 阻止有启用依赖者的插件,boot 跳过依赖未满足插件),all() 输出依赖状态供后台展示
- Plugins 页:卡片显示依赖链徽章,依赖未满足时禁用启用按钮,启停失败弹错误通知
- PostResource: form()/table() 增加 filament.post_form / filament.post_table 注入点
- membership 插件:注入「付费设置」Section(meta.price 单篇价格 + meta.members_only 会员专享)与表格价格/会员列
2026-08-12 00:18:40 +08:00

102 lines
3.4 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
declare(strict_types=1);
namespace Tests\Feature;
use App\Blog\Support\PluginManager;
use Illuminate\Foundation\Testing\RefreshDatabase;
use RuntimeException;
use Tests\TestCase;
class PluginDependencyTest extends TestCase
{
use RefreshDatabase;
private function manager(): PluginManager
{
return app(PluginManager::class);
}
public function test_enable_plugin_with_disabled_dependency_throws(): void
{
$manager = $this->manager();
// 先停用无依赖者的 membership,再停用 payment(此时无启用的依赖者)
$manager->disable('neatstudio.membership');
$manager->disable('neatstudio.payment');
try {
$manager->enable('neatstudio.membership');
$this->fail('依赖未启用时应抛出异常');
} catch (RuntimeException $e) {
$this->assertStringContainsString('neatstudio.payment', $e->getMessage());
}
$this->assertFalse($manager->isEnabled('neatstudio.membership'));
}
public function test_disable_plugin_with_enabled_dependent_throws(): void
{
$manager = $this->manager();
// 默认状态下 payment 已启用且 membership 依赖它
try {
$manager->disable('neatstudio.payment');
$this->fail('存在已启用的依赖者时应抛出异常');
} catch (RuntimeException $e) {
$this->assertStringContainsString('neatstudio.membership', $e->getMessage());
}
$this->assertTrue($manager->isEnabled('neatstudio.payment'));
}
public function test_disable_plugin_without_dependents_works(): void
{
$manager = $this->manager();
$manager->disable('neatstudio.membership');
$this->assertFalse($manager->isEnabled('neatstudio.membership'));
// 依赖(payment)仍启用,可重新启用
$manager->enable('neatstudio.membership');
$this->assertTrue($manager->isEnabled('neatstudio.membership'));
}
public function test_all_reports_dependency_status(): void
{
$manager = $this->manager();
$plugins = $manager->all();
$member = $plugins['neatstudio.membership'];
$this->assertSame(['neatstudio.payment'], $member['requires']);
$this->assertTrue($member['dependencies'][0]['ok']);
$this->assertEmpty($member['dependency_errors']);
// 停用依赖后,依赖状态应变为失败
$manager->disable('neatstudio.membership');
$manager->disable('neatstudio.payment');
$plugins = $manager->all();
$this->assertFalse($plugins['neatstudio.membership']['dependencies'][0]['ok']);
$this->assertSame(['neatstudio.payment'], $plugins['neatstudio.membership']['dependency_errors']);
}
public function test_dependency_problems_for_missing_plugin(): void
{
$manager = $this->manager();
// 默认依赖完好
$this->assertSame([], $manager->dependencyProblems('neatstudio.membership'));
// 停用依赖后出现问题(先停用无依赖者的 membership
$manager->disable('neatstudio.membership');
$manager->disable('neatstudio.payment');
$this->assertNotEmpty($manager->dependencyProblems('neatstudio.membership'));
// 不存在的插件没有依赖问题(空 requires)
$this->assertSame([], $manager->dependencyProblems('neatstudio.does-not-exist'));
}
}