1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
|
from decimal import Decimal
import pytest
from django.db.models import Min, Subquery
from django.test import TestCase
from quantityfield.units import ureg
from tests.dummyapp.models import (
BigIntFieldSaveModel,
DecimalFieldSaveModel,
EmptyHayBalePositiveInt,
FloatFieldSaveModel,
IntFieldSaveModel,
)
Quantity = ureg.Quantity
class BaseMixinQuantityFieldORM:
"""Base mixin for ORM tests for QuantityField types."""
MODEL: type
FIELD_NAME: str = "weight"
CREATE_KWARGS_LIGHT: dict = {"name": "light", FIELD_NAME: 100}
CREATE_KWARGS_HEAVY: dict = {"name": "heavy", FIELD_NAME: 200}
EXPECTED_TYPE: type
def setUp(self):
self.light = self.MODEL.objects.create(**self.CREATE_KWARGS_LIGHT)
self.heavy = self.MODEL.objects.create(**self.CREATE_KWARGS_HEAVY)
def tearDown(self):
self.MODEL.objects.all().delete()
def test_bulk_update_with_subquery(self):
min_value_qs = self.MODEL.objects.annotate(
min_value=Min(self.FIELD_NAME)
).values("min_value")[:1]
self.MODEL.objects.all().update(**{self.FIELD_NAME: Subquery(min_value_qs)})
self.light.refresh_from_db()
self.heavy.refresh_from_db()
self.assertEqual(
Quantity(self.EXPECTED_TYPE(100) * ureg.gram),
getattr(self.light, self.FIELD_NAME),
)
self.assertEqual(
Quantity(self.EXPECTED_TYPE(100) * ureg.gram),
getattr(self.heavy, self.FIELD_NAME),
)
@pytest.mark.django_db
class TestDecimalQuantityFieldORM(BaseMixinQuantityFieldORM, TestCase):
MODEL = DecimalFieldSaveModel
EXPECTED_TYPE = Decimal
@pytest.mark.django_db
class TestFloatQuantityFieldORM(BaseMixinQuantityFieldORM, TestCase):
MODEL = FloatFieldSaveModel
EXPECTED_TYPE = float
@pytest.mark.django_db
class TestIntegerQuantityFieldORM(BaseMixinQuantityFieldORM, TestCase):
MODEL = IntFieldSaveModel
EXPECTED_TYPE = int
@pytest.mark.django_db
class TestBigIntegerQuantityFieldORM(BaseMixinQuantityFieldORM, TestCase):
MODEL = BigIntFieldSaveModel
EXPECTED_TYPE = int
@pytest.mark.django_db
class TestPositiveIntegerQuantityFieldORM(BaseMixinQuantityFieldORM, TestCase):
MODEL = EmptyHayBalePositiveInt
EXPECTED_TYPE = int
|