allows('canCustomize')->andReturn($customize); return new CustomCssRestorePlanner(new FakeCustomCssStore(), $options); } public function testDescribesItsAreaRightsAndFeatures(): void { Functions\when('current_user_can')->justReturn(true); $planner = $this->planner(); self::assertSame('custom_css', $planner->area()); self::assertInstanceOf(CustomCssArea::class, $planner->designArea()); self::assertSame([DiviFeature::ThemeOptionRead, DiviFeature::ThemeOptionWrite], $planner->features()); self::assertNull($planner->rights()); Functions\when('current_user_can')->alias(static fn (string $cap): bool => $cap !== 'edit_css'); self::assertToolError($planner->rights(), 'forbidden'); } public function testThePlanReplacesTheWholeTextWithTheSnapshots(): void { $plan = $this->planner()->plan( ['stylesheet' => 'Divi', 'css' => ".new{}\n.keep{}"], ['stylesheet' => 'Divi', 'css' => ".old{}\n.keep{}"], 'custom_css-20261105T100000Z-abc123' ); self::assertInstanceOf(DesignPlan::class, $plan); self::assertSame(['stylesheet' => 'Divi', 'css' => ".old{}\n.keep{}"], $plan->raw); self::assertTrue($plan->mayRemove); self::assertSame([ ['action' => 'removed', 'line' => '.new{}'], ['action' => 'added', 'line' => '.old{}'], ], $plan->diff); self::assertStringStartsWith('Snapshot custom_css-20261105T100000Z-abc123 wiederherstellen', $plan->summary); self::assertSame([CustomCssArea::SITE_WIDE], $plan->warnings); } public function testAnUnchangedTextIsAnEmptyPlan(): void { $plan = $this->planner()->plan( ['stylesheet' => 'Divi', 'css' => '.a{}'], ['stylesheet' => 'Divi', 'css' => '.a{}'], 'custom_css-x' ); self::assertInstanceOf(DesignPlan::class, $plan); self::assertTrue($plan->isEmpty()); self::assertSame([], $plan->warnings); } /** A snapshot of another theme would land in this theme's CSS. */ public function testASnapshotOfAnotherThemeIsRefused(): void { $result = $this->planner()->plan( ['stylesheet' => 'Divi', 'css' => '.a{}'], ['stylesheet' => 'Child', 'css' => '.b{}'], 'custom_css-x' ); $error = self::assertToolError($result, 'validation_failed'); self::assertStringContainsString('Theme „Child“, aktiv ist „Divi“', $error['message']); } }