forked from mastodon/mastodon
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Clean up settings/preferences controller (mastodon#2237)
* Add missing fields group on preferences page * Clean up settings/preferences controller * Extract a UserSettingsDecorator
- Loading branch information
1 parent
972f6bc
commit 2dda356
Showing
5 changed files
with
159 additions
and
28 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
# frozen_string_literal: true | ||
|
||
class UserSettingsDecorator | ||
attr_reader :user, :settings | ||
|
||
def initialize(user) | ||
@user = user | ||
end | ||
|
||
def update(settings) | ||
@settings = settings | ||
process_update | ||
end | ||
|
||
private | ||
|
||
def process_update | ||
user.settings['notification_emails'] = merged_notification_emails | ||
user.settings['interactions'] = merged_interactions | ||
user.settings['default_privacy'] = default_privacy_preference | ||
user.settings['boost_modal'] = boost_modal_preference | ||
user.settings['auto_play_gif'] = auto_play_gif_preference | ||
end | ||
|
||
def merged_notification_emails | ||
user.settings['notification_emails'].merge coerced_settings('notification_emails').to_h | ||
end | ||
|
||
def merged_interactions | ||
user.settings['interactions'].merge coerced_settings('interactions').to_h | ||
end | ||
|
||
def default_privacy_preference | ||
settings['setting_default_privacy'] | ||
end | ||
|
||
def boost_modal_preference | ||
boolean_cast_setting 'setting_boost_modal' | ||
end | ||
|
||
def auto_play_gif_preference | ||
boolean_cast_setting 'setting_auto_play_gif' | ||
end | ||
|
||
def boolean_cast_setting(key) | ||
settings[key] == '1' | ||
end | ||
|
||
def coerced_settings(key) | ||
coerce_values settings.fetch(key, {}) | ||
end | ||
|
||
def coerce_values(params_hash) | ||
params_hash.transform_values { |x| x == '1' } | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,16 +1,45 @@ | ||
require 'rails_helper' | ||
|
||
RSpec.describe Settings::PreferencesController, type: :controller do | ||
|
||
describe Settings::PreferencesController do | ||
let(:user) { Fabricate(:user) } | ||
before do | ||
sign_in Fabricate(:user), scope: :user | ||
sign_in user, scope: :user | ||
end | ||
|
||
describe "GET #show" do | ||
it "returns http success" do | ||
describe 'GET #show' do | ||
it 'returns http success' do | ||
get :show | ||
|
||
expect(response).to have_http_status(:success) | ||
end | ||
end | ||
|
||
describe 'PUT #update' do | ||
it 'udpates the user record' do | ||
put :update, params: { user: { locale: 'en' } } | ||
|
||
expect(response).to redirect_to(settings_preferences_path) | ||
expect(user.reload.locale).to eq 'en' | ||
end | ||
|
||
it 'updates user settings' do | ||
user.settings['boost_modal'] = false | ||
user.settings['notification_emails']['follow'] = false | ||
user.settings['interactions']['must_be_follower'] = true | ||
|
||
put :update, params: { | ||
user: { | ||
setting_boost_modal: '1', | ||
notification_emails: { follow: '1' }, | ||
interactions: { must_be_follower: '0' } | ||
} | ||
} | ||
|
||
expect(response).to redirect_to(settings_preferences_path) | ||
user.reload | ||
expect(user.settings['boost_modal']).to be true | ||
expect(user.settings['notification_emails']['follow']).to be true | ||
expect(user.settings['interactions']['must_be_follower']).to be false | ||
end | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,45 @@ | ||
# frozen_string_literal: true | ||
|
||
require 'rails_helper' | ||
|
||
describe UserSettingsDecorator do | ||
describe 'update' do | ||
let(:user) { Fabricate(:user) } | ||
let(:settings) { described_class.new(user) } | ||
|
||
it 'updates the user settings value for email notifications' do | ||
values = { 'notification_emails' => { 'follow' => '1' } } | ||
|
||
settings.update(values) | ||
expect(user.settings['notification_emails']['follow']).to eq true | ||
end | ||
|
||
it 'updates the user settings value for interactions' do | ||
values = { 'interactions' => { 'must_be_follower' => '0' } } | ||
|
||
settings.update(values) | ||
expect(user.settings['interactions']['must_be_follower']).to eq false | ||
end | ||
|
||
it 'updates the user settings value for privacy' do | ||
values = { 'setting_default_privacy' => 'public' } | ||
|
||
settings.update(values) | ||
expect(user.settings['default_privacy']).to eq 'public' | ||
end | ||
|
||
it 'updates the user settings value for boost modal' do | ||
values = { 'setting_boost_modal' => '1' } | ||
|
||
settings.update(values) | ||
expect(user.settings['boost_modal']).to eq true | ||
end | ||
|
||
it 'updates the user settings value for gif auto play' do | ||
values = { 'setting_auto_play_gif' => '0' } | ||
|
||
settings.update(values) | ||
expect(user.settings['auto_play_gif']).to eq false | ||
end | ||
end | ||
end |