Merge main into fix-reporting-pii-mainthread

This commit is contained in:
Jason Ross
2026-07-04 03:01:17 -05:00
committed by GitHub
13 changed files with 297 additions and 13 deletions
@@ -67,7 +67,9 @@ class AccountDaoTest {
}
@Test
fun upsertReplacesAnAccountWithTheSameId() = runBlocking {
fun upsertOnAConflictingIdUpdatesTheRowInPlace() = runBlocking {
// Non-destructive by design (issue #309): a second upsert of the same id refreshes the row
// rather than delete-then-reinserting it (which would cascade-delete settings/signatures).
dao.upsert(account("acct", "ada@example.org", displayName = "Ada"))
dao.upsert(account("acct", "ada@example.org", displayName = "Ada Lovelace"))
@@ -110,4 +110,40 @@ class AccountDatabaseTest {
db.signatureDao().observeForAccount("acct").first().isEmpty(),
)
}
@Test
fun upsertOnAnExistingIdUpdatesInPlaceWithoutCascadingSettingsOrSignatures() = runBlocking<Unit> {
// Regression for issue #309: an @Insert(REPLACE) upsert deletes-then-reinserts on an id
// conflict, firing the ON DELETE CASCADE that wipes the account's settings + signatures.
db.accountDao().upsert(account("acct"))
db.accountSettingsDao().upsert(AccountSettingsEntity("acct", signature = "Keep me"))
db.signatureDao().upsert(SignatureEntity("sig-1", "acct", "Work", "<p>Regards</p>", isDefault = true))
db.accountDao().upsert(account("acct").copy(displayName = "Updated"))
assertEquals("Updated", db.accountDao().getById("acct")?.displayName)
assertEquals("Keep me", db.accountSettingsDao().get("acct")?.signature)
assertEquals(1, db.signatureDao().observeForAccount("acct").first().size)
assertEquals(1, db.accountDao().getAll().size)
}
@Test
fun insertAtEndReAddingAnExistingAccountKeepsItsSettingsSignaturesAndPosition() = runBlocking<Unit> {
// The production re-add path (addOutlookAccount -> insertAtEnd -> upsert). Re-adding a
// deterministic id must not cascade-delete its settings/signatures nor move it to the end.
db.accountDao().insertAtEnd(account("a"))
db.accountDao().insertAtEnd(account("b"))
db.accountSettingsDao().upsert(AccountSettingsEntity("b", signature = "Sig B", signatureEnabled = false))
db.signatureDao().upsert(SignatureEntity("sig-b", "b", "Work", "<p>Regards</p>", isDefault = true))
db.accountDao().insertAtEnd(account("b").copy(displayName = "Renamed"))
// Updated in place, position preserved (still 1, not appended after), children intact.
assertEquals("Renamed", db.accountDao().getById("b")?.displayName)
assertEquals(1, db.accountDao().getById("b")?.sortOrder)
assertEquals("Sig B", db.accountSettingsDao().get("b")?.signature)
assertEquals(false, db.accountSettingsDao().get("b")?.signatureEnabled)
assertEquals(1, db.signatureDao().observeForAccount("b").first().size)
assertEquals(2, db.accountDao().getAll().size)
}
}