Bug 1860618 - Shopping "not enough reviews" error card should depend on analysis not_enough_reviews field

fenix/121.0
Cathy Lu 7 months ago committed by mergify[bot]
parent c036ccfbe2
commit c3fbd49fda

@ -15,10 +15,10 @@ import org.mozilla.fenix.shopping.store.ReviewQualityCheckState.OptedIn.ProductR
/**
* Maps [ProductAnalysis] to [ProductReviewState].
*/
fun ProductAnalysis?.toProductReviewState(isInitialAnalysis: Boolean = true): ProductReviewState =
this?.toProductReview(isInitialAnalysis) ?: ProductReviewState.Error.GenericError
fun ProductAnalysis?.toProductReviewState(): ProductReviewState =
this?.toProductReview() ?: ProductReviewState.Error.GenericError
private fun ProductAnalysis.toProductReview(isInitialAnalysis: Boolean): ProductReviewState =
private fun ProductAnalysis.toProductReview(): ProductReviewState =
if (pageNotSupported) {
ProductReviewState.Error.UnsupportedProductTypeError
} else if (productId == null) {
@ -27,17 +27,15 @@ private fun ProductAnalysis.toProductReview(isInitialAnalysis: Boolean): Product
} else {
ProductReviewState.Error.GenericError
}
} else if (notEnoughReviews && !needsAnalysis) {
ProductReviewState.Error.NotEnoughReviews
} else {
val mappedRating = adjustedRating?.toFloat()
val mappedGrade = grade?.asEnumOrDefault<ReviewQualityCheckState.Grade>()
val mappedHighlights = highlights?.toHighlights()?.toSortedMap()
if (mappedGrade == null && mappedRating == null && mappedHighlights == null) {
if (isInitialAnalysis) {
ProductReviewState.NoAnalysisPresent()
} else {
ProductReviewState.Error.NotEnoughReviews
}
ProductReviewState.NoAnalysisPresent()
} else {
ProductReviewState.AnalysisPresent(
productId = productId!!,

@ -118,7 +118,7 @@ class ReviewQualityCheckNetworkMiddleware(
} else {
// poll succeeded, update state
val productAnalysis = reviewQualityCheckService.fetchProductReview()
val productReviewState = productAnalysis.toProductReviewState(false)
val productReviewState = productAnalysis.toProductReviewState()
store.updateProductReviewState(productReviewState)
}

@ -20,6 +20,7 @@ object ProductAnalysisTestData {
adjustedRating: Double? = 4.5,
needsAnalysis: Boolean = false,
pageNotSupported: Boolean = false,
notEnoughReviews: Boolean = false,
lastAnalysisTime: Long = 0L,
deletedProductReported: Boolean = false,
deletedProduct: Boolean = false,
@ -31,6 +32,7 @@ object ProductAnalysisTestData {
adjustedRating = adjustedRating,
needsAnalysis = needsAnalysis,
pageNotSupported = pageNotSupported,
notEnoughReviews = notEnoughReviews,
lastAnalysisTime = lastAnalysisTime,
deletedProductReported = deletedProductReported,
deletedProduct = deletedProduct,

@ -141,38 +141,74 @@ class ProductAnalysisMapperTest {
}
@Test
fun `WHEN grade, rating and highlights are all null and it is initial analysis THEN it is mapped to no analysis present`() {
val actual =
ProductAnalysisTestData.productAnalysis(
grade = null,
adjustedRating = null,
highlights = null,
).toProductReviewState(isInitialAnalysis = true)
val expected = ReviewQualityCheckState.OptedIn.ProductReviewState.NoAnalysisPresent()
fun `WHEN there are not enough reviews and no analysis needed THEN not enough reviews card is visible`() {
val actual = ProductAnalysisTestData.productAnalysis(
notEnoughReviews = true,
needsAnalysis = false,
).toProductReviewState()
val expected = ReviewQualityCheckState.OptedIn.ProductReviewState.Error.NotEnoughReviews
assertEquals(expected, actual)
}
@Test
fun `WHEN grade, rating and highlights are all null and it is not initial analysis THEN not enough reviews card is visible`() {
fun `WHEN there are enough reviews and no analysis needed THEN it is mapped to AnalysisPresent`() {
val actual = ProductAnalysisTestData.productAnalysis(
grade = null,
adjustedRating = null,
highlights = null,
).toProductReviewState(isInitialAnalysis = false)
notEnoughReviews = false,
needsAnalysis = false,
).toProductReviewState()
val expected = ReviewQualityCheckState.OptedIn.ProductReviewState.Error.NotEnoughReviews
val expected = ProductAnalysisTestData.analysisPresent(
productId = "1",
reviewGrade = ReviewQualityCheckState.Grade.A,
analysisStatus = AnalysisStatus.UP_TO_DATE,
adjustedRating = 4.5f,
productUrl = "https://test.com",
)
assertEquals(expected, actual)
}
@Test
fun `WHEN there are not enough reviews and analysis is needed THEN it is mapped to AnalysisPresent with NEEDS_ANALYSIS status`() {
val actual = ProductAnalysisTestData.productAnalysis(
notEnoughReviews = true,
needsAnalysis = true,
).toProductReviewState()
val expected = ProductAnalysisTestData.analysisPresent(
productId = "1",
reviewGrade = ReviewQualityCheckState.Grade.A,
analysisStatus = AnalysisStatus.NEEDS_ANALYSIS,
adjustedRating = 4.5f,
productUrl = "https://test.com",
highlightsInfo = null,
)
assertEquals(expected, actual)
}
@Test
fun `WHEN only rating is available it is not initial analysis THEN it is mapped to AnalysisPresent`() {
fun `WHEN grade, rating and highlights are all null THEN it is mapped to no analysis present`() {
val actual =
ProductAnalysisTestData.productAnalysis(
grade = null,
adjustedRating = null,
highlights = null,
).toProductReviewState()
val expected = ReviewQualityCheckState.OptedIn.ProductReviewState.NoAnalysisPresent()
assertEquals(expected, actual)
}
@Test
fun `WHEN only rating is available THEN it is mapped to AnalysisPresent`() {
val actual = ProductAnalysisTestData.productAnalysis(
grade = null,
adjustedRating = 3.5,
highlights = null,
).toProductReviewState(isInitialAnalysis = false)
).toProductReviewState()
val expected = ProductAnalysisTestData.analysisPresent(
reviewGrade = null,
@ -184,12 +220,12 @@ class ProductAnalysisMapperTest {
}
@Test
fun `WHEN only grade is available it is not initial analysis THEN it is mapped to AnalysisPresent`() {
fun `WHEN only grade is available THEN it is mapped to AnalysisPresent`() {
val actual = ProductAnalysisTestData.productAnalysis(
grade = "B",
adjustedRating = null,
highlights = null,
).toProductReviewState(isInitialAnalysis = false)
).toProductReviewState()
val expected = ProductAnalysisTestData.analysisPresent(
reviewGrade = ReviewQualityCheckState.Grade.B,
@ -201,7 +237,7 @@ class ProductAnalysisMapperTest {
}
@Test
fun `WHEN only highlights are available it is not initial analysis THEN it is mapped to AnalysisPresent`() {
fun `WHEN only highlights are available THEN it is mapped to AnalysisPresent`() {
val actual = ProductAnalysisTestData.productAnalysis(
grade = null,
adjustedRating = null,
@ -212,7 +248,7 @@ class ProductAnalysisMapperTest {
appearance = listOf("appearance"),
competitiveness = listOf("competitiveness"),
),
).toProductReviewState(isInitialAnalysis = false)
).toProductReviewState()
val expected = ProductAnalysisTestData.analysisPresent(
reviewGrade = null,
@ -230,7 +266,7 @@ class ProductAnalysisMapperTest {
}
@Test
fun `WHEN highlights and grade are available it is not initial analysis THEN it is mapped to AnalysisPresent`() {
fun `WHEN highlights and grade are available THEN it is mapped to AnalysisPresent`() {
val actual = ProductAnalysisTestData.productAnalysis(
grade = "B",
adjustedRating = null,
@ -241,7 +277,7 @@ class ProductAnalysisMapperTest {
appearance = listOf("appearance"),
competitiveness = listOf("competitiveness"),
),
).toProductReviewState(isInitialAnalysis = false)
).toProductReviewState()
val expected = ProductAnalysisTestData.analysisPresent(
reviewGrade = ReviewQualityCheckState.Grade.B,
@ -259,7 +295,7 @@ class ProductAnalysisMapperTest {
}
@Test
fun `WHEN highlights and rating are available it is not initial analysis THEN it is mapped to AnalysisPresent`() {
fun `WHEN highlights and rating are available THEN it is mapped to AnalysisPresent`() {
val actual = ProductAnalysisTestData.productAnalysis(
grade = null,
adjustedRating = 3.4,
@ -270,7 +306,7 @@ class ProductAnalysisMapperTest {
appearance = listOf("appearance"),
competitiveness = listOf("competitiveness"),
),
).toProductReviewState(isInitialAnalysis = false)
).toProductReviewState()
val expected = ProductAnalysisTestData.analysisPresent(
reviewGrade = null,

@ -657,7 +657,7 @@ class ReviewQualityCheckStoreTest {
}
@Test
fun `GIVEN reanalysis and status api call succeeds WHEN analysis fetched has grade, rating and highlights as null THEN not enough reviews card is displayed`() =
fun `GIVEN reanalysis and status api call succeeds WHEN notEnoughReviews is true THEN not enough reviews card is displayed`() =
runTest {
val tested = ReviewQualityCheckStore(
middleware = provideReviewQualityCheckMiddleware(
@ -665,9 +665,7 @@ class ReviewQualityCheckStoreTest {
reviewQualityCheckService = FakeReviewQualityCheckService(
productAnalysis = {
ProductAnalysisTestData.productAnalysis(
grade = null,
adjustedRating = null,
highlights = null,
notEnoughReviews = true,
)
},
reanalysis = AnalysisStatusDto.PENDING,

Loading…
Cancel
Save