tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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:
Mmobile/android/fenix/app/src/main/java/org/mozilla/fenix/ext/AppState.kt | 59+++++++++++++++++++++++++++++++++--------------------------
Mmobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/fake/FakeHomepagePreview.kt | 4++--
Mmobile/android/fenix/app/src/test/java/org/mozilla/fenix/ext/AppStateTest.kt | 161+++++++++++++++++++++++++++++++++++++++++--------------------------------------
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(