From ee34a34dbe2ca10dacbc0a4bfd6e627072ee2a88 Mon Sep 17 00:00:00 2001 From: PanMobile Date: Sat, 31 Jan 2026 20:10:47 +0300 Subject: [PATCH 01/11] =?UTF-8?q?ANDR-5:=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=20=D1=8E=D0=B7=D0=BA=D0=B5=D0=B9=D1=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../createQuiz/domain/GetSpecializationsListUseCase.kt | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 feature/interview-trainer/impl/src/main/java/ru/yeahub/interview_trainer/impl/createQuiz/domain/GetSpecializationsListUseCase.kt diff --git a/feature/interview-trainer/impl/src/main/java/ru/yeahub/interview_trainer/impl/createQuiz/domain/GetSpecializationsListUseCase.kt b/feature/interview-trainer/impl/src/main/java/ru/yeahub/interview_trainer/impl/createQuiz/domain/GetSpecializationsListUseCase.kt new file mode 100644 index 00000000..a106b278 --- /dev/null +++ b/feature/interview-trainer/impl/src/main/java/ru/yeahub/interview_trainer/impl/createQuiz/domain/GetSpecializationsListUseCase.kt @@ -0,0 +1,9 @@ +package ru.yeahub.interview_trainer.impl.createQuiz.domain + +class GetSpecializationsListUseCase( + private val repository: CreateQuizRepositoryApi, +) { + suspend operator fun invoke( + request: SpecializationsRequest, + ): DomainSpecializationListResponse = repository.getSpecializationsList(request = request) +} \ No newline at end of file From 2c5dbf95a821a5a97e70a4071a147dd7c43505a2 Mon Sep 17 00:00:00 2001 From: PanMobile Date: Sun, 1 Feb 2026 03:05:37 +0300 Subject: [PATCH 02/11] =?UTF-8?q?ANDR-5:=20=D0=A1=D0=BA=D1=80=D0=B8=D0=BD?= =?UTF-8?q?=20=D0=BC=D0=B0=D0=BF=D0=BF=D0=B5=D1=80=20=D1=82=D0=B5=D0=BF?= =?UTF-8?q?=D0=B5=D1=80=D1=8C=20=D0=BC=D0=B0=D0=BF=D0=BF=D0=B8=D1=82=20?= =?UTF-8?q?=D0=B4=D0=BE=D0=BC=D0=B5=D0=B9=D0=BD=20=D0=B2=20VO?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../createQuiz/presentation/CreateQuizScreenMapper.kt | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/feature/interview-trainer/impl/src/main/java/ru/yeahub/interview_trainer/impl/createQuiz/presentation/CreateQuizScreenMapper.kt b/feature/interview-trainer/impl/src/main/java/ru/yeahub/interview_trainer/impl/createQuiz/presentation/CreateQuizScreenMapper.kt index 47831a56..1abd7353 100644 --- a/feature/interview-trainer/impl/src/main/java/ru/yeahub/interview_trainer/impl/createQuiz/presentation/CreateQuizScreenMapper.kt +++ b/feature/interview-trainer/impl/src/main/java/ru/yeahub/interview_trainer/impl/createQuiz/presentation/CreateQuizScreenMapper.kt @@ -1,13 +1,20 @@ package ru.yeahub.interview_trainer.impl.createQuiz.presentation +import ru.yeahub.interview_trainer.impl.createQuiz.domain.DomainSpecialization + object CreateQuizScreenMapper { fun getScreenState( - specializations: List, + specializations: List, selectedSpecializationId: Long, questionsCount: Int, ): CreateQuizState = CreateQuizState.Loaded( - specializations = specializations, + specializations = specializations.map { domainSpec -> + CreateQuizState.Loaded.VoSpecialization( + id = domainSpec.id, + title = domainSpec.title + ) + }, selectedSpecializationId = selectedSpecializationId, questionsCount = questionsCount ) From 9ec368e24daec64a587847a564bbb662eda22746 Mon Sep 17 00:00:00 2001 From: PanMobile Date: Sun, 1 Feb 2026 03:18:17 +0300 Subject: [PATCH 03/11] =?UTF-8?q?ANDR-5:=20=D0=AE=D0=B7=D0=BA=D0=B5=D0=B9?= =?UTF-8?q?=D1=81=20=D1=80=D0=B0=D0=B7=D0=B4=D0=B5=D0=BB=D0=B5=D0=BD=20?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=B8=D0=BD=D1=82=D0=B5=D1=80=D1=84=D0=B5=D0=B9?= =?UTF-8?q?=D1=81=20=D0=B8=20=D0=B8=D0=BC=D0=BF=D0=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...sListUseCase.kt => GetSpecializationsListUseCaseImpl.kt} | 6 +++--- .../impl/createQuiz/domain/GetSpecializationsUseCase.kt | 5 +++++ 2 files changed, 8 insertions(+), 3 deletions(-) rename feature/interview-trainer/impl/src/main/java/ru/yeahub/interview_trainer/impl/createQuiz/domain/{GetSpecializationsListUseCase.kt => GetSpecializationsListUseCaseImpl.kt} (70%) create mode 100644 feature/interview-trainer/impl/src/main/java/ru/yeahub/interview_trainer/impl/createQuiz/domain/GetSpecializationsUseCase.kt diff --git a/feature/interview-trainer/impl/src/main/java/ru/yeahub/interview_trainer/impl/createQuiz/domain/GetSpecializationsListUseCase.kt b/feature/interview-trainer/impl/src/main/java/ru/yeahub/interview_trainer/impl/createQuiz/domain/GetSpecializationsListUseCaseImpl.kt similarity index 70% rename from feature/interview-trainer/impl/src/main/java/ru/yeahub/interview_trainer/impl/createQuiz/domain/GetSpecializationsListUseCase.kt rename to feature/interview-trainer/impl/src/main/java/ru/yeahub/interview_trainer/impl/createQuiz/domain/GetSpecializationsListUseCaseImpl.kt index a106b278..ac3e52f8 100644 --- a/feature/interview-trainer/impl/src/main/java/ru/yeahub/interview_trainer/impl/createQuiz/domain/GetSpecializationsListUseCase.kt +++ b/feature/interview-trainer/impl/src/main/java/ru/yeahub/interview_trainer/impl/createQuiz/domain/GetSpecializationsListUseCaseImpl.kt @@ -1,9 +1,9 @@ package ru.yeahub.interview_trainer.impl.createQuiz.domain -class GetSpecializationsListUseCase( +class GetSpecializationsListUseCaseImpl( private val repository: CreateQuizRepositoryApi, -) { - suspend operator fun invoke( +) : GetSpecializationsUseCase { + override suspend fun invoke( request: SpecializationsRequest, ): DomainSpecializationListResponse = repository.getSpecializationsList(request = request) } \ No newline at end of file diff --git a/feature/interview-trainer/impl/src/main/java/ru/yeahub/interview_trainer/impl/createQuiz/domain/GetSpecializationsUseCase.kt b/feature/interview-trainer/impl/src/main/java/ru/yeahub/interview_trainer/impl/createQuiz/domain/GetSpecializationsUseCase.kt new file mode 100644 index 00000000..4171b335 --- /dev/null +++ b/feature/interview-trainer/impl/src/main/java/ru/yeahub/interview_trainer/impl/createQuiz/domain/GetSpecializationsUseCase.kt @@ -0,0 +1,5 @@ +package ru.yeahub.interview_trainer.impl.createQuiz.domain + +interface GetSpecializationsUseCase { + suspend operator fun invoke(request: SpecializationsRequest): DomainSpecializationListResponse +} \ No newline at end of file From 73ad437e15172ad9f455ca7b264d2e1096f7e920 Mon Sep 17 00:00:00 2001 From: PanMobile Date: Sun, 1 Feb 2026 03:19:54 +0300 Subject: [PATCH 04/11] =?UTF-8?q?ANDR-5:=20=D0=9F=D0=BE=D0=B4=D0=BA=D0=BB?= =?UTF-8?q?=D1=8E=D1=87=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=8E=D0=B7=D0=BA=D0=B5?= =?UTF-8?q?=D0=B9=D1=81=D0=B0=20=D0=B8=20=D0=BC=D0=B0=D0=BF=D0=BF=D0=B5?= =?UTF-8?q?=D1=80=D0=B0=20=D0=B2=D0=BE=20=D0=B2=D1=8C=D1=8E=D0=BC=D0=BE?= =?UTF-8?q?=D0=B4=D0=B5=D0=BB=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/createQuiz/presentation/CreateQuizViewModel.kt | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/feature/interview-trainer/impl/src/main/java/ru/yeahub/interview_trainer/impl/createQuiz/presentation/CreateQuizViewModel.kt b/feature/interview-trainer/impl/src/main/java/ru/yeahub/interview_trainer/impl/createQuiz/presentation/CreateQuizViewModel.kt index e39eaa93..6f8d9414 100644 --- a/feature/interview-trainer/impl/src/main/java/ru/yeahub/interview_trainer/impl/createQuiz/presentation/CreateQuizViewModel.kt +++ b/feature/interview-trainer/impl/src/main/java/ru/yeahub/interview_trainer/impl/createQuiz/presentation/CreateQuizViewModel.kt @@ -10,9 +10,11 @@ import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import ru.yeahub.core_utils.BaseViewModel -import ru.yeahub.interview_trainer.impl.createQuiz.ui.specializations +import ru.yeahub.interview_trainer.impl.createQuiz.domain.GetSpecializationsUseCase +import ru.yeahub.interview_trainer.impl.createQuiz.domain.SpecializationsRequest open class CreateQuizViewModel( + private val getSpecializationsListUseCase: GetSpecializationsUseCase, private val screenMapper: CreateQuizScreenMapper, ) : BaseViewModel() { @@ -25,8 +27,10 @@ open class CreateQuizViewModel( val screenState = userInputState .map { userInput -> + val request = SpecializationsRequest(page = 1, limit = 99) + screenMapper.getScreenState( - specializations = specializations, + specializations = getSpecializationsListUseCase(request).data, selectedSpecializationId = userInput.selectedSpecializationId, questionsCount = userInput.questionsCount ) From 7375862671fd2d1c8c80c3cb1c37b6e09696e5c8 Mon Sep 17 00:00:00 2001 From: PanMobile Date: Sun, 1 Feb 2026 03:20:37 +0300 Subject: [PATCH 05/11] =?UTF-8?q?ANDR-5:=20=D0=A3=D0=B4=D0=B0=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=BB=D0=B8=D1=88=D0=BD=D0=B8=D1=85=20?= =?UTF-8?q?=D1=81=D0=BE=D0=B7=D0=B4=D0=B0=D0=BD=D0=B8=D0=B9=20=D0=BA=D0=BE?= =?UTF-8?q?=D1=80=D1=83=D1=82=D0=B8=D0=BD=20=D0=BF=D1=80=D0=B8=20=D0=B8?= =?UTF-8?q?=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8=D0=B8=20=D0=B2=D0=B2?= =?UTF-8?q?=D0=BE=D0=B4=D0=B0=20=D1=8E=D0=B7=D0=B5=D1=80=D0=B0=20(=D0=B8?= =?UTF-8?q?=20=D1=81=D1=82=D0=B5=D0=B9=D1=82=D0=B0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/CreateQuizViewModel.kt | 26 +++++++------------ 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/feature/interview-trainer/impl/src/main/java/ru/yeahub/interview_trainer/impl/createQuiz/presentation/CreateQuizViewModel.kt b/feature/interview-trainer/impl/src/main/java/ru/yeahub/interview_trainer/impl/createQuiz/presentation/CreateQuizViewModel.kt index 6f8d9414..1a163104 100644 --- a/feature/interview-trainer/impl/src/main/java/ru/yeahub/interview_trainer/impl/createQuiz/presentation/CreateQuizViewModel.kt +++ b/feature/interview-trainer/impl/src/main/java/ru/yeahub/interview_trainer/impl/createQuiz/presentation/CreateQuizViewModel.kt @@ -73,32 +73,26 @@ open class CreateQuizViewModel( } private fun incrementQuestionsCount(questionsCount: Int) { - viewModelScopeSafe.launch { - userInputState.update { currentInputState -> - val incrementedCount = questionsCount + 1 - val newCount = incrementedCount.coerceAtMost(MAX_QUESTIONS_COUNT) + userInputState.update { currentInputState -> + val incrementedCount = questionsCount + 1 + val newCount = incrementedCount.coerceAtMost(MAX_QUESTIONS_COUNT) - currentInputState.copy(questionsCount = newCount) - } + currentInputState.copy(questionsCount = newCount) } } private fun decrementQuestionsCount(questionsCount: Int) { - viewModelScopeSafe.launch { - userInputState.update { currentInputState -> - val incrementedCount = questionsCount - 1 - val newCount = incrementedCount.coerceAtLeast(MIN_QUESTIONS_COUNT) + userInputState.update { currentInputState -> + val incrementedCount = questionsCount - 1 + val newCount = incrementedCount.coerceAtLeast(MIN_QUESTIONS_COUNT) - currentInputState.copy(questionsCount = newCount) - } + currentInputState.copy(questionsCount = newCount) } } private fun changeChosenSpecialization(newSpecializationId: Long) { - viewModelScopeSafe.launch { - userInputState.update { currentInputState -> - currentInputState.copy(selectedSpecializationId = newSpecializationId) - } + userInputState.update { currentInputState -> + currentInputState.copy(selectedSpecializationId = newSpecializationId) } } From 25a2a84e46fafe4a99afce38771a40ec7972d402 Mon Sep 17 00:00:00 2001 From: PanMobile Date: Sun, 1 Feb 2026 03:42:55 +0300 Subject: [PATCH 06/11] =?UTF-8?q?ANDR-5:=20=D0=9F=D0=B5=D1=80=D0=B5=D0=B8?= =?UTF-8?q?=D0=BC=D0=B5=D0=BD=D0=BE=D0=B2=D0=B0=D0=BD=20=D1=84=D0=B0=D0=B9?= =?UTF-8?q?=D0=BB=20=D1=82=D0=B5=D1=81=D1=82=D0=B0=20=D0=BC=D0=B0=D0=BF?= =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B0=20dataToDomain?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/createQuiz/ui/CreateQuizScreen.kt | 51 +++++++++++++++++-- ...kt => CreateQuizDataToDomainMapperTest.kt} | 2 +- 2 files changed, 48 insertions(+), 5 deletions(-) rename feature/interview-trainer/impl/src/test/java/test/{CreateQuizMapperTest.kt => CreateQuizDataToDomainMapperTest.kt} (98%) diff --git a/feature/interview-trainer/impl/src/main/java/ru/yeahub/interview_trainer/impl/createQuiz/ui/CreateQuizScreen.kt b/feature/interview-trainer/impl/src/main/java/ru/yeahub/interview_trainer/impl/createQuiz/ui/CreateQuizScreen.kt index 917a3cc5..ffa6a324 100644 --- a/feature/interview-trainer/impl/src/main/java/ru/yeahub/interview_trainer/impl/createQuiz/ui/CreateQuizScreen.kt +++ b/feature/interview-trainer/impl/src/main/java/ru/yeahub/interview_trainer/impl/createQuiz/ui/CreateQuizScreen.kt @@ -38,6 +38,7 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.viewmodel.compose.viewModel import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.Flow import ru.yeahub.core_ui.component.ErrorScreen import ru.yeahub.core_ui.component.PrimaryButton import ru.yeahub.core_ui.component.SkillButton @@ -47,8 +48,15 @@ import ru.yeahub.core_ui.example.staticPreview.StaticPreview import ru.yeahub.core_ui.theme.LocalAppTypography import ru.yeahub.core_ui.theme.colors import ru.yeahub.core_utils.common.TextOrResource +import ru.yeahub.core_utils.common.observe import ru.yeahub.interview_trainer.impl.R +import ru.yeahub.interview_trainer.impl.createQuiz.domain.DomainSpecialization +import ru.yeahub.interview_trainer.impl.createQuiz.domain.DomainSpecializationListResponse +import ru.yeahub.interview_trainer.impl.createQuiz.domain.GetSpecializationsUseCase +import ru.yeahub.interview_trainer.impl.createQuiz.domain.SpecializationsRequest +import ru.yeahub.interview_trainer.impl.createQuiz.presentation.CreateQuizCommand import ru.yeahub.interview_trainer.impl.createQuiz.presentation.CreateQuizEvent +import ru.yeahub.interview_trainer.impl.createQuiz.presentation.CreateQuizResult import ru.yeahub.interview_trainer.impl.createQuiz.presentation.CreateQuizScreenMapper import ru.yeahub.interview_trainer.impl.createQuiz.presentation.CreateQuizState import ru.yeahub.interview_trainer.impl.createQuiz.presentation.CreateQuizViewModel @@ -117,6 +125,24 @@ private fun ScreenUI( } } +@Composable +private fun HandleCommand( + commandFlow: Flow, + onResult: (CreateQuizResult) -> Unit, +) { + commandFlow.observe { command -> + when (command) { + CreateQuizCommand.NavigateBack -> onResult(CreateQuizResult.NavigateBack) + is CreateQuizCommand.NavigateToInterviewQuizScreen -> onResult( + CreateQuizResult.NavigateToInterviewQuizScreen( + specializationId = command.specializationId, + questionCount = command.questionCount + ) + ) + } + } +} + @Composable private fun BaseCreateQuizScreen( specializations: List, @@ -390,11 +416,28 @@ fun CreateQuizScreenPreview( @Preview(showBackground = true) @Composable fun DynamicPreviewUI() { + + val mockDomainList = specializations.map { voSpec -> + DomainSpecialization(id = voSpec.id, title = voSpec.title) + } + + val mockUseCase = object : GetSpecializationsUseCase { + override suspend fun invoke( + request: SpecializationsRequest, + ): DomainSpecializationListResponse { + delay(RESPONSE_DELAY) + return DomainSpecializationListResponse( + total = mockDomainList.size.toLong(), + data = mockDomainList + ) + } + } + val mockViewModel = viewModelCreator { - CreateQuizViewModel(CreateQuizScreenMapper) + CreateQuizViewModel(mockUseCase, CreateQuizScreenMapper) } - val state by mockViewModel.screenState.collectAsState() + val mockState by mockViewModel.screenState.collectAsState() LaunchedEffect(Unit) { delay(RESPONSE_DELAY) @@ -408,13 +451,13 @@ fun DynamicPreviewUI() { mockViewModel.onEvent(CreateQuizEvent.OnMinusQuestionClick(3)) delay(RESPONSE_DELAY) // должно быть снова 2 - mockViewModel.onEvent(CreateQuizEvent.OnSpecializationClick(21)) + mockViewModel.onEvent(CreateQuizEvent.OnSpecializationClick(27)) // С изначально выбранного Frontend Dev должно быть выбрано Android Dev } ProvidePreviewCompositionLocals { ScreenUI( - state = state, + state = mockState, onEvent = mockViewModel::onEvent, headerText = TextOrResource.Resource(R.string.create_quiz_top_bar_header_text) ) diff --git a/feature/interview-trainer/impl/src/test/java/test/CreateQuizMapperTest.kt b/feature/interview-trainer/impl/src/test/java/test/CreateQuizDataToDomainMapperTest.kt similarity index 98% rename from feature/interview-trainer/impl/src/test/java/test/CreateQuizMapperTest.kt rename to feature/interview-trainer/impl/src/test/java/test/CreateQuizDataToDomainMapperTest.kt index 59282f55..9f6607fc 100644 --- a/feature/interview-trainer/impl/src/test/java/test/CreateQuizMapperTest.kt +++ b/feature/interview-trainer/impl/src/test/java/test/CreateQuizDataToDomainMapperTest.kt @@ -10,7 +10,7 @@ import ru.yeahub.network_api.models.GetSpecializationResponse import ru.yeahub.network_api.models.GetSpecializationsResponse import ru.yeahub.test.TestArgumentsProvider -class CreateQuizMapperTest { +class CreateQuizDataToDomainMapperTest { private val toDomainMapper = CreateQuizDataToDomainMapper() //CreateQuizDataToDomainMapper параметризированный тест From 98717dbdeed9810f9668e1e74434d77f037ad795 Mon Sep 17 00:00:00 2001 From: PanMobile Date: Sun, 1 Feb 2026 03:43:11 +0300 Subject: [PATCH 07/11] =?UTF-8?q?ANDR-5:=20=D0=9D=D0=BE=D0=B2=D1=8B=D0=B9?= =?UTF-8?q?=20=D1=82=D0=B5=D1=81=D1=82=20=D1=84=D0=B0=D0=B9=D0=BB=20=D0=B4?= =?UTF-8?q?=D0=BB=D1=8F=20=D1=82=D0=B5=D1=81=D1=82=D0=B0=20ScreenMapper'?= =?UTF-8?q?=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/test/CreateQuizScreenMapperTest.kt | 90 +++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 feature/interview-trainer/impl/src/test/java/test/CreateQuizScreenMapperTest.kt diff --git a/feature/interview-trainer/impl/src/test/java/test/CreateQuizScreenMapperTest.kt b/feature/interview-trainer/impl/src/test/java/test/CreateQuizScreenMapperTest.kt new file mode 100644 index 00000000..d77d2221 --- /dev/null +++ b/feature/interview-trainer/impl/src/test/java/test/CreateQuizScreenMapperTest.kt @@ -0,0 +1,90 @@ +package test + +import org.junit.jupiter.api.Assertions +import org.junit.jupiter.params.ParameterizedTest +import org.junit.jupiter.params.provider.ArgumentsSource +import ru.yeahub.interview_trainer.impl.createQuiz.domain.DomainSpecialization +import ru.yeahub.interview_trainer.impl.createQuiz.presentation.CreateQuizScreenMapper +import ru.yeahub.interview_trainer.impl.createQuiz.presentation.CreateQuizState +import ru.yeahub.test.TestArgumentsProvider + +class CreateQuizScreenMapperTest { + + // CreateQuizScreenMapper параметризированный тест + class ArgumentsProvider : + TestArgumentsProvider() { + override fun testCases(): List = listOf( + CreateQuizScreenMapperTestCase( + specializations = ScreenMapperExampleDataClasses.defaultDomainSpecialList, + selectedSpecializationId = 0L, + questionsCount = 10, + expectedResult = ScreenMapperExampleDataClasses.defaultLoadedState + ), + CreateQuizScreenMapperTestCase( + specializations = ScreenMapperExampleDataClasses.defaultDomainSpecialList, + selectedSpecializationId = 1L, + questionsCount = 5, + expectedResult = ScreenMapperExampleDataClasses.loadedStateWithDifferentSelection + ) + ) + } + + @ParameterizedTest + @ArgumentsSource(ArgumentsProvider::class) + fun getScreenStateTest( + testCase: CreateQuizScreenMapperTestCase, + ) { + val result = CreateQuizScreenMapper.getScreenState( + specializations = testCase.specializations, + selectedSpecializationId = testCase.selectedSpecializationId, + questionsCount = testCase.questionsCount + ) + Assertions.assertEquals(testCase.expectedResult, result) + } + + object ScreenMapperExampleDataClasses { + val defaultDomainSpecial = DomainSpecialization( + id = 0L, + title = "default title num 0" + ) + + val defaultDomainSpecialWithImage = DomainSpecialization( + id = 1L, + title = "default title num 1" + ) + + val defaultDomainSpecialList = listOf( + defaultDomainSpecial, + defaultDomainSpecialWithImage + ) + + val defaultVoSpecial = CreateQuizState.Loaded.VoSpecialization( + id = 0L, + title = "default title num 0" + ) + + val defaultVoSpecialWithImage = CreateQuizState.Loaded.VoSpecialization( + id = 1L, + title = "default title num 1" + ) + + val defaultLoadedState = CreateQuizState.Loaded( + specializations = listOf(defaultVoSpecial, defaultVoSpecialWithImage), + selectedSpecializationId = 0L, + questionsCount = 10 + ) + + val loadedStateWithDifferentSelection = CreateQuizState.Loaded( + specializations = listOf(defaultVoSpecial, defaultVoSpecialWithImage), + selectedSpecializationId = 1L, + questionsCount = 5 + ) + } + + data class CreateQuizScreenMapperTestCase( + val specializations: List, + val selectedSpecializationId: Long, + val questionsCount: Int, + val expectedResult: CreateQuizState.Loaded, + ) +} \ No newline at end of file From 76dcb5164b8d9e54cdbd1bf6bc287b5f37089908 Mon Sep 17 00:00:00 2001 From: PanMobile Date: Sun, 1 Feb 2026 21:51:40 +0300 Subject: [PATCH 08/11] =?UTF-8?q?ANDR-5:=20=D0=9F=D1=80=D0=B0=D0=B2=D0=BA?= =?UTF-8?q?=D0=B8=20=D0=B4=D0=BB=D1=8F=20ktlint?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../interview_trainer/impl/createQuiz/ui/CreateQuizScreen.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/feature/interview-trainer/impl/src/main/java/ru/yeahub/interview_trainer/impl/createQuiz/ui/CreateQuizScreen.kt b/feature/interview-trainer/impl/src/main/java/ru/yeahub/interview_trainer/impl/createQuiz/ui/CreateQuizScreen.kt index ffa6a324..02051524 100644 --- a/feature/interview-trainer/impl/src/main/java/ru/yeahub/interview_trainer/impl/createQuiz/ui/CreateQuizScreen.kt +++ b/feature/interview-trainer/impl/src/main/java/ru/yeahub/interview_trainer/impl/createQuiz/ui/CreateQuizScreen.kt @@ -126,7 +126,7 @@ private fun ScreenUI( } @Composable -private fun HandleCommand( +fun HandleCommand( commandFlow: Flow, onResult: (CreateQuizResult) -> Unit, ) { @@ -416,7 +416,6 @@ fun CreateQuizScreenPreview( @Preview(showBackground = true) @Composable fun DynamicPreviewUI() { - val mockDomainList = specializations.map { voSpec -> DomainSpecialization(id = voSpec.id, title = voSpec.title) } From 980613a945fe3598ca9e7f493f9ebcd7dae85529 Mon Sep 17 00:00:00 2001 From: PanMobile Date: Mon, 2 Feb 2026 14:31:27 +0300 Subject: [PATCH 09/11] =?UTF-8?q?ANDR-5:=20=D0=9F=D1=80=D0=BE=D1=81=D1=82?= =?UTF-8?q?=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=20=D0=B2=D0=B5=D0=B7=D0=B4=D0=B5?= =?UTF-8?q?=20is=20=D0=B4=D0=BB=D1=8F=20=D1=83=D0=B4=D0=BE=D0=B1=D1=81?= =?UTF-8?q?=D1=82=D0=B2=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../interview_trainer/impl/createQuiz/ui/CreateQuizScreen.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/feature/interview-trainer/impl/src/main/java/ru/yeahub/interview_trainer/impl/createQuiz/ui/CreateQuizScreen.kt b/feature/interview-trainer/impl/src/main/java/ru/yeahub/interview_trainer/impl/createQuiz/ui/CreateQuizScreen.kt index 02051524..8ef23837 100644 --- a/feature/interview-trainer/impl/src/main/java/ru/yeahub/interview_trainer/impl/createQuiz/ui/CreateQuizScreen.kt +++ b/feature/interview-trainer/impl/src/main/java/ru/yeahub/interview_trainer/impl/createQuiz/ui/CreateQuizScreen.kt @@ -132,7 +132,7 @@ fun HandleCommand( ) { commandFlow.observe { command -> when (command) { - CreateQuizCommand.NavigateBack -> onResult(CreateQuizResult.NavigateBack) + is CreateQuizCommand.NavigateBack -> onResult(CreateQuizResult.NavigateBack) is CreateQuizCommand.NavigateToInterviewQuizScreen -> onResult( CreateQuizResult.NavigateToInterviewQuizScreen( specializationId = command.specializationId, From 29d86bc32a3717a43751370f15b9e80c336d55d8 Mon Sep 17 00:00:00 2001 From: PanMobile Date: Mon, 2 Feb 2026 14:32:33 +0300 Subject: [PATCH 10/11] =?UTF-8?q?ANDR-5:=20=D0=A3=D0=B4=D0=B0=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D1=8B=20=D0=BD=D0=B5=D0=BD=D1=83=D0=B6=D0=BD=D1=8B=D0=B5?= =?UTF-8?q?=20=D1=84=D0=B0=D0=B9=D0=BB=D1=8B=20=D1=82=D0=B5=D1=81=D1=82?= =?UTF-8?q?=D0=BE=D0=B2=20(=D1=83=D0=B6=D0=B5=20=D1=83=D0=B4=D0=B0=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=BD=D1=8B=D0=B5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../test/SpecializationExampleDataClasses.kt | 62 ------------ .../test/SpecializationSelectionMapperTest.kt | 99 ------------------- 2 files changed, 161 deletions(-) delete mode 100644 feature/selection-specializations/impl/src/test/java/test/SpecializationExampleDataClasses.kt delete mode 100644 feature/selection-specializations/impl/src/test/java/test/SpecializationSelectionMapperTest.kt diff --git a/feature/selection-specializations/impl/src/test/java/test/SpecializationExampleDataClasses.kt b/feature/selection-specializations/impl/src/test/java/test/SpecializationExampleDataClasses.kt deleted file mode 100644 index 38b8d9a8..00000000 --- a/feature/selection-specializations/impl/src/test/java/test/SpecializationExampleDataClasses.kt +++ /dev/null @@ -1,62 +0,0 @@ -package test - -import ru.yeahub.network_api.models.GetSpecializationResponse -import ru.yeahub.network_api.models.GetSpecializationsResponse -import ru.yeahub.selection_specializations.impl.domain.DomainSpecilialization -import ru.yeahub.selection_specializations.impl.domain.DomainSpecilializationListResponse -import ru.yeahub.selection_specializations.impl.presentation.VoSpecilialization - -object SpecializationExampleDataClasses { - val defaultSpecialResponse = GetSpecializationResponse( - id = 0L, - title = "default title num 0", - description = "default description", - imageSrc = null, - createdAt = "01.01.1970", - updatedAt = "01.01.1970" - ) - - val defaultSpecialResponseWithImage = GetSpecializationResponse( - id = 1L, - title = "default title num 1", - description = "default description", - imageSrc = "some image url", - createdAt = "01.01.1970", - updatedAt = "01.01.1970" - ) - - val defaultDomainSpecial = DomainSpecilialization( - id = 0L, - title = "default title num 0" - ) - - val defaultDomainSpecialWithImage = DomainSpecilialization( - id = 1L, - title = "default title num 1" - ) - - val defaultSpecialListResponse = GetSpecializationsResponse( - page = 1L, - limit = 10L, - data = listOf(defaultSpecialResponse, defaultSpecialResponseWithImage), - total = 2L - ) - - val defaultDomainSpecialListResponse = DomainSpecilializationListResponse( - page = 1L, - limit = 10L, - data = listOf(defaultDomainSpecial, defaultDomainSpecialWithImage), - total = 2L - ) - - val defaultVoSpecialization = VoSpecilialization( - id = 0, - title = "default title num 0" - ) - - val defaultVoSpecializationWithImage = VoSpecilialization( - id = 1, - title = "default title num 1" - ) -} - diff --git a/feature/selection-specializations/impl/src/test/java/test/SpecializationSelectionMapperTest.kt b/feature/selection-specializations/impl/src/test/java/test/SpecializationSelectionMapperTest.kt deleted file mode 100644 index 14d957a6..00000000 --- a/feature/selection-specializations/impl/src/test/java/test/SpecializationSelectionMapperTest.kt +++ /dev/null @@ -1,99 +0,0 @@ -package test - -import org.junit.jupiter.api.Assertions.assertEquals -import org.junit.jupiter.params.ParameterizedTest -import org.junit.jupiter.params.provider.ArgumentsSource -import ru.yeahub.network_api.models.GetSpecializationResponse -import ru.yeahub.network_api.models.GetSpecializationsResponse -import ru.yeahub.selection_specializations.impl.data.SpecializationSelectionDataToDomainMapper -import ru.yeahub.selection_specializations.impl.domain.DomainSpecilialization -import ru.yeahub.selection_specializations.impl.domain.DomainSpecilializationListResponse -import ru.yeahub.selection_specializations.impl.presentation.SpecializationSelectionScreenMapper.getScreenState -import ru.yeahub.selection_specializations.impl.presentation.VoSpecilialization -import ru.yeahub.test.TestArgumentsProvider -import test.SpecializationExampleDataClasses.defaultDomainSpecial -import test.SpecializationExampleDataClasses.defaultDomainSpecialListResponse -import test.SpecializationExampleDataClasses.defaultDomainSpecialWithImage -import test.SpecializationExampleDataClasses.defaultSpecialListResponse -import test.SpecializationExampleDataClasses.defaultSpecialResponse -import test.SpecializationExampleDataClasses.defaultSpecialResponseWithImage -import test.SpecializationExampleDataClasses.defaultVoSpecialization -import test.SpecializationExampleDataClasses.defaultVoSpecializationWithImage - -class SpecializationSelectionMapperTest { - private val toDomainMapper = SpecializationSelectionDataToDomainMapper() - - class ArgumentsProvider1 : TestArgumentsProvider(){ - override fun testCases(): List = listOf( - SpecializationSelectionDataToDomainMapperTestCase1( - dataToTest = defaultSpecialResponse, - expectedResult = defaultDomainSpecial - ), - SpecializationSelectionDataToDomainMapperTestCase1( - dataToTest = defaultSpecialResponseWithImage, - expectedResult = defaultDomainSpecialWithImage - ) - ) - } - - class ArgumentsProvider2 : TestArgumentsProvider(){ - override fun testCases(): List = listOf( - SpecializationSelectionDataToDomainMapperTestCase2( - dataToTest = defaultSpecialListResponse, - expectedResult = defaultDomainSpecialListResponse - ) - ) - } - - class ArgumentsProvider3 : TestArgumentsProvider(){ - override fun testCases(): List = listOf( - SpecializationSelectionDomainToVoMapperTestCase( - dataToTest = listOf(defaultDomainSpecial, defaultDomainSpecialWithImage), - expectedResult = listOf(defaultVoSpecialization, defaultVoSpecializationWithImage) - ) - ) - } - - @ParameterizedTest - @ArgumentsSource(ArgumentsProvider1::class) - fun specializationSelectionDataToDomainMapperTestCase1( - testCase1: SpecializationSelectionDataToDomainMapperTestCase1 - ){ - val result = toDomainMapper.dataToDomain(testCase1.dataToTest) - assertEquals(testCase1.expectedResult, result) - } - - @ParameterizedTest - @ArgumentsSource(ArgumentsProvider2::class) - fun specializationSelectionDataToDomainMapperTestCase2( - testCase2: SpecializationSelectionDataToDomainMapperTestCase2 - ){ - val result = toDomainMapper.dataListToDomainList(testCase2.dataToTest) - assertEquals(testCase2.expectedResult, result) - } - - @ParameterizedTest - @ArgumentsSource(ArgumentsProvider3::class) - fun specializationSelectionDomainToVoMapperTestCase( - testCase: SpecializationSelectionDomainToVoMapperTestCase - ){ - val result = getScreenState(testCase.dataToTest) - assertEquals(testCase.expectedResult, result) - } -} - -data class SpecializationSelectionDataToDomainMapperTestCase1( - val dataToTest: GetSpecializationResponse, - val expectedResult: DomainSpecilialization -) - -data class SpecializationSelectionDataToDomainMapperTestCase2( - val dataToTest: GetSpecializationsResponse, - val expectedResult: DomainSpecilializationListResponse -) - -data class SpecializationSelectionDomainToVoMapperTestCase( - val dataToTest: List, - val expectedResult: List -) - From c4a7762b5e2022ac1901b2421acebda3aea2c018 Mon Sep 17 00:00:00 2001 From: PanMobile Date: Mon, 2 Feb 2026 14:36:33 +0300 Subject: [PATCH 11/11] =?UTF-8?q?ANDR-5:=20=D0=9F=D0=B0=D1=80=D0=B0=D0=BC?= =?UTF-8?q?=D0=B5=D1=82=D1=80=D0=B8=D0=B7=D0=B8=D1=80=D0=BE=D0=B2=D0=B0?= =?UTF-8?q?=D0=BD=D0=BD=D1=8B=D0=B5=20=D1=82=D0=B5=D1=81=D1=82=D1=8B=20?= =?UTF-8?q?=D0=B2=D1=8B=D0=BD=D0=B5=D1=81=D0=B5=D0=BD=D1=8B=20=D0=BD=D0=B0?= =?UTF-8?q?=D0=B2=D0=B5=D1=80=D1=85=20=D0=B2=20=D1=81=D0=B0=D0=BC=D0=B8?= =?UTF-8?q?=D1=85=20=D0=BA=D0=BB=D0=B0=D1=81=D1=81=D0=B0=D1=85=20=D1=82?= =?UTF-8?q?=D0=B5=D1=81=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../test/CreateQuizDataToDomainMapperTest.kt | 21 +++++------ .../java/test/CreateQuizScreenMapperTest.kt | 37 +++++++++---------- 2 files changed, 28 insertions(+), 30 deletions(-) diff --git a/feature/interview-trainer/impl/src/test/java/test/CreateQuizDataToDomainMapperTest.kt b/feature/interview-trainer/impl/src/test/java/test/CreateQuizDataToDomainMapperTest.kt index 9f6607fc..c9acfba3 100644 --- a/feature/interview-trainer/impl/src/test/java/test/CreateQuizDataToDomainMapperTest.kt +++ b/feature/interview-trainer/impl/src/test/java/test/CreateQuizDataToDomainMapperTest.kt @@ -13,17 +13,6 @@ import ru.yeahub.test.TestArgumentsProvider class CreateQuizDataToDomainMapperTest { private val toDomainMapper = CreateQuizDataToDomainMapper() - //CreateQuizDataToDomainMapper параметризированный тест - class ArgumentsProvider : - TestArgumentsProvider() { - override fun testCases(): List = listOf( - SpecializationSelectionDataToDomainMapperTestCase( - dataToTest = SpecializationExampleDataClasses.defaultSpecialListResponse, - expectedResult = SpecializationExampleDataClasses.defaultDomainSpecialListResponse - ) - ) - } - @ParameterizedTest @ArgumentsSource(ArgumentsProvider::class) fun specializationSelectionDataToDomainMapperTestCase( @@ -79,4 +68,14 @@ class CreateQuizDataToDomainMapperTest { val dataToTest: GetSpecializationsResponse, val expectedResult: DomainSpecializationListResponse, ) + + class ArgumentsProvider : + TestArgumentsProvider() { + override fun testCases(): List = listOf( + SpecializationSelectionDataToDomainMapperTestCase( + dataToTest = SpecializationExampleDataClasses.defaultSpecialListResponse, + expectedResult = SpecializationExampleDataClasses.defaultDomainSpecialListResponse + ) + ) + } } \ No newline at end of file diff --git a/feature/interview-trainer/impl/src/test/java/test/CreateQuizScreenMapperTest.kt b/feature/interview-trainer/impl/src/test/java/test/CreateQuizScreenMapperTest.kt index d77d2221..a041a7d3 100644 --- a/feature/interview-trainer/impl/src/test/java/test/CreateQuizScreenMapperTest.kt +++ b/feature/interview-trainer/impl/src/test/java/test/CreateQuizScreenMapperTest.kt @@ -10,25 +10,6 @@ import ru.yeahub.test.TestArgumentsProvider class CreateQuizScreenMapperTest { - // CreateQuizScreenMapper параметризированный тест - class ArgumentsProvider : - TestArgumentsProvider() { - override fun testCases(): List = listOf( - CreateQuizScreenMapperTestCase( - specializations = ScreenMapperExampleDataClasses.defaultDomainSpecialList, - selectedSpecializationId = 0L, - questionsCount = 10, - expectedResult = ScreenMapperExampleDataClasses.defaultLoadedState - ), - CreateQuizScreenMapperTestCase( - specializations = ScreenMapperExampleDataClasses.defaultDomainSpecialList, - selectedSpecializationId = 1L, - questionsCount = 5, - expectedResult = ScreenMapperExampleDataClasses.loadedStateWithDifferentSelection - ) - ) - } - @ParameterizedTest @ArgumentsSource(ArgumentsProvider::class) fun getScreenStateTest( @@ -87,4 +68,22 @@ class CreateQuizScreenMapperTest { val questionsCount: Int, val expectedResult: CreateQuizState.Loaded, ) + + class ArgumentsProvider : + TestArgumentsProvider() { + override fun testCases(): List = listOf( + CreateQuizScreenMapperTestCase( + specializations = ScreenMapperExampleDataClasses.defaultDomainSpecialList, + selectedSpecializationId = 0L, + questionsCount = 10, + expectedResult = ScreenMapperExampleDataClasses.defaultLoadedState + ), + CreateQuizScreenMapperTestCase( + specializations = ScreenMapperExampleDataClasses.defaultDomainSpecialList, + selectedSpecializationId = 1L, + questionsCount = 5, + expectedResult = ScreenMapperExampleDataClasses.loadedStateWithDifferentSelection + ) + ) + } } \ No newline at end of file