Commit d0894cbe2f38472d24a64b400a31136530fef611
1 parent
0b34e1a5
Exists in
master
and in
1 other branch
[WIP] Start refactoring the problems_controller.
1) Limit some before_filter using the expose system 2) Extract some view test in view spec instead of controller spec
Showing
7 changed files
with
102 additions
and
77 deletions
Show diff stats
app/controllers/problems_controller.rb
1 | +## | |
2 | +# Manage problems | |
3 | +# | |
4 | +# List of actions available : | |
5 | +# MEMBER => :show, :edit, :update, :create, :destroy, :resolve, :unresolve, :create_issue, :unlink_issue | |
6 | +# COLLECTION => :index, :all, :destroy_several, :resolve_several, :unresolve_several, :merge_several, :unmerge_several, :search | |
1 | 7 | class ProblemsController < ApplicationController |
2 | - before_filter :find_app, :except => [:index, :all, :destroy_several, :resolve_several, :unresolve_several, :merge_several, :unmerge_several, :search] | |
8 | + | |
3 | 9 | before_filter :find_problem, :except => [:index, :all, :destroy_several, :resolve_several, :unresolve_several, :merge_several, :unmerge_several, :search] |
4 | 10 | before_filter :find_selected_problems, :only => [:destroy_several, :resolve_several, :unresolve_several, :merge_several, :unmerge_several] |
5 | 11 | before_filter :set_sorting_params, :only => [:index, :all, :search] |
6 | 12 | before_filter :set_tracker_params, :only => [:create_issue] |
7 | 13 | |
14 | + expose(:app) { | |
15 | + if current_user.admin? | |
16 | + App.find(params[:app_id]) | |
17 | + else | |
18 | + current_user.apps.find(params[:app_id]) | |
19 | + end | |
20 | + } | |
21 | + | |
8 | 22 | def index |
9 | 23 | app_scope = current_user.admin? ? App.all : current_user.apps |
10 | 24 | @all_errs = params[:all_errs] |
... | ... | @@ -31,12 +45,12 @@ class ProblemsController < ApplicationController |
31 | 45 | flash[:error] = issue_creation.errors[:base].first |
32 | 46 | end |
33 | 47 | |
34 | - redirect_to app_problem_path(@app, @problem) | |
48 | + redirect_to app_problem_path(app, @problem) | |
35 | 49 | end |
36 | 50 | |
37 | 51 | def unlink_issue |
38 | 52 | @problem.update_attribute :issue_link, nil |
39 | - redirect_to app_problem_path(@app, @problem) | |
53 | + redirect_to app_problem_path(app, @problem) | |
40 | 54 | end |
41 | 55 | |
42 | 56 | def resolve |
... | ... | @@ -44,7 +58,7 @@ class ProblemsController < ApplicationController |
44 | 58 | flash[:success] = 'Great news everyone! The err has been resolved.' |
45 | 59 | redirect_to :back |
46 | 60 | rescue ActionController::RedirectBackError |
47 | - redirect_to app_path(@app) | |
61 | + redirect_to app_path(app) | |
48 | 62 | end |
49 | 63 | |
50 | 64 | def resolve_several |
... | ... | @@ -94,16 +108,9 @@ class ProblemsController < ApplicationController |
94 | 108 | end |
95 | 109 | |
96 | 110 | protected |
97 | - def find_app | |
98 | - @app = App.find(params[:app_id]) | |
99 | - | |
100 | - # Mongoid Bug: could not chain: current_user.apps.find_by_id! | |
101 | - # apparently finding by 'watchers.email' and 'id' is broken | |
102 | - raise(Mongoid::Errors::DocumentNotFound.new(App,@app.id)) unless current_user.admin? || current_user.watching?(@app) | |
103 | - end | |
104 | 111 | |
105 | 112 | def find_problem |
106 | - @problem = @app.problems.find(params[:id]) | |
113 | + @problem = app.problems.find(params[:id]) | |
107 | 114 | end |
108 | 115 | |
109 | 116 | def set_tracker_params | ... | ... |
app/views/problems/_issue_tracker_links.html.haml
1 | -- if @app.issue_tracker_configured? || current_user.github_account? | |
1 | +- if app.issue_tracker_configured? || current_user.github_account? | |
2 | 2 | - if @problem.issue_link.present? |
3 | 3 | %span= link_to 'go to issue', @problem.issue_link, :class => "#{@problem.issue_type}_goto goto-issue" |
4 | - = link_to 'unlink issue', unlink_issue_app_problem_path(@app, @problem), :method => :delete, :data => { :confirm => "Unlink err issues?" }, :class => "unlink-issue" | |
4 | + = link_to 'unlink issue', unlink_issue_app_problem_path(app, @problem), :method => :delete, :data => { :confirm => "Unlink err issues?" }, :class => "unlink-issue" | |
5 | 5 | - elsif @problem.issue_link == "pending" |
6 | 6 | %span.disabled= link_to 'creating...', '#', :class => "#{@problem.issue_type}_inactive create-issue" |
7 | - = link_to 'retry', create_issue_app_problem_path(@app, @problem), :method => :post | |
7 | + = link_to 'retry', create_issue_app_problem_path(app, @problem), :method => :post | |
8 | 8 | - else |
9 | - - if @app.github_repo? | |
9 | + - if app.github_repo? | |
10 | 10 | - if current_user.can_create_github_issues? |
11 | - %span= link_to 'create issue', create_issue_app_problem_path(@app, @problem, :tracker => 'user_github'), :method => :post, :class => "github_create create-issue" | |
12 | - - elsif @app.issue_tracker_configured? && @app.issue_tracker.label.eql?('github') | |
13 | - %span= link_to 'create issue', create_issue_app_problem_path(@app, @problem), :method => :post, :class => "github_create create-issue" | |
14 | - - if @app.issue_tracker_configured? && !@app.issue_tracker.label.eql?('github') | |
15 | - %span= link_to 'create issue', create_issue_app_problem_path(@app, @problem), :method => :post, :class => "#{@app.issue_tracker.label}_create create-issue" | |
11 | + %span= link_to 'create issue', create_issue_app_problem_path(app, @problem, :tracker => 'user_github'), :method => :post, :class => "github_create create-issue" | |
12 | + - elsif app.issue_tracker_configured? && app.issue_tracker.label.eql?('github') | |
13 | + %span= link_to 'create issue', create_issue_app_problem_path(app, @problem), :method => :post, :class => "github_create create-issue" | |
14 | + - if app.issue_tracker_configured? && !app.issue_tracker.label.eql?('github') | |
15 | + %span= link_to 'create issue', create_issue_app_problem_path(app, @problem), :method => :post, :class => "#{app.issue_tracker.label}_create create-issue" | ... | ... |
app/views/problems/_list.atom.builder
... | ... | @@ -3,7 +3,7 @@ feed.updated(@problems.first.try(:created_at) || Time.now) |
3 | 3 | for problem in @problems |
4 | 4 | notice = problem.notices.first |
5 | 5 | |
6 | - feed.entry(problem, :url => app_problem_url(problem.app, problem)) do |entry| | |
6 | + feed.entry(problem, :url => app_problem_url(problem.app.to_param, problem.to_param)) do |entry| | |
7 | 7 | entry.title "[#{ problem.where }] #{problem.message.to_s.truncate(27)}" |
8 | 8 | entry.author do |author| |
9 | 9 | author.name "#{ problem.app.name } [#{ problem.environment }]" | ... | ... |
app/views/problems/show.html.haml
... | ... | @@ -3,7 +3,7 @@ |
3 | 3 | - content_for :title, @problem.error_class || truncate(@problem.message, :length => 32) |
4 | 4 | - content_for :meta do |
5 | 5 | %strong App: |
6 | - = link_to @app.name, @app | |
6 | + = link_to app.name, app | |
7 | 7 | %strong Where: |
8 | 8 | = @problem.where |
9 | 9 | %br |
... | ... | @@ -13,10 +13,10 @@ |
13 | 13 | = @problem.last_notice_at.to_s(:precise) |
14 | 14 | - content_for :action_bar do |
15 | 15 | - if @problem.unresolved? |
16 | - %span= link_to 'resolve', [:resolve, @app, @problem], :method => :put, :data => { :confirm => problem_confirm }, :class => 'resolve' | |
16 | + %span= link_to 'resolve', [:resolve, app, @problem], :method => :put, :data => { :confirm => problem_confirm }, :class => 'resolve' | |
17 | 17 | - if current_user.authentication_token |
18 | - %span= link_to 'iCal', polymorphic_path([@app, @problem], :format => "ics", :auth_token => current_user.authentication_token), :class => "calendar_link" | |
19 | - %span>= link_to 'up', (request.env['HTTP_REFERER'] ? :back : app_problems_path(@app)), :class => 'up' | |
18 | + %span= link_to 'iCal', polymorphic_path([app, @problem], :format => "ics", :auth_token => current_user.authentication_token), :class => "calendar_link" | |
19 | + %span>= link_to 'up', (request.env['HTTP_REFERER'] ? :back : app_problems_path(app)), :class => 'up' | |
20 | 20 | %br |
21 | 21 | = render "issue_tracker_links" |
22 | 22 | |
... | ... | @@ -37,11 +37,11 @@ |
37 | 37 | - else |
38 | 38 | %span.comment-info |
39 | 39 | = time_ago_in_words(comment.created_at, true) << " ago by [Unknown User]" |
40 | - %span.delete= link_to '✘'.html_safe, [@app, @problem, comment], :method => :delete, :data => { :confirm => "Are you sure you don't need this comment?" }, :class => "destroy-comment" | |
40 | + %span.delete= link_to '✘'.html_safe, [app, @problem, comment], :method => :delete, :data => { :confirm => "Are you sure you don't need this comment?" }, :class => "destroy-comment" | |
41 | 41 | %tr |
42 | 42 | %td= simple_format comment.body |
43 | 43 | - if @problem.comments_allowed? |
44 | - = form_for [@app, @problem, @comment] do |comment_form| | |
44 | + = form_for [app, @problem, @comment] do |comment_form| | |
45 | 45 | %p Add a comment |
46 | 46 | = comment_form.text_area :body |
47 | 47 | = comment_form.submit "Save Comment" | ... | ... |
spec/controllers/problems_controller_spec.rb
... | ... | @@ -12,7 +12,7 @@ describe ProblemsController do |
12 | 12 | |
13 | 13 | |
14 | 14 | describe "GET /problems" do |
15 | - render_views | |
15 | + #render_views | |
16 | 16 | context 'when logged in as an admin' do |
17 | 17 | before(:each) do |
18 | 18 | @user = Fabricate(:admin) |
... | ... | @@ -20,18 +20,6 @@ describe ProblemsController do |
20 | 20 | @problem = Fabricate(:notice, :err => Fabricate(:err, :problem => Fabricate(:problem, :app => app, :environment => "production"))).problem |
21 | 21 | end |
22 | 22 | |
23 | - it "should successfully list problems" do | |
24 | - get :index | |
25 | - response.should be_success | |
26 | - response.body.gsub("​", "").should match(@problem.message) | |
27 | - end | |
28 | - | |
29 | - it "should list atom feed successfully" do | |
30 | - get :index, :format => "atom" | |
31 | - response.should be_success | |
32 | - response.body.should match(@problem.message) | |
33 | - end | |
34 | - | |
35 | 23 | context "pagination" do |
36 | 24 | before(:each) do |
37 | 25 | 35.times { Fabricate :err } |
... | ... | @@ -136,7 +124,7 @@ describe ProblemsController do |
136 | 124 | end |
137 | 125 | |
138 | 126 | describe "GET /apps/:app_id/problems/:id" do |
139 | - render_views | |
127 | + #render_views | |
140 | 128 | |
141 | 129 | context 'when logged in as an admin' do |
142 | 130 | before do |
... | ... | @@ -145,7 +133,7 @@ describe ProblemsController do |
145 | 133 | |
146 | 134 | it "finds the app" do |
147 | 135 | get :show, :app_id => app.id, :id => err.problem.id |
148 | - assigns(:app).should == app | |
136 | + controller.app.should == app | |
149 | 137 | end |
150 | 138 | |
151 | 139 | it "finds the problem" do |
... | ... | @@ -178,32 +166,6 @@ describe ProblemsController do |
178 | 166 | end |
179 | 167 | end |
180 | 168 | |
181 | - context "create issue button" do | |
182 | - let(:button_matcher) { match(/create issue/) } | |
183 | - | |
184 | - it "should not exist for problem's app without issue tracker" do | |
185 | - err = Fabricate :err | |
186 | - get :show, :app_id => err.app.id, :id => err.problem.id | |
187 | - | |
188 | - response.body.should_not button_matcher | |
189 | - end | |
190 | - | |
191 | - it "should exist for problem's app with issue tracker" do | |
192 | - tracker = Fabricate(:lighthouse_tracker) | |
193 | - err = Fabricate(:err, :problem => Fabricate(:problem, :app => tracker.app)) | |
194 | - get :show, :app_id => err.app.id, :id => err.problem.id | |
195 | - | |
196 | - response.body.should button_matcher | |
197 | - end | |
198 | - | |
199 | - it "should not exist for problem with issue_link" do | |
200 | - tracker = Fabricate(:lighthouse_tracker) | |
201 | - err = Fabricate(:err, :problem => Fabricate(:problem, :app => tracker.app, :issue_link => "http://some.host")) | |
202 | - get :show, :app_id => err.app.id, :id => err.problem.id | |
203 | - | |
204 | - response.body.should_not button_matcher | |
205 | - end | |
206 | - end | |
207 | 169 | end |
208 | 170 | |
209 | 171 | context 'when logged in as a user' do |
... | ... | @@ -242,7 +204,7 @@ describe ProblemsController do |
242 | 204 | App.should_receive(:find).with(@problem.app.id).and_return(@problem.app) |
243 | 205 | @problem.app.problems.should_receive(:find).and_return(@problem.problem) |
244 | 206 | put :resolve, :app_id => @problem.app.id, :id => @problem.problem.id |
245 | - assigns(:app).should == @problem.app | |
207 | + controller.app.should == @problem.app | |
246 | 208 | assigns(:problem).should == @problem.problem |
247 | 209 | end |
248 | 210 | |
... | ... | @@ -269,7 +231,7 @@ describe ProblemsController do |
269 | 231 | end |
270 | 232 | |
271 | 233 | describe "POST /apps/:app_id/problems/:id/create_issue" do |
272 | - render_views | |
234 | + #render_views | |
273 | 235 | |
274 | 236 | before(:each) do |
275 | 237 | sign_in Fabricate(:admin) | ... | ... |
... | ... | @@ -0,0 +1,14 @@ |
1 | +require 'spec_helper' | |
2 | + | |
3 | +describe "problems/index.atom.builder" do | |
4 | + | |
5 | + it 'display problem message' do | |
6 | + app = App.new(:new_record => false) | |
7 | + assign(:problems, [Problem.new( | |
8 | + :message => 'foo', | |
9 | + :new_record => false, :app => app), Problem.new(:new_record => false, :app => app)]) | |
10 | + render | |
11 | + rendered.should match('foo') | |
12 | + end | |
13 | + | |
14 | +end | ... | ... |
spec/views/problems/show.html.haml_spec.rb
... | ... | @@ -6,7 +6,7 @@ describe "problems/show.html.haml" do |
6 | 6 | comment = Fabricate(:comment) |
7 | 7 | assign :problem, problem |
8 | 8 | assign :comment, comment |
9 | - assign :app, problem.app | |
9 | + view.stub(:app).and_return(problem.app) | |
10 | 10 | assign :notices, problem.notices.page(1).per(1) |
11 | 11 | assign :notice, problem.notices.first |
12 | 12 | controller.stub(:current_user) { Fabricate(:user) } |
... | ... | @@ -15,7 +15,7 @@ describe "problems/show.html.haml" do |
15 | 15 | def with_issue_tracker(tracker, problem) |
16 | 16 | problem.app.issue_tracker = tracker.new :api_token => "token token token", :project_id => "1234" |
17 | 17 | assign :problem, problem |
18 | - assign :app, problem.app | |
18 | + view.stub(:app).and_return(problem.app) | |
19 | 19 | end |
20 | 20 | |
21 | 21 | describe "content_for :action_bar" do |
... | ... | @@ -55,7 +55,7 @@ describe "problems/show.html.haml" do |
55 | 55 | controller.request.env['HTTP_REFERER'] = nil |
56 | 56 | problem = Fabricate(:problem_with_comments) |
57 | 57 | assign :problem, problem |
58 | - assign :app, problem.app | |
58 | + view.stub(:app).and_return(problem.app) | |
59 | 59 | render |
60 | 60 | |
61 | 61 | action_bar.should have_selector("span a.up[href='#{app_problems_path(problem.app)}']", :text => 'up') |
... | ... | @@ -68,7 +68,7 @@ describe "problems/show.html.haml" do |
68 | 68 | |
69 | 69 | problem = Fabricate(:problem_with_comments, :app => Fabricate(:app, :github_repo => "test_user/test_repo")) |
70 | 70 | assign :problem, problem |
71 | - assign :app, problem.app | |
71 | + view.stub(:app).and_return(problem.app) | |
72 | 72 | render |
73 | 73 | |
74 | 74 | action_bar.should have_selector("span a.github_create.create-issue", :text => 'create issue') |
... | ... | @@ -78,11 +78,53 @@ describe "problems/show.html.haml" do |
78 | 78 | problem = Fabricate(:problem_with_comments, :app => Fabricate(:app, :github_repo => "test_user/test_repo")) |
79 | 79 | with_issue_tracker(GithubIssuesTracker, problem) |
80 | 80 | assign :problem, problem |
81 | - assign :app, problem.app | |
81 | + view.stub(:app).and_return(problem.app) | |
82 | 82 | render |
83 | 83 | |
84 | 84 | action_bar.should have_selector("span a.github_create.create-issue", :text => 'create issue') |
85 | 85 | end |
86 | + | |
87 | + context "without issue tracker associate on app" do | |
88 | + let(:problem){ Problem.new(:new_record => false, :app => app) } | |
89 | + let(:app) { App.new(:new_record => false) } | |
90 | + | |
91 | + it 'not see link to create issue' do | |
92 | + assign :problem, problem | |
93 | + view.stub(:app).and_return(problem.app) | |
94 | + render | |
95 | + expect(view.content_for(:action_bar)).to_not match(/create issue/) | |
96 | + end | |
97 | + | |
98 | + end | |
99 | + | |
100 | + context "with lighthouse tracker on app" do | |
101 | + let(:app) { App.new(:new_record => false, :issue_tracker => tracker ) } | |
102 | + let(:tracker) { | |
103 | + IssueTrackers::LighthouseTracker.new(:project_id => 'x') | |
104 | + } | |
105 | + context "with problem without issue link" do | |
106 | + let(:problem){ Problem.new(:new_record => false, :app => app) } | |
107 | + it 'not see link if no issue tracker' do | |
108 | + assign :problem, problem | |
109 | + view.stub(:app).and_return(problem.app) | |
110 | + render | |
111 | + expect(view.content_for(:action_bar)).to match(/create issue/) | |
112 | + end | |
113 | + | |
114 | + end | |
115 | + | |
116 | + context "with problem with issue link" do | |
117 | + let(:problem){ Problem.new(:new_record => false, :app => app, :issue_link => 'http://foo') } | |
118 | + | |
119 | + it 'not see link if no issue tracker' do | |
120 | + assign :problem, problem | |
121 | + view.stub(:app).and_return(problem.app) | |
122 | + render | |
123 | + expect(view.content_for(:action_bar)).to_not match(/create issue/) | |
124 | + end | |
125 | + end | |
126 | + | |
127 | + end | |
86 | 128 | end |
87 | 129 | end |
88 | 130 | |
... | ... | @@ -95,7 +137,7 @@ describe "problems/show.html.haml" do |
95 | 137 | it 'should display comments and new comment form when no issue tracker' do |
96 | 138 | problem = Fabricate(:problem_with_comments) |
97 | 139 | assign :problem, problem |
98 | - assign :app, problem.app | |
140 | + view.stub(:app).and_return(problem.app) | |
99 | 141 | render |
100 | 142 | |
101 | 143 | view.content_for(:comments).should include('Test comment') | ... | ... |