fix: VariableArea::verify vergleicht auch den Namen; Docstring beschreibt, was verify und differences wirklich fangen
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 5.5
parent
25252c92f2
commit
d092c05311
@@ -13,8 +13,11 @@ defined('ABSPATH') || exit;
|
|||||||
* as a whole through GlobalVariablesAdapter::save() together with the inventory read right before, which Divi checks
|
* as a whole through GlobalVariablesAdapter::save() together with the inventory read right before, which Divi checks
|
||||||
* for changes in between (global_variables_stale). Divi refuses an inventory that lacks a stored ID, so a restore keeps
|
* for changes in between (global_variables_stale). Divi refuses an inventory that lacks a stored ID, so a restore keeps
|
||||||
* the variables created after the snapshot, archived (VariableBook::restoredFrom()) – also when the pipeline rolls back
|
* the variables created after the snapshot, archived (VariableBook::restoredFrom()) – also when the pipeline rolls back
|
||||||
* a write that went through. Without the variables_manager right Divi silently saves nothing: verify() compares the
|
* a write that went through. verify() compares the read-back by variable: present or not, status, label and whether
|
||||||
* read-back (same variables, status and non-empty values), differences() names the values Divi sanitized.
|
* the value is empty – so missing, added, archived or activated variables, a changed label and an emptied value fail
|
||||||
|
* it. A missing variables_manager right is refused before writing (DesignRights::variables), not found here. Divi
|
||||||
|
* dropping or sanitizing a label or value to something else still passes verify(); differences() names those as
|
||||||
|
* warnings.
|
||||||
*/
|
*/
|
||||||
final class VariableArea implements DesignArea
|
final class VariableArea implements DesignArea
|
||||||
{
|
{
|
||||||
@@ -74,9 +77,15 @@ final class VariableArea implements DesignArea
|
|||||||
public function differences(array $expected, array $actual): array
|
public function differences(array $expected, array $actual): array
|
||||||
{
|
{
|
||||||
$warnings = [];
|
$warnings = [];
|
||||||
|
$names = ['label' => 'den Namen', 'value' => 'den Wert'];
|
||||||
foreach (VariableDiff::between(VariableBook::fromDivi($expected), VariableBook::fromDivi($actual)) as $row) {
|
foreach (VariableDiff::between(VariableBook::fromDivi($expected), VariableBook::fromDivi($actual)) as $row) {
|
||||||
if ($row['action'] === 'changed') {
|
$what = array_intersect_key($names, array_flip($row['fields'] ?? []));
|
||||||
$warnings[] = sprintf('Divi hat den Wert der Variablen „%s“ beim Speichern bereinigt.', $row['name']);
|
if ($row['action'] === 'changed' && $what !== []) {
|
||||||
|
$warnings[] = sprintf(
|
||||||
|
'Divi hat %s der Variablen „%s“ beim Speichern bereinigt.',
|
||||||
|
implode(' und ', $what),
|
||||||
|
$row['name']
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -85,7 +94,7 @@ final class VariableArea implements DesignArea
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @param array<array-key, mixed> $raw
|
* @param array<array-key, mixed> $raw
|
||||||
* @return array<string, array{0: string, 1: bool}> "type/id" => [status, has a value], sorted
|
* @return array<string, array{0: string, 1: bool, 2: string}> "type/id" => [status, has a value, label], sorted
|
||||||
*/
|
*/
|
||||||
private static function shape(array $raw): array
|
private static function shape(array $raw): array
|
||||||
{
|
{
|
||||||
@@ -96,6 +105,7 @@ final class VariableArea implements DesignArea
|
|||||||
$shape[$type . '/' . $id] = [
|
$shape[$type . '/' . $id] = [
|
||||||
(string) ($entry['status'] ?? ''),
|
(string) ($entry['status'] ?? ''),
|
||||||
is_scalar($value) && (string) $value !== '',
|
is_scalar($value) && (string) $value !== '',
|
||||||
|
(string) ($entry['label'] ?? ''),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -135,7 +135,11 @@ final class VariableAreaTest extends TestCase
|
|||||||
$emptied = $expected;
|
$emptied = $expected;
|
||||||
$emptied['numbers']['gvid-radius0001']['value'] = '';
|
$emptied['numbers']['gvid-radius0001']['value'] = '';
|
||||||
|
|
||||||
|
$relabeled = $expected;
|
||||||
|
$relabeled['numbers']['gvid-radius0001']['label'] = 'Anders';
|
||||||
|
|
||||||
self::assertTrue($area->verify($expected, $sanitized));
|
self::assertTrue($area->verify($expected, $sanitized));
|
||||||
|
self::assertFalse($area->verify($expected, $relabeled));
|
||||||
self::assertFalse($area->verify($expected, $missing));
|
self::assertFalse($area->verify($expected, $missing));
|
||||||
self::assertFalse($area->verify($expected, $archived));
|
self::assertFalse($area->verify($expected, $archived));
|
||||||
self::assertFalse($area->verify($expected, $emptied));
|
self::assertFalse($area->verify($expected, $emptied));
|
||||||
@@ -155,5 +159,10 @@ final class VariableAreaTest extends TestCase
|
|||||||
['Divi hat den Wert der Variablen „Slogan“ beim Speichern bereinigt.'],
|
['Divi hat den Wert der Variablen „Slogan“ beim Speichern bereinigt.'],
|
||||||
$area->differences($expected, $sanitized)
|
$area->differences($expected, $sanitized)
|
||||||
);
|
);
|
||||||
|
$sanitized['strings']['gvid-slogan0001']['label'] = 'Slogan neu';
|
||||||
|
self::assertSame(
|
||||||
|
['Divi hat den Namen und den Wert der Variablen „Slogan neu“ beim Speichern bereinigt.'],
|
||||||
|
$area->differences($expected, $sanitized)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user