Use Compose to draw the list of recipes (#187)

* Add paging-compose dependency

* Move progress indicator to separate module

* Introduce color scheme preview

* Move loading helper to UI module

* Move helper composables to UI module

* Rearrange shopping lists module

* Add LazyPagingColumnPullRefresh Composable

* Add BaseComposeFragment

* Add pagingDataRecipeState

* Add showFavoriteIcon to recipe state

* Disable unused placeholders

* Make "Try again" button optional

* Fix example email

* Wrap recipe info into a Scaffold

* Add dialog to confirm deletion

* Add RecipeItem Composable

* Add RecipeListError Composable

* Add RecipeList Composable

* Replace recipes list Views with Compose

* Update UI test

* Remove application from ViewModel
This commit is contained in:
Kirill Kamakin
2023-11-23 07:23:30 +01:00
committed by GitHub
parent 4301c623c9
commit f6f44c7592
72 changed files with 935 additions and 1131 deletions

View File

@@ -1,6 +1,8 @@
package gq.kirmanak.mealient
import androidx.test.ext.junit.rules.activityScenarioRule
import androidx.compose.ui.test.junit4.createAndroidComposeRule
import com.kaspersky.components.composesupport.config.withComposeSupport
import com.kaspersky.kaspresso.kaspresso.Kaspresso
import com.kaspersky.kaspresso.testcases.api.testcase.TestCase
import dagger.hilt.android.testing.HiltAndroidRule
import gq.kirmanak.mealient.ui.activity.MainActivity
@@ -9,13 +11,15 @@ import org.junit.After
import org.junit.Before
import org.junit.Rule
abstract class BaseTestCase : TestCase() {
abstract class BaseTestCase : TestCase(
kaspressoBuilder = Kaspresso.Builder.withComposeSupport(),
) {
@get:Rule(order = 0)
var hiltRule = HiltAndroidRule(this)
@get:Rule(order = 1)
val mainActivityRule = activityScenarioRule<MainActivity>()
val mainActivityRule = createAndroidComposeRule<MainActivity>()
lateinit var mockWebServer: MockWebServer

View File

@@ -4,6 +4,7 @@ import dagger.hilt.android.testing.HiltAndroidTest
import gq.kirmanak.mealient.screen.BaseUrlScreen
import gq.kirmanak.mealient.screen.DisclaimerScreen
import gq.kirmanak.mealient.screen.RecipesListScreen
import io.github.kakaocup.kakao.common.utilities.getResourceString
import org.junit.Before
import org.junit.Test
@@ -65,10 +66,10 @@ class FirstSetUpTest : BaseTestCase() {
}
step("Check that empty list of recipes is shown") {
RecipesListScreen {
emptyListText {
isVisible()
hasText(R.string.fragment_recipes_list_no_recipes)
RecipesListScreen(mainActivityRule).apply {
errorText {
assertIsDisplayed()
assertTextEquals(getResourceString(R.string.fragment_recipes_load_failure_toast_no_reason))
}
}
}

View File

@@ -1,13 +1,20 @@
package gq.kirmanak.mealient.screen
import com.kaspersky.kaspresso.screens.KScreen
import gq.kirmanak.mealient.R
import gq.kirmanak.mealient.ui.recipes.RecipesListFragment
import io.github.kakaocup.kakao.text.KTextView
import androidx.activity.ComponentActivity
import androidx.compose.ui.test.junit4.AndroidComposeTestRule
import androidx.compose.ui.test.onRoot
import androidx.compose.ui.test.printToLog
import io.github.kakaocup.compose.node.element.ComposeScreen
import io.github.kakaocup.compose.node.element.KNode
import org.junit.rules.TestRule
object RecipesListScreen : KScreen<RecipesListScreen>() {
override val layoutId: Int = R.layout.fragment_recipes_list
override val viewClass: Class<*> = RecipesListFragment::class.java
class RecipesListScreen<R : TestRule, A : ComponentActivity>(
semanticsProvider: AndroidComposeTestRule<R, A>,
) : ComposeScreen<RecipesListScreen<R, A>>(semanticsProvider) {
val emptyListText = KTextView { withId(R.id.empty_list_text) }
init {
semanticsProvider.onRoot(useUnmergedTree = true).printToLog("RecipesListScreen")
}
val errorText: KNode = child { hasTestTag("empty-list-error-text") }
}