Skip to content

Commit

Permalink
Read summary feature (#94)
Browse files Browse the repository at this point in the history
* Built Read summary feature

* Tests for FileDownloaderTest, ReadSummaryViewModelTest, TextScaleFactorTest

* Tests for MarkdownParserTest, MarkdownTextTest, ReadFontScaleChooser, ReadSummaryScreen

* Fixing detekt and ktlint issues

* Removed graphics, Fixing detekt and ktlint issues

* Removed GifImage.kt

* Fixing Detekt issues

* Adding missing tests
  • Loading branch information
rygelouv authored Feb 19, 2024
1 parent 7335e02 commit 454d245
Show file tree
Hide file tree
Showing 60 changed files with 2,316 additions and 86 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import app.books.tanga.R
import app.books.tanga.coreui.components.InfoCard
import app.books.tanga.coreui.components.TangaButton
import app.books.tanga.coreui.theme.TangaTheme
import app.books.tanga.feature.summary.list.SummaryGrid
import app.books.tanga.feature.summary.components.SummaryGrid
import app.books.tanga.fixtures.FakeUiData
import kotlinx.collections.immutable.toImmutableList
import org.junit.Rule
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package app.books.tanga.read

import androidx.compose.ui.test.junit4.createComposeRule
import androidx.compose.ui.test.onNodeWithTag
import androidx.compose.ui.test.performTouchInput
import androidx.compose.ui.test.swipeRight
import app.books.tanga.feature.read.components.ReadFontScaleChooser
import org.junit.Rule
import org.junit.Test

class ReadFontScaleChooserTest {

@get:Rule
val composeTestRule = createComposeRule()

@Test
fun readFontScaleChooser_renders_correctly() {
var scale = 0f
composeTestRule.setContent {
ReadFontScaleChooser(
initialValue = scale,
onFontScaleChange = { scale = it }
)
}

composeTestRule.onNodeWithTag("font_size_min").assertExists()
composeTestRule.onNodeWithTag("font_size_max").assertExists()
}

@Test
fun readFontScaleChooser_updates_scale_on_slider_interaction() {
var scale = 0f
composeTestRule.setContent {
ReadFontScaleChooser(
initialValue = scale,
onFontScaleChange = { scale = it }
)
}

composeTestRule.onNodeWithTag("slider").performTouchInput { swipeRight() }

assert(scale > 0f)
}
}
155 changes: 155 additions & 0 deletions app/src/androidTest/java/app/books/tanga/read/ReadSummaryScreenTest.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,155 @@
package app.books.tanga.read

import androidx.compose.ui.test.junit4.createComposeRule
import androidx.compose.ui.test.onNodeWithTag
import androidx.compose.ui.test.onNodeWithText
import androidx.compose.ui.test.performClick
import app.books.tanga.common.ui.ProgressState
import app.books.tanga.feature.read.ReadSummaryScreen
import app.books.tanga.feature.read.ReadSummaryUiState
import app.books.tanga.feature.summary.SummaryContentState
import org.junit.Rule
import org.junit.Test

class ReadSummaryScreenTest {

@get:Rule
val composeTestRule = createComposeRule()

@Test
fun readSummaryScreenRendersCorrectly() {
val state = ReadSummaryUiState(
summaryContentState = SummaryContentState(
isFavorite = false,
favoriteProgressState = ProgressState.Hide
),
summaryTextContent = "Test content",
progressState = ProgressState.Hide
)

composeTestRule.setContent {
ReadSummaryScreen(
state = state,
onNavigateToPreviousScreen = {},
onToggleFavorite = {},
onNavigateToAudioPlayer = {},
onFontSizeClick = {},
onFontScaleChange = {}
)
}

composeTestRule.onNodeWithTag("back_button", useUnmergedTree = true).assertExists()
composeTestRule.onNodeWithTag("font_size", useUnmergedTree = true).assertExists()
}

@Test
fun readSummaryScreenDisplaysMarkdownTextContent() {
val markdownTextContent = "## Test Markdown Content"
val state = ReadSummaryUiState(
summaryContentState = SummaryContentState(
isFavorite = false,
favoriteProgressState = ProgressState.Hide
),
summaryTextContent = markdownTextContent,
progressState = ProgressState.Hide
)

composeTestRule.setContent {
ReadSummaryScreen(
state = state,
onNavigateToPreviousScreen = {},
onToggleFavorite = {},
onNavigateToAudioPlayer = {},
onFontSizeClick = {},
onFontScaleChange = {}
)
}

composeTestRule.onNodeWithText("Test Markdown Content").assertExists()
composeTestRule.onNodeWithText(markdownTextContent).assertDoesNotExist()
}

@Test
fun readSummaryScreenTriggersOnBackClick() {
var backClicked = false
val state = ReadSummaryUiState(
summaryContentState = SummaryContentState(
isFavorite = false,
favoriteProgressState = ProgressState.Hide
),
summaryTextContent = "Test content",
progressState = ProgressState.Hide
)

composeTestRule.setContent {
ReadSummaryScreen(
state = state,
onNavigateToPreviousScreen = { backClicked = true },
onToggleFavorite = {},
onNavigateToAudioPlayer = {},
onFontSizeClick = {},
onFontScaleChange = {}
)
}

composeTestRule.onNodeWithTag("back_button", useUnmergedTree = true).performClick()

assert(backClicked)
}

@Test
fun readSummaryScreenTriggersOnFontSizeClick() {
var fontSizeClicked = false
val state = ReadSummaryUiState(
summaryContentState = SummaryContentState(
isFavorite = false,
favoriteProgressState = ProgressState.Hide
),
summaryTextContent = "Test content",
progressState = ProgressState.Hide
)

composeTestRule.setContent {
ReadSummaryScreen(
state = state,
onNavigateToPreviousScreen = {},
onToggleFavorite = {},
onNavigateToAudioPlayer = {},
onFontSizeClick = { fontSizeClicked = true },
onFontScaleChange = {}
)
}

composeTestRule.onNodeWithTag("font_size", useUnmergedTree = true).performClick()

assert(fontSizeClicked)
}

@Test
fun readSummaryScreenTriggersOnToggleFavorite() {
var favoriteToggled = false
val state = ReadSummaryUiState(
summaryContentState = SummaryContentState(
isFavorite = false,
favoriteProgressState = ProgressState.Hide
),
summaryTextContent = "Test content",
progressState = ProgressState.Hide
)

composeTestRule.setContent {
ReadSummaryScreen(
state = state,
onNavigateToPreviousScreen = {},
onToggleFavorite = { favoriteToggled = true },
onNavigateToAudioPlayer = {},
onFontSizeClick = {},
onFontScaleChange = {}
)
}

composeTestRule.onNodeWithTag("save_favorite").performClick()

assert(favoriteToggled)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ class SummaryDetailsScreenHandleEventsTest {
onNavigateToAuth = onNavigateToAuthMock,
onNavigateToPreviousScreen = {},
onNavigateToAudioPlayer = {},
onNavigateToReadSummaryScreen = {},
onNavigateToRecommendedSummaryDetails = {}
)
}
Expand All @@ -50,6 +51,7 @@ class SummaryDetailsScreenHandleEventsTest {
onNavigateToAuth = {},
onNavigateToPreviousScreen = onNavigateToPreviousScreenMock,
onNavigateToAudioPlayer = {},
onNavigateToReadSummaryScreen = {},
onNavigateToRecommendedSummaryDetails = {}
)
}
Expand All @@ -72,6 +74,7 @@ class SummaryDetailsScreenHandleEventsTest {
onNavigateToAuth = {},
onNavigateToPreviousScreen = {},
onNavigateToAudioPlayer = onNavigateToAudioPlayerMock,
onNavigateToReadSummaryScreen = {},
onNavigateToRecommendedSummaryDetails = {}
)
}
Expand All @@ -94,6 +97,7 @@ class SummaryDetailsScreenHandleEventsTest {
onNavigateToAuth = {},
onNavigateToPreviousScreen = {},
onNavigateToAudioPlayer = {},
onNavigateToReadSummaryScreen = {},
onNavigateToRecommendedSummaryDetails = onNavigateToRecommendedSummaryDetailsMock
)
}
Expand All @@ -115,6 +119,7 @@ class SummaryDetailsScreenHandleEventsTest {
onNavigateToAuth = {},
onNavigateToPreviousScreen = {},
onNavigateToAudioPlayer = {},
onNavigateToReadSummaryScreen = {},
onNavigateToRecommendedSummaryDetails = {}
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ class SummaryDetailsScreenTest {
val composeTestRule = createComposeRule()

private val context = InstrumentationRegistry.getInstrumentation().targetContext
private val viewModel: SummaryDetailsViewModel = mockk(relaxed = true)

private val state1 = SummaryDetailsUiState(
summary = SummaryUi(
Expand Down Expand Up @@ -186,7 +187,6 @@ class SummaryDetailsScreenTest {
@Test
fun verifySummaryDetailsScreenContainerRendersContentCorrectly() {
val summaryId = SummaryId("1")
val viewModel: SummaryDetailsViewModel = mockk(relaxed = true)

every { viewModel.state } returns MutableStateFlow(state1).asStateFlow()
every { viewModel.events } returns flowOf()
Expand All @@ -201,6 +201,7 @@ class SummaryDetailsScreenTest {
onNavigateToAuth = {},
onNavigateToPreviousScreen = {},
onNavigateToAudioPlayer = {},
onNavigateToReadSummaryScreen = {},
onNavigateToRecommendedSummaryDetails = {}
)
}
Expand All @@ -226,9 +227,10 @@ class SummaryDetailsScreenTest {
SummaryDetailsScreen(
state = state,
onBackClick = {},
onPlayClick = {},
onPlayClick = { viewModel.onPlayClick() },
onLoadSummary = {},
onToggleFavorite = {},
onReadClick = {},
onRecommendationClick = {}
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import app.books.tanga.common.urls.StorageDownloadUrlGenerator
import app.books.tanga.coreui.components.TangaAsyncImage
import app.books.tanga.data.download.StorageDownloadUrlGenerator
import app.books.tanga.entity.SummaryId

/**
Expand Down
Loading

0 comments on commit 454d245

Please sign in to comment.