@@ -156,6 +156,158 @@ await AsyncTestHelpers.AssertIsTrueRetryAsync(() =>
156156 } , "Expected rows to be rendered." , logger ) ;
157157 }
158158
159+ [ Fact ]
160+ public async Task Render_SpansOrderedByStartTime_RowsRenderedInCorrectOrder ( )
161+ {
162+ // Arrange
163+ SetupTraceDetailsServices ( ) ;
164+
165+ var viewport = new ViewportInformation ( IsDesktop : true , IsUltraLowHeight : false , IsUltraLowWidth : false ) ;
166+
167+ var dimensionManager = Services . GetRequiredService < DimensionManager > ( ) ;
168+ dimensionManager . InvokeOnViewportInformationChanged ( viewport ) ;
169+
170+ var telemetryRepository = Services . GetRequiredService < TelemetryRepository > ( ) ;
171+ telemetryRepository . AddTraces ( new AddContext ( ) ,
172+ new RepeatedField < ResourceSpans >
173+ {
174+ new ResourceSpans
175+ {
176+ Resource = CreateResource ( ) ,
177+ ScopeSpans =
178+ {
179+ new ScopeSpans
180+ {
181+ Scope = CreateScope ( ) ,
182+ Spans =
183+ {
184+ CreateSpan ( traceId : "1" , spanId : "1-1" ,
185+ startTime : s_testTime . AddMinutes ( 1 ) ,
186+ endTime : s_testTime . AddMinutes ( 10 ) ) ,
187+ CreateSpan ( traceId : "1" , spanId : "2-1" ,
188+ startTime : s_testTime . AddMinutes ( 1 ) ,
189+ endTime : s_testTime . AddMinutes ( 10 ) ,
190+ parentSpanId : "1-1" ) ,
191+ CreateSpan ( traceId : "1" , spanId : "3-1" ,
192+ startTime : s_testTime . AddMinutes ( 1 ) ,
193+ endTime : s_testTime . AddMinutes ( 10 ) ,
194+ parentSpanId : "2-1" ) ,
195+ CreateSpan ( traceId : "1" , spanId : "3-3" ,
196+ startTime : s_testTime . AddMinutes ( 3 ) ,
197+ endTime : s_testTime . AddMinutes ( 5 ) ,
198+ parentSpanId : "2-1" ) ,
199+ CreateSpan ( traceId : "1" , spanId : "3-2" ,
200+ startTime : s_testTime . AddMinutes ( 2 ) ,
201+ endTime : s_testTime . AddMinutes ( 6 ) ,
202+ parentSpanId : "2-1" )
203+ }
204+ }
205+ }
206+ }
207+ } ) ;
208+
209+ // Act
210+ var traceId = Convert . ToHexString ( Encoding . UTF8 . GetBytes ( "1" ) ) ;
211+ var cut = RenderComponent < TraceDetail > ( builder =>
212+ {
213+ builder . Add ( p => p . TraceId , traceId ) ;
214+ builder . AddCascadingValue ( viewport ) ;
215+ } ) ;
216+
217+ var data = await cut . Instance . GetData ( new GridItemsProviderRequest < SpanWaterfallViewModel > ( ) ) ;
218+
219+ // Assert
220+ Assert . Collection ( data . Items ,
221+ item => Assert . Equal ( "Test span. Id: 1-1" , item . Span . Name ) ,
222+ item => Assert . Equal ( "Test span. Id: 2-1" , item . Span . Name ) ,
223+ item => Assert . Equal ( "Test span. Id: 3-1" , item . Span . Name ) ,
224+ item => Assert . Equal ( "Test span. Id: 3-2" , item . Span . Name ) ,
225+ item => Assert . Equal ( "Test span. Id: 3-3" , item . Span . Name ) ) ;
226+ }
227+
228+ [ Fact ]
229+ public void ToggleCollapse_SpanStateChanges ( )
230+ {
231+ // Arrange
232+ SetupTraceDetailsServices ( ) ;
233+
234+ var viewport = new ViewportInformation ( IsDesktop : true , IsUltraLowHeight : false , IsUltraLowWidth : false ) ;
235+ var dimensionManager = Services . GetRequiredService < DimensionManager > ( ) ;
236+ dimensionManager . InvokeOnViewportInformationChanged ( viewport ) ;
237+
238+ var telemetryRepository = Services . GetRequiredService < TelemetryRepository > ( ) ;
239+ telemetryRepository . AddTraces ( new AddContext ( ) ,
240+ new RepeatedField < ResourceSpans >
241+ {
242+ new ResourceSpans
243+ {
244+ Resource = CreateResource ( ) ,
245+ ScopeSpans =
246+ {
247+ new ScopeSpans
248+ {
249+ Scope = CreateScope ( ) ,
250+ Spans =
251+ {
252+ CreateSpan ( traceId : "1" , spanId : "1-1" ,
253+ startTime : s_testTime . AddMinutes ( 1 ) ,
254+ endTime : s_testTime . AddMinutes ( 10 ) ) ,
255+ CreateSpan ( traceId : "1" , spanId : "2-1" ,
256+ startTime : s_testTime . AddMinutes ( 5 ) ,
257+ endTime : s_testTime . AddMinutes ( 10 ) , parentSpanId : "1-1" ) ,
258+ CreateSpan ( traceId : "1" , spanId : "3-1" ,
259+ startTime : s_testTime . AddMinutes ( 6 ) ,
260+ endTime : s_testTime . AddMinutes ( 10 ) , parentSpanId : "2-1" )
261+ }
262+ }
263+ }
264+ }
265+ } ) ;
266+
267+ var traceId = Convert . ToHexString ( Encoding . UTF8 . GetBytes ( "1" ) ) ;
268+ var cut = RenderComponent < TraceDetail > ( builder =>
269+ {
270+ builder . Add ( p => p . TraceId , traceId ) ;
271+ builder . AddCascadingValue ( viewport ) ;
272+ } ) ;
273+
274+ cut . WaitForAssertion ( ( ) => Assert . Equal ( 2 , cut . FindAll ( ".main-grid-expand-button" ) . Count ) ) ;
275+ // Act and assert
276+
277+ // Collapse the middle span
278+ cut . FindAll ( ".main-grid-expand-button" ) [ 1 ] . Click ( ) ;
279+
280+ cut . WaitForAssertion ( ( ) =>
281+ {
282+ var expandContainers = cut . FindAll ( ".main-grid-expand-container" ) ;
283+ // There should now be two containers since the 3rd level element should now be filtered out
284+ Assert . Collection ( expandContainers ,
285+ container => Assert . True ( container . ClassList . Contains ( "main-grid-expanded" ) ) ,
286+ container => Assert . True ( container . ClassList . Contains ( "main-grid-collapsed" ) ) ) ;
287+ } ) ;
288+
289+ // Collapse the parent span
290+ cut . FindAll ( ".main-grid-expand-button" ) [ 0 ] . Click ( ) ;
291+ cut . WaitForAssertion ( ( ) =>
292+ {
293+ var expandContainers = cut . FindAll ( ".main-grid-expand-container" ) ;
294+ // There should now be one container since the 2nd level element should now be filtered out
295+ Assert . Collection ( expandContainers ,
296+ container => Assert . True ( container . ClassList . Contains ( "main-grid-collapsed" ) ) ) ;
297+ } ) ;
298+
299+ // Expand the parent span, we should now see the same two containers as before
300+ cut . FindAll ( ".main-grid-expand-button" ) [ 0 ] . Click ( ) ;
301+ cut . WaitForAssertion ( ( ) =>
302+ {
303+ var expandContainers = cut . FindAll ( ".main-grid-expand-container" ) ;
304+ // There should now be two containers since the 3rd level element should now be filtered out
305+ Assert . Collection ( expandContainers ,
306+ container => Assert . True ( container . ClassList . Contains ( "main-grid-expanded" ) ) ,
307+ container => Assert . True ( container . ClassList . Contains ( "main-grid-collapsed" ) ) ) ;
308+ } ) ;
309+ }
310+
159311 private void SetupTraceDetailsServices ( ILoggerFactory ? loggerFactory = null )
160312 {
161313 var version = typeof ( FluentMain ) . Assembly . GetName ( ) . Version ! ;
0 commit comments