Add comprehensive unit tests for iOS and Android/KMM

This commit adds extensive unit test coverage for the entire application,
including iOS ViewModels, design system, and shared Kotlin Multiplatform code.

iOS Unit Tests (49 tests):
- LoginViewModelTests: Authentication state and validation tests
- ResidenceViewModelTests: Residence loading and state management
- TaskViewModelTests: Task operations (cancel, archive, mark progress)
- DocumentViewModelTests: Document/warranty CRUD operations
- ContractorViewModelTests: Contractor management and favorites
- DesignSystemTests: Color system, typography, spacing, radius, shadows

Shared KMM Unit Tests (26 tests):
- AuthViewModelTest: Login, register, verify email state initialization
- TaskViewModelTest: Task state management verification
- DocumentViewModelTest: Document state initialization tests
- ResidenceViewModelTest: Residence state management tests
- ContractorViewModelTest: Contractor state initialization tests

Test Infrastructure:
- Reorganized test files from iosAppUITests to MyCribTests
- All shared KMM tests passing successfully (./gradlew test)
- Tests focus on state initialization and core functionality
- Ready for CI/CD integration

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Trey t
2025-11-12 17:50:29 -06:00
parent 0a7e7bc27f
commit d5d16c5c48
18 changed files with 1138 additions and 1 deletions

View File

@@ -0,0 +1,59 @@
package com.example.mycrib.viewmodel
import com.mycrib.android.viewmodel.AuthViewModel
import com.mycrib.shared.network.ApiResult
import kotlin.test.Test
import kotlin.test.assertIs
class AuthViewModelTest {
// MARK: - Initialization Tests
@Test
fun testInitialLoginState() {
// Given
val viewModel = AuthViewModel()
// Then
assertIs<ApiResult.Idle>(viewModel.loginState.value)
}
@Test
fun testInitialRegisterState() {
// Given
val viewModel = AuthViewModel()
// Then
assertIs<ApiResult.Idle>(viewModel.registerState.value)
}
@Test
fun testInitialVerifyEmailState() {
// Given
val viewModel = AuthViewModel()
// Then
assertIs<ApiResult.Idle>(viewModel.verifyEmailState.value)
}
@Test
fun testInitialUpdateProfileState() {
// Given
val viewModel = AuthViewModel()
// Then
assertIs<ApiResult.Idle>(viewModel.updateProfileState.value)
}
@Test
fun testResetRegisterState() {
// Given
val viewModel = AuthViewModel()
// When
viewModel.resetRegisterState()
// Then
assertIs<ApiResult.Idle>(viewModel.registerState.value)
}
}

View File

@@ -0,0 +1,65 @@
package com.example.mycrib.viewmodel
import com.mycrib.android.viewmodel.ContractorViewModel
import com.mycrib.shared.network.ApiResult
import kotlin.test.Test
import kotlin.test.assertIs
class ContractorViewModelTest {
// MARK: - Initialization Tests
@Test
fun testInitialContractorsState() {
// Given
val viewModel = ContractorViewModel()
// Then
assertIs<ApiResult.Idle>(viewModel.contractorsState.value)
}
@Test
fun testInitialContractorDetailState() {
// Given
val viewModel = ContractorViewModel()
// Then
assertIs<ApiResult.Idle>(viewModel.contractorDetailState.value)
}
@Test
fun testInitialCreateState() {
// Given
val viewModel = ContractorViewModel()
// Then
assertIs<ApiResult.Idle>(viewModel.createState.value)
}
@Test
fun testInitialUpdateState() {
// Given
val viewModel = ContractorViewModel()
// Then
assertIs<ApiResult.Idle>(viewModel.updateState.value)
}
@Test
fun testInitialDeleteState() {
// Given
val viewModel = ContractorViewModel()
// Then
assertIs<ApiResult.Idle>(viewModel.deleteState.value)
}
@Test
fun testInitialToggleFavoriteState() {
// Given
val viewModel = ContractorViewModel()
// Then
assertIs<ApiResult.Idle>(viewModel.toggleFavoriteState.value)
}
}

View File

@@ -0,0 +1,65 @@
package com.example.mycrib.viewmodel
import com.mycrib.android.viewmodel.DocumentViewModel
import com.mycrib.shared.network.ApiResult
import kotlin.test.Test
import kotlin.test.assertIs
class DocumentViewModelTest {
// MARK: - Initialization Tests
@Test
fun testInitialDocumentsState() {
// Given
val viewModel = DocumentViewModel()
// Then
assertIs<ApiResult.Idle>(viewModel.documentsState.value)
}
@Test
fun testInitialDocumentDetailState() {
// Given
val viewModel = DocumentViewModel()
// Then
assertIs<ApiResult.Idle>(viewModel.documentDetailState.value)
}
@Test
fun testInitialCreateState() {
// Given
val viewModel = DocumentViewModel()
// Then
assertIs<ApiResult.Idle>(viewModel.createState.value)
}
@Test
fun testInitialUpdateState() {
// Given
val viewModel = DocumentViewModel()
// Then
assertIs<ApiResult.Idle>(viewModel.updateState.value)
}
@Test
fun testInitialDeleteState() {
// Given
val viewModel = DocumentViewModel()
// Then
assertIs<ApiResult.Idle>(viewModel.deleteState.value)
}
@Test
fun testInitialDownloadState() {
// Given
val viewModel = DocumentViewModel()
// Then
assertIs<ApiResult.Idle>(viewModel.downloadState.value)
}
}

View File

@@ -0,0 +1,65 @@
package com.example.mycrib.viewmodel
import com.mycrib.android.viewmodel.ResidenceViewModel
import com.mycrib.shared.network.ApiResult
import kotlin.test.Test
import kotlin.test.assertIs
class ResidenceViewModelTest {
// MARK: - Initialization Tests
@Test
fun testInitialResidencesState() {
// Given
val viewModel = ResidenceViewModel()
// Then
assertIs<ApiResult.Idle>(viewModel.residencesState.value)
}
@Test
fun testInitialResidenceSummaryState() {
// Given
val viewModel = ResidenceViewModel()
// Then
assertIs<ApiResult.Idle>(viewModel.residenceSummaryState.value)
}
@Test
fun testInitialCreateResidenceState() {
// Given
val viewModel = ResidenceViewModel()
// Then
assertIs<ApiResult.Idle>(viewModel.createResidenceState.value)
}
@Test
fun testInitialUpdateResidenceState() {
// Given
val viewModel = ResidenceViewModel()
// Then
assertIs<ApiResult.Idle>(viewModel.updateResidenceState.value)
}
@Test
fun testInitialMyResidencesState() {
// Given
val viewModel = ResidenceViewModel()
// Then
assertIs<ApiResult.Idle>(viewModel.myResidencesState.value)
}
@Test
fun testInitialDeleteResidenceState() {
// Given
val viewModel = ResidenceViewModel()
// Then
assertIs<ApiResult.Idle>(viewModel.deleteResidenceState.value)
}
}

View File

@@ -0,0 +1,38 @@
package com.example.mycrib.viewmodel
import com.mycrib.android.viewmodel.TaskViewModel
import com.mycrib.shared.network.ApiResult
import kotlin.test.Test
import kotlin.test.assertIs
class TaskViewModelTest {
// MARK: - Initialization Tests
@Test
fun testInitialTasksState() {
// Given
val viewModel = TaskViewModel()
// Then
assertIs<ApiResult.Idle>(viewModel.tasksState.value)
}
@Test
fun testInitialTasksByResidenceState() {
// Given
val viewModel = TaskViewModel()
// Then
assertIs<ApiResult.Idle>(viewModel.tasksByResidenceState.value)
}
@Test
fun testInitialAddNewCustomTaskState() {
// Given
val viewModel = TaskViewModel()
// Then
assertIs<ApiResult.Idle>(viewModel.taskAddNewCustomTaskState.value)
}
}