diff --git a/CHANGELOG.md b/CHANGELOG.md index adeecbf70..f31a0f2aa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,9 @@ Changes since last non-beta release. *Please add entries here for your pull requests that are not yet released.* +#### Changed +- More detailed errors for Honeybadger and Sentry. [PR 1081](https://github.com/shakacode/react_on_rails/pull/1081) by [justin808](https://github.com/justin808). + ### [11.0.4] - 2018-05-3 #### Changed diff --git a/lib/react_on_rails/prerender_error.rb b/lib/react_on_rails/prerender_error.rb index d8212fcc3..33f361e70 100644 --- a/lib/react_on_rails/prerender_error.rb +++ b/lib/react_on_rails/prerender_error.rb @@ -2,10 +2,34 @@ # rubocop:disable: Layout/IndentHeredoc module ReactOnRails - class PrerenderError < StandardError + class PrerenderError < ::ReactOnRails::Error + attr_reader :component_name, :err, :props, :js_code, :console_messages + # err might be nil if JS caught the error def initialize(component_name: nil, err: nil, props: nil, js_code: nil, console_messages: nil) + @component_name = component_name + @err = err + @props = props + @js_code = js_code + @console_messages = console_messages + + backtrace, message = calc_message(component_name, console_messages, err, js_code, props) + + super([message, backtrace].compact.join("\n")) + end + + def to_honeybadger_context + to_error_context + end + + def raven_context + to_error_context + end + + private + + def calc_message(component_name, console_messages, err, js_code, props) message = "ERROR in SERVER PRERENDERING\n".dup if err # rubocop:disable Layout/IndentHeredoc @@ -33,8 +57,17 @@ def initialize(component_name: nil, err: nil, props: nil, MSG # rubocop:enable Layout/IndentHeredoc end + [backtrace, message] + end - super([message, backtrace].compact.join("\n")) + def to_error_context + { + component_name: component_name, + err: err, + props: props, + js_code: js_code, + console_messages: console_messages + } end end end diff --git a/spec/react_on_rails/prender_error_spec.rb b/spec/react_on_rails/prender_error_spec.rb new file mode 100644 index 000000000..23679de17 --- /dev/null +++ b/spec/react_on_rails/prender_error_spec.rb @@ -0,0 +1,49 @@ +# frozen_string_literal: true + +require_relative "spec_helper" + +module ReactOnRails + describe PrerenderError do + let(:err) do + result = nil + begin + raise "Some Error" + rescue StandardError => e + result = e + end + result + end + + let(:expected_error_info) do + { + component_name: "component_name", + err: err, + props: { a: 1, b: 2 }, + js_code: "console.log('foobar')", + console_messages: "console_messages" + } + end + + subject do + PrerenderError.new( + component_name: expected_error_info[:component_name], + err: expected_error_info[:err], + props: expected_error_info[:props], + js_code: expected_error_info[:js_code], + console_messages: expected_error_info[:console_messages] + ) + end + + describe ".to_honey_badger_context" do + it "returns the correct context" do + expect(subject.to_honeybadger_context).to eq(expected_error_info) + end + end + + describe ".raven_context" do + it "returns the correct context" do + expect(subject.raven_context).to eq(expected_error_info) + end + end + end +end