File tree 3 files changed +27
-3
lines changed
3 files changed +27
-3
lines changed Original file line number Diff line number Diff line change @@ -8,13 +8,16 @@ class ErrorHandler
8
8
9
9
include PactBroker ::Logging
10
10
11
+ WARNING_ERROR_CLASSES = [ Sequel ::ForeignKeyConstraintViolation ]
12
+
11
13
def self . call e , request , response
12
14
error_reference = generate_error_reference
13
- if reportable? ( e )
15
+ if log_as_warning? ( e )
16
+ logger . warn ( "Error reference #{ error_reference } " , e )
17
+ elsif reportable? ( e )
14
18
log_error ( e , "Error reference #{ error_reference } " )
15
19
report ( e , error_reference , request )
16
- else
17
- logger . info "Error reference #{ error_reference } - #{ e . class } #{ e . message } \n #{ e . backtrace . join ( "\n " ) } "
20
+ logger . info ( "Error reference #{ error_reference } " , e )
18
21
end
19
22
response . body = response_body_hash ( e , error_reference ) . to_json
20
23
end
@@ -27,6 +30,10 @@ def self.reportable?(e)
27
30
!e . is_a? ( PactBroker ::Error ) && !e . is_a? ( JSON ::GeneratorError )
28
31
end
29
32
33
+ def self . log_as_warning? ( e )
34
+ WARNING_ERROR_CLASSES . any? { |clazz | e . is_a? ( clazz ) }
35
+ end
36
+
30
37
def self . display_message ( e , error_reference )
31
38
if PactBroker . configuration . show_backtrace_in_error_response?
32
39
e . message || obfuscated_error_message ( error_reference )
Original file line number Diff line number Diff line change @@ -16,6 +16,8 @@ def info *args
16
16
def error *args
17
17
if error_is_about_table_not_existing? ( args )
18
18
__getobj__ ( ) . debug ( *reassure_people_that_this_is_expected ( args ) )
19
+ elsif foreign_key_error? ( args )
20
+ __getobj__ ( ) . warn ( *args )
19
21
else
20
22
__getobj__ ( ) . error ( *args )
21
23
end
@@ -28,6 +30,11 @@ def error_is_about_table_not_existing?(args)
28
30
args . first . include? ( "no such view" ) )
29
31
end
30
32
33
+ # Foreign key exceptions are almost always transitory and unreproducible by this stage
34
+ def foreign_key_error? ( args )
35
+ args . first . is_a? ( String ) && args . first . downcase . include? ( "foreign key" )
36
+ end
37
+
31
38
def reassure_people_that_this_is_expected ( args )
32
39
message = args . shift
33
40
message = message + " Don't panic. This happens when Sequel doesn't know if a table/view exists or not."
Original file line number Diff line number Diff line change @@ -23,6 +23,16 @@ module DB
23
23
end
24
24
end
25
25
26
+ context "when the error is a foreign key constraint violation" do
27
+ before do
28
+ subject . error ( "SQLite3::ConstraintException: FOREIGN KEY constraint failed: delete from pacticipants where id = 1" )
29
+ end
30
+
31
+ it "logs the message at warn level" do
32
+ expect ( logs . string ) . to include "WARN -- :"
33
+ end
34
+ end
35
+
26
36
context "when the error is NOT for a table or view that does not exist" do
27
37
before do
28
38
subject . error ( "foo bar" )
You can’t perform that action at this time.
0 commit comments