commit bd23533d0a55a0bac72d9d5cda68b79f9b4c769b
parent 22969334f8d4c67a0a85d7fc8867671b541c9c0a
Author: Devota Aabel <daabel@mozilla.com>
Date: Tue, 23 Dec 2025 15:38:22 +0000
Bug 2004076- Update number of stories to show to 30. r=gl,android-reviewers
Differential Revision: https://phabricator.services.mozilla.com/D275691
Diffstat:
3 files changed, 119 insertions(+), 105 deletions(-)
diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/ext/AppState.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/ext/AppState.kt
@@ -23,14 +23,19 @@ import org.mozilla.fenix.utils.Settings
* This is an optimistic value taking into account that fewer than this stories may actually be available.
*/
@VisibleForTesting
-internal const val CONTENT_RECOMMENDATIONS_TO_SHOW_COUNT = 9
+internal const val TOTAL_CONTENT_RECOMMENDATIONS_TO_SHOW_COUNT = 30
+
+/**
+ * The indexes to add sponsored stories.
+ */
+internal val SPONSORED_STORIES_INDEXES = listOf(1, 8)
/**
* Total count of all sponsored Pocket stories to show.
* This is an optimistic value taking into account that fewer than this stories may actually be available.
*/
@VisibleForTesting
-internal const val POCKET_SPONSORED_STORIES_TO_SHOW_COUNT = 2
+internal val SPONSORED_STORIES_TO_SHOW_COUNT = SPONSORED_STORIES_INDEXES.size
/**
* Get the list of stories to be displayed based on the user selected categories.
@@ -44,19 +49,18 @@ fun AppState.getFilteredStories(useSponsoredStoriesState: Boolean = true): List<
val sponsoredStories = if (useSponsoredStoriesState) {
getFilteredSponsoredStories(
stories = recommendationState.pocketSponsoredStories,
- limit = POCKET_SPONSORED_STORIES_TO_SHOW_COUNT,
+ limit = SPONSORED_STORIES_TO_SHOW_COUNT,
)
} else {
getFilteredSponsoredContents(
sponsoredContents = recommendationState.sponsoredContents,
- limit = POCKET_SPONSORED_STORIES_TO_SHOW_COUNT,
+ limit = SPONSORED_STORIES_TO_SHOW_COUNT,
)
}
return combineRecommendationsAndSponsoredContents(
recommendations = recommendedStories,
sponsoredStories = sponsoredStories,
- totalLimit = CONTENT_RECOMMENDATIONS_TO_SHOW_COUNT,
)
}
@@ -71,7 +75,7 @@ private fun AppState.getFilteredRecommendedStories(): List<PocketRecommendedStor
.find { it.name == POCKET_STORIES_DEFAULT_CATEGORY_NAME }
?.stories
?.sortedBy { it.timesShown }
- ?.take(CONTENT_RECOMMENDATIONS_TO_SHOW_COUNT) ?: emptyList()
+ ?.take(TOTAL_CONTENT_RECOMMENDATIONS_TO_SHOW_COUNT) ?: emptyList()
}
false -> {
val oldestSortedCategories = recommendationState.pocketStoriesCategoriesSelections
@@ -84,7 +88,7 @@ private fun AppState.getFilteredRecommendedStories(): List<PocketRecommendedStor
val filteredStoriesCount = getFilteredStoriesCount(
oldestSortedCategories,
- CONTENT_RECOMMENDATIONS_TO_SHOW_COUNT,
+ TOTAL_CONTENT_RECOMMENDATIONS_TO_SHOW_COUNT,
)
oldestSortedCategories
@@ -92,7 +96,7 @@ private fun AppState.getFilteredRecommendedStories(): List<PocketRecommendedStor
category.stories
.sortedBy { it.timesShown }
.take(filteredStoriesCount[category.name]!!)
- }.take(CONTENT_RECOMMENDATIONS_TO_SHOW_COUNT)
+ }.take(TOTAL_CONTENT_RECOMMENDATIONS_TO_SHOW_COUNT)
}
}
}
@@ -109,35 +113,32 @@ private fun AppState.getFilteredRecommendedStories(): List<PocketRecommendedStor
fun AppState.getStories(useSponsoredStoriesState: Boolean = true): List<PocketStory> {
val recommendations = recommendationState.contentRecommendations
.sortedBy { it.impressions }
- .take(CONTENT_RECOMMENDATIONS_TO_SHOW_COUNT)
+ .take(TOTAL_CONTENT_RECOMMENDATIONS_TO_SHOW_COUNT)
val sponsoredStories = if (useSponsoredStoriesState) {
getFilteredSponsoredStories(
stories = recommendationState.pocketSponsoredStories,
- limit = POCKET_SPONSORED_STORIES_TO_SHOW_COUNT,
+ limit = SPONSORED_STORIES_TO_SHOW_COUNT,
)
} else {
getFilteredSponsoredContents(
sponsoredContents = recommendationState.sponsoredContents,
- limit = POCKET_SPONSORED_STORIES_TO_SHOW_COUNT,
+ limit = SPONSORED_STORIES_TO_SHOW_COUNT,
)
}
return combineRecommendationsAndSponsoredContents(
recommendations = recommendations,
sponsoredStories = sponsoredStories,
- totalLimit = CONTENT_RECOMMENDATIONS_TO_SHOW_COUNT,
)
}
/**
* Combine the available content recommendations and sponsored content to display a number
- * of [PocketStory]s specified by [totalLimit] with a number of sponsored content specified by
- * [sponsoredContentsLimit].
+ * of [PocketStory]s specified by [TOTAL_CONTENT_RECOMMENDATIONS_TO_SHOW_COUNT] with a number of
+ * sponsored content specified by [SPONSORED_STORIES_TO_SHOW_COUNT].
*
* @param recommendations A list of content recommendations to display.
* @param sponsoredStories A list of sponsored content to display.
- * @param totalLimit The total number of recommended and sponsored stories to display.
- * @param sponsoredContentsLimit The number of sponsored content to display.
* @return A list of [PocketStory] to display combining both [recommendations] and
* [sponsoredStories].
*/
@@ -145,19 +146,25 @@ fun AppState.getStories(useSponsoredStoriesState: Boolean = true): List<PocketSt
internal fun combineRecommendationsAndSponsoredContents(
recommendations: List<PocketStory>,
sponsoredStories: List<PocketStory>,
- totalLimit: Int = CONTENT_RECOMMENDATIONS_TO_SHOW_COUNT,
- sponsoredContentsLimit: Int = POCKET_SPONSORED_STORIES_TO_SHOW_COUNT,
): List<PocketStory> {
- val recommendedStoriesToShow =
- totalLimit - sponsoredStories.size.coerceAtMost(
- sponsoredContentsLimit,
+ val sponsoredStoriesToShow = sponsoredStories
+ .take(SPONSORED_STORIES_TO_SHOW_COUNT).toMutableList()
+ val allStoriesToShow = recommendations
+ .take(TOTAL_CONTENT_RECOMMENDATIONS_TO_SHOW_COUNT - sponsoredStoriesToShow.size)
+ .toMutableList()
+
+ for (index in SPONSORED_STORIES_INDEXES.sorted()) {
+ if (sponsoredStoriesToShow.isEmpty()) {
+ break
+ }
+
+ allStoriesToShow.add(
+ index.coerceAtMost(allStoriesToShow.size),
+ sponsoredStoriesToShow.removeAt(0),
)
+ }
- // Sponsored stories should be shown at position 2 and 9 if possible.
- return recommendations.take(1) +
- sponsoredStories.take(1) +
- recommendations.take(recommendedStoriesToShow).drop(1) +
- sponsoredStories.take(2).drop(1)
+ return allStoriesToShow
}
/**
diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/fake/FakeHomepagePreview.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/fake/FakeHomepagePreview.kt
@@ -29,7 +29,7 @@ import org.mozilla.fenix.browser.browsingmode.BrowsingMode
import org.mozilla.fenix.components.appstate.AppState
import org.mozilla.fenix.components.appstate.setup.checklist.ChecklistItem
import org.mozilla.fenix.compose.MessageCardState
-import org.mozilla.fenix.ext.CONTENT_RECOMMENDATIONS_TO_SHOW_COUNT
+import org.mozilla.fenix.ext.TOTAL_CONTENT_RECOMMENDATIONS_TO_SHOW_COUNT
import org.mozilla.fenix.home.bookmarks.Bookmark
import org.mozilla.fenix.home.bookmarks.interactor.BookmarksInteractor
import org.mozilla.fenix.home.collections.CollectionColors
@@ -408,7 +408,7 @@ internal object FakeHomepagePreview {
}
@Composable
- internal fun pocketState(limit: Int = CONTENT_RECOMMENDATIONS_TO_SHOW_COUNT) = PocketState(
+ internal fun pocketState(limit: Int = TOTAL_CONTENT_RECOMMENDATIONS_TO_SHOW_COUNT) = PocketState(
stories = stories(limit = limit),
categories = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor"
.split(" ")
diff --git a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/ext/AppStateTest.kt b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/ext/AppStateTest.kt
@@ -6,6 +6,7 @@ package org.mozilla.fenix.ext
import io.mockk.every
import io.mockk.mockk
+import mozilla.components.service.pocket.PocketStory
import mozilla.components.service.pocket.PocketStory.PocketRecommendedStory
import mozilla.components.service.pocket.PocketStory.PocketSponsoredStory
import mozilla.components.service.pocket.PocketStory.PocketSponsoredStoryCaps
@@ -66,7 +67,7 @@ class AppStateTest {
fun `GIVEN no category is selected and no sponsored stories are available WHEN getFilteredStories is called THEN no more than the default stories number are returned from the default category`() {
val defaultStoriesCategoryWithManyStories = PocketRecommendedStoriesCategory(
POCKET_STORIES_DEFAULT_CATEGORY_NAME,
- getFakePocketStories(CONTENT_RECOMMENDATIONS_TO_SHOW_COUNT + 2),
+ getFakePocketStories(TOTAL_CONTENT_RECOMMENDATIONS_TO_SHOW_COUNT + 2),
)
val state = AppState(
recommendationState = ContentRecommendationsState(
@@ -80,14 +81,14 @@ class AppStateTest {
val result = state.getFilteredStories()
- assertEquals(CONTENT_RECOMMENDATIONS_TO_SHOW_COUNT, result.size)
+ assertEquals(TOTAL_CONTENT_RECOMMENDATIONS_TO_SHOW_COUNT, result.size)
}
@Test
fun `GIVEN no category is selected and 1 sponsored story available WHEN getFilteredStories is called THEN get stories from the default category combined with the sponsored one`() {
val defaultStoriesCategoryWithManyStories = PocketRecommendedStoriesCategory(
POCKET_STORIES_DEFAULT_CATEGORY_NAME,
- getFakePocketStories(CONTENT_RECOMMENDATIONS_TO_SHOW_COUNT),
+ getFakePocketStories(TOTAL_CONTENT_RECOMMENDATIONS_TO_SHOW_COUNT),
)
val sponsoredStories = getFakeSponsoredStories(1)
val state = AppState(
@@ -103,7 +104,7 @@ class AppStateTest {
val result = state.getFilteredStories().toMutableList()
- assertEquals(CONTENT_RECOMMENDATIONS_TO_SHOW_COUNT, result.size)
+ assertEquals(TOTAL_CONTENT_RECOMMENDATIONS_TO_SHOW_COUNT, result.size)
assertEquals(sponsoredStories[0], result[1]) // second story should be a sponsored one
result.removeAt(1) // remove the sponsored story to hopefully only remain with general recommendations
assertNull(
@@ -117,7 +118,7 @@ class AppStateTest {
fun `GIVEN no category is selected and 2 sponsored stories available WHEN getFilteredStories is called THEN get stories from the default category combined with the sponsored stories`() {
val defaultStoriesCategoryWithManyStories = PocketRecommendedStoriesCategory(
POCKET_STORIES_DEFAULT_CATEGORY_NAME,
- getFakePocketStories(CONTENT_RECOMMENDATIONS_TO_SHOW_COUNT),
+ getFakePocketStories(TOTAL_CONTENT_RECOMMENDATIONS_TO_SHOW_COUNT),
)
val sponsoredStories = getFakeSponsoredStories(4)
val state = AppState(
@@ -133,10 +134,10 @@ class AppStateTest {
val result = state.getFilteredStories().toMutableList()
- assertEquals(CONTENT_RECOMMENDATIONS_TO_SHOW_COUNT, result.size)
+ assertEquals(TOTAL_CONTENT_RECOMMENDATIONS_TO_SHOW_COUNT, result.size)
// second story should be a sponsored one
assertEquals(sponsoredStories[1], result[1])
- assertEquals(sponsoredStories[3], result[CONTENT_RECOMMENDATIONS_TO_SHOW_COUNT - 1])
+ assertEquals(sponsoredStories[3], result[8])
// remove the sponsored stories to hopefully only remain with general recommendations
result.removeAt(7)
result.removeAt(1)
@@ -151,7 +152,7 @@ class AppStateTest {
fun `GIVEN no category is selected and sponsored contents are available WHEN getFilteredStories is called THEN return stories from the default category combined with the sponsored contents`() {
val defaultStoriesCategoryWithManyStories = PocketRecommendedStoriesCategory(
POCKET_STORIES_DEFAULT_CATEGORY_NAME,
- getFakePocketStories(CONTENT_RECOMMENDATIONS_TO_SHOW_COUNT),
+ getFakePocketStories(TOTAL_CONTENT_RECOMMENDATIONS_TO_SHOW_COUNT),
)
val sponsoredContents = getFakeSponsoredContents(4)
val state = AppState(
@@ -167,9 +168,9 @@ class AppStateTest {
var result = state.getFilteredStories(useSponsoredStoriesState = false).toMutableList()
- assertEquals(CONTENT_RECOMMENDATIONS_TO_SHOW_COUNT, result.size)
+ assertEquals(TOTAL_CONTENT_RECOMMENDATIONS_TO_SHOW_COUNT, result.size)
assertEquals(sponsoredContents[1], result[1])
- assertEquals(sponsoredContents[3], result[CONTENT_RECOMMENDATIONS_TO_SHOW_COUNT - 1])
+ assertEquals(sponsoredContents[3], result[8])
result = result.filterIsInstance<PocketRecommendedStory>().toMutableList()
@@ -291,44 +292,34 @@ class AppStateTest {
}
@Test
- fun `GIVEN multiple stories of both types WHEN combining them THEN show sponsored stories at position 2 and 8`() {
- val recommendedStories = getFakePocketStories(CONTENT_RECOMMENDATIONS_TO_SHOW_COUNT, "other")
+ fun `GIVEN multiple stories of both types WHEN combining them THEN show sponsored stories at position 2 and 9`() {
+ val recommendedStories = getFakePocketStories(TOTAL_CONTENT_RECOMMENDATIONS_TO_SHOW_COUNT, "other")
val sponsoredStories = getFakeSponsoredStories(4)
val result = combineRecommendationsAndSponsoredContents(recommendedStories, sponsoredStories)
- assertEquals(CONTENT_RECOMMENDATIONS_TO_SHOW_COUNT, result.size)
- assertEquals(recommendedStories[0], result[0])
- assertEquals(sponsoredStories[0], result[1])
- assertEquals(recommendedStories[1], result[2])
- assertEquals(recommendedStories[2], result[3])
- assertEquals(recommendedStories[3], result[4])
- assertEquals(recommendedStories[4], result[5])
- assertEquals(recommendedStories[5], result[6])
- assertEquals(sponsoredStories[1], result[CONTENT_RECOMMENDATIONS_TO_SHOW_COUNT - 1])
+ assertCombinedStories(
+ recommendedStories = recommendedStories,
+ sponsoredStories = sponsoredStories,
+ result = result,
+ )
}
@Test
fun `GIVEN content recommendations and sponsored stories WHEN combining them THEN show sponsored stories at position 2 and 9`() {
- val recommendations = getFakeContentRecommendations(CONTENT_RECOMMENDATIONS_TO_SHOW_COUNT)
+ val recommendedStories = getFakeContentRecommendations(TOTAL_CONTENT_RECOMMENDATIONS_TO_SHOW_COUNT)
val sponsoredStories = getFakeSponsoredStories(4)
val result = combineRecommendationsAndSponsoredContents(
- recommendations,
+ recommendedStories,
sponsoredStories,
- totalLimit = CONTENT_RECOMMENDATIONS_TO_SHOW_COUNT,
)
- assertEquals(CONTENT_RECOMMENDATIONS_TO_SHOW_COUNT, result.size)
- assertEquals(recommendations[0], result[0])
- assertEquals(sponsoredStories[0], result[1])
- assertEquals(recommendations[1], result[2])
- assertEquals(recommendations[2], result[3])
- assertEquals(recommendations[3], result[4])
- assertEquals(recommendations[4], result[5])
- assertEquals(recommendations[5], result[6])
- assertEquals(recommendations[6], result[7])
- assertEquals(sponsoredStories[1], result[CONTENT_RECOMMENDATIONS_TO_SHOW_COUNT - 1])
+ assertCombinedStories(
+ recommendedStories = recommendedStories,
+ sponsoredStories = sponsoredStories,
+ result = result,
+ )
}
@Test
@@ -395,7 +386,7 @@ class AppStateTest {
fun `GIVEN two categories selected and 2 sponsored stories available WHEN getFilteredStories is called THEN no more than the default stories number are returned`() {
val sponsoredStories = getFakeSponsoredStories(2)
val yetAnotherStoriesCategory =
- PocketRecommendedStoriesCategory("yetAnother", getFakePocketStories(10, "yetAnother"))
+ PocketRecommendedStoriesCategory("yetAnother", getFakePocketStories(40, "yetAnother"))
val state = AppState(
recommendationState = ContentRecommendationsState(
pocketStoriesCategories = listOf(
@@ -414,13 +405,13 @@ class AppStateTest {
val result = state.getFilteredStories().toMutableList()
- assertEquals(CONTENT_RECOMMENDATIONS_TO_SHOW_COUNT, result.size)
- // second and penultimate story should be sponsored stories
- assertEquals(sponsoredStories[1], result[1])
- assertEquals(sponsoredStories[0], result[CONTENT_RECOMMENDATIONS_TO_SHOW_COUNT - 1])
+ assertEquals(TOTAL_CONTENT_RECOMMENDATIONS_TO_SHOW_COUNT, result.size)
+ // 2nd and 9th story should be sponsored stories
+ assertEquals(sponsoredStories[1], result[SPONSORED_STORIES_INDEXES[0]])
+ assertEquals(sponsoredStories[0], result[SPONSORED_STORIES_INDEXES[1]])
// remove the sponsored stories to hopefully only remain with stories from the selected categories
- result.removeAt(CONTENT_RECOMMENDATIONS_TO_SHOW_COUNT - 1)
- result.removeAt(1)
+ result.removeAt(SPONSORED_STORIES_INDEXES[1])
+ result.removeAt(SPONSORED_STORIES_INDEXES[0])
assertNull(
result.firstOrNull {
(it !is PocketRecommendedStory) ||
@@ -434,7 +425,7 @@ class AppStateTest {
val otherStoriesCategoryWithManyStories =
PocketRecommendedStoriesCategory(
"other",
- getFakePocketStories(CONTENT_RECOMMENDATIONS_TO_SHOW_COUNT + 2, "other"),
+ getFakePocketStories(TOTAL_CONTENT_RECOMMENDATIONS_TO_SHOW_COUNT + 2, "other"),
)
val state = AppState(
recommendationState = ContentRecommendationsState(
@@ -451,7 +442,7 @@ class AppStateTest {
val result = state.getFilteredStories()
- assertEquals(CONTENT_RECOMMENDATIONS_TO_SHOW_COUNT, result.size)
+ assertEquals(TOTAL_CONTENT_RECOMMENDATIONS_TO_SHOW_COUNT, result.size)
}
@Test
@@ -685,7 +676,7 @@ class AppStateTest {
@Test
fun `GIVEN content recommendations with no sponsored stories WHEN getStories is called THEN return a list of content recommendations to displayed sorted by the number of impressions`() {
- val recommendations = getFakeContentRecommendations(10)
+ val recommendations = getFakeContentRecommendations(40)
val state = AppState(
recommendationState = ContentRecommendationsState(
contentRecommendations = recommendations.sortedByDescending { it.impressions },
@@ -694,20 +685,17 @@ class AppStateTest {
val result = state.getStories()
- assertEquals(CONTENT_RECOMMENDATIONS_TO_SHOW_COUNT, result.size)
- assertEquals(recommendations[0], result[0])
- assertEquals(recommendations[1], result[1])
- assertEquals(recommendations[2], result[2])
- assertEquals(recommendations[3], result[3])
- assertEquals(recommendations[4], result[4])
- assertEquals(recommendations[5], result[5])
- assertEquals(recommendations[6], result[6])
- assertEquals(recommendations[7], result[7])
+ assertCombinedStories(
+ recommendedStories = recommendations,
+ sponsoredStories = listOf(),
+ result = result,
+ sponsoredStoriesIndexes = listOf(),
+ )
}
@Test
- fun `GIVEN content recommendations and sponsored stories WHEN getStories is called THEN return a list of 9 stories with sponsored stories at position 2 and 9`() {
- val recommendations = getFakeContentRecommendations(10)
+ fun `GIVEN content recommendations and sponsored stories WHEN getStories is called THEN return a list of 30 stories with sponsored stories at position 2 and 9`() {
+ val recommendations = getFakeContentRecommendations(40)
val sponsoredStories = getFakeSponsoredStories(4)
val state = AppState(
recommendationState = ContentRecommendationsState(
@@ -718,21 +706,17 @@ class AppStateTest {
val result = state.getStories()
- assertEquals(CONTENT_RECOMMENDATIONS_TO_SHOW_COUNT, result.size)
- assertEquals(recommendations[0], result[0])
- assertEquals(sponsoredStories[1], result[1])
- assertEquals(recommendations[1], result[2])
- assertEquals(recommendations[2], result[3])
- assertEquals(recommendations[3], result[4])
- assertEquals(recommendations[4], result[5])
- assertEquals(recommendations[5], result[6])
- assertEquals(recommendations[6], result[7])
- assertEquals(sponsoredStories[3], result[8])
+ assertCombinedStories(
+ recommendedStories = recommendations,
+ sponsoredStories = sponsoredStories,
+ sponsoredStoriesIndexes = listOf(1, 3),
+ result = result,
+ )
}
@Test
- fun `GIVEN content recommendations and sponsored contents WHEN getStories is called THEN return a list of 9 stories with sponsored contents at position 2 and 9`() {
- val recommendations = getFakeContentRecommendations(10)
+ fun `GIVEN content recommendations and sponsored contents WHEN getStories is called THEN return a list of 40 stories with sponsored contents at position 2 and 9`() {
+ val recommendations = getFakeContentRecommendations(40)
val sponsoredContents = getFakeSponsoredContents(4)
val state = AppState(
recommendationState = ContentRecommendationsState(
@@ -743,16 +727,12 @@ class AppStateTest {
val result = state.getStories(useSponsoredStoriesState = false)
- assertEquals(CONTENT_RECOMMENDATIONS_TO_SHOW_COUNT, result.size)
- assertEquals(recommendations[0], result[0])
- assertEquals(sponsoredContents[1], result[1])
- assertEquals(recommendations[1], result[2])
- assertEquals(recommendations[2], result[3])
- assertEquals(recommendations[3], result[4])
- assertEquals(recommendations[4], result[5])
- assertEquals(recommendations[5], result[6])
- assertEquals(recommendations[6], result[7])
- assertEquals(sponsoredContents[3], result[8])
+ assertCombinedStories(
+ recommendedStories = recommendations,
+ sponsoredStories = sponsoredContents,
+ sponsoredStoriesIndexes = listOf(1, 3),
+ result = result,
+ )
}
@Test
@@ -887,6 +867,33 @@ class AppStateTest {
assertTrue(state.shouldShowRecentTabs(settings))
}
+
+ private fun assertCombinedStories(
+ recommendedStories: List<PocketStory>,
+ sponsoredStories: List<PocketStory>,
+ result: List<PocketStory>,
+ sponsoredStoriesIndexes: List<Int> = listOf(0, 1),
+ ) {
+ assertEquals(TOTAL_CONTENT_RECOMMENDATIONS_TO_SHOW_COUNT, result.size)
+ var recommendedStoriesIndex = 0
+ assertEquals(recommendedStories[recommendedStoriesIndex++], result[0])
+
+ if (sponsoredStories.isEmpty()) {
+ assertEquals(recommendedStories[recommendedStoriesIndex++], result[1])
+ } else {
+ assertEquals(sponsoredStories[sponsoredStoriesIndexes[0]], result[1])
+ }
+
+ for (i in 2..7) { assertEquals(recommendedStories[recommendedStoriesIndex++], result[i]) }
+
+ if (sponsoredStories.size > 1) {
+ assertEquals(sponsoredStories[sponsoredStoriesIndexes[1]], result[8])
+ } else {
+ assertEquals(recommendedStories[recommendedStoriesIndex++], result[8])
+ }
+
+ for (i in 9..29) { assertEquals(recommendedStories[recommendedStoriesIndex++], result[i]) }
+ }
}
private fun getFakePocketStories(