create(); expect($workspace)->toBeInstanceOf(Workspace::class) ->and($workspace->name)->toBeString() ->and($workspace->slug)->toBeString() ->and($workspace->domain)->toContain('.host.uk.com') ->and($workspace->is_active)->toBeTrue(); }); it('creates a main workspace', function () { // Use existing seeded main workspace instead of creating duplicate $workspace = Workspace::where('slug', 'main')->first(); expect($workspace)->not->toBeNull() ->and($workspace->slug)->toBe('main'); }); it('creates a content author', function () { $author = ContentAuthor::factory()->create(); expect($author)->toBeInstanceOf(ContentAuthor::class) ->and($author->name)->toBeString() ->and($author->email)->toContain('@') ->and($author->workspace_id)->toBeInt(); }); it('creates a content author with avatar', function () { $author = ContentAuthor::factory()->withAvatar()->create(); expect($author->avatar_url)->not->toBeNull(); }); it('creates a content taxonomy category', function () { $category = ContentTaxonomy::factory()->category()->create(); expect($category)->toBeInstanceOf(ContentTaxonomy::class) ->and($category->type)->toBe('category'); }); it('creates a content taxonomy tag', function () { $tag = ContentTaxonomy::factory()->tag()->create(); expect($tag->type)->toBe('tag'); }); it('creates content media', function () { $media = ContentMedia::factory()->create(); expect($media)->toBeInstanceOf(ContentMedia::class) ->and($media->mime_type)->toStartWith('image/') ->and($media->width)->toBeInt() ->and($media->height)->toBeInt(); }); it('creates media with cdn', function () { $media = ContentMedia::factory()->withCdn()->create(); expect($media->cdn_url)->toContain('cdn.host.uk.com'); }); it('creates a content item', function () { $item = ContentItem::factory()->create(); expect($item)->toBeInstanceOf(ContentItem::class) ->and($item->title)->toBeString() ->and($item->slug)->toBeString() ->and($item->type)->toBeIn(['post', 'page']) ->and($item->status)->toBeIn(['publish', 'draft', 'pending', 'future', 'private']); }); it('creates a published post', function () { $item = ContentItem::factory()->published()->post()->create(); expect($item->status)->toBe('publish') ->and($item->type)->toBe('post') ->and($item->sync_status)->toBe('synced'); }); it('creates a draft page', function () { $item = ContentItem::factory()->draft()->page()->create(); expect($item->status)->toBe('draft') ->and($item->type)->toBe('page'); }); it('creates a failed sync item', function () { $item = ContentItem::factory()->failed()->create(); expect($item->sync_status)->toBe('failed') ->and($item->sync_error)->not->toBeNull(); }); it('creates a content item with rich content', function () { $item = ContentItem::factory()->withRichContent()->create(); expect($item->content_html_original)->toContain('

') ->and($item->content_json['blocks'])->toBeArray() ->and(count($item->content_json['blocks']))->toBeGreaterThan(3); }); it('creates a webhook log', function () { $log = ContentWebhookLog::factory()->create(); expect($log)->toBeInstanceOf(ContentWebhookLog::class) ->and($log->event_type)->toBeString() ->and($log->payload)->toBeArray(); }); it('creates a completed webhook', function () { $log = ContentWebhookLog::factory()->completed()->create(); expect($log->status)->toBe('completed') ->and($log->processed_at)->not->toBeNull() ->and($log->error_message)->toBeNull(); }); it('creates a failed webhook', function () { $log = ContentWebhookLog::factory()->failed()->create(); expect($log->status)->toBe('failed') ->and($log->error_message)->not->toBeNull(); }); it('creates multiple content items', function () { $workspace = Workspace::factory()->create(); $items = ContentItem::factory() ->count(10) ->create(['workspace_id' => $workspace->id]); expect($items)->toHaveCount(10) ->and($items->first()->workspace_id)->toBe($workspace->id); }); it('creates items with different statuses using sequence', function () { $items = ContentItem::factory() ->count(3) ->sequence( ['status' => 'publish'], ['status' => 'draft'], ['status' => 'pending'], ) ->create(); expect($items[0]->status)->toBe('publish') ->and($items[1]->status)->toBe('draft') ->and($items[2]->status)->toBe('pending'); }); }); describe('Computed Property Tests', function () { it('returns correct status colour for content items', function () { $published = ContentItem::factory()->published()->create(); $draft = ContentItem::factory()->draft()->create(); $pending = ContentItem::factory()->pending()->create(); $scheduled = ContentItem::factory()->scheduled()->create(); expect($published->status_color)->toBe('green') ->and($draft->status_color)->toBe('yellow') ->and($pending->status_color)->toBe('orange') ->and($scheduled->status_color)->toBe('blue'); }); it('returns correct sync colour for content items', function () { $synced = ContentItem::factory()->synced()->create(); $pendingSync = ContentItem::factory()->pendingSync()->create(); $stale = ContentItem::factory()->stale()->create(); $failed = ContentItem::factory()->failed()->create(); expect($synced->sync_color)->toBe('green') ->and($pendingSync->sync_color)->toBe('yellow') ->and($stale->sync_color)->toBe('orange') ->and($failed->sync_color)->toBe('red'); }); it('returns correct type colour for content items', function () { $post = ContentItem::factory()->post()->create(); $page = ContentItem::factory()->page()->create(); expect($post->type_color)->toBe('blue') ->and($page->type_color)->toBe('violet'); }); it('returns correct icons for content item status', function () { $published = ContentItem::factory()->published()->create(); $draft = ContentItem::factory()->draft()->create(); expect($published->status_icon)->toBe('check-circle') ->and($draft->status_icon)->toBe('pencil'); }); it('returns correct icons for sync status', function () { $synced = ContentItem::factory()->synced()->create(); $failed = ContentItem::factory()->failed()->create(); expect($synced->sync_icon)->toBe('check') ->and($failed->sync_icon)->toBe('x-mark'); }); it('returns correct status colour for webhooks', function () { $pending = ContentWebhookLog::factory()->pending()->create(); $completed = ContentWebhookLog::factory()->completed()->create(); $failed = ContentWebhookLog::factory()->failed()->create(); expect($pending->status_color)->toBe('yellow') ->and($completed->status_color)->toBe('green') ->and($failed->status_color)->toBe('red'); }); it('returns correct icons for webhook status', function () { $pending = ContentWebhookLog::factory()->pending()->create(); $completed = ContentWebhookLog::factory()->completed()->create(); $failed = ContentWebhookLog::factory()->failed()->create(); expect($pending->status_icon)->toBe('clock') ->and($completed->status_icon)->toBe('check') ->and($failed->status_icon)->toBe('x-mark'); }); });