Files
cleveragents-core/features/legacy_migrator_coverage.feature
freemo 1d18aa80ca fix(database): replace type: ignore with assert for type narrowing in LegacyDataMigrator
Remove the unsafe `# type: ignore` suppression on line 111 of
`legacy_migrator.py` and replace it with an explicit
`assert existing_plan.id is not None` statement. This provides
proper type narrowing to the type checker while preserving the
logical correctness guaranteed by the preceding `if existing_plan:`
guard.

Also adds a new BDD scenario in `legacy_migrator_coverage.feature`
that explicitly exercises the code path where an existing plan with
a non-None id is found during migration, verifying the assert-based
type narrowing works correctly end-to-end.

ISSUES CLOSED: #3051
2026-05-30 10:38:39 -04:00

221 lines
9.5 KiB
Gherkin

Feature: Legacy Data Migrator Coverage
As a developer maintaining the CleverAgents system
I want comprehensive tests for the legacy data migrator
So that migration from JSON files to SQLite works reliably
Background:
Given I have a temporary test directory for legacy migration
And I have a Unit of Work instance for testing
Scenario: Migrate project with all legacy JSON files
Given I have a legacy project with all JSON files
When I run the legacy data migration
Then the migration should return true
And the JSON files should be backed up
And the database should contain the migrated project data
And the database should contain the migrated plans
And the database should contain the migrated contexts
And the database should contain the migrated changes
Scenario: No migration needed when no cleveragents directory
Given I have a project path without .cleveragents directory
When I run the legacy data migration
Then the migration should return false
Scenario: No migration needed when no JSON files exist
Given I have a project with .cleveragents directory but no JSON files
When I run the legacy data migration
Then the migration should return false
Scenario: Migrate project with only plans.json
Given I have a legacy project with only plans.json file
When I run the legacy data migration
Then the migration should return true
And the plans.json file should be backed up
And the database should contain the migrated plans
Scenario: Migrate project with contexts.json and minimal plan
Given I have a legacy project with only contexts.json file for current plan
When I run the legacy data migration
Then the migration should return true
And the plans.json file should be backed up
And the contexts.json file should be backed up
And the database should contain the migrated contexts
Scenario: Migrate project with changes.json and minimal plan
Given I have a legacy project with only changes.json file for current plan
When I run the legacy data migration
Then the migration should return true
And the plans.json file should be backed up
And the changes.json file should be backed up
And the database should contain the migrated changes
Scenario: Handle existing project in database
Given I have an existing project in the database for legacy migration
And I have a legacy project with matching name
When I run the legacy data migration
Then the migration should use the existing project
And the migration should return true
Scenario: Create new project when not in database
Given I have a legacy project without database entry
When I run the legacy data migration
Then a new project should be created in the database
And the migration should return true
Scenario: Handle project without project.name file
Given I have a legacy project without project.name file
When I run the legacy data migration
Then the project name should use the directory name
And the migration should return true
Scenario: Skip existing plans during migration
Given I have a legacy project with plans already in database
When I run the legacy data migration
Then existing plans should not be duplicated
And the migration should return true
Scenario: Map plan status values correctly
Given I have a LegacyDataMigrator instance
When I map plan status "OVERLOADED" to enum
Then the migrator result should be PlanStatus.PENDING
When I map plan status "pending" to enum
Then the migrator result should be PlanStatus.PENDING
When I map plan status "building" to enum
Then the migrator result should be PlanStatus.BUILDING
When I map plan status "built" to enum
Then the migrator result should be PlanStatus.BUILT
When I map plan status "failed" to enum
Then the migrator result should be PlanStatus.ERROR
When I map plan status "applied" to enum
Then the migrator result should be PlanStatus.APPLIED
When I map plan status "unknown" to enum
Then the migrator result should be PlanStatus.PENDING
Scenario: Map plan build data correctly
Given I have a LegacyDataMigrator instance
When I map plan build data with valid dictionary
Then the migrator result should be None
When I map plan build data with None
Then the migrator result should be None
When I map plan build data with empty dictionary
Then the migrator result should be None
When I map plan build data with non-dict value
Then the migrator result should be None
Scenario: Map context type values correctly
Given I have a LegacyDataMigrator instance
When I map context type "file" to enum
Then the migrator result should be ContextType.FILE
When I map context type "directory" to enum
Then the migrator result should be ContextType.DIRECTORY
When I map context type "url" to enum
Then the migrator result should be ContextType.URL
When I map context type "document" to enum
Then the migrator result should be ContextType.NOTE
When I map context type "unknown" to enum
Then the migrator result should be ContextType.FILE
Scenario: Map operation values correctly
Given I have a LegacyDataMigrator instance
When I map operation "create" to enum
Then the migrator result should be OperationType.CREATE
When I map operation "modify" to enum
Then the migrator result should be OperationType.MODIFY
When I map operation "delete" to enum
Then the migrator result should be OperationType.DELETE
When I map operation "rename" to enum
Then the migrator result should be OperationType.MOVE
When I map operation "unknown" to enum
Then the migrator result should be OperationType.CREATE
Scenario: Parse datetime strings correctly
Given I have a LegacyDataMigrator instance
When I parse datetime string "2024-01-15T10:30:45"
Then the migrator result should be a valid datetime object
When I parse datetime string "2024-01-15 10:30:45"
Then the migrator result should be a valid datetime object
When I parse datetime string None
Then the migrator result should be None
When I parse datetime string "invalid-date"
Then the migrator result should be None
When I parse datetime string ""
Then the migrator result should be None
Scenario: Set current plan during migration
Given I have a legacy project with multiple plans
And one plan is marked as current
When I run the legacy data migration
Then the current plan should be set in the project
And the migration should return true
Scenario: Handle contexts without current plan
Given I have a legacy project with contexts but no current plan
When I run the legacy data migration
Then the contexts should not be migrated
And the migration should return true
Scenario: Handle changes without current plan
Given I have a legacy project with changes but no current plan
When I run the legacy data migration
Then the changes should not be migrated
And the migration should return true
Scenario: Migrate contexts successfully
Given I have a legacy project with contexts to migrate
When I run the legacy data migration
Then the contexts should be migrated successfully
And the migration should return true
Scenario: Handle plan with all optional fields
Given I have a legacy project with plan containing all fields
When I run the legacy data migration
Then all plan fields should be migrated correctly
And the migration should return true
Scenario: Handle plan with minimal fields
Given I have a legacy project with plan containing minimal fields
When I run the legacy data migration
Then the plan should be migrated with defaults
And the migration should return true
Scenario: Use check_and_migrate_legacy_data function
Given I have a legacy project with JSON files
When I call check_and_migrate_legacy_data function
Then the function should return true
And the migration should be performed
Scenario: Map uppercase status values correctly
Given I have a LegacyDataMigrator instance
When I map plan status "PENDING" to enum
Then the migrator result should be PlanStatus.PENDING
When I map plan status "BUILDING" to enum
Then the migrator result should be PlanStatus.BUILDING
When I map plan status "BUILT" to enum
Then the migrator result should be PlanStatus.BUILT
Scenario: Handle invalid JSON files gracefully
Given I have a legacy project with invalid JSON files
When I run the legacy data migration
Then the migration should handle errors gracefully
And the migration should return false
Scenario: Handle file system errors during backup
Given I have a legacy project with read-only JSON files
When I run the legacy data migration
Then the migration should handle backup errors gracefully
Scenario: get_all_for_project is called only once for multiple plans
Given I have a legacy project with multiple plans to migrate efficiently
When I run the legacy data migration with query tracking
Then get_all_for_project should be called exactly once
And the migration should return true
And all plans should be migrated correctly
Scenario: Map existing plan IDs correctly during migration
Given I have a legacy project with plans already in database
When I run the legacy data migration
Then existing plans should not be duplicated
And the migration should return true
And the existing plan id should be mapped without type suppression