exception_hub 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. data/.gitignore +19 -0
  2. data/.rspec +2 -0
  3. data/.rvmrc +1 -0
  4. data/Gemfile +16 -0
  5. data/Guardfile +24 -0
  6. data/LICENSE +22 -0
  7. data/README.md +43 -0
  8. data/Rakefile +10 -0
  9. data/exception_hub.gemspec +23 -0
  10. data/lib/exception_hub/client/authorization.rb +26 -0
  11. data/lib/exception_hub/client.rb +26 -0
  12. data/lib/exception_hub/configuration.rb +81 -0
  13. data/lib/exception_hub/interceptor.rb +34 -0
  14. data/lib/exception_hub/issue.rb +25 -0
  15. data/lib/exception_hub/notifier.rb +64 -0
  16. data/lib/exception_hub/rack.rb +27 -0
  17. data/lib/exception_hub/rails/controller_interceptor.rb +21 -0
  18. data/lib/exception_hub/rails/middleware/exceptions_interceptor.rb +22 -0
  19. data/lib/exception_hub/railtie.rb +24 -0
  20. data/lib/exception_hub/rake_task.rb +27 -0
  21. data/lib/exception_hub/version.rb +3 -0
  22. data/lib/exception_hub.rb +20 -0
  23. data/lib/tasks/exception_hub.rake +3 -0
  24. data/spec/integration/exception_hub_integration/.gitignore +17 -0
  25. data/spec/integration/exception_hub_integration/Gemfile +40 -0
  26. data/spec/integration/exception_hub_integration/README.rdoc +261 -0
  27. data/spec/integration/exception_hub_integration/Rakefile +7 -0
  28. data/spec/integration/exception_hub_integration/app/assets/images/rails.png +0 -0
  29. data/spec/integration/exception_hub_integration/app/assets/javascripts/application.js +15 -0
  30. data/spec/integration/exception_hub_integration/app/assets/stylesheets/application.css +13 -0
  31. data/spec/integration/exception_hub_integration/app/controllers/application_controller.rb +3 -0
  32. data/spec/integration/exception_hub_integration/app/controllers/errors_controller.rb +5 -0
  33. data/spec/integration/exception_hub_integration/app/helpers/application_helper.rb +2 -0
  34. data/spec/integration/exception_hub_integration/app/mailers/.gitkeep +0 -0
  35. data/spec/integration/exception_hub_integration/app/models/.gitkeep +0 -0
  36. data/spec/integration/exception_hub_integration/app/views/layouts/application.html.erb +14 -0
  37. data/spec/integration/exception_hub_integration/config/application.rb +62 -0
  38. data/spec/integration/exception_hub_integration/config/boot.rb +6 -0
  39. data/spec/integration/exception_hub_integration/config/database.yml +25 -0
  40. data/spec/integration/exception_hub_integration/config/environment.rb +5 -0
  41. data/spec/integration/exception_hub_integration/config/environments/development.rb +37 -0
  42. data/spec/integration/exception_hub_integration/config/environments/production.rb +67 -0
  43. data/spec/integration/exception_hub_integration/config/environments/test.rb +37 -0
  44. data/spec/integration/exception_hub_integration/config/initializers/backtrace_silencers.rb +7 -0
  45. data/spec/integration/exception_hub_integration/config/initializers/inflections.rb +15 -0
  46. data/spec/integration/exception_hub_integration/config/initializers/mime_types.rb +5 -0
  47. data/spec/integration/exception_hub_integration/config/initializers/secret_token.rb +7 -0
  48. data/spec/integration/exception_hub_integration/config/initializers/session_store.rb +8 -0
  49. data/spec/integration/exception_hub_integration/config/initializers/wrap_parameters.rb +14 -0
  50. data/spec/integration/exception_hub_integration/config/locales/en.yml +5 -0
  51. data/spec/integration/exception_hub_integration/config/routes.rb +59 -0
  52. data/spec/integration/exception_hub_integration/config.ru +4 -0
  53. data/spec/integration/exception_hub_integration/db/seeds.rb +7 -0
  54. data/spec/integration/exception_hub_integration/lib/assets/.gitkeep +0 -0
  55. data/spec/integration/exception_hub_integration/lib/tasks/.gitkeep +0 -0
  56. data/spec/integration/exception_hub_integration/log/.gitkeep +0 -0
  57. data/spec/integration/exception_hub_integration/public/404.html +26 -0
  58. data/spec/integration/exception_hub_integration/public/422.html +26 -0
  59. data/spec/integration/exception_hub_integration/public/500.html +25 -0
  60. data/spec/integration/exception_hub_integration/public/favicon.ico +0 -0
  61. data/spec/integration/exception_hub_integration/public/index.html +241 -0
  62. data/spec/integration/exception_hub_integration/public/robots.txt +5 -0
  63. data/spec/integration/exception_hub_integration/script/rails +6 -0
  64. data/spec/integration/exception_hub_integration/test/fixtures/.gitkeep +0 -0
  65. data/spec/integration/exception_hub_integration/test/functional/.gitkeep +0 -0
  66. data/spec/integration/exception_hub_integration/test/integration/.gitkeep +0 -0
  67. data/spec/integration/exception_hub_integration/test/performance/browsing_test.rb +12 -0
  68. data/spec/integration/exception_hub_integration/test/test_helper.rb +13 -0
  69. data/spec/integration/exception_hub_integration/test/unit/.gitkeep +0 -0
  70. data/spec/integration/exception_hub_integration/vendor/assets/javascripts/.gitkeep +0 -0
  71. data/spec/integration/exception_hub_integration/vendor/assets/stylesheets/.gitkeep +0 -0
  72. data/spec/integration/exception_hub_integration/vendor/plugins/.gitkeep +0 -0
  73. data/spec/integration/rake_task_spec.rb +9 -0
  74. data/spec/lib/exception_hub/client/authorization_spec.rb +22 -0
  75. data/spec/lib/exception_hub/client_spec.rb +28 -0
  76. data/spec/lib/exception_hub/configuration_spec.rb +35 -0
  77. data/spec/lib/interceptor_spec.rb +112 -0
  78. data/spec/lib/issue_spec.rb +26 -0
  79. data/spec/lib/notifier_spec.rb +31 -0
  80. data/spec/lib/rack_spec.rb +22 -0
  81. data/spec/spec_helper.rb +16 -0
  82. metadata +249 -0
@@ -0,0 +1,59 @@
1
+ ExceptionHubIntegration::Application.routes.draw do
2
+ match '/errors/:action', :controller => :errors
3
+ # The priority is based upon order of creation:
4
+ # first created -> highest priority.
5
+
6
+ # Sample of regular route:
7
+ # match 'products/:id' => 'catalog#view'
8
+ # Keep in mind you can assign values other than :controller and :action
9
+
10
+ # Sample of named route:
11
+ # match 'products/:id/purchase' => 'catalog#purchase', :as => :purchase
12
+ # This route can be invoked with purchase_url(:id => product.id)
13
+
14
+ # Sample resource route (maps HTTP verbs to controller actions automatically):
15
+ # resources :products
16
+
17
+ # Sample resource route with options:
18
+ # resources :products do
19
+ # member do
20
+ # get 'short'
21
+ # post 'toggle'
22
+ # end
23
+ #
24
+ # collection do
25
+ # get 'sold'
26
+ # end
27
+ # end
28
+
29
+ # Sample resource route with sub-resources:
30
+ # resources :products do
31
+ # resources :comments, :sales
32
+ # resource :seller
33
+ # end
34
+
35
+ # Sample resource route with more complex sub-resources
36
+ # resources :products do
37
+ # resources :comments
38
+ # resources :sales do
39
+ # get 'recent', :on => :collection
40
+ # end
41
+ # end
42
+
43
+ # Sample resource route within a namespace:
44
+ # namespace :admin do
45
+ # # Directs /admin/products/* to Admin::ProductsController
46
+ # # (app/controllers/admin/products_controller.rb)
47
+ # resources :products
48
+ # end
49
+
50
+ # You can have the root of your site routed with "root"
51
+ # just remember to delete public/index.html.
52
+ # root :to => 'welcome#index'
53
+
54
+ # See how all your routes lay out with "rake routes"
55
+
56
+ # This is a legacy wild controller route that's not recommended for RESTful applications.
57
+ # Note: This route will make all actions in every controller accessible via GET requests.
58
+ # match ':controller(/:action(/:id))(.:format)'
59
+ end
@@ -0,0 +1,4 @@
1
+ # This file is used by Rack-based servers to start the application.
2
+
3
+ require ::File.expand_path('../config/environment', __FILE__)
4
+ run ExceptionHubIntegration::Application
@@ -0,0 +1,7 @@
1
+ # This file should contain all the record creation needed to seed the database with its default values.
2
+ # The data can then be loaded with the rake db:seed (or created alongside the db with db:setup).
3
+ #
4
+ # Examples:
5
+ #
6
+ # cities = City.create([{ name: 'Chicago' }, { name: 'Copenhagen' }])
7
+ # Mayor.create(name: 'Emanuel', city: cities.first)
@@ -0,0 +1,26 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>The page you were looking for doesn't exist (404)</title>
5
+ <style type="text/css">
6
+ body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
7
+ div.dialog {
8
+ width: 25em;
9
+ padding: 0 4em;
10
+ margin: 4em auto 0 auto;
11
+ border: 1px solid #ccc;
12
+ border-right-color: #999;
13
+ border-bottom-color: #999;
14
+ }
15
+ h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <!-- This file lives in public/404.html -->
21
+ <div class="dialog">
22
+ <h1>The page you were looking for doesn't exist.</h1>
23
+ <p>You may have mistyped the address or the page may have moved.</p>
24
+ </div>
25
+ </body>
26
+ </html>
@@ -0,0 +1,26 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>The change you wanted was rejected (422)</title>
5
+ <style type="text/css">
6
+ body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
7
+ div.dialog {
8
+ width: 25em;
9
+ padding: 0 4em;
10
+ margin: 4em auto 0 auto;
11
+ border: 1px solid #ccc;
12
+ border-right-color: #999;
13
+ border-bottom-color: #999;
14
+ }
15
+ h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <!-- This file lives in public/422.html -->
21
+ <div class="dialog">
22
+ <h1>The change you wanted was rejected.</h1>
23
+ <p>Maybe you tried to change something you didn't have access to.</p>
24
+ </div>
25
+ </body>
26
+ </html>
@@ -0,0 +1,25 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>We're sorry, but something went wrong (500)</title>
5
+ <style type="text/css">
6
+ body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
7
+ div.dialog {
8
+ width: 25em;
9
+ padding: 0 4em;
10
+ margin: 4em auto 0 auto;
11
+ border: 1px solid #ccc;
12
+ border-right-color: #999;
13
+ border-bottom-color: #999;
14
+ }
15
+ h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <!-- This file lives in public/500.html -->
21
+ <div class="dialog">
22
+ <h1>We're sorry, but something went wrong.</h1>
23
+ </div>
24
+ </body>
25
+ </html>
@@ -0,0 +1,241 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Ruby on Rails: Welcome aboard</title>
5
+ <style type="text/css" media="screen">
6
+ body {
7
+ margin: 0;
8
+ margin-bottom: 25px;
9
+ padding: 0;
10
+ background-color: #f0f0f0;
11
+ font-family: "Lucida Grande", "Bitstream Vera Sans", "Verdana";
12
+ font-size: 13px;
13
+ color: #333;
14
+ }
15
+
16
+ h1 {
17
+ font-size: 28px;
18
+ color: #000;
19
+ }
20
+
21
+ a {color: #03c}
22
+ a:hover {
23
+ background-color: #03c;
24
+ color: white;
25
+ text-decoration: none;
26
+ }
27
+
28
+
29
+ #page {
30
+ background-color: #f0f0f0;
31
+ width: 750px;
32
+ margin: 0;
33
+ margin-left: auto;
34
+ margin-right: auto;
35
+ }
36
+
37
+ #content {
38
+ float: left;
39
+ background-color: white;
40
+ border: 3px solid #aaa;
41
+ border-top: none;
42
+ padding: 25px;
43
+ width: 500px;
44
+ }
45
+
46
+ #sidebar {
47
+ float: right;
48
+ width: 175px;
49
+ }
50
+
51
+ #footer {
52
+ clear: both;
53
+ }
54
+
55
+ #header, #about, #getting-started {
56
+ padding-left: 75px;
57
+ padding-right: 30px;
58
+ }
59
+
60
+
61
+ #header {
62
+ background-image: url("assets/rails.png");
63
+ background-repeat: no-repeat;
64
+ background-position: top left;
65
+ height: 64px;
66
+ }
67
+ #header h1, #header h2 {margin: 0}
68
+ #header h2 {
69
+ color: #888;
70
+ font-weight: normal;
71
+ font-size: 16px;
72
+ }
73
+
74
+
75
+ #about h3 {
76
+ margin: 0;
77
+ margin-bottom: 10px;
78
+ font-size: 14px;
79
+ }
80
+
81
+ #about-content {
82
+ background-color: #ffd;
83
+ border: 1px solid #fc0;
84
+ margin-left: -55px;
85
+ margin-right: -10px;
86
+ }
87
+ #about-content table {
88
+ margin-top: 10px;
89
+ margin-bottom: 10px;
90
+ font-size: 11px;
91
+ border-collapse: collapse;
92
+ }
93
+ #about-content td {
94
+ padding: 10px;
95
+ padding-top: 3px;
96
+ padding-bottom: 3px;
97
+ }
98
+ #about-content td.name {color: #555}
99
+ #about-content td.value {color: #000}
100
+
101
+ #about-content ul {
102
+ padding: 0;
103
+ list-style-type: none;
104
+ }
105
+
106
+ #about-content.failure {
107
+ background-color: #fcc;
108
+ border: 1px solid #f00;
109
+ }
110
+ #about-content.failure p {
111
+ margin: 0;
112
+ padding: 10px;
113
+ }
114
+
115
+
116
+ #getting-started {
117
+ border-top: 1px solid #ccc;
118
+ margin-top: 25px;
119
+ padding-top: 15px;
120
+ }
121
+ #getting-started h1 {
122
+ margin: 0;
123
+ font-size: 20px;
124
+ }
125
+ #getting-started h2 {
126
+ margin: 0;
127
+ font-size: 14px;
128
+ font-weight: normal;
129
+ color: #333;
130
+ margin-bottom: 25px;
131
+ }
132
+ #getting-started ol {
133
+ margin-left: 0;
134
+ padding-left: 0;
135
+ }
136
+ #getting-started li {
137
+ font-size: 18px;
138
+ color: #888;
139
+ margin-bottom: 25px;
140
+ }
141
+ #getting-started li h2 {
142
+ margin: 0;
143
+ font-weight: normal;
144
+ font-size: 18px;
145
+ color: #333;
146
+ }
147
+ #getting-started li p {
148
+ color: #555;
149
+ font-size: 13px;
150
+ }
151
+
152
+
153
+ #sidebar ul {
154
+ margin-left: 0;
155
+ padding-left: 0;
156
+ }
157
+ #sidebar ul h3 {
158
+ margin-top: 25px;
159
+ font-size: 16px;
160
+ padding-bottom: 10px;
161
+ border-bottom: 1px solid #ccc;
162
+ }
163
+ #sidebar li {
164
+ list-style-type: none;
165
+ }
166
+ #sidebar ul.links li {
167
+ margin-bottom: 5px;
168
+ }
169
+
170
+ .filename {
171
+ font-style: italic;
172
+ }
173
+ </style>
174
+ <script type="text/javascript">
175
+ function about() {
176
+ info = document.getElementById('about-content');
177
+ if (window.XMLHttpRequest)
178
+ { xhr = new XMLHttpRequest(); }
179
+ else
180
+ { xhr = new ActiveXObject("Microsoft.XMLHTTP"); }
181
+ xhr.open("GET","rails/info/properties",false);
182
+ xhr.send("");
183
+ info.innerHTML = xhr.responseText;
184
+ info.style.display = 'block'
185
+ }
186
+ </script>
187
+ </head>
188
+ <body>
189
+ <div id="page">
190
+ <div id="sidebar">
191
+ <ul id="sidebar-items">
192
+ <li>
193
+ <h3>Browse the documentation</h3>
194
+ <ul class="links">
195
+ <li><a href="http://guides.rubyonrails.org/">Rails Guides</a></li>
196
+ <li><a href="http://api.rubyonrails.org/">Rails API</a></li>
197
+ <li><a href="http://www.ruby-doc.org/core/">Ruby core</a></li>
198
+ <li><a href="http://www.ruby-doc.org/stdlib/">Ruby standard library</a></li>
199
+ </ul>
200
+ </li>
201
+ </ul>
202
+ </div>
203
+
204
+ <div id="content">
205
+ <div id="header">
206
+ <h1>Welcome aboard</h1>
207
+ <h2>You&rsquo;re riding Ruby on Rails!</h2>
208
+ </div>
209
+
210
+ <div id="about">
211
+ <h3><a href="rails/info/properties" onclick="about(); return false">About your application&rsquo;s environment</a></h3>
212
+ <div id="about-content" style="display: none"></div>
213
+ </div>
214
+
215
+ <div id="getting-started">
216
+ <h1>Getting started</h1>
217
+ <h2>Here&rsquo;s how to get rolling:</h2>
218
+
219
+ <ol>
220
+ <li>
221
+ <h2>Use <code>rails generate</code> to create your models and controllers</h2>
222
+ <p>To see all available options, run it without parameters.</p>
223
+ </li>
224
+
225
+ <li>
226
+ <h2>Set up a default route and remove <span class="filename">public/index.html</span></h2>
227
+ <p>Routes are set up in <span class="filename">config/routes.rb</span>.</p>
228
+ </li>
229
+
230
+ <li>
231
+ <h2>Create your database</h2>
232
+ <p>Run <code>rake db:create</code> to create your database. If you're not using SQLite (the default), edit <span class="filename">config/database.yml</span> with your username and password.</p>
233
+ </li>
234
+ </ol>
235
+ </div>
236
+ </div>
237
+
238
+ <div id="footer">&nbsp;</div>
239
+ </div>
240
+ </body>
241
+ </html>
@@ -0,0 +1,5 @@
1
+ # See http://www.robotstxt.org/wc/norobots.html for documentation on how to use the robots.txt file
2
+ #
3
+ # To ban all spiders from the entire site uncomment the next two lines:
4
+ # User-Agent: *
5
+ # Disallow: /
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+ # This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.
3
+
4
+ APP_PATH = File.expand_path('../../config/application', __FILE__)
5
+ require File.expand_path('../../config/boot', __FILE__)
6
+ require 'rails/commands'
@@ -0,0 +1,12 @@
1
+ require 'test_helper'
2
+ require 'rails/performance_test_help'
3
+
4
+ class BrowsingTest < ActionDispatch::PerformanceTest
5
+ # Refer to the documentation for all available options
6
+ # self.profile_options = { :runs => 5, :metrics => [:wall_time, :memory]
7
+ # :output => 'tmp/performance', :formats => [:flat] }
8
+
9
+ def test_homepage
10
+ get '/'
11
+ end
12
+ end
@@ -0,0 +1,13 @@
1
+ ENV["RAILS_ENV"] = "test"
2
+ require File.expand_path('../../config/environment', __FILE__)
3
+ require 'rails/test_help'
4
+
5
+ class ActiveSupport::TestCase
6
+ # Setup all fixtures in test/fixtures/*.(yml|csv) for all tests in alphabetical order.
7
+ #
8
+ # Note: You'll currently still have to declare fixtures explicitly in integration tests
9
+ # -- they do not yet inherit this setting
10
+ fixtures :all
11
+
12
+ # Add more helper methods to be used by all tests here...
13
+ end
@@ -0,0 +1,9 @@
1
+ require 'spec_helper'
2
+
3
+ describe "ExceptionHub Rake tasks", :slow_test do
4
+ it "should show up when listing tasks" do
5
+ output = `cd spec/integration/exception_hub_integration && rake -T`
6
+
7
+ output.should include "rake exception_hub:generate_initializer"
8
+ end
9
+ end
@@ -0,0 +1,22 @@
1
+ require 'spec_helper'
2
+
3
+ describe ExceptionHub::Client::Authorization do
4
+ describe "#get_api_token" do
5
+ before do
6
+ @octokit = double(:octokit_double)
7
+ Octokit::Client.stub(:new => @octokit)
8
+ end
9
+
10
+ it "should call Github to create a new token" do
11
+ Octokit::Client.should_receive(:new).with(:login => 'jessedearing', :password => 'asdfasdf').and_return(@octokit)
12
+ @octokit.should_receive(:create_authorization).with(:scopes => [:repo], :note => 'ExceptionHub', :note_url => 'http://github.com/jessedearing/exception_hub')
13
+ ExceptionHub.get_api_token('jessedearing', 'asdfasdf')
14
+ end
15
+
16
+ it "should create an initializer" do
17
+ output = ExceptionHub.generate_initializer('jessedearing', 'asdf', 123)
18
+ output.should include "user_name = 'jessedearing'"
19
+ output.should include "api_token = 'asdf'"
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,28 @@
1
+ require 'spec_helper'
2
+
3
+ describe ExceptionHub::Client do
4
+ describe "authenticated Octokit client" do
5
+ before do
6
+ ExceptionHub.github_api_token = 'abc123'
7
+ ExceptionHub.github_user_name = 'jessedearing'
8
+ end
9
+
10
+ subject {ExceptionHub.current_octokit}
11
+
12
+ its(:oauth_token) {should == ExceptionHub.github_api_token }
13
+ its(:login) {should == ExceptionHub.github_user_name }
14
+ end
15
+
16
+ describe "unauthenticated Octokit client" do
17
+ before do
18
+ ExceptionHub.github_api_token = nil
19
+ ExceptionHub.github_user_name = nil
20
+ ExceptionHub.reload_octokit!
21
+ end
22
+
23
+ subject {ExceptionHub.current_octokit}
24
+
25
+ its(:oauth_token) {should == nil}
26
+ its(:login) {should == nil}
27
+ end
28
+ end
@@ -0,0 +1,35 @@
1
+ require 'spec_helper'
2
+
3
+ describe ExceptionHub::Configuration do
4
+ it "should let me configure through a configuration block" do
5
+ ExceptionHub.config do |config|
6
+ config.repo_name = 'test_repo'
7
+ end
8
+
9
+ ExceptionHub.repo_name.should == 'test_repo'
10
+ end
11
+
12
+ it "should add callbacks for the after_create_exception hook" do
13
+ p = proc {}
14
+ p2 = proc {}
15
+ ExceptionHub.configure do |config|
16
+ config.after_create_exception(&p)
17
+ config.after_create_exception(&p2)
18
+ end
19
+
20
+ ExceptionHub.after_create_exception_callbacks.should include p
21
+ ExceptionHub.after_create_exception_callbacks.should include p2
22
+ end
23
+
24
+ it "should add callbacks for the before_create_exception hook" do
25
+ p = proc {}
26
+ p2 = proc {}
27
+ ExceptionHub.configure do |config|
28
+ config.before_create_exception(&p)
29
+ config.before_create_exception(&p2)
30
+ end
31
+
32
+ ExceptionHub.before_create_exception_callbacks.should include p
33
+ ExceptionHub.before_create_exception_callbacks.should include p2
34
+ end
35
+ end
@@ -0,0 +1,112 @@
1
+ require 'spec_helper'
2
+
3
+ describe ExceptionHub::Interceptor do
4
+ before do
5
+ @interceptor = ExceptionHub::Interceptor.new(Exception.new("Production error!"), {})
6
+ end
7
+
8
+ describe "#should_create_issue?" do
9
+ subject {@interceptor.should_create_issue?}
10
+
11
+ it "should not create issues if it's on the ignored_exceptions list" do
12
+ ExceptionHub.define_defaults
13
+ ExceptionHub.ignored_exceptions << "Exception"
14
+
15
+ should be_false
16
+ ExceptionHub.ignored_exceptions = nil
17
+ ExceptionHub.define_defaults
18
+ end
19
+
20
+ it "should run in a Rails reporting environment" do
21
+ Rails.env = 'production'
22
+
23
+ should be_true
24
+ Rails.env = "development"
25
+ end
26
+
27
+ it "should run in a Sinatra::Base reporting environment" do
28
+ module Sinatra
29
+ class Base
30
+ def self.environment
31
+ :production
32
+ end
33
+ end
34
+ end
35
+
36
+ should be_true
37
+ Object.send(:remove_const, :Sinatra)
38
+ end
39
+
40
+ it "should run in a RACK_ENV reporting environment" do
41
+ ENV['RACK_ENV'] = 'production'
42
+
43
+ should be_true
44
+ ENV['RACK_ENV'] = nil
45
+ end
46
+
47
+ it "should default to false" do
48
+ should be_false
49
+ end
50
+ end
51
+
52
+ describe "should create issues" do
53
+ before do
54
+ ENV['RACK_ENV'] = 'production'
55
+ end
56
+
57
+ after do
58
+ ENV['RACK_ENV'] = nil
59
+ end
60
+
61
+ describe "intercept!" do
62
+ before do
63
+ @notifier_mock = mock(:notifier)
64
+ ExceptionHub::Notifier.stub(:new => @notifier_mock)
65
+ end
66
+
67
+ subject {@interceptor}
68
+
69
+ it "should notify on an exception" do
70
+ @notifier_mock.should_receive(:notify!)
71
+ subject.intercept!
72
+ end
73
+ end
74
+
75
+ describe "callbacks" do
76
+ before do
77
+ @notifier_mock = mock(:notifier)
78
+ @notifier_mock.stub(:notify!)
79
+ ExceptionHub::Notifier.stub(:new => @notifier_mock)
80
+ end
81
+
82
+ after do
83
+ ExceptionHub.before_create_exception_callbacks.delete_at(0)
84
+ ExceptionHub.after_create_exception_callbacks.delete_at(0)
85
+ end
86
+
87
+ subject {@interceptor}
88
+
89
+ it "should callback before notifying of the exception" do
90
+ @before_callback_called = false
91
+ ExceptionHub.before_create_exception do
92
+ @before_callback_called = true
93
+ end
94
+
95
+ subject.intercept!
96
+
97
+ @before_callback_called.should be_true
98
+ end
99
+
100
+ it "should callback after notifying of the exception" do
101
+ @after_callback_called = false
102
+ ExceptionHub.after_create_exception do
103
+ @after_callback_called = true
104
+ end
105
+
106
+ subject.intercept!
107
+
108
+ @after_callback_called.should be_true
109
+ end
110
+ end
111
+ end
112
+ end