@@ -198,20 +198,18 @@ fn delete_group_keeps_notes() {
198198 group_id : Some ( g. id ) ,
199199 } )
200200 . expect ( "note" ) ;
201- // Act
202- db. with_conn ( |conn| {
203- conn. execute ( "DELETE FROM note_groups WHERE id = ?1" , rusqlite:: params![ g. id] )
204- . map_err ( Into :: into)
205- } )
206- . expect ( "delete" ) ;
201+ // Act:走新 API(R-低8:原裸 SQL 直删与 delete_group_cascades 重叠——
202+ // 改经被测代码的真实删除路径,SET NULL 断言覆盖新 API)
203+ assert ! ( db. delete_group( g. id) . expect( "delete" ) ) ;
207204 // Assert:笔记存活且 group_id 置空(ON DELETE SET NULL)
208205 let fetched = db. get_note ( note. id ) . expect ( "get" ) . expect ( "exists" ) ;
209206 assert_eq ! ( fetched. group_id, None ) ;
210207}
211208
212209#[ test]
213210fn group_delete_impact_counts_six_dimensions ( ) {
214- // Arrange:组内挂 2 笔记 + 1 碎片 + 1 卡 + 1 结算 + 1 契约;体系引用 2 条
211+ // Arrange:组内挂 2 笔记 + 1 碎片 + 1 卡 + 1 结算 + 1 契约;
212+ // 体系引用 2 条(note_group 直引)+ 1 条 flashcard 间接引(R-中1)
215213 let db = mem_db ( ) ;
216214 let g = db. create_group ( & group ( "将删" ) ) . expect ( "create" ) ;
217215 for title in [ "A" , "B" ] {
@@ -236,17 +234,18 @@ fn group_delete_impact_counts_six_dimensions() {
236234 source : "manual" . to_string ( ) ,
237235 } )
238236 . expect ( "frag" ) ;
239- db. create_card ( & NewFlashcard {
240- group_id : g. id ,
241- note_id : None ,
242- fragment_id : None ,
243- front : "f" . to_string ( ) ,
244- back : "b" . to_string ( ) ,
245- kind : "fact" . to_string ( ) ,
246- state_json : "{}" . to_string ( ) ,
247- due_at : 0 ,
248- } )
249- . expect ( "card" ) ;
237+ let card = db
238+ . create_card ( & NewFlashcard {
239+ group_id : g. id ,
240+ note_id : None ,
241+ fragment_id : None ,
242+ front : "f" . to_string ( ) ,
243+ back : "b" . to_string ( ) ,
244+ kind : "fact" . to_string ( ) ,
245+ state_json : "{}" . to_string ( ) ,
246+ due_at : 0 ,
247+ } )
248+ . expect ( "card" ) ;
250249 db. create_settlement ( g. id , "{}" ) . expect ( "settlement" ) ;
251250 db. upsert_week_contract ( g. id , 1 , 3 , 5 ) . expect ( "contract" ) ;
252251 let sys = db
@@ -268,20 +267,30 @@ fn group_delete_impact_counts_six_dimensions() {
268267 } )
269268 . expect ( "link" ) ;
270269 }
270+ db. add_knowledge_link ( & NewKnowledgeLink {
271+ system_id : sys. id ,
272+ node_id : None ,
273+ concept_id : None ,
274+ model_id : None ,
275+ target_type : "flashcard" . to_string ( ) ,
276+ target_id : card. id ,
277+ } )
278+ . expect ( "link" ) ;
271279 // Act
272280 let impact = db. group_delete_impact ( g. id ) . expect ( "impact" ) ;
273- // Assert:六项计数如实(确认弹窗数据源口径)
281+ // Assert:六项计数如实(确认弹窗数据源口径;system_refs 含两类引用 )
274282 assert_eq ! ( impact. notes, 2 ) ;
275283 assert_eq ! ( impact. fragments, 1 ) ;
276284 assert_eq ! ( impact. cards, 1 ) ;
277285 assert_eq ! ( impact. settlements, 1 ) ;
278286 assert_eq ! ( impact. contracts, 1 ) ;
279- assert_eq ! ( impact. system_refs, 2 ) ;
287+ assert_eq ! ( impact. system_refs, 3 ) ;
280288}
281289
282290#[ test]
283291fn delete_group_cascades_and_clears_links ( ) {
284- // Arrange:1 笔记 + 1 碎片 + 1 卡 + 1 契约 + 1 体系引用(级联影响面最小集)
292+ // Arrange:1 笔记 + 1 碎片 + 1 卡 + 1 契约 + note_group/fashcard 引用各 1
293+ //(级联影响面最小集;R-中1:flashcard 间接引用必须一并清理)
285294 let db = mem_db ( ) ;
286295 let g = db. create_group ( & group ( "将删" ) ) . expect ( "create" ) ;
287296 let note = db
@@ -305,17 +314,18 @@ fn delete_group_cascades_and_clears_links() {
305314 source : "manual" . to_string ( ) ,
306315 } )
307316 . expect ( "frag" ) ;
308- db. create_card ( & NewFlashcard {
309- group_id : g. id ,
310- note_id : None ,
311- fragment_id : None ,
312- front : "f" . to_string ( ) ,
313- back : "b" . to_string ( ) ,
314- kind : "fact" . to_string ( ) ,
315- state_json : "{}" . to_string ( ) ,
316- due_at : 0 ,
317- } )
318- . expect ( "card" ) ;
317+ let card = db
318+ . create_card ( & NewFlashcard {
319+ group_id : g. id ,
320+ note_id : None ,
321+ fragment_id : None ,
322+ front : "f" . to_string ( ) ,
323+ back : "b" . to_string ( ) ,
324+ kind : "fact" . to_string ( ) ,
325+ state_json : "{}" . to_string ( ) ,
326+ due_at : 0 ,
327+ } )
328+ . expect ( "card" ) ;
319329 db. upsert_week_contract ( g. id , 1 , 3 , 5 ) . expect ( "contract" ) ;
320330 let sys = db
321331 . create_knowledge_system ( & NewKnowledgeSystem {
@@ -333,10 +343,19 @@ fn delete_group_cascades_and_clears_links() {
333343 target_type : "note_group" . to_string ( ) ,
334344 target_id : g. id ,
335345 } )
336- . expect ( "link" ) ;
346+ . expect ( "group link" ) ;
347+ db. add_knowledge_link ( & NewKnowledgeLink {
348+ system_id : sys. id ,
349+ node_id : None ,
350+ concept_id : None ,
351+ model_id : None ,
352+ target_type : "flashcard" . to_string ( ) ,
353+ target_id : card. id ,
354+ } )
355+ . expect ( "card link" ) ;
337356 // Act
338357 let ok = db. delete_group ( g. id ) . expect ( "delete" ) ;
339- // Assert:组消失;笔记/碎片 SET NULL 存活;卡/契约 CASCADE 归零;引用清理
358+ // Assert:组消失;笔记/碎片 SET NULL 存活;卡/契约 CASCADE 归零;两类引用清理
340359 assert ! ( ok) ;
341360 assert ! ( db. get_group( g. id) . expect( "get" ) . is_none( ) ) ;
342361 assert_eq ! ( db. get_note( note. id) . expect( "get" ) . expect( "note" ) . group_id, None ) ;
@@ -355,6 +374,7 @@ fn delete_group_cascades_and_clears_links() {
355374 . expect ( "counts" ) ;
356375 assert_eq ! ( counts, ( 0 , 0 , 0 ) ) ;
357376 assert ! ( db. list_links_by_target( "note_group" , g. id) . expect( "links" ) . is_empty( ) ) ;
377+ assert ! ( db. list_links_by_target( "flashcard" , card. id) . expect( "card links" ) . is_empty( ) ) ;
358378}
359379
360380#[ test]
0 commit comments