Move flash message context to the shaped array

Does not group the messages by context.

Signed-off-by: Maurício Meneghini Fauth <mauricio@fauth.dev>
This commit is contained in:
Maurício Meneghini Fauth 2024-05-16 13:22:39 -03:00
parent 64a8a9d779
commit c10d265ae5
No known key found for this signature in database
GPG Key ID: 6A16FD38AFC89CC8
9 changed files with 94 additions and 120 deletions

View File

@ -7471,12 +7471,12 @@ parameters:
path: src/FlashMessenger.php
-
message: "#^Cannot access offset string on mixed\\.$#"
count: 2
message: "#^Method PhpMyAdmin\\\\FlashMessenger\\:\\:getCurrentMessages\\(\\) should return array\\<int, array\\{context\\: string, message\\: string, statement\\: string\\}\\> but returns mixed\\.$#"
count: 1
path: src/FlashMessenger.php
-
message: "#^Property PhpMyAdmin\\\\FlashMessenger\\:\\:\\$previousMessages \\(array\\<string, array\\<array\\<string\\>\\>\\>\\) does not accept mixed\\.$#"
message: "#^Property PhpMyAdmin\\\\FlashMessenger\\:\\:\\$previousMessages \\(array\\<int, array\\{context\\: string, message\\: string, statement\\: string\\}\\>\\) does not accept mixed\\.$#"
count: 1
path: src/FlashMessenger.php
@ -15545,16 +15545,6 @@ parameters:
count: 1
path: tests/unit/Export/OptionsTest.php
-
message: "#^Parameter \\#2 \\$array of static method PHPUnit\\\\Framework\\\\Assert\\:\\:assertArrayHasKey\\(\\) expects array\\|ArrayAccess, mixed given\\.$#"
count: 2
path: tests/unit/FlashMessengerTest.php
-
message: "#^Parameter \\#2 \\$array of static method PHPUnit\\\\Framework\\\\Assert\\:\\:assertArrayNotHasKey\\(\\) expects array\\|ArrayAccess, mixed given\\.$#"
count: 2
path: tests/unit/FlashMessengerTest.php
-
message: "#^Cannot access offset 'queries' on mixed\\.$#"
count: 1

View File

@ -5944,12 +5944,17 @@
</file>
<file src="src/FlashMessenger.php">
<MixedArrayAssignment>
<code><![CDATA[$this->storage[self::STORAGE_KEY][$key]]]></code>
<code><![CDATA[$this->storage[self::STORAGE_KEY][$key]]]></code>
<code><![CDATA[$this->storage[self::STORAGE_KEY][]]]></code>
</MixedArrayAssignment>
<MixedAssignment>
<code><![CDATA[$this->previousMessages]]></code>
</MixedAssignment>
<MixedInferredReturnType>
<code><![CDATA[list<array{context: string, message: string, statement: string}>]]></code>
</MixedInferredReturnType>
<MixedReturnStatement>
<code><![CDATA[$this->storage[self::STORAGE_KEY]]]></code>
</MixedReturnStatement>
</file>
<file src="src/Font.php">
<MixedArgument>
@ -13643,18 +13648,6 @@
<InvalidScalarArgument>
<code><![CDATA[$_SESSION]]></code>
</InvalidScalarArgument>
<MixedArgument>
<code><![CDATA[$_SESSION[self::STORAGE_KEY]]]></code>
<code><![CDATA[$_SESSION[self::STORAGE_KEY]]]></code>
<code><![CDATA[$_SESSION[self::STORAGE_KEY]]]></code>
<code><![CDATA[$_SESSION[self::STORAGE_KEY]]]></code>
</MixedArgument>
<MixedArrayAccess>
<code><![CDATA[$_SESSION[self::STORAGE_KEY]['error']]]></code>
<code><![CDATA[$_SESSION[self::STORAGE_KEY]['error']]]></code>
<code><![CDATA[$_SESSION[self::STORAGE_KEY]['success']]]></code>
<code><![CDATA[$_SESSION[self::STORAGE_KEY]['success']]]></code>
</MixedArrayAccess>
</file>
<file src="tests/unit/FooterTest.php">
<DeprecatedMethod>

View File

@ -1,13 +1,11 @@
{% for flash_key, flash_messages in flash() %}
{% for flash_message in flash_messages %}
{% if flash_message.statement is empty %}
<div class="alert alert-{{ flash_key }}" role="alert">
{{ flash_message.message }}
</div>
{% else %}
{{ statement_message(flash_message.message, flash_message.statement, flash_key) }}
{% endif %}
{% endfor %}
{% for flash_message in flash() %}
{% if flash_message.statement is empty %}
<div class="alert alert-{{ flash_message.context }}" role="alert">
{{ flash_message.message }}
</div>
{% else %}
{{ statement_message(flash_message.message, flash_message.statement, flash_message.context) }}
{% endif %}
{% endfor %}
{% if has_tables %}

View File

@ -7,16 +7,14 @@
{{ page_settings_error_html|raw }}
{{ page_settings_html|raw }}
{% for flash_key, flash_messages in flash() %}
{% for flash_message in flash_messages %}
{% if flash_message.statement is empty %}
<div class="alert alert-{{ flash_key }}" role="alert">
{{ flash_message.message }}
</div>
{% else %}
{{ statement_message(flash_message.message, flash_message.statement, flash_key) }}
{% endif %}
{% endfor %}
{% for flash_message in flash() %}
{% if flash_message.statement is empty %}
<div class="alert alert-{{ flash_message.context }}" role="alert">
{{ flash_message.message }}
</div>
{% else %}
{{ statement_message(flash_message.message, flash_message.statement, flash_message.context) }}
{% endif %}
{% endfor %}
{% block message %}{% endblock %}

View File

@ -14,16 +14,14 @@
</ul>
{% endif %}
{% for flash_key, flash_messages in flash() %}
{% for flash_message in flash_messages %}
{% if flash_message.statement is empty %}
<div class="alert alert-{{ flash_key }}" role="alert">
{{ flash_message.message }}
</div>
{% else %}
{{ statement_message(flash_message.message, flash_message.statement, flash_key) }}
{% endif %}
{% endfor %}
{% for flash_message in flash() %}
{% if flash_message.statement is empty %}
<div class="alert alert-{{ flash_message.context }}" role="alert">
{{ flash_message.message }}
</div>
{% else %}
{{ statement_message(flash_message.message, flash_message.statement, flash_message.context) }}
{% endif %}
{% endfor %}
<div id="structure_content">

View File

@ -15,7 +15,7 @@ final class FlashMessenger
/** @var mixed[] */
private array $storage;
/** @var array<string, string[][]> */
/** @psalm-var list<array{context: string, message: string, statement: string}> */
private array $previousMessages = [];
public function __construct()
@ -33,24 +33,20 @@ final class FlashMessenger
$this->storage[self::STORAGE_KEY] = [];
}
public function addMessage(string $key, string $message, string $statement = ''): void
public function addMessage(string $context, string $message, string $statement = ''): void
{
if (! isset($this->storage[self::STORAGE_KEY][$key])) {
$this->storage[self::STORAGE_KEY][$key] = [];
}
$this->storage[self::STORAGE_KEY][$key][] = ['message' => $message, 'statement' => $statement];
$this->storage[self::STORAGE_KEY][] = ['context' => $context, 'message' => $message, 'statement' => $statement];
}
/** @return string[][]|null */
public function getMessage(string $key): array|null
{
return $this->previousMessages[$key] ?? null;
}
/** @return array<string, string[][]> */
/** @psalm-return list<array{context: string, message: string, statement: string}> */
public function getMessages(): array
{
return $this->previousMessages;
}
/** @psalm-return list<array{context: string, message: string, statement: string}> */
public function getCurrentMessages(): array
{
return $this->storage[self::STORAGE_KEY];
}
}

View File

@ -42,20 +42,17 @@ class DropColumnControllerTest extends AbstractTestCase
$dummyDbi->addResult('ALTER TABLE `test_table` DROP `name`, DROP `datetimefield`;', true);
$dbi = $this->createDatabaseInterface($dummyDbi);
self::assertArrayNotHasKey('FlashMessenger', $_SESSION);
$flashMessenger = new FlashMessenger();
(new DropColumnController(
new ResponseRenderer(),
$dbi,
new FlashMessenger(),
$flashMessenger,
new RelationCleanup($dbi, new Relation($dbi)),
))(self::createStub(ServerRequest::class));
self::assertArrayHasKey('FlashMessenger', $_SESSION);
/** @psalm-suppress InvalidArrayOffset */
self::assertSame(
['success' => [['message' => '2 columns have been dropped successfully.', 'statement' => '']]],
$_SESSION['FlashMessenger'],
[['context' => 'success', 'message' => '2 columns have been dropped successfully.', 'statement' => '']],
$flashMessenger->getCurrentMessages(),
);
}
}

View File

@ -243,7 +243,7 @@ SQL;
$location = $export->getPageLocationAndSaveMessage('server', Message::error('Error message!'));
self::assertSame('index.php?route=/server/export&server=2&lang=en', $location);
self::assertSame(
['danger' => [['message' => 'Error message!', 'statement' => '']]],
[['context' => 'danger', 'message' => 'Error message!', 'statement' => '']],
(new FlashMessenger())->getMessages(),
);
}
@ -258,7 +258,7 @@ SQL;
$location = $export->getPageLocationAndSaveMessage('server', Message::success('Success message!'));
self::assertSame('index.php?route=/server/export&server=2&lang=en', $location);
self::assertSame(
['success' => [['message' => 'Success message!', 'statement' => '']]],
[['context' => 'success', 'message' => 'Success message!', 'statement' => '']],
(new FlashMessenger())->getMessages(),
);
}
@ -274,7 +274,7 @@ SQL;
$location = $export->getPageLocationAndSaveMessage('database', Message::error('Error message!'));
self::assertSame('index.php?route=/database/export&db=test_db&server=2&lang=en', $location);
self::assertSame(
['danger' => [['message' => 'Error message!', 'statement' => '']]],
[['context' => 'danger', 'message' => 'Error message!', 'statement' => '']],
(new FlashMessenger())->getMessages(),
);
}
@ -290,7 +290,7 @@ SQL;
$location = $export->getPageLocationAndSaveMessage('database', Message::success('Success message!'));
self::assertSame('index.php?route=/database/export&db=test_db&server=2&lang=en', $location);
self::assertSame(
['success' => [['message' => 'Success message!', 'statement' => '']]],
[['context' => 'success', 'message' => 'Success message!', 'statement' => '']],
(new FlashMessenger())->getMessages(),
);
}
@ -310,7 +310,7 @@ SQL;
$location,
);
self::assertSame(
['danger' => [['message' => 'Error message!', 'statement' => '']]],
[['context' => 'danger', 'message' => 'Error message!', 'statement' => '']],
(new FlashMessenger())->getMessages(),
);
}
@ -330,7 +330,7 @@ SQL;
$location,
);
self::assertSame(
['success' => [['message' => 'Success message!', 'statement' => '']]],
[['context' => 'success', 'message' => 'Success message!', 'statement' => '']],
(new FlashMessenger())->getMessages(),
);
}

View File

@ -32,57 +32,61 @@ final class FlashMessengerTest extends AbstractTestCase
public function testAddMessage(): void
{
$flashMessenger = new FlashMessenger();
self::assertArrayNotHasKey('error', $_SESSION[self::STORAGE_KEY]);
self::assertSame([], $_SESSION[self::STORAGE_KEY]);
$flashMessenger->addMessage('error', 'Error');
self::assertArrayHasKey('error', $_SESSION[self::STORAGE_KEY]);
self::assertIsArray($_SESSION[self::STORAGE_KEY]['error']);
self::assertSame([['message' => 'Error', 'statement' => '']], $_SESSION[self::STORAGE_KEY]['error']);
/** @psalm-suppress DocblockTypeContradiction addMessage() mutates $_SESSION[self::STORAGE_KEY] */
self::assertSame(
[['context' => 'error', 'message' => 'Error', 'statement' => '']],
$_SESSION[self::STORAGE_KEY],
);
}
public function testAddMessageWithStatement(): void
{
$flashMessenger = new FlashMessenger();
self::assertArrayNotHasKey('success', $_SESSION[self::STORAGE_KEY]);
$flashMessenger->addMessage('success', 'Your SQL query has been executed successfully.', 'SELECT 1;');
self::assertArrayHasKey('success', $_SESSION[self::STORAGE_KEY]);
self::assertIsArray($_SESSION[self::STORAGE_KEY]['success']);
self::assertSame([], $_SESSION[self::STORAGE_KEY]);
$flashMessenger->addMessage('success', 'Success!', 'SELECT 1;');
/** @psalm-suppress DocblockTypeContradiction addMessage() mutates $_SESSION[self::STORAGE_KEY] */
self::assertSame(
[['message' => 'Your SQL query has been executed successfully.', 'statement' => 'SELECT 1;']],
$_SESSION[self::STORAGE_KEY]['success'],
[['context' => 'success', 'message' => 'Success!', 'statement' => 'SELECT 1;']],
$_SESSION[self::STORAGE_KEY],
);
}
public function testGetMessage(): void
{
$_SESSION[self::STORAGE_KEY] = ['warning' => [['message' => 'Warning', 'statement' => '']]];
$flashMessenger = new FlashMessenger();
$message = $flashMessenger->getMessage('error');
self::assertNull($message);
$message = $flashMessenger->getMessage('warning');
self::assertSame([['message' => 'Warning', 'statement' => '']], $message);
}
public function testGetMessages(): void
{
$_SESSION[self::STORAGE_KEY] = [
'error' => [
['message' => 'Error1', 'statement' => ''],
['message' => 'Error2', 'statement' => ''],
],
'warning' => [['message' => 'Warning', 'statement' => '']],
];
$flashMessenger = new FlashMessenger();
$flashMessenger->addMessage('notice', 'Notice');
$messages = $flashMessenger->getMessages();
$_SESSION[self::STORAGE_KEY] = [];
$flashMessengerOne = new FlashMessenger();
self::assertSame([], $flashMessengerOne->getCurrentMessages());
$flashMessengerOne->addMessage('error', 'Error1');
$flashMessengerOne->addMessage('error', 'Error2', 'SOME SQL;');
$flashMessengerOne->addMessage('warning', 'Warning');
self::assertSame(
[
'error' => [
['message' => 'Error1', 'statement' => ''],
['message' => 'Error2', 'statement' => ''],
],
'warning' => [['message' => 'Warning', 'statement' => '']],
['context' => 'error', 'message' => 'Error1', 'statement' => ''],
['context' => 'error', 'message' => 'Error2', 'statement' => 'SOME SQL;'],
['context' => 'warning', 'message' => 'Warning', 'statement' => ''],
],
$messages,
$flashMessengerOne->getCurrentMessages(),
);
self::assertSame([], $flashMessengerOne->getMessages());
$flashMessengerTwo = new FlashMessenger();
$flashMessengerTwo->addMessage('notice', 'Notice');
self::assertSame(
[['context' => 'notice', 'message' => 'Notice', 'statement' => '']],
$flashMessengerTwo->getCurrentMessages(),
);
self::assertSame(
[
['context' => 'error', 'message' => 'Error1', 'statement' => ''],
['context' => 'error', 'message' => 'Error2', 'statement' => 'SOME SQL;'],
['context' => 'warning', 'message' => 'Warning', 'statement' => ''],
],
$flashMessengerTwo->getMessages(),
);
self::assertSame(
[['context' => 'notice', 'message' => 'Notice', 'statement' => '']],
(new FlashMessenger())->getMessages(),
);
}
}