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
 |