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 | - |