feat(tickets): suppression d'un ticket (backend + frontend)
Ajoute la suppression complète d'un ticket (#6). Backend Rust : - port IssueStore::delete (NotFound si absent) + event IssueDeleted{freed_sprint} - FsIssueStore::delete : supprime .ideai/tickets/<N>/ et l'index sous lock - use case DeleteIssue + adaptations des tests sprint/ticket_assistant au port - commande Tauri ticket_delete + câblage events/state/lib Frontend : - gateway delete (ports, adapter ticket + mock, domain) - useTicketDetail : retrait de la liste et fermeture du détail via event issueDeleted - intégration TicketDetail + tests Tests verts : application/issue_usecases (6), infrastructure/issue_store (7), app-tauri --lib (56), frontend vitest (503), npm run build (exit 0). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@ -182,6 +182,46 @@ async fn issue_store_persists_and_filters_sprint_membership() {
|
||||
assert_eq!(rows[0].sprint, Some(sprint_id));
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn issue_store_delete_removes_files_and_index_entry() {
|
||||
let tmp = TempDir::new();
|
||||
let root = tmp.root();
|
||||
let store = FsIssueStore::new();
|
||||
store
|
||||
.create(&root, &issue(&root, 1, "Delete me"))
|
||||
.await
|
||||
.unwrap();
|
||||
std::fs::write(tmp.child(".ideai/tickets/1/attachment.txt"), "payload").unwrap();
|
||||
|
||||
store
|
||||
.delete(&root, IssueRef::from_str("#1").unwrap())
|
||||
.await
|
||||
.unwrap();
|
||||
|
||||
assert!(!tmp.child(".ideai/tickets/1/issue.md").exists());
|
||||
assert!(!tmp.child(".ideai/tickets/1/carnet.md").exists());
|
||||
assert!(!tmp.child(".ideai/tickets/1/attachment.txt").exists());
|
||||
assert!(!tmp.child(".ideai/tickets/1").exists());
|
||||
let rows = store.list(&root, IssueListFilter::default()).await.unwrap();
|
||||
assert!(rows.is_empty());
|
||||
let index = std::fs::read_to_string(tmp.child(".ideai/tickets/index.json")).unwrap();
|
||||
assert!(!index.contains("\"issueRef\": \"#1\""));
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn issue_store_delete_returns_not_found_when_absent() {
|
||||
let tmp = TempDir::new();
|
||||
let root = tmp.root();
|
||||
let store = FsIssueStore::new();
|
||||
|
||||
let err = store
|
||||
.delete(&root, IssueRef::from_str("#404").unwrap())
|
||||
.await
|
||||
.unwrap_err();
|
||||
|
||||
assert!(matches!(err, IssueStoreError::NotFound));
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn allocator_never_reuses_numbers() {
|
||||
let tmp = TempDir::new();
|
||||
|
||||
Reference in New Issue
Block a user