]> git.openstreetmap.org Git - rails.git/commitdiff
Merge remote-tracking branch 'upstream/pull/3257'
authorTom Hughes <tom@compton.nu>
Wed, 21 Jul 2021 18:24:31 +0000 (19:24 +0100)
committerTom Hughes <tom@compton.nu>
Wed, 21 Jul 2021 18:24:31 +0000 (19:24 +0100)
20 files changed:
app/abilities/ability.rb
app/controllers/application_controller.rb
app/controllers/confirmations_controller.rb
app/controllers/preferences_controller.rb [new file with mode: 0644]
app/controllers/profiles_controller.rb [new file with mode: 0644]
app/controllers/users_controller.rb
app/models/user.rb
app/views/layouts/_header.html.erb
app/views/preferences/_update_success_flash.html.erb [new file with mode: 0644]
app/views/preferences/edit.html.erb [new file with mode: 0644]
app/views/preferences/show.html.erb [new file with mode: 0644]
app/views/profiles/edit.html.erb [new file with mode: 0644]
app/views/users/account.html.erb
app/views/users/show.html.erb
config/locales/en.yml
config/routes.rb
test/controllers/preferences_controller_test.rb [new file with mode: 0644]
test/controllers/profiles_controller_test.rb [new file with mode: 0644]
test/controllers/users_controller_test.rb
test/system/preferences_test.rb [new file with mode: 0644]

index c03ab288ca36d06c309c90e406a8ad5f18ea5398..018ce00966bd295e347fe8a5d8fa9c3b9bd4701b 100644 (file)
@@ -46,6 +46,8 @@ class Ability
         can [:make_friend, :remove_friend], Friendship
         can [:new, :create, :reply, :show, :inbox, :outbox, :mark, :destroy], Message
         can [:close, :reopen], Note
+        can [:show, :edit, :update], :preference
+        can [:edit, :update], :profile
         can [:new, :create], Report
         can [:mine, :new, :create, :edit, :update, :destroy], Trace
         can [:account, :go_public], User
index 2a1c3d6759c1777589f65e308e1123bde8b706fc..0884964edffbd3498b6f6466626e4e8e78203dff 100644 (file)
@@ -172,8 +172,7 @@ class ApplicationController < ActionController::Base
     end
   end
 
-  def preferred_languages(reset: false)
-    @preferred_languages = nil if reset
+  def preferred_languages
     @preferred_languages ||= if params[:locale]
                                Locale.list(params[:locale])
                              elsif current_user
@@ -185,13 +184,13 @@ class ApplicationController < ActionController::Base
 
   helper_method :preferred_languages
 
-  def set_locale(reset: false)
+  def set_locale
     if current_user&.languages&.empty? && !http_accept_language.user_preferred_languages.empty?
       current_user.languages = http_accept_language.user_preferred_languages
       current_user.save
     end
 
-    I18n.locale = Locale.available.preferred(preferred_languages(:reset => reset))
+    I18n.locale = Locale.available.preferred(preferred_languages)
 
     response.headers["Vary"] = "Accept-Language"
     response.headers["Content-Language"] = I18n.locale.to_s
index 372ac2a70c0dc2277902fc43f71d3bee25a94fdc..7b1c52ca68876ad3a22f24f0ac9d22bb91489c8d 100644 (file)
@@ -129,9 +129,9 @@ class ConfirmationsController < ApplicationController
   # display a message about th current status of the gravatar setting
   def gravatar_status_message(user)
     if user.image_use_gravatar
-      t "users.account.gravatar.enabled"
+      t "profiles.edit.gravatar.enabled"
     else
-      t "users.account.gravatar.disabled"
+      t "profiles.edit.gravatar.disabled"
     end
   end
 end
diff --git a/app/controllers/preferences_controller.rb b/app/controllers/preferences_controller.rb
new file mode 100644 (file)
index 0000000..e098a8a
--- /dev/null
@@ -0,0 +1,33 @@
+class PreferencesController < ApplicationController
+  layout "site"
+
+  before_action :authorize_web
+  before_action :set_locale
+
+  authorize_resource :class => false
+
+  before_action :check_database_readable
+  before_action :check_database_writable, :only => [:update]
+
+  def show; end
+
+  def edit; end
+
+  def update
+    current_user.languages = params[:user][:languages].split(",")
+
+    current_user.preferred_editor = if params[:user][:preferred_editor] == "default"
+                                      nil
+                                    else
+                                      params[:user][:preferred_editor]
+                                    end
+    if current_user.save
+      # Use a partial so that it is rendered during the next page load in the correct language.
+      flash[:notice] = { :partial => "preferences/update_success_flash" }
+      redirect_to preferences_path
+    else
+      flash[:error] = t ".failure"
+      render :edit
+    end
+  end
+end
diff --git a/app/controllers/profiles_controller.rb b/app/controllers/profiles_controller.rb
new file mode 100644 (file)
index 0000000..b48d08a
--- /dev/null
@@ -0,0 +1,43 @@
+class ProfilesController < ApplicationController
+  layout "site"
+
+  before_action :authorize_web
+  before_action :set_locale
+
+  authorize_resource :class => false
+
+  before_action :check_database_readable
+  before_action :check_database_writable, :only => [:update]
+
+  def edit; end
+
+  def update
+    if params[:user][:description] != current_user.description
+      current_user.description = params[:user][:description]
+      current_user.description_format = "markdown"
+    end
+
+    case params[:avatar_action]
+    when "new"
+      current_user.avatar.attach(params[:user][:avatar])
+      current_user.image_use_gravatar = false
+    when "delete"
+      current_user.avatar.purge_later
+      current_user.image_use_gravatar = false
+    when "gravatar"
+      current_user.avatar.purge_later
+      current_user.image_use_gravatar = true
+    end
+
+    current_user.home_lat = params[:user][:home_lat]
+    current_user.home_lon = params[:user][:home_lon]
+
+    if current_user.save
+      flash[:notice] = t ".success"
+      redirect_to user_path(current_user)
+    else
+      flash[:error] = t ".failure"
+      render :edit
+    end
+  end
+end
index 3101e5af2f1660ae42e5da016f623f312b614a93..ec30eb4e7b14a3267b44dfcbd0386939c83009f9 100644 (file)
@@ -363,34 +363,6 @@ class UsersController < ApplicationController
       user.pass_crypt_confirmation = params[:user][:pass_crypt_confirmation]
     end
 
-    if params[:user][:description] != user.description
-      user.description = params[:user][:description]
-      user.description_format = "markdown"
-    end
-
-    user.languages = params[:user][:languages].split(",")
-
-    case params[:avatar_action]
-    when "new"
-      user.avatar.attach(params[:user][:avatar])
-      user.image_use_gravatar = false
-    when "delete"
-      user.avatar.purge_later
-      user.image_use_gravatar = false
-    when "gravatar"
-      user.avatar.purge_later
-      user.image_use_gravatar = true
-    end
-
-    user.home_lat = params[:user][:home_lat]
-    user.home_lon = params[:user][:home_lon]
-
-    user.preferred_editor = if params[:user][:preferred_editor] == "default"
-                              nil
-                            else
-                              params[:user][:preferred_editor]
-                            end
-
     if params[:user][:auth_provider].nil? || params[:user][:auth_provider].blank?
       user.auth_provider = nil
       user.auth_uid = nil
@@ -399,8 +371,6 @@ class UsersController < ApplicationController
     if user.save
       session[:fingerprint] = user.fingerprint
 
-      set_locale(:reset => true)
-
       if user.new_email.blank? || user.new_email == user.email
         flash[:notice] = t "users.account.flash update success"
       else
index cca894a6bf291e54e5a3424c51e8ebcfa8374d9b..8b8f31676b6e37870dfb9542ec8bad4229805b26 100644 (file)
@@ -118,7 +118,6 @@ class User < ApplicationRecord
   before_save :encrypt_password
   before_save :update_tile
   after_save :spam_check
-  after_save :reset_preferred_languages
 
   def to_param
     display_name
@@ -179,10 +178,6 @@ class User < ApplicationRecord
     @preferred_languages ||= Locale.list(languages)
   end
 
-  def reset_preferred_languages
-    @preferred_languages = nil
-  end
-
   def nearby(radius = Settings.nearby_radius, num = Settings.nearby_users)
     if home_lon && home_lat
       gc = OSM::GreatCircle.new(home_lat, home_lon)
index fe5bf23c5b4eb0327d0ea7b498b6add8940062ec..6b6271c2b8e13a858ae357cedf3b833be0f49179 100644 (file)
@@ -96,6 +96,7 @@
           <% end %>
           <%= link_to t("users.show.my profile"), user_path(current_user), :class => "dropdown-item" %>
           <%= link_to t("users.show.my settings"), { :controller => "users", :action => "account", :display_name => current_user.display_name }, { :class => "dropdown-item" } %>
+          <%= link_to t("users.show.my_preferences"), preferences_path, :class => "dropdown-item" %>
           <div class="dropdown-divider"></div>
           <%= yield :greeting %>
           <%= link_to t("layouts.logout"), logout_path(:referer => request.fullpath), :method => "post", :class => "geolink dropdown-item" %>
diff --git a/app/views/preferences/_update_success_flash.html.erb b/app/views/preferences/_update_success_flash.html.erb
new file mode 100644 (file)
index 0000000..8fd1095
--- /dev/null
@@ -0,0 +1 @@
+<%= t ".message" %>
diff --git a/app/views/preferences/edit.html.erb b/app/views/preferences/edit.html.erb
new file mode 100644 (file)
index 0000000..07d89fb
--- /dev/null
@@ -0,0 +1,12 @@
+<% content_for :heading do %>
+  <h1><%= t ".title" %></h1>
+<% end %>
+
+<%= bootstrap_form_for current_user, :url => { :action => :update } do |f| %>
+  <%= f.select :preferred_editor, [[t("editor.default", :name => t("editor.#{Settings.default_editor}.name")), "default"]] + Editors::AVAILABLE_EDITORS.collect { |e| [t("editor.#{e}.description"), e] } %>
+
+  <%= f.text_field :languages %>
+
+  <%= f.primary t(".save") %>
+  <%= link_to t(".cancel"), preferences_path, :class => "btn btn-link" %>
+<% end %>
diff --git a/app/views/preferences/show.html.erb b/app/views/preferences/show.html.erb
new file mode 100644 (file)
index 0000000..7a63d0b
--- /dev/null
@@ -0,0 +1,28 @@
+<% content_for :heading do %>
+  <h1><%= t ".title" %></h1>
+<% end %>
+
+<dl class="row">
+  <dt class="col-sm-4"><%= t ".preferred_editor" %></dt>
+
+  <% if current_user.preferred_editor? %>
+    <dd class="col-sm-8"><%= t("editor.#{current_user.preferred_editor}.description") %></dd>
+  <% else %>
+    <dd class="col-sm-8"><%= t("editor.default", :name => t("editor.#{Settings.default_editor}.name")) %></dd>
+  <% end %>
+
+  <dt class="col-sm-4"><%= t ".preferred_languages" %></dt>
+
+  <dd class="col-sm-8">
+    <ul class="list-unstyled">
+      <% current_user.preferred_languages.each do |locale| %>
+        <li><%= locale %></li>
+      <% end %>
+    </ul>
+
+  </dd>
+</dl>
+
+<div>
+  <%= link_to t(".edit_preferences"), edit_preferences_path, :class => "btn btn-outline-primary" %>
+</div>
diff --git a/app/views/profiles/edit.html.erb b/app/views/profiles/edit.html.erb
new file mode 100644 (file)
index 0000000..8eca6f4
--- /dev/null
@@ -0,0 +1,61 @@
+<% content_for :head do %>
+  <%= javascript_include_tag "user" %>
+<% end %>
+
+<% content_for :heading do %>
+  <h1><%= t ".title" %></h1>
+<% end %>
+
+<%= bootstrap_form_for current_user, :url => { :action => :update }, :html => { :multipart => true, :autocomplete => :off } do |f| %>
+  <%= f.richtext_field :description, :cols => 80, :rows => 20 %>
+
+  <fieldset class="form-group">
+    <%= f.label t(".image") %>
+    <div class="form-row">
+      <div class="col-sm-2">
+        <%= user_image current_user %>
+      </div>
+      <div class="col-sm-10">
+        <% if current_user.avatar.attached? %>
+          <%= f.radio_button "avatar_action", "keep", :name => "avatar_action", :label => t(".keep image"), :checked => !current_user.image_use_gravatar %>
+        <% end %>
+        <% if current_user.avatar.attached? || current_user.image_use_gravatar? %>
+          <%= f.radio_button "avatar_action", "delete", :name => "avatar_action", :label => t(".delete image"), :checked => false %>
+        <% end %>
+        <% if current_user.avatar.attached? %>
+          <%= f.form_group :help => t(".image size hint"), :class => "mb-0" do %>
+            <%= f.radio_button "avatar_action", "new", :name => "avatar_action", :label => t(".replace image"), :checked => false %>
+            <%= f.file_field :avatar, :hide_label => true, :wrapper => { :class => "mb-0" } %>
+          <% end %>
+        <% else %>
+          <%= f.form_group :help => t(".image size hint"), :class => "mb-0" do %>
+            <%= f.radio_button "avatar_action", "new", :name => "avatar_action", :label => t(".new image"), :checked => false %>
+            <%= f.file_field :avatar, :hide_label => true, :wrapper => { :class => "mb-0" } %>
+          <% end %>
+        <% end %>
+        <%= f.form_group :help => link_to(t(".gravatar.what_is_gravatar"), t(".gravatar.link")) do %>
+          <%= f.radio_button "avatar_action", "gravatar", :name => "avatar_action", :label => t(".gravatar.gravatar"), :checked => current_user.image_use_gravatar %>
+        <% end %>
+      </div>
+    </div>
+  </fieldset>
+
+  <fieldset>
+    <legend><%= t ".home location" -%></legend>
+    <div id="homerow" <% unless current_user.home_lat and current_user.home_lon %> class="nohome"<% end %>>
+      <p class="message text-muted"><%= t ".no home location" %></p>
+      <div class="form-row">
+        <%= f.text_field :home_lat, :wrapper_class => "col-sm-4", :id => "home_lat" %>
+        <%= f.text_field :home_lon, :wrapper_class => "col-sm-4", :id => "home_lon" %>
+      </div>
+    </div>
+    <div class="form-check">
+      <input class="form-check-input" type="checkbox" name="updatehome" value="1" <% unless current_user.home_lat and current_user.home_lon %> checked="checked" <% end %> id="updatehome" />
+      <label class="form-check-label" for="updatehome"><%= t ".update home location on click" %></label>
+    </div>
+    <%= tag.div "", :id => "map", :class => "content_map set_location" %>
+  </fieldset>
+
+  <%= f.primary t(".save") %>
+    <%= link_to t(".cancel"), user_path(current_user), :class => "btn btn-link" %>
+<% end %>
index dc31de97aea3d6671b55219c8ed8ab96225b54b1..26d8402107e68eacd9c91a0b34dc25a289386e88 100644 (file)
     </span>
   </div>
 
-  <%= f.select :preferred_editor, [[t("editor.default", :name => t("editor.#{Settings.default_editor}.name")), "default"]] + Editors::AVAILABLE_EDITORS.collect { |e| [t("editor.#{e}.description"), e] } %>
-  <%= f.richtext_field :description, :cols => 80, :rows => 20 %>
-  <%= f.text_field :languages %>
-
-  <fieldset class="form-group">
-    <%= f.label t(".image") %>
-    <div class="form-row">
-      <div class="col-sm-2">
-        <%= user_image current_user %>
-      </div>
-      <div class="col-sm-10">
-        <% if current_user.avatar.attached? %>
-          <%= f.radio_button "avatar_action", "keep", :name => "avatar_action", :label => t(".keep image"), :checked => !current_user.image_use_gravatar %>
-        <% end %>
-        <% if current_user.avatar.attached? || current_user.image_use_gravatar? %>
-          <%= f.radio_button "avatar_action", "delete", :name => "avatar_action", :label => t(".delete image"), :checked => false %>
-        <% end %>
-        <% if current_user.avatar.attached? %>
-          <%= f.form_group :help => t(".image size hint"), :class => "mb-0" do %>
-            <%= f.radio_button "avatar_action", "new", :name => "avatar_action", :label => t(".replace image"), :checked => false %>
-            <%= f.file_field :avatar, :hide_label => true, :wrapper => { :class => "mb-0" } %>
-          <% end %>
-        <% else %>
-          <%= f.form_group :help => t(".image size hint"), :class => "mb-0" do %>
-            <%= f.radio_button "avatar_action", "new", :name => "avatar_action", :label => t(".new image"), :checked => false %>
-            <%= f.file_field :avatar, :hide_label => true, :wrapper => { :class => "mb-0" } %>
-          <% end %>
-        <% end %>
-        <%= f.form_group :help => link_to(t(".gravatar.what_is_gravatar"), t(".gravatar.link")) do %>
-          <%= f.radio_button "avatar_action", "gravatar", :name => "avatar_action", :label => t(".gravatar.gravatar"), :checked => current_user.image_use_gravatar %>
-        <% end %>
-      </div>
-    </div>
-  </fieldset>
-
-  <fieldset>
-    <legend><%= t ".home location" -%></legend>
-    <div id="homerow" <% unless current_user.home_lat and current_user.home_lon %> class="nohome"<% end %>>
-      <p class="message text-muted"><%= t ".no home location" %></p>
-      <div class="form-row">
-        <%= f.text_field :home_lat, :wrapper_class => "col-sm-4", :id => "home_lat" %>
-        <%= f.text_field :home_lon, :wrapper_class => "col-sm-4", :id => "home_lon" %>
-      </div>
-    </div>
-    <div class="form-check">
-      <input class="form-check-input" type="checkbox" name="updatehome" value="1" <% unless current_user.home_lat and current_user.home_lon %> checked="checked" <% end %> id="updatehome" />
-      <label class="form-check-label" for="updatehome"><%= t ".update home location on click" %></label>
-    </div>
-    <%= tag.div "", :id => "map", :class => "content_map set_location" %>
-  </fieldset>
-
   <%= f.primary t(".save changes button") %>
 <% end %>
 
index dac0ff5b50d927815e5c802beb35fa6405f3cd91..ac6938af76066e1fc7a11fed8eb73a28895571dc 100644 (file)
 
     <div class="user-description richtext text-break"><%= @user.description.to_html %></div>
 
+    <% if current_user and @user.id == current_user.id %>
+      <div class="my-3">
+        <%= link_to t(".edit_profile"), edit_profile_path, :class => "btn btn-outline-primary" %>
+      </div>
+    <% end %>
+
   </div>
 
   <% if current_user and current_user.administrator? -%>
index fce1f8913d09156605f274e8a9d01b31a3a13bda..83b697e8c315db58258df8c0203b8a7c00050611 100644 (file)
@@ -1645,6 +1645,43 @@ en:
       reset: "Reset Password"
       flash changed: "Your password has been changed."
       flash token bad: "Did not find that token, check the URL maybe?"
+  preferences:
+    show:
+      title: My Preferences
+      preferred_editor: Preferred Editor
+      preferred_languages: Preferred Languages
+      edit_preferences: Edit Preferences
+    edit:
+      title: Edit Preferences
+      save: Update Preferences
+      cancel: Cancel
+    update:
+      failure: Couldn't update preferences.
+    update_success_flash:
+      message: Preferences updated.
+  profiles:
+    edit:
+      title: Edit Profile
+      save: Update Profile
+      cancel: Cancel
+      image: Image
+      gravatar:
+        gravatar: "Use Gravatar"
+        link: "https://wiki.openstreetmap.org/wiki/Gravatar"
+        what_is_gravatar: "What is Gravatar?"
+        disabled: "Gravatar has been disabled."
+        enabled: "Display of your Gravatar has been enabled."
+      new image: "Add an image"
+      keep image: "Keep the current image"
+      delete image: "Remove the current image"
+      replace image: "Replace the current image"
+      image size hint: "(square images at least 100x100 work best)"
+      home location: "Home Location"
+      no home location: "You have not entered your home location."
+      update home location on click: "Update home location when I click on the map?"
+    update:
+      success: Profile updated.
+      failure: Couldn't update profile.
   sessions:
     new:
       title: "Login"
@@ -2446,8 +2483,10 @@ en:
       my profile: My Profile
       my settings: My Settings
       my comments: My Comments
+      my_preferences: My Preferences
       blocks on me: Blocks on Me
       blocks by me: Blocks by Me
+      edit_profile: Edit Profile
       send message: Send Message
       diary: Diary
       edits: Edits
@@ -2529,21 +2568,6 @@ en:
         agreed_with_pd: "You have also declared that you consider your edits to be in the Public Domain."
         link: "https://www.osmfoundation.org/wiki/License/Contributor_Terms"
         link text: "what is this?"
-      image: Image
-      gravatar:
-        gravatar: "Use Gravatar"
-        link: "https://wiki.openstreetmap.org/wiki/Gravatar"
-        what_is_gravatar: "What is Gravatar?"
-        disabled: "Gravatar has been disabled."
-        enabled: "Display of your Gravatar has been enabled."
-      new image: "Add an image"
-      keep image: "Keep the current image"
-      delete image: "Remove the current image"
-      replace image: "Replace the current image"
-      image size hint: "(square images at least 100x100 work best)"
-      home location: "Home Location"
-      no home location: "You have not entered your home location."
-      update home location on click: "Update home location when I click on the map?"
       save changes button: Save Changes
       make edits public button: Make all my edits public
       return to profile: Return to profile
index 048db8b3365aad3335f2d147ac67754f5e1d15fa..dc10818b99aba08f26841b7a6eb3ed24db3107a2 100644 (file)
@@ -240,6 +240,9 @@ OpenStreetMap::Application.routes.draw do
   match "/user/:display_name/account" => "users#account", :via => [:get, :post], :as => "user_account"
   post "/user/:display_name/set_status" => "users#set_status", :as => :set_status_user
 
+  resource :preferences, :only => [:show, :edit, :update]
+  resource :profile, :only => [:edit, :update]
+
   # friendships
   match "/user/:display_name/make_friend" => "friendships#make_friend", :via => [:get, :post], :as => "make_friend"
   match "/user/:display_name/remove_friend" => "friendships#remove_friend", :via => [:get, :post], :as => "remove_friend"
diff --git a/test/controllers/preferences_controller_test.rb b/test/controllers/preferences_controller_test.rb
new file mode 100644 (file)
index 0000000..8c529e6
--- /dev/null
@@ -0,0 +1,56 @@
+require "test_helper"
+
+class PreferencesControllerTest < ActionDispatch::IntegrationTest
+  ##
+  # test all routes which lead to this controller
+  def test_routes
+    assert_routing(
+      { :path => "/preferences", :method => :get },
+      { :controller => "preferences", :action => "show" }
+    )
+
+    assert_routing(
+      { :path => "/preferences/edit", :method => :get },
+      { :controller => "preferences", :action => "edit" }
+    )
+
+    assert_routing(
+      { :path => "/preferences", :method => :put },
+      { :controller => "preferences", :action => "update" }
+    )
+  end
+
+  def test_update_preferred_editor
+    user = create(:user, :languages => [])
+    session_for(user)
+
+    # Changing to a invalid editor should fail
+    user.preferred_editor = "unknown"
+    put preferences_path, :params => { :user => user.attributes }
+    assert_response :success
+    assert_template :edit
+    assert_select ".notice", false
+    assert_select ".error", true
+    assert_select "form > div.form-group > select#user_preferred_editor > option[selected]", false
+
+    # Changing to a valid editor should work
+    user.preferred_editor = "id"
+    put preferences_path, :params => { :user => user.attributes }
+    assert_response :redirect
+    assert_redirected_to preferences_path
+    follow_redirect!
+    assert_template :show
+    assert_select ".notice", /^Preferences updated/
+    assert_select "dd", "iD (in-browser editor)"
+
+    # Changing to the default editor should work
+    user.preferred_editor = "default"
+    put preferences_path, :params => { :user => user.attributes }
+    assert_response :redirect
+    assert_redirected_to preferences_path
+    follow_redirect!
+    assert_template :show
+    assert_select ".notice", /^Preferences updated/
+    assert_select "dd", "Default (currently iD)"
+  end
+end
diff --git a/test/controllers/profiles_controller_test.rb b/test/controllers/profiles_controller_test.rb
new file mode 100644 (file)
index 0000000..38e73a0
--- /dev/null
@@ -0,0 +1,67 @@
+require "test_helper"
+
+class ProfilesControllerTest < ActionDispatch::IntegrationTest
+  ##
+  # test all routes which lead to this controller
+  def test_routes
+    assert_routing(
+      { :path => "/profile/edit", :method => :get },
+      { :controller => "profiles", :action => "edit" }
+    )
+
+    assert_routing(
+      { :path => "/profile", :method => :put },
+      { :controller => "profiles", :action => "update" }
+    )
+  end
+
+  def test_update
+    user = create(:user)
+    session_for(user)
+
+    # Updating the description should work
+    put profile_path, :params => { :user => { :description => "new description" } }
+    assert_response :redirect
+    assert_redirected_to user_path(user)
+    follow_redirect!
+    assert_response :success
+    assert_template :show
+    assert_select ".notice", /^Profile updated./
+    assert_select "div", "new description"
+
+    # Changing to an uploaded image should work
+    image = Rack::Test::UploadedFile.new("test/gpx/fixtures/a.gif", "image/gif")
+    put profile_path, :params => { :avatar_action => "new", :user => { :avatar => image, :description => user.description } }
+    assert_response :redirect
+    assert_redirected_to user_path(user)
+    follow_redirect!
+    assert_response :success
+    assert_template :show
+    assert_select ".notice", /^Profile updated./
+    get edit_profile_path
+    assert_select "form > fieldset.form-group > div.form-row > div.col-sm-10 > div.form-check > input[name=avatar_action][checked][value=?]", "keep"
+
+    # Changing to a gravatar image should work
+    put profile_path, :params => { :avatar_action => "gravatar", :user => { :description => user.description } }
+    assert_response :redirect
+    assert_redirected_to user_path(user)
+    follow_redirect!
+    assert_response :success
+    assert_template :show
+    assert_select ".notice", /^Profile updated./
+    get edit_profile_path
+    assert_select "form > fieldset.form-group > div.form-row > div.col-sm-10 > div.form-group > div.form-check > input[name=avatar_action][checked][value=?]", "gravatar"
+
+    # Removing the image should work
+    put profile_path, :params => { :avatar_action => "delete", :user => { :description => user.description } }
+    assert_response :redirect
+    assert_redirected_to user_path(user)
+    follow_redirect!
+    assert_response :success
+    assert_template :show
+    assert_select ".notice", /^Profile updated./
+    get edit_profile_path
+    assert_select "form > fieldset.form-group > div.form-row > div.col-sm-10 > div.form-check > input[name=avatar_action][checked]", false
+    assert_select "form > fieldset.form-group > div.form-row > div.col-sm-10 > div.form-group > div.form-check > input[name=avatar_action][checked]", false
+  end
+end
index 62eb79f0c836d30cba746850246a6e798a1ad7e7..a73e48211f45dcc5a88533f8e43a19b3f8b8940a 100644 (file)
@@ -463,80 +463,6 @@ class UsersControllerTest < ActionDispatch::IntegrationTest
     assert_template :account
     assert_not_equal user.description, User.find(user.id).description
 
-    # Updating the description should work
-    user.description = "new description"
-    user.preferred_editor = "default"
-    post user_account_path(user), :params => { :user => user.attributes }
-    assert_response :redirect
-    assert_redirected_to user_account_url(user)
-    get user_account_path(user)
-    assert_response :success
-    assert_template :account
-    assert_select ".notice", /^User information updated successfully/
-    assert_select "form#accountForm > div.form-group > div#user_description_container > div#user_description_content > textarea#user_description", user.description
-
-    # Changing to a invalid editor should fail
-    user.preferred_editor = "unknown"
-    post user_account_path(user), :params => { :user => user.attributes }
-    assert_response :success
-    assert_template :account
-    assert_select ".notice", false
-    assert_select "form#accountForm > div.form-group > select#user_preferred_editor > option[selected]", false
-
-    # Changing to a valid editor should work
-    user.preferred_editor = "id"
-    post user_account_path(user), :params => { :user => user.attributes }
-    assert_response :redirect
-    assert_redirected_to user_account_url(user)
-    get user_account_path(user)
-    assert_response :success
-    assert_template :account
-    assert_select ".notice", /^User information updated successfully/
-    assert_select "form#accountForm > div.form-group > select#user_preferred_editor > option[selected][value=?]", "id"
-
-    # Changing to the default editor should work
-    user.preferred_editor = "default"
-    post user_account_path(user), :params => { :user => user.attributes }
-    assert_response :redirect
-    assert_redirected_to user_account_url(user)
-    get user_account_path(user)
-    assert_response :success
-    assert_template :account
-    assert_select ".notice", /^User information updated successfully/
-    assert_select "form#accountForm > div.form-group > select#user_preferred_editor > option[selected]", false
-
-    # Changing to an uploaded image should work
-    image = Rack::Test::UploadedFile.new("test/gpx/fixtures/a.gif", "image/gif")
-    post user_account_path(user), :params => { :avatar_action => "new", :user => user.attributes.merge(:avatar => image) }
-    assert_response :redirect
-    assert_redirected_to user_account_url(user)
-    get user_account_path(user)
-    assert_response :success
-    assert_template :account
-    assert_select ".notice", /^User information updated successfully/
-    assert_select "form#accountForm > fieldset.form-group > div.form-row > div.col-sm-10 > div.form-check > input[name=avatar_action][checked][value=?]", "keep"
-
-    # Changing to a gravatar image should work
-    post user_account_path(user), :params => { :avatar_action => "gravatar", :user => user.attributes }
-    assert_response :redirect
-    assert_redirected_to user_account_url(user)
-    get user_account_path(user)
-    assert_response :success
-    assert_template :account
-    assert_select ".notice", /^User information updated successfully/
-    assert_select "form#accountForm > fieldset.form-group > div.form-row > div.col-sm-10 > div.form-group > div.form-check > input[name=avatar_action][checked][value=?]", "gravatar"
-
-    # Removing the image should work
-    post user_account_path(user), :params => { :avatar_action => "delete", :user => user.attributes }
-    assert_response :redirect
-    assert_redirected_to user_account_url(user)
-    get user_account_path(user)
-    assert_response :success
-    assert_template :account
-    assert_select ".notice", /^User information updated successfully/
-    assert_select "form#accountForm > fieldset.form-group > div.form-row > div.col-sm-10 > div.form-check > input[name=avatar_action][checked]", false
-    assert_select "form#accountForm > fieldset.form-group > div.form-row > div.col-sm-10 > div.form-group > div.form-check > input[name=avatar_action][checked]", false
-
     # Adding external authentication should redirect to the auth provider
     post user_account_path(user), :params => { :user => user.attributes.merge(:auth_provider => "openid", :auth_uid => "gmail.com") }
     assert_response :redirect
diff --git a/test/system/preferences_test.rb b/test/system/preferences_test.rb
new file mode 100644 (file)
index 0000000..e5bcd10
--- /dev/null
@@ -0,0 +1,23 @@
+require "application_system_test_case"
+
+class PreferencesTest < ApplicationSystemTestCase
+  def test_flash_message_shows_in_original_language
+    sign_in_as(create(:user))
+
+    visit edit_preferences_path
+    click_on "Update Preferences"
+
+    assert page.has_content?("Preferences updated")
+  end
+
+  def test_flash_message_shows_in_new_language
+    sign_in_as(create(:user))
+
+    visit edit_preferences_path
+    fill_in "Preferred Languages", :with => "fr"
+    click_on "Update Preferences"
+
+    # TODO: enable with french translation when that's available
+    # assert page.has_content?("Préférences mises à jour") # rubocop:disable Style/AsciiComments
+  end
+end