Add onboarding UI tests and improve app data management

- Add Suite0_OnboardingTests with fresh install and login test flows
- Add accessibility identifiers to onboarding views for UI testing
- Remove deprecated DataCache in favor of unified DataManager
- Update API layer to support public upgrade-triggers endpoint
- Improve onboarding first task view with better date handling
- Update various views with accessibility identifiers for testing
- Fix subscription feature comparison view layout
- Update document detail view improvements

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

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Trey t
2025-12-04 15:55:34 -06:00
parent 43f5b9514f
commit fff1032c29
43 changed files with 1055 additions and 923 deletions

View File

@@ -21,7 +21,7 @@ import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import androidx.lifecycle.viewmodel.compose.viewModel
import com.example.casera.cache.DataCache
import com.example.casera.data.DataManager
import com.example.casera.ui.components.AddContractorDialog
import com.example.casera.ui.components.ApiResultHandler
import com.example.casera.ui.components.HandleErrors
@@ -117,7 +117,7 @@ fun ContractorDetailScreen(
.background(Color(0xFFF9FAFB))
) {
val uriHandler = LocalUriHandler.current
val residences = DataCache.residences.value
val residences = DataManager.residences.value
ApiResultHandler(
state = contractorState,

View File

@@ -34,7 +34,7 @@ import com.example.casera.network.ApiResult
import com.example.casera.utils.SubscriptionHelper
import com.example.casera.ui.subscription.UpgradePromptDialog
import com.example.casera.cache.SubscriptionCache
import com.example.casera.cache.DataCache
import com.example.casera.data.DataManager
import com.example.casera.util.DateUtils
import casera.composeapp.generated.resources.*
import org.jetbrains.compose.resources.stringResource
@@ -77,7 +77,7 @@ fun ResidenceDetailScreen(
var upgradeTriggerKey by remember { mutableStateOf<String?>(null) }
// Get current user for ownership checks
val currentUser by DataCache.currentUser.collectAsState()
val currentUser by DataManager.currentUser.collectAsState()
// Check if tasks are blocked (limit=0) - this hides the FAB
val isTasksBlocked = SubscriptionHelper.isTasksBlocked()

View File

@@ -28,14 +28,14 @@ import com.example.casera.ui.theme.AppRadius
import com.example.casera.ui.theme.AppSpacing
import com.example.casera.viewmodel.OnboardingViewModel
import casera.composeapp.generated.resources.*
import kotlinx.datetime.Clock
import kotlinx.datetime.TimeZone
import kotlinx.datetime.toLocalDateTime
import com.example.casera.util.DateUtils
import org.jetbrains.compose.resources.stringResource
import java.util.UUID
import kotlin.random.Random
private fun generateId(): String = Random.nextLong().toString(36)
data class OnboardingTaskTemplate(
val id: UUID = UUID.randomUUID(),
val id: String = generateId(),
val icon: ImageVector,
val title: String,
val category: String,
@@ -43,7 +43,7 @@ data class OnboardingTaskTemplate(
)
data class OnboardingTaskCategory(
val id: UUID = UUID.randomUUID(),
val id: String = generateId(),
val name: String,
val icon: ImageVector,
val color: Color,
@@ -56,8 +56,8 @@ fun OnboardingFirstTaskContent(
onTasksAdded: () -> Unit
) {
val maxTasksAllowed = 5
var selectedTaskIds by remember { mutableStateOf(setOf<UUID>()) }
var expandedCategoryId by remember { mutableStateOf<UUID?>(null) }
var selectedTaskIds by remember { mutableStateOf(setOf<String>()) }
var expandedCategoryId by remember { mutableStateOf<String?>(null) }
var isCreatingTasks by remember { mutableStateOf(false) }
val createTasksState by viewModel.createTasksState.collectAsState()
@@ -328,10 +328,7 @@ fun OnboardingFirstTaskContent(
val residences = DataManager.residences.value
val residence = residences.firstOrNull()
if (residence != null) {
val today = Clock.System.now()
.toLocalDateTime(TimeZone.currentSystemDefault())
.date
.toString()
val today = DateUtils.getTodayString()
val selectedTemplates = allTasks.filter { it.id in selectedTaskIds }
val taskRequests = selectedTemplates.map { template ->
@@ -397,11 +394,11 @@ fun OnboardingFirstTaskContent(
@Composable
private fun TaskCategorySection(
category: OnboardingTaskCategory,
selectedTaskIds: Set<UUID>,
selectedTaskIds: Set<String>,
isExpanded: Boolean,
isAtMaxSelection: Boolean,
onToggleExpand: () -> Unit,
onToggleTask: (UUID) -> Unit
onToggleTask: (String) -> Unit
) {
val selectedInCategory = category.tasks.count { it.id in selectedTaskIds }