@@ -778,6 +778,132 @@ class LoginViewModelTest {
778778 }
779779 }
780780
781+ @Test
782+ fun loginViewModel_loginUrlObserver_ignoresLoginUrlWhenBrowserLoginEnabledAndSingleServerCustomTabActivityEnabled () = runTest {
783+
784+ val dispatcher = StandardTestDispatcher (testScheduler)
785+ val scope = CoroutineScope (dispatcher)
786+
787+ val valueOld = null
788+ val valueNew = " https://www.example.com" // IETF-Reserved Test Domain
789+
790+ val sdkManager = mockk<SalesforceSDKManager >(relaxed = true )
791+ every { sdkManager.isBrowserLoginEnabled } returns true
792+ val viewModel = mockk<LoginViewModel >(relaxed = true )
793+ val loginUrl = mockk<MediatorLiveData <String >>(relaxed = true )
794+ every { loginUrl.value } returns valueOld
795+ every { viewModel.singleServerCustomTabActivity } returns true
796+ every { viewModel.loginUrl } returns loginUrl
797+ val observer = viewModel.LoginUrlSource (sdkManager, viewModel, scope)
798+
799+ observer.onChanged(valueNew)
800+
801+ advanceUntilIdle()
802+
803+ coVerify(exactly = 0 ) {
804+ viewModel.getAuthorizationUrl(
805+ valueNew,
806+ any(),
807+ any(),
808+ )
809+ }
810+ }
811+
812+ @Test
813+ fun loginViewModel_loginUrlObserver_ignoresLoginUrlWhenBrowserLoginDisabledAndSingleServerCustomTabActivityEnabled () = runTest {
814+
815+ val dispatcher = StandardTestDispatcher (testScheduler)
816+ val scope = CoroutineScope (dispatcher)
817+
818+ val valueOld = null
819+ val valueNew = " https://www.example.com" // IETF-Reserved Test Domain
820+
821+ val sdkManager = mockk<SalesforceSDKManager >(relaxed = true )
822+ every { sdkManager.isBrowserLoginEnabled } returns false
823+ val viewModel = mockk<LoginViewModel >(relaxed = true )
824+ val loginUrl = mockk<MediatorLiveData <String >>(relaxed = true )
825+ every { loginUrl.value } returns valueOld
826+ every { viewModel.singleServerCustomTabActivity } returns true
827+ every { viewModel.loginUrl } returns loginUrl
828+ val observer = viewModel.LoginUrlSource (sdkManager, viewModel, scope)
829+
830+ observer.onChanged(valueNew)
831+
832+ advanceUntilIdle()
833+
834+ coVerify(exactly = 0 ) {
835+ viewModel.getAuthorizationUrl(
836+ valueNew,
837+ any(),
838+ any(),
839+ )
840+ }
841+ }
842+
843+ @Test
844+ fun loginViewModel_loginUrlObserver_ignoresLoginUrlWhenBrowserLoginDisabledAndSingleServerCustomTabActivityEnabledAndFrontDoorBridgeActive () = runTest {
845+
846+ val dispatcher = StandardTestDispatcher (testScheduler)
847+ val scope = CoroutineScope (dispatcher)
848+
849+ val valueOld = null
850+ val valueNew = " https://www.example.com" // IETF-Reserved Test Domain
851+
852+ val sdkManager = mockk<SalesforceSDKManager >(relaxed = true )
853+ every { sdkManager.isBrowserLoginEnabled } returns false
854+ val viewModel = mockk<LoginViewModel >(relaxed = true )
855+ val loginUrl = mockk<MediatorLiveData <String >>(relaxed = true )
856+ every { loginUrl.value } returns valueOld
857+ every { viewModel.singleServerCustomTabActivity } returns true
858+ every { viewModel.isUsingFrontDoorBridge } returns true
859+ every { viewModel.loginUrl } returns loginUrl
860+ val observer = viewModel.LoginUrlSource (sdkManager, viewModel, scope)
861+
862+ observer.onChanged(valueNew)
863+
864+ advanceUntilIdle()
865+
866+ coVerify(exactly = 0 ) {
867+ viewModel.getAuthorizationUrl(
868+ valueNew,
869+ any(),
870+ any(),
871+ )
872+ }
873+ }
874+
875+ @Test
876+ fun loginViewModel_loginUrlObserver_ignoresLoginUrlWhenBrowserLoginDisabledAndSingleServerCustomTabActivityEnabledAndFrontDoorBridgeActiveAndValueNull () = runTest {
877+
878+ val dispatcher = StandardTestDispatcher (testScheduler)
879+ val scope = CoroutineScope (dispatcher)
880+
881+ val valueOld = null
882+ val valueNew = " https://www.example.com" // IETF-Reserved Test Domain
883+
884+ val sdkManager = mockk<SalesforceSDKManager >(relaxed = true )
885+ every { sdkManager.isBrowserLoginEnabled } returns false
886+ val viewModel = mockk<LoginViewModel >(relaxed = true )
887+ val loginUrl = mockk<MediatorLiveData <String >>(relaxed = true )
888+ every { loginUrl.value } returns valueOld
889+ every { viewModel.singleServerCustomTabActivity } returns true
890+ every { viewModel.isUsingFrontDoorBridge } returns true
891+ every { viewModel.loginUrl } returns loginUrl
892+ val observer = viewModel.LoginUrlSource (sdkManager, viewModel, scope)
893+
894+ observer.onChanged(null )
895+
896+ advanceUntilIdle()
897+
898+ coVerify(exactly = 0 ) {
899+ viewModel.getAuthorizationUrl(
900+ valueNew,
901+ any(),
902+ any(),
903+ )
904+ }
905+ }
906+
781907 @Test
782908 fun loginViewModel_loginUrlObserver_ignoresWhenBrowserLoginEnabled () = runTest {
783909
@@ -918,6 +1044,88 @@ class LoginViewModelTest {
9181044 ) }
9191045 }
9201046
1047+ @Test
1048+ fun loginViewModel_browserCustomTabObserver_setsBrowserCustomTabUrl_whenSingleServerCustomTabActivityEnabledAndNotUsingFrontDoorBridge () = runTest {
1049+
1050+ val dispatcher = StandardTestDispatcher (testScheduler)
1051+ val scope = CoroutineScope (dispatcher)
1052+
1053+ val sdkManager = mockk<SalesforceSDKManager >(relaxed = true )
1054+ every { sdkManager.isBrowserLoginEnabled } returns false
1055+ val viewModel = mockk<LoginViewModel >(relaxed = true )
1056+ every { viewModel.singleServerCustomTabActivity } returns true
1057+ val observer = viewModel.BrowserCustomTabUrlSource (sdkManager, viewModel, scope)
1058+
1059+ val value = " https://www.example.com" // IETF-Reserved Test Domain
1060+
1061+ observer.onChanged(value)
1062+
1063+ advanceUntilIdle()
1064+
1065+ coVerify(exactly = 1 ) {
1066+ viewModel.getAuthorizationUrl(
1067+ value,
1068+ any(),
1069+ any(),
1070+ )
1071+ }
1072+ }
1073+
1074+ @Test
1075+ fun loginViewModel_browserCustomTabObserver_ignoresBrowserCustomTabUrl_whenBrowserLoginDisabledAndSingleServerCustomTabActivityDisabledAndNotUsingFrontDoorBridge () = runTest {
1076+
1077+ val dispatcher = StandardTestDispatcher (testScheduler)
1078+ val scope = CoroutineScope (dispatcher)
1079+
1080+ val sdkManager = mockk<SalesforceSDKManager >(relaxed = true )
1081+ every { sdkManager.isBrowserLoginEnabled } returns false
1082+ val viewModel = mockk<LoginViewModel >(relaxed = true )
1083+ every { viewModel.singleServerCustomTabActivity } returns false
1084+ val observer = viewModel.BrowserCustomTabUrlSource (sdkManager, viewModel, scope)
1085+
1086+ val value = " https://www.example.com" // IETF-Reserved Test Domain
1087+
1088+ observer.onChanged(value)
1089+
1090+ advanceUntilIdle()
1091+
1092+ coVerify(exactly = 0 ) {
1093+ viewModel.getAuthorizationUrl(
1094+ value,
1095+ any(),
1096+ any(),
1097+ )
1098+ }
1099+ }
1100+
1101+ @Test
1102+ fun loginViewModel_browserCustomTabObserver_ignoresBrowserCustomTabUrl_whenBrowserLoginDisabledAndSingleServerCustomTabActivityDisabledAndUsingFrontDoorBridge () = runTest {
1103+
1104+ val dispatcher = StandardTestDispatcher (testScheduler)
1105+ val scope = CoroutineScope (dispatcher)
1106+
1107+ val sdkManager = mockk<SalesforceSDKManager >(relaxed = true )
1108+ every { sdkManager.isBrowserLoginEnabled } returns false
1109+ val viewModel = mockk<LoginViewModel >(relaxed = true )
1110+ every { viewModel.singleServerCustomTabActivity } returns false
1111+ every { viewModel.isUsingFrontDoorBridge } returns true
1112+ val observer = viewModel.BrowserCustomTabUrlSource (sdkManager, viewModel, scope)
1113+
1114+ val value = " https://www.example.com" // IETF-Reserved Test Domain
1115+
1116+ observer.onChanged(value)
1117+
1118+ advanceUntilIdle()
1119+
1120+ coVerify(exactly = 0 ) {
1121+ viewModel.getAuthorizationUrl(
1122+ value,
1123+ any(),
1124+ any(),
1125+ )
1126+ }
1127+ }
1128+
9211129 @Test
9221130 fun loginViewModel_browserCustomTabObserver_ignoresBrowserCustomTabUrl_whenIsBrowserLoginEnabledAndUsingFrontDoorBridge () {
9231131
0 commit comments