@@ -5,70 +5,131 @@ defmodule Ecto.Integration.LoggingTest do
55 alias Ecto.Integration.PoolRepo
66 alias Ecto.Integration.Post
77
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
1526 end
1627
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
2133
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
2737 end
2838
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
3345
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
4049 end
4150
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
4654
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
5266
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
5772 end
5873
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 ]
6376
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
6881
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
73134 end
74135end
0 commit comments