@@ -886,6 +886,38 @@ public void OnNotFoundSubscriptionIsTriggeredWhenNotFoundCalled()
886
886
// Assert
887
887
Assert . True ( notFoundTriggered , "The OnNotFound event was not triggered as expected." ) ;
888
888
}
889
+
890
+ [ Fact ]
891
+ public void OnNavigateToCallback_WhenThrows_ShouldBeHandledGracefully ( )
892
+ {
893
+ // Arrange
894
+ var baseUri = "scheme://host/" ;
895
+ var uri = "scheme://host/test" ;
896
+ var testNavManager = new TestNavigationManagerWithCallback ( ) ;
897
+ var exceptionThrown = false ;
898
+ var expectedException = new InvalidOperationException ( "Test exception from OnNavigateTo" ) ;
899
+
900
+ // Configure the onNavigateTo callback to throw an exception
901
+ testNavManager . ConfigureOnNavigateToCallback ( throwingUri =>
902
+ {
903
+ exceptionThrown = true ;
904
+ throw expectedException ;
905
+ } ) ;
906
+
907
+ // Act
908
+ // Initialize the navigation manager with the callback
909
+ testNavManager . Initialize ( baseUri , uri , testNavManager . GetOnNavigateToCallback ( ) ) ;
910
+
911
+ // Assert
912
+ Assert . True ( testNavManager . IsInitialized ) ;
913
+
914
+ // When navigation is triggered, the exception should be handled gracefully
915
+ var thrownException = testNavManager . TriggerOnNavigateToCallback ( uri ) ;
916
+
917
+ // Assert
918
+ Assert . True ( exceptionThrown , "The OnNavigateTo callback should have been called and thrown an exception." ) ;
919
+ Assert . Same ( expectedException , thrownException ) ;
920
+ }
889
921
890
922
private class TestNavigationManager : NavigationManager
891
923
{
@@ -932,4 +964,64 @@ protected override void HandleLocationChangingHandlerException(Exception ex, Loc
932
964
_exceptionsThrownFromLocationChangingHandlers . Add ( ex ) ;
933
965
}
934
966
}
967
+
968
+ private class TestNavigationManagerWithCallback : TestNavigationManager , IHostEnvironmentNavigationManager
969
+ {
970
+ private Func < string , Task > _onNavigateToCallback ;
971
+
972
+ public TestNavigationManagerWithCallback ( )
973
+ {
974
+ }
975
+
976
+ public void Initialize ( string baseUri , string uri , Func < string , Task > onNavigateTo )
977
+ {
978
+ _onNavigateToCallback = onNavigateTo ;
979
+ base . Initialize ( baseUri , uri ) ;
980
+ }
981
+
982
+ public void ConfigureOnNavigateToCallback ( Func < string , Task > callback )
983
+ {
984
+ _onNavigateToCallback = callback ;
985
+ }
986
+
987
+ public Func < string , Task > GetOnNavigateToCallback ( )
988
+ {
989
+ return _onNavigateToCallback ;
990
+ }
991
+
992
+ public Exception TriggerOnNavigateToCallback ( string uri )
993
+ {
994
+ if ( _onNavigateToCallback == null )
995
+ {
996
+ return null ;
997
+ }
998
+
999
+ try
1000
+ {
1001
+ // Simulate the fire-and-forget pattern used in RemoteNavigationManager
1002
+ _ = _onNavigateToCallback ( uri ) ;
1003
+ return null ;
1004
+ }
1005
+ catch ( Exception ex )
1006
+ {
1007
+ return ex ;
1008
+ }
1009
+ }
1010
+
1011
+ public bool IsInitialized
1012
+ {
1013
+ get
1014
+ {
1015
+ try
1016
+ {
1017
+ _ = BaseUri ; // This will throw if not initialized
1018
+ return true ;
1019
+ }
1020
+ catch ( InvalidOperationException )
1021
+ {
1022
+ return false ;
1023
+ }
1024
+ }
1025
+ }
1026
+ }
935
1027
}
0 commit comments