Http::response(['link' => 'https://wp.example.com/post'], 201), ]); $site = Site::factory()->wordpress()->create(); $post = Post::factory()->create(['site_id' => $site->id, 'type' => 'blog', 'title' => 'Hi', 'status' => 'publishing']); (new PublishPostJob($post->id))->handle(app(PublisherManager::class)); expect($post->fresh()) ->status->toBe('published') ->published_url->toBe('https://wp.example.com/post') ->publish_error->toBeNull(); }); test('it marks the post failed when the publish attempt fails', function () { Http::fake([ '*/wp-json/wp/v2/posts' => Http::response(['message' => 'nope'], 401), ]); $site = Site::factory()->wordpress()->create(); $post = Post::factory()->create(['site_id' => $site->id, 'type' => 'blog', 'title' => 'Hi', 'status' => 'publishing']); (new PublishPostJob($post->id))->handle(app(PublisherManager::class)); expect($post->fresh()) ->status->toBe('failed') ->publish_error->toBe('nope'); }); test('it reverts a rejected post to draft instead of failed', function () { $site = Site::factory()->wordpress()->create(); $post = Post::factory()->create(['site_id' => $site->id, 'type' => 'blog', 'title' => null, 'status' => 'publishing']); (new PublishPostJob($post->id))->handle(app(PublisherManager::class)); expect($post->fresh()) ->status->toBe('draft') ->publish_error->toContain('no title'); }); test('it reverts to draft when no publisher supports the post type', function () { $post = Post::factory()->create(['type' => 'twitter', 'status' => 'publishing']); (new PublishPostJob($post->id))->handle(app(PublisherManager::class)); expect($post->fresh()) ->status->toBe('draft') ->publish_error->toContain('No publisher available'); }); test('it publishes a reddit post via the sidecar', function () { Process::fake([ '*' => Process::result(output: json_encode(['success' => true, 'url' => 'https://reddit.com/r/test/comments/abc'])), ]); $account = SocialAccount::factory()->create(['network' => 'reddit']); $post = Post::factory()->create([ 'type' => 'reddit', 'title' => 'Hi', 'target' => 'test', 'social_account_id' => $account->id, 'status' => 'publishing', ]); (new PublishPostJob($post->id))->handle(app(PublisherManager::class)); expect($post->fresh()) ->status->toBe('published') ->published_url->toBe('https://reddit.com/r/test/comments/abc'); });