]> cat aescling's git repositories - mastodon.git/commitdiff
Improve allowed language handling (#2897)
authorMatt Jankowski <mjankowski@thoughtbot.com>
Mon, 8 May 2017 01:32:52 +0000 (21:32 -0400)
committerEugen Rochko <eugen@zeonfederated.com>
Mon, 8 May 2017 01:32:52 +0000 (03:32 +0200)
* Dont allow empty value in user allowed languages

* Sanitize language input to reject blank values in array

app/models/user.rb
spec/controllers/settings/preferences_controller_spec.rb
spec/models/status_spec.rb
spec/models/user_spec.rb

index f8e8a2efa24a97397857422f0df38c7ff85bb502..dfecb2339f3f7b7b2e649ac0977d1e149b28ea1b 100644 (file)
@@ -52,6 +52,8 @@ class User < ApplicationRecord
   scope :admins,    -> { where(admin: true) }
   scope :confirmed, -> { where.not(confirmed_at: nil) }
 
+  before_validation :sanitize_languages
+
   def confirmed?
     confirmed_at.present?
   end
@@ -77,4 +79,10 @@ class User < ApplicationRecord
   def setting_auto_play_gif
     settings.auto_play_gif
   end
+
+  private
+
+  def sanitize_languages
+    allowed_languages.reject!(&:blank?)
+  end
 end
index 432e35cd4516621ddf1e03b49f738e84326ce3ee..6805a2ce0c6afd0a458b2d88ef721f75dd675c10 100644 (file)
@@ -18,7 +18,7 @@ describe Settings::PreferencesController do
 
   describe 'PUT #update' do
     it 'updates the user record' do
-      put :update, params: { user: { locale: 'en', allowed_languages: ['es', 'fr'] } }
+      put :update, params: { user: { locale: 'en', allowed_languages: ['es', 'fr', ''] } }
 
       expect(response).to redirect_to(settings_preferences_path)
       user.reload
index 0c0b16829c37c0b7248114a7e883335116eebb00..721951030ed4af675cdb8aa3b1721a09af4edbe3 100644 (file)
@@ -265,6 +265,18 @@ RSpec.describe Status, type: :model do
           expect(results).not_to include(fr_status)
         end
 
+        it 'includes all languages when user does not have a setting' do
+          user = Fabricate(:user, allowed_languages: [])
+          @account.update(user: user)
+
+          en_status = Fabricate(:status, language: 'en')
+          es_status = Fabricate(:status, language: 'es')
+
+          results = Status.as_public_timeline(@account)
+          expect(results).to include(en_status)
+          expect(results).to include(es_status)
+        end
+
         it 'includes all languages when account does not have a user' do
           expect(@account.user).to be_nil
           en_status = Fabricate(:status, language: 'en')
index fffd92e3d8a06ee0e07418b78e507136f80c2d30..04c39de3b288b3115b0485eda4eea0ab71e8db91 100644 (file)
@@ -22,6 +22,12 @@ RSpec.describe User, type: :model do
       user.valid?
       expect(user).to model_have_error_on_field(:email)
     end
+
+    it 'cleans out empty string from languages' do
+      user = Fabricate.build(:user, allowed_languages: [''])
+      user.valid?
+      expect(user.allowed_languages).to eq []
+    end
   end
 
   describe 'settings' do