2
0
mirror of https://github.com/inventree/InvenTree.git synced 2025-04-29 20:16:44 +00:00
Oliver 648faf4ed2
Reference fields (#3267)
* Adds a configurable 'reference pattern' to the IndexingReferenceMixin class

* Expand tests for reference_pattern validator:

- Prevent inclusion of illegal characters
- Prevent multiple groups of hash (#) characters
- Add unit tests

* Validator now checks for valid strftime formatter

* Adds build order reference pattern

* Adds function for creating a valid regex from the supplied pattern

- More unit tests
- Use it to validate BuildOrder reference field

* Refactoring the whole thing again - try using python string.format

* remove datetime-matcher from requirements.txt

* Add some more formatting helper functions

- Construct a regular expression from a format string
- Extract named values from a string, based on a format string

* Fix validator for build order reference field

* Adding unit tests for the new format string functionality

* Adds validation for reference fields

* Require the 'ref' format key as part of a valid reference pattern

* Extend format extraction to allow specification of integer groups

* Remove unused import

* Fix requirements

* Add method for generating the 'next' reference field for a model

* Fix function for generating next BuildOrder reference value

- A function is required as class methods cannot be used
- Simply wraps the existing class method

* Remove BUILDORDER_REFERENCE_REGEX setting

* Add unit test for build order reference field validation

* Adds unit testing for extracting integer values from a reference field

* Fix bugs from previous commit

* Add unit test for generation of default build order reference

* Add data migration for BuildOrder model

- Update reference field with old prefix
- Construct new pattern based on old prefix

* Adds unit test for data migration

- Check that the BuildOrder reference field is updated as expected

* Remove 'BUILDORDER_REFERENCE_PREFIX' setting

* Adds new setting for SalesOrder reference pattern

* Update method by which next reference value is generated

* Improved error handling in api_tester code

* Improve automated generation of order reference fields

- Handle potential errors
- Return previous reference if something goes wrong

* SalesOrder reference has now been updated also

- New reference pattern setting
- Updated default and validator for reference field
- Updated serializer and API
- Added unit tests

* Migrate the "PurchaseOrder" reference field to the new system

* Data migration for SalesOrder and PurchaseOrder reference fields

* Remove PURCHASEORDER_REFERENCE_PREFIX

* Remove references to SALESORDER_REFERENCE_PREFIX

* Re-add maximum value validation

* Bug fixes

* Improve algorithm for generating new reference

- Handle case where most recent reference does not conform to the reference pattern

* Fixes for 'order' unit tests

* Unit test fixes for order app

* More unit test fixes

* More unit test fixing

* Revert behaviour for "extract_int" clipping function

* Unit test value fix

* Prevent build order notification if we are importing records
2022-07-11 00:01:46 +10:00

136 lines
3.4 KiB
Python

"""Basic unit tests for the BuildOrder app"""
from django.urls import reverse
from datetime import datetime, timedelta
from InvenTree.helpers import InvenTreeTestCase
from .models import Build
from stock.models import StockItem
from InvenTree.status_codes import BuildStatus
class BuildTestSimple(InvenTreeTestCase):
"""Basic set of tests for the BuildOrder model functionality"""
fixtures = [
'category',
'part',
'location',
'build',
]
roles = [
'build.change',
'build.add',
'build.delete',
]
def test_build_objects(self):
"""Ensure the Build objects were correctly created"""
self.assertEqual(Build.objects.count(), 5)
b = Build.objects.get(pk=2)
self.assertEqual(b.batch, 'B2')
self.assertEqual(b.quantity, 21)
self.assertEqual(str(b), 'BO-0002')
def test_url(self):
"""Test URL lookup"""
b1 = Build.objects.get(pk=1)
self.assertEqual(b1.get_absolute_url(), '/build/1/')
def test_is_complete(self):
"""Test build completion status"""
b1 = Build.objects.get(pk=1)
b2 = Build.objects.get(pk=2)
self.assertEqual(b1.is_complete, False)
self.assertEqual(b2.is_complete, True)
self.assertEqual(b2.status, BuildStatus.COMPLETE)
def test_overdue(self):
"""Test overdue status functionality."""
today = datetime.now().date()
build = Build.objects.get(pk=1)
self.assertFalse(build.is_overdue)
build.target_date = today - timedelta(days=1)
build.save()
self.assertTrue(build.is_overdue)
build.target_date = today + timedelta(days=80)
build.save()
self.assertFalse(build.is_overdue)
def test_is_active(self):
"""Test active / inactive build status"""
b1 = Build.objects.get(pk=1)
b2 = Build.objects.get(pk=2)
self.assertEqual(b1.is_active, True)
self.assertEqual(b2.is_active, False)
def test_cancel_build(self):
"""Test build cancellation function."""
build = Build.objects.get(id=1)
self.assertEqual(build.status, BuildStatus.PENDING)
build.cancel_build(self.user)
self.assertEqual(build.status, BuildStatus.CANCELLED)
class TestBuildViews(InvenTreeTestCase):
"""Tests for Build app views."""
fixtures = [
'category',
'part',
'location',
'build',
]
roles = [
'build.change',
'build.add',
'build.delete',
]
def setUp(self):
"""Fixturing for this suite of unit tests"""
super().setUp()
# Create a build output for build # 1
self.build = Build.objects.get(pk=1)
self.output = StockItem.objects.create(
part=self.build.part,
quantity=self.build.quantity,
build=self.build,
is_building=True,
)
def test_build_index(self):
"""Test build index view."""
response = self.client.get(reverse('build-index'))
self.assertEqual(response.status_code, 200)
def test_build_detail(self):
"""Test the detail view for a Build object."""
pk = 1
response = self.client.get(reverse('build-detail', args=(pk,)))
self.assertEqual(response.status_code, 200)
build = Build.objects.get(pk=pk)
content = str(response.content)
self.assertIn(build.title, content)