test: adjust restart count after cascade delete
This commit is contained in:
@@ -733,6 +733,14 @@ function listFootprints(d, query) {
|
|||||||
d.prepare("INSERT INTO footprint_fts(footprint_fts, rowid, search_text) SELECT 'delete', id, search_text FROM footprint WHERE id=?")
|
d.prepare("INSERT INTO footprint_fts(footprint_fts, rowid, search_text) SELECT 'delete', id, search_text FROM footprint WHERE id=?")
|
||||||
.run(payload.id);
|
.run(payload.id);
|
||||||
softDelete(d, 'footprint', payload.id);
|
softDelete(d, 'footprint', payload.id);
|
||||||
|
// 级联清理附件:墓碑(同步到其他端)+ 磁盘原图/缩略图
|
||||||
|
const atts = d.prepare("SELECT * FROM attachment WHERE owner_type='footprint' AND owner_id=? AND deleted_at IS NULL").all(payload.id);
|
||||||
|
for (const a of atts) {
|
||||||
|
softDelete(d, 'attachment', a.id);
|
||||||
|
for (const rel of [a.rel_path, a.thumb_rel_path]) {
|
||||||
|
if (rel) { try { fs.unlinkSync(path.join(DATA_DIR, rel)); } catch {} }
|
||||||
|
}
|
||||||
|
}
|
||||||
});
|
});
|
||||||
return { ok: true };
|
return { ok: true };
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -70,6 +70,11 @@ const attThumb = await api(A, 'POST', '/api/attachment_thumb', { id: attAdd.body
|
|||||||
ok(attThumb.body?.data?.data_b64 === Buffer.from('THUMBWEBPDATA').toString('base64'), 'attachment_thumb 返回缩略图内容', attThumb.body);
|
ok(attThumb.body?.data?.data_b64 === Buffer.from('THUMBWEBPDATA').toString('base64'), 'attachment_thumb 返回缩略图内容', attThumb.body);
|
||||||
const attRead2 = await api(A, 'POST', '/api/attachment_read', { id: attAdd.body?.data?.item?.id }, T);
|
const attRead2 = await api(A, 'POST', '/api/attachment_read', { id: attAdd.body?.data?.item?.id }, T);
|
||||||
ok(attRead2.body?.data?.data_b64 === Buffer.from('ORIGDATA').toString('base64'), 'attachment_read 原图不受影响', attRead2.body);
|
ok(attRead2.body?.data?.data_b64 === Buffer.from('ORIGDATA').toString('base64'), 'attachment_read 原图不受影响', attRead2.body);
|
||||||
|
// 删除整条记录 → 附件级联清理
|
||||||
|
const fpDel = await api(A, 'POST', '/api/footprint_delete', { id: fpId }, T);
|
||||||
|
ok(fpDel.body?.ok === true, '删除整条记录');
|
||||||
|
const attAfter = await api(A, 'POST', '/api/attachment_list', { owner_id: fpId }, T);
|
||||||
|
ok((attAfter.body?.data?.items || []).length === 0, '记录删除后附件级联清空', attAfter.body);
|
||||||
|
|
||||||
// 邀请码:增
|
// 邀请码:增
|
||||||
const c1 = await api(A, 'POST', '/admin/invites/create', { code: 'xiong-friend-2025', remark: '给学弟的码' }, T);
|
const c1 = await api(A, 'POST', '/admin/invites/create', { code: 'xiong-friend-2025', remark: '给学弟的码' }, T);
|
||||||
@@ -111,7 +116,7 @@ const login2 = await api(B, 'POST', '/auth/login', { username: 'demo', password:
|
|||||||
ok(login2.status === 200, '重启后 demo 可登录');
|
ok(login2.status === 200, '重启后 demo 可登录');
|
||||||
const T2 = login2.body.data.token;
|
const T2 = login2.body.data.token;
|
||||||
const fp2 = await api(B, 'POST', '/api/footprint_list', { query: { page: 1, page_size: 50 } }, T2);
|
const fp2 = await api(B, 'POST', '/api/footprint_list', { query: { page: 1, page_size: 50 } }, T2);
|
||||||
ok(fp2.body?.data?.total === 17, '重启后仍是 17 条(无重复播种)', fp2.body?.data?.total);
|
ok(fp2.body?.data?.total === 16, '重启后仍是 16 条(测试足迹已被级联删除)', fp2.body?.data?.total);
|
||||||
const list2 = (await api(B, 'GET', '/admin/invites', undefined, T2)).body.data.invites;
|
const list2 = (await api(B, 'GET', '/admin/invites', undefined, T2)).body.data.invites;
|
||||||
ok(list2.some((i) => i.code === 'XIONG-FRIEND-2025'), '邀请码跨重启持久化');
|
ok(list2.some((i) => i.code === 'XIONG-FRIEND-2025'), '邀请码跨重启持久化');
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user