|
|
|
@ -8,17 +8,20 @@ import junit.framework.TestCase.assertEquals
|
|
|
|
|
import kotlinx.coroutines.test.runTest
|
|
|
|
|
import mozilla.components.support.test.ext.joinBlocking
|
|
|
|
|
import mozilla.components.support.test.libstate.ext.waitUntilIdle
|
|
|
|
|
import mozilla.components.support.test.mock
|
|
|
|
|
import mozilla.components.support.test.rule.MainCoroutineRule
|
|
|
|
|
import mozilla.components.support.test.whenever
|
|
|
|
|
import org.junit.Rule
|
|
|
|
|
import org.junit.Test
|
|
|
|
|
import org.mozilla.fenix.shopping.ProductAnalysisTestData
|
|
|
|
|
import org.mozilla.fenix.shopping.fake.FakeNetworkChecker
|
|
|
|
|
import org.mozilla.fenix.shopping.fake.FakeReviewQualityCheckPreferences
|
|
|
|
|
import org.mozilla.fenix.shopping.fake.FakeReviewQualityCheckService
|
|
|
|
|
import org.mozilla.fenix.shopping.middleware.AnalysisStatusDto
|
|
|
|
|
import org.mozilla.fenix.shopping.middleware.NetworkChecker
|
|
|
|
|
import org.mozilla.fenix.shopping.middleware.ReviewQualityCheckNetworkMiddleware
|
|
|
|
|
import org.mozilla.fenix.shopping.middleware.ReviewQualityCheckPreferences
|
|
|
|
|
import org.mozilla.fenix.shopping.middleware.ReviewQualityCheckPreferencesMiddleware
|
|
|
|
|
import org.mozilla.fenix.shopping.middleware.ReviewQualityCheckService
|
|
|
|
|
import org.mozilla.fenix.shopping.store.ReviewQualityCheckState.OptedIn.ProductReviewState.AnalysisPresent.AnalysisStatus
|
|
|
|
|
|
|
|
|
|
class ReviewQualityCheckStoreTest {
|
|
|
|
|
|
|
|
|
@ -158,16 +161,14 @@ class ReviewQualityCheckStoreTest {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
fun `GIVEN the user has opted in the feature WHEN the a product analysis is fetched successfully THEN state should reflect that`() =
|
|
|
|
|
fun `GIVEN the user has opted in the feature WHEN a product analysis is fetched successfully THEN state should reflect that`() =
|
|
|
|
|
runTest {
|
|
|
|
|
val reviewQualityCheckService = mock<ReviewQualityCheckService>()
|
|
|
|
|
whenever(reviewQualityCheckService.fetchProductReview())
|
|
|
|
|
.thenReturn(ProductAnalysisTestData.productAnalysis())
|
|
|
|
|
|
|
|
|
|
val tested = ReviewQualityCheckStore(
|
|
|
|
|
middleware = provideReviewQualityCheckMiddleware(
|
|
|
|
|
reviewQualityCheckPreferences = FakeReviewQualityCheckPreferences(isEnabled = true),
|
|
|
|
|
reviewQualityCheckService = reviewQualityCheckService,
|
|
|
|
|
reviewQualityCheckService = FakeReviewQualityCheckService(
|
|
|
|
|
productAnalysis = { ProductAnalysisTestData.productAnalysis() },
|
|
|
|
|
),
|
|
|
|
|
networkChecker = FakeNetworkChecker(isConnected = true),
|
|
|
|
|
),
|
|
|
|
|
)
|
|
|
|
@ -186,15 +187,12 @@ class ReviewQualityCheckStoreTest {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
fun `GIVEN the user has opted in the feature WHEN the a product analysis returns an error THEN state should reflect that`() =
|
|
|
|
|
fun `GIVEN the user has opted in the feature WHEN a product analysis returns an error THEN state should reflect that`() =
|
|
|
|
|
runTest {
|
|
|
|
|
val reviewQualityCheckService = mock<ReviewQualityCheckService>()
|
|
|
|
|
whenever(reviewQualityCheckService.fetchProductReview()).thenReturn(null)
|
|
|
|
|
|
|
|
|
|
val tested = ReviewQualityCheckStore(
|
|
|
|
|
middleware = provideReviewQualityCheckMiddleware(
|
|
|
|
|
reviewQualityCheckPreferences = FakeReviewQualityCheckPreferences(isEnabled = true),
|
|
|
|
|
reviewQualityCheckService = reviewQualityCheckService,
|
|
|
|
|
reviewQualityCheckService = FakeReviewQualityCheckService(),
|
|
|
|
|
networkChecker = FakeNetworkChecker(isConnected = true),
|
|
|
|
|
),
|
|
|
|
|
)
|
|
|
|
@ -218,7 +216,7 @@ class ReviewQualityCheckStoreTest {
|
|
|
|
|
val tested = ReviewQualityCheckStore(
|
|
|
|
|
middleware = provideReviewQualityCheckMiddleware(
|
|
|
|
|
reviewQualityCheckPreferences = FakeReviewQualityCheckPreferences(isEnabled = true),
|
|
|
|
|
reviewQualityCheckService = mock(),
|
|
|
|
|
reviewQualityCheckService = FakeReviewQualityCheckService(),
|
|
|
|
|
networkChecker = FakeNetworkChecker(isConnected = false),
|
|
|
|
|
),
|
|
|
|
|
)
|
|
|
|
@ -236,6 +234,102 @@ class ReviewQualityCheckStoreTest {
|
|
|
|
|
assertEquals(expected, tested.state)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
fun `WHEN reanalysis api call fails THEN state should reflect that`() =
|
|
|
|
|
runTest {
|
|
|
|
|
val tested = ReviewQualityCheckStore(
|
|
|
|
|
middleware = provideReviewQualityCheckMiddleware(
|
|
|
|
|
reviewQualityCheckPreferences = FakeReviewQualityCheckPreferences(isEnabled = true),
|
|
|
|
|
reviewQualityCheckService = FakeReviewQualityCheckService(
|
|
|
|
|
reanalysis = null,
|
|
|
|
|
),
|
|
|
|
|
networkChecker = FakeNetworkChecker(isConnected = true),
|
|
|
|
|
),
|
|
|
|
|
)
|
|
|
|
|
tested.waitUntilIdle()
|
|
|
|
|
dispatcher.scheduler.advanceUntilIdle()
|
|
|
|
|
tested.waitUntilIdle()
|
|
|
|
|
tested.dispatch(ReviewQualityCheckAction.ReanalyzeProduct).joinBlocking()
|
|
|
|
|
tested.waitUntilIdle()
|
|
|
|
|
dispatcher.scheduler.advanceUntilIdle()
|
|
|
|
|
|
|
|
|
|
val expected = ReviewQualityCheckState.OptedIn(
|
|
|
|
|
productReviewState = ReviewQualityCheckState.OptedIn.ProductReviewState.Error.GenericError,
|
|
|
|
|
productRecommendationsPreference = false,
|
|
|
|
|
)
|
|
|
|
|
assertEquals(expected, tested.state)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
fun `GIVEN a product analysis WHEN reanalysis call succeeds and status fails THEN state should reflect that`() =
|
|
|
|
|
runTest {
|
|
|
|
|
val productAnalysisList = listOf(
|
|
|
|
|
ProductAnalysisTestData.productAnalysis(
|
|
|
|
|
needsAnalysis = true,
|
|
|
|
|
grade = "B",
|
|
|
|
|
),
|
|
|
|
|
ProductAnalysisTestData.productAnalysis(),
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
val tested = ReviewQualityCheckStore(
|
|
|
|
|
middleware = provideReviewQualityCheckMiddleware(
|
|
|
|
|
reviewQualityCheckPreferences = FakeReviewQualityCheckPreferences(isEnabled = true),
|
|
|
|
|
reviewQualityCheckService = FakeReviewQualityCheckService(
|
|
|
|
|
reanalysis = AnalysisStatusDto.PENDING,
|
|
|
|
|
status = null,
|
|
|
|
|
productAnalysis = { productAnalysisList[it] },
|
|
|
|
|
),
|
|
|
|
|
networkChecker = FakeNetworkChecker(isConnected = true),
|
|
|
|
|
),
|
|
|
|
|
)
|
|
|
|
|
tested.waitUntilIdle()
|
|
|
|
|
dispatcher.scheduler.advanceUntilIdle()
|
|
|
|
|
tested.waitUntilIdle()
|
|
|
|
|
tested.dispatch(ReviewQualityCheckAction.FetchProductAnalysis).joinBlocking()
|
|
|
|
|
tested.waitUntilIdle()
|
|
|
|
|
dispatcher.scheduler.advanceUntilIdle()
|
|
|
|
|
tested.dispatch(ReviewQualityCheckAction.ReanalyzeProduct).joinBlocking()
|
|
|
|
|
tested.waitUntilIdle()
|
|
|
|
|
dispatcher.scheduler.advanceUntilIdle()
|
|
|
|
|
|
|
|
|
|
val expected = ReviewQualityCheckState.OptedIn(
|
|
|
|
|
productReviewState = ProductAnalysisTestData.analysisPresent(
|
|
|
|
|
reviewGrade = ReviewQualityCheckState.Grade.B,
|
|
|
|
|
analysisStatus = AnalysisStatus.NEEDS_ANALYSIS,
|
|
|
|
|
),
|
|
|
|
|
productRecommendationsPreference = false,
|
|
|
|
|
)
|
|
|
|
|
assertEquals(expected, tested.state)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
fun `WHEN reanalysis and status api call succeeds THEN analysis should be fetched and displayed`() =
|
|
|
|
|
runTest {
|
|
|
|
|
val tested = ReviewQualityCheckStore(
|
|
|
|
|
middleware = provideReviewQualityCheckMiddleware(
|
|
|
|
|
reviewQualityCheckPreferences = FakeReviewQualityCheckPreferences(isEnabled = true),
|
|
|
|
|
reviewQualityCheckService = FakeReviewQualityCheckService(
|
|
|
|
|
productAnalysis = { ProductAnalysisTestData.productAnalysis() },
|
|
|
|
|
reanalysis = AnalysisStatusDto.PENDING,
|
|
|
|
|
status = AnalysisStatusDto.COMPLETED,
|
|
|
|
|
),
|
|
|
|
|
networkChecker = FakeNetworkChecker(isConnected = true),
|
|
|
|
|
),
|
|
|
|
|
)
|
|
|
|
|
tested.waitUntilIdle()
|
|
|
|
|
dispatcher.scheduler.advanceUntilIdle()
|
|
|
|
|
tested.waitUntilIdle()
|
|
|
|
|
tested.dispatch(ReviewQualityCheckAction.ReanalyzeProduct).joinBlocking()
|
|
|
|
|
tested.waitUntilIdle()
|
|
|
|
|
dispatcher.scheduler.advanceUntilIdle()
|
|
|
|
|
|
|
|
|
|
val expected = ReviewQualityCheckState.OptedIn(
|
|
|
|
|
productReviewState = ProductAnalysisTestData.analysisPresent(),
|
|
|
|
|
productRecommendationsPreference = false,
|
|
|
|
|
)
|
|
|
|
|
assertEquals(expected, tested.state)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private fun provideReviewQualityCheckMiddleware(
|
|
|
|
|
reviewQualityCheckPreferences: ReviewQualityCheckPreferences,
|
|
|
|
|
reviewQualityCheckService: ReviewQualityCheckService? = null,
|
|
|
|
@ -263,29 +357,3 @@ class ReviewQualityCheckStoreTest {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private class FakeReviewQualityCheckPreferences(
|
|
|
|
|
private val isEnabled: Boolean = false,
|
|
|
|
|
private val isProductRecommendationsEnabled: Boolean? = false,
|
|
|
|
|
private val updateCFRCallback: () -> Unit = { },
|
|
|
|
|
) : ReviewQualityCheckPreferences {
|
|
|
|
|
override suspend fun enabled(): Boolean = isEnabled
|
|
|
|
|
|
|
|
|
|
override suspend fun productRecommendationsEnabled(): Boolean? = isProductRecommendationsEnabled
|
|
|
|
|
|
|
|
|
|
override suspend fun setEnabled(isEnabled: Boolean) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
override suspend fun setProductRecommendationsEnabled(isEnabled: Boolean) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
override suspend fun updateCFRCondition(time: Long) {
|
|
|
|
|
updateCFRCallback()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private class FakeNetworkChecker(
|
|
|
|
|
private val isConnected: Boolean,
|
|
|
|
|
) : NetworkChecker {
|
|
|
|
|
override fun isConnected(): Boolean = isConnected
|
|
|
|
|
}
|
|
|
|
|