I am trying to unit test the onSignOutTapped method, but I am always getting an assertion failure due to the function parameters in the AlertDialogData object. I am trying to find a way to assert this event, but I am not sure what I am doing wrong. Can someone please help me?
class AccountViewModel @Inject constructor( ) : ViewModel() {
private val mutableUiState =
MutableStateFlow(AccountContract.UiState(showManageMyAccountWebPageUrl = appConfig.websiteurl.settings))
val uiState: StateFlow<AccountContract.UiState> = mutableUiState.asStateFlow()
fun onSignOutTapped() {
mutableUiState.update(
alertDialogData = AlertDialogData(
title = resourcesSurface.getString(R.string.confirm_sign_out_title),
message = resourcesSurface.getString(R.string.account_confirm_sign_out_message_2),
showDialog = true,
confirmButtonText = resourcesSurface.getString(R.string.account_confirm_sign_out),
confirmButtonAction = { signOut() },
negativeButtonText = resourcesSurface.getString(R.string.btn_cancel),
negativeButtonAction = { dismissMessageDialogs() }
)
)
}
private fun signOut() {
....
}
private fun onCloseMyAccountTapped() {
...
}
}
-----------------------
interface AccountContract {
data class UiState(
val menuItems: List<MenuItemDTO> = emptyList(),
val alertDialogData: AlertDialogData? = null,
val showManageMyAccountWebPageUrl: String? = null,
val userEvents: UserEvents? = null
)
sealed class UserEvents {
object NavigateToCloseMyAccountScreen : UserEvents()
object OpenManageMyAccountWebPage : UserEvents()
}
}
data class AlertDialogData(
var title: String = "",
var message: String = "",
var showDialog: Boolean = false,
var confirmButtonText: String = "",
val confirmButtonTextColour: Int = R.color.primary,
var confirmButtonAction: () -> Unit = {},
var negativeButtonText: String = "",
var negativeButtonTextColour: Int = R.color.primary,
var negativeButtonAction: () -> Unit = {},
var dismissButtonAction: () -> Unit = {}
)
class AccountViewModelTest {
@MockK
lateinit var resourcesSurface: ResourcesSurface
lateinit var viewModel: AccountViewModel
@Before
fun setup() {
MockKAnnotations.init(this)
viewModel = AccountViewModel()
}
@Test
fun `When sign out is tapped, then show sign out prompt`() = runTest {
every { resourcesSurface.getString(R.string.confirm_sign_out_title) } returns ("Confirm sign out?")
every {
resourcesSurface.getString(R.string.account_confirm_sign_out_message_2)
} returns ("Are you sure you want to sign out of your account?")
every {
resourcesSurface.getString(R.string.account_confirm_sign_out)
} returns ("Sign out")
every {
resourcesSurface.getString(R.string.btn_cancel)
} returns ("Cancel")
viewModel.onSignOutTapped()
viewModel.uiState.test {
assertEquals(
AccountContract.UiState(
showManageMyAccountWebPageUrl = "testURl",
userEvents = null,
alertDialogData = AlertDialogData(
title = "Confirm sign out?",
message = "Are you sure you want to sign out of your account?",
showDialog = true,
confirmButtonText = "Sign out",
confirmButtonAction = any(),
negativeButtonText = "Cancel",
negativeButtonAction = any()
)
),
awaitItem()
)
}
}
}
}