Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Read summary feature #94

Merged
merged 8 commits into from
Feb 19, 2024
Merged
Show file tree
Hide file tree
Changes from 7 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading