Commit 19c83f25410e197512284c9523333fed178dd130
1 parent
6693dd85
Exists in
master
and in
1 other branch
Refactored _issue_tracker_fields.html.haml by moving all field information into …
…issue tracker models. This not only keeps the view DRY, but also streamlines the process of creating new issue trackers. Next step is to write a rails generator so that we can run 'rails generate issue_tracker NewIssueTracker'. Also, this commit contains a fix for the apps/edit page, where issue trackers were not being saved correctly.
Showing
15 changed files
with
204 additions
and
188 deletions
Show diff stats
app/controllers/apps_controller.rb
| @@ -46,7 +46,7 @@ class AppsController < InheritedResources::Base | @@ -46,7 +46,7 @@ class AppsController < InheritedResources::Base | ||
| 46 | protected | 46 | protected |
| 47 | def initialize_subclassed_issue_tracker | 47 | def initialize_subclassed_issue_tracker |
| 48 | if params[:app][:issue_tracker_attributes] && tracker_type = params[:app][:issue_tracker_attributes][:type] | 48 | if params[:app][:issue_tracker_attributes] && tracker_type = params[:app][:issue_tracker_attributes][:type] |
| 49 | - if IssueTracker.subclasses.map(&:to_s).concat(["IssueTracker"]).include?(tracker_type.to_s) | 49 | + if IssueTracker.subclasses.map(&:name).concat(["IssueTracker"]).include?(tracker_type) |
| 50 | @app.issue_tracker = tracker_type.constantize.new(params[:app][:issue_tracker_attributes]) | 50 | @app.issue_tracker = tracker_type.constantize.new(params[:app][:issue_tracker_attributes]) |
| 51 | end | 51 | end |
| 52 | end | 52 | end |
app/models/issue_trackers/fogbugz_tracker.rb
| 1 | class IssueTrackers::FogbugzTracker < IssueTracker | 1 | class IssueTrackers::FogbugzTracker < IssueTracker |
| 2 | Label = "fogbugz" | 2 | Label = "fogbugz" |
| 3 | - RequiredFields = %w(project_id account username password) | 3 | + Fields = [ |
| 4 | + [:project_id, { | ||
| 5 | + :label => "Area Name" | ||
| 6 | + }], | ||
| 7 | + [:account, { | ||
| 8 | + :label => "FogBugz URL", | ||
| 9 | + :placeholder => "abc from http://abc.fogbugz.com/" | ||
| 10 | + }], | ||
| 11 | + [:username, { | ||
| 12 | + :placeholder => "Username/Email for your account" | ||
| 13 | + }], | ||
| 14 | + [:password, { | ||
| 15 | + :placeholder => "Password for your account" | ||
| 16 | + }] | ||
| 17 | + ] | ||
| 4 | 18 | ||
| 5 | def check_params | 19 | def check_params |
| 6 | - if RequiredFields.detect {|f| self[f].blank? } | 20 | + if Fields.detect {|f| self[f[0]].blank? } |
| 7 | errors.add :base, 'You must specify your FogBugz Area Name, FogBugz URL, Username, and Password' | 21 | errors.add :base, 'You must specify your FogBugz Area Name, FogBugz URL, Username, and Password' |
| 8 | end | 22 | end |
| 9 | end | 23 | end |
| @@ -0,0 +1,32 @@ | @@ -0,0 +1,32 @@ | ||
| 1 | +class IssueTrackers::GithubIssuesTracker < IssueTracker | ||
| 2 | + Label = "github" | ||
| 3 | + Fields = [ | ||
| 4 | + [:project_id, { | ||
| 5 | + :label => "Account/Repository", | ||
| 6 | + :placeholder => "errbit/errbit from https://github.com/errbit/errbit" | ||
| 7 | + }], | ||
| 8 | + [:username, { | ||
| 9 | + :placeholder => "Your username on Github" | ||
| 10 | + }], | ||
| 11 | + [:api_token, { | ||
| 12 | + :placeholder => "Your Github API Token" | ||
| 13 | + }] | ||
| 14 | + ] | ||
| 15 | + | ||
| 16 | + def check_params | ||
| 17 | + if Fields.detect {|f| self[f[0]].blank? } | ||
| 18 | + errors.add :base, 'You must specify your Github repository, username and API Token' | ||
| 19 | + end | ||
| 20 | + end | ||
| 21 | + | ||
| 22 | + def create_issue(err) | ||
| 23 | + client = Octokit::Client.new(:login => username, :token => api_token) | ||
| 24 | + issue = client.create_issue(project_id, issue_title(err), body_template.result(binding), options = {}) | ||
| 25 | + err.update_attribute :issue_link, issue.html_url | ||
| 26 | + end | ||
| 27 | + | ||
| 28 | + def body_template | ||
| 29 | + @@body_template ||= ERB.new(File.read(Rails.root + "app/views/issue_trackers/github_issues_body.txt.erb").gsub(/^\s*/, '')) | ||
| 30 | + end | ||
| 31 | +end | ||
| 32 | + |
app/models/issue_trackers/github_tracker.rb
| @@ -1,21 +0,0 @@ | @@ -1,21 +0,0 @@ | ||
| 1 | -class IssueTrackers::GithubTracker < IssueTracker | ||
| 2 | - Label = "github" | ||
| 3 | - RequiredFields = %w(project_id username api_token) | ||
| 4 | - | ||
| 5 | - def check_params | ||
| 6 | - if RequiredFields.detect {|f| self[f].blank? } | ||
| 7 | - errors.add :base, 'You must specify your Github repository, username and API token' | ||
| 8 | - end | ||
| 9 | - end | ||
| 10 | - | ||
| 11 | - def create_issue(err) | ||
| 12 | - client = Octokit::Client.new(:login => username, :token => api_token) | ||
| 13 | - issue = client.create_issue(project_id, issue_title(err), body_template.result(binding), options = {}) | ||
| 14 | - err.update_attribute :issue_link, issue.html_url | ||
| 15 | - end | ||
| 16 | - | ||
| 17 | - def body_template | ||
| 18 | - @@body_template ||= ERB.new(File.read(Rails.root + "app/views/issue_trackers/github_body.txt.erb").gsub(/^\s*/, '')) | ||
| 19 | - end | ||
| 20 | -end | ||
| 21 | - |
app/models/issue_trackers/lighthouse_tracker.rb
| 1 | class IssueTrackers::LighthouseTracker < IssueTracker | 1 | class IssueTrackers::LighthouseTracker < IssueTracker |
| 2 | Label = "lighthouseapp" | 2 | Label = "lighthouseapp" |
| 3 | - RequiredFields = %w(account api_token project_id) | 3 | + Fields = [ |
| 4 | + [:account, { | ||
| 5 | + :placeholder => "abc from abc.lighthouseapp.com" | ||
| 6 | + }], | ||
| 7 | + [:api_token, { | ||
| 8 | + :placeholder => "API Token for your account" | ||
| 9 | + }], | ||
| 10 | + [:project_id, { | ||
| 11 | + :placeholder => "Lighthouse project" | ||
| 12 | + }] | ||
| 13 | + ] | ||
| 4 | 14 | ||
| 5 | def check_params | 15 | def check_params |
| 6 | - if RequiredFields.detect {|f| self[f].blank? } | 16 | + if Fields.detect {|f| self[f[0]].blank? } |
| 7 | errors.add :base, 'You must specify your Lighthouseapp account, API token and Project ID' | 17 | errors.add :base, 'You must specify your Lighthouseapp account, API token and Project ID' |
| 8 | end | 18 | end |
| 9 | end | 19 | end |
app/models/issue_trackers/mingle_tracker.rb
| 1 | class IssueTrackers::MingleTracker < IssueTracker | 1 | class IssueTrackers::MingleTracker < IssueTracker |
| 2 | Label = "mingle" | 2 | Label = "mingle" |
| 3 | - RequiredFields = %w(account project_id username password) | 3 | + Fields = [ |
| 4 | + [:account, { | ||
| 5 | + :label => "Mingle URL", | ||
| 6 | + :placeholder => "abc from http://abc.fogbugz.com/" | ||
| 7 | + }], | ||
| 8 | + [:project_id, { | ||
| 9 | + :placeholder => "Mingle project" | ||
| 10 | + }], | ||
| 11 | + [:ticket_properties, { | ||
| 12 | + :label => "Card Properties (comma separated key=value pairs)", | ||
| 13 | + :placeholder => "card_type = Defect, defect_status = Open, priority = Essential" | ||
| 14 | + }], | ||
| 15 | + [:username, { | ||
| 16 | + :label => "Sign-in name", | ||
| 17 | + :placeholder => "Sign-in name for your account" | ||
| 18 | + }], | ||
| 19 | + [:password, { | ||
| 20 | + :placeholder => "Password for your account" | ||
| 21 | + }] | ||
| 22 | + ] | ||
| 4 | 23 | ||
| 5 | def check_params | 24 | def check_params |
| 6 | - if RequiredFields.detect {|f| self[f].blank? } or !ticket_properties_hash["card_type"] | 25 | + if Fields.detect {|f| self[f[0]].blank? } or !ticket_properties_hash["card_type"] |
| 7 | errors.add :base, 'You must specify your Mingle URL, Project ID, Card Type (in default card properties), Sign-in name, and Password' | 26 | errors.add :base, 'You must specify your Mingle URL, Project ID, Card Type (in default card properties), Sign-in name, and Password' |
| 8 | end | 27 | end |
| 9 | end | 28 | end |
app/models/issue_trackers/pivotal_labs_tracker.rb
| 1 | class IssueTrackers::PivotalLabsTracker < IssueTracker | 1 | class IssueTrackers::PivotalLabsTracker < IssueTracker |
| 2 | Label = "pivotal" | 2 | Label = "pivotal" |
| 3 | - RequiredFields = %w(api_token project_id) | 3 | + Fields = [ |
| 4 | + [:api_token, { | ||
| 5 | + :placeholder => "API Token for your account" | ||
| 6 | + }], | ||
| 7 | + [:project_id, {}] | ||
| 8 | + ] | ||
| 4 | 9 | ||
| 5 | def check_params | 10 | def check_params |
| 6 | - if RequiredFields.detect {|f| self[f].blank? } | 11 | + if Fields.detect {|f| self[f[0]].blank? } |
| 7 | errors.add :base, 'You must specify your Pivotal Tracker API token and Project ID' | 12 | errors.add :base, 'You must specify your Pivotal Tracker API token and Project ID' |
| 8 | end | 13 | end |
| 9 | end | 14 | end |
app/models/issue_trackers/redmine_tracker.rb
| 1 | class IssueTrackers::RedmineTracker < IssueTracker | 1 | class IssueTrackers::RedmineTracker < IssueTracker |
| 2 | Label = "redmine" | 2 | Label = "redmine" |
| 3 | - RequiredFields = %w(account api_token project_id) | 3 | + Fields = [ |
| 4 | + [:account, { | ||
| 5 | + :label => "Redmine URL", | ||
| 6 | + :placeholder => "e.g. http://www.redmine.org/" | ||
| 7 | + }], | ||
| 8 | + [:api_token, { | ||
| 9 | + :placeholder => "API Token for your account" | ||
| 10 | + }], | ||
| 11 | + [:project_id, {}] | ||
| 12 | + ] | ||
| 4 | 13 | ||
| 5 | def check_params | 14 | def check_params |
| 6 | - if RequiredFields.detect {|f| self[f].blank? } | 15 | + if Fields.detect {|f| self[f[0]].blank? } |
| 7 | errors.add :base, 'You must specify your Redmine URL, API token and Project ID' | 16 | errors.add :base, 'You must specify your Redmine URL, API token and Project ID' |
| 8 | end | 17 | end |
| 9 | end | 18 | end |
app/views/apps/_issue_tracker_fields.html.haml
| @@ -6,76 +6,21 @@ | @@ -6,76 +6,21 @@ | ||
| 6 | = label_tag :type_none, :for => label_for_attr(w, 'type_issuetracker'), :class => "label_radio none" do | 6 | = label_tag :type_none, :for => label_for_attr(w, 'type_issuetracker'), :class => "label_radio none" do |
| 7 | = w.radio_button :type, "IssueTracker", 'data-section' => 'none' | 7 | = w.radio_button :type, "IssueTracker", 'data-section' => 'none' |
| 8 | (None) | 8 | (None) |
| 9 | - = label_tag :type_github, :for => label_for_attr(w, 'type_githubtracker'), :class => "label_radio github" do | ||
| 10 | - = w.radio_button :type, "GithubTracker", 'data-section' => 'github' | ||
| 11 | - Github Issues | ||
| 12 | - = label_tag :type_lighthouseapp, :for => label_for_attr(w, 'type_lighthousetracker'), :class => "label_radio lighthouseapp" do | ||
| 13 | - = w.radio_button :type, "LighthouseTracker", 'data-section' => 'lighthouse' | ||
| 14 | - Lighthouse | ||
| 15 | - = label_tag :type_redmine, :for => label_for_attr(w, 'type_redminetracker'), :class => "label_radio redmine" do | ||
| 16 | - = w.radio_button :type, "RedmineTracker", 'data-section' => 'redmine' | ||
| 17 | - Redmine | ||
| 18 | - = label_tag :type_pivotal, :for => label_for_attr(w, 'type_pivotallabstracker'), :class => "label_radio pivotal" do | ||
| 19 | - = w.radio_button :type, "PivotalLabsTracker", 'data-section' => 'pivotal' | ||
| 20 | - Pivotal Tracker | ||
| 21 | - = label_tag :type_fogbugz, :for => label_for_attr(w, 'type_fogbugztracker'), :class => "label_radio fogbugz" do | ||
| 22 | - = w.radio_button :type, "FogbugzTracker", 'data-section' => 'fogbugz' | ||
| 23 | - FogBugz | ||
| 24 | - = label_tag :type_mingle, :for => label_for_attr(w, 'type_mingletracker'), :class => "label_radio mingle" do | ||
| 25 | - = w.radio_button :type, "MingleTracker", 'data-section' => 'mingle' | ||
| 26 | - Mingle | 9 | + - IssueTracker.subclasses.each do |tracker| |
| 10 | + = label_tag "type_#{tracker::Label}:", :for => label_for_attr(w, "type_#{tracker.name.downcase.gsub(':','')}"), :class => "label_radio #{tracker::Label}" do | ||
| 11 | + = w.radio_button :type, tracker.name, 'data-section' => tracker::Label | ||
| 12 | + = tracker.name[/::(.*)Tracker/,1].titleize | ||
| 27 | 13 | ||
| 28 | %div.tracker_params.none{:class => (w.object && !(w.object.class < IssueTracker)) ? 'chosen' : nil} | 14 | %div.tracker_params.none{:class => (w.object && !(w.object.class < IssueTracker)) ? 'chosen' : nil} |
| 29 | %p When no issue tracker has been configured, you will be able to leave comments on errors. | 15 | %p When no issue tracker has been configured, you will be able to leave comments on errors. |
| 30 | - %div.tracker_params.github{:class => w.object.is_a?(GithubTracker) ? 'chosen' : nil} | ||
| 31 | - = w.label :project_id, "Account/Repository" | ||
| 32 | - = w.text_field :project_id, :placeholder => "errbit/errbit from https://github.com/errbit/errbit" | ||
| 33 | - = w.label :username, "Username" | ||
| 34 | - = w.text_field :username, :placeholder => "Your username on Github" | ||
| 35 | - = w.label :api_token, "Token" | ||
| 36 | - = w.text_field :api_token, :placeholder => "Your API Token" | ||
| 37 | - %div.tracker_params.lighthouse{:class => w.object.is_a?(LighthouseTracker) ? 'chosen' : nil} | ||
| 38 | - = w.label :account, "Account" | ||
| 39 | - = w.text_field :account, :placeholder => "abc from abc.lighthouseapp.com" | ||
| 40 | - = w.label :api_token, "API token" | ||
| 41 | - = w.text_field :api_token, :placeholder => "API Token for your account" | ||
| 42 | - = w.label :project_id, "Project ID" | ||
| 43 | - = w.text_field :project_id | ||
| 44 | - %div.tracker_params.redmine{:class => w.object.is_a?(RedmineTracker) ? 'chosen' : nil} | ||
| 45 | - = w.label :account, "Redmine URL" | ||
| 46 | - = w.text_field :account, :placeholder => "like http://www.redmine.org/" | ||
| 47 | - = w.label :api_token, "API token" | ||
| 48 | - = w.text_field :api_token, :placeholder => "API Token for your account" | ||
| 49 | - = w.label :project_id, "Project ID" | ||
| 50 | - = w.text_field :project_id | ||
| 51 | - %div.tracker_params.pivotal{:class => w.object.is_a?(PivotalLabsTracker) ? 'chosen' : nil} | ||
| 52 | - = w.label :project_id, "Project ID" | ||
| 53 | - = w.text_field :project_id | ||
| 54 | - = w.label :api_token, "API token" | ||
| 55 | - = w.text_field :api_token, :placeholder => "API Token for your account" | ||
| 56 | - %div.tracker_params.fogbugz{:class => w.object.is_a?(FogbugzTracker) ? 'chosen' : nil} | ||
| 57 | - = w.label :project_id, "Area Name" | ||
| 58 | - = w.text_field :project_id | ||
| 59 | - = w.label :account, "FogBugz URL" | ||
| 60 | - = w.text_field :account, :placeholder => "abc from http://abc.fogbugz.com/" | ||
| 61 | - = w.label :username, 'Username' | ||
| 62 | - = w.text_field :username, :placeholder => 'Username/Email for your account' | ||
| 63 | - = w.label :password, 'Password' | ||
| 64 | - = w.password_field :password, :placeholder => 'Password for your account' | ||
| 65 | - %div.tracker_params.mingle{:class => w.object.is_a?(MingleTracker) ? 'chosen' : nil} | ||
| 66 | - = w.label :account, "Mingle URL" | ||
| 67 | - = w.text_field :account, :placeholder => "http://mingle.yoursite.com/" | ||
| 68 | - = w.label :project_id, "Project ID" | ||
| 69 | - = w.text_field :project_id | ||
| 70 | - = w.label :ticket_properties, "Card Properties (comma separated key=value pairs)" | ||
| 71 | - = w.text_field :ticket_properties, :placeholder => "card_type = Defect, defect_status = Open, priority = Essential" | ||
| 72 | - = w.label :username, 'Sign-in name' | ||
| 73 | - = w.text_field :username, :placeholder => 'Sign-in name for your account' | ||
| 74 | - = w.label :password, 'Password' | ||
| 75 | - = w.password_field :password, :placeholder => 'Password for your account' | 16 | + - IssueTracker.subclasses.each do |tracker| |
| 17 | + %div.tracker_params{:class => (w.object.is_a?(tracker) ? 'chosen ' : '') << tracker::Label} | ||
| 18 | + - tracker::Fields.each do |field, field_info| | ||
| 19 | + = w.label field, field_info[:label] || field.to_s.titleize | ||
| 20 | + = w.text_field field, :placeholder => field_info[:placeholder] | ||
| 76 | 21 | ||
| 77 | .image_preloader | 22 | .image_preloader |
| 78 | - - %w(none github lighthouseapp redmine pivotal fogbugz mingle).each do |tracker| | 23 | + - (IssueTracker.subclasses.map{|t| t::Label } << 'none').each do |tracker| |
| 79 | = image_tag "#{tracker}_inactive.png" | 24 | = image_tag "#{tracker}_inactive.png" |
| 80 | = image_tag "#{tracker}_create.png" | 25 | = image_tag "#{tracker}_create.png" |
| 81 | 26 |
app/views/issue_trackers/github_body.txt.erb
| @@ -1,45 +0,0 @@ | @@ -1,45 +0,0 @@ | ||
| 1 | -[See this exception on Errbit](<%= app_err_url err.app, err %> "See this exception on Errbit") | ||
| 2 | -<% if notice = err.notices.first %> | ||
| 3 | -# <%= notice.message %> # | ||
| 4 | -## Summary ## | ||
| 5 | -<% if notice.request['url'].present? %> | ||
| 6 | - ### URL ### | ||
| 7 | - [<%= notice.request['url'] %>](<%= notice.request['url'] %>)" | ||
| 8 | -<% end %> | ||
| 9 | -### Where ### | ||
| 10 | -<%= notice.err.where %> | ||
| 11 | - | ||
| 12 | -### Occured ### | ||
| 13 | -<%= notice.created_at.to_s(:micro) %> | ||
| 14 | - | ||
| 15 | -### Similar ### | ||
| 16 | -<%= (notice.err.notices_count - 1).to_s %> | ||
| 17 | - | ||
| 18 | -## Params ## | ||
| 19 | -``` | ||
| 20 | -<%= pretty_hash(notice.params) %> | ||
| 21 | -``` | ||
| 22 | - | ||
| 23 | -## Session ## | ||
| 24 | -``` | ||
| 25 | -<%= pretty_hash(notice.session) %> | ||
| 26 | -``` | ||
| 27 | - | ||
| 28 | -## Backtrace ## | ||
| 29 | -``` | ||
| 30 | -<% for line in notice.backtrace %><%= line['number'] %>: <%= line['file'].sub(/^\[PROJECT_ROOT\]/, '') %> -> **<%= line['method'] %>** | ||
| 31 | -<% end %> | ||
| 32 | -``` | ||
| 33 | - | ||
| 34 | -## Environment ## | ||
| 35 | - | ||
| 36 | -<table> | ||
| 37 | -<% for key, val in notice.env_vars %> | ||
| 38 | - <tr> | ||
| 39 | - <td><%= key %>:</td> | ||
| 40 | - <td><%= val %></td> | ||
| 41 | - </tr> | ||
| 42 | -<% end %> | ||
| 43 | -</table> | ||
| 44 | -<% end %> | ||
| 45 | - |
| @@ -0,0 +1,45 @@ | @@ -0,0 +1,45 @@ | ||
| 1 | +[See this exception on Errbit](<%= app_err_url err.app, err %> "See this exception on Errbit") | ||
| 2 | +<% if notice = err.notices.first %> | ||
| 3 | +# <%= notice.message %> # | ||
| 4 | +## Summary ## | ||
| 5 | +<% if notice.request['url'].present? %> | ||
| 6 | + ### URL ### | ||
| 7 | + [<%= notice.request['url'] %>](<%= notice.request['url'] %>)" | ||
| 8 | +<% end %> | ||
| 9 | +### Where ### | ||
| 10 | +<%= notice.err.where %> | ||
| 11 | + | ||
| 12 | +### Occured ### | ||
| 13 | +<%= notice.created_at.to_s(:micro) %> | ||
| 14 | + | ||
| 15 | +### Similar ### | ||
| 16 | +<%= (notice.err.notices_count - 1).to_s %> | ||
| 17 | + | ||
| 18 | +## Params ## | ||
| 19 | +``` | ||
| 20 | +<%= pretty_hash(notice.params) %> | ||
| 21 | +``` | ||
| 22 | + | ||
| 23 | +## Session ## | ||
| 24 | +``` | ||
| 25 | +<%= pretty_hash(notice.session) %> | ||
| 26 | +``` | ||
| 27 | + | ||
| 28 | +## Backtrace ## | ||
| 29 | +``` | ||
| 30 | +<% for line in notice.backtrace %><%= line['number'] %>: <%= line['file'].sub(/^\[PROJECT_ROOT\]/, '') %> -> **<%= line['method'] %>** | ||
| 31 | +<% end %> | ||
| 32 | +``` | ||
| 33 | + | ||
| 34 | +## Environment ## | ||
| 35 | + | ||
| 36 | +<table> | ||
| 37 | +<% for key, val in notice.env_vars %> | ||
| 38 | + <tr> | ||
| 39 | + <td><%= key %>:</td> | ||
| 40 | + <td><%= val %></td> | ||
| 41 | + </tr> | ||
| 42 | +<% end %> | ||
| 43 | +</table> | ||
| 44 | +<% end %> | ||
| 45 | + |
spec/controllers/apps_controller_spec.rb
| @@ -276,7 +276,7 @@ describe AppsController do | @@ -276,7 +276,7 @@ describe AppsController do | ||
| 276 | IssueTracker.subclasses.each do |tracker_klass| | 276 | IssueTracker.subclasses.each do |tracker_klass| |
| 277 | context tracker_klass do | 277 | context tracker_klass do |
| 278 | it "should save tracker params" do | 278 | it "should save tracker params" do |
| 279 | - params = tracker_klass::RequiredFields.inject({}){|hash,f| hash[f] = "test_value"; hash } | 279 | + params = tracker_klass::Fields.inject({}){|hash,f| hash[f[0]] = "test_value"; hash } |
| 280 | params['ticket_properties'] = "card_type = defect" if tracker_klass == MingleTracker | 280 | params['ticket_properties'] = "card_type = defect" if tracker_klass == MingleTracker |
| 281 | params['type'] = tracker_klass.to_s | 281 | params['type'] = tracker_klass.to_s |
| 282 | put :update, :id => @app.id, :app => {:issue_tracker_attributes => params} | 282 | put :update, :id => @app.id, :app => {:issue_tracker_attributes => params} |
| @@ -284,14 +284,17 @@ describe AppsController do | @@ -284,14 +284,17 @@ describe AppsController do | ||
| 284 | @app.reload | 284 | @app.reload |
| 285 | tracker = @app.issue_tracker | 285 | tracker = @app.issue_tracker |
| 286 | tracker.should be_a(tracker_klass) | 286 | tracker.should be_a(tracker_klass) |
| 287 | - tracker_klass::RequiredFields.each do |required| | ||
| 288 | - tracker.send(required.to_sym).should == 'test_value' | 287 | + tracker_klass::Fields.each do |field, field_info| |
| 288 | + case field | ||
| 289 | + when :ticket_properties; tracker.send(field.to_sym).should == 'card_type = defect' | ||
| 290 | + else tracker.send(field.to_sym).should == 'test_value' | ||
| 291 | + end | ||
| 289 | end | 292 | end |
| 290 | end | 293 | end |
| 291 | 294 | ||
| 292 | it "should show validation notice when sufficient params are not present" do | 295 | it "should show validation notice when sufficient params are not present" do |
| 293 | # Leave out one required param | 296 | # Leave out one required param |
| 294 | - params = tracker_klass::RequiredFields[1..-1].inject({}){|hash,f| hash[f] = "test_value"; hash } | 297 | + params = tracker_klass::Fields[1..-1].inject({}){|hash,f| hash[f[0]] = "test_value"; hash } |
| 295 | params['type'] = tracker_klass.to_s | 298 | params['type'] = tracker_klass.to_s |
| 296 | put :update, :id => @app.id, :app => {:issue_tracker_attributes => params} | 299 | put :update, :id => @app.id, :app => {:issue_tracker_attributes => params} |
| 297 | 300 |
spec/factories/issue_tracker_factories.rb
| @@ -20,7 +20,7 @@ Factory.define :mingle_tracker, :parent => :issue_tracker, :class => :mingle_tra | @@ -20,7 +20,7 @@ Factory.define :mingle_tracker, :parent => :issue_tracker, :class => :mingle_tra | ||
| 20 | e.ticket_properties 'card_type = Defect, defect_status = open, priority = essential' | 20 | e.ticket_properties 'card_type = Defect, defect_status = open, priority = essential' |
| 21 | end | 21 | end |
| 22 | 22 | ||
| 23 | -Factory.define :github_tracker, :parent => :issue_tracker, :class => :github_tracker do |e| | 23 | +Factory.define :github_issues_tracker, :parent => :issue_tracker, :class => :github_issues_tracker do |e| |
| 24 | e.project_id 'test_account/test_project' | 24 | e.project_id 'test_account/test_project' |
| 25 | e.username 'test_username' | 25 | e.username 'test_username' |
| 26 | end | 26 | end |
spec/models/issue_trackers/github_issues_tracker_spec.rb
0 → 100644
| @@ -0,0 +1,41 @@ | @@ -0,0 +1,41 @@ | ||
| 1 | +require 'spec_helper' | ||
| 2 | + | ||
| 3 | +describe GithubIssuesTracker do | ||
| 4 | + it "should create an issue on Github Issues with err params, and set issue link for err" do | ||
| 5 | + notice = Factory :notice | ||
| 6 | + tracker = Factory :github_issues_tracker, :app => notice.err.app | ||
| 7 | + err = notice.err | ||
| 8 | + | ||
| 9 | + number = 5 | ||
| 10 | + @issue_link = "https://github.com/#{tracker.project_id}/issues/#{number}" | ||
| 11 | + body = <<EOF | ||
| 12 | +{ | ||
| 13 | + "issue": { | ||
| 14 | + "position": 1.0, | ||
| 15 | + "number": #{number}, | ||
| 16 | + "votes": 0, | ||
| 17 | + "created_at": "2010/01/21 13:45:59 -0800", | ||
| 18 | + "comments": 0, | ||
| 19 | + "body": "Test Body", | ||
| 20 | + "title": "Test Issue", | ||
| 21 | + "user": "test_user", | ||
| 22 | + "state": "open", | ||
| 23 | + "html_url": "#{@issue_link}" | ||
| 24 | + } | ||
| 25 | +} | ||
| 26 | +EOF | ||
| 27 | + stub_request(:post, "https://#{tracker.username}%2Ftoken:#{tracker.api_token}@github.com/api/v2/json/issues/open/#{tracker.project_id}"). | ||
| 28 | + to_return(:status => 201, :headers => {'Location' => @issue_link}, :body => body ) | ||
| 29 | + | ||
| 30 | + err.app.issue_tracker.create_issue(err) | ||
| 31 | + err.reload | ||
| 32 | + | ||
| 33 | + requested = have_requested(:post, "https://#{tracker.username}%2Ftoken:#{tracker.api_token}@github.com/api/v2/json/issues/open/#{tracker.project_id}") | ||
| 34 | + WebMock.should requested.with(:headers => {'Content-Type' => 'application/x-www-form-urlencoded'}) | ||
| 35 | + WebMock.should requested.with(:body => /title=%5Bproduction%5D%5Bfoo%23bar%5D%20FooError%3A%20Too%20Much%20Bar/) | ||
| 36 | + WebMock.should requested.with(:body => /See%20this%20exception%20on%20Errbit/) | ||
| 37 | + | ||
| 38 | + err.issue_link.should == @issue_link | ||
| 39 | + end | ||
| 40 | +end | ||
| 41 | + |
spec/models/issue_trackers/github_tracker_spec.rb
| @@ -1,41 +0,0 @@ | @@ -1,41 +0,0 @@ | ||
| 1 | -require 'spec_helper' | ||
| 2 | - | ||
| 3 | -describe GithubTracker do | ||
| 4 | - it "should create an issue on Github Issues with err params, and set issue link for err" do | ||
| 5 | - notice = Factory :notice | ||
| 6 | - tracker = Factory :github_tracker, :app => notice.err.app | ||
| 7 | - err = notice.err | ||
| 8 | - | ||
| 9 | - number = 5 | ||
| 10 | - @issue_link = "https://github.com/#{tracker.project_id}/issues/#{number}" | ||
| 11 | - body = <<EOF | ||
| 12 | -{ | ||
| 13 | - "issue": { | ||
| 14 | - "position": 1.0, | ||
| 15 | - "number": #{number}, | ||
| 16 | - "votes": 0, | ||
| 17 | - "created_at": "2010/01/21 13:45:59 -0800", | ||
| 18 | - "comments": 0, | ||
| 19 | - "body": "Test Body", | ||
| 20 | - "title": "Test Issue", | ||
| 21 | - "user": "test_user", | ||
| 22 | - "state": "open", | ||
| 23 | - "html_url": "#{@issue_link}" | ||
| 24 | - } | ||
| 25 | -} | ||
| 26 | -EOF | ||
| 27 | - stub_request(:post, "https://#{tracker.username}%2Ftoken:#{tracker.api_token}@github.com/api/v2/json/issues/open/#{tracker.project_id}"). | ||
| 28 | - to_return(:status => 201, :headers => {'Location' => @issue_link}, :body => body ) | ||
| 29 | - | ||
| 30 | - err.app.issue_tracker.create_issue(err) | ||
| 31 | - err.reload | ||
| 32 | - | ||
| 33 | - requested = have_requested(:post, "https://#{tracker.username}%2Ftoken:#{tracker.api_token}@github.com/api/v2/json/issues/open/#{tracker.project_id}") | ||
| 34 | - WebMock.should requested.with(:headers => {'Content-Type' => 'application/x-www-form-urlencoded'}) | ||
| 35 | - WebMock.should requested.with(:body => /title=%5Bproduction%5D%5Bfoo%23bar%5D%20FooError%3A%20Too%20Much%20Bar/) | ||
| 36 | - WebMock.should requested.with(:body => /See%20this%20exception%20on%20Errbit/) | ||
| 37 | - | ||
| 38 | - err.issue_link.should == @issue_link | ||
| 39 | - end | ||
| 40 | -end | ||
| 41 | - |