@@ -47,11 +47,18 @@ import androidx.compose.ui.test.onNodeWithText
4747import androidx.compose.ui.test.performClick
4848import androidx.compose.ui.test.performTextClearance
4949import androidx.compose.ui.test.performTextInput
50+ import androidx.test.platform.app.InstrumentationRegistry.getInstrumentation
51+ import com.salesforce.androidsdk.R.string.sf__account_selector_text
52+ import com.salesforce.androidsdk.R.string.sf__custom_url_button
53+ import com.salesforce.androidsdk.R.string.sf__pick_server
54+ import com.salesforce.androidsdk.accounts.UserAccountManager
5055import com.salesforce.androidsdk.config.LoginServerManager.LoginServer
5156import com.salesforce.androidsdk.ui.components.AddConnection
5257import com.salesforce.androidsdk.ui.components.PickerBottomSheet
5358import com.salesforce.androidsdk.ui.components.PickerStyle
59+ import com.salesforce.androidsdk.ui.components.TestablePickerBottomSheet
5460import com.salesforce.androidsdk.ui.components.UserAccountMock
61+ import io.mockk.mockk
5562import org.junit.Assert
5663import org.junit.Rule
5764import org.junit.Test
@@ -97,6 +104,44 @@ class PickerBottomSheetTest {
97104
98105 // Google's recommended naming scheme for test is "thingUnderTest_TriggerOfTest_ResultOfTest"
99106
107+ // region Public API Tests
108+
109+ @OptIn(ExperimentalMaterial3Api ::class )
110+ @Test
111+ fun pickerBottomSheet_publicApiUserAccountPicker_displaysUserAccountPicker () {
112+ val userAccountManager = mockk<UserAccountManager >(relaxed = true )
113+ composeTestRule.setContent {
114+ TestablePickerBottomSheet (
115+ pickerStyle = PickerStyle .UserAccountPicker ,
116+ userAccountManager = userAccountManager
117+ )
118+ }
119+
120+ val context = getInstrumentation().targetContext
121+ val button = composeTestRule.onNode(hasText(context.getString(sf__account_selector_text)))
122+
123+ button.assertIsDisplayed()
124+ }
125+
126+ @OptIn(ExperimentalMaterial3Api ::class )
127+ @Test
128+ fun pickerBottomSheet_publicApiLoginServerPicker_displaysLoginServerPicker () {
129+ val userAccountManager = mockk<UserAccountManager >(relaxed = true )
130+ composeTestRule.setContent {
131+ TestablePickerBottomSheet (
132+ pickerStyle = PickerStyle .LoginServerPicker ,
133+ userAccountManager = userAccountManager
134+ )
135+ }
136+
137+ val context = getInstrumentation().targetContext
138+ val button = composeTestRule.onNode(hasText(context.getString(sf__pick_server)))
139+
140+ button.assertIsDisplayed()
141+ }
142+
143+ // endregion
144+
100145 // region Add Connection Tests
101146 @Test
102147 fun saveButton_RespondsTo_InputValidation () {
@@ -238,6 +283,38 @@ class PickerBottomSheetTest {
238283 customListItem.onChildAt(0 ).assertIsSelected()
239284 }
240285
286+ @OptIn(ExperimentalMaterial3Api ::class )
287+ @Test
288+ fun serverList_AddButtonVisibleTrue_DisplaysAddNewConnectionButton () {
289+ composeTestRule.setContent {
290+ PickerBottomSheetTestWrapper (
291+ pickerStyle = PickerStyle .LoginServerPicker ,
292+ addButtonVisible = true ,
293+ )
294+ }
295+
296+ val context = getInstrumentation().targetContext
297+ val button = composeTestRule.onNode(hasText(context.getString(sf__custom_url_button)))
298+
299+ button.assertIsDisplayed()
300+ }
301+
302+ @OptIn(ExperimentalMaterial3Api ::class )
303+ @Test
304+ fun serverList_AddButtonVisibleFalse_HidesAddNewConnectionButton () {
305+ composeTestRule.setContent {
306+ PickerBottomSheetTestWrapper (
307+ pickerStyle = PickerStyle .LoginServerPicker ,
308+ addButtonVisible = false ,
309+ )
310+ }
311+
312+ val context = getInstrumentation().targetContext
313+ val button = composeTestRule.onNode(hasText(context.getString(sf__custom_url_button)))
314+
315+ button.assertDoesNotExist()
316+ }
317+
241318 @OptIn(ExperimentalMaterial3Api ::class )
242319 @Test
243320 fun selectedServer_UpdatesOn_UIServerSelection () {
@@ -369,17 +446,28 @@ internal fun PickerBottomSheetTestWrapper(
369446 initialValue = SheetValue .Expanded ,
370447 skipHiddenState = false,
371448 ),
372- list : List <Any > = when (pickerStyle) {
449+ list : List <Any > = when (pickerStyle) {
373450 PickerStyle .LoginServerPicker -> serverList
374451 PickerStyle .UserAccountPicker -> userList
375452 },
376453 selectedListItem : Any = list.first(),
377- onItemSelected : (Any? , Boolean ) -> Unit = { _,_ -> },
454+ addButtonVisible : Boolean = true,
455+ onItemSelected : (Any? , Boolean ) -> Unit = { _, _ -> },
378456 getValidServer : ((String ) -> String? )? = { _ -> "" },
379- addNewLoginServer : ((String , String ) -> Unit )? = { _,_ -> },
457+ addNewLoginServer : ((String , String ) -> Unit )? = { _, _ -> },
380458 removeLoginServer : ((LoginServer ) -> Unit )? = { },
381459 addNewAccount : (() -> Unit )? = { },
382460) {
383- PickerBottomSheet (pickerStyle, sheetState, list, selectedListItem, onItemSelected, getValidServer,
384- addNewLoginServer, removeLoginServer, addNewAccount)
385- }
461+ PickerBottomSheet (
462+ pickerStyle = pickerStyle,
463+ sheetState = sheetState,
464+ list = list,
465+ selectedListItem = selectedListItem,
466+ addButtonVisible = addButtonVisible,
467+ onItemSelected = onItemSelected,
468+ getValidServer = getValidServer,
469+ addNewLoginServer = addNewLoginServer,
470+ removeLoginServer = removeLoginServer,
471+ addNewAccount = addNewAccount,
472+ )
473+ }
0 commit comments