bugsnag 6.12.2 → 6.16.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (633) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +90 -0
  3. data/VERSION +1 -1
  4. data/bugsnag.gemspec +1 -1
  5. data/lib/bugsnag.rb +119 -21
  6. data/lib/bugsnag/breadcrumbs/breadcrumbs.rb +0 -2
  7. data/lib/bugsnag/breadcrumbs/validator.rb +0 -6
  8. data/lib/bugsnag/cleaner.rb +129 -60
  9. data/lib/bugsnag/code_extractor.rb +137 -0
  10. data/lib/bugsnag/configuration.rb +107 -2
  11. data/lib/bugsnag/delivery/thread_queue.rb +18 -3
  12. data/lib/bugsnag/helpers.rb +2 -4
  13. data/lib/bugsnag/integrations/delayed_job.rb +13 -1
  14. data/lib/bugsnag/integrations/mailman.rb +2 -1
  15. data/lib/bugsnag/integrations/que.rb +2 -1
  16. data/lib/bugsnag/integrations/rack.rb +3 -1
  17. data/lib/bugsnag/integrations/railtie.rb +17 -5
  18. data/lib/bugsnag/integrations/rake.rb +4 -2
  19. data/lib/bugsnag/integrations/resque.rb +2 -2
  20. data/lib/bugsnag/integrations/shoryuken.rb +2 -1
  21. data/lib/bugsnag/integrations/sidekiq.rb +1 -1
  22. data/lib/bugsnag/middleware/delayed_job.rb +1 -0
  23. data/lib/bugsnag/middleware/discard_error_class.rb +30 -0
  24. data/lib/bugsnag/middleware/exception_meta_data.rb +15 -9
  25. data/lib/bugsnag/middleware/ignore_error_class.rb +2 -0
  26. data/lib/bugsnag/middleware/rack_request.rb +2 -4
  27. data/lib/bugsnag/middleware_stack.rb +38 -3
  28. data/lib/bugsnag/on_error_callbacks.rb +33 -0
  29. data/lib/bugsnag/report.rb +4 -14
  30. data/lib/bugsnag/session_tracker.rb +3 -3
  31. data/lib/bugsnag/stacktrace.rb +28 -75
  32. metadata +6 -605
  33. data/.github/PULL_REQUEST_TEMPLATE.md +0 -84
  34. data/.gitignore +0 -55
  35. data/.rdoc_options +0 -27
  36. data/.rspec +0 -3
  37. data/.rubocop.yml +0 -2
  38. data/.rubocop_todo.yml +0 -679
  39. data/.travis.yml +0 -122
  40. data/CONTRIBUTING.md +0 -72
  41. data/Gemfile +0 -43
  42. data/Rakefile +0 -37
  43. data/UPGRADING.md +0 -91
  44. data/features/.gitignore +0 -1
  45. data/features/delayed_job.feature +0 -52
  46. data/features/fixtures/delayed_job/Dockerfile +0 -17
  47. data/features/fixtures/delayed_job/app/.gitignore +0 -21
  48. data/features/fixtures/delayed_job/app/Gemfile +0 -57
  49. data/features/fixtures/delayed_job/app/README.md +0 -24
  50. data/features/fixtures/delayed_job/app/Rakefile +0 -6
  51. data/features/fixtures/delayed_job/app/app/assets/config/manifest.js +0 -3
  52. data/features/fixtures/delayed_job/app/app/assets/images/.keep +0 -0
  53. data/features/fixtures/delayed_job/app/app/assets/javascripts/application.js +0 -16
  54. data/features/fixtures/delayed_job/app/app/assets/javascripts/cable.js +0 -13
  55. data/features/fixtures/delayed_job/app/app/assets/javascripts/channels/.keep +0 -0
  56. data/features/fixtures/delayed_job/app/app/assets/stylesheets/application.css +0 -15
  57. data/features/fixtures/delayed_job/app/app/channels/application_cable/channel.rb +0 -4
  58. data/features/fixtures/delayed_job/app/app/channels/application_cable/connection.rb +0 -4
  59. data/features/fixtures/delayed_job/app/app/controllers/application_controller.rb +0 -3
  60. data/features/fixtures/delayed_job/app/app/controllers/concerns/.keep +0 -0
  61. data/features/fixtures/delayed_job/app/app/helpers/application_helper.rb +0 -2
  62. data/features/fixtures/delayed_job/app/app/jobs/application_job.rb +0 -2
  63. data/features/fixtures/delayed_job/app/app/mailers/application_mailer.rb +0 -4
  64. data/features/fixtures/delayed_job/app/app/models/application_record.rb +0 -3
  65. data/features/fixtures/delayed_job/app/app/models/concerns/.keep +0 -0
  66. data/features/fixtures/delayed_job/app/app/models/test_model.rb +0 -10
  67. data/features/fixtures/delayed_job/app/app/views/layouts/application.html.erb +0 -14
  68. data/features/fixtures/delayed_job/app/app/views/layouts/mailer.html.erb +0 -13
  69. data/features/fixtures/delayed_job/app/app/views/layouts/mailer.text.erb +0 -1
  70. data/features/fixtures/delayed_job/app/config.ru +0 -5
  71. data/features/fixtures/delayed_job/app/config/application.rb +0 -15
  72. data/features/fixtures/delayed_job/app/config/boot.rb +0 -3
  73. data/features/fixtures/delayed_job/app/config/cable.yml +0 -9
  74. data/features/fixtures/delayed_job/app/config/database.yml +0 -25
  75. data/features/fixtures/delayed_job/app/config/environment.rb +0 -5
  76. data/features/fixtures/delayed_job/app/config/environments/development.rb +0 -54
  77. data/features/fixtures/delayed_job/app/config/environments/production.rb +0 -86
  78. data/features/fixtures/delayed_job/app/config/environments/test.rb +0 -42
  79. data/features/fixtures/delayed_job/app/config/initializers/application_controller_renderer.rb +0 -8
  80. data/features/fixtures/delayed_job/app/config/initializers/assets.rb +0 -11
  81. data/features/fixtures/delayed_job/app/config/initializers/backtrace_silencers.rb +0 -7
  82. data/features/fixtures/delayed_job/app/config/initializers/bugsnag.rb +0 -14
  83. data/features/fixtures/delayed_job/app/config/initializers/cookies_serializer.rb +0 -5
  84. data/features/fixtures/delayed_job/app/config/initializers/delayed_job.rb +0 -3
  85. data/features/fixtures/delayed_job/app/config/initializers/filter_parameter_logging.rb +0 -4
  86. data/features/fixtures/delayed_job/app/config/initializers/inflections.rb +0 -16
  87. data/features/fixtures/delayed_job/app/config/initializers/mime_types.rb +0 -4
  88. data/features/fixtures/delayed_job/app/config/initializers/new_framework_defaults.rb +0 -26
  89. data/features/fixtures/delayed_job/app/config/initializers/session_store.rb +0 -3
  90. data/features/fixtures/delayed_job/app/config/initializers/wrap_parameters.rb +0 -14
  91. data/features/fixtures/delayed_job/app/config/locales/en.yml +0 -23
  92. data/features/fixtures/delayed_job/app/config/puma.rb +0 -47
  93. data/features/fixtures/delayed_job/app/config/routes.rb +0 -3
  94. data/features/fixtures/delayed_job/app/config/secrets.yml +0 -22
  95. data/features/fixtures/delayed_job/app/config/spring.rb +0 -6
  96. data/features/fixtures/delayed_job/app/db/migrate/20181024232549_create_delayed_jobs.rb +0 -22
  97. data/features/fixtures/delayed_job/app/db/migrate/20181024232817_create_test_models.rb +0 -8
  98. data/features/fixtures/delayed_job/app/db/schema.rb +0 -30
  99. data/features/fixtures/delayed_job/app/db/seeds.rb +0 -7
  100. data/features/fixtures/delayed_job/app/lib/assets/.keep +0 -0
  101. data/features/fixtures/delayed_job/app/lib/tasks/.keep +0 -0
  102. data/features/fixtures/delayed_job/app/log/.keep +0 -0
  103. data/features/fixtures/delayed_job/app/public/404.html +0 -67
  104. data/features/fixtures/delayed_job/app/public/422.html +0 -67
  105. data/features/fixtures/delayed_job/app/public/500.html +0 -66
  106. data/features/fixtures/delayed_job/app/public/apple-touch-icon-precomposed.png +0 -0
  107. data/features/fixtures/delayed_job/app/public/apple-touch-icon.png +0 -0
  108. data/features/fixtures/delayed_job/app/public/favicon.ico +0 -0
  109. data/features/fixtures/delayed_job/app/public/robots.txt +0 -5
  110. data/features/fixtures/delayed_job/app/test/controllers/.keep +0 -0
  111. data/features/fixtures/delayed_job/app/test/fixtures/.keep +0 -0
  112. data/features/fixtures/delayed_job/app/test/fixtures/files/.keep +0 -0
  113. data/features/fixtures/delayed_job/app/test/fixtures/test_models.yml +0 -11
  114. data/features/fixtures/delayed_job/app/test/helpers/.keep +0 -0
  115. data/features/fixtures/delayed_job/app/test/integration/.keep +0 -0
  116. data/features/fixtures/delayed_job/app/test/mailers/.keep +0 -0
  117. data/features/fixtures/delayed_job/app/test/models/.keep +0 -0
  118. data/features/fixtures/delayed_job/app/test/models/test_model_test.rb +0 -7
  119. data/features/fixtures/delayed_job/app/test/test_helper.rb +0 -10
  120. data/features/fixtures/delayed_job/app/tmp/.keep +0 -0
  121. data/features/fixtures/docker-compose.yml +0 -311
  122. data/features/fixtures/plain/.dockerignore +0 -2
  123. data/features/fixtures/plain/Dockerfile +0 -11
  124. data/features/fixtures/plain/app/Gemfile +0 -3
  125. data/features/fixtures/plain/app/app.rb +0 -40
  126. data/features/fixtures/plain/app/configuration/api_key.rb +0 -9
  127. data/features/fixtures/plain/app/configuration/proxy.rb +0 -14
  128. data/features/fixtures/plain/app/configuration/send_handled.rb +0 -7
  129. data/features/fixtures/plain/app/configuration/send_unhandled.rb +0 -9
  130. data/features/fixtures/plain/app/delivery/fork_threadpool.rb +0 -25
  131. data/features/fixtures/plain/app/delivery/synchronous.rb +0 -14
  132. data/features/fixtures/plain/app/delivery/threadpool.rb +0 -14
  133. data/features/fixtures/plain/app/exception_data/crash.rb +0 -34
  134. data/features/fixtures/plain/app/exception_data/handled_context.rb +0 -10
  135. data/features/fixtures/plain/app/exception_data/handled_hash.rb +0 -10
  136. data/features/fixtures/plain/app/exception_data/handled_meta_data.rb +0 -10
  137. data/features/fixtures/plain/app/exception_data/handled_user_id.rb +0 -10
  138. data/features/fixtures/plain/app/exception_data/unhandled_context.rb +0 -7
  139. data/features/fixtures/plain/app/exception_data/unhandled_hash.rb +0 -7
  140. data/features/fixtures/plain/app/exception_data/unhandled_meta_data.rb +0 -7
  141. data/features/fixtures/plain/app/exception_data/unhandled_user_id.rb +0 -7
  142. data/features/fixtures/plain/app/filters/additional_filters.rb +0 -11
  143. data/features/fixtures/plain/app/filters/default_filters.rb +0 -15
  144. data/features/fixtures/plain/app/handled/block_metadata.rb +0 -15
  145. data/features/fixtures/plain/app/handled/ignore_exception.rb +0 -12
  146. data/features/fixtures/plain/app/handled/notify_exception.rb +0 -9
  147. data/features/fixtures/plain/app/handled/notify_string.rb +0 -9
  148. data/features/fixtures/plain/app/ignore_classes/handled.rb +0 -8
  149. data/features/fixtures/plain/app/ignore_classes/ignore_error.rb +0 -8
  150. data/features/fixtures/plain/app/ignore_classes/unhandled.rb +0 -4
  151. data/features/fixtures/plain/app/report_modification/add_tab.rb +0 -16
  152. data/features/fixtures/plain/app/report_modification/add_tab_existing.rb +0 -22
  153. data/features/fixtures/plain/app/report_modification/add_tab_override.rb +0 -19
  154. data/features/fixtures/plain/app/report_modification/ignore_report.rb +0 -9
  155. data/features/fixtures/plain/app/report_modification/initiators/handled_before_notify.rb +0 -10
  156. data/features/fixtures/plain/app/report_modification/initiators/handled_block.rb +0 -8
  157. data/features/fixtures/plain/app/report_modification/initiators/unhandled_before_notify.rb +0 -11
  158. data/features/fixtures/plain/app/report_modification/modify_api_key.rb +0 -9
  159. data/features/fixtures/plain/app/report_modification/modify_severity.rb +0 -9
  160. data/features/fixtures/plain/app/report_modification/remove_user_details.rb +0 -14
  161. data/features/fixtures/plain/app/report_modification/set_custom_user_details.rb +0 -16
  162. data/features/fixtures/plain/app/report_modification/set_user_details.rb +0 -13
  163. data/features/fixtures/plain/app/stack_frame_modification/initiators/handled_before_notify.rb +0 -29
  164. data/features/fixtures/plain/app/stack_frame_modification/initiators/handled_block.rb +0 -24
  165. data/features/fixtures/plain/app/stack_frame_modification/initiators/unhandled_before_notify.rb +0 -26
  166. data/features/fixtures/plain/app/stack_frame_modification/mark_frames_in_project.rb +0 -13
  167. data/features/fixtures/plain/app/stack_frame_modification/remove_stack_frame.rb +0 -9
  168. data/features/fixtures/plain/app/unhandled/Interrupt.rb +0 -6
  169. data/features/fixtures/plain/app/unhandled/bad_syntax.rb +0 -1
  170. data/features/fixtures/plain/app/unhandled/custom_error.rb +0 -9
  171. data/features/fixtures/plain/app/unhandled/load_error.rb +0 -6
  172. data/features/fixtures/plain/app/unhandled/local_jump_error.rb +0 -10
  173. data/features/fixtures/plain/app/unhandled/name_error.rb +0 -6
  174. data/features/fixtures/plain/app/unhandled/no_method_error.rb +0 -6
  175. data/features/fixtures/plain/app/unhandled/runtime_error.rb +0 -6
  176. data/features/fixtures/plain/app/unhandled/syntax_error.rb +0 -6
  177. data/features/fixtures/plain/app/unhandled/system_call_error.rb +0 -6
  178. data/features/fixtures/plain/app/unhandled/system_exit.rb +0 -6
  179. data/features/fixtures/plain/json/delivery_fork.json +0 -4
  180. data/features/fixtures/plain/json/delivery_synchronous.json +0 -4
  181. data/features/fixtures/plain/json/delivery_threadpool.json +0 -4
  182. data/features/fixtures/plain/json/filters_default_metadata_filters.json +0 -9
  183. data/features/fixtures/rack1/.dockerignore +0 -1
  184. data/features/fixtures/rack1/Dockerfile +0 -13
  185. data/features/fixtures/rack1/Gemfile +0 -4
  186. data/features/fixtures/rack1/app.rb +0 -8
  187. data/features/fixtures/rack2/.dockerignore +0 -1
  188. data/features/fixtures/rack2/Dockerfile +0 -13
  189. data/features/fixtures/rack2/Gemfile +0 -4
  190. data/features/fixtures/rack2/app.rb +0 -8
  191. data/features/fixtures/rails3/.dockerignore +0 -1
  192. data/features/fixtures/rails3/Dockerfile +0 -15
  193. data/features/fixtures/rails3/app/.gitignore +0 -15
  194. data/features/fixtures/rails3/app/Gemfile +0 -13
  195. data/features/fixtures/rails3/app/Rakefile +0 -7
  196. data/features/fixtures/rails3/app/app/assets/images/rails.png +0 -0
  197. data/features/fixtures/rails3/app/app/assets/javascripts/application.js +0 -15
  198. data/features/fixtures/rails3/app/app/assets/stylesheets/application.css +0 -13
  199. data/features/fixtures/rails3/app/app/controllers/api_key_controller.rb +0 -20
  200. data/features/fixtures/rails3/app/app/controllers/app_type_controller.rb +0 -20
  201. data/features/fixtures/rails3/app/app/controllers/app_version_controller.rb +0 -25
  202. data/features/fixtures/rails3/app/app/controllers/application_controller.rb +0 -7
  203. data/features/fixtures/rails3/app/app/controllers/auto_notify_controller.rb +0 -31
  204. data/features/fixtures/rails3/app/app/controllers/before_notify_controller.rb +0 -44
  205. data/features/fixtures/rails3/app/app/controllers/breadcrumbs_controller.rb +0 -19
  206. data/features/fixtures/rails3/app/app/controllers/handled_controller.rb +0 -26
  207. data/features/fixtures/rails3/app/app/controllers/ignore_classes_controller.rb +0 -23
  208. data/features/fixtures/rails3/app/app/controllers/metadata_filters_controller.rb +0 -16
  209. data/features/fixtures/rails3/app/app/controllers/project_root_controller.rb +0 -25
  210. data/features/fixtures/rails3/app/app/controllers/release_stage_controller.rb +0 -20
  211. data/features/fixtures/rails3/app/app/controllers/send_code_controller.rb +0 -20
  212. data/features/fixtures/rails3/app/app/controllers/send_environment_controller.rb +0 -12
  213. data/features/fixtures/rails3/app/app/controllers/session_tracking_controller.rb +0 -24
  214. data/features/fixtures/rails3/app/app/controllers/unhandled_controller.rb +0 -11
  215. data/features/fixtures/rails3/app/app/controllers/warden_controller.rb +0 -30
  216. data/features/fixtures/rails3/app/app/helpers/application_helper.rb +0 -2
  217. data/features/fixtures/rails3/app/app/mailers/.gitkeep +0 -0
  218. data/features/fixtures/rails3/app/app/models/.gitkeep +0 -0
  219. data/features/fixtures/rails3/app/app/models/user.rb +0 -6
  220. data/features/fixtures/rails3/app/app/views/layouts/application.html.erb +0 -14
  221. data/features/fixtures/rails3/app/config.ru +0 -4
  222. data/features/fixtures/rails3/app/config/application.rb +0 -67
  223. data/features/fixtures/rails3/app/config/boot.rb +0 -6
  224. data/features/fixtures/rails3/app/config/database.yml +0 -31
  225. data/features/fixtures/rails3/app/config/environment.rb +0 -5
  226. data/features/fixtures/rails3/app/config/environments/development.rb +0 -37
  227. data/features/fixtures/rails3/app/config/environments/production.rb +0 -67
  228. data/features/fixtures/rails3/app/config/environments/rails_env.rb +0 -37
  229. data/features/fixtures/rails3/app/config/initializers/bugsnag.rb +0 -20
  230. data/features/fixtures/rails3/app/config/initializers/secret_token.rb +0 -7
  231. data/features/fixtures/rails3/app/config/initializers/session_store.rb +0 -8
  232. data/features/fixtures/rails3/app/config/initializers/warden.rb +0 -3
  233. data/features/fixtures/rails3/app/config/initializers/wrap_parameters.rb +0 -14
  234. data/features/fixtures/rails3/app/config/locales/en.yml +0 -5
  235. data/features/fixtures/rails3/app/config/routes.rb +0 -19
  236. data/features/fixtures/rails3/app/db/migrate/20180423142727_create_users.rb +0 -45
  237. data/features/fixtures/rails3/app/db/schema.rb +0 -37
  238. data/features/fixtures/rails3/app/db/seeds.rb +0 -7
  239. data/features/fixtures/rails3/app/lib/assets/.gitkeep +0 -0
  240. data/features/fixtures/rails3/app/lib/strategies/token_strategy.rb +0 -12
  241. data/features/fixtures/rails3/app/lib/tasks/.gitkeep +0 -0
  242. data/features/fixtures/rails3/app/log/.gitkeep +0 -0
  243. data/features/fixtures/rails3/app/public/404.html +0 -26
  244. data/features/fixtures/rails3/app/public/422.html +0 -26
  245. data/features/fixtures/rails3/app/public/500.html +0 -25
  246. data/features/fixtures/rails3/app/public/favicon.ico +0 -0
  247. data/features/fixtures/rails3/app/public/index.html +0 -241
  248. data/features/fixtures/rails3/app/public/robots.txt +0 -5
  249. data/features/fixtures/rails3/app/script/rails +0 -6
  250. data/features/fixtures/rails4/.dockerignore +0 -1
  251. data/features/fixtures/rails4/Dockerfile +0 -20
  252. data/features/fixtures/rails4/app/.gitignore +0 -16
  253. data/features/fixtures/rails4/app/Gemfile +0 -46
  254. data/features/fixtures/rails4/app/README.rdoc +0 -28
  255. data/features/fixtures/rails4/app/Rakefile +0 -6
  256. data/features/fixtures/rails4/app/app/assets/images/.keep +0 -0
  257. data/features/fixtures/rails4/app/app/assets/javascripts/application.js +0 -16
  258. data/features/fixtures/rails4/app/app/assets/stylesheets/application.css +0 -13
  259. data/features/fixtures/rails4/app/app/controllers/api_key_controller.rb +0 -20
  260. data/features/fixtures/rails4/app/app/controllers/app_type_controller.rb +0 -20
  261. data/features/fixtures/rails4/app/app/controllers/app_version_controller.rb +0 -25
  262. data/features/fixtures/rails4/app/app/controllers/application_controller.rb +0 -7
  263. data/features/fixtures/rails4/app/app/controllers/auto_notify_controller.rb +0 -31
  264. data/features/fixtures/rails4/app/app/controllers/before_notify_controller.rb +0 -44
  265. data/features/fixtures/rails4/app/app/controllers/breadcrumbs_controller.rb +0 -26
  266. data/features/fixtures/rails4/app/app/controllers/concerns/.keep +0 -0
  267. data/features/fixtures/rails4/app/app/controllers/devise_controller.rb +0 -32
  268. data/features/fixtures/rails4/app/app/controllers/handled_controller.rb +0 -26
  269. data/features/fixtures/rails4/app/app/controllers/ignore_classes_controller.rb +0 -23
  270. data/features/fixtures/rails4/app/app/controllers/metadata_filters_controller.rb +0 -16
  271. data/features/fixtures/rails4/app/app/controllers/mongo_controller.rb +0 -23
  272. data/features/fixtures/rails4/app/app/controllers/project_root_controller.rb +0 -25
  273. data/features/fixtures/rails4/app/app/controllers/release_stage_controller.rb +0 -20
  274. data/features/fixtures/rails4/app/app/controllers/send_code_controller.rb +0 -20
  275. data/features/fixtures/rails4/app/app/controllers/send_environment_controller.rb +0 -12
  276. data/features/fixtures/rails4/app/app/controllers/session_tracking_controller.rb +0 -24
  277. data/features/fixtures/rails4/app/app/controllers/unhandled_controller.rb +0 -11
  278. data/features/fixtures/rails4/app/app/helpers/application_helper.rb +0 -2
  279. data/features/fixtures/rails4/app/app/jobs/application_job.rb +0 -2
  280. data/features/fixtures/rails4/app/app/jobs/notify_job.rb +0 -5
  281. data/features/fixtures/rails4/app/app/mailers/.keep +0 -0
  282. data/features/fixtures/rails4/app/app/models/.keep +0 -0
  283. data/features/fixtures/rails4/app/app/models/concerns/.keep +0 -0
  284. data/features/fixtures/rails4/app/app/models/mongo_model.rb +0 -6
  285. data/features/fixtures/rails4/app/app/models/user.rb +0 -6
  286. data/features/fixtures/rails4/app/app/views/layouts/application.html.erb +0 -14
  287. data/features/fixtures/rails4/app/config.ru +0 -4
  288. data/features/fixtures/rails4/app/config/application.rb +0 -23
  289. data/features/fixtures/rails4/app/config/boot.rb +0 -4
  290. data/features/fixtures/rails4/app/config/database.yml +0 -31
  291. data/features/fixtures/rails4/app/config/environment.rb +0 -5
  292. data/features/fixtures/rails4/app/config/environments/development.rb +0 -31
  293. data/features/fixtures/rails4/app/config/environments/production.rb +0 -81
  294. data/features/fixtures/rails4/app/config/environments/rails_env.rb +0 -30
  295. data/features/fixtures/rails4/app/config/environments/test.rb +0 -31
  296. data/features/fixtures/rails4/app/config/initializers/backtrace_silencers.rb +0 -7
  297. data/features/fixtures/rails4/app/config/initializers/bugsnag.rb +0 -20
  298. data/features/fixtures/rails4/app/config/initializers/devise.rb +0 -283
  299. data/features/fixtures/rails4/app/config/initializers/filter_parameter_logging.rb +0 -5
  300. data/features/fixtures/rails4/app/config/initializers/inflections.rb +0 -16
  301. data/features/fixtures/rails4/app/config/initializers/mime_types.rb +0 -5
  302. data/features/fixtures/rails4/app/config/initializers/secret_token.rb +0 -12
  303. data/features/fixtures/rails4/app/config/initializers/session_store.rb +0 -3
  304. data/features/fixtures/rails4/app/config/initializers/wrap_parameters.rb +0 -14
  305. data/features/fixtures/rails4/app/config/locales/devise.en.yml +0 -64
  306. data/features/fixtures/rails4/app/config/locales/en.yml +0 -23
  307. data/features/fixtures/rails4/app/config/mongoid.yml +0 -22
  308. data/features/fixtures/rails4/app/config/routes.rb +0 -21
  309. data/features/fixtures/rails4/app/db/migrate/20180420160315_devise_create_users.rb +0 -47
  310. data/features/fixtures/rails4/app/db/seeds.rb +0 -7
  311. data/features/fixtures/rails4/app/lib/assets/.keep +0 -0
  312. data/features/fixtures/rails4/app/lib/tasks/.keep +0 -0
  313. data/features/fixtures/rails4/app/log/.keep +0 -0
  314. data/features/fixtures/rails4/app/public/404.html +0 -58
  315. data/features/fixtures/rails4/app/public/422.html +0 -58
  316. data/features/fixtures/rails4/app/public/500.html +0 -57
  317. data/features/fixtures/rails4/app/public/favicon.ico +0 -0
  318. data/features/fixtures/rails4/app/public/robots.txt +0 -5
  319. data/features/fixtures/rails4/app/test/controllers/.keep +0 -0
  320. data/features/fixtures/rails4/app/test/fixtures/.keep +0 -0
  321. data/features/fixtures/rails4/app/test/helpers/.keep +0 -0
  322. data/features/fixtures/rails4/app/test/integration/.keep +0 -0
  323. data/features/fixtures/rails4/app/test/mailers/.keep +0 -0
  324. data/features/fixtures/rails4/app/test/models/.keep +0 -0
  325. data/features/fixtures/rails4/app/test/test_helper.rb +0 -15
  326. data/features/fixtures/rails5/.dockerignore +0 -1
  327. data/features/fixtures/rails5/Dockerfile +0 -17
  328. data/features/fixtures/rails5/app/.gitignore +0 -21
  329. data/features/fixtures/rails5/app/Gemfile +0 -52
  330. data/features/fixtures/rails5/app/README.md +0 -24
  331. data/features/fixtures/rails5/app/Rakefile +0 -6
  332. data/features/fixtures/rails5/app/app/assets/config/manifest.js +0 -3
  333. data/features/fixtures/rails5/app/app/assets/images/.keep +0 -0
  334. data/features/fixtures/rails5/app/app/assets/javascripts/application.js +0 -16
  335. data/features/fixtures/rails5/app/app/assets/javascripts/cable.js +0 -13
  336. data/features/fixtures/rails5/app/app/assets/javascripts/channels/.keep +0 -0
  337. data/features/fixtures/rails5/app/app/assets/stylesheets/application.css +0 -15
  338. data/features/fixtures/rails5/app/app/channels/application_cable/channel.rb +0 -4
  339. data/features/fixtures/rails5/app/app/channels/application_cable/connection.rb +0 -4
  340. data/features/fixtures/rails5/app/app/controllers/api_key_controller.rb +0 -16
  341. data/features/fixtures/rails5/app/app/controllers/app_type_controller.rb +0 -16
  342. data/features/fixtures/rails5/app/app/controllers/app_version_controller.rb +0 -21
  343. data/features/fixtures/rails5/app/app/controllers/application_controller.rb +0 -7
  344. data/features/fixtures/rails5/app/app/controllers/auto_notify_controller.rb +0 -27
  345. data/features/fixtures/rails5/app/app/controllers/before_notify_controller.rb +0 -40
  346. data/features/fixtures/rails5/app/app/controllers/breadcrumbs_controller.rb +0 -24
  347. data/features/fixtures/rails5/app/app/controllers/clearance_controller.rb +0 -33
  348. data/features/fixtures/rails5/app/app/controllers/concerns/.keep +0 -0
  349. data/features/fixtures/rails5/app/app/controllers/handled_controller.rb +0 -22
  350. data/features/fixtures/rails5/app/app/controllers/ignore_classes_controller.rb +0 -19
  351. data/features/fixtures/rails5/app/app/controllers/metadata_filters_controller.rb +0 -12
  352. data/features/fixtures/rails5/app/app/controllers/mongo_controller.rb +0 -22
  353. data/features/fixtures/rails5/app/app/controllers/project_root_controller.rb +0 -21
  354. data/features/fixtures/rails5/app/app/controllers/release_stage_controller.rb +0 -16
  355. data/features/fixtures/rails5/app/app/controllers/send_code_controller.rb +0 -16
  356. data/features/fixtures/rails5/app/app/controllers/send_environment_controller.rb +0 -8
  357. data/features/fixtures/rails5/app/app/controllers/session_tracking_controller.rb +0 -20
  358. data/features/fixtures/rails5/app/app/controllers/unhandled_controller.rb +0 -7
  359. data/features/fixtures/rails5/app/app/helpers/application_helper.rb +0 -2
  360. data/features/fixtures/rails5/app/app/jobs/application_job.rb +0 -2
  361. data/features/fixtures/rails5/app/app/jobs/notify_job.rb +0 -5
  362. data/features/fixtures/rails5/app/app/mailers/application_mailer.rb +0 -4
  363. data/features/fixtures/rails5/app/app/models/application_record.rb +0 -3
  364. data/features/fixtures/rails5/app/app/models/concerns/.keep +0 -0
  365. data/features/fixtures/rails5/app/app/models/mongo_model.rb +0 -6
  366. data/features/fixtures/rails5/app/app/models/user.rb +0 -3
  367. data/features/fixtures/rails5/app/app/views/layouts/application.html.erb +0 -14
  368. data/features/fixtures/rails5/app/app/views/layouts/mailer.html.erb +0 -13
  369. data/features/fixtures/rails5/app/app/views/layouts/mailer.text.erb +0 -1
  370. data/features/fixtures/rails5/app/config.ru +0 -5
  371. data/features/fixtures/rails5/app/config/application.rb +0 -15
  372. data/features/fixtures/rails5/app/config/boot.rb +0 -3
  373. data/features/fixtures/rails5/app/config/cable.yml +0 -9
  374. data/features/fixtures/rails5/app/config/database.yml +0 -29
  375. data/features/fixtures/rails5/app/config/environment.rb +0 -5
  376. data/features/fixtures/rails5/app/config/environments/development.rb +0 -55
  377. data/features/fixtures/rails5/app/config/environments/production.rb +0 -87
  378. data/features/fixtures/rails5/app/config/environments/rails_env.rb +0 -55
  379. data/features/fixtures/rails5/app/config/environments/test.rb +0 -55
  380. data/features/fixtures/rails5/app/config/initializers/assets.rb +0 -11
  381. data/features/fixtures/rails5/app/config/initializers/backtrace_silencers.rb +0 -7
  382. data/features/fixtures/rails5/app/config/initializers/bugsnag.rb +0 -20
  383. data/features/fixtures/rails5/app/config/initializers/clearance.rb +0 -5
  384. data/features/fixtures/rails5/app/config/initializers/cookies_serializer.rb +0 -5
  385. data/features/fixtures/rails5/app/config/initializers/filter_parameter_logging.rb +0 -5
  386. data/features/fixtures/rails5/app/config/initializers/inflections.rb +0 -16
  387. data/features/fixtures/rails5/app/config/initializers/mime_types.rb +0 -4
  388. data/features/fixtures/rails5/app/config/initializers/new_framework_defaults.rb +0 -24
  389. data/features/fixtures/rails5/app/config/initializers/session_store.rb +0 -3
  390. data/features/fixtures/rails5/app/config/initializers/wrap_parameters.rb +0 -14
  391. data/features/fixtures/rails5/app/config/locales/devise.en.yml +0 -64
  392. data/features/fixtures/rails5/app/config/locales/en.yml +0 -23
  393. data/features/fixtures/rails5/app/config/mongoid.yml +0 -23
  394. data/features/fixtures/rails5/app/config/puma.rb +0 -47
  395. data/features/fixtures/rails5/app/config/routes.rb +0 -62
  396. data/features/fixtures/rails5/app/config/secrets.yml +0 -25
  397. data/features/fixtures/rails5/app/config/spring.rb +0 -6
  398. data/features/fixtures/rails5/app/db/migrate/20180426095545_create_users.rb +0 -17
  399. data/features/fixtures/rails5/app/db/schema.rb +0 -29
  400. data/features/fixtures/rails5/app/db/seeds.rb +0 -7
  401. data/features/fixtures/rails5/app/lib/assets/.keep +0 -0
  402. data/features/fixtures/rails5/app/lib/tasks/.keep +0 -0
  403. data/features/fixtures/rails5/app/log/.keep +0 -0
  404. data/features/fixtures/rails5/app/public/404.html +0 -67
  405. data/features/fixtures/rails5/app/public/422.html +0 -67
  406. data/features/fixtures/rails5/app/public/500.html +0 -66
  407. data/features/fixtures/rails5/app/public/apple-touch-icon-precomposed.png +0 -0
  408. data/features/fixtures/rails5/app/public/apple-touch-icon.png +0 -0
  409. data/features/fixtures/rails5/app/public/favicon.ico +0 -0
  410. data/features/fixtures/rails5/app/public/robots.txt +0 -5
  411. data/features/fixtures/rails5/app/test/controllers/.keep +0 -0
  412. data/features/fixtures/rails5/app/test/fixtures/.keep +0 -0
  413. data/features/fixtures/rails5/app/test/fixtures/files/.keep +0 -0
  414. data/features/fixtures/rails5/app/test/helpers/.keep +0 -0
  415. data/features/fixtures/rails5/app/test/integration/.keep +0 -0
  416. data/features/fixtures/rails5/app/test/mailers/.keep +0 -0
  417. data/features/fixtures/rails5/app/test/models/.keep +0 -0
  418. data/features/fixtures/rails5/app/test/test_helper.rb +0 -10
  419. data/features/fixtures/rails5/app/tmp/.keep +0 -0
  420. data/features/fixtures/rails6/.dockerignore +0 -1
  421. data/features/fixtures/rails6/Dockerfile +0 -26
  422. data/features/fixtures/rails6/app/.browserslistrc +0 -1
  423. data/features/fixtures/rails6/app/.gitignore +0 -35
  424. data/features/fixtures/rails6/app/.ruby-version +0 -1
  425. data/features/fixtures/rails6/app/Gemfile +0 -57
  426. data/features/fixtures/rails6/app/README.md +0 -24
  427. data/features/fixtures/rails6/app/Rakefile +0 -6
  428. data/features/fixtures/rails6/app/app/assets/config/manifest.js +0 -2
  429. data/features/fixtures/rails6/app/app/assets/images/.keep +0 -0
  430. data/features/fixtures/rails6/app/app/assets/stylesheets/application.css +0 -15
  431. data/features/fixtures/rails6/app/app/channels/application_cable/channel.rb +0 -4
  432. data/features/fixtures/rails6/app/app/channels/application_cable/connection.rb +0 -4
  433. data/features/fixtures/rails6/app/app/controllers/api_key_controller.rb +0 -16
  434. data/features/fixtures/rails6/app/app/controllers/app_type_controller.rb +0 -16
  435. data/features/fixtures/rails6/app/app/controllers/app_version_controller.rb +0 -21
  436. data/features/fixtures/rails6/app/app/controllers/application_controller.rb +0 -7
  437. data/features/fixtures/rails6/app/app/controllers/auto_notify_controller.rb +0 -27
  438. data/features/fixtures/rails6/app/app/controllers/before_notify_controller.rb +0 -40
  439. data/features/fixtures/rails6/app/app/controllers/breadcrumbs_controller.rb +0 -24
  440. data/features/fixtures/rails6/app/app/controllers/clearance_controller.rb +0 -33
  441. data/features/fixtures/rails6/app/app/controllers/concerns/.keep +0 -0
  442. data/features/fixtures/rails6/app/app/controllers/handled_controller.rb +0 -22
  443. data/features/fixtures/rails6/app/app/controllers/ignore_classes_controller.rb +0 -19
  444. data/features/fixtures/rails6/app/app/controllers/metadata_filters_controller.rb +0 -12
  445. data/features/fixtures/rails6/app/app/controllers/project_root_controller.rb +0 -21
  446. data/features/fixtures/rails6/app/app/controllers/release_stage_controller.rb +0 -16
  447. data/features/fixtures/rails6/app/app/controllers/send_code_controller.rb +0 -16
  448. data/features/fixtures/rails6/app/app/controllers/send_environment_controller.rb +0 -8
  449. data/features/fixtures/rails6/app/app/controllers/session_tracking_controller.rb +0 -20
  450. data/features/fixtures/rails6/app/app/controllers/unhandled_controller.rb +0 -7
  451. data/features/fixtures/rails6/app/app/helpers/application_helper.rb +0 -2
  452. data/features/fixtures/rails6/app/app/javascript/channels/consumer.js +0 -6
  453. data/features/fixtures/rails6/app/app/javascript/channels/index.js +0 -5
  454. data/features/fixtures/rails6/app/app/javascript/packs/application.js +0 -9
  455. data/features/fixtures/rails6/app/app/jobs/application_job.rb +0 -7
  456. data/features/fixtures/rails6/app/app/jobs/notify_job.rb +0 -5
  457. data/features/fixtures/rails6/app/app/mailers/application_mailer.rb +0 -4
  458. data/features/fixtures/rails6/app/app/models/application_record.rb +0 -3
  459. data/features/fixtures/rails6/app/app/models/concerns/.keep +0 -0
  460. data/features/fixtures/rails6/app/app/models/user.rb +0 -3
  461. data/features/fixtures/rails6/app/app/views/layouts/application.html.erb +0 -15
  462. data/features/fixtures/rails6/app/app/views/layouts/mailer.html.erb +0 -13
  463. data/features/fixtures/rails6/app/app/views/layouts/mailer.text.erb +0 -1
  464. data/features/fixtures/rails6/app/babel.config.js +0 -70
  465. data/features/fixtures/rails6/app/config.ru +0 -5
  466. data/features/fixtures/rails6/app/config/application.rb +0 -19
  467. data/features/fixtures/rails6/app/config/boot.rb +0 -4
  468. data/features/fixtures/rails6/app/config/cable.yml +0 -13
  469. data/features/fixtures/rails6/app/config/credentials.yml.enc +0 -1
  470. data/features/fixtures/rails6/app/config/database.yml +0 -29
  471. data/features/fixtures/rails6/app/config/environment.rb +0 -5
  472. data/features/fixtures/rails6/app/config/environments/development.rb +0 -62
  473. data/features/fixtures/rails6/app/config/environments/production.rb +0 -112
  474. data/features/fixtures/rails6/app/config/environments/rails_env.rb +0 -55
  475. data/features/fixtures/rails6/app/config/environments/test.rb +0 -47
  476. data/features/fixtures/rails6/app/config/initializers/application_controller_renderer.rb +0 -8
  477. data/features/fixtures/rails6/app/config/initializers/assets.rb +0 -14
  478. data/features/fixtures/rails6/app/config/initializers/backtrace_silencers.rb +0 -7
  479. data/features/fixtures/rails6/app/config/initializers/bugsnag.rb +0 -20
  480. data/features/fixtures/rails6/app/config/initializers/content_security_policy.rb +0 -27
  481. data/features/fixtures/rails6/app/config/initializers/cookies_serializer.rb +0 -5
  482. data/features/fixtures/rails6/app/config/initializers/filter_parameter_logging.rb +0 -5
  483. data/features/fixtures/rails6/app/config/initializers/inflections.rb +0 -16
  484. data/features/fixtures/rails6/app/config/initializers/mime_types.rb +0 -4
  485. data/features/fixtures/rails6/app/config/initializers/wrap_parameters.rb +0 -14
  486. data/features/fixtures/rails6/app/config/locales/en.yml +0 -33
  487. data/features/fixtures/rails6/app/config/puma.rb +0 -35
  488. data/features/fixtures/rails6/app/config/routes.rb +0 -58
  489. data/features/fixtures/rails6/app/config/secrets.yml +0 -25
  490. data/features/fixtures/rails6/app/config/spring.rb +0 -6
  491. data/features/fixtures/rails6/app/config/storage.yml +0 -34
  492. data/features/fixtures/rails6/app/config/webpack/development.js +0 -5
  493. data/features/fixtures/rails6/app/config/webpack/environment.js +0 -3
  494. data/features/fixtures/rails6/app/config/webpack/production.js +0 -5
  495. data/features/fixtures/rails6/app/config/webpack/rails_env.js +0 -5
  496. data/features/fixtures/rails6/app/config/webpack/test.js +0 -5
  497. data/features/fixtures/rails6/app/config/webpacker.yml +0 -121
  498. data/features/fixtures/rails6/app/db/migrate/20180426095545_create_users.rb +0 -17
  499. data/features/fixtures/rails6/app/db/schema.rb +0 -29
  500. data/features/fixtures/rails6/app/db/seeds.rb +0 -7
  501. data/features/fixtures/rails6/app/lib/assets/.keep +0 -0
  502. data/features/fixtures/rails6/app/lib/tasks/.keep +0 -0
  503. data/features/fixtures/rails6/app/log/.keep +0 -0
  504. data/features/fixtures/rails6/app/package.json +0 -15
  505. data/features/fixtures/rails6/app/postcss.config.js +0 -12
  506. data/features/fixtures/rails6/app/public/404.html +0 -67
  507. data/features/fixtures/rails6/app/public/422.html +0 -67
  508. data/features/fixtures/rails6/app/public/500.html +0 -66
  509. data/features/fixtures/rails6/app/public/apple-touch-icon-precomposed.png +0 -0
  510. data/features/fixtures/rails6/app/public/apple-touch-icon.png +0 -0
  511. data/features/fixtures/rails6/app/public/favicon.ico +0 -0
  512. data/features/fixtures/rails6/app/public/robots.txt +0 -1
  513. data/features/fixtures/rails6/app/storage/.keep +0 -0
  514. data/features/fixtures/rails6/app/test/application_system_test_case.rb +0 -5
  515. data/features/fixtures/rails6/app/test/channels/application_cable/connection_test.rb +0 -11
  516. data/features/fixtures/rails6/app/test/controllers/.keep +0 -0
  517. data/features/fixtures/rails6/app/test/fixtures/.keep +0 -0
  518. data/features/fixtures/rails6/app/test/fixtures/files/.keep +0 -0
  519. data/features/fixtures/rails6/app/test/helpers/.keep +0 -0
  520. data/features/fixtures/rails6/app/test/integration/.keep +0 -0
  521. data/features/fixtures/rails6/app/test/mailers/.keep +0 -0
  522. data/features/fixtures/rails6/app/test/models/.keep +0 -0
  523. data/features/fixtures/rails6/app/test/system/.keep +0 -0
  524. data/features/fixtures/rails6/app/test/test_helper.rb +0 -13
  525. data/features/fixtures/rails6/app/tmp/.keep +0 -0
  526. data/features/fixtures/rails6/app/yarn.lock +0 -6082
  527. data/features/fixtures/resque/.dockerignore +0 -1
  528. data/features/fixtures/resque/Dockerfile +0 -14
  529. data/features/fixtures/resque/Gemfile +0 -6
  530. data/features/fixtures/resque/Rakefile +0 -4
  531. data/features/fixtures/resque/app.rb +0 -12
  532. data/features/fixtures/sidekiq/.dockerignore +0 -2
  533. data/features/fixtures/sidekiq/Dockerfile +0 -19
  534. data/features/fixtures/sidekiq/app/Gemfile +0 -6
  535. data/features/fixtures/sidekiq/app/app.rb +0 -35
  536. data/features/fixtures/sidekiq/app/initializers/HandledError.rb +0 -3
  537. data/features/fixtures/sidekiq/app/initializers/UnhandledError.rb +0 -3
  538. data/features/fixtures/sidekiq/payloads/handled_metadata_ca_false.json +0 -11
  539. data/features/fixtures/sidekiq/payloads/handled_metadata_ca_true.json +0 -12
  540. data/features/fixtures/sidekiq/payloads/unhandled_metadata_ca_false.json +0 -11
  541. data/features/fixtures/sidekiq/payloads/unhandled_metadata_ca_true.json +0 -12
  542. data/features/fixtures/sinatra1/.dockerignore +0 -1
  543. data/features/fixtures/sinatra1/Dockerfile +0 -13
  544. data/features/fixtures/sinatra1/Gemfile +0 -4
  545. data/features/fixtures/sinatra1/app.rb +0 -9
  546. data/features/fixtures/sinatra2/.dockerignore +0 -1
  547. data/features/fixtures/sinatra2/Dockerfile +0 -13
  548. data/features/fixtures/sinatra2/Gemfile +0 -4
  549. data/features/fixtures/sinatra2/app.rb +0 -9
  550. data/features/plain_features/add_tab.feature +0 -122
  551. data/features/plain_features/api_key.feature +0 -25
  552. data/features/plain_features/app_type.feature +0 -27
  553. data/features/plain_features/app_version.feature +0 -27
  554. data/features/plain_features/auto_notify.feature +0 -23
  555. data/features/plain_features/delivery.feature +0 -68
  556. data/features/plain_features/exception_data.feature +0 -120
  557. data/features/plain_features/filters.feature +0 -48
  558. data/features/plain_features/handled_errors.feature +0 -104
  559. data/features/plain_features/ignore_classes.feature +0 -29
  560. data/features/plain_features/ignore_report.feature +0 -30
  561. data/features/plain_features/proxies.feature +0 -68
  562. data/features/plain_features/release_stages.feature +0 -51
  563. data/features/plain_features/report_api_key.feature +0 -40
  564. data/features/plain_features/report_severity.feature +0 -42
  565. data/features/plain_features/report_stack_frames.feature +0 -117
  566. data/features/plain_features/report_user.feature +0 -118
  567. data/features/plain_features/unhandled_errors.feature +0 -104
  568. data/features/rails_features/api_key.feature +0 -65
  569. data/features/rails_features/app_type.feature +0 -73
  570. data/features/rails_features/app_version.feature +0 -93
  571. data/features/rails_features/auto_capture_sessions.feature +0 -123
  572. data/features/rails_features/auto_notify.feature +0 -126
  573. data/features/rails_features/before_notify.feature +0 -115
  574. data/features/rails_features/breadcrumbs.feature +0 -150
  575. data/features/rails_features/handled.feature +0 -112
  576. data/features/rails_features/ignore_classes.feature +0 -57
  577. data/features/rails_features/meta_data_filters.feature +0 -42
  578. data/features/rails_features/mongo_breadcrumbs.feature +0 -109
  579. data/features/rails_features/project_root.feature +0 -106
  580. data/features/rails_features/release_stage.feature +0 -95
  581. data/features/rails_features/send_code.feature +0 -64
  582. data/features/rails_features/send_environment.feature +0 -41
  583. data/features/rails_features/unhandled.feature +0 -43
  584. data/features/rails_features/user_info.feature +0 -93
  585. data/features/sidekiq.feature +0 -97
  586. data/features/steps/ruby_notifier_steps.rb +0 -31
  587. data/features/support/env.rb +0 -56
  588. data/issue_template.md +0 -48
  589. data/spec/breadcrumbs/breadcrumb_spec.rb +0 -93
  590. data/spec/breadcrumbs/validator_spec.rb +0 -201
  591. data/spec/bugsnag_spec.rb +0 -366
  592. data/spec/cleaner_spec.rb +0 -158
  593. data/spec/configuration_spec.rb +0 -430
  594. data/spec/fixtures/apps/rails-initializer-config/Gemfile +0 -5
  595. data/spec/fixtures/apps/rails-initializer-config/config.ru +0 -16
  596. data/spec/fixtures/apps/rails-initializer-config/config/initializers/bugsnag.rb +0 -3
  597. data/spec/fixtures/apps/rails-invalid-initializer-config/Gemfile +0 -5
  598. data/spec/fixtures/apps/rails-invalid-initializer-config/config.ru +0 -16
  599. data/spec/fixtures/apps/rails-invalid-initializer-config/config/initializers/bugsnag.rb +0 -3
  600. data/spec/fixtures/apps/rails-no-config/Gemfile +0 -5
  601. data/spec/fixtures/apps/rails-no-config/config.ru +0 -16
  602. data/spec/fixtures/apps/scripts/Gemfile +0 -3
  603. data/spec/fixtures/apps/scripts/configure_invalid_key.rb +0 -5
  604. data/spec/fixtures/apps/scripts/configure_key.rb +0 -5
  605. data/spec/fixtures/apps/scripts/no_config.rb +0 -3
  606. data/spec/fixtures/crashes/end_of_file.rb +0 -9
  607. data/spec/fixtures/crashes/short_file.rb +0 -1
  608. data/spec/fixtures/crashes/start_of_file.rb +0 -9
  609. data/spec/fixtures/middleware/internal_info_setter.rb +0 -11
  610. data/spec/fixtures/middleware/public_info_setter.rb +0 -11
  611. data/spec/fixtures/tasks/Rakefile +0 -26
  612. data/spec/helper_spec.rb +0 -162
  613. data/spec/integration_spec.rb +0 -107
  614. data/spec/integrations/clearance_user_spec.rb +0 -38
  615. data/spec/integrations/logger_spec.rb +0 -134
  616. data/spec/integrations/mailman_spec.rb +0 -83
  617. data/spec/integrations/mongo_spec.rb +0 -262
  618. data/spec/integrations/que_spec.rb +0 -94
  619. data/spec/integrations/rack_spec.rb +0 -230
  620. data/spec/integrations/rails3_request_spec.rb +0 -67
  621. data/spec/integrations/rake_spec.rb +0 -71
  622. data/spec/integrations/resque_spec.rb +0 -99
  623. data/spec/integrations/shoryuken_spec.rb +0 -70
  624. data/spec/integrations/sidekiq_spec.rb +0 -137
  625. data/spec/integrations/warden_user_spec.rb +0 -41
  626. data/spec/middleware/exception_meta_data_spec.rb +0 -104
  627. data/spec/middleware_spec.rb +0 -254
  628. data/spec/middleware_stack_spec.rb +0 -151
  629. data/spec/report_spec.rb +0 -1282
  630. data/spec/session_tracker_spec.rb +0 -156
  631. data/spec/spec_helper.rb +0 -86
  632. data/spec/stacktrace_spec.rb +0 -90
  633. data/spec/utility/circular_buffer_spec.rb +0 -98
@@ -1,254 +0,0 @@
1
- require 'spec_helper'
2
- require 'fixtures/middleware/public_info_setter'
3
- require 'fixtures/middleware/internal_info_setter'
4
-
5
- describe Bugsnag::MiddlewareStack do
6
- it "runs before_bugsnag_notify callbacks, adding a tab" do
7
- callback_run_count = 0
8
- Bugsnag.before_notify_callbacks << lambda {|notif|
9
- notif.add_tab(:some_tab, {
10
- :info => "here",
11
- :data => "also here"
12
- })
13
- callback_run_count += 1
14
- }
15
-
16
- Bugsnag.notify(BugsnagTestException.new("It crashed"))
17
- expect(callback_run_count).to eq(1)
18
-
19
- expect(Bugsnag).to have_sent_notification{ |payload, headers|
20
- event = get_event_from_payload(payload)
21
- expect(event["metaData"]["some_tab"]).not_to be_nil
22
- expect(event["metaData"]["some_tab"]["info"]).to eq("here")
23
- expect(event["metaData"]["some_tab"]["data"]).to eq("also here")
24
- }
25
-
26
- end
27
-
28
- it "runs before_bugsnag_notify callbacks, adding custom data" do
29
- callback_run_count = 0
30
- Bugsnag.before_notify_callbacks << lambda {|notif|
31
- notif.add_tab(:custom, {info: "here"})
32
- notif.add_tab(:custom, {data: "also here"})
33
-
34
- callback_run_count += 1
35
- }
36
-
37
- Bugsnag.notify(BugsnagTestException.new("It crashed"))
38
- expect(callback_run_count).to eq(1)
39
-
40
- expect(Bugsnag).to have_sent_notification{ |payload, headers|
41
- event = get_event_from_payload(payload)
42
- expect(event["metaData"]["custom"]).not_to be_nil
43
- expect(event["metaData"]["custom"]["info"]).to eq("here")
44
- expect(event["metaData"]["custom"]["data"]).to eq("also here")
45
- }
46
-
47
- end
48
-
49
- it "runs before_bugsnag_notify callbacks, setting the user" do
50
- callback_run_count = 0
51
- Bugsnag.before_notify_callbacks << lambda {|notif|
52
- notif.user = {:id => "here", :email => "also here", :name => "also here too", :random_key => "also here too too"}
53
- callback_run_count += 1
54
- }
55
-
56
- Bugsnag.notify(BugsnagTestException.new("It crashed"))
57
- expect(callback_run_count).to eq(1)
58
-
59
- expect(Bugsnag).to have_sent_notification{ |payload, headers|
60
- event = get_event_from_payload(payload)
61
- expect(event["user"]).not_to be_nil
62
- expect(event["user"]["id"]).to eq("here")
63
- expect(event["user"]["email"]).to eq("also here")
64
- expect(event["user"]["name"]).to eq("also here too")
65
- expect(event["user"]["random_key"]).to eq("also here too too")
66
- }
67
-
68
- end
69
-
70
- it "allows block to override values set by internal middleware" do
71
- Bugsnag.configuration.internal_middleware.use(InternalInfoSetter)
72
- Bugsnag.notify(BugsnagTestException.new("It crashed")) do |report|
73
- report.meta_data.merge!({custom: {info: 'overridden'}})
74
- end
75
-
76
- expect(Bugsnag).to have_sent_notification{ |payload, headers|
77
- event = get_event_from_payload(payload)
78
- expect(event["metaData"]["custom"]).not_to be_nil
79
- expect(event["metaData"]["custom"]["info"]).to eq("overridden")
80
- }
81
- end
82
-
83
- it "allows block to override public middleware" do
84
- Bugsnag.configuration.middleware.use(PublicInfoSetter)
85
-
86
- Bugsnag.notify(BugsnagTestException.new("It crashed")) do |report|
87
- report.meta_data.merge!({custom: {info: 'overridden'}})
88
- end
89
-
90
- expect(Bugsnag).to have_sent_notification{ |payload, headers|
91
- event = get_event_from_payload(payload)
92
- expect(event["metaData"]["custom"]).not_to be_nil
93
- expect(event["metaData"]["custom"]["info"]).to eq("overridden")
94
- }
95
- end
96
-
97
- it "does not have have before callbacks by default" do
98
- expect(Bugsnag.before_notify_callbacks.size).to eq(0)
99
- Bugsnag.notify(BugsnagTestException.new("It crashed"))
100
- expect(Bugsnag).to have_sent_notification{ |payload, headers|
101
- event = get_event_from_payload(payload)
102
- expect(event["metaData"].size).to eq(0)
103
- }
104
- end
105
-
106
- it "does not execute disabled bugsnag middleware" do
107
- callback_run_count = 0
108
- Bugsnag.configure do |config|
109
- config.middleware.disable(Bugsnag::Middleware::Callbacks)
110
- end
111
-
112
- Bugsnag.before_notify_callbacks << lambda {|notif|
113
- callback_run_count += 1
114
- }
115
-
116
- Bugsnag.notify(BugsnagTestException.new("It crashed"))
117
- expect(callback_run_count).to eq(0)
118
- end
119
-
120
- it "does not notify if a callback told so" do
121
- Bugsnag.before_notify_callbacks << lambda do |notif|
122
- notif.ignore!
123
- end
124
- Bugsnag.notify(BugsnagTestException.new("It crashed"))
125
- expect(Bugsnag).not_to have_sent_notification
126
- end
127
-
128
- it "allows inspection of meta_data before ignoring exception" do
129
- # Use before notify callbacks as only the callback based metadata is
130
- # available to before_notify_callbacks
131
- Bugsnag.before_notify_callbacks << lambda do |notif|
132
- notif.add_tab(:sidekiq, {:retry_count => 4})
133
- end
134
-
135
- Bugsnag.before_notify_callbacks << lambda do |notif|
136
- notif.ignore! if notif.meta_data[:sidekiq][:retry_count] > 3
137
- end
138
-
139
- Bugsnag.notify(BugsnagTestException.new("It crashed"))
140
- expect(Bugsnag).not_to have_sent_notification
141
-
142
- end
143
-
144
- it "allows meta_data to be modified in a middleware" do
145
- MetaDataAdder = Class.new do
146
- def initialize(bugsnag)
147
- @bugsnag = bugsnag
148
- end
149
-
150
- def call(report)
151
- report.meta_data = {test: {value: "abcdef123456abcdef123456abcdef123456"}}
152
- @bugsnag.call(report)
153
- end
154
- end
155
-
156
- MetaDataMunger = Class.new do
157
- def initialize(bugsnag)
158
- @bugsnag = bugsnag
159
- end
160
-
161
- def call(report)
162
- token = report.meta_data[:test][:value]
163
- report.meta_data[:test][:value] = "#{token[0...6]}*****#{token[-4..-1]}"
164
- @bugsnag.call(report)
165
- end
166
- end
167
-
168
- Bugsnag.configure do |c|
169
- c.middleware.use MetaDataAdder
170
- c.middleware.use MetaDataMunger
171
- end
172
-
173
- Bugsnag.notify(BugsnagTestException.new("It crashed"))
174
-
175
- expect(Bugsnag).to have_sent_notification{ |payload, headers|
176
- event = get_event_from_payload(payload)
177
- expect(event["metaData"]['test']['value']).to eq("abcdef*****3456")
178
- }
179
- end
180
-
181
- if ruby_version_greater_equal?("2.3.0")
182
- context "with a ruby version >= 2.3.0" do
183
- it "attaches did you mean metadata when necessary" do
184
- begin
185
- "Test".prepnd "T"
186
- rescue Exception => e
187
- Bugsnag.notify(e)
188
- end
189
-
190
- expect(Bugsnag).to have_sent_notification{ |payload, headers|
191
- event = get_event_from_payload(payload)
192
- expect(event["metaData"]["error"]).to_not be_nil
193
- expect(event["metaData"]["error"]).to eq({"suggestion" => "prepend"})
194
- }
195
- end
196
- end
197
- end
198
-
199
- context "with a ruby version < 2.3.0" do
200
- if !ruby_version_greater_equal?("2.3.0")
201
- it "doesn't attach did you mean metadata" do
202
- begin
203
- "Test".prepnd "T"
204
- rescue Exception => e
205
- Bugsnag.notify(e)
206
- end
207
-
208
- expect(Bugsnag).to have_sent_notification{ |payload, headers|
209
- event = get_event_from_payload(payload)
210
- expect(event["metaData"]["error"]).to be_nil
211
- }
212
- end
213
- end
214
- end
215
-
216
- it "doesn't allow handledState properties to be changed in middleware" do
217
- HandledStateChanger = Class.new do
218
- def initialize(bugsnag)
219
- @bugsnag = bugsnag
220
- end
221
-
222
- def call(report)
223
- report.severity_reason = {
224
- :test => "test"
225
- }
226
- @bugsnag.call(report)
227
- end
228
- end
229
-
230
- Bugsnag.configure do |c|
231
- c.middleware.use HandledStateChanger
232
- end
233
-
234
- Bugsnag.notify(BugsnagTestException.new("It crashed"), true) do |report|
235
- report.severity_reason = {
236
- :type => "middleware_handler",
237
- :attributes => {
238
- :name => "middleware_test"
239
- }
240
- }
241
- end
242
-
243
- expect(Bugsnag).to have_sent_notification{ |payload, headers|
244
- event = get_event_from_payload(payload)
245
- expect(event["unhandled"]).to be true
246
- expect(event["severityReason"]).to eq({
247
- "type" => "middleware_handler",
248
- "attributes" => {
249
- "name" => "middleware_test"
250
- }
251
- })
252
- }
253
- end
254
- end
@@ -1,151 +0,0 @@
1
- require 'spec_helper'
2
-
3
- class TestMiddleware
4
- def initialize(bugsnag)
5
- @bugsnag = bugsnag
6
- end
7
-
8
- def call(report)
9
- @bugsnag.call(report)
10
- end
11
- end
12
-
13
- module Bugsnag
14
- class MiddlewareStack
15
- attr_reader :middlewares
16
- attr_reader :disabled_middleware
17
- end
18
- end
19
-
20
- describe Bugsnag::MiddlewareStack do
21
- describe "defaults" do
22
- it "to empty middleware lists" do
23
- expect(subject.middlewares.size).to eq(0)
24
- expect(subject.disabled_middleware.size).to eq(0)
25
- end
26
- end
27
-
28
- describe "use" do
29
- it "allows middleware to be added to the stack" do
30
- middleware = TestMiddleware.new(nil)
31
- subject.use(middleware)
32
- expect(subject.middlewares.size).to eq(1)
33
- expect(subject.middlewares.last).to eq(middleware)
34
- end
35
-
36
- it "doesn't add middleware more than once" do
37
- middleware = TestMiddleware.new(nil)
38
- subject.use(middleware)
39
- expect(subject.middlewares.size).to eq(1)
40
- subject.use(middleware)
41
- expect(subject.middlewares.size).to eq(1)
42
- end
43
- end
44
-
45
- describe "disable" do
46
- it "adds middleware to a disabled list" do
47
- middleware = TestMiddleware.new(nil)
48
- subject.disable(middleware)
49
- expect(subject.disabled_middleware.size).to eq(1)
50
- expect(subject.disabled_middleware.last).to eq(middleware)
51
- end
52
-
53
- it "prevents middleware from being added" do
54
- middleware = TestMiddleware.new(nil)
55
- subject.disable(middleware)
56
- subject.use(middleware)
57
- expect(subject.middlewares.size).to eq(0)
58
- end
59
-
60
- it "removes already added middleware" do
61
- middleware = TestMiddleware.new(nil)
62
- subject.use(middleware)
63
- expect(subject.middlewares.size).to eq(1)
64
- subject.disable(middleware)
65
- expect(subject.middlewares.size).to eq(0)
66
- end
67
- end
68
-
69
- describe "insert_before" do
70
- it "inserts middleware before specified middleware" do
71
- middleware_one = TestMiddleware.new(nil)
72
- middleware_two = TestMiddleware.new(nil)
73
- subject.use(middleware_one)
74
- expect(subject.middlewares.size).to eq(1)
75
- expect(subject.middlewares.first).to eq(middleware_one)
76
- subject.insert_before(middleware_one, middleware_two)
77
- expect(subject.middlewares.size).to eq(2)
78
- expect(subject.middlewares.first).to eq(middleware_two)
79
- end
80
-
81
- it "appends middleware otherwise" do
82
- middleware_one = TestMiddleware.new(nil)
83
- middleware_two = TestMiddleware.new(nil)
84
- subject.use(middleware_one)
85
- expect(subject.middlewares.size).to eq(1)
86
- expect(subject.middlewares.first).to eq(middleware_one)
87
- subject.insert_before(nil, middleware_two)
88
- expect(subject.middlewares.size).to eq(2)
89
- expect(subject.middlewares.first).to eq(middleware_one)
90
- end
91
-
92
- it "accepts an array of middleware to insert before" do
93
- middleware_one = TestMiddleware.new(nil)
94
- middleware_two = TestMiddleware.new(nil)
95
- middleware_three = TestMiddleware.new(nil)
96
- subject.use(middleware_one)
97
- subject.use(middleware_two)
98
- expect(subject.middlewares.size).to eq(2)
99
- expect(subject.middlewares.first).to eq(middleware_one)
100
- subject.insert_before([middleware_one, middleware_two], middleware_three)
101
- expect(subject.middlewares.size).to eq(3)
102
- expect(subject.middlewares.first).to eq(middleware_three)
103
- end
104
- end
105
-
106
- describe "insert_after" do
107
- it "inserts middleware after specified middleware" do
108
- middleware_one = TestMiddleware.new(nil)
109
- middleware_two = TestMiddleware.new(nil)
110
- subject.use(middleware_one)
111
- expect(subject.middlewares.size).to eq(1)
112
- expect(subject.middlewares.first).to eq(middleware_one)
113
- subject.insert_after(middleware_one, middleware_two)
114
- expect(subject.middlewares.size).to eq(2)
115
- expect(subject.middlewares.last).to eq(middleware_two)
116
- end
117
-
118
- it "appends middleware otherwise" do
119
- middleware_one = TestMiddleware.new(nil)
120
- middleware_two = TestMiddleware.new(nil)
121
- subject.use(middleware_one)
122
- expect(subject.middlewares.size).to eq(1)
123
- expect(subject.middlewares.first).to eq(middleware_one)
124
- subject.insert_after(nil, middleware_two)
125
- expect(subject.middlewares.size).to eq(2)
126
- expect(subject.middlewares.first).to eq(middleware_one)
127
- end
128
-
129
- it "accepts an array of middleware to insert after" do
130
- middleware_one = TestMiddleware.new(nil)
131
- middleware_two = TestMiddleware.new(nil)
132
- middleware_three = TestMiddleware.new(nil)
133
- subject.use(middleware_one)
134
- subject.use(middleware_two)
135
- expect(subject.middlewares.size).to eq(2)
136
- expect(subject.middlewares.last).to eq(middleware_two)
137
- subject.insert_after([middleware_one, middleware_two], middleware_three)
138
- expect(subject.middlewares.size).to eq(3)
139
- expect(subject.middlewares.last).to eq(middleware_three)
140
- end
141
- end
142
-
143
- describe "method_missing" do
144
- it "calls send and proxies the method into the array" do
145
- middleware = TestMiddleware.new(nil)
146
- subject.method_missing(:<<, middleware)
147
- expect(subject.middlewares.size).to eq(1)
148
- expect(subject.middlewares.last).to eq(middleware)
149
- end
150
- end
151
- end
@@ -1,1282 +0,0 @@
1
- # encoding: utf-8
2
- require 'spec_helper'
3
- require 'securerandom'
4
- require 'ostruct'
5
-
6
- module ActiveRecord; class RecordNotFound < RuntimeError; end; end
7
- class NestedException < StandardError; attr_accessor :original_exception; end
8
- class BugsnagTestExceptionWithMetaData < Exception; include Bugsnag::MetaData; end
9
- class BugsnagSubclassTestException < BugsnagTestException; end
10
-
11
- class Ruby21Exception < RuntimeError
12
- attr_accessor :cause
13
- def self.raise!(msg)
14
- e = new(msg)
15
- e.cause = $!
16
- raise e
17
- end
18
- end
19
-
20
- class JRubyException
21
- def self.raise!
22
- new.gloops
23
- end
24
-
25
- def gloops
26
- java.lang.System.out.printf(nil)
27
- end
28
- end
29
-
30
- describe Bugsnag::Report do
31
- it "should contain an api_key if one is set" do
32
- Bugsnag.notify(BugsnagTestException.new("It crashed"))
33
-
34
- expect(Bugsnag).to have_sent_notification{ |payload, headers|
35
- expect(headers["Bugsnag-Api-Key"]).to eq("c9d60ae4c7e70c4b6c4ebd3e8056d2b8")
36
- expect(payload["apiKey"]).to eq("c9d60ae4c7e70c4b6c4ebd3e8056d2b8")
37
- }
38
- end
39
-
40
- it "does not notify if api_key is not set" do
41
- Bugsnag.configuration.api_key = nil
42
-
43
- Bugsnag.notify(BugsnagTestException.new("It crashed"))
44
-
45
- expect(Bugsnag).not_to have_sent_notification
46
- end
47
-
48
- it "does not notify if api_key is empty" do
49
- Bugsnag.configuration.api_key = ""
50
-
51
- Bugsnag.notify(BugsnagTestException.new("It crashed"))
52
-
53
- expect(Bugsnag).not_to have_sent_notification
54
- end
55
-
56
- it "lets you override the api_key" do
57
- Bugsnag.notify(BugsnagTestException.new("It crashed")) do |report|
58
- report.api_key = "9d84383f9be2ca94902e45c756a9979d"
59
- end
60
-
61
- expect(Bugsnag).to have_sent_notification{ |payload, headers|
62
- expect(headers["Bugsnag-Api-Key"]).to eq("9d84383f9be2ca94902e45c756a9979d")
63
- }
64
- end
65
-
66
- it "lets you override the groupingHash" do
67
-
68
- Bugsnag.notify(BugsnagTestException.new("It crashed")) do |report|
69
- report.grouping_hash = "this is my grouping hash"
70
- end
71
-
72
- expect(Bugsnag).to have_sent_notification{ |payload, headers|
73
- event = get_event_from_payload(payload)
74
- expect(event["groupingHash"]).to eq("this is my grouping hash")
75
- }
76
- end
77
-
78
- it "uses the env variable apiKey" do
79
- ENV["BUGSNAG_API_KEY"] = "c9d60ae4c7e70c4b6c4ebd3e8056d2b9"
80
-
81
- Bugsnag.instance_variable_set(:@configuration, Bugsnag::Configuration.new)
82
- Bugsnag.configure do |config|
83
- config.release_stage = "production"
84
- config.delivery_method = :synchronous
85
- end
86
-
87
- Bugsnag.notify(BugsnagTestException.new("It crashed"))
88
-
89
- expect(Bugsnag).to have_sent_notification{ |payload, headers|
90
- expect(headers["Bugsnag-Api-Key"]).to eq("c9d60ae4c7e70c4b6c4ebd3e8056d2b9")
91
- }
92
- end
93
-
94
- it "has the right exception class" do
95
- Bugsnag.notify(BugsnagTestException.new("It crashed"))
96
-
97
- expect(Bugsnag).to have_sent_notification{ |payload, headers|
98
- exception = get_exception_from_payload(payload)
99
- expect(exception["errorClass"]).to eq("BugsnagTestException")
100
- }
101
- end
102
-
103
- it "has the right exception message" do
104
- Bugsnag.notify(BugsnagTestException.new("It crashed"))
105
-
106
- expect(Bugsnag).to have_sent_notification{ |payload, headers|
107
- exception = get_exception_from_payload(payload)
108
- expect(exception["message"]).to eq("It crashed")
109
- }
110
- end
111
-
112
- it "has a valid stacktrace" do
113
- Bugsnag.notify(BugsnagTestException.new("It crashed"))
114
-
115
- expect(Bugsnag).to have_sent_notification{ |payload, headers|
116
- exception = get_exception_from_payload(payload)
117
- expect(exception["stacktrace"].length).to be > 0
118
- }
119
- end
120
-
121
- it "uses correct unhandled defaults" do
122
- Bugsnag.notify(BugsnagTestException.new("It crashed"))
123
-
124
- expect(Bugsnag).to have_sent_notification{ |payload, headers|
125
- event = get_event_from_payload(payload)
126
- expect(event["unhandled"]).to be false
127
- expect(event["severity"]).to eq("warning")
128
- expect(event["severityReason"]).to eq({
129
- "type" => "handledException"
130
- })
131
- }
132
- end
133
-
134
- it "sets correct severityReason if severity is modified in a block" do
135
- Bugsnag.notify(BugsnagTestException.new("It crashed")) do |notification|
136
- notification.severity = "info"
137
- end
138
- expect(Bugsnag).to have_sent_notification{ |payload, headers|
139
- event = get_event_from_payload(payload)
140
- expect(event["unhandled"]).to be false
141
- expect(event["severity"]).to eq("info")
142
- expect(event["severityReason"]).to eq({
143
- "type" => "userCallbackSetSeverity"
144
- })
145
- }
146
- end
147
-
148
- it "sets correct severity and reason for specific error classes" do
149
- original_ignore_classes = Bugsnag.configuration.ignore_classes
150
-
151
- begin
152
- # The default ignore_classes includes SignalException, so we need to
153
- # temporarily set it to something else.
154
- Bugsnag.configuration.ignore_classes = Set[SystemExit]
155
- Bugsnag.notify(SignalException.new("TERM"))
156
- expect(Bugsnag).to have_sent_notification{ |payload, headers|
157
- event = get_event_from_payload(payload)
158
- expect(event["unhandled"]).to be false
159
- expect(event["severity"]).to eq("info")
160
- expect(event["severityReason"]).to eq({
161
- "type" => "errorClass",
162
- "attributes" => {
163
- "errorClass" => "SignalException"
164
- }
165
- })
166
- }
167
- ensure
168
- Bugsnag.configuration.ignore_classes = original_ignore_classes
169
- end
170
- end
171
-
172
- # TODO: nested context
173
-
174
- it "accepts tabs in overrides and adds them to metaData" do
175
- Bugsnag.notify(BugsnagTestException.new("It crashed")) do |report|
176
- report.meta_data.merge!({
177
- some_tab: {
178
- info: "here",
179
- data: "also here"
180
- }
181
- })
182
- end
183
-
184
- expect(Bugsnag).to have_sent_notification{ |payload, headers|
185
- event = get_event_from_payload(payload)
186
- expect(event["metaData"]["some_tab"]).to eq(
187
- "info" => "here",
188
- "data" => "also here"
189
- )
190
- }
191
- end
192
-
193
- it "accepts meta data from an exception that mixes in Bugsnag::MetaData" do
194
- exception = BugsnagTestExceptionWithMetaData.new("It crashed")
195
- exception.bugsnag_meta_data = {
196
- some_tab: {
197
- info: "here",
198
- data: "also here"
199
- }
200
- }
201
-
202
- Bugsnag.notify(exception)
203
-
204
- expect(Bugsnag).to have_sent_notification{ |payload, headers|
205
- event = get_event_from_payload(payload)
206
- expect(event["metaData"]["some_tab"]).to eq(
207
- "info" => "here",
208
- "data" => "also here"
209
- )
210
- }
211
- end
212
-
213
- it "removes tabs" do
214
- exception = BugsnagTestExceptionWithMetaData.new("It crashed")
215
- exception.bugsnag_meta_data = {
216
- :some_tab => {
217
- :info => "here",
218
- :data => "also here"
219
- }
220
- }
221
-
222
- Bugsnag.notify(exception) do |report|
223
- report.remove_tab(:some_tab)
224
- end
225
-
226
- expect(Bugsnag).to have_sent_notification{ |payload, headers|
227
- event = get_event_from_payload(payload)
228
- expect(event["metaData"]["some_tab"]).to be_nil
229
- }
230
- end
231
-
232
- it "ignores removing nil tabs" do
233
- exception = BugsnagTestExceptionWithMetaData.new("It crashed")
234
- exception.bugsnag_meta_data = {
235
- :some_tab => {
236
- :info => "here",
237
- :data => "also here"
238
- }
239
- }
240
-
241
- Bugsnag.notify(exception) do |report|
242
- report.remove_tab(nil)
243
- end
244
-
245
- expect(Bugsnag).to have_sent_notification{ |payload, headers|
246
- event = get_event_from_payload(payload)
247
- expect(event["metaData"]["some_tab"]).to eq(
248
- "info" => "here",
249
- "data" => "also here"
250
- )
251
- }
252
- end
253
-
254
- it "Creates a custom tab for metadata which is not a Hash" do
255
- exception = Exception.new("It crashed")
256
-
257
- Bugsnag.notify(exception) do |report|
258
- report.add_tab(:some_tab, "added")
259
- end
260
-
261
- expect(Bugsnag).to have_sent_notification{ |payload, headers|
262
- event = get_event_from_payload(payload)
263
- expect(event["metaData"]["custom"]).to eq(
264
- "some_tab" => "added",
265
- )
266
- }
267
- end
268
-
269
- it "accepts meta data from an exception that mixes in Bugsnag::MetaData, but override using the overrides" do
270
- exception = BugsnagTestExceptionWithMetaData.new("It crashed")
271
- exception.bugsnag_meta_data = {
272
- :some_tab => {
273
- :info => "here",
274
- :data => "also here"
275
- }
276
- }
277
-
278
- Bugsnag.notify(exception) do |report|
279
- report.add_tab(:some_tab, {:info => "overridden"})
280
- end
281
-
282
- expect(Bugsnag).to have_sent_notification{ |payload, headers|
283
- event = get_event_from_payload(payload)
284
- expect(event["metaData"]["some_tab"]).to eq(
285
- "info" => "overridden",
286
- "data" => "also here"
287
- )
288
- }
289
- end
290
-
291
- it "accepts user_id from an exception that mixes in Bugsnag::MetaData" do
292
- exception = BugsnagTestExceptionWithMetaData.new("It crashed")
293
- exception.bugsnag_user_id = "exception_user_id"
294
-
295
- Bugsnag.notify(exception)
296
-
297
- expect(Bugsnag).to have_sent_notification{ |payload, headers|
298
- event = get_event_from_payload(payload)
299
- expect(event["user"]["id"]).to eq("exception_user_id")
300
- }
301
- end
302
-
303
- it "accepts user_id from an exception that mixes in Bugsnag::MetaData, but override using the overrides" do
304
- exception = BugsnagTestExceptionWithMetaData.new("It crashed")
305
- exception.bugsnag_user_id = "exception_user_id"
306
-
307
- Bugsnag.notify(exception) do |report|
308
- report.user.merge!({:id => "override_user_id"})
309
- end
310
-
311
- expect(Bugsnag).to have_sent_notification{ |payload, headers|
312
- event = get_event_from_payload(payload)
313
- expect(event["user"]["id"]).to eq("override_user_id")
314
- }
315
- end
316
-
317
- it "accepts context from an exception that mixes in Bugsnag::MetaData" do
318
- exception = BugsnagTestExceptionWithMetaData.new("It crashed")
319
- exception.bugsnag_context = "exception_context"
320
-
321
- Bugsnag.notify(exception)
322
-
323
- expect(Bugsnag).to have_sent_notification{ |payload, headers|
324
- event = get_event_from_payload(payload)
325
- expect(event["context"]).to eq("exception_context")
326
- }
327
- end
328
-
329
- it "accepts grouping_hash from an exception that mixes in Bugsnag::MetaData" do
330
- exception = BugsnagTestExceptionWithMetaData.new("It crashed")
331
- exception.bugsnag_grouping_hash = "exception_hash"
332
-
333
- Bugsnag.notify(exception)
334
-
335
- expect(Bugsnag).to have_sent_notification{ |payload, headers|
336
- event = get_event_from_payload(payload)
337
- expect(event["groupingHash"]).to eq("exception_hash")
338
- }
339
- end
340
-
341
- it "accept contexts from an exception that mixes in Bugsnag::MetaData, but override using the overrides" do
342
-
343
- exception = BugsnagTestExceptionWithMetaData.new("It crashed")
344
- exception.bugsnag_context = "exception_context"
345
-
346
- Bugsnag.notify(exception) do |report|
347
- report.context = "override_context"
348
- end
349
-
350
- expect(Bugsnag).to have_sent_notification{ |payload, headers|
351
- event = get_event_from_payload(payload)
352
- expect(event["context"]).to eq("override_context")
353
- }
354
- end
355
-
356
- it "accepts meta_data in overrides (for backwards compatibility) and merge it into metaData" do
357
- Bugsnag.notify(BugsnagTestException.new("It crashed")) do |report|
358
- report.meta_data.merge!({
359
- some_tab: {
360
- info: "here",
361
- data: "also here"
362
- }
363
- })
364
- end
365
-
366
- expect(Bugsnag).to have_sent_notification{ |payload, headers|
367
- event = get_event_from_payload(payload)
368
- expect(event["metaData"]["some_tab"]).to eq(
369
- "info" => "here",
370
- "data" => "also here"
371
- )
372
- }
373
- end
374
-
375
- it "truncates large meta_data before sending" do
376
- Bugsnag.notify(BugsnagTestException.new("It crashed")) do |report|
377
- report.meta_data.merge!({
378
- some_tab: {
379
- giant: SecureRandom.hex(1_000_000/2),
380
- mega: SecureRandom.hex(1_000_000/2)
381
- }
382
- })
383
- end
384
-
385
- expect(Bugsnag).to have_sent_notification{ |payload, headers|
386
- # Truncated body should be no bigger than
387
- # 2 truncated hashes (4096*2) + rest of payload (20000)
388
- expect(::JSON.dump(payload).length).to be < 4096*2 + 20000
389
- }
390
- end
391
-
392
- it "truncates large messages before sending" do
393
- Bugsnag.notify(BugsnagTestException.new(SecureRandom.hex(250_000))) do |report|
394
- report.meta_data.merge!({
395
- some_tab: {
396
- giant: SecureRandom.hex(500_000/2),
397
- mega: SecureRandom.hex(500_000/2)
398
- }
399
- })
400
- end
401
-
402
- expect(Bugsnag).to have_sent_notification{ |payload, headers|
403
- expect(::JSON.dump(payload).length).to be < Bugsnag::Helpers::MAX_PAYLOAD_LENGTH
404
- }
405
- end
406
-
407
- it "truncate large stacktraces before sending" do
408
- ex = BugsnagTestException.new("It crashed")
409
- stacktrace = []
410
- 20000.times {|i| stacktrace.push("/Some/path/rspec/example.rb:113:in `instance_eval'")}
411
- ex.set_backtrace(stacktrace)
412
- Bugsnag.notify(ex)
413
-
414
- expect(Bugsnag).to have_sent_notification{ |payload, headers|
415
- # Truncated body should be no bigger than
416
- # 400 stacktrace lines * approx 60 chars per line + rest of payload (20000)
417
- expect(::JSON.dump(payload).length).to be < Bugsnag::Helpers::MAX_PAYLOAD_LENGTH
418
- }
419
- end
420
-
421
- it "accepts a severity in overrides" do
422
- Bugsnag.notify(BugsnagTestException.new("It crashed")) do |report|
423
- report.severity = "info"
424
- end
425
-
426
- expect(Bugsnag).to have_sent_notification{ |payload, headers|
427
- event = get_event_from_payload(payload)
428
- expect(event["severity"]).to eq("info")
429
- }
430
-
431
- end
432
-
433
- it "defaults to warning severity" do
434
- Bugsnag.notify(BugsnagTestException.new("It crashed"))
435
-
436
- expect(Bugsnag).to have_sent_notification{ |payload, headers|
437
- event = get_event_from_payload(payload)
438
- expect(event["severity"]).to eq("warning")
439
- }
440
- end
441
-
442
- it "accepts a context in overrides" do
443
- Bugsnag.notify(BugsnagTestException.new("It crashed")) do |report|
444
- report.context = 'test_context'
445
- end
446
-
447
- expect(Bugsnag).to have_sent_notification{ |payload, headers|
448
- event = get_event_from_payload(payload)
449
- expect(event["context"]).to eq("test_context")
450
- }
451
- end
452
-
453
- it "accepts a user_id in overrides" do
454
- Bugsnag.notify(BugsnagTestException.new("It crashed")) do |report|
455
- report.user = {id: 'test_user'}
456
- end
457
-
458
- expect(Bugsnag).to have_sent_notification{ |payload, headers|
459
- event = get_event_from_payload(payload)
460
- expect(event["user"]["id"]).to eq("test_user")
461
- }
462
- end
463
-
464
- it "does not send an automatic notification if auto_notify is false" do
465
- Bugsnag.configure do |config|
466
- config.auto_notify = false
467
- end
468
-
469
- Bugsnag.notify(BugsnagTestException.new("It crashed"), true)
470
-
471
- expect(Bugsnag).not_to have_sent_notification
472
- end
473
-
474
- it "contains a release_stage" do
475
- Bugsnag.configure do |config|
476
- config.release_stage = "production"
477
- end
478
-
479
- Bugsnag.notify(BugsnagTestException.new("It crashed"))
480
-
481
- expect(Bugsnag).to have_sent_notification{ |payload, headers|
482
- event = get_event_from_payload(payload)
483
- expect(event["app"]["releaseStage"]).to eq("production")
484
- }
485
- end
486
-
487
- it "respects the notify_release_stages setting by not sending in development" do
488
- Bugsnag.configuration.notify_release_stages = ["production"]
489
- Bugsnag.configuration.release_stage = "development"
490
-
491
- Bugsnag.notify(BugsnagTestException.new("It crashed"))
492
-
493
- expect(Bugsnag).not_to have_sent_notification
494
- end
495
-
496
- it "respects the notify_release_stages setting when set" do
497
- Bugsnag.configuration.release_stage = "development"
498
- Bugsnag.configuration.notify_release_stages = ["development"]
499
- Bugsnag.notify(BugsnagTestException.new("It crashed"))
500
-
501
- expect(Bugsnag).to have_sent_notification{ |payload, headers|
502
- event = get_event_from_payload(payload)
503
- expect(event["exceptions"].length).to eq(1)
504
- }
505
- end
506
-
507
- it "uses the https://notify.bugsnag.com endpoint by default" do
508
- Bugsnag.notify(BugsnagTestException.new("It crashed"))
509
-
510
- expect(WebMock).to have_requested(:post, "https://notify.bugsnag.com")
511
- end
512
-
513
- it "does not mark the top-most stacktrace line as inProject if out of project" do
514
- Bugsnag.configuration.project_root = "/Random/location/here"
515
-
516
- begin
517
- "Test".prepnd "T"
518
- rescue Exception => e
519
- Bugsnag.notify(e)
520
- end
521
-
522
- expect(Bugsnag).to have_sent_notification{ |payload, headers|
523
- exception = get_exception_from_payload(payload)
524
- expect(exception["stacktrace"].size).to be >= 1
525
- expect(exception["stacktrace"].first["inProject"]).to be_nil
526
- }
527
- end
528
-
529
- it "marks the top-most stacktrace line as inProject if necessary" do
530
- Bugsnag.configuration.project_root = File.expand_path File.dirname(__FILE__)
531
-
532
- begin
533
- "Test".prepnd "T"
534
- rescue Exception => e
535
- Bugsnag.notify(e)
536
- end
537
-
538
- expect(Bugsnag).to have_sent_notification{ |payload, headers|
539
- exception = get_exception_from_payload(payload)
540
- expect(exception["stacktrace"].size).to be >= 1
541
- expect(exception["stacktrace"][0]["inProject"]).to eq(true)
542
- }
543
- end
544
-
545
- it 'marks vendored stack frames as out-of-project' do
546
- project_root = File.expand_path File.dirname(__FILE__)
547
- Bugsnag.configuration.project_root = project_root
548
-
549
- ex = Exception.new('Division by zero')
550
- allow(ex).to receive (:backtrace) {[
551
- File.join(project_root, "vendor/strutils/lib/string.rb:508:in `splice'"),
552
- File.join(project_root, "vendors/strutils/lib/string.rb:508:in `splice'"),
553
- File.join(project_root, "lib/helpers/string.rb:32:in `splice'"),
554
- File.join(project_root, "lib/vendor/lib/article.rb:158:in `initialize'"),
555
- File.join(project_root, "lib/prog.rb:158:in `read_articles'"),
556
- File.join(project_root, ".bundle/strutils/lib.string.rb:508:in `splice'"),
557
- File.join(project_root, "abundle/article.rb:158:in `initialize'"),
558
- File.join(project_root, ".bundles/strutils/lib.string.rb:508:in `splice'"),
559
- File.join(project_root, "lib/.bundle/article.rb:158:in `initialize'"),
560
- "app.rb:10:in `main'",
561
- "(pry):3:in `__pry__'"
562
- ]}
563
- Bugsnag.notify(ex)
564
- expect(Bugsnag).to have_sent_notification{ |payload, headers|
565
- exception = get_exception_from_payload(payload)
566
-
567
- expect(exception["stacktrace"][0]["inProject"]).to be_nil
568
- expect(exception["stacktrace"][1]["inProject"]).to be true
569
- expect(exception["stacktrace"][2]["inProject"]).to be true
570
- expect(exception["stacktrace"][3]["inProject"]).to be true
571
- expect(exception["stacktrace"][4]["inProject"]).to be true
572
- expect(exception["stacktrace"][5]["inProject"]).to be_nil
573
- expect(exception["stacktrace"][6]["inProject"]).to be true
574
- expect(exception["stacktrace"][7]["inProject"]).to be true
575
- expect(exception["stacktrace"][8]["inProject"]).to be true
576
- expect(exception["stacktrace"][9]["inProject"]).to be_nil
577
- expect(exception["stacktrace"][10]["inProject"]).to be_nil
578
- }
579
- end
580
-
581
- it "adds app_version to the payload if it is set" do
582
- Bugsnag.configuration.app_version = "1.1.1"
583
- Bugsnag.notify(BugsnagTestException.new("It crashed"))
584
-
585
- expect(Bugsnag).to have_sent_notification{ |payload, headers|
586
- event = get_event_from_payload(payload)
587
- expect(event["app"]["version"]).to eq("1.1.1")
588
- }
589
- end
590
-
591
- it "filters params from all payload hashes if they are set in default meta_data_filters" do
592
-
593
- Bugsnag.notify(BugsnagTestException.new("It crashed")) do |report|
594
- report.meta_data.merge!({
595
- :request => {
596
- :params => {
597
- :password => "1234",
598
- :other_password => "12345",
599
- :other_data => "123456"
600
- },
601
- :cookie => "1234567890",
602
- :authorization => "token",
603
- :user_authorization => "token",
604
- :secret_key => "key",
605
- :user_secret => "key"
606
- }
607
- })
608
- report.meta_data.merge!({
609
- :session => {
610
- :"warden.user.user.key" => "1234",
611
- :"warden.user.foobar.key" => "1234",
612
- :"warden.user.test" => "1234"
613
- }
614
- })
615
- end
616
-
617
- expect(Bugsnag).to have_sent_notification{ |payload, headers|
618
- event = get_event_from_payload(payload)
619
- expect(event["metaData"]).not_to be_nil
620
- expect(event["metaData"]["request"]).not_to be_nil
621
- expect(event["metaData"]["request"]["params"]).not_to be_nil
622
- expect(event["metaData"]["request"]["params"]["password"]).to eq("[FILTERED]")
623
- expect(event["metaData"]["request"]["params"]["other_password"]).to eq("[FILTERED]")
624
- expect(event["metaData"]["request"]["params"]["other_data"]).to eq("123456")
625
- expect(event["metaData"]["request"]["cookie"]).to eq("[FILTERED]")
626
- expect(event["metaData"]["request"]["authorization"]).to eq("[FILTERED]")
627
- expect(event["metaData"]["request"]["user_authorization"]).to eq("[FILTERED]")
628
- expect(event["metaData"]["request"]["secret_key"]).to eq("[FILTERED]")
629
- expect(event["metaData"]["request"]["user_secret"]).to eq("[FILTERED]")
630
- expect(event["metaData"]["session"]).not_to be_nil
631
- expect(event["metaData"]["session"]["warden.user.user.key"]).to eq("[FILTERED]")
632
- expect(event["metaData"]["session"]["warden.user.foobar.key"]).to eq("[FILTERED]")
633
- expect(event["metaData"]["session"]["warden.user.test"]).to eq("1234")
634
- }
635
- end
636
-
637
- it "filters params from all payload hashes if they are added to meta_data_filters" do
638
-
639
- Bugsnag.configuration.meta_data_filters << "other_data"
640
- Bugsnag.notify(BugsnagTestException.new("It crashed")) do |report|
641
- report.meta_data.merge!({:request => {:params => {:password => "1234", :other_password => "123456", :other_data => "123456"}}})
642
- end
643
-
644
- expect(Bugsnag).to have_sent_notification{ |payload, headers|
645
- event = get_event_from_payload(payload)
646
- expect(event["metaData"]).not_to be_nil
647
- expect(event["metaData"]["request"]).not_to be_nil
648
- expect(event["metaData"]["request"]["params"]).not_to be_nil
649
- expect(event["metaData"]["request"]["params"]["password"]).to eq("[FILTERED]")
650
- expect(event["metaData"]["request"]["params"]["other_password"]).to eq("[FILTERED]")
651
- expect(event["metaData"]["request"]["params"]["other_data"]).to eq("[FILTERED]")
652
- }
653
- end
654
-
655
- it "filters params from all payload hashes if they are added to meta_data_filters as regex" do
656
-
657
- Bugsnag.configuration.meta_data_filters << /other_data/
658
- Bugsnag.notify(BugsnagTestException.new("It crashed")) do |report|
659
- report.meta_data.merge!({:request => {:params => {:password => "1234", :other_password => "123456", :other_data => "123456"}}})
660
- end
661
-
662
- expect(Bugsnag).to have_sent_notification{ |payload, headers|
663
- event = get_event_from_payload(payload)
664
- expect(event["metaData"]).not_to be_nil
665
- expect(event["metaData"]["request"]).not_to be_nil
666
- expect(event["metaData"]["request"]["params"]).not_to be_nil
667
- expect(event["metaData"]["request"]["params"]["password"]).to eq("[FILTERED]")
668
- expect(event["metaData"]["request"]["params"]["other_password"]).to eq("[FILTERED]")
669
- expect(event["metaData"]["request"]["params"]["other_data"]).to eq("[FILTERED]")
670
- }
671
- end
672
-
673
- it "filters params from all payload hashes if they are added to meta_data_filters as partial regex" do
674
-
675
- Bugsnag.configuration.meta_data_filters << /r_data/
676
- Bugsnag.notify(BugsnagTestException.new("It crashed")) do |report|
677
- report.meta_data.merge!({:request => {:params => {:password => "1234", :other_password => "123456", :other_data => "123456"}}})
678
- end
679
-
680
- expect(Bugsnag).to have_sent_notification{ |payload, headers|
681
- event = get_event_from_payload(payload)
682
- expect(event["metaData"]).not_to be_nil
683
- expect(event["metaData"]["request"]).not_to be_nil
684
- expect(event["metaData"]["request"]["params"]).not_to be_nil
685
- expect(event["metaData"]["request"]["params"]["password"]).to eq("[FILTERED]")
686
- expect(event["metaData"]["request"]["params"]["other_password"]).to eq("[FILTERED]")
687
- expect(event["metaData"]["request"]["params"]["other_data"]).to eq("[FILTERED]")
688
- }
689
- end
690
-
691
- it "does not filter params from payload hashes if their values are nil" do
692
- Bugsnag.notify(BugsnagTestException.new("It crashed")) do |report|
693
- report.meta_data.merge!({:request => {:params => {:nil_param => nil}}})
694
- end
695
-
696
- expect(Bugsnag).to have_sent_notification{ |payload, headers|
697
- event = get_event_from_payload(payload)
698
- expect(event["metaData"]).not_to be_nil
699
- expect(event["metaData"]["request"]).not_to be_nil
700
- expect(event["metaData"]["request"]["params"]).not_to be_nil
701
- expect(event["metaData"]["request"]["params"]).to have_key("nil_param")
702
- }
703
- end
704
-
705
- it "does not notify if report ignored" do
706
- Bugsnag.notify(BugsnagTestException.new("It crashed")) do |report|
707
- report.ignore!
708
- end
709
-
710
- expect(Bugsnag).not_to have_sent_notification
711
- end
712
-
713
- it "does not notify if the exception class is in the default ignore_classes list" do
714
- Bugsnag.configuration.ignore_classes << ActiveRecord::RecordNotFound
715
- Bugsnag.notify(ActiveRecord::RecordNotFound.new("It crashed"))
716
-
717
- expect(Bugsnag).not_to have_sent_notification
718
- end
719
-
720
- it "does not notify if the non-default exception class is added to the ignore_classes" do
721
- Bugsnag.configuration.ignore_classes << BugsnagTestException
722
-
723
- Bugsnag.notify(BugsnagTestException.new("It crashed"))
724
-
725
- expect(Bugsnag).not_to have_sent_notification
726
- end
727
-
728
- it "does not notify if exception's ancestor is an ignored class" do
729
- Bugsnag.configuration.ignore_classes << BugsnagTestException
730
-
731
- Bugsnag.notify(BugsnagSubclassTestException.new("It crashed"))
732
-
733
- expect(Bugsnag).not_to have_sent_notification
734
- end
735
-
736
- it "does not notify if any caused exception is an ignored class" do
737
- Bugsnag.configuration.ignore_classes << NestedException
738
-
739
- ex = NestedException.new("Self-referential exception")
740
- ex.original_exception = BugsnagTestException.new("It crashed")
741
-
742
- Bugsnag.notify(ex)
743
-
744
- expect(Bugsnag).not_to have_sent_notification
745
- end
746
-
747
- it "sends the cause of the exception" do
748
- begin
749
- begin
750
- raise "jiminey"
751
- rescue
752
- Ruby21Exception.raise! "cricket"
753
- end
754
- rescue
755
- Bugsnag.notify $!
756
- end
757
-
758
- expect(Bugsnag).to have_sent_notification{ |payload, headers|
759
- event = get_event_from_payload(payload)
760
- expect(event["exceptions"].size).to eq(2)
761
- }
762
- end
763
-
764
- it "does not unwrap the same exception twice" do
765
- ex = NestedException.new("Self-referential exception")
766
- ex.original_exception = ex
767
-
768
- Bugsnag.notify(ex)
769
-
770
- expect(Bugsnag).to have_sent_notification{ |payload, headers|
771
- event = get_event_from_payload(payload)
772
- expect(event["exceptions"].size).to eq(1)
773
- }
774
- end
775
-
776
- it "does not unwrap more than 5 exceptions" do
777
-
778
- first_ex = ex = NestedException.new("Deep exception")
779
- 10.times do |idx|
780
- ex = ex.original_exception = NestedException.new("Deep exception #{idx}")
781
- end
782
-
783
- Bugsnag.notify(first_ex)
784
- expect(Bugsnag).to have_sent_notification{ |payload, headers|
785
- event = get_event_from_payload(payload)
786
- expect(event["exceptions"].size).to eq(5)
787
- }
788
- end
789
-
790
- it "calls to_exception on i18n error objects" do
791
- Bugsnag.notify(OpenStruct.new(:to_exception => BugsnagTestException.new("message")))
792
-
793
- expect(Bugsnag).to have_sent_notification{ |payload, headers|
794
- exception = get_exception_from_payload(payload)
795
- expect(exception["errorClass"]).to eq("BugsnagTestException")
796
- expect(exception["message"]).to eq("message")
797
- }
798
- end
799
-
800
- it "generates runtimeerror for non exceptions" do
801
- notify_test_exception
802
-
803
- expect(Bugsnag).to have_sent_notification{ |payload, headers|
804
- exception = get_exception_from_payload(payload)
805
- expect(exception["errorClass"]).to eq("RuntimeError")
806
- expect(exception["message"]).to eq("test message")
807
- }
808
- end
809
-
810
- it "supports unix-style paths in backtraces" do
811
- ex = BugsnagTestException.new("It crashed")
812
- ex.set_backtrace([
813
- "/Users/james/app/spec/notification_spec.rb:419",
814
- "/Some/path/rspec/example.rb:113:in `instance_eval'"
815
- ])
816
-
817
- Bugsnag.notify(ex)
818
-
819
- expect(Bugsnag).to have_sent_notification{ |payload, headers|
820
- exception = get_exception_from_payload(payload)
821
- expect(exception["stacktrace"].length).to eq(2)
822
-
823
- line = exception["stacktrace"][0]
824
- expect(line["file"]).to eq("/Users/james/app/spec/notification_spec.rb")
825
- expect(line["lineNumber"]).to eq(419)
826
- expect(line["method"]).to be nil
827
-
828
- line = exception["stacktrace"][1]
829
- expect(line["file"]).to eq("/Some/path/rspec/example.rb")
830
- expect(line["lineNumber"]).to eq(113)
831
- expect(line["method"]).to eq("instance_eval")
832
- }
833
- end
834
-
835
- it "supports windows-style paths in backtraces" do
836
- ex = BugsnagTestException.new("It crashed")
837
- ex.set_backtrace([
838
- "C:/projects/test/app/controllers/users_controller.rb:13:in `index'",
839
- "C:/ruby/1.9.1/gems/actionpack-2.3.10/filters.rb:638:in `block in run_before_filters'"
840
- ])
841
-
842
- Bugsnag.notify(ex)
843
-
844
- expect(Bugsnag).to have_sent_notification{ |payload, headers|
845
- exception = get_exception_from_payload(payload)
846
- expect(exception["stacktrace"].length).to eq(2)
847
-
848
- line = exception["stacktrace"][0]
849
- expect(line["file"]).to eq("C:/projects/test/app/controllers/users_controller.rb")
850
- expect(line["lineNumber"]).to eq(13)
851
- expect(line["method"]).to eq("index")
852
-
853
- line = exception["stacktrace"][1]
854
- expect(line["file"]).to eq("C:/ruby/1.9.1/gems/actionpack-2.3.10/filters.rb")
855
- expect(line["lineNumber"]).to eq(638)
856
- expect(line["method"]).to eq("block in run_before_filters")
857
- }
858
- end
859
-
860
- it "should fix invalid utf8" do
861
- invalid_data = "fl\xc3ff"
862
- invalid_data.force_encoding('BINARY') if invalid_data.respond_to?(:force_encoding)
863
-
864
- Bugsnag.notify(BugsnagTestException.new("It crashed")) do |report|
865
- report.meta_data.merge!({fluff: {fluff: invalid_data}})
866
- end
867
-
868
- expect(Bugsnag).to have_sent_notification{ |payload, headers|
869
- event = get_event_from_payload(payload)
870
- if defined?(Encoding::UTF_8)
871
- expect(event['metaData']['fluff']['fluff']).to match(/fl�ff/)
872
- else
873
- expect(event['metaData']['fluff']['fluff']).to match(/flff/)
874
- end
875
- }
876
- end
877
-
878
- if RUBY_VERSION < '2.3.0'
879
- it "should handle utf8 encoding errors in exceptions_list" do
880
- invalid_data = "\"foo\xEBbar\""
881
- invalid_data = invalid_data.force_encoding("utf-8") if invalid_data.respond_to?(:force_encoding)
882
-
883
- begin
884
- JSON.parse(invalid_data)
885
- rescue
886
- Bugsnag.notify $!
887
- end
888
-
889
- expect(Bugsnag).to have_sent_notification { |payload, headers|
890
- if defined?(Encoding::UTF_8)
891
- expect(payload.to_json).to match(/foo�bar/)
892
- else
893
- expect(payload.to_json).to match(/foobar/)
894
- end
895
- }
896
- end
897
- end
898
-
899
- it "should handle utf8 encoding errors in notification context" do
900
- invalid_data = "\"foo\xEBbar\""
901
- invalid_data = invalid_data.force_encoding("utf-8") if invalid_data.respond_to?(:force_encoding)
902
-
903
- begin
904
- raise
905
- rescue
906
- Bugsnag.notify($!) do |report|
907
- report.context = invalid_data
908
- end
909
- end
910
-
911
- expect(Bugsnag).to have_sent_notification { |payload, headers|
912
- if defined?(Encoding::UTF_8)
913
- expect(payload.to_json).to match(/foo�bar/)
914
- else
915
- expect(payload.to_json).to match(/foobar/)
916
- end
917
- }
918
- end
919
-
920
- it "should handle utf8 encoding errors in notification app fields" do
921
- invalid_data = "\"foo\xEBbar\""
922
- invalid_data = invalid_data.force_encoding("utf-8") if invalid_data.respond_to?(:force_encoding)
923
-
924
- Bugsnag.configuration.app_version = invalid_data
925
- Bugsnag.configuration.release_stage = invalid_data
926
- Bugsnag.configuration.app_type = invalid_data
927
-
928
- begin
929
- raise
930
- rescue
931
- Bugsnag.notify $!
932
- end
933
-
934
- expect(Bugsnag).to have_sent_notification { |payload, headers|
935
- if defined?(Encoding::UTF_8)
936
- expect(payload.to_json).to match(/foo�bar/)
937
- else
938
- expect(payload.to_json).to match(/foobar/)
939
- end
940
- }
941
- end
942
-
943
- it "should handle utf8 encoding errors in grouping_hash" do
944
- invalid_data = "\"foo\xEBbar\""
945
- invalid_data = invalid_data.force_encoding("utf-8") if invalid_data.respond_to?(:force_encoding)
946
-
947
- Bugsnag.before_notify_callbacks << lambda do |notif|
948
- notif.grouping_hash = invalid_data
949
- end
950
-
951
- begin
952
- raise
953
- rescue
954
- Bugsnag.notify $!
955
- end
956
-
957
- expect(Bugsnag).to have_sent_notification { |payload, headers|
958
- if defined?(Encoding::UTF_8)
959
- expect(payload.to_json).to match(/foo�bar/)
960
- else
961
- expect(payload.to_json).to match(/foobar/)
962
- end
963
- }
964
- end
965
-
966
- it "should handle utf8 encoding errors in notification user fields" do
967
- invalid_data = "\"foo\xEBbar\""
968
- invalid_data = invalid_data.force_encoding("utf-8") if invalid_data.respond_to?(:force_encoding)
969
-
970
- Bugsnag.before_notify_callbacks << lambda do |notif|
971
- notif.user = {
972
- :email => "#{invalid_data}@foo.com",
973
- :name => invalid_data
974
- }
975
- end
976
-
977
- begin
978
- raise
979
- rescue
980
- Bugsnag.notify $!
981
- end
982
-
983
- expect(Bugsnag).to have_sent_notification { |payload, headers|
984
- if defined?(Encoding::UTF_8)
985
- expect(payload.to_json).to match(/foo�bar/)
986
- else
987
- expect(payload.to_json).to match(/foobar/)
988
- end
989
- }
990
- end
991
-
992
- it 'should handle exceptions with empty backtrace' do
993
- begin
994
- err = RuntimeError.new
995
- err.set_backtrace([])
996
- raise err
997
- rescue
998
- Bugsnag.notify $!
999
- end
1000
-
1001
- expect(Bugsnag).to have_sent_notification { |payload, headers|
1002
- exception = get_exception_from_payload(payload)
1003
- expect(exception['stacktrace'].size).to be > 0
1004
- }
1005
- end
1006
-
1007
- it 'should use defaults when notify is called' do
1008
- Bugsnag.notify(BugsnagTestException.new("It crashed"))
1009
-
1010
- expect(Bugsnag).to have_sent_notification{ |payload, headers|
1011
- event = payload["events"][0]
1012
- expect(event["unhandled"]).to be false
1013
- expect(event["severityReason"]).to eq({"type" => "handledException"})
1014
- }
1015
- end
1016
-
1017
- it 'should attach severity reason through a block when auto_notify is true' do
1018
- Bugsnag.notify(BugsnagTestException.new("It crashed"), true) do |report|
1019
- report.severity_reason = {
1020
- :type => "middleware_handler",
1021
- :attributes => {
1022
- :name => "middleware_test"
1023
- }
1024
- }
1025
- end
1026
-
1027
- expect(Bugsnag).to have_sent_notification{ |payload, headers|
1028
- event = payload["events"][0]
1029
- expect(event["severityReason"]).to eq(
1030
- {
1031
- "type" => "middleware_handler",
1032
- "attributes" => {
1033
- "name" => "middleware_test"
1034
- }
1035
- }
1036
- )
1037
- expect(event["unhandled"]).to be true
1038
- }
1039
- end
1040
-
1041
- it 'should not attach severity reason from callback when auto_notify is false' do
1042
- Bugsnag.notify(BugsnagTestException.new("It crashed")) do |report|
1043
- report.severity_reason = {
1044
- :type => "middleware_handler",
1045
- :attributes => {
1046
- :name => "middleware_test"
1047
- }
1048
- }
1049
- end
1050
-
1051
- expect(Bugsnag).to have_sent_notification{ |payload, headers|
1052
- event = payload["events"][0]
1053
- expect(event["unhandled"]).to be false
1054
- expect(event["severityReason"]).to eq({"type" => "handledException"})
1055
- }
1056
- end
1057
-
1058
- it 'does not notify if skip_bugsnag is true' do
1059
- exception = BugsnagTestException.new("It crashed")
1060
- exception.skip_bugsnag = true
1061
- Bugsnag.notify(exception)
1062
- expect(Bugsnag).not_to have_sent_notification
1063
- end
1064
-
1065
- it 'uses an appropriate message if nil is notified' do
1066
- Bugsnag.notify(nil)
1067
- expect(Bugsnag).to have_sent_notification{ |payload, headers|
1068
- event = payload["events"][0]
1069
- exception = event["exceptions"][0]
1070
- expect(exception["errorClass"]).to eq("RuntimeError")
1071
- expect(exception["message"]).to eq("'nil' was notified as an exception")
1072
- }
1073
- end
1074
-
1075
- it "includes bugsnag lines marked out of project" do
1076
- notify_test_exception
1077
- expect(Bugsnag).to have_sent_notification{ |payload, headers|
1078
- exception = get_exception_from_payload(payload)
1079
- bugsnag_count = 0
1080
- exception["stacktrace"].each do |frame|
1081
- if /.*lib\/bugsnag.*\.rb/.match(frame["file"])
1082
- bugsnag_count += 1
1083
- expect(frame["inProject"]).to be_nil
1084
- end
1085
- end
1086
- # 7 is used here as the called bugsnag frames for a `notify` call should be:
1087
- # - Bugsnag.notify
1088
- # - Report.new
1089
- # - Report.initialize
1090
- # - Report.generate_exceptions_list
1091
- # - Report.generate_exceptions_list | raw_exceptions.map
1092
- # - Report.generate_exceptions_list | raw_exceptions.map | block
1093
- # - Report.generate_exceptions_list | raw_exceptions.map | block | Stacktrace.new
1094
- # However, JRUBY does not include the two `new` frames, resulting in 5 bugsnag frames
1095
- if defined?(JRUBY_VERSION)
1096
- frame_count = 5
1097
- else
1098
- frame_count = 7
1099
- end
1100
- expect(bugsnag_count).to equal frame_count
1101
- }
1102
- end
1103
-
1104
- describe "breadcrumbs" do
1105
- let(:timestamp_regex) { /^\d{4}\-\d{2}\-\d{2}T\d{2}:\d{2}:[\d\.]+Z$/ }
1106
-
1107
- it "includes left breadcrumbs" do
1108
- Bugsnag.leave_breadcrumb("Test breadcrumb")
1109
- notify_test_exception
1110
- expect(Bugsnag).to have_sent_notification { |payload, headers|
1111
- event = get_event_from_payload(payload)
1112
- expect(event["breadcrumbs"].size).to eq(1)
1113
- expect(event["breadcrumbs"].first).to match({
1114
- "name" => "Test breadcrumb",
1115
- "type" => "manual",
1116
- "metaData" => {},
1117
- "timestamp" => match(timestamp_regex)
1118
- })
1119
- }
1120
- end
1121
-
1122
- it "filters left breadcrumbs" do
1123
- Bugsnag.leave_breadcrumb("Test breadcrumb", {
1124
- :forbidden_key => false,
1125
- :allowed_key => true
1126
- })
1127
- Bugsnag.configuration.meta_data_filters << "forbidden"
1128
- notify_test_exception
1129
- expect(Bugsnag).to have_sent_notification { |payload, headers|
1130
- event = get_event_from_payload(payload)
1131
- expect(event["breadcrumbs"].size).to eq(1)
1132
- expect(event["breadcrumbs"].first).to match({
1133
- "name" => "Test breadcrumb",
1134
- "type" => "manual",
1135
- "metaData" => {
1136
- "forbidden_key" => "[FILTERED]",
1137
- "allowed_key" => true
1138
- },
1139
- "timestamp" => match(timestamp_regex)
1140
- })
1141
- }
1142
- end
1143
-
1144
- it "defaults to an empty array" do
1145
- notify_test_exception
1146
- expect(Bugsnag).to have_sent_notification { |payload, headers|
1147
- event = get_event_from_payload(payload)
1148
- expect(event["breadcrumbs"].size).to eq(0)
1149
- }
1150
- end
1151
-
1152
- it "allows breadcrumbs to be editted in callbacks" do
1153
- Bugsnag.leave_breadcrumb("Test breadcrumb")
1154
- Bugsnag.before_notify_callbacks << Proc.new { |report|
1155
- breadcrumb = report.breadcrumbs.first
1156
- breadcrumb.meta_data = {:a => 1, :b => 2}
1157
- }
1158
- notify_test_exception
1159
- expect(Bugsnag).to have_sent_notification { |payload, headers|
1160
- event = get_event_from_payload(payload)
1161
- expect(event["breadcrumbs"].size).to eq(1)
1162
- expect(event["breadcrumbs"].first).to match({
1163
- "name" => "Test breadcrumb",
1164
- "type" => "manual",
1165
- "metaData" => {"a" => 1, "b" => 2},
1166
- "timestamp" => match(timestamp_regex)
1167
- })
1168
- }
1169
- end
1170
- end
1171
-
1172
- describe "#summary" do
1173
- it "provides a hash of the name, message, and severity" do
1174
- begin
1175
- 1/0
1176
- rescue ZeroDivisionError => e
1177
- report = Bugsnag::Report.new(e, Bugsnag.configuration)
1178
-
1179
- expect(report.summary).to eq({
1180
- :error_class => "ZeroDivisionError",
1181
- :message => "divided by 0",
1182
- :severity => "warning"
1183
- })
1184
- end
1185
- end
1186
-
1187
- it "handles strings" do
1188
- report = Bugsnag::Report.new("test string", Bugsnag.configuration)
1189
-
1190
- expect(report.summary).to eq({
1191
- :error_class => "RuntimeError",
1192
- :message => "test string",
1193
- :severity => "warning"
1194
- })
1195
- end
1196
-
1197
- it "handles error edge cases" do
1198
- report = Bugsnag::Report.new(Timeout::Error, Bugsnag.configuration)
1199
-
1200
- expect(report.summary).to eq({
1201
- :error_class => "Timeout::Error",
1202
- :message => "Timeout::Error",
1203
- :severity => "warning"
1204
- })
1205
- end
1206
-
1207
- it "handles empty exceptions" do
1208
- begin
1209
- 1/0
1210
- rescue ZeroDivisionError => e
1211
- report = Bugsnag::Report.new(e, Bugsnag.configuration)
1212
-
1213
- report.exceptions = []
1214
-
1215
- expect(report.summary).to eq({
1216
- :error_class => "Unknown",
1217
- :severity => "warning"
1218
- })
1219
- end
1220
- end
1221
-
1222
- it "handles removed exceptions" do
1223
- begin
1224
- 1/0
1225
- rescue ZeroDivisionError => e
1226
- report = Bugsnag::Report.new(e, Bugsnag.configuration)
1227
-
1228
- report.exceptions = nil
1229
-
1230
- expect(report.summary).to eq({
1231
- :error_class => "Unknown",
1232
- :severity => "warning"
1233
- })
1234
- end
1235
- end
1236
-
1237
- it "handles exceptions being replaced" do
1238
- begin
1239
- 1/0
1240
- rescue ZeroDivisionError => e
1241
- report = Bugsnag::Report.new(e, Bugsnag.configuration)
1242
-
1243
- report.exceptions = "no one should ever do this"
1244
-
1245
- expect(report.summary).to eq({
1246
- :error_class => "Unknown",
1247
- :severity => "warning"
1248
- })
1249
- end
1250
- end
1251
- end
1252
-
1253
- if defined?(JRUBY_VERSION)
1254
-
1255
- it "works with java.lang.Throwables" do
1256
- begin
1257
- JRubyException.raise!
1258
- rescue
1259
- Bugsnag.notify $!
1260
- end
1261
-
1262
- expect(Bugsnag).to have_sent_notification{ |payload, headers|
1263
- exception = get_exception_from_payload(payload)
1264
- expect(exception["errorClass"]).to eq('Java::JavaLang::NullPointerException')
1265
- expect(exception["message"]).to eq("")
1266
- expect(exception["stacktrace"].size).to be > 0
1267
- }
1268
- end
1269
- end
1270
-
1271
- it 'includes device data when notify is called' do
1272
- Bugsnag.configuration.hostname = 'test-host'
1273
- Bugsnag.configuration.runtime_versions["ruby"] = '9.9.9'
1274
- Bugsnag.notify(BugsnagTestException.new("It crashed"))
1275
-
1276
- expect(Bugsnag).to have_sent_notification{ |payload, headers|
1277
- event = payload["events"][0]
1278
- expect(event["device"]["hostname"]).to eq('test-host')
1279
- expect(event["device"]["runtimeVersions"]["ruby"]).to eq('9.9.9')
1280
- }
1281
- end
1282
- end