diff --git a/psalm-baseline.xml b/psalm-baseline.xml index 7475689f..19d94ff7 100644 --- a/psalm-baseline.xml +++ b/psalm-baseline.xml @@ -1,9 +1,2 @@ - - - - ArrayAccess - Iterator - - - + diff --git a/src/Postmark/Models/CaseInsensitiveArray.php b/src/Postmark/Models/CaseInsensitiveArray.php index e6108bde..6c7b9596 100644 --- a/src/Postmark/Models/CaseInsensitiveArray.php +++ b/src/Postmark/Models/CaseInsensitiveArray.php @@ -20,12 +20,17 @@ * CaseInsensitiveArray allows accessing elements with mixed-case keys. * This allows access to the array to be very forgiving. (i.e. If you access something * with the wrong CaSe, it'll still find the correct element) + * + * @implements ArrayAccess + * @implements Iterator */ class CaseInsensitiveArray implements ArrayAccess, Iterator { /** @var array */ private array $data; private int $pointer = 0; + /** @var array */ + private array $payload; private function normaliseOffset(string $offset): string { @@ -39,9 +44,20 @@ private function normaliseOffset(string $offset): string */ public function __construct(array $initialArray = []) { + $this->payload = $initialArray; $this->data = array_change_key_case($initialArray, CASE_LOWER); } + /** + * Provides a way of accessing the initial payload as returned by the server with key casing preserved + * + * @return array + */ + public function getPayload(): array + { + return $this->payload; + } + /** @param array-key|null $offset */ public function offsetSet($offset, mixed $value): void { diff --git a/tests/Unit/Models/CaseInsensitiveArrayTest.php b/tests/Unit/Models/CaseInsensitiveArrayTest.php index 6bfc257b..8ff2f6ae 100644 --- a/tests/Unit/Models/CaseInsensitiveArrayTest.php +++ b/tests/Unit/Models/CaseInsensitiveArrayTest.php @@ -61,4 +61,30 @@ public function testKeysCanBeUnsetInCaseInsensitiveManner(): void unset($data['fOo']); self::assertArrayNotHasKey('foo', $data); } + + public function testThatTheInitialPayloadCanBeAccessed(): void + { + $payload = [ + 'Foo' => 'foo', + 'bar' => 'bar', + 'bAz' => 'baz', + 'BING' => 'bing', + ]; + + $data = new CaseInsensitiveArray($payload); + + self::assertSame($payload, $data->getPayload()); + } + + public function testThatTheInitialPayloadWillIncludeNestedArrays(): void + { + $payload = [ + 'SomeScalar' => 'foo', + 'NestedArray' => ['OtherValue' => 'Bar'], + ]; + + $data = new CaseInsensitiveArray($payload); + + self::assertSame($payload, $data->getPayload()); + } }