96 lines
3.2 KiB
PHP
96 lines
3.2 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace Grav\Plugin\Api\Tests\Unit\Services;
|
|
|
|
use Grav\Common\Grav;
|
|
use Grav\Plugin\Api\Services\ConfigDiffer;
|
|
use PHPUnit\Framework\Attributes\Test;
|
|
use PHPUnit\Framework\TestCase;
|
|
|
|
/**
|
|
* The override-map primitives behind the per-field override indicators and the
|
|
* revert endpoint (see docs/config-overrides-revert): flatten a persisted delta
|
|
* to dotted leaf paths, read the fallback value out of the parent layer, and
|
|
* remove a key from the active layer's file.
|
|
*/
|
|
class ConfigDifferOverrideTest extends TestCase
|
|
{
|
|
protected function tearDown(): void
|
|
{
|
|
Grav::resetInstance();
|
|
}
|
|
|
|
#[Test]
|
|
public function flatten_leaves_recurses_maps_but_keeps_lists_atomic(): void
|
|
{
|
|
$delta = [
|
|
'pages' => ['theme' => 'quark2', 'events' => ['page' => false]],
|
|
'types' => ['html', 'htm', 'xml'], // sequential list — atomic
|
|
'debugger' => ['enabled' => true],
|
|
];
|
|
|
|
$this->assertSame(
|
|
['pages.theme', 'pages.events.page', 'types', 'debugger.enabled'],
|
|
ConfigDiffer::flattenLeaves($delta),
|
|
);
|
|
}
|
|
|
|
#[Test]
|
|
public function flatten_leaves_is_empty_for_no_overrides(): void
|
|
{
|
|
$this->assertSame([], ConfigDiffer::flattenLeaves([]));
|
|
}
|
|
|
|
#[Test]
|
|
public function value_at_path_digs_nested_keys(): void
|
|
{
|
|
$parent = ['github' => ['app_id' => '3771292'], 'kimi' => ['api_key' => 'sk-A7']];
|
|
|
|
$this->assertSame('3771292', ConfigDiffer::valueAtPath($parent, 'github.app_id'));
|
|
$this->assertSame('sk-A7', ConfigDiffer::valueAtPath($parent, 'kimi.api_key'));
|
|
}
|
|
|
|
#[Test]
|
|
public function value_at_path_returns_null_when_absent(): void
|
|
{
|
|
// A key the active layer adds but the parent never had reverts to the
|
|
// blueprint default / unset, which the client renders as "empty".
|
|
$parent = ['github' => ['app_id' => '3771292']];
|
|
|
|
$this->assertNull(ConfigDiffer::valueAtPath($parent, 'github.missing'));
|
|
$this->assertNull(ConfigDiffer::valueAtPath($parent, 'nope.at.all'));
|
|
}
|
|
|
|
#[Test]
|
|
public function unset_dot_path_removes_a_key_and_prunes_empty_parents(): void
|
|
{
|
|
$differ = new ConfigDiffer(Grav::instance());
|
|
|
|
$delta = ['github' => ['app_id' => '3726627', 'secret' => 'x'], 'kimi' => ['api_key' => '123']];
|
|
|
|
// Removing one of two siblings keeps the parent.
|
|
$this->assertSame(
|
|
['github' => ['secret' => 'x'], 'kimi' => ['api_key' => '123']],
|
|
$differ->unsetDotPath($delta, 'github.app_id'),
|
|
);
|
|
|
|
// Removing the last child prunes the now-empty parent map entirely.
|
|
$this->assertSame(
|
|
['github' => ['app_id' => '3726627', 'secret' => 'x']],
|
|
$differ->unsetDotPath($delta, 'kimi.api_key'),
|
|
);
|
|
}
|
|
|
|
#[Test]
|
|
public function unset_dot_path_is_a_noop_for_absent_keys(): void
|
|
{
|
|
$differ = new ConfigDiffer(Grav::instance());
|
|
$delta = ['github' => ['app_id' => '3726627']];
|
|
|
|
$this->assertSame($delta, $differ->unsetDotPath($delta, 'kimi.api_key'));
|
|
$this->assertSame($delta, $differ->unsetDotPath($delta, 'github.nope'));
|
|
}
|
|
}
|