2
0
mirror of https://github.com/inventree/InvenTree.git synced 2025-10-23 09:27:39 +00:00

Order tests (#10649)

- Additional test coverage for order models
- Validate address
- Validate contact
- Validate date ranges
This commit is contained in:
Oliver
2025-10-22 14:32:26 +11:00
committed by GitHub
parent e0b0e1d66c
commit 6dfedead7c
3 changed files with 86 additions and 3 deletions

View File

@@ -383,6 +383,13 @@ class Order(
'start_date': _('Start date must be before target date'),
})
# Check that the referenced 'address' matches the correct 'company'
if self.company and self.address:
if self.address.company != self.company:
raise ValidationError({
'address': _('Address does not match selected company')
})
def clean_line_item(self, line):
"""Clean a line item for this order.

View File

@@ -8,7 +8,7 @@ from django.core.exceptions import ValidationError
import order.tasks
from common.models import InvenTreeSetting, NotificationMessage
from company.models import Company
from company.models import Address, Company
from InvenTree import status_codes as status
from InvenTree.unit_test import InvenTreeTestCase, addUserPermission
from order.models import (
@@ -26,7 +26,7 @@ from users.models import Owner
class SalesOrderTest(InvenTreeTestCase):
"""Run tests to ensure that the SalesOrder model is working correctly."""
fixtures = ['users']
fixtures = ['company', 'users']
@classmethod
def setUpTestData(cls):
@@ -75,6 +75,38 @@ class SalesOrderTest(InvenTreeTestCase):
quantity=1, order=cls.order, reference='Extra line'
)
def test_validate_address(self):
"""Test validation of the linked Address."""
order = SalesOrder.objects.first()
# Create an address for a different company
company = Company.objects.exclude(pk=order.customer.pk).first()
self.assertIsNotNone(company)
address = Address.objects.create(
company=company,
primary=False,
line1='123 Different St',
line2='Elsewhere',
postal_code='99999',
country='US',
)
order.address = address
with self.assertRaises(ValidationError) as err:
order.clean()
self.assertIn('Address does not match selected company', str(err.exception))
# Update the address to match the correct company
address.company = order.customer
address.save()
# Now validation should pass
order.address = address
order.clean()
order.save()
def test_so_reference(self):
"""Unit tests for sales order generation."""
# Test that a good reference is created when we have no existing orders

View File

@@ -13,7 +13,8 @@ from djmoney.money import Money
import common.models
import order.tasks
from common.settings import get_global_setting, set_global_setting
from company.models import Company, SupplierPart
from company.models import Company, Contact, SupplierPart
from InvenTree.helpers import current_date
from InvenTree.unit_test import (
ExchangeRateMixin,
PluginRegistryMixin,
@@ -55,6 +56,49 @@ class OrderTest(ExchangeRateMixin, PluginRegistryMixin, TestCase):
line = PurchaseOrderLineItem.objects.get(pk=1)
self.assertEqual(str(line), '100 x ACME0001 - PO-0001 - ACME')
def test_validate_dates(self):
"""Test for validation of date fields."""
order = PurchaseOrder.objects.first()
order.start_date = current_date()
order.target_date = current_date() - timedelta(days=5)
with self.assertRaises(django_exceptions.ValidationError) as err:
order.clean()
self.assertIn('Target date must be after start date', err.exception.messages)
self.assertIn('Start date must be before target date', err.exception.messages)
order.target_date = current_date() + timedelta(days=5)
# This should now pass
order.clean()
order.save()
def test_validate_contact(self):
"""Test for validation of linked Contact."""
order = PurchaseOrder.objects.first()
# Create a contact which does does not match the company
company = Company.objects.exclude(pk=order.supplier.pk).first()
self.assertIsNotNone(company)
contact = Contact.objects.create(company=company, name='Harold Henderson')
order.contact = contact
with self.assertRaises(django_exceptions.ValidationError) as err:
order.clean()
self.assertIn('Contact does not match selected company', err.exception.messages)
# Update the contact, point to the right company
contact.company = order.supplier
contact.save()
order.contact = contact
order.clean() # Should not raise
order.save()
def test_rebuild_reference(self):
"""Test that the reference_int field is correctly updated when the model is saved."""
order = PurchaseOrder.objects.get(pk=1)