diff --git a/tests/js/workspace-library-delete.test.js b/tests/js/workspace-library-delete.test.js index 0a7e49ed..991cead6 100644 --- a/tests/js/workspace-library-delete.test.js +++ b/tests/js/workspace-library-delete.test.js @@ -286,4 +286,8 @@ test('the outcome names prompts restored since the review', async () => { const {deleteOutcome} = await source; const outcome = deleteOutcome({success: true, deleted: 1, archived: 0, not_archived: 2, changed: 0}, null, {protected: []}); assert.equal(outcome.toast, 'Deleted 1 prompt. 2 were restored since the review and kept.'); + const none = deleteOutcome({success: true, deleted: 0, archived: 0, not_archived: 1, changed: 1}, null, + {protected: [], shelf: 'archived'}); + assert.equal(none.toast, 'Nothing was deleted. 1 was restored since the review and kept. 1 changed since the review and ' + + 'was not deleted. The Library was reloaded.'); }); diff --git a/tests/test_bulk_library_delete.py b/tests/test_bulk_library_delete.py index 24428bd5..8e8e7d1a 100644 --- a/tests/test_bulk_library_delete.py +++ b/tests/test_bulk_library_delete.py @@ -851,6 +851,31 @@ class TestArchivedShelfDelete(LibraryDeleteCase): self.assertEqual((result["deleted"], result["pairs_removed"]), (1, 1)) self.assertEqual(archived_ids(self.db), [shared]) + def test_mixed_outcomes_are_each_counted_once(self): + owl, _neg, _pair = self.paired("Owl", "dark") + hen, _neg2, hen_pair = self.paired("Hen", "fog") + loose = save(self.db, "Loose") + self.image(loose, "loose.png") + guarded = save(self.db, "Guarded", tags=["__protected__"]) + self.image(guarded, "guarded.png") + gone = save(self.db, "Gone") + self.image(gone, "gone.png") + self.archive(owl, hen, loose, guarded, gone) + review = self.shelf_classify([owl, hen, loose, guarded, gone]) + self.db.update_prompt_pair_metadata(hen_pair, notes="drifted") + self.restore([loose]) + with self.db.model.get_connection() as conn: + conn.execute("DELETE FROM generated_images WHERE prompt_id=?", (gone,)) + conn.execute("DELETE FROM prompts WHERE id=?", (gone,)) + conn.commit() + result = self.shelf_write(review, deletes=[loose, gone]) + self.assertEqual( + {k: result[k] for k in ("deleted", "changed", "not_found", "not_archived")}, + {"deleted": 1, "changed": 1, "not_found": 1, "not_archived": 1}, + ) + self.assertNotIn(owl, prompt_ids(self.db)) + self.assertEqual(archived_ids(self.db), sorted([hen, guarded])) + def test_shelf_must_be_active_or_archived(self): owl, _neg, _pair = self.paired("Owl") with self.assertRaises(ValueError): diff --git a/web/js/workspace/library-delete.mjs b/web/js/workspace/library-delete.mjs index afdca1f5..086d9d65 100644 --- a/web/js/workspace/library-delete.mjs +++ b/web/js/workspace/library-delete.mjs @@ -322,7 +322,8 @@ export function deleteOutcome(result, failure, review) { if (deleted) parts.push(`Deleted ${countOf(deleted, 'prompt')}.`); if (pairs) parts.push(`Removed ${countOf(pairs, 'saved pair')}.`); if (archived) parts.push(`Archived ${countOf(archived, 'prompt')}.`); - if (!parts.length) parts.push(NOTHING); + // #492: the archived shelf archives nothing, so it says only that nothing was deleted. + if (!parts.length) parts.push(review?.shelf === 'archived' ? 'Nothing was deleted.' : NOTHING); const already = count(result.already_archived), missing = count(result.not_found), changed = count(result.changed); if (already) parts.push(`${were(already, 'was', 'were')} already archived.`); const restored = count(result.not_archived);