test(dm): assert JOIN users guard drops orphan author in DM membership backfill (S5 review)
This commit is contained in:
@@ -44,4 +44,23 @@ describe('backfillOneOnOneDmMembership', () => {
|
||||
expect(memberCount('healthy')).toBe(2);
|
||||
expect(memberCount('unrecoverable')).toBe(1);
|
||||
});
|
||||
|
||||
it('does NOT re-add an author whose users row is gone (JOIN users guard — no FK-violating INSERT at boot)', () => {
|
||||
insUser('survivor');
|
||||
insDm('orphan'); insMember('orphan', 'survivor');
|
||||
// Author 'ghost' has NO users row — an orphan message whose identity is gone.
|
||||
// SQLite FK enforcement is per-connection and only checks at write time; it
|
||||
// never re-validates pre-existing rows. So on disk such an orphan message can
|
||||
// exist even with FKs on. Reproduce that by seeding it with FKs momentarily
|
||||
// off, then restore enforcement so the backfill runs under real boot pragmas.
|
||||
db.pragma('foreign_keys = OFF');
|
||||
insMsg('m1', 'orphan', 'ghost');
|
||||
db.pragma('foreign_keys = ON');
|
||||
insMsg('m2', 'orphan', 'survivor');
|
||||
backfillOneOnOneDmMembership(db);
|
||||
// The JOIN users guard drops 'ghost' → nothing restored, member count stays 1.
|
||||
// (A blind re-insert would raise "FOREIGN KEY constraint failed" here.)
|
||||
expect(memberCount('orphan')).toBe(1);
|
||||
expect(db.prepare('SELECT 1 FROM dm_members WHERE dm_channel_id=? AND user_id=?').get('orphan', 'ghost')).toBeUndefined();
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user