@@ -292,4 +292,129 @@ public async Task GetStationDetails_WithGeneralException_ReturnsUnexpectedErrorM
292292 Assert . Contains ( "Unexpected error:" , result ) ;
293293 Assert . Contains ( exceptionMessage , result ) ;
294294 }
295+
296+ [ Fact ]
297+ public async Task FindTrainConnections_WithValidStations_ReturnsConnectionAnalysis ( )
298+ {
299+ // Arrange
300+ var stationA = "Frankfurt" ;
301+ var stationB = "Berlin" ;
302+ var expectedResult = "=== Train Connection Analysis ===\n Connections found" ;
303+
304+ _mockService . Setup ( s => s . FindTrainConnectionsAsync ( stationA , stationB , null , default ) )
305+ . ReturnsAsync ( expectedResult ) ;
306+
307+ var tools = new Tools . TimetableTools ( _mockService . Object ) ;
308+
309+ // Act
310+ var result = await tools . FindTrainConnections ( stationA , stationB , null ) ;
311+
312+ // Assert
313+ Assert . Equal ( expectedResult , result ) ;
314+ _mockService . Verify ( s => s . FindTrainConnectionsAsync ( stationA , stationB , null , default ) , Times . Once ) ;
315+ }
316+
317+ [ Fact ]
318+ public async Task FindTrainConnections_WithValidDateTime_ParsesAndCallsService ( )
319+ {
320+ // Arrange
321+ var stationA = "Frankfurt" ;
322+ var stationB = "Berlin" ;
323+ var dateTimeString = "2025-11-06 14:30" ;
324+ var parsedDateTime = DateTime . Parse ( dateTimeString ) ;
325+ var expectedResult = "Connections found" ;
326+
327+ _mockService . Setup ( s => s . FindTrainConnectionsAsync ( stationA , stationB , parsedDateTime , default ) )
328+ . ReturnsAsync ( expectedResult ) ;
329+
330+ var tools = new Tools . TimetableTools ( _mockService . Object ) ;
331+
332+ // Act
333+ var result = await tools . FindTrainConnections ( stationA , stationB , dateTimeString ) ;
334+
335+ // Assert
336+ Assert . Equal ( expectedResult , result ) ;
337+ _mockService . Verify ( s => s . FindTrainConnectionsAsync ( stationA , stationB , parsedDateTime , default ) , Times . Once ) ;
338+ }
339+
340+ [ Fact ]
341+ public async Task FindTrainConnections_WithInvalidDateTimeFormat_ReturnsErrorMessage ( )
342+ {
343+ // Arrange
344+ var stationA = "Frankfurt" ;
345+ var stationB = "Berlin" ;
346+ var invalidDateTime = "invalid-date-format" ;
347+
348+ var tools = new Tools . TimetableTools ( _mockService . Object ) ;
349+
350+ // Act
351+ var result = await tools . FindTrainConnections ( stationA , stationB , invalidDateTime ) ;
352+
353+ // Assert
354+ Assert . Contains ( "Error: Invalid date format" , result ) ;
355+ Assert . Contains ( "yyyy-MM-dd HH:mm" , result ) ;
356+ }
357+
358+ [ Fact ]
359+ public async Task FindTrainConnections_WithEmptyDateTime_CallsServiceWithNull ( )
360+ {
361+ // Arrange
362+ var stationA = "Frankfurt" ;
363+ var stationB = "Berlin" ;
364+ var expectedResult = "Connections found" ;
365+
366+ _mockService . Setup ( s => s . FindTrainConnectionsAsync ( stationA , stationB , null , default ) )
367+ . ReturnsAsync ( expectedResult ) ;
368+
369+ var tools = new Tools . TimetableTools ( _mockService . Object ) ;
370+
371+ // Act
372+ var result = await tools . FindTrainConnections ( stationA , stationB , "" ) ;
373+
374+ // Assert
375+ Assert . Equal ( expectedResult , result ) ;
376+ _mockService . Verify ( s => s . FindTrainConnectionsAsync ( stationA , stationB , null , default ) , Times . Once ) ;
377+ }
378+
379+ [ Fact ]
380+ public async Task FindTrainConnections_WithHttpRequestException_ReturnsErrorMessage ( )
381+ {
382+ // Arrange
383+ var stationA = "Frankfurt" ;
384+ var stationB = "Berlin" ;
385+ var exceptionMessage = "Network error" ;
386+
387+ _mockService . Setup ( s => s . FindTrainConnectionsAsync ( stationA , stationB , null , default ) )
388+ . ThrowsAsync ( new HttpRequestException ( exceptionMessage ) ) ;
389+
390+ var tools = new Tools . TimetableTools ( _mockService . Object ) ;
391+
392+ // Act
393+ var result = await tools . FindTrainConnections ( stationA , stationB , null ) ;
394+
395+ // Assert
396+ Assert . Contains ( "Error finding train connections:" , result ) ;
397+ Assert . Contains ( exceptionMessage , result ) ;
398+ }
399+
400+ [ Fact ]
401+ public async Task FindTrainConnections_WithGeneralException_ReturnsUnexpectedErrorMessage ( )
402+ {
403+ // Arrange
404+ var stationA = "Frankfurt" ;
405+ var stationB = "Berlin" ;
406+ var exceptionMessage = "Unexpected error" ;
407+
408+ _mockService . Setup ( s => s . FindTrainConnectionsAsync ( stationA , stationB , null , default ) )
409+ . ThrowsAsync ( new InvalidOperationException ( exceptionMessage ) ) ;
410+
411+ var tools = new Tools . TimetableTools ( _mockService . Object ) ;
412+
413+ // Act
414+ var result = await tools . FindTrainConnections ( stationA , stationB , null ) ;
415+
416+ // Assert
417+ Assert . Contains ( "Unexpected error:" , result ) ;
418+ Assert . Contains ( exceptionMessage , result ) ;
419+ }
295420}
0 commit comments