getId()); self::assertSame('file.webp', $media->getFilename()); self::assertSame('/media/file.webp', $media->getUrl()); self::assertSame('abc123', $media->getHash()); self::assertSame(12, $media->getUserId()); self::assertSame($createdAt, $media->getCreatedAt()); } public function testFromArrayHydratesMedia(): void { $media = Media::fromArray([ 'id' => '9', 'filename' => 'stored.webp', 'url' => '/media/stored.webp', 'hash' => 'hash-9', 'user_id' => '3', 'created_at' => '2026-03-02 12:30:00', ]); self::assertSame(9, $media->getId()); self::assertSame('stored.webp', $media->getFilename()); self::assertSame('/media/stored.webp', $media->getUrl()); self::assertSame('hash-9', $media->getHash()); self::assertSame(3, $media->getUserId()); self::assertSame('2026-03-02 12:30:00', $media->getCreatedAt()->format('Y-m-d H:i:s')); } public function testCreatedAtDefaultsToNowWhenMissing(): void { $before = new DateTime('-2 seconds'); $media = new Media(1, 'f.webp', '/media/f.webp', 'h', null); $after = new DateTime('+2 seconds'); self::assertGreaterThanOrEqual($before->getTimestamp(), $media->getCreatedAt()->getTimestamp()); self::assertLessThanOrEqual($after->getTimestamp(), $media->getCreatedAt()->getTimestamp()); } }