Merge branch 'main' into glitch-soc/merge-upstream

Conflicts:
- `README.md`:
  Upstream added a link to the roadmap, but we have a completely different README.
  Kept ours.
- `app/models/media_attachment.rb`:
  Upstream upped media attachment limits.
  Updated the default according to upstream's.
- `db/migrate/20180831171112_create_bookmarks.rb`:
  Upstream changed the migration compatibility level.
  Did so too.
- `config/initializers/content_security_policy.rb`:
  Upstream refactored this file but we have a different version.
  Kept our version.
- `app/controllers/settings/preferences_controller.rb`:
  Upstream completely refactored user settings storage, and glitch-soc has a
  different set of settings.
  The file does not directly references individual settings anymore.
  Applied upstream changes.
- `app/lib/user_settings_decorator.rb`:
  Upstream completely refactored user settings storage, and glitch-soc has a
  different set of settings.
  The file got removed entirely.
  Removed it as well.
- `app/models/user.rb`:
  Upstream completely refactored user settings storage, and glitch-soc has a
  different set of settings.
  References to individual settings have been removed from the file.
  Removed them as well.
- `app/views/settings/preferences/appearance/show.html.haml`:
  Upstream completely refactored user settings storage, and glitch-soc has a
  different set of settings.
  Applied upstream's changes and ported ours back.
- `app/views/settings/preferences/notifications/show.html.haml`:
  Upstream completely refactored user settings storage, and glitch-soc has a
  different set of settings.
  Applied upstream's changes and ported ours back.
- `app/views/settings/preferences/other/show.html.haml`:
  Upstream completely refactored user settings storage, and glitch-soc has a
  different set of settings.
  Applied upstream's changes and ported ours back.
- `config/settings.yml`:
  Upstream completely refactored user settings storage, and glitch-soc has a
  different set of settings.
  In particular, upstream removed user-specific and unused settings.
  Did the same in glitch-soc.
- `spec/controllers/application_controller_spec.rb`:
  Conflicts due to glitch-soc's theming system.
  Mostly kept our version, as upstream messed up the tests.
This commit is contained in:
Claire
2023-03-31 21:30:27 +02:00
341 changed files with 4055 additions and 2756 deletions

View File

@ -0,0 +1,25 @@
# frozen_string_literal: true
require 'rails_helper'
RSpec.describe UserSettings::Namespace do
subject { described_class.new(name) }
let(:name) { :foo }
describe '#setting' do
before do
subject.setting :bar, default: 'baz'
end
it 'adds setting to definitions' do
expect(subject.definitions[:'foo.bar']).to have_attributes(name: :bar, namespace: :foo, default_value: 'baz')
end
end
describe '#definitions' do
it 'returns a hash' do
expect(subject.definitions).to be_a Hash
end
end
end

View File

@ -0,0 +1,106 @@
# frozen_string_literal: true
require 'rails_helper'
RSpec.describe UserSettings::Setting do
subject { described_class.new(name, options) }
let(:name) { :foo }
let(:options) { { default: default, namespace: namespace } }
let(:default) { false }
let(:namespace) { nil }
describe '#default_value' do
context 'when default value is a primitive value' do
it 'returns default value' do
expect(subject.default_value).to eq default
end
end
context 'when default value is a proc' do
let(:default) { -> { 'bar' } }
it 'returns value from proc' do
expect(subject.default_value).to eq 'bar'
end
end
end
describe '#type' do
it 'returns a type' do
expect(subject.type).to be_a ActiveModel::Type::Value
end
context 'when default value is a boolean' do
let(:default) { false }
it 'returns boolean' do
expect(subject.type).to be_a ActiveModel::Type::Boolean
end
end
context 'when default value is a string' do
let(:default) { '' }
it 'returns string' do
expect(subject.type).to be_a ActiveModel::Type::String
end
end
context 'when default value is a lambda returning a boolean' do
let(:default) { -> { false } }
it 'returns boolean' do
expect(subject.type).to be_a ActiveModel::Type::Boolean
end
end
context 'when default value is a lambda returning a string' do
let(:default) { -> { '' } }
it 'returns boolean' do
expect(subject.type).to be_a ActiveModel::Type::String
end
end
end
describe '#type_cast' do
context 'when default value is a boolean' do
let(:default) { false }
it 'returns boolean' do
expect(subject.type_cast('1')).to be true
end
end
context 'when default value is a string' do
let(:default) { '' }
it 'returns string' do
expect(subject.type_cast(1)).to eq '1'
end
end
end
describe '#to_a' do
it 'returns an array' do
expect(subject.to_a).to eq [name, default]
end
end
describe '#key' do
context 'when there is no namespace' do
it 'returnsn a symbol' do
expect(subject.key).to eq :foo
end
end
context 'when there is a namespace' do
let(:namespace) { :bar }
it 'returns a symbol' do
expect(subject.key).to eq :'bar.foo'
end
end
end
end

View File

@ -0,0 +1,110 @@
# frozen_string_literal: true
require 'rails_helper'
RSpec.describe UserSettings do
subject { described_class.new(json) }
let(:json) { {} }
describe '#[]' do
context 'when setting is not set' do
it 'returns default value' do
expect(subject[:always_send_emails]).to be false
end
end
context 'when setting is set' do
let(:json) { { default_language: 'fr' } }
it 'returns value' do
expect(subject[:default_language]).to eq 'fr'
end
end
context 'when setting was not defined' do
it 'raises error' do
expect { subject[:foo] }.to raise_error UserSettings::KeyError
end
end
end
describe '#[]=' do
context 'when value matches type' do
before do
subject[:always_send_emails] = true
end
it 'updates value' do
expect(subject[:always_send_emails]).to be true
end
end
context 'when value needs to be type-cast' do
before do
subject[:always_send_emails] = '1'
end
it 'updates value with a type-cast' do
expect(subject[:always_send_emails]).to be true
end
end
end
describe '#update' do
before do
subject.update(always_send_emails: true, default_language: 'fr', default_privacy: nil)
end
it 'updates values' do
expect(subject[:always_send_emails]).to be true
expect(subject[:default_language]).to eq 'fr'
end
it 'does not set values that are nil' do
expect(subject.as_json).to_not include(default_privacy: nil)
end
end
describe '#as_json' do
let(:json) { { default_language: 'fr' } }
it 'returns hash' do
expect(subject.as_json).to eq json
end
end
describe '.keys' do
it 'returns an array' do
expect(described_class.keys).to be_a Array
end
end
describe '.definition_for' do
context 'when key is defined' do
it 'returns a setting' do
expect(described_class.definition_for(:always_send_emails)).to be_a UserSettings::Setting
end
end
context 'when key is not defined' do
it 'returns nil' do
expect(described_class.definition_for(:foo)).to be_nil
end
end
end
describe '.definition_for?' do
context 'when key is defined' do
it 'returns true' do
expect(described_class.definition_for?(:always_send_emails)).to be true
end
end
context 'when key is not defined' do
it 'returns false' do
expect(described_class.definition_for?(:foo)).to be false
end
end
end
end

View File

@ -313,9 +313,9 @@ RSpec.describe User, type: :model do
end
describe 'settings' do
it 'is instance of Settings::ScopedSettings' do
it 'is instance of UserSettings' do
user = Fabricate(:user)
expect(user.settings).to be_a Settings::ScopedSettings
expect(user.settings).to be_a UserSettings
end
end
@ -379,16 +379,6 @@ RSpec.describe User, type: :model do
end
end
it_behaves_like 'Settings-extended' do
def create!
User.create!(account: Fabricate(:account, user: nil), email: 'foo@mastodon.space', password: 'abcd1234', agreement: true)
end
def fabricate
Fabricate(:user)
end
end
describe 'token_for_app' do
let(:user) { Fabricate(:user) }
let(:app) { Fabricate(:application, owner: user) }