@@ -69,21 +69,21 @@ defmodule Sentry.Integrations.Oban.ErrorReporterTest do
6969 assert event . fingerprint == [ @ worker_as_string , "{{ default }}" ]
7070 end
7171
72- test "reports non-exception errors to Sentry" do
72+ test "reports normalized non-exception errors to Sentry" do
7373 Sentry.Test . start_collecting ( )
7474
7575 emit_telemetry_for_failed_job ( :error , :undef , [ ] )
7676
7777 assert [ event ] = Sentry.Test . pop_sentry_reports ( )
7878 assert % { job: % Oban.Job { } } = event . integration_meta . oban
7979
80- assert event . message == % Sentry.Interfaces.Message {
81- formatted: "Oban job #{ @ worker_as_string } errored out: :undef" ,
82- message: "Oban job #{ @ worker_as_string } errored out: %s" ,
83- params: [ ":undef" ]
84- }
80+ assert event . message == nil
8581
86- assert [ % Sentry.Interfaces.Thread { stacktrace: % { frames: [ stacktrace ] } } ] = event . threads
82+ assert [ % { stacktrace: % { frames: [ stacktrace ] } } = exception ] = event . exception
83+
84+ assert exception . type == "UndefinedFunctionError"
85+ assert exception . value == "function #{ @ worker_as_string } .process/1 is undefined or private"
86+ assert exception . mechanism . handled == true
8787 assert stacktrace . module == MyWorker
8888 assert stacktrace . function == "#{ @ worker_as_string } .process/1"
8989
@@ -94,6 +94,53 @@ defmodule Sentry.Integrations.Oban.ErrorReporterTest do
9494 assert event . fingerprint == [ @ worker_as_string , "{{ default }}" ]
9595 end
9696
97+ test "reports exits to Sentry" do
98+ Sentry.Test . start_collecting ( )
99+
100+ emit_telemetry_for_failed_job ( :exit , :oops , [ ] )
101+
102+ assert [ event ] = Sentry.Test . pop_sentry_reports ( )
103+ assert % { job: % Oban.Job { } } = event . integration_meta . oban
104+
105+ assert event . message == % Sentry.Interfaces.Message {
106+ message: "Oban job #{ @ worker_as_string } exited: %s" ,
107+ params: [ ":oops" ] ,
108+ formatted: "Oban job #{ @ worker_as_string } exited: :oops"
109+ }
110+
111+ assert event . exception == [ ]
112+
113+ assert event . tags . oban_queue == "default"
114+ assert event . tags . oban_state == "available"
115+ assert event . tags . oban_worker == @ worker_as_string
116+
117+ assert event . fingerprint == [ @ worker_as_string , "{{ default }}" ]
118+ end
119+
120+ test "reports throws to Sentry" do
121+ Sentry.Test . start_collecting ( )
122+
123+ emit_telemetry_for_failed_job ( :throw , :this_was_not_caught , [ ] )
124+
125+ assert [ event ] = Sentry.Test . pop_sentry_reports ( )
126+ assert % { job: % Oban.Job { } } = event . integration_meta . oban
127+
128+ assert event . message == % Sentry.Interfaces.Message {
129+ message: "Oban job #{ @ worker_as_string } exited with an uncaught throw: %s" ,
130+ params: [ ":this_was_not_caught" ] ,
131+ formatted:
132+ "Oban job #{ @ worker_as_string } exited with an uncaught throw: :this_was_not_caught"
133+ }
134+
135+ assert event . exception == [ ]
136+
137+ assert event . tags . oban_queue == "default"
138+ assert event . tags . oban_state == "available"
139+ assert event . tags . oban_worker == @ worker_as_string
140+
141+ assert event . fingerprint == [ @ worker_as_string , "{{ default }}" ]
142+ end
143+
97144 for reason <- [ :cancel , :discard ] do
98145 test "doesn't report Oban.PerformError with reason #{ inspect ( reason ) } " do
99146 Sentry.Test . start_collecting ( )
@@ -116,13 +163,12 @@ defmodule Sentry.Integrations.Oban.ErrorReporterTest do
116163 % { "id" => "123" , "entity" => "user" , "type" => "delete" }
117164 |> MyWorker . new ( )
118165 |> Ecto.Changeset . apply_action! ( :validate )
119- |> Map . replace! ( :unsaved_error , % { kind: kind , reason: reason , stacktrace: stacktrace } )
120166
121167 assert :ok =
122168 ErrorReporter . handle_event (
123169 [ :oban , :job , :exception ] ,
124170 % { } ,
125- % { job: job } ,
171+ % { job: job , kind: kind , reason: reason , stacktrace: stacktrace } ,
126172 :no_config
127173 )
128174
0 commit comments