create(['id' => 123]); $exception = new PublishException($article, PlatformEnum::LEMMY); $this->assertSame($article, $exception->getArticle()); $this->assertEquals(123, $exception->getArticle()->id); } public function test_get_platform_returns_correct_platform(): void { $article = Article::factory()->create(); $exception = new PublishException($article, PlatformEnum::LEMMY); $this->assertSame(PlatformEnum::LEMMY, $exception->getPlatform()); } public function test_get_platform_returns_null_when_no_platform(): void { $article = Article::factory()->create(); $exception = new PublishException($article, null); $this->assertNull($exception->getPlatform()); } public function test_constructor_creates_message_with_article_id_and_platform(): void { $article = Article::factory()->create(['id' => 456]); $exception = new PublishException($article, PlatformEnum::LEMMY); $this->assertEquals('Failed to publish article #456 to lemmy', $exception->getMessage()); } public function test_constructor_creates_message_with_article_id_only(): void { $article = Article::factory()->create(['id' => 789]); $exception = new PublishException($article, null); $this->assertEquals('Failed to publish article #789', $exception->getMessage()); } public function test_constructor_includes_previous_exception_message(): void { $article = Article::factory()->create(['id' => 321]); $previousException = new Exception('Original error message'); $exception = new PublishException($article, PlatformEnum::LEMMY, $previousException); $this->assertEquals('Failed to publish article #321 to lemmy: Original error message', $exception->getMessage()); $this->assertSame($previousException, $exception->getPrevious()); } public function test_constructor_includes_previous_exception_message_without_platform(): void { $article = Article::factory()->create(['id' => 654]); $previousException = new Exception('Another error'); $exception = new PublishException($article, null, $previousException); $this->assertEquals('Failed to publish article #654: Another error', $exception->getMessage()); $this->assertSame($previousException, $exception->getPrevious()); } public function test_exception_properties_are_immutable(): void { $article = Article::factory()->create(); $exception = new PublishException($article, PlatformEnum::LEMMY); // These methods should return the same instances every time $this->assertSame($exception->getArticle(), $exception->getArticle()); $this->assertSame($exception->getPlatform(), $exception->getPlatform()); } public function test_works_with_different_platform_enum_values(): void { $article = Article::factory()->create(); // Test with different platform values (if more are available) $exception = new PublishException($article, PlatformEnum::LEMMY); $this->assertSame(PlatformEnum::LEMMY, $exception->getPlatform()); $this->assertStringContainsString('lemmy', $exception->getMessage()); } }