1 # frozen_string_literal: true
 
   6   class BasicPreferencesControllerTest < ActionDispatch::IntegrationTest
 
   8     # test all routes which lead to this controller
 
  11         { :path => "/preferences/basic", :method => :get },
 
  12         { :controller => "preferences/basic_preferences", :action => "show" }
 
  15         { :path => "/preferences/basic", :method => :put },
 
  16         { :controller => "preferences/basic_preferences", :action => "update" }
 
  20       assert_redirected_to "/preferences/basic"
 
  22       get "/preferences/edit"
 
  23       assert_redirected_to "/preferences/basic"
 
  26     def test_update_preferred_editor
 
  27       user = create(:user, :languages => [])
 
  28       user.preferences.create(:k => "site.color_scheme", :v => "light")
 
  29       user.preferences.create(:k => "map.color_scheme", :v => "light")
 
  32       # Changing to a invalid editor should fail
 
  33       put basic_preferences_path, :params => { :user => { :preferred_editor => "unknown" } }
 
  34       assert_response :success
 
  36       assert_select ".alert-success", false
 
  37       assert_select ".alert-danger", true
 
  39       assert_nil user.preferred_editor
 
  40       assert_equal "light", user.preferences.find_by(:k => "site.color_scheme")&.v
 
  41       assert_equal "light", user.preferences.find_by(:k => "map.color_scheme")&.v
 
  43       # Changing to a valid editor should work
 
  44       put basic_preferences_path, :params => { :user => { :preferred_editor => "id" } }
 
  45       assert_redirected_to basic_preferences_path
 
  48       assert_select ".alert-success", /^Preferences updated/
 
  50       assert_equal "id", user.preferred_editor
 
  51       assert_equal "light", user.preferences.find_by(:k => "site.color_scheme")&.v
 
  52       assert_equal "light", user.preferences.find_by(:k => "map.color_scheme")&.v
 
  54       # Changing to the default editor should work
 
  55       put basic_preferences_path, :params => { :user => { :preferred_editor => "default" } }
 
  56       assert_redirected_to basic_preferences_path
 
  59       assert_select ".alert-success", /^Preferences updated/
 
  61       assert_nil user.preferred_editor
 
  62       assert_equal "light", user.preferences.find_by(:k => "site.color_scheme")&.v
 
  63       assert_equal "light", user.preferences.find_by(:k => "map.color_scheme")&.v
 
  66     def test_update_with_referer
 
  67       session_for(create(:user))
 
  68       put basic_preferences_path, :params => { :referer => root_path }
 
  69       assert_redirected_to root_path
 
  72     def test_update_preferred_language_from_en_selecting_fr
 
  73       check_language_change %w[en], "fr", %w[fr]
 
  76     def test_update_preferred_language_from_unknown_selecting_fr
 
  77       check_language_change %w[unknown], "fr", %w[fr]
 
  80     def test_update_preferred_language_from_unknown_en_selecting_en
 
  81       check_language_change %w[unknown en], "en", %w[unknown en]
 
  84     def test_update_preferred_language_from_unknown_en_selecting_fr
 
  85       check_language_change %w[unknown en], "fr", %w[fr]
 
  88     def test_update_preferred_language_from_en_unknown_selecting_fr
 
  89       check_language_change %w[en unknown], "fr", %w[fr]
 
  92     def test_update_preferred_language_from_ru_en_selecting_en
 
  93       check_language_change %w[ru en], "en", %w[en ru]
 
  96     def test_update_preferred_language_from_fr_enau_selecting_en
 
  97       check_language_change %w[fr en-AU], "en", %w[en en-AU fr]
 
 100     def test_update_preferred_language_from_fr_enau_en_selecting_en
 
 101       check_language_change %w[fr en-AU en], "en", %w[en en-AU fr]
 
 104     def test_update_preferred_language_from_fr_es_selecting_de
 
 105       check_language_change %w[fr es], "de", %w[de]
 
 108     def test_update_preferred_site_color_scheme
 
 109       user = create(:user, :languages => [])
 
 111       assert_nil user.preferences.find_by(:k => "site.color_scheme")
 
 113       # Changing when previously not defined
 
 114       put basic_preferences_path, :params => { :user => user.attributes, :site_color_scheme => "light" }
 
 115       assert_redirected_to basic_preferences_path
 
 117       assert_template :show
 
 118       assert_select ".alert-success", /^Preferences updated/
 
 119       assert_equal "light", user.preferences.find_by(:k => "site.color_scheme")&.v
 
 121       # Changing when previously defined
 
 122       put basic_preferences_path, :params => { :user => user.attributes, :site_color_scheme => "auto" }
 
 123       assert_redirected_to basic_preferences_path
 
 125       assert_template :show
 
 126       assert_select ".alert-success", /^Preferences updated/
 
 127       assert_equal "auto", user.preferences.find_by(:k => "site.color_scheme")&.v
 
 130     def test_update_preferred_map_color_scheme
 
 131       user = create(:user, :languages => [])
 
 133       assert_nil user.preferences.find_by(:k => "map.color_scheme")
 
 135       # Changing when previously not defined
 
 136       put basic_preferences_path, :params => { :user => user.attributes, :map_color_scheme => "light" }
 
 137       assert_redirected_to basic_preferences_path
 
 139       assert_template :show
 
 140       assert_select ".alert-success", /^Preferences updated/
 
 141       assert_equal "light", user.preferences.find_by(:k => "map.color_scheme")&.v
 
 143       # Changing when previously defined
 
 144       put basic_preferences_path, :params => { :user => user.attributes, :map_color_scheme => "auto" }
 
 145       assert_redirected_to basic_preferences_path
 
 147       assert_template :show
 
 148       assert_select ".alert-success", /^Preferences updated/
 
 149       assert_equal "auto", user.preferences.find_by(:k => "map.color_scheme")&.v
 
 154     def check_language_change(from_languages, selecting_language, to_languages)
 
 155       I18n.with_locale "en" do
 
 156         user = create(:user, :preferred_editor => "remote", :languages => from_languages)
 
 157         another_user = create(:user, :languages => %w[not going to change])
 
 160         put basic_preferences_path, :params => { :language => selecting_language }
 
 162         assert_redirected_to basic_preferences_path
 
 164         assert_equal to_languages, user.languages
 
 165         assert_equal "remote", user.preferred_editor
 
 167         assert_equal %w[not going to change], another_user.languages