Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,24 +1,25 @@
package org.wordpress.android.models

import android.content.Context
import dagger.Reusable
import org.wordpress.android.fluxc.model.RoleModel
import org.wordpress.android.fluxc.model.SiteModel
import org.wordpress.android.fluxc.store.SiteStore
import org.wordpress.android.models.wrappers.RoleUtilsWrapper
import org.wordpress.android.models.wrappers.SimpleDateFormatWrapper
import org.wordpress.android.ui.people.InviteLinksApiCallsProvider.InviteLinksItem
import org.wordpress.android.ui.people.InviteLinksUiItem
import org.wordpress.android.util.AppLog
import org.wordpress.android.util.AppLog.T
import org.wordpress.android.util.DateTimeUtilsWrapper
import org.wordpress.android.viewmodel.ContextProvider
import java.text.SimpleDateFormat
import javax.inject.Inject

@Reusable
class InvitePeopleUtils @Inject constructor(
private val siteStore: SiteStore,
private val contextProvider: ContextProvider,
private val dateTimeUtilsWrapper: DateTimeUtilsWrapper
private val dateTimeUtilsWrapper: DateTimeUtilsWrapper,
private val roleUtilsWrapper: RoleUtilsWrapper,
private val simpleDateFormatWrapper: SimpleDateFormatWrapper
) {
fun getInviteLinkDataFromRoleDisplayName(
inviteLinksData: MutableList<InviteLinksItem>,
Expand All @@ -39,7 +40,7 @@ class InvitePeopleUtils @Inject constructor(
siteModel: SiteModel,
roleName: String
): String {
val roles = getInviteRoles(siteStore, siteModel, contextProvider.getContext())
val roles = roleUtilsWrapper.getInviteRoles(siteStore, siteModel, contextProvider.getContext())

return roles.firstOrNull { roleModel ->
roleModel.name.equals(roleName, ignoreCase = true)
Expand All @@ -50,8 +51,8 @@ class InvitePeopleUtils @Inject constructor(
inviteLinksData: MutableList<InviteLinksItem>,
siteModel: SiteModel
): List<InviteLinksUiItem> {
val formatter = SimpleDateFormat.getDateInstance()
val roles = getInviteRoles(siteStore, siteModel, contextProvider.getContext())
val formatter = simpleDateFormatWrapper.getDateInstance()
val roles = roleUtilsWrapper.getInviteRoles(siteStore, siteModel, contextProvider.getContext())

AppLog.d(T.PEOPLE, "getMappedLinksUiItems > ${siteModel.siteId}")
AppLog.d(
Expand Down Expand Up @@ -93,10 +94,4 @@ class InvitePeopleUtils @Inject constructor(
linksItem.roleDisplayName
}
}

private fun getInviteRoles(
siteStore: SiteStore,
siteModel: SiteModel,
context: Context
): List<RoleModel> = RoleUtils.getInviteRoles(siteStore, siteModel, context)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package org.wordpress.android.models.wrappers

import android.content.Context
import dagger.Reusable
import org.wordpress.android.fluxc.model.RoleModel
import org.wordpress.android.fluxc.model.SiteModel
import org.wordpress.android.fluxc.store.SiteStore
import org.wordpress.android.models.RoleUtils
import javax.inject.Inject

@Reusable
class RoleUtilsWrapper @Inject constructor() {
fun getInviteRoles(
siteStore: SiteStore,
siteModel: SiteModel,
context: Context
): List<RoleModel> = RoleUtils.getInviteRoles(siteStore, siteModel, context)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package org.wordpress.android.models.wrappers

import dagger.Reusable
import java.text.DateFormat
import java.text.SimpleDateFormat
import javax.inject.Inject

@Reusable
class SimpleDateFormatWrapper @Inject constructor() {
fun getDateInstance(): DateFormat = SimpleDateFormat.getDateInstance()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
package org.wordpress.android.ui.people

import com.nhaarman.mockitokotlin2.mock
import com.nhaarman.mockitokotlin2.whenever
import kotlinx.coroutines.InternalCoroutinesApi
import kotlinx.coroutines.flow.flow
import org.assertj.core.api.Assertions.assertThat
import org.junit.Before
import org.junit.Test
import org.mockito.Mock
import org.wordpress.android.BaseUnitTest
import org.wordpress.android.TEST_DISPATCHER
import org.wordpress.android.test
import org.wordpress.android.ui.pages.SnackbarMessageHolder
import org.wordpress.android.ui.people.InviteLinksUseCase.InviteLinksState
import org.wordpress.android.ui.people.InviteLinksUseCase.InviteLinksState.InviteLinksData
import org.wordpress.android.ui.people.InviteLinksUseCase.InviteLinksState.InviteLinksError
import org.wordpress.android.ui.people.InviteLinksUseCase.UseCaseScenarioContext.GENERATING_LINKS
import org.wordpress.android.ui.people.InviteLinksUseCase.UseCaseScenarioContext.INITIALIZING
import org.wordpress.android.ui.people.InviteLinksUseCase.UseCaseScenarioContext.MANAGING_AVAILABLE_LINKS
import org.wordpress.android.ui.utils.UiString.UiStringText

@InternalCoroutinesApi
class InviteLinksHandlerTest : BaseUnitTest() {
@Mock lateinit var inviteLinksUseCase: InviteLinksUseCase

private lateinit var inviteLinksHandler: InviteLinksHandler
private var uiState: InviteLinksState? = null
private var holder: SnackbarMessageHolder? = null
private val blogId = 100L

@Before
fun setUp() {
inviteLinksHandler = InviteLinksHandler(
inviteLinksUseCase,
TEST_DISPATCHER
)
setupObservers()
}

@Test
fun `manageState populates snackbar on Failure`() = test {
val errorMessage = UiStringText("error message")

val state = InviteLinksError(
scenarioContext = INITIALIZING,
error = errorMessage
)

whenever(
inviteLinksUseCase.getInviteLinksStatus(blogId, INITIALIZING)
).thenReturn(flow { emit(state) })

inviteLinksHandler.handleInviteLinksStatusRequest(blogId, INITIALIZING)

requireNotNull(uiState).let {
assertThat(it).isEqualTo(state)
}

requireNotNull(holder).let {
assertThat(it.message).isEqualTo(errorMessage)
}
}

@Test
fun `handleInviteLinksStatusRequest collects expected state`() = test {
val state = InviteLinksData(
scenarioContext = INITIALIZING,
links = listOf(mock(), mock())
)

whenever(
inviteLinksUseCase.getInviteLinksStatus(blogId, INITIALIZING)
).thenReturn(flow { emit(state) })

inviteLinksHandler.handleInviteLinksStatusRequest(blogId, INITIALIZING)

requireNotNull(uiState).let {
assertThat(it).isEqualTo(state)
}

assertThat(holder).isNull()
}

@Test
fun `handleGenerateLinks collects expected state`() = test {
val state = InviteLinksData(
scenarioContext = GENERATING_LINKS,
links = listOf(mock(), mock())
)

whenever(inviteLinksUseCase.generateLinks(blogId)).thenReturn(flow { emit(state) })

inviteLinksHandler.handleGenerateLinks(blogId)

requireNotNull(uiState).let {
assertThat(it).isEqualTo(state)
}

assertThat(holder).isNull()
}

@Test
fun `handleDisableLinks collects expected state`() = test {
val state = InviteLinksData(
scenarioContext = MANAGING_AVAILABLE_LINKS,
links = listOf()
)

whenever(inviteLinksUseCase.disableLinks(blogId)).thenReturn(flow { emit(state) })

inviteLinksHandler.handleDisableLinks(blogId)

requireNotNull(uiState).let {
assertThat(it).isEqualTo(state)
}

assertThat(holder).isNull()
}

private fun setupObservers() {
uiState = null

inviteLinksHandler.inviteLinksState.observeForever {
uiState = it
}

holder = null
inviteLinksHandler.snackbarEvents.observeForever { event ->
event.applyIfNotHandled {
holder = this
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
package org.wordpress.android.ui.people

import android.content.Context
import com.nhaarman.mockitokotlin2.eq
import com.nhaarman.mockitokotlin2.mock
import com.nhaarman.mockitokotlin2.whenever
import org.assertj.core.api.Assertions.assertThat
import org.junit.Before
import org.junit.Test
import org.mockito.ArgumentMatchers.anyLong
import org.mockito.Mock
import org.wordpress.android.BaseUnitTest
import org.wordpress.android.fluxc.model.RoleModel
import org.wordpress.android.fluxc.model.SiteModel
import org.wordpress.android.fluxc.store.SiteStore
import org.wordpress.android.models.InvitePeopleUtils
import org.wordpress.android.models.wrappers.RoleUtilsWrapper
import org.wordpress.android.models.wrappers.SimpleDateFormatWrapper
import org.wordpress.android.ui.people.InviteLinksApiCallsProvider.InviteLinksItem
import org.wordpress.android.util.DateTimeUtilsWrapper
import org.wordpress.android.viewmodel.ContextProvider
import java.text.DateFormat
import java.util.Date

class InvitePeopleUtilsTest : BaseUnitTest() {
@Mock lateinit var siteStore: SiteStore
@Mock lateinit var siteModel: SiteModel
@Mock lateinit var contextProvider: ContextProvider
@Mock lateinit var dateTimeUtilsWrapper: DateTimeUtilsWrapper
@Mock lateinit var roleUtilsWrapper: RoleUtilsWrapper
@Mock lateinit var context: Context
@Mock lateinit var simpleDateFormatWrapper: SimpleDateFormatWrapper
@Mock lateinit var dateFormat: DateFormat

private lateinit var invitePeopleUtils: InvitePeopleUtils

private val roles = listOf(
RoleModel().apply {
name = "administrator"
displayName = "Administrator"
},
RoleModel().apply {
name = "contributor"
displayName = "Contributor"
}
)

private val linkItems = mutableListOf(
InviteLinksItem(
role = "administrator",
expiry = 0,
link = "https://wordpress.com/linkdata"
),
InviteLinksItem(
role = "follower",
expiry = 0,
link = "https://wordpress.com/linkdata"
)
)

@Before
fun setUp() {
val date: Date = mock()
whenever(contextProvider.getContext()).thenReturn(context)
whenever(roleUtilsWrapper.getInviteRoles(siteStore, siteModel, context)).thenReturn(roles)
whenever(dateTimeUtilsWrapper.dateFromTimestamp(anyLong())).thenReturn(date)
whenever(dateFormat.format(eq(date))).thenReturn("")
whenever(simpleDateFormatWrapper.getDateInstance()).thenReturn(dateFormat)

invitePeopleUtils = InvitePeopleUtils(
siteStore,
contextProvider,
dateTimeUtilsWrapper,
roleUtilsWrapper,
simpleDateFormatWrapper
)
}

@Test
fun `link data found by available display name`() {
val item = invitePeopleUtils.getInviteLinkDataFromRoleDisplayName(linkItems, siteModel, "Administrator")

requireNotNull(item).let {
assertThat(it.role).isEqualTo("administrator")
}
}

@Test
fun `link data not found by missing display name`() {
val item = invitePeopleUtils.getInviteLinkDataFromRoleDisplayName(linkItems, siteModel, "Follower")

assertThat(item).isNull()
}

@Test
fun `display name found for available role`() {
val displayName = invitePeopleUtils.getDisplayNameForRole(siteModel, "administrator")

assertThat(displayName).isEqualTo("Administrator")
}

@Test
fun `display name not found for missing role`() {
val displayName = invitePeopleUtils.getDisplayNameForRole(siteModel, "follower")

assertThat(displayName).isEmpty()
}

@Test
fun `ui items list created as expected`() {
val uiItemsList = invitePeopleUtils.getMappedLinksUiItems(linkItems, siteModel)

assertThat(uiItemsList.count()).isEqualTo(1)
assertThat(uiItemsList.get(0).roleName).isEqualTo("administrator")
}

@Test
fun `role display names created as expected`() {
val displayNamesList = invitePeopleUtils.getInviteLinksRoleDisplayNames(linkItems, siteModel)

assertThat(displayNamesList.count()).isEqualTo(1)
assertThat(displayNamesList.get(0)).isEqualTo("Administrator")
}
}
Loading