@@ -112,7 +112,48 @@ public async Task It_serializes_an_error_on_exception()
112112problemDetails . Detail . Should ( ) . NotBeNullOrWhiteSpace ( ) ;
113113problemDetails . Status . Should ( ) . Be ( ( int ) HttpStatusCode . InternalServerError ) ;
114114problemDetails . Extensions . Should ( ) . ContainKey ( "traceId" ) ;
115- ( ( JsonElement ) problemDetails . Extensions [ "traceId" ] ! ) . GetString ( ) . Should ( ) . NotBeNullOrWhiteSpace ( ) ;
115+ ( ( JsonElement ) problemDetails . Extensions [ "traceId" ] ! ) . GetString ( ) . Should ( ) . NotBeNullOrWhiteSpace ( ) ;
116+ }
117+
118+ [ Fact ]
119+ public async Task It_returns_dashboard_data ( )
120+ {
121+ // Arrange / Act
122+ var result = await HappyPath < DashboardModel > ( _sut . GetDashboardAsync ) ;
123+
124+ // Assert - Let's see what we actually get first
125+ result . Should ( ) . NotBeNull ( ) ;
126+ result . TotalLogs . Should ( ) . Be ( 100 ) ; // Should match FakeProvider
127+ result . LogsByLevel . Should ( ) . ContainKey ( "Information" ) ;
128+ result . TodayLogs . Should ( ) . Be ( 10 ) ;
129+ result . TodayErrorLogs . Should ( ) . Be ( 1 ) ;
130+ }
131+
132+ [ Fact ]
133+ public async Task It_serializes_dashboard_error_on_exception ( )
134+ {
135+ // Arrange
136+ _testContext . Response . Body = new MemoryStream ( ) ;
137+ var sut = new SerilogUiEndpoints ( _contextAccessor , _loggerMock , new AggregateDataProvider ( new [ ] { new BrokenProvider ( ) } ) ) ;
138+
139+ // Act
140+ await sut . GetDashboardAsync ( ) ;
141+
142+ // Assert
143+ _testContext . Response . StatusCode . Should ( ) . Be ( 500 ) ;
144+ _testContext . Response . Body . Seek ( 0 , SeekOrigin . Begin ) ;
145+ var result = await new StreamReader ( _testContext . Response . Body ) . ReadToEndAsync ( ) ;
146+
147+ _testContext . Response . StatusCode . Should ( ) . Be ( ( int ) HttpStatusCode . InternalServerError ) ;
148+ _testContext . Response . ContentType . Should ( ) . Be ( "application/problem+json" ) ;
149+
150+ var problemDetails = JsonSerializer . Deserialize < ProblemDetails > ( result ) ! ;
151+
152+ problemDetails . Title . Should ( ) . StartWith ( "An error occured" ) ;
153+ problemDetails . Detail . Should ( ) . NotBeNullOrWhiteSpace ( ) ;
154+ problemDetails . Status . Should ( ) . Be ( ( int ) HttpStatusCode . InternalServerError ) ;
155+ problemDetails . Extensions . Should ( ) . ContainKey ( "traceId" ) ;
156+ ( ( JsonElement ) problemDetails . Extensions [ "traceId" ] ! ) . GetString ( ) . Should ( ) . NotBeNullOrWhiteSpace ( ) ;
116157}
117158
118159private async Task < T > HappyPath < T > ( Func < Task > call )