@ -25,10 +25,12 @@ import org.mozilla.fenix.components.appstate.AppState
import org.mozilla.fenix.components.appstate.shopping.ShoppingState
import org.mozilla.fenix.shopping.ProductAnalysisTestData
import org.mozilla.fenix.shopping.ProductRecommendationTestData
import org.mozilla.fenix.shopping.ShoppingExperienceFeature
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.fake.FakeReviewQualityCheckVendorsService
import org.mozilla.fenix.shopping.fake.FakeShoppingExperienceFeature
import org.mozilla.fenix.shopping.middleware.AnalysisStatusDto
import org.mozilla.fenix.shopping.middleware.NetworkChecker
import org.mozilla.fenix.shopping.middleware.ReviewQualityCheckNetworkMiddleware
@ -99,6 +101,7 @@ class ReviewQualityCheckStoreTest {
val expected = ReviewQualityCheckState . OptedIn (
productRecommendationsPreference = false ,
productRecommendationsExposure = true ,
productVendor = ProductVendor . BEST _BUY ,
)
assertEquals ( expected , tested . state )
@ -143,6 +146,7 @@ class ReviewQualityCheckStoreTest {
val expected = ReviewQualityCheckState . OptedIn (
productRecommendationsPreference = null ,
productRecommendationsExposure = true ,
productVendor = ProductVendor . BEST _BUY ,
)
assertEquals ( expected , tested . state )
@ -172,6 +176,7 @@ class ReviewQualityCheckStoreTest {
val expected = ReviewQualityCheckState . OptedIn (
productRecommendationsPreference = true ,
productRecommendationsExposure = true ,
productVendor = ProductVendor . BEST _BUY ,
)
assertEquals ( expected , tested . state )
@ -188,7 +193,7 @@ class ReviewQualityCheckStoreTest {
) ,
reviewQualityCheckService = FakeReviewQualityCheckService (
productAnalysis = { ProductAnalysisTestData . productAnalysis ( ) } ,
productRecommendation = ProductRecommendationTestData . productRecommendation ( ) ,
productRecommendation = { ProductRecommendationTestData . productRecommendation ( ) } ,
) ,
) ,
)
@ -203,6 +208,7 @@ class ReviewQualityCheckStoreTest {
val expected = ReviewQualityCheckState . OptedIn (
productRecommendationsPreference = false ,
productRecommendationsExposure = true ,
productVendor = ProductVendor . BEST _BUY ,
productReviewState = ProductAnalysisTestData . analysisPresent (
recommendedProductState = ReviewQualityCheckState . RecommendedProductState . Initial ,
@ -246,6 +252,7 @@ class ReviewQualityCheckStoreTest {
val expected = ReviewQualityCheckState . OptedIn (
productRecommendationsPreference = false ,
productRecommendationsExposure = true ,
productVendor = ProductVendor . BEST _BUY ,
isHighlightsExpanded = false ,
isSettingsExpanded = true ,
@ -279,6 +286,7 @@ class ReviewQualityCheckStoreTest {
val expected = ReviewQualityCheckState . OptedIn (
productRecommendationsPreference = false ,
productRecommendationsExposure = true ,
productVendor = ProductVendor . BEST _BUY ,
isSettingsExpanded = true ,
)
@ -322,6 +330,7 @@ class ReviewQualityCheckStoreTest {
val expected = ReviewQualityCheckState . OptedIn (
productRecommendationsPreference = false ,
productRecommendationsExposure = true ,
productVendor = ProductVendor . BEST _BUY ,
isSettingsExpanded = false ,
)
@ -356,6 +365,7 @@ class ReviewQualityCheckStoreTest {
val expected = ReviewQualityCheckState . OptedIn (
productRecommendationsPreference = false ,
productRecommendationsExposure = true ,
productVendor = ProductVendor . BEST _BUY ,
isInfoExpanded = true ,
)
@ -399,6 +409,7 @@ class ReviewQualityCheckStoreTest {
val expected = ReviewQualityCheckState . OptedIn (
productRecommendationsPreference = false ,
productRecommendationsExposure = true ,
productVendor = ProductVendor . BEST _BUY ,
isInfoExpanded = false ,
)
@ -434,6 +445,7 @@ class ReviewQualityCheckStoreTest {
val expected = ReviewQualityCheckState . OptedIn (
productRecommendationsPreference = false ,
productRecommendationsExposure = true ,
productVendor = ProductVendor . BEST _BUY ,
isHighlightsExpanded = true ,
)
@ -478,6 +490,7 @@ class ReviewQualityCheckStoreTest {
val expected = ReviewQualityCheckState . OptedIn (
productRecommendationsPreference = false ,
productRecommendationsExposure = true ,
productVendor = ProductVendor . BEST _BUY ,
isHighlightsExpanded = false ,
)
@ -509,6 +522,7 @@ class ReviewQualityCheckStoreTest {
val expected = ReviewQualityCheckState . OptedIn (
productReviewState = ProductAnalysisTestData . analysisPresent ( ) ,
productRecommendationsPreference = false ,
productRecommendationsExposure = true ,
productVendor = ProductVendor . BEST _BUY ,
)
assertEquals ( expected , tested . state )
@ -534,6 +548,7 @@ class ReviewQualityCheckStoreTest {
val expected = ReviewQualityCheckState . OptedIn (
productReviewState = ReviewQualityCheckState . OptedIn . ProductReviewState . Error . GenericError ,
productRecommendationsPreference = false ,
productRecommendationsExposure = true ,
productVendor = ProductVendor . BEST _BUY ,
)
assertEquals ( expected , tested . state )
@ -559,6 +574,7 @@ class ReviewQualityCheckStoreTest {
val expected = ReviewQualityCheckState . OptedIn (
productReviewState = ReviewQualityCheckState . OptedIn . ProductReviewState . Error . NetworkError ,
productRecommendationsPreference = false ,
productRecommendationsExposure = true ,
productVendor = ProductVendor . BEST _BUY ,
)
assertEquals ( expected , tested . state )
@ -586,6 +602,7 @@ class ReviewQualityCheckStoreTest {
val expected = ReviewQualityCheckState . OptedIn (
productReviewState = ReviewQualityCheckState . OptedIn . ProductReviewState . Error . GenericError ,
productRecommendationsPreference = false ,
productRecommendationsExposure = true ,
productVendor = ProductVendor . BEST _BUY ,
)
assertEquals ( expected , tested . state )
@ -629,6 +646,7 @@ class ReviewQualityCheckStoreTest {
analysisStatus = AnalysisStatus . NEEDS _ANALYSIS ,
) ,
productRecommendationsPreference = false ,
productRecommendationsExposure = true ,
productVendor = ProductVendor . BEST _BUY ,
)
assertEquals ( expected , tested . state )
@ -658,6 +676,7 @@ class ReviewQualityCheckStoreTest {
val expected = ReviewQualityCheckState . OptedIn (
productReviewState = ProductAnalysisTestData . analysisPresent ( ) ,
productRecommendationsPreference = false ,
productRecommendationsExposure = true ,
productVendor = ProductVendor . BEST _BUY ,
)
assertEquals ( expected , tested . state )
@ -691,6 +710,7 @@ class ReviewQualityCheckStoreTest {
val expected = ReviewQualityCheckState . OptedIn (
productReviewState = ReviewQualityCheckState . OptedIn . ProductReviewState . Error . NotEnoughReviews ,
productRecommendationsPreference = false ,
productRecommendationsExposure = true ,
productVendor = ProductVendor . BEST _BUY ,
)
assertEquals ( expected , tested . state )
@ -734,6 +754,7 @@ class ReviewQualityCheckStoreTest {
analysisStatus = AnalysisStatus . REANALYZING ,
) ,
productRecommendationsPreference = false ,
productRecommendationsExposure = true ,
productVendor = ProductVendor . BEST _BUY ,
)
@ -784,6 +805,7 @@ class ReviewQualityCheckStoreTest {
analysisStatus = AnalysisStatus . NEEDS _ANALYSIS ,
) ,
productRecommendationsPreference = false ,
productRecommendationsExposure = true ,
productVendor = ProductVendor . BEST _BUY ,
)
assertEquals ( expected , tested . state )
@ -793,6 +815,7 @@ class ReviewQualityCheckStoreTest {
analysisStatus = AnalysisStatus . REANALYZING ,
) ,
productRecommendationsPreference = false ,
productRecommendationsExposure = true ,
productVendor = ProductVendor . BEST _BUY ,
)
assertFalse ( observedState . contains ( notExpected ) )
@ -841,7 +864,7 @@ class ReviewQualityCheckStoreTest {
) ,
reviewQualityCheckService = FakeReviewQualityCheckService (
productAnalysis = { ProductAnalysisTestData . productAnalysis ( ) } ,
productRecommendation = ProductRecommendationTestData . productRecommendation ( ) ,
productRecommendation = { ProductRecommendationTestData . productRecommendation ( ) } ,
) ,
) ,
)
@ -857,12 +880,138 @@ class ReviewQualityCheckStoreTest {
recommendedProductState = ProductRecommendationTestData . product ( ) ,
) ,
productRecommendationsPreference = true ,
productRecommendationsExposure = true ,
productVendor = ProductVendor . BEST _BUY ,
)
assertEquals ( expected , tested . state )
}
}
@Test
fun `GIVEN product recommendations are disabled WHEN a product analysis is fetched successfully and exposure is set to true THEN product recommendation should also be fetched` ( ) =
runTest {
setAndResetLocale {
var productRecommendationFetched = false
val tested = ReviewQualityCheckStore (
middleware = provideReviewQualityCheckMiddleware (
reviewQualityCheckPreferences = FakeReviewQualityCheckPreferences (
isEnabled = true ,
isProductRecommendationsEnabled = false ,
) ,
shoppingExperienceFeature = FakeShoppingExperienceFeature (
productRecommendationsExposureEnabled = true ,
) ,
reviewQualityCheckService = FakeReviewQualityCheckService (
productAnalysis = { ProductAnalysisTestData . productAnalysis ( ) } ,
productRecommendation = {
productRecommendationFetched = true
ProductRecommendationTestData . productRecommendation ( )
} ,
) ,
) ,
)
tested . waitUntilIdle ( )
dispatcher . scheduler . advanceUntilIdle ( )
tested . waitUntilIdle ( )
tested . dispatch ( ReviewQualityCheckAction . FetchProductAnalysis ) . joinBlocking ( )
tested . waitUntilIdle ( )
dispatcher . scheduler . advanceUntilIdle ( )
val expected = ReviewQualityCheckState . OptedIn (
productReviewState = ProductAnalysisTestData . analysisPresent ( ) ,
productRecommendationsPreference = false ,
productRecommendationsExposure = true ,
productVendor = ProductVendor . BEST _BUY ,
)
assertEquals ( expected , tested . state )
assertTrue ( productRecommendationFetched )
}
}
@Test
fun `GIVEN product recommendations are disabled WHEN a product analysis is fetched successfully and exposure is set to false THEN product recommendation should not be fetched and displayed` ( ) =
runTest {
setAndResetLocale {
var productRecommendationFetched = false
val tested = ReviewQualityCheckStore (
middleware = provideReviewQualityCheckMiddleware (
reviewQualityCheckPreferences = FakeReviewQualityCheckPreferences (
isEnabled = true ,
isProductRecommendationsEnabled = false ,
) ,
shoppingExperienceFeature = FakeShoppingExperienceFeature (
productRecommendationsExposureEnabled = false ,
) ,
reviewQualityCheckService = FakeReviewQualityCheckService (
productAnalysis = { ProductAnalysisTestData . productAnalysis ( ) } ,
productRecommendation = {
productRecommendationFetched = true
ProductRecommendationTestData . productRecommendation ( )
} ,
) ,
) ,
)
tested . waitUntilIdle ( )
dispatcher . scheduler . advanceUntilIdle ( )
tested . waitUntilIdle ( )
tested . dispatch ( ReviewQualityCheckAction . FetchProductAnalysis ) . joinBlocking ( )
tested . waitUntilIdle ( )
dispatcher . scheduler . advanceUntilIdle ( )
val expected = ReviewQualityCheckState . OptedIn (
productReviewState = ProductAnalysisTestData . analysisPresent ( ) ,
productRecommendationsPreference = false ,
productRecommendationsExposure = false ,
productVendor = ProductVendor . BEST _BUY ,
)
assertEquals ( expected , tested . state )
assertFalse ( productRecommendationFetched )
}
}
@Test
fun `GIVEN product recommendations are enabled WHEN a product analysis is fetched successfully and exposure is set to false THEN product recommendation should be fetched and displayed` ( ) =
runTest {
setAndResetLocale {
var productRecommendationFetched = false
val tested = ReviewQualityCheckStore (
middleware = provideReviewQualityCheckMiddleware (
reviewQualityCheckPreferences = FakeReviewQualityCheckPreferences (
isEnabled = true ,
isProductRecommendationsEnabled = true ,
) ,
shoppingExperienceFeature = FakeShoppingExperienceFeature (
productRecommendationsExposureEnabled = false ,
) ,
reviewQualityCheckService = FakeReviewQualityCheckService (
productAnalysis = { ProductAnalysisTestData . productAnalysis ( ) } ,
productRecommendation = {
productRecommendationFetched = true
ProductRecommendationTestData . productRecommendation ( )
} ,
) ,
) ,
)
tested . waitUntilIdle ( )
dispatcher . scheduler . advanceUntilIdle ( )
tested . waitUntilIdle ( )
tested . dispatch ( ReviewQualityCheckAction . FetchProductAnalysis ) . joinBlocking ( )
tested . waitUntilIdle ( )
dispatcher . scheduler . advanceUntilIdle ( )
val expected = ReviewQualityCheckState . OptedIn (
productReviewState = ProductAnalysisTestData . analysisPresent (
recommendedProductState = ProductRecommendationTestData . product ( ) ,
) ,
productRecommendationsPreference = true ,
productRecommendationsExposure = false ,
productVendor = ProductVendor . BEST _BUY ,
)
assertEquals ( expected , tested . state )
assertTrue ( productRecommendationFetched )
}
}
@Test
fun `GIVEN product recommendations are enabled WHEN a product analysis is fetched successfully and product recommendation fails THEN product recommendations state should be initial` ( ) =
runTest {
@ -874,7 +1023,7 @@ class ReviewQualityCheckStoreTest {
) ,
reviewQualityCheckService = FakeReviewQualityCheckService (
productAnalysis = { ProductAnalysisTestData . productAnalysis ( ) } ,
productRecommendation = null ,
productRecommendation = { null } ,
) ,
) ,
)
@ -890,6 +1039,7 @@ class ReviewQualityCheckStoreTest {
recommendedProductState = ReviewQualityCheckState . RecommendedProductState . Initial ,
) ,
productRecommendationsPreference = true ,
productRecommendationsExposure = true ,
productVendor = ProductVendor . BEST _BUY ,
)
assertEquals ( expected , tested . state )
@ -898,7 +1048,8 @@ class ReviewQualityCheckStoreTest {
@Test
fun `GIVEN product recommendations are enabled WHEN product analysis fails THEN product recommendations should not be fetched` ( ) =
runTest {
val captureActionsMiddleware = CaptureActionsMiddleware < ReviewQualityCheckState , ReviewQualityCheckAction > ( )
val captureActionsMiddleware =
CaptureActionsMiddleware < ReviewQualityCheckState , ReviewQualityCheckAction > ( )
val tested = ReviewQualityCheckStore (
middleware = provideReviewQualityCheckMiddleware (
reviewQualityCheckPreferences = FakeReviewQualityCheckPreferences (
@ -907,7 +1058,7 @@ class ReviewQualityCheckStoreTest {
) ,
reviewQualityCheckService = FakeReviewQualityCheckService (
productAnalysis = { null } ,
productRecommendation = ProductRecommendationTestData . productRecommendation ( ) ,
productRecommendation = { ProductRecommendationTestData . productRecommendation ( ) } ,
) ,
) + captureActionsMiddleware ,
)
@ -933,9 +1084,11 @@ class ReviewQualityCheckStoreTest {
) ,
reviewQualityCheckService = FakeReviewQualityCheckService (
productAnalysis = { ProductAnalysisTestData . productAnalysis ( ) } ,
productRecommendation = ProductRecommendationTestData . productRecommendation (
aid = " 342 " ,
) ,
productRecommendation = {
ProductRecommendationTestData . productRecommendation (
aid = " 342 " ,
)
} ,
recordClick = {
productClicked = it
} ,
@ -970,9 +1123,11 @@ class ReviewQualityCheckStoreTest {
) ,
reviewQualityCheckService = FakeReviewQualityCheckService (
productAnalysis = { ProductAnalysisTestData . productAnalysis ( ) } ,
productRecommendation = ProductRecommendationTestData . productRecommendation (
aid = " 342 " ,
) ,
productRecommendation = {
ProductRecommendationTestData . productRecommendation (
aid = " 342 " ,
)
} ,
recordImpression = {
productViewed = it
} ,
@ -997,6 +1152,7 @@ class ReviewQualityCheckStoreTest {
reviewQualityCheckVendorsService : FakeReviewQualityCheckVendorsService = FakeReviewQualityCheckVendorsService ( ) ,
reviewQualityCheckService : ReviewQualityCheckService = FakeReviewQualityCheckService ( ) ,
networkChecker : NetworkChecker = FakeNetworkChecker ( ) ,
shoppingExperienceFeature : ShoppingExperienceFeature = FakeShoppingExperienceFeature ( ) ,
appStore : AppStore = AppStore ( ) ,
) : List < ReviewQualityCheckMiddleware > {
return listOf (
@ -1004,6 +1160,7 @@ class ReviewQualityCheckStoreTest {
reviewQualityCheckPreferences = reviewQualityCheckPreferences ,
reviewQualityCheckVendorsService = reviewQualityCheckVendorsService ,
appStore = appStore ,
shoppingExperienceFeature = shoppingExperienceFeature ,
scope = this . scope ,
) ,
ReviewQualityCheckNetworkMiddleware (