~cytrogen/masto-fe

42a0898f1676156d90629e3d189fe0e04bc47fe9 — Claire 2 years ago 34efd1a + 3a2a15c
Merge commit '3a2a15c6ea4d4603469861ed9be09da12a122e45' into glitch-soc/merge-upstream

Conflicts:
- `app/views/settings/preferences/appearance/show.html.haml`:
  Conflict because glitch-soc does not have a theme selector here.
66 files changed, 99 insertions(+), 78 deletions(-)

M app/controllers/api/v1/accounts_controller.rb
M app/controllers/settings/preferences/base_controller.rb
M app/models/account.rb
M app/models/user.rb
M app/services/app_sign_up_service.rb
M app/views/notification_mailer/_status.html.haml
M app/views/notification_mailer/favourite.html.haml
M app/views/notification_mailer/mention.html.haml
M app/views/notification_mailer/reblog.html.haml
M app/views/settings/preferences/appearance/show.html.haml
M app/views/user_mailer/appeal_approved.html.haml
M app/views/user_mailer/appeal_approved.text.erb
M app/views/user_mailer/appeal_rejected.html.haml
M app/views/user_mailer/appeal_rejected.text.erb
M app/views/user_mailer/suspicious_sign_in.html.haml
M app/views/user_mailer/suspicious_sign_in.text.erb
M app/views/user_mailer/warning.html.haml
M config/locales/simple_form.en.yml
A db/migrate/20230605085711_add_time_zone_to_users.rb
M db/schema.rb
M spec/fabricators/account_domain_block_fabricator.rb
M spec/fabricators/account_moderation_note_fabricator.rb
M spec/fabricators/account_note_fabricator.rb
M spec/fabricators/account_stat_fabricator.rb
M spec/fabricators/account_statuses_cleanup_policy_fabricator.rb
M spec/fabricators/account_warning_fabricator.rb
M spec/fabricators/admin_action_log_fabricator.rb
M spec/fabricators/backup_fabricator.rb
M spec/fabricators/block_fabricator.rb
M spec/fabricators/bookmark_fabricator.rb
M spec/fabricators/bulk_import_fabricator.rb
M spec/fabricators/bulk_import_row_fabricator.rb
M spec/fabricators/canonical_email_block_fabricator.rb
M spec/fabricators/custom_filter_fabricator.rb
M spec/fabricators/custom_filter_keyword_fabricator.rb
M spec/fabricators/custom_filter_status_fabricator.rb
M spec/fabricators/device_fabricator.rb
M spec/fabricators/encrypted_message_fabricator.rb
M spec/fabricators/favourite_fabricator.rb
M spec/fabricators/featured_tag_fabricator.rb
M spec/fabricators/follow_fabricator.rb
M spec/fabricators/follow_request_fabricator.rb
M spec/fabricators/identity_fabricator.rb
M spec/fabricators/invite_fabricator.rb
M spec/fabricators/list_fabricator.rb
M spec/fabricators/login_activity_fabricator.rb
M spec/fabricators/marker_fabricator.rb
M spec/fabricators/media_attachment_fabricator.rb
M spec/fabricators/mention_fabricator.rb
M spec/fabricators/mute_fabricator.rb
M spec/fabricators/notification_fabricator.rb
M spec/fabricators/one_time_key_fabricator.rb
M spec/fabricators/poll_fabricator.rb
M spec/fabricators/poll_vote_fabricator.rb
M spec/fabricators/report_fabricator.rb
M spec/fabricators/report_note_fabricator.rb
M spec/fabricators/scheduled_status_fabricator.rb
M spec/fabricators/session_activation_fabricator.rb
M spec/fabricators/status_fabricator.rb
M spec/fabricators/status_pin_fabricator.rb
M spec/fabricators/tag_follow_fabricator.rb
M spec/models/media_attachment_spec.rb
M spec/rails_helper.rb
M spec/support/examples/models/concerns/account_avatar.rb
M spec/support/examples/models/concerns/account_header.rb
M streaming/index.js
M app/controllers/api/v1/accounts_controller.rb => app/controllers/api/v1/accounts_controller.rb +1 -1
@@ 90,7 90,7 @@ class Api::V1::AccountsController < Api::BaseController
  end

  def account_params
    params.permit(:username, :email, :password, :agreement, :locale, :reason)
    params.permit(:username, :email, :password, :agreement, :locale, :reason, :time_zone)
  end

  def check_enabled_registrations

M app/controllers/settings/preferences/base_controller.rb => app/controllers/settings/preferences/base_controller.rb +1 -1
@@ 19,6 19,6 @@ class Settings::Preferences::BaseController < Settings::BaseController
  end

  def user_params
    params.require(:user).permit(:locale, chosen_languages: [], settings_attributes: UserSettings.keys)
    params.require(:user).permit(:locale, :time_zone, chosen_languages: [], settings_attributes: UserSettings.keys)
  end
end

M app/models/account.rb => app/models/account.rb +1 -0
@@ 144,6 144,7 @@ class Account < ApplicationRecord
           :locale,
           :shows_application?,
           :prefers_noindex?,
           :time_zone,
           to: :user,
           prefix: true,
           allow_nil: true

M app/models/user.rb => app/models/user.rb +2 -0
@@ 40,6 40,7 @@
#  sign_up_ip                :inet
#  role_id                   :bigint(8)
#  settings                  :text
#  time_zone                 :string
#

class User < ApplicationRecord


@@ 99,6 100,7 @@ class User < ApplicationRecord
  validates_with BlacklistedEmailValidator, if: -> { ENV['EMAIL_DOMAIN_LISTS_APPLY_AFTER_CONFIRMATION'] == 'true' || !confirmed? }
  validates_with EmailMxValidator, if: :validate_email_dns?
  validates :agreement, acceptance: { allow_nil: false, accept: [true, 'true', '1'] }, on: :create
  validates :time_zone, inclusion: { in: ActiveSupport::TimeZone.all.map { |tz| tz.tzinfo.name } }, allow_blank: true

  # Honeypot/anti-spam fields
  attr_accessor :registration_form_time, :website, :confirm_password

M app/services/app_sign_up_service.rb => app/services/app_sign_up_service.rb +1 -1
@@ 35,7 35,7 @@ class AppSignUpService < BaseService
  end

  def user_params
    @params.slice(:email, :password, :agreement, :locale)
    @params.slice(:email, :password, :agreement, :locale, :time_zone)
  end

  def account_params

M app/views/notification_mailer/_status.html.haml => app/views/notification_mailer/_status.html.haml +1 -1
@@ 42,4 42,4 @@
                                        = link_to a.remote_url, a.remote_url

                              %p.status-footer
                                = link_to l(status.created_at), web_url("@#{status.account.pretty_acct}/#{status.id}")
                                = link_to l(status.created_at.in_time_zone(time_zone)), web_url("@#{status.account.pretty_acct}/#{status.id}")

M app/views/notification_mailer/favourite.html.haml => app/views/notification_mailer/favourite.html.haml +1 -1
@@ 22,7 22,7 @@
                              %h1= t 'notification_mailer.favourite.title'
                              %p.lead= t('notification_mailer.favourite.body', name: @account.pretty_acct)

= render 'status', status: @status
= render 'status', status: @status, time_zone: @me.user_time_zone

%table.email-table{ cellspacing: 0, cellpadding: 0 }
  %tbody

M app/views/notification_mailer/mention.html.haml => app/views/notification_mailer/mention.html.haml +1 -1
@@ 22,7 22,7 @@
                              %h1= t 'notification_mailer.mention.title'
                              %p.lead= t('notification_mailer.mention.body', name: @status.account.pretty_acct)

= render 'status', status: @status
= render 'status', status: @status, time_zone: @me.user_time_zone

%table.email-table{ cellspacing: 0, cellpadding: 0 }
  %tbody

M app/views/notification_mailer/reblog.html.haml => app/views/notification_mailer/reblog.html.haml +1 -1
@@ 22,7 22,7 @@
                              %h1= t 'notification_mailer.reblog.title'
                              %p.lead= t('notification_mailer.reblog.body', name: @account.pretty_acct)

= render 'status', status: @status
= render 'status', status: @status, time_zone: @me.user_time_zone

%table.email-table{ cellspacing: 0, cellpadding: 0 }
  %tbody

M app/views/settings/preferences/appearance/show.html.haml => app/views/settings/preferences/appearance/show.html.haml +4 -1
@@ 6,9 6,12 @@

= simple_form_for current_user, url: settings_preferences_appearance_path, html: { method: :put, id: 'edit_user' } do |f|
  .fields-row
    .fields-group
    .fields-group.fields-row__column.fields-row__column-6
      = f.input :locale, collection: I18n.available_locales, wrapper: :with_label, include_blank: false, label_method: lambda { |locale| native_locale_name(locale) }, selected: I18n.locale, hint: false

    .fields-group.fields-row__column.fields-row__column-6
      = f.input :time_zone, wrapper: :with_label, collection: ActiveSupport::TimeZone.all.map { |tz| ["(GMT#{tz.formatted_offset}) #{tz.name}", tz.tzinfo.name] }, hint: false

  - unless I18n.locale == :en
    .flash-message.translation-prompt
      #{t 'appearance.localization.body'} #{content_tag(:a, t('appearance.localization.guide_link_text'), href: t('appearance.localization.guide_link'), target: '_blank', rel: 'noopener')}

M app/views/user_mailer/appeal_approved.html.haml => app/views/user_mailer/appeal_approved.html.haml +1 -1
@@ 36,7 36,7 @@
                        %tbody
                          %tr
                            %td.column-cell.text-center
                              %p= t 'user_mailer.appeal_approved.explanation', appeal_date: l(@appeal.created_at), strike_date: l(@appeal.strike.created_at)
                              %p= t 'user_mailer.appeal_approved.explanation', appeal_date: l(@appeal.created_at.in_time_zone(@resource.time_zone)), strike_date: l(@appeal.strike.created_at.in_time_zone(@resource.time_zone))

%table.email-table{ cellspacing: 0, cellpadding: 0 }
  %tbody

M app/views/user_mailer/appeal_approved.text.erb => app/views/user_mailer/appeal_approved.text.erb +1 -1
@@ 2,6 2,6 @@

===

<%= t 'user_mailer.appeal_approved.explanation', appeal_date: l(@appeal.created_at), strike_date: l(@appeal.strike.created_at) %>
<%= t 'user_mailer.appeal_approved.explanation', appeal_date: l(@appeal.created_at.in_time_zone(@resource.time_zone)), strike_date: l(@appeal.strike.created_at.in_time_zone(@resource.time_zone)) %>

=> <%= root_url %>

M app/views/user_mailer/appeal_rejected.html.haml => app/views/user_mailer/appeal_rejected.html.haml +1 -1
@@ 36,7 36,7 @@
                        %tbody
                          %tr
                            %td.column-cell.text-center
                              %p= t 'user_mailer.appeal_rejected.explanation', appeal_date: l(@appeal.created_at), strike_date: l(@appeal.strike.created_at)
                              %p= t 'user_mailer.appeal_rejected.explanation', appeal_date: l(@appeal.created_at.in_time_zone(@resource.time_zone)), strike_date: l(@appeal.strike.created_at.in_time_zone(@resource.time_zone))

%table.email-table{ cellspacing: 0, cellpadding: 0 }
  %tbody

M app/views/user_mailer/appeal_rejected.text.erb => app/views/user_mailer/appeal_rejected.text.erb +1 -1
@@ 2,6 2,6 @@

===

<%= t 'user_mailer.appeal_rejected.explanation', appeal_date: l(@appeal.created_at), strike_date: l(@appeal.strike.created_at) %>
<%= t 'user_mailer.appeal_rejected.explanation', appeal_date: l(@appeal.created_at.in_time_zone(@resource.time_zone)), strike_date: l(@appeal.strike.created_at.in_time_zone(@resource.time_zone)) %>

=> <%= root_url %>

M app/views/user_mailer/suspicious_sign_in.html.haml => app/views/user_mailer/suspicious_sign_in.html.haml +1 -1
@@ 47,7 47,7 @@
                                %strong= "#{t('sessions.browser')}:"
                                %span{ title: @user_agent }= t 'sessions.description', browser: t("sessions.browsers.#{@detection.id}", default: @detection.id.to_s), platform: t("sessions.platforms.#{@detection.platform.id}", default: @detection.platform.id.to_s)
                                %br/
                                = l(@timestamp)
                                = l(@timestamp.in_time_zone(@resource.time_zone))

%table.email-table{ cellspacing: 0, cellpadding: 0 }
  %tbody

M app/views/user_mailer/suspicious_sign_in.text.erb => app/views/user_mailer/suspicious_sign_in.text.erb +1 -1
@@ 8,7 8,7 @@

<%= t('sessions.ip') %>: <%= @remote_ip %>
<%= t('sessions.browser') %>: <%= t('sessions.description', browser: t("sessions.browsers.#{@detection.id}", default: "#{@detection.id}"), platform: t("sessions.platforms.#{@detection.platform.id}", default: "#{@detection.platform.id}")) %>
<%= l(@timestamp) %>
<%= l(@timestamp.in_time_zone(@resource.time_zone)) %>

<%= t 'user_mailer.suspicious_sign_in.further_actions_html', action: t('user_mailer.suspicious_sign_in.change_password') %>


M app/views/user_mailer/warning.html.haml => app/views/user_mailer/warning.html.haml +1 -1
@@ 58,7 58,7 @@

- unless @statuses.empty?
  - @statuses.each_with_index do |status, i|
    = render 'notification_mailer/status', status: status, i: i + 1, highlighted: true
    = render 'notification_mailer/status', status: status, i: i + 1, highlighted: true, time_zone: @resource.time_zone

%table.email-table{ cellspacing: 0, cellpadding: 0 }
  %tbody

M config/locales/simple_form.en.yml => config/locales/simple_form.en.yml +1 -0
@@ 297,6 297,7 @@ en:
        usable: Allow posts to use this hashtag
      user:
        role: Role
        time_zone: Time zone
      user_role:
        color: Badge color
        highlighted: Display role as badge on user profiles

A db/migrate/20230605085711_add_time_zone_to_users.rb => db/migrate/20230605085711_add_time_zone_to_users.rb +7 -0
@@ 0,0 1,7 @@
# frozen_string_literal: true

class AddTimeZoneToUsers < ActiveRecord::Migration[6.1]
  def change
    add_column :users, :time_zone, :string
  end
end

M db/schema.rb => db/schema.rb +2 -1
@@ 10,7 10,7 @@
#
# It's strongly recommended that you check this file into your version control system.

ActiveRecord::Schema.define(version: 2023_06_05_085710) do
ActiveRecord::Schema.define(version: 2023_06_05_085711) do

  # These are extensions that must be enabled in order to support this database
  enable_extension "plpgsql"


@@ 1091,6 1091,7 @@ ActiveRecord::Schema.define(version: 2023_06_05_085710) do
    t.boolean "skip_sign_in_token"
    t.bigint "role_id"
    t.text "settings"
    t.string "time_zone"
    t.index ["account_id"], name: "index_users_on_account_id"
    t.index ["confirmation_token"], name: "index_users_on_confirmation_token", unique: true
    t.index ["created_by_application_id"], name: "index_users_on_created_by_application_id", where: "(created_by_application_id IS NOT NULL)"

M spec/fabricators/account_domain_block_fabricator.rb => spec/fabricators/account_domain_block_fabricator.rb +1 -1
@@ 1,6 1,6 @@
# frozen_string_literal: true

Fabricator(:account_domain_block) do
  account
  account { Fabricate.build(:account) }
  domain 'example.com'
end

M spec/fabricators/account_moderation_note_fabricator.rb => spec/fabricators/account_moderation_note_fabricator.rb +2 -2
@@ 2,6 2,6 @@

Fabricator(:account_moderation_note) do
  content 'MyText'
  account
  target_account { Fabricate(:account) }
  account { Fabricate.build(:account) }
  target_account { Fabricate.build(:account) }
end

M spec/fabricators/account_note_fabricator.rb => spec/fabricators/account_note_fabricator.rb +2 -2
@@ 1,7 1,7 @@
# frozen_string_literal: true

Fabricator(:account_note) do
  account
  target_account { Fabricate(:account) }
  account { Fabricate.build(:account) }
  target_account { Fabricate.build(:account) }
  comment        'User note text'
end

M spec/fabricators/account_stat_fabricator.rb => spec/fabricators/account_stat_fabricator.rb +1 -1
@@ 1,7 1,7 @@
# frozen_string_literal: true

Fabricator(:account_stat) do
  account
  account { Fabricate.build(:account) }
  statuses_count  '123'
  following_count '456'
  followers_count '789'

M spec/fabricators/account_statuses_cleanup_policy_fabricator.rb => spec/fabricators/account_statuses_cleanup_policy_fabricator.rb +1 -1
@@ 1,5 1,5 @@
# frozen_string_literal: true

Fabricator(:account_statuses_cleanup_policy) do
  account
  account { Fabricate.build(:account) }
end

M spec/fabricators/account_warning_fabricator.rb => spec/fabricators/account_warning_fabricator.rb +1 -1
@@ 1,7 1,7 @@
# frozen_string_literal: true

Fabricator(:account_warning) do
  account
  account { Fabricate.build(:account) }
  target_account(fabricator: :account)
  text { Faker::Lorem.paragraph }
  action 'suspend'

M spec/fabricators/admin_action_log_fabricator.rb => spec/fabricators/admin_action_log_fabricator.rb +1 -1
@@ 1,7 1,7 @@
# frozen_string_literal: true

Fabricator('Admin::ActionLog') do
  account
  account { Fabricate.build(:account) }
  action  'MyString'
  target  nil
end

M spec/fabricators/backup_fabricator.rb => spec/fabricators/backup_fabricator.rb +1 -1
@@ 1,5 1,5 @@
# frozen_string_literal: true

Fabricator(:backup) do
  user
  user { Fabricate.build(:user) }
end

M spec/fabricators/block_fabricator.rb => spec/fabricators/block_fabricator.rb +2 -2
@@ 1,6 1,6 @@
# frozen_string_literal: true

Fabricator(:block) do
  account
  target_account { Fabricate(:account) }
  account { Fabricate.build(:account) }
  target_account { Fabricate.build(:account) }
end

M spec/fabricators/bookmark_fabricator.rb => spec/fabricators/bookmark_fabricator.rb +2 -2
@@ 1,6 1,6 @@
# frozen_string_literal: true

Fabricator(:bookmark) do
  account
  status
  account { Fabricate.build(:account) }
  status { Fabricate.build(:status) }
end

M spec/fabricators/bulk_import_fabricator.rb => spec/fabricators/bulk_import_fabricator.rb +1 -1
@@ 8,5 8,5 @@ Fabricator(:bulk_import) do
  imported_items  1
  finished_at     '2022-11-18 14:55:07'
  overwrite       false
  account
  account { Fabricate.build(:account) }
end

M spec/fabricators/bulk_import_row_fabricator.rb => spec/fabricators/bulk_import_row_fabricator.rb +1 -1
@@ 1,6 1,6 @@
# frozen_string_literal: true

Fabricator(:bulk_import_row) do
  bulk_import
  bulk_import { Fabricate.build(:bulk_import) }
  data ''
end

M spec/fabricators/canonical_email_block_fabricator.rb => spec/fabricators/canonical_email_block_fabricator.rb +1 -1
@@ 2,5 2,5 @@

Fabricator(:canonical_email_block) do
  email { sequence(:email) { |i| "#{i}#{Faker::Internet.email}" } }
  reference_account { Fabricate(:account) }
  reference_account { Fabricate.build(:account) }
end

M spec/fabricators/custom_filter_fabricator.rb => spec/fabricators/custom_filter_fabricator.rb +1 -1
@@ 1,7 1,7 @@
# frozen_string_literal: true

Fabricator(:custom_filter) do
  account
  account { Fabricate.build(:account) }
  expires_at nil
  phrase     'discourse'
  context    %w(home notifications)

M spec/fabricators/custom_filter_keyword_fabricator.rb => spec/fabricators/custom_filter_keyword_fabricator.rb +1 -1
@@ 1,6 1,6 @@
# frozen_string_literal: true

Fabricator(:custom_filter_keyword) do
  custom_filter
  custom_filter { Fabricate.build(:custom_filter) }
  keyword 'discourse'
end

M spec/fabricators/custom_filter_status_fabricator.rb => spec/fabricators/custom_filter_status_fabricator.rb +2 -2
@@ 1,6 1,6 @@
# frozen_string_literal: true

Fabricator(:custom_filter_status) do
  custom_filter
  status
  custom_filter { Fabricate.build(:custom_filter) }
  status { Fabricate.build(:status) }
end

M spec/fabricators/device_fabricator.rb => spec/fabricators/device_fabricator.rb +2 -2
@@ 1,8 1,8 @@
# frozen_string_literal: true

Fabricator(:device) do
  access_token
  account
  access_token { Fabricate.build(:access_token) }
  account { Fabricate.build(:account) }
  device_id        { Faker::Number.number(digits: 5) }
  name             { Faker::App.name }
  fingerprint_key  { Base64.strict_encode64(Ed25519::SigningKey.generate.verify_key.to_bytes) }

M spec/fabricators/encrypted_message_fabricator.rb => spec/fabricators/encrypted_message_fabricator.rb +2 -2
@@ 1,7 1,7 @@
# frozen_string_literal: true

Fabricator(:encrypted_message) do
  device
  from_account { Fabricate(:account) }
  device { Fabricate.build(:device) }
  from_account { Fabricate.build(:account) }
  from_device_id { Faker::Number.number(digits: 5) }
end

M spec/fabricators/favourite_fabricator.rb => spec/fabricators/favourite_fabricator.rb +2 -2
@@ 1,6 1,6 @@
# frozen_string_literal: true

Fabricator(:favourite) do
  account
  status
  account { Fabricate.build(:account) }
  status { Fabricate.build(:status) }
end

M spec/fabricators/featured_tag_fabricator.rb => spec/fabricators/featured_tag_fabricator.rb +2 -2
@@ 1,7 1,7 @@
# frozen_string_literal: true

Fabricator(:featured_tag) do
  account
  tag
  account { Fabricate.build(:account) }
  tag { Fabricate.build(:tag) }
  name { sequence(:name) { |i| "Tag#{i}" } }
end

M spec/fabricators/follow_fabricator.rb => spec/fabricators/follow_fabricator.rb +2 -2
@@ 1,6 1,6 @@
# frozen_string_literal: true

Fabricator(:follow) do
  account
  target_account { Fabricate(:account) }
  account { Fabricate.build(:account) }
  target_account { Fabricate.build(:account) }
end

M spec/fabricators/follow_request_fabricator.rb => spec/fabricators/follow_request_fabricator.rb +2 -2
@@ 1,6 1,6 @@
# frozen_string_literal: true

Fabricator(:follow_request) do
  account
  target_account { Fabricate(:account, locked: true) }
  account { Fabricate.build(:account) }
  target_account { Fabricate.build(:account, locked: true) }
end

M spec/fabricators/identity_fabricator.rb => spec/fabricators/identity_fabricator.rb +1 -1
@@ 1,7 1,7 @@
# frozen_string_literal: true

Fabricator(:identity) do
  user
  user { Fabricate.build(:user) }
  provider 'MyString'
  uid      'MyString'
end

M spec/fabricators/invite_fabricator.rb => spec/fabricators/invite_fabricator.rb +1 -1
@@ 1,7 1,7 @@
# frozen_string_literal: true

Fabricator(:invite) do
  user
  user { Fabricate.build(:user) }
  expires_at nil
  max_uses   nil
  uses       0

M spec/fabricators/list_fabricator.rb => spec/fabricators/list_fabricator.rb +1 -1
@@ 1,6 1,6 @@
# frozen_string_literal: true

Fabricator(:list) do
  account
  account { Fabricate.build(:account) }
  title 'MyString'
end

M spec/fabricators/login_activity_fabricator.rb => spec/fabricators/login_activity_fabricator.rb +1 -1
@@ 1,7 1,7 @@
# frozen_string_literal: true

Fabricator(:login_activity) do
  user
  user { Fabricate.build(:user) }
  authentication_method 'password'
  success               true
  failure_reason        nil

M spec/fabricators/marker_fabricator.rb => spec/fabricators/marker_fabricator.rb +1 -1
@@ 1,7 1,7 @@
# frozen_string_literal: true

Fabricator(:marker) do
  user
  user { Fabricate.build(:user) }
  timeline     'home'
  last_read_id 0
  lock_version 0

M spec/fabricators/media_attachment_fabricator.rb => spec/fabricators/media_attachment_fabricator.rb +1 -1
@@ 1,7 1,7 @@
# frozen_string_literal: true

Fabricator(:media_attachment) do
  account
  account { Fabricate.build(:account) }

  file do |attrs|
    case attrs[:type]

M spec/fabricators/mention_fabricator.rb => spec/fabricators/mention_fabricator.rb +2 -2
@@ 1,6 1,6 @@
# frozen_string_literal: true

Fabricator(:mention) do
  account
  status
  account { Fabricate.build(:account) }
  status { Fabricate.build(:status) }
end

M spec/fabricators/mute_fabricator.rb => spec/fabricators/mute_fabricator.rb +2 -2
@@ 1,6 1,6 @@
# frozen_string_literal: true

Fabricator(:mute) do
  account
  target_account { Fabricate(:account) }
  account { Fabricate.build(:account) }
  target_account { Fabricate.build(:account) }
end

M spec/fabricators/notification_fabricator.rb => spec/fabricators/notification_fabricator.rb +1 -1
@@ 2,5 2,5 @@

Fabricator(:notification) do
  activity fabricator: :status
  account
  account { Fabricate.build(:account) }
end

M spec/fabricators/one_time_key_fabricator.rb => spec/fabricators/one_time_key_fabricator.rb +1 -1
@@ 1,7 1,7 @@
# frozen_string_literal: true

Fabricator(:one_time_key) do
  device
  device { Fabricate.build(:device) }
  key_id { Faker::Alphanumeric.alphanumeric(number: 10) }
  key { Base64.strict_encode64(Ed25519::SigningKey.generate.verify_key.to_bytes) }


M spec/fabricators/poll_fabricator.rb => spec/fabricators/poll_fabricator.rb +2 -2
@@ 1,8 1,8 @@
# frozen_string_literal: true

Fabricator(:poll) do
  account
  status
  account { Fabricate.build(:account) }
  status { Fabricate.build(:status) }
  expires_at  { 7.days.from_now }
  options     %w(Foo Bar)
  multiple    false

M spec/fabricators/poll_vote_fabricator.rb => spec/fabricators/poll_vote_fabricator.rb +1 -1
@@ 1,7 1,7 @@
# frozen_string_literal: true

Fabricator(:poll_vote) do
  account
  account { Fabricate.build(:account) }
  poll
  choice 0
end

M spec/fabricators/report_fabricator.rb => spec/fabricators/report_fabricator.rb +2 -2
@@ 1,8 1,8 @@
# frozen_string_literal: true

Fabricator(:report) do
  account
  target_account  { Fabricate(:account) }
  account { Fabricate.build(:account) }
  target_account  { Fabricate.build(:account) }
  comment         'You nasty'
  action_taken_at nil
end

M spec/fabricators/report_note_fabricator.rb => spec/fabricators/report_note_fabricator.rb +2 -2
@@ 1,7 1,7 @@
# frozen_string_literal: true

Fabricator(:report_note) do
  report
  account { Fabricate(:account) }
  report { Fabricate.build(:report) }
  account { Fabricate.build(:account) }
  content 'Test Content'
end

M spec/fabricators/scheduled_status_fabricator.rb => spec/fabricators/scheduled_status_fabricator.rb +1 -1
@@ 1,6 1,6 @@
# frozen_string_literal: true

Fabricator(:scheduled_status) do
  account
  account { Fabricate.build(:account) }
  scheduled_at { 20.hours.from_now }
end

M spec/fabricators/session_activation_fabricator.rb => spec/fabricators/session_activation_fabricator.rb +1 -1
@@ 1,6 1,6 @@
# frozen_string_literal: true

Fabricator(:session_activation) do
  user
  user { Fabricate.build(:user) }
  session_id 'MyString'
end

M spec/fabricators/status_fabricator.rb => spec/fabricators/status_fabricator.rb +1 -1
@@ 1,7 1,7 @@
# frozen_string_literal: true

Fabricator(:status) do
  account
  account { Fabricate.build(:account) }
  text 'Lorem ipsum dolor sit amet'

  after_build do |status|

M spec/fabricators/status_pin_fabricator.rb => spec/fabricators/status_pin_fabricator.rb +2 -2
@@ 1,6 1,6 @@
# frozen_string_literal: true

Fabricator(:status_pin) do
  account
  status { |attrs| Fabricate(:status, account: attrs[:account], visibility: :public) }
  account { Fabricate.build(:account) }
  status { |attrs| Fabricate.build(:status, account: attrs[:account], visibility: :public) }
end

M spec/fabricators/tag_follow_fabricator.rb => spec/fabricators/tag_follow_fabricator.rb +1 -1
@@ 2,5 2,5 @@

Fabricator(:tag_follow) do
  tag
  account
  account { Fabricate.build(:account) }
end

M spec/models/media_attachment_spec.rb => spec/models/media_attachment_spec.rb +1 -1
@@ 2,7 2,7 @@

require 'rails_helper'

RSpec.describe MediaAttachment do
RSpec.describe MediaAttachment, paperclip_processing: true do
  describe 'local?' do
    subject { media_attachment.local? }


M spec/rails_helper.rb => spec/rails_helper.rb +6 -0
@@ 94,6 94,12 @@ RSpec.configure do |config|
    stub_jsonld_contexts!
  end

  config.before(:each) do |example|
    unless example.metadata[:paperclip_processing]
      allow_any_instance_of(Paperclip::Attachment).to receive(:post_process).and_return(true) # rubocop:disable RSpec/AnyInstance
    end
  end

  config.after :each do
    Rails.cache.clear
    redis.del(redis.keys)

M spec/support/examples/models/concerns/account_avatar.rb => spec/support/examples/models/concerns/account_avatar.rb +1 -1
@@ 17,7 17,7 @@ shared_examples 'AccountAvatar' do |fabricator|
    end
  end

  describe 'base64-encoded files' do
  describe 'base64-encoded files', paperclip_processing: true do
    let(:base64_attachment) { "data:image/jpeg;base64,#{Base64.encode64(attachment_fixture('attachment.jpg').read)}" }
    let(:account) { Fabricate(fabricator, avatar: base64_attachment) }


M spec/support/examples/models/concerns/account_header.rb => spec/support/examples/models/concerns/account_header.rb +1 -1
@@ 1,7 1,7 @@
# frozen_string_literal: true

shared_examples 'AccountHeader' do |fabricator|
  describe 'base64-encoded files' do
  describe 'base64-encoded files', paperclip_processing: true do
    let(:base64_attachment) { "data:image/jpeg;base64,#{Base64.encode64(attachment_fixture('attachment.jpg').read)}" }
    let(:account) { Fabricate(fabricator, header: base64_attachment) }


M streaming/index.js => streaming/index.js +1 -1
@@ 1230,7 1230,7 @@ const startServer = async () => {

    ws.on('message', (data, isBinary) => {
      if (isBinary) {
        log.debug('Received binary data, closing connection');
        log.warn('socket', 'Received binary data, closing connection');
        ws.close(1003, 'The mastodon streaming server does not support binary messages');
        return;
      }