From 5bee9c7bea8e42c6571ba96760e1ea9ca36a4868 Mon Sep 17 00:00:00 2001 From: Martin Kagamino Lehoux Date: Fri, 16 Feb 2024 10:42:56 +0100 Subject: [PATCH] test: Add test case to show `set()` many update --- example/test_full/models.py | 44 +++++++++++++++++++++ example/test_full/tests/test_advert_tags.py | 18 +++++++++ 2 files changed, 62 insertions(+) create mode 100644 example/test_full/tests/test_advert_tags.py diff --git a/example/test_full/models.py b/example/test_full/models.py index baa8776..81d0508 100644 --- a/example/test_full/models.py +++ b/example/test_full/models.py @@ -1,3 +1,4 @@ +from collections import Counter from django.db import models import sys from computedfields.models import ComputedFieldsModel, computed, precomputed, ComputedField @@ -1107,3 +1108,46 @@ class Meta: class HaProxy(Ha): class Meta: proxy = True + + +class Tag(ComputedFieldsModel): + name = models.CharField(max_length=32, unique=True) + + +run_counters = Counter() + + +class Advert(ComputedFieldsModel): + name = models.CharField(max_length=32) + + tags = models.ManyToManyField(Tag, related_name="adverts") + + @computed( + field=models.CharField(max_length=500), + depends=[("tags", ["name"])], + ) + def all_tags(self) -> str: + run_counters.update(["all_tags"]) + if not self.pk: + return "" + return ", ".join(self.tags.values_list("name", flat=True)) + + def __str__(self) -> str: + return f"{self.name}" + +class Room(ComputedFieldsModel): + name = models.CharField(max_length=32) + advert = models.ForeignKey(Advert, related_name="rooms", on_delete=models.CASCADE) + + @computed( + field=models.BooleanField(), + depends=[("advert.tags", ["name"])], + ) + def is_ready(self) -> bool: + run_counters.update(["is_ready"]) + if not self.pk: + return False + return self.advert.tags.filter(name="ready").exists() + + def __str__(self) -> str: + return f"{self.name}" \ No newline at end of file diff --git a/example/test_full/tests/test_advert_tags.py b/example/test_full/tests/test_advert_tags.py new file mode 100644 index 0000000..c1481f2 --- /dev/null +++ b/example/test_full/tests/test_advert_tags.py @@ -0,0 +1,18 @@ +from django.test import TestCase +from .. import models + + +class TestAdvertTags(TestCase): + def test(self): + tag_ready = models.Tag.objects.create(name="ready") + advert_1 = models.Advert.objects.create(name="A1") + room_11 = models.Room.objects.create(name="R11", advert=advert_1) + advert_1.tags.add(tag_ready) + advert_2 = models.Advert.objects.create(name="A2") + room_21 = models.Room.objects.create(name="R21", advert=advert_2) + assert models.run_counters["all_tags"] == 3 + assert models.run_counters["is_ready"] == 3 + + advert_2.tags.add(tag_ready) + assert models.run_counters["all_tags"] == 4 + assert models.run_counters["is_ready"] == 4