forked from fedi/mastodon
ad5ddd5e95
These are currently user facing errors, but are not localized. This adds the ability for these messages to be localized.
171 lines
4.8 KiB
Ruby
171 lines
4.8 KiB
Ruby
require 'rails_helper'
|
|
|
|
RSpec.describe PostStatusService do
|
|
subject { PostStatusService.new }
|
|
|
|
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
|