Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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,6 @@ import androidx.navigation.compose.NavHost
import androidx.navigation.navigation
import com.random.user.navigation.viewmodel.NavigationViewModel
import com.random.user.presentation.navigation.BaseNavRoutes
import com.random.user.presentation.ui.theme.RandomUsersTheme

@Composable
fun BaseProjectApplicationNavHost(
Expand Down
2 changes: 0 additions & 2 deletions core/api/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,6 @@ dependencies {
implementation(libs.retrofit.gson)
implementation(libs.okhttp)
implementation(libs.okhttp.logging.interceptor)
implementation(libs.hilt.testing)
implementation(libs.mockwebserver)

ksp(libs.com.google.dagger.hilt.compiler)
}
2 changes: 0 additions & 2 deletions core/database/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,6 @@ android {
dependencies {
implementation(libs.bundles.layer.data)
implementation(libs.room.ktx)
implementation(libs.room.testing)
implementation(libs.hilt.testing)

ksp(libs.com.google.dagger.hilt.compiler)
ksp(libs.room.compiler)
Expand Down
1 change: 0 additions & 1 deletion core/preferences/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@ android {

dependencies {
implementation(libs.bundles.layer.data)
implementation(libs.hilt.testing)

ksp(libs.com.google.dagger.hilt.compiler)
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@ package com.random.user.presentation.navigation

import kotlinx.serialization.Serializable

sealed class BaseNavRoutes {
sealed interface BaseNavRoutes {
@Serializable
data object MainGraph : BaseNavRoutes()
data object MainGraph : BaseNavRoutes

@Serializable
data object Users : BaseNavRoutes()
data object Users : BaseNavRoutes
}
1 change: 0 additions & 1 deletion core/test/.gitignore

This file was deleted.

46 changes: 0 additions & 46 deletions core/test/build.gradle.kts

This file was deleted.

21 changes: 0 additions & 21 deletions core/test/proguard-rules.pro

This file was deleted.

3 changes: 0 additions & 3 deletions data/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,6 @@ dependencies {
implementation(libs.bundles.layer.data)
implementation(libs.arrow.core.retrofit)

implementation(libs.hilt.testing)
implementation(libs.test.corutines)

ksp(libs.com.google.dagger.hilt.compiler)

implementation(project(":domain"))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,14 @@ import com.random.users.api.model.StreetDto
import com.random.users.api.model.TimezoneDto
import com.random.users.api.model.UserDto

object RandomUsersResponseMother {
internal object RandomUsersResponseMother {
fun createModel(
results: List<UserDto> = listOf(UserDtoMother.createModel()),
info: ResponseInfoDto = ResponseInfoDtoMother.createModel(),
): RandomUserResponse = RandomUserResponse(results, info)
}

object ResponseInfoDtoMother {
internal object ResponseInfoDtoMother {
fun createModel(
seed: String = "default-seed",
results: Int = 10,
Expand All @@ -35,7 +35,7 @@ object ResponseInfoDtoMother {
)
}

object UserDtoMother {
internal object UserDtoMother {
fun createModel(
gender: String = "male",
name: NameDto = NameDtoMother.createModel(),
Expand Down Expand Up @@ -66,15 +66,15 @@ object UserDtoMother {
)
}

object NameDtoMother {
private object NameDtoMother {
fun createModel(
title: String = "Mr",
first: String = "John",
last: String = "Doe",
): NameDto = NameDto(title, first, last)
}

object LocationDtoMother {
private object LocationDtoMother {
fun createModel(
street: StreetDto = StreetDtoMother.createModel(),
city: String = "New York",
Expand All @@ -86,28 +86,28 @@ object LocationDtoMother {
): LocationDto = LocationDto(street, city, state, country, postcode, coordinates, timezone)
}

object StreetDtoMother {
private object StreetDtoMother {
fun createModel(
number: Int = 123,
name: String = "Main Street",
): StreetDto = StreetDto(number, name)
}

object CoordinatesDtoMother {
private object CoordinatesDtoMother {
fun createModel(
latitude: String = "40.7128",
longitude: String = "-74.0060",
): CoordinatesDto = CoordinatesDto(latitude, longitude)
}

object TimezoneDtoMother {
private object TimezoneDtoMother {
fun createModel(
offset: String = "-05:00",
description: String = "Eastern Time (US & Canada)",
): TimezoneDto = TimezoneDto(offset, description)
}

object LoginDtoMother {
private object LoginDtoMother {
fun createModel(
uuid: String = "mock-uuid",
username: String = "johndoe",
Expand All @@ -119,21 +119,21 @@ object LoginDtoMother {
): LoginDto = LoginDto(uuid, username, password, salt, md5, sha1, sha256)
}

object DateInfoDtoMother {
private object DateInfoDtoMother {
fun createModel(
date: String = "2000-01-01T00:00:00Z",
age: Int = 21,
): DateInfoDto = DateInfoDto(date, age)
}

object IdDtoMother {
private object IdDtoMother {
fun createModel(
name: String = "SSN",
value: String = "123-45-6789",
): IdDto = IdDto(name, value)
}

object PictureDtoMother {
private object PictureDtoMother {
fun createModel(
large: String = "https://example.com/large.jpg",
medium: String = "https://example.com/medium.jpg",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ import org.junit.Assert
import org.junit.Before
import org.junit.Test

class UsersRepositoryUnitTest {
internal class UsersRepositoryUnitTest {
private lateinit var usersRepository: UsersRepository
private val usersLocalDataSource: UsersLocalDataSource = mockk()
private val usersRemoteDataSource: UsersRemoteDataSource = mockk()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import com.random.users.domain.models.UserName
import com.random.users.domain.models.UserPicture
import com.random.users.domain.models.UserStreet

object UserMother {
internal object UserMother {
fun createModel(
uuid: String = "mock-uuid",
name: UserName = createUserName(),
Expand All @@ -26,23 +26,23 @@ object UserMother {
picture = picture,
)

fun createUserName(
private fun createUserName(
first: String = "John",
last: String = "Doe",
): UserName = UserName(first, last)

fun createUserLocation(
private fun createUserLocation(
street: UserStreet = createUserStreet(),
city: String = "Madrid",
state: String = "Madrid",
): UserLocation = UserLocation(street, city, state)

fun createUserStreet(
private fun createUserStreet(
number: Int = 123,
name: String = "Calle Mayor",
): UserStreet = UserStreet(number, name)

fun createUserPicture(
private fun createUserPicture(
medium: String = "https://example.com/medium.jpg",
thumbnail: String = "https://example.com/thumbnail.jpg",
): UserPicture = UserPicture(medium, thumbnail)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import org.junit.Assert
import org.junit.Before
import org.junit.Test

class GetUserListUseCaseUnitTest {
internal class GetUserListUseCaseUnitTest {
private lateinit var usersRepository: UsersRepository
private lateinit var getUserListUseCase: GetUserListUseCase

Expand Down
11 changes: 10 additions & 1 deletion presentation/users/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -61,8 +61,17 @@ dependencies {
implementation(project(":core:presentation"))
implementation(project(":domain"))

testImplementation(project(":core:test"))
kspTest(libs.com.google.dagger.hilt.compiler)
testImplementation(project(":data"))
testImplementation(project(":core:preferences"))
testImplementation(project(":core:database"))
testImplementation(project(":core:api"))
testImplementation(libs.arrow.core.retrofit)
testImplementation(libs.retrofit)
testImplementation(libs.retrofit.gson)
testImplementation(libs.okhttp)
testImplementation(libs.okhttp.logging.interceptor)
testImplementation(libs.room.testing)
testImplementation(libs.bundles.test.unit)
testImplementation(libs.bundles.test.compose)
}
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ import com.random.user.presentation.ui.theme.RandomUsersTheme
import com.random.users.users.contract.UserUiState
import com.random.users.users.contract.UsersScreenUiState
import com.random.users.users.model.UserUiModel
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.filter

Expand All @@ -61,7 +62,7 @@ internal fun UserList(
snapshotFlow { reachedBottom }
.distinctUntilChanged()
.filter { it && state.contentState is UsersScreenUiState.ContentState.Idle }
.collect { onLoadUsers() }
.collectLatest { onLoadUsers() }
}

LaunchedEffect(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,20 @@ import androidx.compose.material3.Icon
import androidx.compose.material3.Text
import androidx.compose.material3.TextField
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.snapshotFlow
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.testTag
import androidx.compose.ui.tooling.preview.PreviewLightDark
import com.random.user.presentation.ui.theme.RandomUsersTheme
import kotlinx.coroutines.FlowPreview
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.flow.debounce
import kotlinx.coroutines.flow.distinctUntilChanged

@OptIn(FlowPreview::class)
@Composable
internal fun UserSearchView(
modifier: Modifier = Modifier,
Expand All @@ -24,6 +31,15 @@ internal fun UserSearchView(
) {
val searchState = rememberSaveable { mutableStateOf(search) }

LaunchedEffect(
searchState.value,
) {
snapshotFlow { searchState.value }
.distinctUntilChanged()
.debounce(200)
.collectLatest { onValueChange(it) }
}

TextField(
modifier = modifier.fillMaxWidth().testTag("searchField"),
value = searchState.value,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,22 +32,22 @@ internal data class UserUiState(
}
}

internal sealed interface UsersEvent {
data object OnLoadUsers : UsersEvent
internal sealed interface UsersUiEvent {
data object OnLoadUsers : UsersUiEvent

data class OnFilterUsers(
val filterText: String,
) : UsersEvent
) : UsersUiEvent

data class OnDeleteUser(
val uuid: String,
) : UsersEvent
) : UsersUiEvent
}

internal sealed class UsersErrorUiEventsState {
data object DeleteError : UsersErrorUiEventsState()
internal sealed interface UsersErrorUiState {
data object DeleteError : UsersErrorUiState

data object LoadUsersError : UsersErrorUiEventsState()
data object LoadUsersError : UsersErrorUiState

data object UnknownError : UsersErrorUiEventsState()
data object UnknownError : UsersErrorUiState
}
Loading