1212using Aspire . Dashboard . Tests ;
1313using Aspire . Dashboard . Utils ;
1414using Bunit ;
15+ using Microsoft . AspNetCore . InternalTesting ;
1516using Microsoft . Extensions . DependencyInjection ;
1617using Microsoft . FluentUI . AspNetCore . Components ;
1718using Microsoft . FluentUI . AspNetCore . Components . Components . Tooltip ;
@@ -72,13 +73,13 @@ public async Task OnInitialize_UnsecuredOtlp_NotDismissed_DisplayMessageBar()
7273 } ) ;
7374
7475 // Assert
75- await messageShownTcs . Task . WaitAsync ( TimeSpan . FromSeconds ( 5 ) ) ;
76+ await messageShownTcs . Task . DefaultTimeout ( ) ;
7677
7778 Assert . NotNull ( message ) ;
7879
7980 message . Close ( ) ;
8081
81- Assert . True ( await dismissedSettingSetTcs . Task . WaitAsync ( TimeSpan . FromSeconds ( 5 ) ) ) ;
82+ Assert . True ( await dismissedSettingSetTcs . Task . DefaultTimeout ( ) ) ;
8283 }
8384
8485 [ Fact ]
@@ -117,15 +118,69 @@ public async Task OnInitialize_UnsecuredOtlp_Dismissed_NoMessageBar()
117118
118119 // Assert
119120 var timeoutTask = Task . Delay ( 100 ) ;
120- var completedTask = await Task . WhenAny ( messageShownTcs . Task , timeoutTask ) . WaitAsync ( TimeSpan . FromSeconds ( 5 ) ) ;
121+ var completedTask = await Task . WhenAny ( messageShownTcs . Task , timeoutTask ) . DefaultTimeout ( ) ;
121122
122123 // It's hard to test something not happening.
123124 // In this case of checking for a message, apply a small display and then double check that no message was displayed.
124125 Assert . True ( completedTask != messageShownTcs . Task , "No message bar should be displayed." ) ;
125126 Assert . Empty ( messageService . AllMessages ) ;
126127 }
127128
128- private void SetupMainLayoutServices ( TestLocalStorage ? localStorage = null , MessageService ? messageService = null )
129+ [ Theory ]
130+ [ InlineData ( false ) ]
131+ [ InlineData ( true ) ]
132+ public async Task OnInitialize_UnsecuredOtlp_SuppressConfigured_NoMessageBar ( bool suppressUnsecuredMessage )
133+ {
134+ // Arrange
135+ var testLocalStorage = new TestLocalStorage ( ) ;
136+ var messageService = new MessageService ( ) ;
137+
138+ SetupMainLayoutServices ( localStorage : testLocalStorage , messageService : messageService , suppressUnsecuredMessage : suppressUnsecuredMessage ) ;
139+
140+ var messageShownTcs = new TaskCompletionSource ( TaskCreationOptions . RunContinuationsAsynchronously ) ;
141+ messageService . OnMessageItemsUpdatedAsync += ( ) =>
142+ {
143+ messageShownTcs . TrySetResult ( ) ;
144+ return Task . CompletedTask ;
145+ } ;
146+
147+ testLocalStorage . OnGetUnprotectedAsync = key =>
148+ {
149+ if ( key == BrowserStorageKeys . UnsecuredTelemetryMessageDismissedKey )
150+ {
151+ return ( false , false ) ; // Message not dismissed, but should be suppressed by config if suppressUnsecuredMessage is true
152+ }
153+ else
154+ {
155+ throw new InvalidOperationException ( "Unexpected key." ) ;
156+ }
157+ } ;
158+
159+ // Act
160+ var cut = RenderComponent < MainLayout > ( builder =>
161+ {
162+ builder . Add ( p => p . ViewportInformation , new ViewportInformation ( IsDesktop : true , IsUltraLowHeight : false , IsUltraLowWidth : false ) ) ;
163+ } ) ;
164+
165+ // Assert
166+ if ( suppressUnsecuredMessage )
167+ {
168+ var timeoutTask = Task . Delay ( 100 ) ;
169+ var completedTask = await Task . WhenAny ( messageShownTcs . Task , timeoutTask ) . DefaultTimeout ( ) ;
170+
171+ // When suppressed, no message should be displayed
172+ Assert . True ( completedTask != messageShownTcs . Task , "No message bar should be displayed when suppressed by configuration." ) ;
173+ Assert . Empty ( messageService . AllMessages ) ;
174+ }
175+ else
176+ {
177+ // When not suppressed, message should be displayed since it wasn't dismissed
178+ await messageShownTcs . Task . DefaultTimeout ( ) ;
179+ Assert . NotEmpty ( messageService . AllMessages ) ;
180+ }
181+ }
182+
183+ private void SetupMainLayoutServices ( TestLocalStorage ? localStorage = null , MessageService ? messageService = null , bool suppressUnsecuredMessage = false )
129184 {
130185 Services . AddLocalization ( ) ;
131186 Services . AddOptions ( ) ;
@@ -144,7 +199,11 @@ private void SetupMainLayoutServices(TestLocalStorage? localStorage = null, Mess
144199 Services . AddSingleton < DashboardTelemetryService > ( ) ;
145200 Services . AddSingleton < IDashboardTelemetrySender , TestDashboardTelemetrySender > ( ) ;
146201 Services . AddSingleton < ComponentTelemetryContextProvider > ( ) ;
147- Services . Configure < DashboardOptions > ( o => o . Otlp . AuthMode = OtlpAuthMode . Unsecured ) ;
202+ Services . Configure < DashboardOptions > ( o =>
203+ {
204+ o . Otlp . AuthMode = OtlpAuthMode . Unsecured ;
205+ o . Otlp . SuppressUnsecuredTelemetryMessage = suppressUnsecuredMessage ;
206+ } ) ;
148207
149208 var version = typeof ( FluentMain ) . Assembly . GetName ( ) . Version ! ;
150209
0 commit comments