diff --git a/lib/Client/Mailbox.php b/lib/Client/Mailbox.php index c59e04b..0b3119d 100644 --- a/lib/Client/Mailbox.php +++ b/lib/Client/Mailbox.php @@ -26,13 +26,15 @@ final class Mailbox public function fromStatus(MailboxStatusResult $status): self { + $items = $status->items(); + return new self( $this->name, $this->delimiter, $this->attributes, - $status->messages() ?? $this->messages, - $status->unseen() ?? $this->unread, - $status->uidValidity() ?? $this->uidValidity, + $items['MESSAGES'] ?? $this->messages, + $items['UNSEEN'] ?? $this->unread, + $items['UIDVALIDITY'] ?? $this->uidValidity, $this->recent, $this->flags, $this->readOnly, diff --git a/tests/php/Unit/MailboxTest.php b/tests/php/Unit/MailboxTest.php new file mode 100644 index 0000000..6588ea7 --- /dev/null +++ b/tests/php/Unit/MailboxTest.php @@ -0,0 +1,50 @@ +fromStatus(new MailboxStatusResult('INBOX', ['UNSEEN' => 2])); + + $this->assertSame(12, $updated->messages()); + $this->assertSame(2, $updated->unread()); + $this->assertSame(123, $updated->uidValidity()); + $this->assertSame(4, $mailbox->unread()); + } + + public function testExplicitZeroCountsReplaceKnownCounts(): void + { + $mailbox = new Mailbox('INBOX', '/', [], 12, 4, 123); + + $updated = $mailbox->fromStatus(new MailboxStatusResult('INBOX', [ + 'MESSAGES' => 0, + 'UNSEEN' => 0, + 'UIDVALIDITY' => 456, + ])); + + $this->assertSame(0, $updated->messages()); + $this->assertSame(0, $updated->unread()); + $this->assertSame(456, $updated->uidValidity()); + } + + public function testEmptyStatusPreservesMailboxIncludingUnknownUidValidity(): void + { + foreach ([null, 123] as $uidValidity) { + $mailbox = new Mailbox('INBOX', '/', ['\\HasNoChildren'], 12, 4, $uidValidity, 2, ['\\Seen'], false); + + $updated = $mailbox->fromStatus(new MailboxStatusResult('INBOX', [])); + + $this->assertEquals($mailbox, $updated); + } + } +}