diff options
Diffstat (limited to 'spec')
-rw-r--r-- | spec/fabricators/media_attachment_fabricator.rb | 2 | ||||
-rw-r--r-- | spec/fabricators/status_fabricator.rb | 1 | ||||
-rw-r--r-- | spec/models/account_spec.rb | 68 | ||||
-rw-r--r-- | spec/models/status_spec.rb | 25 | ||||
-rw-r--r-- | spec/services/post_status_service_spec.rb | 168 |
5 files changed, 255 insertions, 9 deletions
diff --git a/spec/fabricators/media_attachment_fabricator.rb b/spec/fabricators/media_attachment_fabricator.rb index 59db2440d..dc91d708f 100644 --- a/spec/fabricators/media_attachment_fabricator.rb +++ b/spec/fabricators/media_attachment_fabricator.rb @@ -1,3 +1,3 @@ Fabricator(:media_attachment) do - + account end diff --git a/spec/fabricators/status_fabricator.rb b/spec/fabricators/status_fabricator.rb index df222fc9d..8ec5f4ba7 100644 --- a/spec/fabricators/status_fabricator.rb +++ b/spec/fabricators/status_fabricator.rb @@ -1,3 +1,4 @@ Fabricator(:status) do + account text "Lorem ipsum dolor sit amet" end diff --git a/spec/models/account_spec.rb b/spec/models/account_spec.rb index d7f59adb8..93a45459d 100644 --- a/spec/models/account_spec.rb +++ b/spec/models/account_spec.rb @@ -99,11 +99,75 @@ RSpec.describe Account, type: :model do end describe '#favourited?' do - pending + let(:original_status) do + author = Fabricate(:account, username: 'original') + Fabricate(:status, account: author) + end + + context 'when the status is a reblog of another status' do + let(:original_reblog) do + author = Fabricate(:account, username: 'original_reblogger') + Fabricate(:status, reblog: original_status, account: author) + end + + it 'is is true when this account has favourited it' do + Fabricate(:favourite, status: original_reblog, account: subject) + + expect(subject.favourited?(original_status)).to eq true + end + + it 'is false when this account has not favourited it' do + expect(subject.favourited?(original_status)).to eq false + end + end + + context 'when the status is an original status' do + it 'is is true when this account has favourited it' do + Fabricate(:favourite, status: original_status, account: subject) + + expect(subject.favourited?(original_status)).to eq true + end + + it 'is false when this account has not favourited it' do + expect(subject.favourited?(original_status)).to eq false + end + end end describe '#reblogged?' do - pending + let(:original_status) do + author = Fabricate(:account, username: 'original') + Fabricate(:status, account: author) + end + + context 'when the status is a reblog of another status'do + let(:original_reblog) do + author = Fabricate(:account, username: 'original_reblogger') + Fabricate(:status, reblog: original_status, account: author) + end + + it 'is true when this account has reblogged it' do + Fabricate(:status, reblog: original_reblog, account: subject) + + expect(subject.reblogged?(original_reblog)).to eq true + end + + it 'is false when this account has not reblogged it' do + expect(subject.reblogged?(original_reblog)).to eq false + end + end + + context 'when the status is an original status' do + it 'is true when this account has reblogged it' do + Fabricate(:status, reblog: original_status, account: subject) + + expect(subject.reblogged?(original_status)).to eq true + end + + it 'is false when this account has not reblogged it' do + expect(subject.reblogged?(original_status)).to eq false + end + end end describe '.find_local' do diff --git a/spec/models/status_spec.rb b/spec/models/status_spec.rb index b9d079521..000bee0f5 100644 --- a/spec/models/status_spec.rb +++ b/spec/models/status_spec.rb @@ -91,10 +91,31 @@ RSpec.describe Status, type: :model do end describe '#reblogs_count' do - pending + it 'is the number of reblogs' do + Fabricate(:status, account: bob, reblog: subject) + Fabricate(:status, account: alice, reblog: subject) + + expect(subject.reblogs_count).to eq 2 + end end describe '#favourites_count' do - pending + it 'is the number of favorites' do + Fabricate(:favourite, account: bob, status: subject) + Fabricate(:favourite, account: alice, status: subject) + + expect(subject.favourites_count).to eq 2 + end + end + + describe '#proper' do + it 'is itself for original statuses' do + expect(subject.proper).to eq subject + end + + it 'is the source status for reblogs' do + subject.reblog = other + expect(subject.proper).to eq other + end end end diff --git a/spec/services/post_status_service_spec.rb b/spec/services/post_status_service_spec.rb index 9ee4daf6f..0e39cd969 100644 --- a/spec/services/post_status_service_spec.rb +++ b/spec/services/post_status_service_spec.rb @@ -3,8 +3,168 @@ require 'rails_helper' RSpec.describe PostStatusService do subject { PostStatusService.new } - it 'creates a new status' - it 'creates a new response status' - it 'processes mentions' - it 'pings PuSH hubs' + it 'creates a new status' do + account = Fabricate(:account) + text = "test status update" + + status = subject.call(account, text) + + expect(status).to be_persisted + expect(status.text).to eq text + end + + it 'creates a new response status' do + in_reply_to_status = Fabricate(:status) + account = Fabricate(:account) + text = "test status update" + + status = subject.call(account, text, in_reply_to_status) + + expect(status).to be_persisted + expect(status.text).to eq text + expect(status.thread).to eq in_reply_to_status + end + + it 'creates a sensitive status' do + status = create_status_with_options(sensitive: true) + + expect(status).to be_persisted + expect(status).to be_sensitive + end + + it 'creates a status with spoiler text' do + spoiler_text = "spoiler text" + + status = create_status_with_options(spoiler_text: spoiler_text) + + expect(status).to be_persisted + expect(status.spoiler_text).to eq spoiler_text + end + + it 'creates a status with empty default spoiler text' do + status = create_status_with_options(spoiler_text: nil) + + expect(status).to be_persisted + expect(status.spoiler_text).to eq '' + end + + it 'creates a status with the given visibility' do + status = create_status_with_options(visibility: :private) + + expect(status).to be_persisted + expect(status.visibility).to eq "private" + end + + it 'creates a status for the given application' do + application = Fabricate(:application) + + status = create_status_with_options(application: application) + + expect(status).to be_persisted + expect(status.application).to eq application + end + + it 'processes mentions' do + mention_service = double(:process_mentions_service) + allow(mention_service).to receive(:call) + allow(ProcessMentionsService).to receive(:new).and_return(mention_service) + account = Fabricate(:account) + + status = subject.call(account, "test status update") + + expect(ProcessMentionsService).to have_received(:new) + expect(mention_service).to have_received(:call).with(status) + end + + it 'processes hashtags' do + hashtags_service = double(:process_hashtags_service) + allow(hashtags_service).to receive(:call) + allow(ProcessHashtagsService).to receive(:new).and_return(hashtags_service) + account = Fabricate(:account) + + status = subject.call(account, "test status update") + + expect(ProcessHashtagsService).to have_received(:new) + expect(hashtags_service).to have_received(:call).with(status) + end + + it 'pings PuSH hubs' do + allow(DistributionWorker).to receive(:perform_async) + allow(Pubsubhubbub::DistributionWorker).to receive(:perform_async) + account = Fabricate(:account) + + status = subject.call(account, "test status update") + + expect(DistributionWorker).to have_received(:perform_async).with(status.id) + expect(Pubsubhubbub::DistributionWorker). + to have_received(:perform_async).with(status.stream_entry.id) + end + + it 'crawls links' do + allow(LinkCrawlWorker).to receive(:perform_async) + account = Fabricate(:account) + + status = subject.call(account, "test status update") + + expect(LinkCrawlWorker).to have_received(:perform_async).with(status.id) + end + + it 'attaches the given media to the created status' do + account = Fabricate(:account) + media = Fabricate(:media_attachment) + + status = subject.call( + account, + "test status update", + nil, + media_ids: [media.id], + ) + + expect(media.reload.status).to eq status + end + + it 'does not allow attaching more than 4 files' do + account = Fabricate(:account) + + expect do + subject.call( + account, + "test status update", + nil, + media_ids: [ + Fabricate(:media_attachment, account: account), + Fabricate(:media_attachment, account: account), + Fabricate(:media_attachment, account: account), + Fabricate(:media_attachment, account: account), + Fabricate(:media_attachment, account: account), + ].map(&:id), + ) + end.to raise_error( + Mastodon::ValidationError, + I18n.t('media_attachments.validations.too_many'), + ) + end + + it 'does not allow attaching both videos and images' do + account = Fabricate(:account) + + expect do + subject.call( + account, + "test status update", + nil, + media_ids: [ + Fabricate(:media_attachment, type: :video, account: account), + Fabricate(:media_attachment, type: :image, account: account), + ].map(&:id), + ) + end.to raise_error( + Mastodon::ValidationError, + I18n.t('media_attachments.validations.images_and_video'), + ) + end + + def create_status_with_options(options = {}) + subject.call(Fabricate(:account), "test", nil, options) + end end |