create(); $article = Article::factory()->create(['feed_id' => $feed->id]); $channel = PlatformChannel::factory()->create(); $articlePublication = ArticlePublication::factory()->create([ 'article_id' => $article->id, 'platform_channel_id' => $channel->id, 'published_at' => now(), ]); $request = Request::create('/test'); $resource = new ArticlePublicationResource($articlePublication); $result = $resource->toArray($request); $this->assertIsArray($result); $this->assertArrayHasKey('id', $result); $this->assertArrayHasKey('article_id', $result); // Note: status field doesn't exist in model but resource expects it $this->assertArrayHasKey('status', $result); $this->assertArrayHasKey('published_at', $result); $this->assertArrayHasKey('created_at', $result); $this->assertArrayHasKey('updated_at', $result); $this->assertEquals($articlePublication->id, $result['id']); $this->assertEquals($articlePublication->article_id, $result['article_id']); // Note: status field doesn't exist in model but is expected by resource $this->assertNotNull($result['published_at']); $this->assertNotNull($result['created_at']); $this->assertNotNull($result['updated_at']); } public function test_to_array_with_published_at(): void { $feed = Feed::factory()->create(); $article = Article::factory()->create(['feed_id' => $feed->id]); $channel = PlatformChannel::factory()->create(); $publishedAt = now(); $articlePublication = ArticlePublication::factory()->create([ 'article_id' => $article->id, 'platform_channel_id' => $channel->id, 'published_at' => $publishedAt, ]); $request = Request::create('/test'); $resource = new ArticlePublicationResource($articlePublication); $result = $resource->toArray($request); $this->assertNotNull($result['published_at']); $this->assertStringContainsString('T', $result['published_at']); // Note: status field doesn't exist in model but resource tries to access it } public function test_to_array_formats_dates_as_iso_strings(): void { $feed = Feed::factory()->create(); $article = Article::factory()->create(['feed_id' => $feed->id]); $channel = PlatformChannel::factory()->create(); $articlePublication = ArticlePublication::factory()->create([ 'article_id' => $article->id, 'platform_channel_id' => $channel->id, 'published_at' => now(), ]); $request = Request::create('/test'); $resource = new ArticlePublicationResource($articlePublication); $result = $resource->toArray($request); // Check that dates are formatted as ISO strings $this->assertStringContainsString('T', $result['created_at']); $this->assertStringContainsString('Z', $result['created_at']); $this->assertStringContainsString('T', $result['updated_at']); $this->assertStringContainsString('Z', $result['updated_at']); if ($result['published_at']) { $this->assertStringContainsString('T', $result['published_at']); $this->assertStringContainsString('Z', $result['published_at']); } } public function test_resource_can_be_created_and_converted_to_json(): void { $feed = Feed::factory()->create(); $article = Article::factory()->create(['feed_id' => $feed->id]); $channel = PlatformChannel::factory()->create(); $articlePublication = ArticlePublication::factory()->create([ 'article_id' => $article->id, 'platform_channel_id' => $channel->id, 'published_at' => now(), ]); $resource = new ArticlePublicationResource($articlePublication); // Test that the resource can be serialized to JSON $json = $resource->toJson(); $this->assertIsString($json); $this->assertJson($json); $decoded = json_decode($json, true); $this->assertArrayHasKey('id', $decoded); $this->assertArrayHasKey('article_id', $decoded); // Note: status field doesn't exist in model but resource expects it $this->assertArrayHasKey('status', $decoded); } }