diff --git a/app/controllers/problems_controller.rb b/app/controllers/problems_controller.rb index 5821a4e..554ee26 100644 --- a/app/controllers/problems_controller.rb +++ b/app/controllers/problems_controller.rb @@ -61,10 +61,9 @@ class ProblemsController < ApplicationController end def create_issue - body = render_to_string "issue_trackers/issue", layout: false, formats: [:md] - title = "[#{ problem.environment }][#{ problem.where }] #{problem.message.to_s.truncate(100)}" + issue = Issue.new(problem: problem, user: current_user) + issue.body = render_to_string(*issue.render_body_args) - issue = Issue.new(problem: problem, user: current_user, title: title, body: body) unless issue.save flash[:error] = issue.errors.full_messages.join(', ') end diff --git a/app/models/issue.rb b/app/models/issue.rb index 2ca8420..d85dd24 100644 --- a/app/models/issue.rb +++ b/app/models/issue.rb @@ -1,33 +1,41 @@ class Issue include ActiveModel::Model - attr_accessor :problem, :user, :title, :body + attr_accessor :problem, :user, :body def issue_tracker - problem.app.issue_tracker + @issue_tracker ||= problem.app.issue_tracker end - def save - unless body - errors.add :base, "The issue has no body" - return false - end + def tracker + @tracker ||= issue_tracker && issue_tracker.tracker + end - unless title - errors.add :base, "The issue has no title" - return false + def render_body_args + if tracker.respond_to?(:render_body_args) + tracker.render_body_args + else + [ 'issue_trackers/issue', formats: [:md] ] end + end - if issue_tracker - issue_tracker.tracker.errors.each do |k, err| - errors.add k, err - end - return false if errors.present? - - url = issue_tracker.create_issue(title, body, user: user.as_document) - problem.update_attributes(issue_link: url, issue_type: issue_tracker.tracker.class.label) + def title + if tracker.respond_to?(:title) + tracker.title else - errors.add :base, "This app has no issue tracker setup." + "[#{ problem.environment }][#{ problem.where }] #{problem.message.to_s.truncate(100)}" end + 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 + return false if errors.present? + + tracker.errors.each { |k, err| errors.add k, err } + return false if errors.present? + + url = issue_tracker.create_issue(title, body, user: user.as_document) + problem.update_attributes(issue_link: url, issue_type: tracker.class.label) errors.empty? rescue => ex diff --git a/spec/controllers/problems_controller_spec.rb b/spec/controllers/problems_controller_spec.rb index 24f86d0..f2a002d 100644 --- a/spec/controllers/problems_controller_spec.rb +++ b/spec/controllers/problems_controller_spec.rb @@ -290,7 +290,6 @@ describe ProblemsController, type: 'controller' do expect(problem.issue_type).to eq("mock") end - context "when rendering views" do render_views @@ -299,6 +298,14 @@ describe ProblemsController, type: 'controller' do line = issue_tracker.tracker.output.shift expect(line[1]).to include(app_problem_url problem.app, problem) end + + it "should render whatever the issue tracker says" do + allow_any_instance_of(Issue).to receive(:render_body_args).and_return( + [{ :inline => 'one <%= problem.id %> two' }]) + post :create_issue, app_id: problem.app.id, id: problem.id, format: 'html' + line = issue_tracker.tracker.output.shift + expect(line[1]).to eq("one #{problem.id} two") + end end end @@ -306,7 +313,7 @@ describe ProblemsController, type: 'controller' do it "should redirect to problem page" do post :create_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 setup." + expect(flash[:error]).to eql "This app has no issue tracker" end end end diff --git a/spec/models/issue_spec.rb b/spec/models/issue_spec.rb index 726d28a..05abafe 100644 --- a/spec/models/issue_spec.rb +++ b/spec/models/issue_spec.rb @@ -1,5 +1,5 @@ describe Issue, type: 'model' do - subject(:issue) { Issue.new(problem: problem, user: user, title: title, body: body) } + subject(:issue) { Issue.new(problem: problem, user: user, body: body) } let(:problem) { notice.problem } let(:notice) { Fabricate(:notice) } @@ -12,7 +12,6 @@ describe Issue, type: 'model' do let(:errors) { issue.errors[:base] } context "when app has no issue tracker" do - let(:title) { "Foo" } let(:body) { "barrr" } context "#save" do @@ -22,29 +21,12 @@ describe Issue, type: 'model' do it "returns an error" do issue.save - expect(errors).to include("This app has no issue tracker setup.") - end - end - end - - context "when has no title" do - let(:title) { nil } - let(:body) { "barrr" } - - context "#save" do - it "returns false" do - expect(issue.save).to be false - end - - it "returns an error" do - issue.save - expect(errors).to include("The issue has no title") + expect(errors).to include("This app has no issue tracker") end end end context "when has no body" do - let(:title) { "Foo" } let(:body) { nil } context "#save" do @@ -60,15 +42,38 @@ describe Issue, type: 'model' do end context "when app has a issue tracker" do - let(:title) { "Foo" } let(:body) { "barrr" } before do problem.app.issue_tracker = issue_tracker end - context "#save" do + context "#render_body_args" do + it "returns custom args if they exist" do + allow(issue.tracker).to receive(:render_body_args).and_return( + [ 'my', { custom: 'args' } ] + ) + expect(issue.render_body_args).to eq [ 'my', { custom: 'args' } ] + end + + it "returns default args if none exist" do + expect(issue.render_body_args).to eq [ + 'issue_trackers/issue', formats: [:md] ] + end + end + context "#title" do + it "returns custom title if it exists" do + allow(issue.tracker).to receive(:title).and_return('kustomtitle') + expect(issue.title).to eq('kustomtitle') + end + + it "returns default title when tracker has none" do + expect(issue.title).to include(problem.message.to_s) + end + end + + context "#save" do context "when issue tracker has errors" do before do issue_tracker.tracker.options.clear @@ -94,7 +99,7 @@ describe Issue, type: 'model' do it "sends the title" do issue.save saved_issue = issue_tracker.tracker.output.first - expect(saved_issue.first).to be title + expect(saved_issue.first).to eq issue.title end it "sends the body" do -- libgit2 0.21.2