Skip to content

Commit

Permalink
Lazy-load session storage in FlashMessenger
Browse files Browse the repository at this point in the history
Signed-off-by: Maurício Meneghini Fauth <mauricio@fauth.dev>
  • Loading branch information
MauricioFauth committed May 16, 2024
1 parent d17e46c commit 1a357c3
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 26 deletions.
7 changes: 1 addition & 6 deletions psalm-baseline.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5950,7 +5950,7 @@
<code><![CDATA[$this->previousMessages]]></code>
</MixedAssignment>
<MixedInferredReturnType>
<code><![CDATA[list<array{context: string, message: string, statement: string}>]]></code>
<code><![CDATA[FlashMessageList]]></code>
</MixedInferredReturnType>
<MixedReturnStatement>
<code><![CDATA[$this->storage[self::STORAGE_KEY]]]></code>
Expand Down Expand Up @@ -13644,11 +13644,6 @@
<code><![CDATA[compressedFiles]]></code>
</PossiblyUnusedMethod>
</file>
<file src="tests/unit/FlashMessengerTest.php">
<InvalidScalarArgument>
<code><![CDATA[$_SESSION]]></code>
</InvalidScalarArgument>
</file>
<file src="tests/unit/FooterTest.php">
<DeprecatedMethod>
<code><![CDATA[Config::getInstance()]]></code>
Expand Down
22 changes: 17 additions & 5 deletions src/FlashMessenger.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,18 +8,24 @@

use function __;

/** @psalm-type FlashMessageList = list<array{context: string, message: string, statement: string}> */
final class FlashMessenger
{
private const STORAGE_KEY = 'FlashMessenger';

/** @var mixed[] */
private array $storage;
private array|null $storage = null;

/** @psalm-var list<array{context: string, message: string, statement: string}> */
/** @psalm-var FlashMessageList */
private array $previousMessages = [];

public function __construct()
/** @psalm-assert !null $this->storage */
private function initSessionStorage(): void
{
if ($this->storage !== null) {
return;
}

if (! isset($_SESSION)) {
throw new RuntimeException(__('Session not found.'));
}
Expand All @@ -35,18 +41,24 @@ public function __construct()

public function addMessage(string $context, string $message, string $statement = ''): void
{
$this->initSessionStorage();

$this->storage[self::STORAGE_KEY][] = ['context' => $context, 'message' => $message, 'statement' => $statement];
}

/** @psalm-return list<array{context: string, message: string, statement: string}> */
/** @psalm-return FlashMessageList */
public function getMessages(): array
{
$this->initSessionStorage();

return $this->previousMessages;
}

/** @psalm-return list<array{context: string, message: string, statement: string}> */
/** @psalm-return FlashMessageList */
public function getCurrentMessages(): array
{
$this->initSessionStorage();

return $this->storage[self::STORAGE_KEY];
}
}
23 changes: 8 additions & 15 deletions tests/unit/FlashMessengerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,28 +13,21 @@ final class FlashMessengerTest extends AbstractTestCase
{
private const STORAGE_KEY = 'FlashMessenger';

public function testConstructor(): void
{
self::assertArrayNotHasKey(self::STORAGE_KEY, $_SESSION);
$flashMessenger = new FlashMessenger();
self::assertIsArray($_SESSION[self::STORAGE_KEY]);
self::assertSame([], $flashMessenger->getMessages());
}

public function testConstructorSessionNotFound(): void
public function testSessionNotFoundException(): void
{
$_SESSION = null;
$flashMessenger = new FlashMessenger();
$this->expectException(RuntimeException::class);
$this->expectExceptionMessage('Session not found.');
new FlashMessenger();
$flashMessenger->getCurrentMessages();
}

public function testAddMessage(): void
{
unset($_SESSION[self::STORAGE_KEY]);
$flashMessenger = new FlashMessenger();
self::assertSame([], $_SESSION[self::STORAGE_KEY]);
self::assertArrayNotHasKey(self::STORAGE_KEY, $_SESSION);
$flashMessenger->addMessage('error', 'Error');
/** @psalm-suppress DocblockTypeContradiction addMessage() mutates $_SESSION[self::STORAGE_KEY] */
self::assertSame(
[['context' => 'error', 'message' => 'Error', 'statement' => '']],
$_SESSION[self::STORAGE_KEY],
Expand All @@ -43,10 +36,10 @@ public function testAddMessage(): void

public function testAddMessageWithStatement(): void
{
unset($_SESSION[self::STORAGE_KEY]);
$flashMessenger = new FlashMessenger();
self::assertSame([], $_SESSION[self::STORAGE_KEY]);
self::assertArrayNotHasKey(self::STORAGE_KEY, $_SESSION);
$flashMessenger->addMessage('success', 'Success!', 'SELECT 1;');
/** @psalm-suppress DocblockTypeContradiction addMessage() mutates $_SESSION[self::STORAGE_KEY] */
self::assertSame(
[['context' => 'success', 'message' => 'Success!', 'statement' => 'SELECT 1;']],
$_SESSION[self::STORAGE_KEY],
Expand All @@ -55,7 +48,7 @@ public function testAddMessageWithStatement(): void

public function testGetMessages(): void
{
$_SESSION[self::STORAGE_KEY] = [];
unset($_SESSION[self::STORAGE_KEY]);
$flashMessengerOne = new FlashMessenger();
self::assertSame([], $flashMessengerOne->getCurrentMessages());
$flashMessengerOne->addMessage('error', 'Error1');
Expand Down

0 comments on commit 1a357c3

Please sign in to comment.