@@ -5,70 +5,131 @@ defmodule Ecto.Integration.LoggingTest do
5
5
alias Ecto.Integration.PoolRepo
6
6
alias Ecto.Integration.Post
7
7
8
- test "log entry is sent to telemetry" do
9
- log = fn event_name , measurements , metadata ->
10
- assert Enum . at ( event_name , - 1 ) == :query
11
- assert % { result: { :ok , _res } } = metadata
12
- assert measurements . total_time == measurements . query_time + measurements . decode_time + measurements . queue_time
13
- assert measurements . idle_time
14
- send ( self ( ) , :logged )
8
+ import ExUnit.CaptureLog
9
+
10
+ describe "telemetry" do
11
+ test "dispatches event" do
12
+ log = fn event_name , measurements , metadata ->
13
+ assert Enum . at ( event_name , - 1 ) == :query
14
+ assert % { result: { :ok , _res } } = metadata
15
+
16
+ assert measurements . total_time ==
17
+ measurements . query_time + measurements . decode_time + measurements . queue_time
18
+
19
+ assert measurements . idle_time
20
+ send ( self ( ) , :logged )
21
+ end
22
+
23
+ Process . put ( :telemetry , log )
24
+ _ = PoolRepo . all ( Post )
25
+ assert_received :logged
15
26
end
16
27
17
- Process . put ( :telemetry , log )
18
- _ = PoolRepo . all ( Post )
19
- assert_received :logged
20
- end
28
+ test "dispatches event with stacktrace" do
29
+ log = fn _event_name , _measurements , metadata ->
30
+ assert % { stacktrace: [ _ | _ ] } = metadata
31
+ send ( self ( ) , :logged )
32
+ end
21
33
22
- test "log entry is sent to telemetry with custom options" do
23
- log = fn event_name , _measurements , metadata ->
24
- assert Enum . at ( event_name , - 1 ) == :query
25
- assert metadata . options == [ :custom_metadata ]
26
- send ( self ( ) , :logged )
34
+ Process . put ( :telemetry , log )
35
+ _ = PoolRepo . all ( Post , stacktrace: true )
36
+ assert_received :logged
27
37
end
28
38
29
- Process . put ( :telemetry , log )
30
- _ = PoolRepo . all ( Post , telemetry_options: [ :custom_metadata ] )
31
- assert_received :logged
32
- end
39
+ test "dispatches event with custom options" do
40
+ log = fn event_name , _measurements , metadata ->
41
+ assert Enum . at ( event_name , - 1 ) == :query
42
+ assert metadata . options == [ :custom_metadata ]
43
+ send ( self ( ) , :logged )
44
+ end
33
45
34
- test "log entry sent under another event name" do
35
- log = fn [ :custom ] , measurements , metadata ->
36
- assert % { result: { :ok , _res } } = metadata
37
- assert measurements . total_time == measurements . query_time + measurements . decode_time + measurements . queue_time
38
- assert measurements . idle_time
39
- send ( self ( ) , :logged )
46
+ Process . put ( :telemetry , log )
47
+ _ = PoolRepo . all ( Post , telemetry_options: [ :custom_metadata ] )
48
+ assert_received :logged
40
49
end
41
50
42
- Process . put ( :telemetry , log )
43
- _ = PoolRepo . all ( Post , telemetry_event: [ :custom ] )
44
- assert_received :logged
45
- end
51
+ test "dispatches under another event name" do
52
+ log = fn [ :custom ] , measurements , metadata ->
53
+ assert % { result: { :ok , _res } } = metadata
46
54
47
- test "log entry is not sent to telemetry under nil event name" do
48
- Process . put ( :telemetry , fn _ , _ -> raise "never called" end )
49
- _ = TestRepo . all ( Post , telemetry_event: nil )
50
- refute_received :logged
51
- end
55
+ assert measurements . total_time ==
56
+ measurements . query_time + measurements . decode_time + measurements . queue_time
57
+
58
+ assert measurements . idle_time
59
+ send ( self ( ) , :logged )
60
+ end
61
+
62
+ Process . put ( :telemetry , log )
63
+ _ = PoolRepo . all ( Post , telemetry_event: [ :custom ] )
64
+ assert_received :logged
65
+ end
52
66
53
- test "log entry when some measurements are nil" do
54
- assert ExUnit.CaptureLog . capture_log ( fn ->
55
- TestRepo . query ( "BEG" , [ ] , log: :error )
56
- end ) =~ "[error]"
67
+ test "is not dispatched with no event name" do
68
+ Process . put ( :telemetry , fn _ , _ -> raise "never called" end )
69
+ _ = TestRepo . all ( Post , telemetry_event: nil )
70
+ refute_received :logged
71
+ end
57
72
end
58
73
59
- test "log entry with custom log level" do
60
- assert ExUnit.CaptureLog . capture_log ( fn ->
61
- TestRepo . insert! ( % Post { title: "1" } , [ log: :error ] )
62
- end ) =~ "[error]"
74
+ describe "logs" do
75
+ @ stacktrace_opts [ stacktrace: true , log: :error ]
63
76
64
- # We cannot assert on the result because it depends on the suite log level
65
- ExUnit.CaptureLog . capture_log ( fn - >
66
- TestRepo . insert! ( % Post { title: "1" } , [ log: true ] )
67
- end )
77
+ defp stacktrace_entry ( line ) do
78
+ "↳ anonymous fn/0 in Ecto.Integration.LoggingTest. \" test logs includes stacktraces \" /1, " < >
79
+ "at: integration_test/sql/logging.exs# #{ line - 3 } "
80
+ end
68
81
69
- # But this assertion is always true
70
- assert ExUnit.CaptureLog . capture_log ( fn ->
71
- TestRepo . insert! ( % Post { title: "1" } , [ log: false ] )
72
- end ) == ""
82
+ test "when some measurements are nil" do
83
+ assert capture_log ( fn -> TestRepo . query ( "BEG" , [ ] , log: :error ) end ) =~
84
+ "[error]"
85
+ end
86
+
87
+ test "includes stacktraces" do
88
+ assert capture_log ( fn ->
89
+ TestRepo . all ( Post , @ stacktrace_opts )
90
+
91
+ :ok
92
+ end ) =~ stacktrace_entry ( __ENV__ . line )
93
+
94
+ assert capture_log ( fn ->
95
+ TestRepo . insert ( % Post { } , @ stacktrace_opts )
96
+
97
+ :ok
98
+ end ) =~ stacktrace_entry ( __ENV__ . line )
99
+
100
+ assert capture_log ( fn ->
101
+ # Test cascading options
102
+ Ecto.Multi . new ( )
103
+ |> Ecto.Multi . insert ( :post , % Post { } )
104
+ |> TestRepo . transaction ( @ stacktrace_opts )
105
+
106
+ :ok
107
+ end ) =~ stacktrace_entry ( __ENV__ . line )
108
+
109
+ assert capture_log ( fn ->
110
+ # In theory we should point to the call _inside_ run
111
+ # but all multi calls point to the transaction starting point.
112
+ Ecto.Multi . new ( )
113
+ |> Ecto.Multi . run ( :all , fn _ , _ -> { :ok , TestRepo . all ( Post , @ stacktrace_opts ) } end )
114
+ |> TestRepo . transaction ( )
115
+
116
+ :ok
117
+ end ) =~ stacktrace_entry ( __ENV__ . line )
118
+ end
119
+
120
+ test "with custom log level" do
121
+ assert capture_log ( fn -> TestRepo . insert! ( % Post { title: "1" } , log: :error ) end ) =~
122
+ "[error]"
123
+
124
+ # We cannot assert on the result because it depends on the suite log level
125
+ capture_log ( fn ->
126
+ TestRepo . insert! ( % Post { title: "1" } , log: true )
127
+ end )
128
+
129
+ # But this assertion is always true
130
+ assert capture_log ( fn ->
131
+ TestRepo . insert! ( % Post { title: "1" } , log: false )
132
+ end ) == ""
133
+ end
73
134
end
74
135
end
0 commit comments