Skip to content
Merged
Changes from 1 commit
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
Prev Previous commit
Next Next commit
Adding tess
  • Loading branch information
adalpari committed Oct 8, 2025
commit 8da8a882b4603511c8174063fe96e6f95623719d
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,20 @@ package org.wordpress.android.ui.taxonomies

import android.content.Context
import android.content.SharedPreferences
import androidx.navigation.NavHostController
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.first
import org.assertj.core.api.Assertions.assertThat
import org.junit.Before
import org.junit.Test
import org.mockito.Mock
import org.mockito.MockitoAnnotations
import org.mockito.kotlin.mock
import org.mockito.kotlin.verify
import org.mockito.kotlin.whenever
import org.wordpress.android.BaseUnitTest
import org.wordpress.android.R
import org.wordpress.android.fluxc.model.SiteModel
import org.wordpress.android.fluxc.network.rest.wpapi.rs.WpApiClientProvider
import org.wordpress.android.fluxc.store.AccountStore
import org.wordpress.android.fluxc.store.TaxonomyStore.DEFAULT_TAXONOMY_CATEGORY
Expand Down Expand Up @@ -43,7 +49,7 @@ class TermsViewModelTest : BaseUnitTest() {

@Before
fun setUp() {
// Minimal setup - add more mocks in individual tests as needed
MockitoAnnotations.openMocks(this)
}

private fun createViewModel(): TermsViewModel {
Expand Down Expand Up @@ -93,4 +99,171 @@ class TermsViewModelTest : BaseUnitTest() {
assertThat(viewModel.uiState.value.loadingState)
.isEqualTo(org.wordpress.android.ui.dataview.LoadingState.OFFLINE)
}

@Test
fun `setNavController stores navigation controller`() {
val viewModel = createViewModel()
val navController = mock<NavHostController>()

viewModel.setNavController(navController)

// Should not throw - just verify it's stored
assertThat(viewModel).isNotNull
}

@Test
fun `navigateToCreateTerm sets empty term detail state`() = test {
val viewModel = createViewModel()
viewModel.initialize(DEFAULT_TAXONOMY_CATEGORY, isHierarchical = true)

viewModel.navigateToCreateTerm()

val state = viewModel.termDetailState.first()
assertThat(state).isNotNull
assertThat(state?.termId).isEqualTo(0L)
assertThat(state?.name).isEmpty()
assertThat(state?.slug).isEmpty()
assertThat(state?.description).isEmpty()
}

@Test
fun `navigateToCreateTerm includes available parents for hierarchical taxonomy`() = test {
val viewModel = createViewModel()
viewModel.initialize(DEFAULT_TAXONOMY_CATEGORY, isHierarchical = true)

viewModel.navigateToCreateTerm()

val state = viewModel.termDetailState.first()
// availableParents should be non-null for hierarchical taxonomies
assertThat(state?.availableParents).isNotNull
}

@Test
fun `navigateToCreateTerm excludes available parents for non-hierarchical taxonomy`() = test {
val viewModel = createViewModel()
viewModel.initialize(DEFAULT_TAXONOMY_TAG, isHierarchical = false)

viewModel.navigateToCreateTerm()

val state = viewModel.termDetailState.first()
assertThat(state?.availableParents).isNull()
}

@Test
fun `navigateBack clears term detail state`() = test {
val viewModel = createViewModel()
val navController = mock<NavHostController>()
viewModel.setNavController(navController)
viewModel.initialize(DEFAULT_TAXONOMY_CATEGORY, isHierarchical = true)
viewModel.navigateToCreateTerm()

viewModel.navigateBack()

val state = viewModel.termDetailState.first()
assertThat(state).isNull()
verify(navController).navigateUp()
}

@Test
fun `updateTermName updates term detail state`() = test {
val viewModel = createViewModel()
viewModel.initialize(DEFAULT_TAXONOMY_CATEGORY, isHierarchical = true)
viewModel.navigateToCreateTerm()

viewModel.updateTermName("New Term Name")

val state = viewModel.termDetailState.first()
assertThat(state?.name).isEqualTo("New Term Name")
}

@Test
fun `updateTermSlug updates term detail state`() = test {
val viewModel = createViewModel()
viewModel.initialize(DEFAULT_TAXONOMY_CATEGORY, isHierarchical = true)
viewModel.navigateToCreateTerm()

viewModel.updateTermSlug("new-slug")

val state = viewModel.termDetailState.first()
assertThat(state?.slug).isEqualTo("new-slug")
}

@Test
fun `updateTermDescription updates term detail state`() = test {
val viewModel = createViewModel()
viewModel.initialize(DEFAULT_TAXONOMY_CATEGORY, isHierarchical = true)
viewModel.navigateToCreateTerm()

viewModel.updateTermDescription("New description")

val state = viewModel.termDetailState.first()
assertThat(state?.description).isEqualTo("New description")
}

@Test
fun `updateTermParent updates term detail state`() = test {
val viewModel = createViewModel()
viewModel.initialize(DEFAULT_TAXONOMY_CATEGORY, isHierarchical = true)
viewModel.navigateToCreateTerm()

viewModel.updateTermParent(123L)

val state = viewModel.termDetailState.first()
assertThat(state?.parentId).isEqualTo(123L)
}

@Test
fun `clearTermDetail sets state to null`() = test {
val viewModel = createViewModel()
viewModel.initialize(DEFAULT_TAXONOMY_CATEGORY, isHierarchical = true)
viewModel.navigateToCreateTerm()

viewModel.clearTermDetail()

val state = viewModel.termDetailState.first()
assertThat(state).isNull()
}

@Test
fun `saveTerm sets error when site is null`() = test {
whenever(selectedSiteRepository.getSelectedSite()).thenReturn(null)
val viewModel = createViewModel()
viewModel.initialize(DEFAULT_TAXONOMY_CATEGORY, isHierarchical = true)
viewModel.navigateToCreateTerm()

viewModel.saveTerm()
advanceUntilIdle()

val event = viewModel.uiEvent.first()
assertThat(event).isInstanceOf(UiEvent.ShowError::class.java)
assertThat((event as UiEvent.ShowError).messageRes).isEqualTo(R.string.error_saving_term)
}

@Test
fun `saveTerm sets error when term detail is null`() = test {
val site = SiteModel()
whenever(selectedSiteRepository.getSelectedSite()).thenReturn(site)
val viewModel = createViewModel()
viewModel.initialize(DEFAULT_TAXONOMY_CATEGORY, isHierarchical = true)

viewModel.saveTerm()
advanceUntilIdle()

val event = viewModel.uiEvent.first()
assertThat(event).isInstanceOf(UiEvent.ShowError::class.java)
}

@Test
fun `deleteTerm sets error when site is null`() = test {
whenever(selectedSiteRepository.getSelectedSite()).thenReturn(null)
val viewModel = createViewModel()
viewModel.initialize(DEFAULT_TAXONOMY_CATEGORY, isHierarchical = true)

viewModel.deleteTerm(123L)
advanceUntilIdle()

val event = viewModel.uiEvent.first()
assertThat(event).isInstanceOf(UiEvent.ShowError::class.java)
assertThat((event as UiEvent.ShowError).messageRes).isEqualTo(R.string.error_deleting_term)
}
}