diff --git a/app/controllers/problems_controller.rb b/app/controllers/problems_controller.rb index ce18d19..4e22e02 100644 --- a/app/controllers/problems_controller.rb +++ b/app/controllers/problems_controller.rb @@ -54,6 +54,13 @@ class ProblemsController < ApplicationController @comment = Comment.new end + def close_issue + issue = Issue.new(problem: problem, user: current_user) + flash[:error] = issue.errors.full_messages.join(', ') unless issue.close + + redirect_to app_problem_path(app, problem) + end + def create_issue issue = Issue.new(problem: problem, user: current_user) issue.body = render_to_string(*issue.render_body_args) diff --git a/app/models/issue.rb b/app/models/issue.rb index 80a6933..bac9b01 100644 --- a/app/models/issue.rb +++ b/app/models/issue.rb @@ -26,6 +26,23 @@ class Issue end end + def close + errors.add :base, "This app has no issue tracker" unless issue_tracker + return false if errors.present? + + tracker.errors.each { |k, err| errors.add k, err } + return false if errors.present? + + if issue_tracker.respond_to? :close_issue + url = issue_tracker.close_issue(problem.issue_link, user: user.as_document) + end + + errors.empty? + rescue => ex + errors.add :base, "There was an error during issue closing: #{ex.message}" + false + end + def save errors.add :base, "The issue has no body" unless body errors.add :base, "This app has no issue tracker" unless issue_tracker diff --git a/app/models/issue_tracker.rb b/app/models/issue_tracker.rb index 0cc7c11..33999a4 100644 --- a/app/models/issue_tracker.rb +++ b/app/models/issue_tracker.rb @@ -36,5 +36,6 @@ class IssueTracker delegate :configured?, to: :tracker delegate :create_issue, to: :tracker + delegate :close_issue, to: :tracker delegate :url, to: :tracker end diff --git a/app/views/problems/_issue_tracker_links.html.haml b/app/views/problems/_issue_tracker_links.html.haml index 850368a..f940836 100644 --- a/app/views/problems/_issue_tracker_links.html.haml +++ b/app/views/problems/_issue_tracker_links.html.haml @@ -6,6 +6,11 @@ %img.button-icon{"src" => tracker_type.icons[:create]} = link_to 'go to issue', problem.issue_link, :class => "goto-issue" = link_to 'unlink issue', unlink_issue_app_problem_path(app, problem), :method => :delete, :data => { :confirm => "Unlink err issues?" }, :class => "unlink-issue" + - if tracker.tracker.respond_to? :close_issue + %span + = link_to close_issue_app_problem_path(app, problem), method: :post, :class => "close-issue" do + %img.button-icon{"src" => tracker_type.icons[:create]} + close issue - elsif problem.issue_link == "pending" %span.disabled %img.button-icon{"src" => tracker_type.icons[:inactive]} diff --git a/config/routes.rb b/config/routes.rb index c439c90..77c0b20 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -42,6 +42,7 @@ Rails.application.routes.draw do put :resolve put :unresolve post :create_issue + post :close_issue delete :unlink_issue end end diff --git a/spec/controllers/problems_controller_spec.rb b/spec/controllers/problems_controller_spec.rb index 5afecfa..10ef83a 100644 --- a/spec/controllers/problems_controller_spec.rb +++ b/spec/controllers/problems_controller_spec.rb @@ -262,6 +262,40 @@ describe ProblemsController, type: 'controller' do end end + describe "POST /apps/:app_id/problems/:id/close_issue" do + before { sign_in user } + + context "when app has a issue tracker" do + let(:notice) { NoticeDecorator.new(Fabricate :notice) } + let(:problem) { ProblemDecorator.new(notice.problem) } + let(:issue_tracker) do + Fabricate(:issue_tracker).tap do |t| + t.instance_variable_set(:@tracker, ErrbitPlugin::MockIssueTracker.new(t.options)) + end + end + + before do + problem.app.issue_tracker = issue_tracker + allow(controller).to receive(:problem).and_return(problem) + allow(controller).to receive(:current_user).and_return(user) + end + + it "should redirect to problem page" do + post :close_issue, app_id: problem.app.id, id: problem.id + expect(response).to redirect_to(app_problem_path(problem.app, problem)) + expect(flash[:error]).to be_blank + end + end + + context "when app has no issue tracker" do + it "should redirect to problem page" do + post :close_issue, app_id: problem.app.id, id: problem.id + expect(response).to redirect_to(app_problem_path(problem.app, problem)) + expect(flash[:error]).to eql "This app has no issue tracker" + end + end + end + describe "DELETE /apps/:app_id/problems/:id/unlink_issue" do before(:each) do sign_in user diff --git a/spec/errbit_plugin/mock_issue_tracker.rb b/spec/errbit_plugin/mock_issue_tracker.rb index 1757789..1925dc5 100644 --- a/spec/errbit_plugin/mock_issue_tracker.rb +++ b/spec/errbit_plugin/mock_issue_tracker.rb @@ -38,6 +38,11 @@ module ErrbitPlugin "http://example.com/mock-errbit" end + def close_issue(url, user) + @output << [url, user] + "http://example.com/mock-errbit" + end + def url '' end -- libgit2 0.21.2