Commit 11b082045552d616dad01df7f7ee5a387b409863
1 parent
51c1d1bb
Exists in
master
and in
1 other branch
Little refactoring of action in ProblemController
Showing
4 changed files
with
69 additions
and
39 deletions
Show diff stats
app/controllers/problems_controller.rb
| ... | ... | @@ -6,10 +6,13 @@ |
| 6 | 6 | # COLLECTION => :index, :all, :destroy_several, :resolve_several, :unresolve_several, :merge_several, :unmerge_several, :search |
| 7 | 7 | class ProblemsController < ApplicationController |
| 8 | 8 | |
| 9 | - before_filter :find_selected_problems, :only => [:destroy_several, :resolve_several, :unresolve_several, :merge_several, :unmerge_several] | |
| 10 | 9 | before_filter :set_sorting_params, :only => [:index, :all, :search] |
| 11 | 10 | before_filter :set_tracker_params, :only => [:create_issue] |
| 12 | 11 | |
| 12 | + before_filter :need_selected_problem, :only => [ | |
| 13 | + :resolve_several, :unresolve_several, :unmerge_several | |
| 14 | + ] | |
| 15 | + | |
| 13 | 16 | expose(:app) { |
| 14 | 17 | if current_user.admin? |
| 15 | 18 | App.find(params[:app_id]) |
| ... | ... | @@ -17,15 +20,23 @@ class ProblemsController < ApplicationController |
| 17 | 20 | current_user.apps.find(params[:app_id]) |
| 18 | 21 | end |
| 19 | 22 | } |
| 23 | + | |
| 20 | 24 | expose(:problem) { |
| 21 | 25 | app.problems.find(params[:id]) |
| 22 | 26 | } |
| 23 | 27 | |
| 28 | + expose(:err_ids) { | |
| 29 | + (params[:problems] || []).compact | |
| 30 | + } | |
| 31 | + | |
| 32 | + expose(:selected_problems) { | |
| 33 | + Array(Problem.find(err_ids)) | |
| 34 | + } | |
| 35 | + | |
| 24 | 36 | def index |
| 25 | 37 | app_scope = current_user.admin? ? App.all : current_user.apps |
| 26 | 38 | @all_errs = params[:all_errs] |
| 27 | 39 | @problems = Problem.for_apps(app_scope).in_env(params[:environment]).all_else_unresolved(@all_errs).ordered_by(@sort, @order) |
| 28 | - @selected_problems = params[:problems] || [] | |
| 29 | 40 | respond_to do |format| |
| 30 | 41 | format.html do |
| 31 | 42 | @problems = @problems.page(params[:page]).per(current_user.per_page) |
| ... | ... | @@ -64,35 +75,40 @@ class ProblemsController < ApplicationController |
| 64 | 75 | end |
| 65 | 76 | |
| 66 | 77 | def resolve_several |
| 67 | - @selected_problems.each(&:resolve!) | |
| 68 | - flash[:success] = "Great news everyone! #{I18n.t(:n_errs_have, :count => @selected_problems.count)} been resolved." | |
| 78 | + selected_problems.each(&:resolve!) | |
| 79 | + flash[:success] = "Great news everyone! #{I18n.t(:n_errs_have, :count => selected_problems.count)} been resolved." | |
| 69 | 80 | redirect_to :back |
| 70 | 81 | end |
| 71 | 82 | |
| 72 | 83 | def unresolve_several |
| 73 | - @selected_problems.each(&:unresolve!) | |
| 74 | - flash[:success] = "#{I18n.t(:n_errs_have, :count => @selected_problems.count)} been unresolved." | |
| 84 | + selected_problems.each(&:unresolve!) | |
| 85 | + flash[:success] = "#{I18n.t(:n_errs_have, :count => selected_problems.count)} been unresolved." | |
| 75 | 86 | redirect_to :back |
| 76 | 87 | end |
| 77 | 88 | |
| 89 | + ## | |
| 90 | + # Action to merge several Problem in One problem | |
| 91 | + # | |
| 92 | + # @param [ Array<String> ] :problems the list of problem ids | |
| 93 | + # | |
| 78 | 94 | def merge_several |
| 79 | - if @selected_problems.length < 2 | |
| 80 | - flash[:notice] = "You must select at least two errors to merge" | |
| 95 | + if selected_problems.length < 2 | |
| 96 | + flash[:notice] = I18n.t('controllers.problems.flash.need_two_errors_merge') | |
| 81 | 97 | else |
| 82 | - @merged_problem = Problem.merge!(@selected_problems) | |
| 83 | - flash[:notice] = "#{@selected_problems.count} errors have been merged." | |
| 98 | + ProblemMerge.new(selected_problems).merge | |
| 99 | + flash[:notice] = I18n.t('controllers.problems.flash.merge_several.success', :nb => selected_problems.count) | |
| 84 | 100 | end |
| 85 | 101 | redirect_to :back |
| 86 | 102 | end |
| 87 | 103 | |
| 88 | 104 | def unmerge_several |
| 89 | - all = @selected_problems.map(&:unmerge!).flatten | |
| 105 | + all = selected_problems.map(&:unmerge!).flatten | |
| 90 | 106 | flash[:success] = "#{I18n.t(:n_errs_have, :count => all.length)} been unmerged." |
| 91 | 107 | redirect_to :back |
| 92 | 108 | end |
| 93 | 109 | |
| 94 | 110 | def destroy_several |
| 95 | - nb_problem_destroy = ProblemDestroy.execute(@selected_problems) | |
| 111 | + nb_problem_destroy = ProblemDestroy.execute(selected_problems) | |
| 96 | 112 | flash[:notice] = "#{I18n.t(:n_errs_have, :count => nb_problem_destroy)} been deleted." |
| 97 | 113 | redirect_to :back |
| 98 | 114 | end |
| ... | ... | @@ -117,20 +133,20 @@ class ProblemsController < ApplicationController |
| 117 | 133 | IssueTracker.default_url_options[:protocol] = request.scheme |
| 118 | 134 | end |
| 119 | 135 | |
| 120 | - def find_selected_problems | |
| 121 | - err_ids = (params[:problems] || []).compact | |
| 122 | - if err_ids.empty? | |
| 123 | - flash[:notice] = "You have not selected any errors" | |
| 124 | - redirect_to :back | |
| 125 | - else | |
| 126 | - @selected_problems = Array(Problem.find(err_ids)) | |
| 127 | - end | |
| 128 | - end | |
| 129 | - | |
| 130 | 136 | def set_sorting_params |
| 131 | 137 | @sort = params[:sort] |
| 132 | 138 | @sort = "last_notice_at" unless %w{app message last_notice_at last_deploy_at count}.member?(@sort) |
| 133 | 139 | @order = params[:order] || "desc" |
| 134 | 140 | end |
| 141 | + | |
| 142 | + ## | |
| 143 | + # Redirect :back if no errors selected | |
| 144 | + # | |
| 145 | + def need_selected_problem | |
| 146 | + if err_ids.empty? | |
| 147 | + flash[:notice] = I18n.t('controllers.problems.flash.no_select_problem') | |
| 148 | + redirect_to :back | |
| 149 | + end | |
| 150 | + end | |
| 135 | 151 | end |
| 136 | 152 | ... | ... |
config/locales/en.yml
| ... | ... | @@ -2,7 +2,7 @@ |
| 2 | 2 | # See http://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points. |
| 3 | 3 | |
| 4 | 4 | en: |
| 5 | - hello: "Hello world" | |
| 5 | + | |
| 6 | 6 | flash: |
| 7 | 7 | apps: |
| 8 | 8 | create: |
| ... | ... | @@ -11,6 +11,7 @@ en: |
| 11 | 11 | success: "Good news everyone! '%{app_name}' was successfully updated." |
| 12 | 12 | destroy: |
| 13 | 13 | success: "'%{app_name}' was successfully destroyed." |
| 14 | + | |
| 14 | 15 | n_errs_have: |
| 15 | 16 | one: "%{count} err has" |
| 16 | 17 | other: "%{count} errs have" |
| ... | ... | @@ -38,6 +39,12 @@ en: |
| 38 | 39 | error: "You can't delete yourself" |
| 39 | 40 | update: |
| 40 | 41 | success: "%{name}'s information was successfully updated." |
| 42 | + problems: | |
| 43 | + flash: | |
| 44 | + no_select_problem: "You have not selected any errors" | |
| 45 | + need_two_errors_merge: "You must select at least two errors to merge" | |
| 46 | + merge_several: | |
| 47 | + success: "%{nb} errors have been merged." | |
| 41 | 48 | |
| 42 | 49 | devise: |
| 43 | 50 | registrations: | ... | ... |
spec/controllers/problems_controller_spec.rb
| ... | ... | @@ -341,31 +341,25 @@ describe ProblemsController do |
| 341 | 341 | @problem2 = Fabricate(:err, :problem => Fabricate(:problem, :resolved => false)).problem |
| 342 | 342 | end |
| 343 | 343 | |
| 344 | - it "should apply to multiple problems" do | |
| 345 | - post :resolve_several, :problems => [@problem1.id.to_s, @problem2.id.to_s] | |
| 346 | - assigns(:selected_problems).should == [@problem1, @problem2] | |
| 347 | - end | |
| 348 | - | |
| 349 | - it "should require at least one problem" do | |
| 350 | - post :resolve_several, :problems => [] | |
| 351 | - request.flash[:notice].should match(/You have not selected any/) | |
| 352 | - end | |
| 353 | - | |
| 354 | 344 | context "POST /problems/merge_several" do |
| 355 | 345 | it "should require at least two problems" do |
| 356 | 346 | post :merge_several, :problems => [@problem1.id.to_s] |
| 357 | - request.flash[:notice].should match(/You must select at least two/) | |
| 347 | + request.flash[:notice].should eql I18n.t('controllers.problems.flash.need_two_errors_merge') | |
| 358 | 348 | end |
| 359 | 349 | |
| 360 | 350 | it "should merge the problems" do |
| 361 | - lambda { | |
| 362 | - post :merge_several, :problems => [@problem1.id.to_s, @problem2.id.to_s] | |
| 363 | - assigns(:merged_problem).reload.errs.length.should == 2 | |
| 364 | - }.should change(Problem, :count).by(-1) | |
| 351 | + ProblemMerge.should_receive(:new).and_return(double(:merge => true)) | |
| 352 | + post :merge_several, :problems => [@problem1.id.to_s, @problem2.id.to_s] | |
| 365 | 353 | end |
| 366 | 354 | end |
| 367 | 355 | |
| 368 | 356 | context "POST /problems/unmerge_several" do |
| 357 | + | |
| 358 | + it "should require at least one problem" do | |
| 359 | + post :unmerge_several, :problems => [] | |
| 360 | + request.flash[:notice].should eql I18n.t('controllers.problems.flash.no_select_problem') | |
| 361 | + end | |
| 362 | + | |
| 369 | 363 | it "should unmerge a merged problem" do |
| 370 | 364 | merged_problem = Problem.merge!(@problem1, @problem2) |
| 371 | 365 | merged_problem.errs.length.should == 2 |
| ... | ... | @@ -374,9 +368,16 @@ describe ProblemsController do |
| 374 | 368 | merged_problem.reload.errs.length.should == 1 |
| 375 | 369 | }.should change(Problem, :count).by(1) |
| 376 | 370 | end |
| 371 | + | |
| 377 | 372 | end |
| 378 | 373 | |
| 379 | 374 | context "POST /problems/resolve_several" do |
| 375 | + | |
| 376 | + it "should require at least one problem" do | |
| 377 | + post :resolve_several, :problems => [] | |
| 378 | + request.flash[:notice].should eql I18n.t('controllers.problems.flash.no_select_problem') | |
| 379 | + end | |
| 380 | + | |
| 380 | 381 | it "should resolve the issue" do |
| 381 | 382 | post :resolve_several, :problems => [@problem2.id.to_s] |
| 382 | 383 | @problem2.reload.resolved?.should == true |
| ... | ... | @@ -390,10 +391,17 @@ describe ProblemsController do |
| 390 | 391 | it "should display a message about 2 errs" do |
| 391 | 392 | post :resolve_several, :problems => [@problem1.id.to_s, @problem2.id.to_s] |
| 392 | 393 | flash[:success].should match(/2 errs have been resolved/) |
| 394 | + controller.selected_problems.should == [@problem1, @problem2] | |
| 393 | 395 | end |
| 394 | 396 | end |
| 395 | 397 | |
| 396 | 398 | context "POST /problems/unresolve_several" do |
| 399 | + | |
| 400 | + it "should require at least one problem" do | |
| 401 | + post :unresolve_several, :problems => [] | |
| 402 | + request.flash[:notice].should eql I18n.t('controllers.problems.flash.no_select_problem') | |
| 403 | + end | |
| 404 | + | |
| 397 | 405 | it "should unresolve the issue" do |
| 398 | 406 | post :unresolve_several, :problems => [@problem1.id.to_s] |
| 399 | 407 | @problem1.reload.resolved?.should == false | ... | ... |