Merge commit '0a7cff53c2577b3e79599e069eeb344f2613ad8d' into glitch-soc/merge-upstream
This commit is contained in:
		
						commit
						23d8bd8ce1
					
				| 
						 | 
				
			
			@ -2,7 +2,7 @@
 | 
			
		|||
 | 
			
		||||
class Api::V1::StreamingController < Api::BaseController
 | 
			
		||||
  def index
 | 
			
		||||
    if Rails.configuration.x.streaming_api_base_url == request.host
 | 
			
		||||
    if same_host?
 | 
			
		||||
      not_found
 | 
			
		||||
    else
 | 
			
		||||
      redirect_to streaming_api_url, status: 301, allow_other_host: true
 | 
			
		||||
| 
						 | 
				
			
			@ -11,6 +11,11 @@ class Api::V1::StreamingController < Api::BaseController
 | 
			
		|||
 | 
			
		||||
  private
 | 
			
		||||
 | 
			
		||||
  def same_host?
 | 
			
		||||
    base_url = Addressable::URI.parse(Rails.configuration.x.streaming_api_base_url)
 | 
			
		||||
    request.host == base_url.host && request.port == (base_url.port || 80)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def streaming_api_url
 | 
			
		||||
    Addressable::URI.parse(request.url).tap do |uri|
 | 
			
		||||
      base_url = Addressable::URI.parse(Rails.configuration.x.streaming_api_base_url)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -118,14 +118,15 @@ class User < ApplicationRecord
 | 
			
		|||
  scope :matches_email, ->(value) { where(arel_table[:email].matches("#{value}%")) }
 | 
			
		||||
  scope :matches_ip, ->(value) { left_joins(:ips).where('user_ips.ip <<= ?', value).group('users.id') }
 | 
			
		||||
 | 
			
		||||
  before_validation :sanitize_languages
 | 
			
		||||
  before_validation :sanitize_role
 | 
			
		||||
  before_validation :sanitize_time_zone
 | 
			
		||||
  before_validation :sanitize_locale
 | 
			
		||||
  before_create :set_approved
 | 
			
		||||
  after_commit :send_pending_devise_notifications
 | 
			
		||||
  after_create_commit :trigger_webhooks
 | 
			
		||||
 | 
			
		||||
  normalizes :locale, with: ->(locale) { I18n.available_locales.exclude?(locale.to_sym) ? nil : locale }
 | 
			
		||||
  normalizes :time_zone, with: ->(time_zone) { ActiveSupport::TimeZone[time_zone].nil? ? nil : time_zone }
 | 
			
		||||
  normalizes :chosen_languages, with: ->(chosen_languages) { chosen_languages.compact_blank.presence }
 | 
			
		||||
 | 
			
		||||
  # This avoids a deprecation warning from Rails 5.1
 | 
			
		||||
  # It seems possible that a future release of devise-two-factor will
 | 
			
		||||
  # handle this itself, and this can be removed from our User class.
 | 
			
		||||
| 
						 | 
				
			
			@ -447,25 +448,10 @@ class User < ApplicationRecord
 | 
			
		|||
    @bypass_invite_request_check
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def sanitize_languages
 | 
			
		||||
    return if chosen_languages.nil?
 | 
			
		||||
 | 
			
		||||
    chosen_languages.compact_blank!
 | 
			
		||||
    self.chosen_languages = nil if chosen_languages.empty?
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def sanitize_role
 | 
			
		||||
    self.role = nil if role.present? && role.everyone?
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def sanitize_time_zone
 | 
			
		||||
    self.time_zone = nil if time_zone.present? && ActiveSupport::TimeZone[time_zone].nil?
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def sanitize_locale
 | 
			
		||||
    self.locale = nil if locale.present? && I18n.available_locales.exclude?(locale.to_sym)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def prepare_new_user!
 | 
			
		||||
    BootstrapTimelineWorker.perform_async(account_id)
 | 
			
		||||
    ActivityTracker.increment('activity:accounts:local')
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,14 +1,10 @@
 | 
			
		|||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
require Rails.root.join('lib', 'mastodon', 'migration_helpers')
 | 
			
		||||
 | 
			
		||||
class AddHideNotificationsToMute < ActiveRecord::Migration[5.1]
 | 
			
		||||
  include Mastodon::MigrationHelpers
 | 
			
		||||
 | 
			
		||||
  disable_ddl_transaction!
 | 
			
		||||
 | 
			
		||||
  def up
 | 
			
		||||
    add_column_with_default :mutes, :hide_notifications, :boolean, default: true, allow_null: false
 | 
			
		||||
    add_column :mutes, :hide_notifications, :boolean, default: true, null: false
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def down
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,14 +1,10 @@
 | 
			
		|||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
require Rails.root.join('lib', 'mastodon', 'migration_helpers')
 | 
			
		||||
 | 
			
		||||
class AddDisabledToCustomEmojis < ActiveRecord::Migration[5.2]
 | 
			
		||||
  include Mastodon::MigrationHelpers
 | 
			
		||||
 | 
			
		||||
  disable_ddl_transaction!
 | 
			
		||||
 | 
			
		||||
  def up
 | 
			
		||||
    safety_assured { add_column_with_default :custom_emojis, :disabled, :bool, default: false }
 | 
			
		||||
    safety_assured { add_column :custom_emojis, :disabled, :bool, default: false, null: false }
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def down
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,16 +1,12 @@
 | 
			
		|||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
require Rails.root.join('lib', 'mastodon', 'migration_helpers')
 | 
			
		||||
 | 
			
		||||
class AddReblogsToFollows < ActiveRecord::Migration[5.2]
 | 
			
		||||
  include Mastodon::MigrationHelpers
 | 
			
		||||
 | 
			
		||||
  disable_ddl_transaction!
 | 
			
		||||
 | 
			
		||||
  def up
 | 
			
		||||
    safety_assured do
 | 
			
		||||
      add_column_with_default :follows, :show_reblogs, :boolean, default: true, allow_null: false
 | 
			
		||||
      add_column_with_default :follow_requests, :show_reblogs, :boolean, default: true, allow_null: false
 | 
			
		||||
      add_column :follows, :show_reblogs, :boolean, default: true, null: false
 | 
			
		||||
      add_column :follow_requests, :show_reblogs, :boolean, default: true, null: false
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,14 +1,10 @@
 | 
			
		|||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
require Rails.root.join('lib', 'mastodon', 'migration_helpers')
 | 
			
		||||
 | 
			
		||||
class AddMemorialToAccounts < ActiveRecord::Migration[5.2]
 | 
			
		||||
  include Mastodon::MigrationHelpers
 | 
			
		||||
 | 
			
		||||
  disable_ddl_transaction!
 | 
			
		||||
 | 
			
		||||
  def up
 | 
			
		||||
    safety_assured { add_column_with_default :accounts, :memorial, :bool, default: false }
 | 
			
		||||
    safety_assured { add_column :accounts, :memorial, :bool, default: false, null: false }
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def down
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,14 +1,10 @@
 | 
			
		|||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
require Rails.root.join('lib', 'mastodon', 'migration_helpers')
 | 
			
		||||
 | 
			
		||||
class AddDisabledToUsers < ActiveRecord::Migration[5.2]
 | 
			
		||||
  include Mastodon::MigrationHelpers
 | 
			
		||||
 | 
			
		||||
  disable_ddl_transaction!
 | 
			
		||||
 | 
			
		||||
  def up
 | 
			
		||||
    safety_assured { add_column_with_default :users, :disabled, :bool, default: false }
 | 
			
		||||
    safety_assured { add_column :users, :disabled, :bool, default: false, null: false }
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def down
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,14 +1,10 @@
 | 
			
		|||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
require Rails.root.join('lib', 'mastodon', 'migration_helpers')
 | 
			
		||||
 | 
			
		||||
class AddModeratorToAccounts < ActiveRecord::Migration[5.2]
 | 
			
		||||
  include Mastodon::MigrationHelpers
 | 
			
		||||
 | 
			
		||||
  disable_ddl_transaction!
 | 
			
		||||
 | 
			
		||||
  def up
 | 
			
		||||
    safety_assured { add_column_with_default :users, :moderator, :bool, default: false }
 | 
			
		||||
    safety_assured { add_column :users, :moderator, :bool, default: false, null: false }
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def down
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,15 +1,11 @@
 | 
			
		|||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
require Rails.root.join('lib', 'mastodon', 'migration_helpers')
 | 
			
		||||
 | 
			
		||||
class AddEmbedURLToPreviewCards < ActiveRecord::Migration[5.2]
 | 
			
		||||
  include Mastodon::MigrationHelpers
 | 
			
		||||
 | 
			
		||||
  disable_ddl_transaction!
 | 
			
		||||
 | 
			
		||||
  def up
 | 
			
		||||
    safety_assured do
 | 
			
		||||
      add_column_with_default :preview_cards, :embed_url, :string, default: '', allow_null: false
 | 
			
		||||
      add_column :preview_cards, :embed_url, :string, default: '', null: false
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,15 +1,11 @@
 | 
			
		|||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
require Rails.root.join('lib', 'mastodon', 'migration_helpers')
 | 
			
		||||
 | 
			
		||||
class AddAutofollowToInvites < ActiveRecord::Migration[5.2]
 | 
			
		||||
  include Mastodon::MigrationHelpers
 | 
			
		||||
 | 
			
		||||
  disable_ddl_transaction!
 | 
			
		||||
 | 
			
		||||
  def up
 | 
			
		||||
    safety_assured do
 | 
			
		||||
      add_column_with_default :invites, :autofollow, :bool, default: false, allow_null: false
 | 
			
		||||
      add_column :invites, :autofollow, :bool, default: false, null: false
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,15 +1,11 @@
 | 
			
		|||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
require Rails.root.join('lib', 'mastodon', 'migration_helpers')
 | 
			
		||||
 | 
			
		||||
class AddWholeWordToCustomFilter < ActiveRecord::Migration[5.2]
 | 
			
		||||
  include Mastodon::MigrationHelpers
 | 
			
		||||
 | 
			
		||||
  disable_ddl_transaction!
 | 
			
		||||
 | 
			
		||||
  def change
 | 
			
		||||
    safety_assured do
 | 
			
		||||
      add_column_with_default :custom_filters, :whole_word, :boolean, default: true, allow_null: false
 | 
			
		||||
      add_column :custom_filters, :whole_word, :boolean, default: true, null: false
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,19 +1,15 @@
 | 
			
		|||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
require Rails.root.join('lib', 'mastodon', 'migration_helpers')
 | 
			
		||||
 | 
			
		||||
class AddConfidentialToDoorkeeperApplication < ActiveRecord::Migration[5.2]
 | 
			
		||||
  include Mastodon::MigrationHelpers
 | 
			
		||||
 | 
			
		||||
  disable_ddl_transaction!
 | 
			
		||||
 | 
			
		||||
  def up
 | 
			
		||||
    safety_assured do
 | 
			
		||||
      add_column_with_default(
 | 
			
		||||
      add_column(
 | 
			
		||||
        :oauth_applications,
 | 
			
		||||
        :confidential,
 | 
			
		||||
        :boolean,
 | 
			
		||||
        allow_null: false,
 | 
			
		||||
        null: false,
 | 
			
		||||
        default: true # maintaining backwards compatibility: require secrets
 | 
			
		||||
      )
 | 
			
		||||
    end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,19 +1,15 @@
 | 
			
		|||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
require Rails.root.join('lib', 'mastodon', 'migration_helpers')
 | 
			
		||||
 | 
			
		||||
class AddSilentToMentions < ActiveRecord::Migration[5.2]
 | 
			
		||||
  include Mastodon::MigrationHelpers
 | 
			
		||||
 | 
			
		||||
  disable_ddl_transaction!
 | 
			
		||||
 | 
			
		||||
  def up
 | 
			
		||||
    safety_assured do
 | 
			
		||||
      add_column_with_default(
 | 
			
		||||
      add_column(
 | 
			
		||||
        :mentions,
 | 
			
		||||
        :silent,
 | 
			
		||||
        :boolean,
 | 
			
		||||
        allow_null: false,
 | 
			
		||||
        null: false,
 | 
			
		||||
        default: false
 | 
			
		||||
      )
 | 
			
		||||
    end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,15 +1,11 @@
 | 
			
		|||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
require Rails.root.join('lib', 'mastodon', 'migration_helpers')
 | 
			
		||||
 | 
			
		||||
class AddRejectReportsToDomainBlocks < ActiveRecord::Migration[5.2]
 | 
			
		||||
  include Mastodon::MigrationHelpers
 | 
			
		||||
 | 
			
		||||
  disable_ddl_transaction!
 | 
			
		||||
 | 
			
		||||
  def up
 | 
			
		||||
    safety_assured do
 | 
			
		||||
      add_column_with_default :domain_blocks, :reject_reports, :boolean, default: false, allow_null: false
 | 
			
		||||
      add_column :domain_blocks, :reject_reports, :boolean, default: false, null: false
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,19 +1,15 @@
 | 
			
		|||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
require Rails.root.join('lib', 'mastodon', 'migration_helpers')
 | 
			
		||||
 | 
			
		||||
class AddUnreadToAccountConversations < ActiveRecord::Migration[5.2]
 | 
			
		||||
  include Mastodon::MigrationHelpers
 | 
			
		||||
 | 
			
		||||
  disable_ddl_transaction!
 | 
			
		||||
 | 
			
		||||
  def up
 | 
			
		||||
    safety_assured do
 | 
			
		||||
      add_column_with_default(
 | 
			
		||||
      add_column(
 | 
			
		||||
        :account_conversations,
 | 
			
		||||
        :unread,
 | 
			
		||||
        :boolean,
 | 
			
		||||
        allow_null: false,
 | 
			
		||||
        null: false,
 | 
			
		||||
        default: false
 | 
			
		||||
      )
 | 
			
		||||
    end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,19 +1,15 @@
 | 
			
		|||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
require Rails.root.join('lib', 'mastodon', 'migration_helpers')
 | 
			
		||||
 | 
			
		||||
class AddShowRepliesToLists < ActiveRecord::Migration[5.2]
 | 
			
		||||
  include Mastodon::MigrationHelpers
 | 
			
		||||
 | 
			
		||||
  disable_ddl_transaction!
 | 
			
		||||
 | 
			
		||||
  def up
 | 
			
		||||
    safety_assured do
 | 
			
		||||
      add_column_with_default(
 | 
			
		||||
      add_column(
 | 
			
		||||
        :lists,
 | 
			
		||||
        :replies_policy,
 | 
			
		||||
        :integer,
 | 
			
		||||
        allow_null: false,
 | 
			
		||||
        null: false,
 | 
			
		||||
        default: 0
 | 
			
		||||
      )
 | 
			
		||||
    end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,15 +1,11 @@
 | 
			
		|||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
require Rails.root.join('lib', 'mastodon', 'migration_helpers')
 | 
			
		||||
 | 
			
		||||
class AddOverwriteToImports < ActiveRecord::Migration[5.2]
 | 
			
		||||
  include Mastodon::MigrationHelpers
 | 
			
		||||
 | 
			
		||||
  disable_ddl_transaction!
 | 
			
		||||
 | 
			
		||||
  def up
 | 
			
		||||
    safety_assured do
 | 
			
		||||
      add_column_with_default :imports, :overwrite, :boolean, default: false, allow_null: false
 | 
			
		||||
      add_column :imports, :overwrite, :boolean, default: false, null: false
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,19 +1,15 @@
 | 
			
		|||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
require Rails.root.join('lib', 'mastodon', 'migration_helpers')
 | 
			
		||||
 | 
			
		||||
class AddLockVersionToPolls < ActiveRecord::Migration[5.2]
 | 
			
		||||
  include Mastodon::MigrationHelpers
 | 
			
		||||
 | 
			
		||||
  disable_ddl_transaction!
 | 
			
		||||
 | 
			
		||||
  def up
 | 
			
		||||
    safety_assured do
 | 
			
		||||
      add_column_with_default(
 | 
			
		||||
      add_column(
 | 
			
		||||
        :polls,
 | 
			
		||||
        :lock_version,
 | 
			
		||||
        :integer,
 | 
			
		||||
        allow_null: false,
 | 
			
		||||
        null: false,
 | 
			
		||||
        default: 0
 | 
			
		||||
      )
 | 
			
		||||
    end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,19 +1,15 @@
 | 
			
		|||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
require Rails.root.join('lib', 'mastodon', 'migration_helpers')
 | 
			
		||||
 | 
			
		||||
class AddApprovedToUsers < ActiveRecord::Migration[5.2]
 | 
			
		||||
  include Mastodon::MigrationHelpers
 | 
			
		||||
 | 
			
		||||
  disable_ddl_transaction!
 | 
			
		||||
 | 
			
		||||
  def up
 | 
			
		||||
    safety_assured do
 | 
			
		||||
      add_column_with_default(
 | 
			
		||||
      add_column(
 | 
			
		||||
        :users,
 | 
			
		||||
        :approved,
 | 
			
		||||
        :bool,
 | 
			
		||||
        allow_null: false,
 | 
			
		||||
        null: false,
 | 
			
		||||
        default: true
 | 
			
		||||
      )
 | 
			
		||||
    end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,14 +1,10 @@
 | 
			
		|||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
require Rails.root.join('lib', 'mastodon', 'migration_helpers')
 | 
			
		||||
 | 
			
		||||
class AddLockVersionToAccountStats < ActiveRecord::Migration[5.2]
 | 
			
		||||
  include Mastodon::MigrationHelpers
 | 
			
		||||
 | 
			
		||||
  disable_ddl_transaction!
 | 
			
		||||
 | 
			
		||||
  def up
 | 
			
		||||
    safety_assured { add_column_with_default :account_stats, :lock_version, :integer, allow_null: false, default: 0 }
 | 
			
		||||
    safety_assured { add_column :account_stats, :lock_version, :integer, null: false, default: 0 }
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def down
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,14 +1,10 @@
 | 
			
		|||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
require Rails.root.join('lib', 'mastodon', 'migration_helpers')
 | 
			
		||||
 | 
			
		||||
class AddTitleToAccountWarningPresets < ActiveRecord::Migration[5.2]
 | 
			
		||||
  include Mastodon::MigrationHelpers
 | 
			
		||||
 | 
			
		||||
  disable_ddl_transaction!
 | 
			
		||||
 | 
			
		||||
  def up
 | 
			
		||||
    safety_assured { add_column_with_default :account_warning_presets, :title, :string, default: '', allow_null: false }
 | 
			
		||||
    safety_assured { add_column :account_warning_presets, :title, :string, default: '', null: false }
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def down
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,16 +1,12 @@
 | 
			
		|||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
require Rails.root.join('lib', 'mastodon', 'migration_helpers')
 | 
			
		||||
 | 
			
		||||
class AddNotifyToFollows < ActiveRecord::Migration[5.2]
 | 
			
		||||
  include Mastodon::MigrationHelpers
 | 
			
		||||
 | 
			
		||||
  disable_ddl_transaction!
 | 
			
		||||
 | 
			
		||||
  def up
 | 
			
		||||
    safety_assured do
 | 
			
		||||
      add_column_with_default :follows, :notify, :boolean, default: false, allow_null: false
 | 
			
		||||
      add_column_with_default :follow_requests, :notify, :boolean, default: false, allow_null: false
 | 
			
		||||
      add_column :follows, :notify, :boolean, default: false, null: false
 | 
			
		||||
      add_column :follow_requests, :notify, :boolean, default: false, null: false
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,14 +1,10 @@
 | 
			
		|||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
require Rails.root.join('lib', 'mastodon', 'migration_helpers')
 | 
			
		||||
 | 
			
		||||
class AddObfuscateToDomainBlocks < ActiveRecord::Migration[5.2]
 | 
			
		||||
  include Mastodon::MigrationHelpers
 | 
			
		||||
 | 
			
		||||
  disable_ddl_transaction!
 | 
			
		||||
 | 
			
		||||
  def up
 | 
			
		||||
    safety_assured { add_column_with_default :domain_blocks, :obfuscate, :boolean, default: false, allow_null: false }
 | 
			
		||||
    safety_assured { add_column :domain_blocks, :obfuscate, :boolean, default: false, null: false }
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def down
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,15 +1,11 @@
 | 
			
		|||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
require Rails.root.join('lib', 'mastodon', 'migration_helpers')
 | 
			
		||||
 | 
			
		||||
class AddCategoryToReports < ActiveRecord::Migration[6.1]
 | 
			
		||||
  include Mastodon::MigrationHelpers
 | 
			
		||||
 | 
			
		||||
  disable_ddl_transaction!
 | 
			
		||||
 | 
			
		||||
  def up
 | 
			
		||||
    safety_assured do
 | 
			
		||||
      add_column_with_default :reports, :category, :int, default: 0, allow_null: false
 | 
			
		||||
      add_column :reports, :category, :int, default: 0, null: false
 | 
			
		||||
      change_table(:reports, bulk: true) do |t|
 | 
			
		||||
        t.column :action_taken_at, :datetime
 | 
			
		||||
        t.column :rule_ids, :bigint, array: true
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,15 +1,11 @@
 | 
			
		|||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
require Rails.root.join('lib', 'mastodon', 'migration_helpers')
 | 
			
		||||
 | 
			
		||||
class AddActionToCustomFilters < ActiveRecord::Migration[6.1]
 | 
			
		||||
  include Mastodon::MigrationHelpers
 | 
			
		||||
 | 
			
		||||
  disable_ddl_transaction!
 | 
			
		||||
 | 
			
		||||
  def up
 | 
			
		||||
    safety_assured do
 | 
			
		||||
      add_column_with_default :custom_filters, :action, :integer, allow_null: false, default: 0
 | 
			
		||||
      add_column :custom_filters, :action, :integer, null: false, default: 0
 | 
			
		||||
      execute 'UPDATE custom_filters SET action = 1 WHERE irreversible IS TRUE'
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,14 +1,10 @@
 | 
			
		|||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
require Rails.root.join('lib', 'mastodon', 'migration_helpers')
 | 
			
		||||
 | 
			
		||||
class AddExclusiveToLists < ActiveRecord::Migration[6.1]
 | 
			
		||||
  include Mastodon::MigrationHelpers
 | 
			
		||||
 | 
			
		||||
  disable_ddl_transaction!
 | 
			
		||||
 | 
			
		||||
  def up
 | 
			
		||||
    safety_assured { add_column_with_default :lists, :exclusive, :boolean, default: false, allow_null: false }
 | 
			
		||||
    safety_assured { add_column :lists, :exclusive, :boolean, default: false, null: false }
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def down
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,14 +1,10 @@
 | 
			
		|||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
require Rails.root.join('lib', 'mastodon', 'migration_helpers')
 | 
			
		||||
 | 
			
		||||
class AddImageDescriptionToPreviewCards < ActiveRecord::Migration[7.0]
 | 
			
		||||
  include Mastodon::MigrationHelpers
 | 
			
		||||
 | 
			
		||||
  disable_ddl_transaction!
 | 
			
		||||
 | 
			
		||||
  def up
 | 
			
		||||
    safety_assured { add_column_with_default :preview_cards, :image_description, :string, default: '', allow_null: false }
 | 
			
		||||
    safety_assured { add_column :preview_cards, :image_description, :string, default: '', null: false }
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def down
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,14 +1,10 @@
 | 
			
		|||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
require Rails.root.join('lib', 'mastodon', 'migration_helpers')
 | 
			
		||||
 | 
			
		||||
class AddIndexableToAccounts < ActiveRecord::Migration[7.0]
 | 
			
		||||
  include Mastodon::MigrationHelpers
 | 
			
		||||
 | 
			
		||||
  disable_ddl_transaction!
 | 
			
		||||
 | 
			
		||||
  def up
 | 
			
		||||
    safety_assured { add_column_with_default :accounts, :indexable, :boolean, default: false, allow_null: false }
 | 
			
		||||
    safety_assured { add_column :accounts, :indexable, :boolean, default: false, null: false }
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def down
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,10 +1,6 @@
 | 
			
		|||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
require Rails.root.join('lib', 'mastodon', 'migration_helpers')
 | 
			
		||||
 | 
			
		||||
class RemoveWholeWordFromCustomFilters < ActiveRecord::Migration[6.1]
 | 
			
		||||
  include Mastodon::MigrationHelpers
 | 
			
		||||
 | 
			
		||||
  disable_ddl_transaction!
 | 
			
		||||
 | 
			
		||||
  def up
 | 
			
		||||
| 
						 | 
				
			
			@ -15,7 +11,7 @@ class RemoveWholeWordFromCustomFilters < ActiveRecord::Migration[6.1]
 | 
			
		|||
 | 
			
		||||
  def down
 | 
			
		||||
    safety_assured do
 | 
			
		||||
      add_column_with_default :custom_filters, :whole_word, :boolean, default: true, allow_null: false
 | 
			
		||||
      add_column :custom_filters, :whole_word, :boolean, default: true, null: false
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,10 +1,6 @@
 | 
			
		|||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
require Rails.root.join('lib', 'mastodon', 'migration_helpers')
 | 
			
		||||
 | 
			
		||||
class RemoveIrreversibleFromCustomFilters < ActiveRecord::Migration[6.1]
 | 
			
		||||
  include Mastodon::MigrationHelpers
 | 
			
		||||
 | 
			
		||||
  disable_ddl_transaction!
 | 
			
		||||
 | 
			
		||||
  def up
 | 
			
		||||
| 
						 | 
				
			
			@ -15,7 +11,7 @@ class RemoveIrreversibleFromCustomFilters < ActiveRecord::Migration[6.1]
 | 
			
		|||
 | 
			
		||||
  def down
 | 
			
		||||
    safety_assured do
 | 
			
		||||
      add_column_with_default :custom_filters, :irreversible, :boolean, allow_null: false, default: false
 | 
			
		||||
      add_column :custom_filters, :irreversible, :boolean, null: false, default: false
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -104,18 +104,7 @@ module Mastodon
 | 
			
		|||
            'in the body of your migration class'
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
        # If default value is presented, use `add_column_with_default` method instead.
 | 
			
		||||
        if options[:default]
 | 
			
		||||
          add_column_with_default(
 | 
			
		||||
            table_name,
 | 
			
		||||
            column_name,
 | 
			
		||||
            :datetime_with_timezone,
 | 
			
		||||
            default: options[:default],
 | 
			
		||||
            allow_null: options[:null]
 | 
			
		||||
          )
 | 
			
		||||
        else
 | 
			
		||||
          add_column(table_name, column_name, :datetime_with_timezone, **options)
 | 
			
		||||
        end
 | 
			
		||||
        add_column(table_name, column_name, :datetime_with_timezone, **options)
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -377,34 +366,6 @@ module Mastodon
 | 
			
		|||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    # Adds a column with a default value without locking an entire table.
 | 
			
		||||
    #
 | 
			
		||||
    # This method runs the following steps:
 | 
			
		||||
    #
 | 
			
		||||
    # 1. Add the column with a default value of NULL.
 | 
			
		||||
    # 2. Change the default value of the column to the specified value.
 | 
			
		||||
    # 3. Update all existing rows in batches.
 | 
			
		||||
    # 4. Set a `NOT NULL` constraint on the column if desired (the default).
 | 
			
		||||
    #
 | 
			
		||||
    # These steps ensure a column can be added to a large and commonly used
 | 
			
		||||
    # table without locking the entire table for the duration of the table
 | 
			
		||||
    # modification.
 | 
			
		||||
    #
 | 
			
		||||
    # table - The name of the table to update.
 | 
			
		||||
    # column - The name of the column to add.
 | 
			
		||||
    # type - The column type (e.g. `:integer`).
 | 
			
		||||
    # default - The default value for the column.
 | 
			
		||||
    # limit - Sets a column limit. For example, for :integer, the default is
 | 
			
		||||
    #         4-bytes. Set `limit: 8` to allow 8-byte integers.
 | 
			
		||||
    # allow_null - When set to `true` the column will allow NULL values, the
 | 
			
		||||
    #              default is to not allow NULL values.
 | 
			
		||||
    #
 | 
			
		||||
    # This method can also take a block which is passed directly to the
 | 
			
		||||
    # `update_column_in_batches` method.
 | 
			
		||||
    def add_column_with_default(table, column, type, default:, limit: nil, allow_null: false, &block)
 | 
			
		||||
      add_column(table, column, type, default: default, limit: limit, null: allow_null)
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    # Renames a column without requiring downtime.
 | 
			
		||||
    #
 | 
			
		||||
    # Concurrent renames work by using database triggers to ensure both the
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -44,7 +44,7 @@ RSpec.describe Admin::Disputes::AppealsController do
 | 
			
		|||
      expect(response).to redirect_to(disputes_strike_path(appeal.strike))
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    it 'notifies target account about approved appeal' do
 | 
			
		||||
    it 'notifies target account about approved appeal', :sidekiq_inline do
 | 
			
		||||
      expect(UserMailer.deliveries.size).to eq(1)
 | 
			
		||||
      expect(UserMailer.deliveries.first.to.first).to eq(target_account.user.email)
 | 
			
		||||
      expect(UserMailer.deliveries.first.subject).to eq(I18n.t('user_mailer.appeal_approved.subject', date: I18n.l(appeal.created_at)))
 | 
			
		||||
| 
						 | 
				
			
			@ -62,7 +62,7 @@ RSpec.describe Admin::Disputes::AppealsController do
 | 
			
		|||
      expect(response).to redirect_to(disputes_strike_path(appeal.strike))
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    it 'notifies target account about rejected appeal' do
 | 
			
		||||
    it 'notifies target account about rejected appeal', :sidekiq_inline do
 | 
			
		||||
      expect(UserMailer.deliveries.size).to eq(1)
 | 
			
		||||
      expect(UserMailer.deliveries.first.to.first).to eq(target_account.user.email)
 | 
			
		||||
      expect(UserMailer.deliveries.first.subject).to eq(I18n.t('user_mailer.appeal_rejected.subject', date: I18n.l(appeal.created_at)))
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -176,7 +176,7 @@ RSpec.describe Admin::DomainBlocksController do
 | 
			
		|||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  describe 'PUT #update' do
 | 
			
		||||
  describe 'PUT #update', :sidekiq_inline do
 | 
			
		||||
    subject do
 | 
			
		||||
      post :update, params: { :id => domain_block.id, :domain_block => { domain: 'example.com', severity: new_severity }, 'confirm' => '' }
 | 
			
		||||
    end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -11,7 +11,7 @@ describe Admin::ResetsController do
 | 
			
		|||
    sign_in Fabricate(:user, role: UserRole.find_by(name: 'Admin')), scope: :user
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  describe 'POST #create' do
 | 
			
		||||
  describe 'POST #create', :sidekiq_inline do
 | 
			
		||||
    it 'redirects to admin accounts page' do
 | 
			
		||||
      expect do
 | 
			
		||||
        post :create, params: { account_id: account.id }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -13,7 +13,7 @@ RSpec.describe Api::V1::ConversationsController do
 | 
			
		|||
    allow(controller).to receive(:doorkeeper_token) { token }
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  describe 'GET #index' do
 | 
			
		||||
  describe 'GET #index', :sidekiq_inline do
 | 
			
		||||
    let(:scopes) { 'read:statuses' }
 | 
			
		||||
 | 
			
		||||
    before do
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -9,7 +9,7 @@ describe Api::V1::Statuses::ReblogsController do
 | 
			
		|||
  let(:app)   { Fabricate(:application, name: 'Test app', website: 'http://testapp.com') }
 | 
			
		||||
  let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: 'write:statuses', application: app) }
 | 
			
		||||
 | 
			
		||||
  context 'with an oauth token', :sidekiq_fake do
 | 
			
		||||
  context 'with an oauth token' do
 | 
			
		||||
    before do
 | 
			
		||||
      allow(controller).to receive(:doorkeeper_token) { token }
 | 
			
		||||
    end
 | 
			
		||||
| 
						 | 
				
			
			@ -46,7 +46,7 @@ describe Api::V1::Statuses::ReblogsController do
 | 
			
		|||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    describe 'POST #destroy' do
 | 
			
		||||
    describe 'POST #destroy', :sidekiq_inline do
 | 
			
		||||
      context 'with public status' do
 | 
			
		||||
        let(:status) { Fabricate(:status, account: user.account) }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,7 +5,7 @@ require 'rails_helper'
 | 
			
		|||
describe Api::V1::StreamingController do
 | 
			
		||||
  around do |example|
 | 
			
		||||
    before = Rails.configuration.x.streaming_api_base_url
 | 
			
		||||
    Rails.configuration.x.streaming_api_base_url = Rails.configuration.x.web_domain
 | 
			
		||||
    Rails.configuration.x.streaming_api_base_url = "wss://#{Rails.configuration.x.web_domain}"
 | 
			
		||||
    example.run
 | 
			
		||||
    Rails.configuration.x.streaming_api_base_url = before
 | 
			
		||||
  end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -138,7 +138,7 @@ RSpec.describe Auth::SessionsController do
 | 
			
		|||
          expect(controller.current_user).to eq user
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
        it 'sends a suspicious sign-in mail' do
 | 
			
		||||
        it 'sends a suspicious sign-in mail', :sidekiq_inline do
 | 
			
		||||
          expect(UserMailer.deliveries.size).to eq(1)
 | 
			
		||||
          expect(UserMailer.deliveries.first.to.first).to eq(user.email)
 | 
			
		||||
          expect(UserMailer.deliveries.first.subject).to eq(I18n.t('user_mailer.suspicious_sign_in.subject'))
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -75,7 +75,7 @@ describe UserTrackingConcern do
 | 
			
		|||
        expect(redis.ttl("account:#{user.account_id}:regeneration")).to be >= 0
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      it 'regenerates feed when sign in is older than two weeks' do
 | 
			
		||||
      it 'regenerates feed when sign in is older than two weeks', :sidekiq_inline do
 | 
			
		||||
        get :show
 | 
			
		||||
 | 
			
		||||
        expect_updated_sign_in_at(user)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -17,7 +17,7 @@ RSpec.describe Disputes::AppealsController do
 | 
			
		|||
      post :create, params: { strike_id: strike.id, appeal: { text: 'Foo' } }
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    it 'notifies staff about new appeal' do
 | 
			
		||||
    it 'notifies staff about new appeal', :sidekiq_inline do
 | 
			
		||||
      expect(ActionMailer::Base.deliveries.first.to).to eq([admin.email])
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -50,7 +50,7 @@ describe Settings::DeletesController do
 | 
			
		|||
          delete :destroy, params: { form_delete_confirmation: { password: 'petsmoldoggos' } }
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
        it 'removes user record and redirects', :aggregate_failures do
 | 
			
		||||
        it 'removes user record and redirects', :aggregate_failures, :sidekiq_inline do
 | 
			
		||||
          expect(response).to redirect_to '/auth/sign_in'
 | 
			
		||||
          expect(User.find_by(id: user.id)).to be_nil
 | 
			
		||||
          expect(user.account.reload).to be_suspended
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -38,7 +38,7 @@ describe Settings::ExportsController do
 | 
			
		|||
      expect(response).to redirect_to(settings_export_path)
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    it 'queues BackupWorker job by 1', :sidekiq_fake do
 | 
			
		||||
    it 'queues BackupWorker job by 1' do
 | 
			
		||||
      expect do
 | 
			
		||||
        post :create
 | 
			
		||||
      end.to change(BackupWorker.jobs, :size).by(1)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -48,7 +48,7 @@ describe 'Admin::Accounts' do
 | 
			
		|||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    context 'with action of `reject`' do
 | 
			
		||||
    context 'with action of `reject`', :sidekiq_inline do
 | 
			
		||||
      it 'rejects and removes the account' do
 | 
			
		||||
        batch_checkbox_for(unapproved_user_account).check
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -23,7 +23,7 @@ RSpec.describe ActivityPub::Activity::Create do
 | 
			
		|||
    stub_request(:get, 'http://example.com/emojib.png').to_return(body: attachment_fixture('emojo.png'), headers: { 'Content-Type' => 'application/octet-stream' })
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  describe 'processing posts received out of order', :sidekiq_fake do
 | 
			
		||||
  describe 'processing posts received out of order' do
 | 
			
		||||
    let(:follower) { Fabricate(:account, username: 'bob') }
 | 
			
		||||
 | 
			
		||||
    let(:object_json) do
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -47,7 +47,7 @@ RSpec.describe ActivityPub::Activity::Delete do
 | 
			
		|||
        expect(Status.find_by(id: status.id)).to be_nil
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      it 'sends delete activity to followers of rebloggers' do
 | 
			
		||||
      it 'sends delete activity to followers of rebloggers', :sidekiq_inline do
 | 
			
		||||
        expect(a_request(:post, 'http://example.com/inbox')).to have_been_made.once
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -38,7 +38,7 @@ RSpec.describe ActivityPub::Activity::Move do
 | 
			
		|||
      subject.perform
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    context 'when all conditions are met' do
 | 
			
		||||
    context 'when all conditions are met', :sidekiq_inline do
 | 
			
		||||
      it 'sets moved account on old account' do
 | 
			
		||||
        expect(old_account.reload.moved_to_account_id).to eq new_account.id
 | 
			
		||||
      end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1009,4 +1009,27 @@ RSpec.describe Account do
 | 
			
		|||
      expect(subject.reload.followers_count).to eq 15
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  describe '.followable_by' do
 | 
			
		||||
    context 'with follows and follow requests' do
 | 
			
		||||
      let!(:account) { Fabricate(:account) }
 | 
			
		||||
      let!(:eligible_account) { Fabricate(:account) }
 | 
			
		||||
      let!(:following_account) { Fabricate(:account) }
 | 
			
		||||
      let!(:follow_requested_account) { Fabricate(:account) }
 | 
			
		||||
 | 
			
		||||
      before do
 | 
			
		||||
        Fabricate :follow, account: account, target_account: following_account
 | 
			
		||||
        Fabricate :follow_request, account: account, target_account: follow_requested_account
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      it 'returns accounts not already following or requested to follow' do
 | 
			
		||||
        results = described_class.followable_by(account)
 | 
			
		||||
 | 
			
		||||
        expect(results)
 | 
			
		||||
          .to include(eligible_account)
 | 
			
		||||
          .and not_include(following_account)
 | 
			
		||||
          .and not_include(follow_requested_account)
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -46,7 +46,7 @@ RSpec.describe Admin::AccountAction do
 | 
			
		|||
        expect(target_account).to be_suspended
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      it 'queues Admin::SuspensionWorker by 1', :sidekiq_fake do
 | 
			
		||||
      it 'queues Admin::SuspensionWorker by 1' do
 | 
			
		||||
        expect do
 | 
			
		||||
          subject
 | 
			
		||||
        end.to change { Admin::SuspensionWorker.jobs.size }.by 1
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -38,27 +38,53 @@ RSpec.describe User do
 | 
			
		|||
      user.save(validate: false)
 | 
			
		||||
      expect(user.valid?).to be true
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
    it 'cleans out invalid locale' do
 | 
			
		||||
      user = Fabricate.build(:user, locale: 'toto')
 | 
			
		||||
      expect(user.valid?).to be true
 | 
			
		||||
      expect(user.locale).to be_nil
 | 
			
		||||
  describe 'Normalizations' do
 | 
			
		||||
    describe 'locale' do
 | 
			
		||||
      it 'preserves valid locale' do
 | 
			
		||||
        user = Fabricate.build(:user, locale: 'en')
 | 
			
		||||
 | 
			
		||||
        expect(user.locale).to eq('en')
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      it 'cleans out invalid locale' do
 | 
			
		||||
        user = Fabricate.build(:user, locale: 'toto')
 | 
			
		||||
 | 
			
		||||
        expect(user.locale).to be_nil
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    it 'cleans out invalid timezone' do
 | 
			
		||||
      user = Fabricate.build(:user, time_zone: 'toto')
 | 
			
		||||
      expect(user.valid?).to be true
 | 
			
		||||
      expect(user.time_zone).to be_nil
 | 
			
		||||
    describe 'time_zone' do
 | 
			
		||||
      it 'preserves valid timezone' do
 | 
			
		||||
        user = Fabricate.build(:user, time_zone: 'UTC')
 | 
			
		||||
 | 
			
		||||
        expect(user.time_zone).to eq('UTC')
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      it 'cleans out invalid timezone' do
 | 
			
		||||
        user = Fabricate.build(:user, time_zone: 'toto')
 | 
			
		||||
 | 
			
		||||
        expect(user.time_zone).to be_nil
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    it 'cleans out empty string from languages' do
 | 
			
		||||
      user = Fabricate.build(:user, chosen_languages: [''])
 | 
			
		||||
      user.valid?
 | 
			
		||||
      expect(user.chosen_languages).to be_nil
 | 
			
		||||
    describe 'languages' do
 | 
			
		||||
      it 'preserves valid options for languages' do
 | 
			
		||||
        user = Fabricate.build(:user, chosen_languages: ['en', 'fr', ''])
 | 
			
		||||
 | 
			
		||||
        expect(user.chosen_languages).to eq(['en', 'fr'])
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      it 'cleans out empty string from languages' do
 | 
			
		||||
        user = Fabricate.build(:user, chosen_languages: [''])
 | 
			
		||||
 | 
			
		||||
        expect(user.chosen_languages).to be_nil
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  describe 'scopes' do
 | 
			
		||||
  describe 'scopes', :sidekiq_inline do
 | 
			
		||||
    describe 'recent' do
 | 
			
		||||
      it 'returns an array of recent users ordered by id' do
 | 
			
		||||
        first_user = Fabricate(:user)
 | 
			
		||||
| 
						 | 
				
			
			@ -452,7 +478,7 @@ RSpec.describe User do
 | 
			
		|||
        expect(user.confirmed_at).to be_present
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      it 'delivers mails' do
 | 
			
		||||
      it 'delivers mails', :sidekiq_inline do
 | 
			
		||||
        expect(ActionMailer::Base.deliveries.count).to eq 2
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -26,7 +26,6 @@ Dir[Rails.root.join('spec', 'support', '**', '*.rb')].each { |f| require f }
 | 
			
		|||
 | 
			
		||||
ActiveRecord::Migration.maintain_test_schema!
 | 
			
		||||
WebMock.disable_net_connect!(allow: Chewy.settings[:host], allow_localhost: RUN_SYSTEM_SPECS)
 | 
			
		||||
Sidekiq::Testing.inline!
 | 
			
		||||
Sidekiq.logger = nil
 | 
			
		||||
 | 
			
		||||
# System tests config
 | 
			
		||||
| 
						 | 
				
			
			@ -96,11 +95,8 @@ RSpec.configure do |config|
 | 
			
		|||
    self.use_transactional_tests = true
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  config.around(:each, :sidekiq_fake) do |example|
 | 
			
		||||
    Sidekiq::Testing.fake! do
 | 
			
		||||
      example.run
 | 
			
		||||
      Sidekiq::Worker.clear_all
 | 
			
		||||
    end
 | 
			
		||||
  config.around(:each, :sidekiq_inline) do |example|
 | 
			
		||||
    Sidekiq::Testing.inline!(&example)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  config.before :each, type: :cli do
 | 
			
		||||
| 
						 | 
				
			
			@ -112,8 +108,6 @@ RSpec.configure do |config|
 | 
			
		|||
  end
 | 
			
		||||
 | 
			
		||||
  config.around :each, type: :system do |example|
 | 
			
		||||
    driven_by :selenium, using: :headless_chrome, screen_size: [1600, 1200]
 | 
			
		||||
 | 
			
		||||
    # The streaming server needs access to the database
 | 
			
		||||
    # but with use_transactional_tests every transaction
 | 
			
		||||
    # is rolled-back, so the streaming server never sees the data
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -147,7 +147,7 @@ RSpec.describe 'FeaturedTags' do
 | 
			
		|||
      expect(body).to be_empty
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    it 'deletes the featured tag' do
 | 
			
		||||
    it 'deletes the featured tag', :sidekiq_inline do
 | 
			
		||||
      delete "/api/v1/featured_tags/#{id}", headers: headers
 | 
			
		||||
 | 
			
		||||
      featured_tag = FeaturedTag.find_by(id: id)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -8,7 +8,7 @@ RSpec.describe 'Notifications' do
 | 
			
		|||
  let(:scopes)  { 'read:notifications write:notifications' }
 | 
			
		||||
  let(:headers) { { 'Authorization' => "Bearer #{token.token}" } }
 | 
			
		||||
 | 
			
		||||
  describe 'GET /api/v1/notifications' do
 | 
			
		||||
  describe 'GET /api/v1/notifications', :sidekiq_inline do
 | 
			
		||||
    subject do
 | 
			
		||||
      get '/api/v1/notifications', headers: headers, params: params
 | 
			
		||||
    end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,7 +2,7 @@
 | 
			
		|||
 | 
			
		||||
require 'rails_helper'
 | 
			
		||||
 | 
			
		||||
RSpec.describe 'Favourites' do
 | 
			
		||||
RSpec.describe 'Favourites', :sidekiq_inline do
 | 
			
		||||
  let(:user)    { Fabricate(:user) }
 | 
			
		||||
  let(:scopes)  { 'write:favourites' }
 | 
			
		||||
  let(:token)   { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) }
 | 
			
		||||
| 
						 | 
				
			
			@ -70,7 +70,7 @@ RSpec.describe 'Favourites' do
 | 
			
		|||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  describe 'POST /api/v1/statuses/:status_id/unfavourite', :sidekiq_fake do
 | 
			
		||||
  describe 'POST /api/v1/statuses/:status_id/unfavourite' do
 | 
			
		||||
    subject do
 | 
			
		||||
      post "/api/v1/statuses/#{status.id}/unfavourite", headers: headers
 | 
			
		||||
    end
 | 
			
		||||
| 
						 | 
				
			
			@ -88,9 +88,7 @@ RSpec.describe 'Favourites' do
 | 
			
		|||
        subject
 | 
			
		||||
 | 
			
		||||
        expect(response).to have_http_status(200)
 | 
			
		||||
        expect(user.account.favourited?(status)).to be true
 | 
			
		||||
 | 
			
		||||
        UnfavouriteWorker.drain
 | 
			
		||||
        expect(user.account.favourited?(status)).to be false
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -113,9 +111,7 @@ RSpec.describe 'Favourites' do
 | 
			
		|||
        subject
 | 
			
		||||
 | 
			
		||||
        expect(response).to have_http_status(200)
 | 
			
		||||
        expect(user.account.favourited?(status)).to be true
 | 
			
		||||
 | 
			
		||||
        UnfavouriteWorker.drain
 | 
			
		||||
        expect(user.account.favourited?(status)).to be false
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,7 +2,7 @@
 | 
			
		|||
 | 
			
		||||
require 'rails_helper'
 | 
			
		||||
 | 
			
		||||
describe 'Home' do
 | 
			
		||||
describe 'Home', :sidekiq_inline do
 | 
			
		||||
  let(:user)    { Fabricate(:user) }
 | 
			
		||||
  let(:scopes)  { 'read:statuses' }
 | 
			
		||||
  let(:token)   { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,7 +2,7 @@
 | 
			
		|||
 | 
			
		||||
require 'rails_helper'
 | 
			
		||||
 | 
			
		||||
describe Account::StatusesSearch do
 | 
			
		||||
describe Account::StatusesSearch, :sidekiq_inline do
 | 
			
		||||
  describe 'a non-indexable account becoming indexable' do
 | 
			
		||||
    let(:account) { Account.find_by(username: 'search_test_account_1') }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -225,7 +225,7 @@ RSpec.describe ActivityPub::FetchRemoteStatusService, type: :service do
 | 
			
		|||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  context 'with statuses referencing other statuses' do
 | 
			
		||||
  context 'with statuses referencing other statuses', :sidekiq_inline do
 | 
			
		||||
    before do
 | 
			
		||||
      stub_const 'ActivityPub::FetchRemoteStatusService::DISCOVERIES_PER_REQUEST', 5
 | 
			
		||||
    end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -193,7 +193,7 @@ RSpec.describe ActivityPub::ProcessAccountService, type: :service do
 | 
			
		|||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    it 'creates accounts without exceeding rate limit' do
 | 
			
		||||
    it 'creates accounts without exceeding rate limit', :sidekiq_inline do
 | 
			
		||||
      expect { subject.call('user1', 'foo.test', payload) }
 | 
			
		||||
        .to create_some_remote_accounts
 | 
			
		||||
        .and create_fewer_than_rate_limit_accounts
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -41,7 +41,7 @@ RSpec.describe AuthorizeFollowService, type: :service do
 | 
			
		|||
      expect(bob.following?(sender)).to be true
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    it 'sends an accept activity' do
 | 
			
		||||
    it 'sends an accept activity', :sidekiq_inline do
 | 
			
		||||
      expect(a_request(:post, bob.inbox_url)).to have_been_made.once
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,7 +2,7 @@
 | 
			
		|||
 | 
			
		||||
require 'rails_helper'
 | 
			
		||||
 | 
			
		||||
RSpec.describe BatchedRemoveStatusService, type: :service do
 | 
			
		||||
RSpec.describe BatchedRemoveStatusService, :sidekiq_inline, type: :service do
 | 
			
		||||
  subject { described_class.new }
 | 
			
		||||
 | 
			
		||||
  let!(:alice)  { Fabricate(:account) }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -68,7 +68,7 @@ RSpec.describe BlockDomainService, type: :service do
 | 
			
		|||
      expect(already_banned_account.reload.silenced_at).to_not eq DomainBlock.find_by(domain: 'evil.org').created_at
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    it 'leaves the domains status and attachments, but clears media' do
 | 
			
		||||
    it 'leaves the domains status and attachments, but clears media', :sidekiq_inline do
 | 
			
		||||
      expect { bad_status_plain.reload }.to_not raise_error
 | 
			
		||||
      expect { bad_status_with_attachment.reload }.to_not raise_error
 | 
			
		||||
      expect { bad_attachment.reload }.to_not raise_error
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -31,7 +31,7 @@ RSpec.describe BlockService, type: :service do
 | 
			
		|||
      expect(sender.blocking?(bob)).to be true
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    it 'sends a block activity' do
 | 
			
		||||
    it 'sends a block activity', :sidekiq_inline do
 | 
			
		||||
      expect(a_request(:post, 'http://example.com/inbox')).to have_been_made.once
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -12,7 +12,7 @@ RSpec.describe BulkImportService do
 | 
			
		|||
    import.update(total_items: import.rows.count)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  describe '#call', :sidekiq_fake do
 | 
			
		||||
  describe '#call' do
 | 
			
		||||
    context 'when importing follows' do
 | 
			
		||||
      let(:import_type) { 'following' }
 | 
			
		||||
      let(:overwrite)   { false }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -62,7 +62,7 @@ RSpec.describe DeleteAccountService, type: :service do
 | 
			
		|||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  describe '#call on local account' do
 | 
			
		||||
  describe '#call on local account', :sidekiq_inline do
 | 
			
		||||
    before do
 | 
			
		||||
      stub_request(:post, remote_alice.inbox_url).to_return(status: 201)
 | 
			
		||||
      stub_request(:post, remote_bob.inbox_url).to_return(status: 201)
 | 
			
		||||
| 
						 | 
				
			
			@ -83,7 +83,7 @@ RSpec.describe DeleteAccountService, type: :service do
 | 
			
		|||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  describe '#call on remote account' do
 | 
			
		||||
  describe '#call on remote account', :sidekiq_inline do
 | 
			
		||||
    before do
 | 
			
		||||
      stub_request(:post, account.inbox_url).to_return(status: 201)
 | 
			
		||||
    end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -38,7 +38,7 @@ RSpec.describe FanOutOnWriteService, type: :service do
 | 
			
		|||
      expect(home_feed_of(alice)).to include status.id
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    it 'is added to the home feed of a follower' do
 | 
			
		||||
    it 'is added to the home feed of a follower', :sidekiq_inline do
 | 
			
		||||
      expect(home_feed_of(bob)).to include status.id
 | 
			
		||||
      expect(home_feed_of(tom)).to include status.id
 | 
			
		||||
    end
 | 
			
		||||
| 
						 | 
				
			
			@ -62,7 +62,7 @@ RSpec.describe FanOutOnWriteService, type: :service do
 | 
			
		|||
      expect(home_feed_of(alice)).to include status.id
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    it 'is added to the home feed of the mentioned follower' do
 | 
			
		||||
    it 'is added to the home feed of the mentioned follower', :sidekiq_inline do
 | 
			
		||||
      expect(home_feed_of(bob)).to include status.id
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -83,7 +83,7 @@ RSpec.describe FanOutOnWriteService, type: :service do
 | 
			
		|||
      expect(home_feed_of(alice)).to include status.id
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    it 'is added to the home feed of a follower' do
 | 
			
		||||
    it 'is added to the home feed of a follower', :sidekiq_inline do
 | 
			
		||||
      expect(home_feed_of(bob)).to include status.id
 | 
			
		||||
      expect(home_feed_of(tom)).to include status.id
 | 
			
		||||
    end
 | 
			
		||||
| 
						 | 
				
			
			@ -101,7 +101,7 @@ RSpec.describe FanOutOnWriteService, type: :service do
 | 
			
		|||
      expect(home_feed_of(alice)).to include status.id
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    it 'is added to the home feed of the mentioned follower' do
 | 
			
		||||
    it 'is added to the home feed of the mentioned follower', :sidekiq_inline do
 | 
			
		||||
      expect(home_feed_of(bob)).to include status.id
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -114,7 +114,7 @@ RSpec.describe FanOutOnWriteService, type: :service do
 | 
			
		|||
      expect(redis).to_not have_received(:publish).with('timeline:public', anything)
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    context 'when handling status updates', :sidekiq_fake do
 | 
			
		||||
    context 'when handling status updates' do
 | 
			
		||||
      before do
 | 
			
		||||
        subject.call(status)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -123,8 +123,6 @@ RSpec.describe FanOutOnWriteService, type: :service do
 | 
			
		|||
        status.snapshot!(account_id: status.account_id)
 | 
			
		||||
 | 
			
		||||
        redis.set("subscribed:timeline:#{eve.id}:notifications", '1')
 | 
			
		||||
 | 
			
		||||
        Sidekiq::Worker.clear_all
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      it 'pushes the update to mentioned users through the notifications streaming channel' do
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -33,7 +33,7 @@ RSpec.describe FavouriteService, type: :service do
 | 
			
		|||
      expect(status.favourites.first).to_not be_nil
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    it 'sends a like activity' do
 | 
			
		||||
    it 'sends a like activity', :sidekiq_inline do
 | 
			
		||||
      expect(a_request(:post, 'http://example.com/inbox')).to have_been_made.once
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -150,7 +150,7 @@ RSpec.describe FollowService, type: :service do
 | 
			
		|||
      expect(FollowRequest.find_by(account: sender, target_account: bob)).to_not be_nil
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    it 'sends a follow activity to the inbox' do
 | 
			
		||||
    it 'sends a follow activity to the inbox', :sidekiq_inline do
 | 
			
		||||
      expect(a_request(:post, 'http://example.com/inbox')).to have_been_made.once
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,7 +2,7 @@
 | 
			
		|||
 | 
			
		||||
require 'rails_helper'
 | 
			
		||||
 | 
			
		||||
RSpec.describe ImportService, type: :service do
 | 
			
		||||
RSpec.describe ImportService, :sidekiq_inline, type: :service do
 | 
			
		||||
  include RoutingHelper
 | 
			
		||||
 | 
			
		||||
  let!(:account) { Fabricate(:account, locked: false) }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -17,7 +17,7 @@ RSpec.describe MuteService, type: :service do
 | 
			
		|||
      redis.del(home_timeline_key)
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    it "clears account's statuses" do
 | 
			
		||||
    it "clears account's statuses", :sidekiq_inline do
 | 
			
		||||
      FeedManager.instance.push_to_home(account, status)
 | 
			
		||||
      FeedManager.instance.push_to_home(account, other_account_status)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -166,7 +166,7 @@ RSpec.describe NotifyService, type: :service do
 | 
			
		|||
    context 'when email notification is enabled' do
 | 
			
		||||
      let(:enabled) { true }
 | 
			
		||||
 | 
			
		||||
      it 'sends email' do
 | 
			
		||||
      it 'sends email', :sidekiq_inline do
 | 
			
		||||
        expect { subject }.to change(ActionMailer::Base.deliveries, :count).by(1)
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -87,7 +87,7 @@ RSpec.describe ReblogService, type: :service do
 | 
			
		|||
      expect(ActivityPub::DistributionWorker).to have_received(:perform_async)
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    it 'sends an announce activity to the author' do
 | 
			
		||||
    it 'sends an announce activity to the author', :sidekiq_inline do
 | 
			
		||||
      expect(a_request(:post, bob.inbox_url)).to have_been_made.once
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -41,7 +41,7 @@ RSpec.describe RejectFollowService, type: :service do
 | 
			
		|||
      expect(bob.following?(sender)).to be false
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    it 'sends a reject activity' do
 | 
			
		||||
    it 'sends a reject activity', :sidekiq_inline do
 | 
			
		||||
      expect(a_request(:post, bob.inbox_url)).to have_been_made.once
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -33,7 +33,7 @@ RSpec.describe RemoveFromFollowersService, type: :service do
 | 
			
		|||
      expect(bob.followed_by?(sender)).to be false
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    it 'sends a reject activity' do
 | 
			
		||||
    it 'sends a reject activity', :sidekiq_inline do
 | 
			
		||||
      expect(a_request(:post, sender.inbox_url)).to have_been_made.once
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,7 +2,7 @@
 | 
			
		|||
 | 
			
		||||
require 'rails_helper'
 | 
			
		||||
 | 
			
		||||
RSpec.describe RemoveStatusService, type: :service do
 | 
			
		||||
RSpec.describe RemoveStatusService, :sidekiq_inline, type: :service do
 | 
			
		||||
  subject { described_class.new }
 | 
			
		||||
 | 
			
		||||
  let!(:alice)  { Fabricate(:account) }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -23,7 +23,7 @@ RSpec.describe ReportService, type: :service do
 | 
			
		|||
      stub_request(:post, 'http://example.com/inbox').to_return(status: 200)
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    context 'when forward is true' do
 | 
			
		||||
    context 'when forward is true', :sidekiq_inline do
 | 
			
		||||
      let(:forward) { true }
 | 
			
		||||
 | 
			
		||||
      it 'sends ActivityPub payload when forward is true' do
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -195,7 +195,7 @@ RSpec.describe ResolveAccountService, type: :service do
 | 
			
		|||
      expect(account.uri).to eq 'https://ap.example.com/users/foo'
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    it 'merges accounts' do
 | 
			
		||||
    it 'merges accounts', :sidekiq_inline do
 | 
			
		||||
      account = subject.call('foo@ap.example.com')
 | 
			
		||||
 | 
			
		||||
      expect(status.reload.account_id).to eq account.id
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,7 +2,7 @@
 | 
			
		|||
 | 
			
		||||
require 'rails_helper'
 | 
			
		||||
 | 
			
		||||
RSpec.describe SuspendAccountService, type: :service do
 | 
			
		||||
RSpec.describe SuspendAccountService, :sidekiq_inline, type: :service do
 | 
			
		||||
  shared_examples 'common behavior' do
 | 
			
		||||
    subject { described_class.new.call(account) }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -12,7 +12,7 @@ RSpec.describe UnallowDomainService, type: :service do
 | 
			
		|||
  let!(:already_banned_account) { Fabricate(:account, username: 'badguy', domain: 'evil.org', suspended: true, silenced: true) }
 | 
			
		||||
  let!(:domain_allow) { Fabricate(:domain_allow, domain: 'evil.org') }
 | 
			
		||||
 | 
			
		||||
  context 'with limited federation mode' do
 | 
			
		||||
  context 'with limited federation mode', :sidekiq_inline do
 | 
			
		||||
    before do
 | 
			
		||||
      allow(Rails.configuration.x).to receive(:limited_federation_mode).and_return(true)
 | 
			
		||||
    end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -33,7 +33,7 @@ RSpec.describe UnblockService, type: :service do
 | 
			
		|||
      expect(sender.blocking?(bob)).to be false
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    it 'sends an unblock activity' do
 | 
			
		||||
    it 'sends an unblock activity', :sidekiq_inline do
 | 
			
		||||
      expect(a_request(:post, 'http://example.com/inbox')).to have_been_made.once
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -20,7 +20,7 @@ RSpec.describe UnfollowService, type: :service do
 | 
			
		|||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  describe 'remote ActivityPub' do
 | 
			
		||||
  describe 'remote ActivityPub', :sidekiq_inline do
 | 
			
		||||
    let(:bob) { Fabricate(:account, username: 'bob', protocol: :activitypub, domain: 'example.com', inbox_url: 'http://example.com/inbox') }
 | 
			
		||||
 | 
			
		||||
    before do
 | 
			
		||||
| 
						 | 
				
			
			@ -38,7 +38,7 @@ RSpec.describe UnfollowService, type: :service do
 | 
			
		|||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  describe 'remote ActivityPub (reverse)' do
 | 
			
		||||
  describe 'remote ActivityPub (reverse)', :sidekiq_inline do
 | 
			
		||||
    let(:bob) { Fabricate(:account, username: 'bob', protocol: :activitypub, domain: 'example.com', inbox_url: 'http://example.com/inbox') }
 | 
			
		||||
 | 
			
		||||
    before do
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -45,7 +45,7 @@ RSpec.describe UnsuspendAccountService, type: :service do
 | 
			
		|||
        remote_follower.follow!(account)
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      it 'merges back into feeds of local followers and sends update' do
 | 
			
		||||
      it 'merges back into feeds of local followers and sends update', :sidekiq_inline do
 | 
			
		||||
        subject
 | 
			
		||||
 | 
			
		||||
        expect_feeds_merged
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,7 +5,7 @@ require 'rails_helper'
 | 
			
		|||
RSpec.describe UpdateAccountService, type: :service do
 | 
			
		||||
  subject { described_class.new }
 | 
			
		||||
 | 
			
		||||
  describe 'switching form locked to unlocked accounts' do
 | 
			
		||||
  describe 'switching form locked to unlocked accounts', :sidekiq_inline do
 | 
			
		||||
    let(:account) { Fabricate(:account, locked: true) }
 | 
			
		||||
    let(:alice)   { Fabricate(:account) }
 | 
			
		||||
    let(:bob)     { Fabricate(:account) }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -111,7 +111,7 @@ RSpec.describe UpdateStatusService, type: :service do
 | 
			
		|||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  context 'when poll changes', :sidekiq_fake do
 | 
			
		||||
  context 'when poll changes' do
 | 
			
		||||
    let(:account) { Fabricate(:account) }
 | 
			
		||||
    let!(:status) { Fabricate(:status, text: 'Foo', account: account, poll_attributes: { options: %w(Foo Bar), account: account, multiple: false, hide_totals: false, expires_at: 7.days.from_now }) }
 | 
			
		||||
    let!(:poll)   { status.poll }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,31 @@
 | 
			
		|||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
Capybara.server_host = 'localhost'
 | 
			
		||||
Capybara.server_port = 3000
 | 
			
		||||
Capybara.app_host = "http://#{Capybara.server_host}:#{Capybara.server_port}"
 | 
			
		||||
 | 
			
		||||
require 'selenium/webdriver'
 | 
			
		||||
 | 
			
		||||
Capybara.register_driver :chrome do |app|
 | 
			
		||||
  Capybara::Selenium::Driver.new(app, browser: :chrome)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
Capybara.register_driver :headless_chrome do |app|
 | 
			
		||||
  options = Selenium::WebDriver::Chrome::Options.new
 | 
			
		||||
  options.add_argument '--headless=new'
 | 
			
		||||
  options.add_argument '--window-size=1680,1050'
 | 
			
		||||
 | 
			
		||||
  Capybara::Selenium::Driver.new(
 | 
			
		||||
    app,
 | 
			
		||||
    browser: :chrome,
 | 
			
		||||
    options: options
 | 
			
		||||
  )
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
Capybara.javascript_driver = :headless_chrome
 | 
			
		||||
 | 
			
		||||
RSpec.configure do |config|
 | 
			
		||||
  config.before(:each, type: :system) do
 | 
			
		||||
    driven_by Capybara.javascript_driver
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
| 
						 | 
				
			
			@ -2,7 +2,7 @@
 | 
			
		|||
 | 
			
		||||
require 'rails_helper'
 | 
			
		||||
 | 
			
		||||
describe 'NewStatuses' do
 | 
			
		||||
describe 'NewStatuses', :sidekiq_inline do
 | 
			
		||||
  include ProfileStories
 | 
			
		||||
 | 
			
		||||
  subject { page }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -14,7 +14,7 @@ describe BackupWorker do
 | 
			
		|||
    let(:backup) { Fabricate(:backup) }
 | 
			
		||||
    let!(:other_backup) { Fabricate(:backup, user: backup.user) }
 | 
			
		||||
 | 
			
		||||
    it 'sends the backup to the service and removes other backups' do
 | 
			
		||||
    it 'sends the backup to the service and removes other backups', :sidekiq_inline do
 | 
			
		||||
      expect do
 | 
			
		||||
        worker.perform(backup.id)
 | 
			
		||||
      end.to change(UserMailer.deliveries, :size).by(1)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -104,7 +104,7 @@ describe MoveWorker do
 | 
			
		|||
  end
 | 
			
		||||
 | 
			
		||||
  shared_examples 'lists handling' do
 | 
			
		||||
    it 'puts the new account on the list and makes valid lists', sidekiq: :inline do
 | 
			
		||||
    it 'puts the new account on the list and makes valid lists', :sidekiq_inline do
 | 
			
		||||
      subject.perform(source_account.id, target_account.id)
 | 
			
		||||
 | 
			
		||||
      expect(list.accounts.include?(target_account)).to be true
 | 
			
		||||
| 
						 | 
				
			
			@ -159,7 +159,7 @@ describe MoveWorker do
 | 
			
		|||
 | 
			
		||||
  describe '#perform' do
 | 
			
		||||
    context 'when both accounts are distant' do
 | 
			
		||||
      it 'calls UnfollowFollowWorker', :sidekiq_fake do
 | 
			
		||||
      it 'calls UnfollowFollowWorker' do
 | 
			
		||||
        subject.perform(source_account.id, target_account.id)
 | 
			
		||||
        expect(UnfollowFollowWorker).to have_enqueued_sidekiq_job(local_follower.id, source_account.id, target_account.id, false)
 | 
			
		||||
      end
 | 
			
		||||
| 
						 | 
				
			
			@ -170,7 +170,7 @@ describe MoveWorker do
 | 
			
		|||
    context 'when target account is local' do
 | 
			
		||||
      let(:target_account) { Fabricate(:account) }
 | 
			
		||||
 | 
			
		||||
      it 'calls UnfollowFollowWorker', :sidekiq_fake do
 | 
			
		||||
      it 'calls UnfollowFollowWorker' do
 | 
			
		||||
        subject.perform(source_account.id, target_account.id)
 | 
			
		||||
        expect(UnfollowFollowWorker).to have_enqueued_sidekiq_job(local_follower.id, source_account.id, target_account.id, true)
 | 
			
		||||
      end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -10,7 +10,7 @@ describe PollExpirationNotifyWorker do
 | 
			
		|||
  let(:remote?) { false }
 | 
			
		||||
  let(:poll_vote) { Fabricate(:poll_vote, poll: poll) }
 | 
			
		||||
 | 
			
		||||
  describe '#perform', :sidekiq_fake do
 | 
			
		||||
  describe '#perform' do
 | 
			
		||||
    it 'runs without error for missing record' do
 | 
			
		||||
      expect { worker.perform(nil) }.to_not raise_error
 | 
			
		||||
    end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue