diff --git a/tests/model_formsets/tests.py b/tests/model_formsets/tests.py index 94e1ccbe53..4c57e0f549 100644 --- a/tests/model_formsets/tests.py +++ b/tests/model_formsets/tests.py @@ -100,6 +100,36 @@ class DeletionTests(TestCase): formset.save() self.assertEqual(Poet.objects.count(), 0) + def test_outdated_deletion(self): + poet = Poet.objects.create(name='test') + poem = Poem.objects.create(name='Brevity is the soul of wit', poet=poet) + + PoemFormSet = inlineformset_factory(Poet, Poem, fields="__all__", can_delete=True) + + # Simulate deletion of an object that doesn't exist in the database + data = { + 'form-TOTAL_FORMS': '2', + 'form-INITIAL_FORMS': '2', + 'form-0-id': str(poem.pk), + 'form-0-name': 'foo', + 'form-1-id': str(poem.pk + 1), # doesn't exist + 'form-1-name': 'bar', + 'form-1-DELETE': 'on', + } + formset = PoemFormSet(data, instance=poet, prefix="form") + + # The formset is valid even though poem.pk + 1 doesn't exist, + # because it's marked for deletion anyway + self.assertTrue(formset.is_valid()) + + formset.save() + + # Make sure the save went through correctly + self.assertEqual(Poem.objects.get(pk=poem.pk).name, "foo") + self.assertEqual(poet.poem_set.count(), 1) + self.assertFalse(Poem.objects.filter(pk=poem.pk + 1).exists()) + + class ModelFormsetTest(TestCase): def test_simple_save(self): qs = Author.objects.all()