use ModelFormSet instead of FormSet for scheduled actions

This commit is contained in:
imperosol
2025-09-23 15:51:02 +02:00
parent 68289524a0
commit ac38ad7861
4 changed files with 78 additions and 135 deletions

View File

@@ -8,7 +8,6 @@ from django.urls import reverse
from django.utils.timezone import now
from django_celery_beat.models import ClockedSchedule
from model_bakery import baker
from pytest_django.asserts import assertNumQueries
from core.models import Group, User
from counter.baker_recipes import counter_recipe, product_recipe
@@ -78,64 +77,20 @@ class TestProductActionForm:
{"product_id": product.id, "counters": [counter.id]}
)
def test_task_reused_when_editing(self):
"""Check that when product tasks are edited, no new entry is created in db"""
product = product_recipe.make()
old_clocked = now() + timedelta(minutes=10)
old_instance = baker.make(
ScheduledProductAction,
product=product,
clocked=baker.make(ClockedSchedule, clocked_time=old_clocked),
task="counter.tasks.archive_product",
)
new_clocked = old_clocked + timedelta(minutes=2)
form = ScheduledProductActionForm(
product=product,
data={
"scheduled-task": "counter.tasks.archive_product",
"scheduled-trigger_at": new_clocked,
},
)
assert form.is_valid()
new_instance = form.save()
assert new_instance.id == old_instance.id
assert new_instance.clocked.id == old_instance.clocked.id
assert new_instance.clocked.clocked_time == new_clocked
def test_no_changed_data(self):
"""Test that when no data changes, the save method does no db query"""
product = product_recipe.make()
trigger_at = now() + timedelta(minutes=2)
baker.make(
ScheduledProductAction,
product=product,
clocked=baker.make(ClockedSchedule, clocked_time=trigger_at),
task="counter.tasks.archive_product",
)
form = ScheduledProductActionForm(product=product, data={})
with assertNumQueries(0):
form.is_valid()
form.save()
def test_delete(self):
product = product_recipe.make()
trigger_at = now() + timedelta(minutes=2)
clocked = baker.make(ClockedSchedule, clocked_time=now() + timedelta(minutes=2))
task = baker.make(
ScheduledProductAction,
product=product,
clocked=baker.make(ClockedSchedule, clocked_time=trigger_at),
one_off=True,
clocked=clocked,
task="counter.tasks.archive_product",
)
form = ScheduledProductActionForm(
product=product,
data={
"scheduled-task": "counter.tasks.archive_product",
"scheduled-trigger_at": trigger_at,
},
)
assert form.is_valid()
form.delete()
formset = ScheduledProductActionFormSet(product=product)
formset.delete_existing(task)
assert not ScheduledProductAction.objects.filter(id=task.id).exists()
assert not ClockedSchedule.objects.filter(id=clocked.id).exists()
@pytest.mark.django_db