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