refactor: Übergangs-API der Gesamtsperre entfernt (assertWritable, writable, refusal, writeFeatures, released); DiviLocked verlangt die gesperrten Fähigkeiten, Tests bauen Zustände über ReleaseMatrices

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Jan-Niclas Loosen
2026-10-18 22:53:00 +02:00
co-authored by Claude Opus 5.5
parent c036a92b60
commit d0d3488df8
21 changed files with 129 additions and 239 deletions
+21 -24
View File
@@ -23,6 +23,7 @@ use LIT\MCP\Plugin;
use LIT\MCP\Tests\Support\FakeChangeLog;
use LIT\MCP\Tests\Support\FeatureFakeTool;
use LIT\MCP\Tests\Support\MatrixFixtures;
use LIT\MCP\Tests\Support\ReleaseMatrices;
use LIT\MCP\Tests\Unit\TestCase;
use Mockery;
use WP_Post;
@@ -197,7 +198,7 @@ final class DiviTabTest extends TestCase
public function testUntestedWithAFreshGreenReportOffersTheRelease(): void
{
$html = $this->rendered(new ReleaseStatus(ReleaseState::Untested, '5.3.0'), self::report());
$html = $this->rendered(ReleaseMatrices::uniform(ReleaseState::Untested), self::report());
self::assertStringContainsString('ungetestet', $html);
self::assertStringContainsString('Prüfung starten', $html);
@@ -207,9 +208,9 @@ final class DiviTabTest extends TestCase
public function testCheckButtonSaysWhatItDoesAndLeadsWhileNothingElseCanBeDone(): void
{
$stale = $this->rendered(new ReleaseStatus(ReleaseState::Untested, '5.3.0'), self::report(true, '5.2.9'));
$fresh = $this->rendered(new ReleaseStatus(ReleaseState::Untested, '5.3.0'), self::report());
$released = $this->rendered(ReleaseStatus::released('5.3.0'), self::report());
$stale = $this->rendered(ReleaseMatrices::uniform(ReleaseState::Untested), self::report(true, '5.2.9'));
$fresh = $this->rendered(ReleaseMatrices::uniform(ReleaseState::Untested), self::report());
$released = $this->rendered(ReleaseMatrices::released('5.3.0'), self::report());
foreach ([$stale, $fresh, $released] as $html) {
self::assertStringContainsString('legt eine private Testseite an', $html);
@@ -222,7 +223,7 @@ final class DiviTabTest extends TestCase
public function testUntestedWithAStaleReportAsksForANewCheck(): void
{
$html = $this->rendered(new ReleaseStatus(ReleaseState::Untested, '5.3.0'), self::report(true, '5.2.9'));
$html = $this->rendered(ReleaseMatrices::uniform(ReleaseState::Untested), self::report(true, '5.2.9'));
self::assertStringNotContainsString('Divi 5.3.0 freigeben', $html);
self::assertStringContainsString('Prüfung erneut ausführen', $html);
@@ -230,7 +231,7 @@ final class DiviTabTest extends TestCase
public function testReleasedFromCodeOffersNeitherReleaseNorWithdrawal(): void
{
$html = $this->rendered(ReleaseStatus::released('5.3.0'), self::report());
$html = $this->rendered(ReleaseMatrices::released('5.3.0'), self::report());
self::assertStringContainsString('freigegeben', $html);
self::assertStringContainsString('im Plugin als getestet hinterlegt', $html);
@@ -240,7 +241,7 @@ final class DiviTabTest extends TestCase
public function testAnAutomaticReleaseSaysSoAndOffersNeitherReleaseNorWithdrawal(): void
{
$html = $this->rendered(ReleaseStatus::released('5.99.0', ReleaseStatus::SOURCE_AUTO), self::report());
$html = $this->rendered(ReleaseMatrices::released('5.99.0', ReleaseStatus::SOURCE_AUTO), self::report());
self::assertStringContainsString('Automatisch freigegeben', $html);
self::assertStringNotContainsString('freigeben</button>', $html);
@@ -249,7 +250,7 @@ final class DiviTabTest extends TestCase
public function testADatabaseReleaseCanBeWithdrawn(): void
{
$status = new ReleaseStatus(ReleaseState::Released, '5.3.0', ReleaseStatus::SOURCE_DATABASE, [], [
$status = ReleaseMatrices::released('5.3.0', ReleaseStatus::SOURCE_DATABASE, [
'released_at' => '2026-10-01T08:00:00+00:00', 'user_id' => 1,
]);
@@ -287,7 +288,7 @@ final class DiviTabTest extends TestCase
public function testIncompatibleListsTheProblems(): void
{
$html = $this->rendered(
new ReleaseStatus(ReleaseState::Incompatible, '5.3.0', null, ['Theme Builder: Nachbau von x() – y']),
ReleaseMatrices::uniform(ReleaseState::Incompatible, '5.3.0', ['Theme Builder: Nachbau von x() – y']),
null
);
@@ -316,7 +317,7 @@ final class DiviTabTest extends TestCase
$tab = $this->tab(self::report(), Mockery::mock(ReleaseStore::class));
$tab->removeOrphans();
$html = $this->rendered(ReleaseStatus::released('5.3.0'), self::report(), $tab);
$html = $this->rendered(ReleaseMatrices::released('5.3.0'), self::report(), $tab);
self::assertStringContainsString('Liegengebliebene Prüfseiten gelöscht: 51', $html);
}
@@ -326,7 +327,7 @@ final class DiviTabTest extends TestCase
Functions\expect('get_posts')->never();
Functions\expect('wp_delete_post')->never();
$html = $this->rendered(ReleaseStatus::released('5.3.0'), self::report());
$html = $this->rendered(ReleaseMatrices::released('5.3.0'), self::report());
self::assertStringNotContainsString('Liegengebliebene Prüfseiten', $html);
}
@@ -367,7 +368,7 @@ final class DiviTabTest extends TestCase
new FeatureStatus(DiviFeature::Catalog, ReleaseState::Untested, [], null),
]);
return new ReleaseStatus(ReleaseState::Incompatible, '5.3.0', null, [], null, matrix: $matrix);
return ReleaseStatus::of('5.3.0', $matrix);
}
public function testTheFeatureTableShowsStateSourceProblemsAndTools(): void
@@ -403,11 +404,11 @@ final class DiviTabTest extends TestCase
public function testTheTableNamesEverySourceInWords(): void
{
$code = $this->rendered(ReleaseStatus::released('5.3.0'), null);
$code = $this->rendered(ReleaseMatrices::released('5.3.0'), null);
$database = $this->rendered(
new ReleaseStatus(ReleaseState::Released, '5.3.0', ReleaseStatus::SOURCE_DATABASE, [], [
ReleaseStatus::of('5.3.0', MatrixFixtures::released('database'), [
'released_at' => '2026-10-01T08:00:00+00:00', 'user_id' => 1,
], matrix: MatrixFixtures::released('database')),
]),
self::report()
);
@@ -417,7 +418,7 @@ final class DiviTabTest extends TestCase
public function testTheTabExplainsTheAutomationAndTheFilter(): void
{
$html = $this->rendered(ReleaseStatus::released('5.3.0'), null);
$html = $this->rendered(ReleaseMatrices::released('5.3.0'), null);
self::assertStringContainsString('gibt LIT MCP jede Fähigkeit einzeln frei', $html);
self::assertStringContainsString('<code>lit_mcp_divi_auto_release</code>', $html);
@@ -429,11 +430,7 @@ final class DiviTabTest extends TestCase
public function testTheTabNoLongerSaysWritingIsLockedAsAWhole(): void
{
$untested = $this->rendered(
new ReleaseStatus(
ReleaseState::Untested,
'5.3.0',
matrix: MatrixFixtures::with(DiviFeature::Catalog, ReleaseState::Untested)
),
ReleaseStatus::of('5.3.0', MatrixFixtures::with(DiviFeature::Catalog, ReleaseState::Untested)),
null
);
$incompatible = $this->rendered(self::mixedStatus(), null);
@@ -450,9 +447,9 @@ final class DiviTabTest extends TestCase
$matrix = MatrixFixtures::released('database', [
new FeatureStatus(DiviFeature::PageWrite, ReleaseState::Incompatible, ['Seiten: x() fehlt'], null),
]);
$status = new ReleaseStatus(ReleaseState::Incompatible, '5.3.0', ReleaseStatus::SOURCE_DATABASE, [], [
$status = ReleaseStatus::of('5.3.0', $matrix, [
'released_at' => '2026-10-01T08:00:00+00:00', 'user_id' => 1,
], matrix: $matrix);
]);
self::assertStringContainsString('Freigabe zurückziehen', $this->rendered($status, self::report()));
}
@@ -495,7 +492,7 @@ final class DiviTabTest extends TestCase
public function testNoNoticeWhileEveryFeatureIsUsable(): void
{
self::assertSame('', $this->notice(ReleaseStatus::released('5.3.0')));
self::assertSame('', $this->notice(ReleaseMatrices::released('5.3.0')));
}
public function testNoNoticeForUsersWithoutManageOptions(): void