553d6a1ea6
duplicates. Web UI regenerates UUID for that header every time the compose form is changed or successfully submitted Also, fix Farsi i18n overwriting the English one
189 lines
5.4 KiB
Ruby
189 lines
5.4 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 'creates a status with a language set' do
|
|
detector = double(to_iso_s: :en)
|
|
allow(LanguageDetector).to receive(:new).and_return(detector)
|
|
|
|
account = Fabricate(:account)
|
|
text = 'test status text'
|
|
|
|
subject.call(account, text)
|
|
|
|
expect(LanguageDetector).to have_received(:new).with(text, account)
|
|
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
|
|
|
|
it 'returns existing status when used twice with idempotency key' do
|
|
account = Fabricate(:account)
|
|
status1 = subject.call(account, 'test', nil, idempotency: 'meepmeep')
|
|
status2 = subject.call(account, 'test', nil, idempotency: 'meepmeep')
|
|
expect(status2.id).to eq status1.id
|
|
end
|
|
|
|
def create_status_with_options(options = {})
|
|
subject.call(Fabricate(:account), 'test', nil, options)
|
|
end
|
|
end
|