@@ -13,7 +13,7 @@ defmodule LiveDebugger.ChannelDashboardTest do
1313 debugger
1414 |> visit ( "/" )
1515 |> click ( first_link ( ) )
16- |> assert_has ( counter_in_assigns ( text : "0" ) )
16+ |> assert_has ( assigns_entry ( key: "counter" , value : "0" ) )
1717 |> assert_has ( traces ( count: 2 ) )
1818
1919 dev_app
@@ -22,7 +22,7 @@ defmodule LiveDebugger.ChannelDashboardTest do
2222
2323 debugger
2424 |> assert_has ( traces ( count: 2 ) )
25- |> assert_has ( counter_in_assigns ( text : "2" ) )
25+ |> assert_has ( assigns_entry ( key: "counter" , value : "2" ) )
2626 |> click ( toggle_tracing_button ( ) )
2727
2828 dev_app
@@ -31,7 +31,7 @@ defmodule LiveDebugger.ChannelDashboardTest do
3131
3232 debugger
3333 |> assert_has ( traces ( count: 6 ) )
34- |> assert_has ( counter_in_assigns ( text : "4" ) )
34+ |> assert_has ( assigns_entry ( key: "counter" , value : "4" ) )
3535 |> click ( toggle_tracing_button ( ) )
3636 |> click ( clear_traces_button ( ) )
3737 |> assert_has ( traces ( count: 0 ) )
@@ -46,19 +46,230 @@ defmodule LiveDebugger.ChannelDashboardTest do
4646 |> assert_has ( traces ( count: 4 ) )
4747 end
4848
49+ @ sessions 2
50+ feature "user can change nodes using node tree and see their assigns and callback traces" , % {
51+ sessions: [ dev_app , debugger ]
52+ } do
53+ LiveDebugger.GenServers.CallbackTracingServer . ping! ( )
54+
55+ dev_app
56+ |> visit ( @ dev_app_url )
57+
58+ debugger
59+ |> visit ( "/" )
60+ |> click ( first_link ( ) )
61+ |> click ( conditional_component_4_node_button ( ) )
62+ |> find ( css ( "#info" ) , fn info ->
63+ info
64+ |> assert_text ( "LiveComponent" )
65+ |> assert_text ( "LiveDebuggerDev.LiveComponents.Conditional" )
66+ end )
67+ |> assert_has ( assigns_entry ( key: "show_child?" , value: "false" ) )
68+ |> assert_has ( traces ( count: 2 ) )
69+ |> click ( toggle_tracing_button ( ) )
70+
71+ dev_app
72+ |> click ( button ( "conditional-button" ) )
73+
74+ debugger
75+ |> assert_has ( many_assigns_14_node_button ( ) )
76+ |> assert_has ( assigns_entry ( key: "show_child?" , value: "true" ) )
77+ |> assert_has ( traces ( count: 4 ) )
78+ |> click ( conditional_component_5_node_button ( ) )
79+ |> click ( conditional_component_4_node_button ( ) )
80+ |> assert_has ( assigns_entry ( key: "show_child?" , value: "true" ) )
81+ |> assert_has ( traces ( count: 4 ) )
82+ end
83+
84+ @ sessions 2
85+ feature "user can filter callback traces" , % { sessions: [ dev_app , debugger ] } do
86+ LiveDebugger.GenServers.CallbackTracingServer . ping! ( )
87+
88+ dev_app
89+ |> visit ( @ dev_app_url )
90+
91+ debugger
92+ |> visit ( "/" )
93+ |> click ( first_link ( ) )
94+ |> assert_has ( traces ( count: 2 ) )
95+ |> click ( toggle_tracing_button ( ) )
96+
97+ dev_app
98+ |> click ( button ( "send-button" ) )
99+ |> click ( button ( "send-button" ) )
100+
101+ debugger
102+ |> assert_traces ( 6 , [
103+ "render/1" ,
104+ "handle_info/2" ,
105+ "render/1" ,
106+ "handle_info/2" ,
107+ "render/1" ,
108+ "mount/3"
109+ ] )
110+ |> click ( toggle_tracing_button ( ) )
111+ |> click ( filters_button ( ) )
112+ |> click ( checkbox ( "mount" ) )
113+ |> click ( checkbox ( "render" ) )
114+ |> click ( css ( "button" , text: "Apply (7)" ) )
115+ |> assert_traces ( 2 , [
116+ "handle_info/2" ,
117+ "handle_info/2"
118+ ] )
119+
120+ dev_app
121+ |> click ( button ( "increment-button" ) )
122+ |> click ( button ( "increment-button" ) )
123+
124+ debugger
125+ |> click ( refresh_button ( ) )
126+ |> assert_traces ( 4 , [
127+ "handle_event/3" ,
128+ "handle_event/3" ,
129+ "handle_info/2" ,
130+ "handle_info/2"
131+ ] )
132+ |> click ( toggle_tracing_button ( ) )
133+
134+ dev_app
135+ |> click ( button ( "send-button" ) )
136+ |> click ( button ( "send-button" ) )
137+
138+ debugger
139+ |> assert_traces ( 6 , [
140+ "handle_info/2" ,
141+ "handle_info/2" ,
142+ "handle_event/3" ,
143+ "handle_event/3" ,
144+ "handle_info/2" ,
145+ "handle_info/2"
146+ ] )
147+ |> click ( toggle_tracing_button ( ) )
148+ |> click ( filters_button ( ) )
149+ |> click ( reset_filters_button ( ) )
150+ |> click ( css ( "button" , text: "Apply (9)" ) )
151+ |> assert_traces ( 14 , [
152+ "render/1" ,
153+ "handle_info/2" ,
154+ "render/1" ,
155+ "handle_info/2" ,
156+ "render/1" ,
157+ "handle_event/3" ,
158+ "render/1" ,
159+ "handle_event/3" ,
160+ "render/1" ,
161+ "handle_info/2" ,
162+ "render/1" ,
163+ "handle_info/2" ,
164+ "render/1" ,
165+ "mount/3"
166+ ] )
167+ |> click ( filters_button ( ) )
168+ |> click ( checkbox ( "mount" ) )
169+ |> click ( checkbox ( "handle_params" ) )
170+ |> click ( checkbox ( "handle_info" ) )
171+ |> click ( checkbox ( "handle_call" ) )
172+ |> click ( checkbox ( "handle_cast" ) )
173+ |> click ( checkbox ( "terminate" ) )
174+ |> click ( checkbox ( "render" ) )
175+ |> click ( checkbox ( "handle_event" ) )
176+ |> click ( checkbox ( "handle_async" ) )
177+ |> click ( css ( "button" , text: "Apply" ) )
178+ |> assert_has ( traces ( count: 0 ) )
179+ end
180+
181+ defp assert_traces ( session , count , callback_names ) do
182+ session
183+ |> find ( traces ( count: count ) )
184+ |> Enum . zip ( callback_names )
185+ |> Enum . each ( fn { trace , callback_name } ->
186+ trace |> assert_text ( callback_name )
187+ end )
188+
189+ session
190+ end
191+
192+ @ sessions 2
193+ feature "user can inspect arguments of executed callback" , % { sessions: [ dev_app , debugger ] } do
194+ LiveDebugger.GenServers.CallbackTracingServer . ping! ( )
195+
196+ dev_app
197+ |> visit ( @ dev_app_url )
198+
199+ debugger
200+ |> visit ( "/" )
201+ |> click ( first_link ( ) )
202+ |> click ( toggle_tracing_button ( ) )
203+
204+ dev_app
205+ |> click ( button ( "increment-button" ) )
206+ |> click ( button ( "send-button" ) )
207+
208+ [ render3_trace , send_trace , render2_trace , increment_trace , render1_trace , _ ] =
209+ debugger
210+ |> find ( traces ( count: 6 ) )
211+
212+ render1_trace
213+ |> click ( css ( "summary" ) )
214+ |> assert_has ( map_entry ( key: "datetime" , value: "nil" ) )
215+ |> assert_has ( map_entry ( key: "counter" , value: "0" ) )
216+
217+ increment_trace
218+ |> click ( css ( "summary" ) )
219+ |> assert_text ( "handle_event/3" )
220+ |> assert_text ( "increment" )
221+
222+ render2_trace
223+ |> click ( css ( "summary" ) )
224+ |> assert_has ( map_entry ( key: "datetime" , value: "nil" ) )
225+ |> assert_has ( map_entry ( key: "counter" , value: "1" ) )
226+
227+ send_trace
228+ |> click ( css ( "summary" ) )
229+ |> assert_text ( "handle_info/2" )
230+ |> assert_text ( ":new_datetime" )
231+
232+ render3_trace
233+ |> click ( css ( "summary" ) )
234+ |> assert_has ( map_entry ( key: "datetime" , value: "~U[" ) )
235+ |> assert_has ( map_entry ( key: "counter" , value: "1" ) )
236+ end
237+
49238 defp first_link ( ) , do: css ( "#live-sessions a" , count: 1 )
50239
51- defp counter_in_assigns ( text: text ) do
240+ defp assigns_entry ( key: key , value: value ) do
52241 xpath (
53- ".//*[@id=\" assigns\" ]//*[contains(normalize-space(text()), \" counter :\" )]/../*[contains(normalize-space(text()), \" #{ text } \" )]"
242+ ".//*[@id=\" assigns\" ]//*[contains(normalize-space(text()), \" #{ key } :\" )]/../*[contains(normalize-space(text()), \" #{ value } \" )]"
54243 )
55244 end
56245
57- defp traces ( opts ) , do: css ( "#traces-list-stream details" , opts )
246+ defp map_entry ( key: key , value: value ) do
247+ xpath (
248+ ".//*[contains(normalize-space(text()), \" #{ key } :\" )]/../*[contains(normalize-space(text()), \" #{ value } \" )]"
249+ )
250+ end
58251
59- defp refresh_button ( ) , do: css ( "button[phx-click= \" refresh-history \" ]" )
252+ defp traces ( opts ) , do: css ( "#traces-list-stream details" , opts )
60253
61254 defp toggle_tracing_button ( ) , do: css ( "button[phx-click=\" switch-tracing\" ]" )
62255
256+ defp refresh_button ( ) , do: css ( "button[phx-click=\" refresh-history\" ]" )
257+
63258 defp clear_traces_button ( ) , do: css ( "button[phx-click=\" clear-traces\" ]" )
259+
260+ defp filters_button ( ) , do: css ( "#filters-dropdown-button" )
261+
262+ defp reset_filters_button ( ) , do: css ( "button[phx-click=\" reset\" ]" )
263+
264+ defp conditional_component_4_node_button ( ) do
265+ css ( "#tree-node-button-4-component-tree-sidebar-content" )
266+ end
267+
268+ defp conditional_component_5_node_button ( ) do
269+ css ( "#tree-node-button-5-component-tree-sidebar-content" )
270+ end
271+
272+ defp many_assigns_14_node_button ( ) do
273+ css ( "#tree-node-button-14-component-tree-sidebar-content" )
274+ end
64275end
0 commit comments