Skip to content

Commit 463c5a9

Browse files
committed
support errbit#371 close issue
1 parent ae91fcb commit 463c5a9

File tree

7 files changed

+70
-0
lines changed

7 files changed

+70
-0
lines changed

app/controllers/problems_controller.rb

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,13 @@ def show
5454
@comment = Comment.new
5555
end
5656

57+
def close_issue
58+
issue = Issue.new(problem: problem, user: current_user)
59+
flash[:error] = issue.errors.full_messages.join(', ') unless issue.close
60+
61+
redirect_to app_problem_path(app, problem)
62+
end
63+
5764
def create_issue
5865
issue = Issue.new(problem: problem, user: current_user)
5966
issue.body = render_to_string(*issue.render_body_args)

app/models/issue.rb

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,23 @@ def title
2626
end
2727
end
2828

29+
def close
30+
errors.add :base, "This app has no issue tracker" unless issue_tracker
31+
return false if errors.present?
32+
33+
tracker.errors.each { |k, err| errors.add k, err }
34+
return false if errors.present?
35+
36+
if issue_tracker.respond_to? :close_issue
37+
url = issue_tracker.close_issue(problem.issue_link, user: user.as_document)
38+
end
39+
40+
errors.empty?
41+
rescue => ex
42+
errors.add :base, "There was an error during issue closing: #{ex.message}"
43+
false
44+
end
45+
2946
def save
3047
errors.add :base, "The issue has no body" unless body
3148
errors.add :base, "This app has no issue tracker" unless issue_tracker

app/models/issue_tracker.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,5 +36,6 @@ def validate_tracker
3636

3737
delegate :configured?, to: :tracker
3838
delegate :create_issue, to: :tracker
39+
delegate :close_issue, to: :tracker
3940
delegate :url, to: :tracker
4041
end

app/views/problems/_issue_tracker_links.html.haml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,11 @@
66
%img.button-icon{"src" => tracker_type.icons[:create]}
77
= link_to 'go to issue', problem.issue_link, :class => "goto-issue"
88
= link_to 'unlink issue', unlink_issue_app_problem_path(app, problem), :method => :delete, :data => { :confirm => "Unlink err issues?" }, :class => "unlink-issue"
9+
- if tracker.tracker.respond_to? :close_issue
10+
%span
11+
= link_to close_issue_app_problem_path(app, problem), method: :post, :class => "close-issue" do
12+
%img.button-icon{"src" => tracker_type.icons[:create]}
13+
close issue
914
- elsif problem.issue_link == "pending"
1015
%span.disabled
1116
%img.button-icon{"src" => tracker_type.icons[:inactive]}

config/routes.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
put :resolve
4343
put :unresolve
4444
post :create_issue
45+
post :close_issue
4546
delete :unlink_issue
4647
end
4748
end

spec/controllers/problems_controller_spec.rb

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,40 @@
262262
end
263263
end
264264

265+
describe "POST /apps/:app_id/problems/:id/close_issue" do
266+
before { sign_in user }
267+
268+
context "when app has a issue tracker" do
269+
let(:notice) { NoticeDecorator.new(Fabricate :notice) }
270+
let(:problem) { ProblemDecorator.new(notice.problem) }
271+
let(:issue_tracker) do
272+
Fabricate(:issue_tracker).tap do |t|
273+
t.instance_variable_set(:@tracker, ErrbitPlugin::MockIssueTracker.new(t.options))
274+
end
275+
end
276+
277+
before do
278+
problem.app.issue_tracker = issue_tracker
279+
allow(controller).to receive(:problem).and_return(problem)
280+
allow(controller).to receive(:current_user).and_return(user)
281+
end
282+
283+
it "should redirect to problem page" do
284+
post :close_issue, app_id: problem.app.id, id: problem.id
285+
expect(response).to redirect_to(app_problem_path(problem.app, problem))
286+
expect(flash[:error]).to be_blank
287+
end
288+
end
289+
290+
context "when app has no issue tracker" do
291+
it "should redirect to problem page" do
292+
post :close_issue, app_id: problem.app.id, id: problem.id
293+
expect(response).to redirect_to(app_problem_path(problem.app, problem))
294+
expect(flash[:error]).to eql "This app has no issue tracker"
295+
end
296+
end
297+
end
298+
265299
describe "DELETE /apps/:app_id/problems/:id/unlink_issue" do
266300
before(:each) do
267301
sign_in user

spec/errbit_plugin/mock_issue_tracker.rb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,11 @@ def create_issue(title, body, user)
3838
"http://example.com/mock-errbit"
3939
end
4040

41+
def close_issue(url, user)
42+
@output << [url, user]
43+
"http://example.com/mock-errbit"
44+
end
45+
4146
def url
4247
''
4348
end

0 commit comments

Comments
 (0)