@@ -378,18 +378,29 @@ mod tests {
378378
379379 #[ tokio:: test]
380380 async fn start_task_validates_transition ( ) {
381- // Setup: create epic + task in todo state, then start it (should succeed),
382- // then try to start again from in_progress (should fail with CONFLICT).
383381 let ( _tmp, runtime, event_bus) = test_setup ( ) ;
384382 let ( state, _cancel) = create_state ( runtime, event_bus) . await . unwrap ( ) ;
385- state. db . execute (
386- "INSERT INTO epics (id, title, status, file_path, created_at, updated_at) VALUES ('fn-1', 'E', 'open', 'e.md', '2025-01-01T00:00:00Z', '2025-01-01T00:00:00Z')" ,
387- ( ) ,
388- ) . await . unwrap ( ) ;
389- state. db . execute (
390- "INSERT INTO tasks (id, epic_id, title, status, domain, file_path, created_at, updated_at) VALUES ('fn-1.1', 'fn-1', 'T', 'todo', 'general', 't.md', '2025-01-01T00:00:00Z', '2025-01-01T00:00:00Z')" ,
391- ( ) ,
392- ) . await . unwrap ( ) ;
383+ // Create epic + task via json_store
384+ use chrono:: Utc ;
385+ let epic = flowctl_core:: types:: Epic {
386+ schema_version : 1 , id : "fn-1" . into ( ) , title : "E" . into ( ) ,
387+ status : flowctl_core:: types:: EpicStatus :: Open ,
388+ branch_name : None , plan_review : flowctl_core:: types:: ReviewStatus :: Unknown ,
389+ completion_review : flowctl_core:: types:: ReviewStatus :: Unknown ,
390+ depends_on_epics : vec ! [ ] , default_impl : None , default_review : None ,
391+ default_sync : None , auto_execute_pending : None , auto_execute_set_at : None ,
392+ archived : false , file_path : None , created_at : Utc :: now ( ) , updated_at : Utc :: now ( ) ,
393+ } ;
394+ flowctl_core:: json_store:: epic_write ( & state. flow_dir , & epic) . unwrap ( ) ;
395+ let task = flowctl_core:: types:: Task {
396+ schema_version : 1 , id : "fn-1.1" . into ( ) , epic : "fn-1" . into ( ) , title : "T" . into ( ) ,
397+ status : flowctl_core:: Status :: Todo , priority : None ,
398+ domain : flowctl_core:: types:: Domain :: General , depends_on : vec ! [ ] ,
399+ files : vec ! [ ] , r#impl : None , review : None , sync : None , file_path : None ,
400+ created_at : Utc :: now ( ) , updated_at : Utc :: now ( ) ,
401+ } ;
402+ flowctl_core:: json_store:: task_write_definition ( & state. flow_dir , & task) . unwrap ( ) ;
403+ flowctl_core:: json_store:: state_write ( & state. flow_dir , "fn-1.1" , & flowctl_core:: json_store:: TaskState :: default ( ) ) . unwrap ( ) ;
393404 let app = build_router ( state. clone ( ) ) ;
394405
395406 // Start: todo → in_progress (should succeed)
@@ -429,14 +440,26 @@ mod tests {
429440 async fn done_task_rejects_from_todo ( ) {
430441 let ( _tmp, runtime, event_bus) = test_setup ( ) ;
431442 let ( state, _cancel) = create_state ( runtime, event_bus) . await . unwrap ( ) ;
432- state. db . execute (
433- "INSERT INTO epics (id, title, status, file_path, created_at, updated_at) VALUES ('fn-2', 'E', 'open', 'e.md', '2025-01-01T00:00:00Z', '2025-01-01T00:00:00Z')" ,
434- ( ) ,
435- ) . await . unwrap ( ) ;
436- state. db . execute (
437- "INSERT INTO tasks (id, epic_id, title, status, domain, file_path, created_at, updated_at) VALUES ('fn-2.1', 'fn-2', 'T', 'todo', 'general', 't.md', '2025-01-01T00:00:00Z', '2025-01-01T00:00:00Z')" ,
438- ( ) ,
439- ) . await . unwrap ( ) ;
443+ use chrono:: Utc ;
444+ let epic = flowctl_core:: types:: Epic {
445+ schema_version : 1 , id : "fn-2" . into ( ) , title : "E" . into ( ) ,
446+ status : flowctl_core:: types:: EpicStatus :: Open ,
447+ branch_name : None , plan_review : flowctl_core:: types:: ReviewStatus :: Unknown ,
448+ completion_review : flowctl_core:: types:: ReviewStatus :: Unknown ,
449+ depends_on_epics : vec ! [ ] , default_impl : None , default_review : None ,
450+ default_sync : None , auto_execute_pending : None , auto_execute_set_at : None ,
451+ archived : false , file_path : None , created_at : Utc :: now ( ) , updated_at : Utc :: now ( ) ,
452+ } ;
453+ flowctl_core:: json_store:: epic_write ( & state. flow_dir , & epic) . unwrap ( ) ;
454+ let task = flowctl_core:: types:: Task {
455+ schema_version : 1 , id : "fn-2.1" . into ( ) , epic : "fn-2" . into ( ) , title : "T" . into ( ) ,
456+ status : flowctl_core:: Status :: Todo , priority : None ,
457+ domain : flowctl_core:: types:: Domain :: General , depends_on : vec ! [ ] ,
458+ files : vec ! [ ] , r#impl : None , review : None , sync : None , file_path : None ,
459+ created_at : Utc :: now ( ) , updated_at : Utc :: now ( ) ,
460+ } ;
461+ flowctl_core:: json_store:: task_write_definition ( & state. flow_dir , & task) . unwrap ( ) ;
462+ flowctl_core:: json_store:: state_write ( & state. flow_dir , "fn-2.1" , & flowctl_core:: json_store:: TaskState :: default ( ) ) . unwrap ( ) ;
440463 let app = build_router ( state) ;
441464
442465 // done from todo → should be rejected
0 commit comments