mirror of
https://github.com/inventree/InvenTree
synced 2024-08-30 18:33:04 +00:00
Update unit tests
- Found some bugs too, thanks unit tests!
This commit is contained in:
parent
d30173132a
commit
1b65fbad2c
@ -240,9 +240,13 @@ class POReceive(generics.CreateAPIView):
|
|||||||
Returns the PurchaseOrder associated with this API endpoint
|
Returns the PurchaseOrder associated with this API endpoint
|
||||||
"""
|
"""
|
||||||
|
|
||||||
order = PurchaseOrder.objects.get(pk=self.kwargs['pk'])
|
pk = self.kwargs.get('pk', None)
|
||||||
|
|
||||||
return order
|
if pk is None:
|
||||||
|
return None
|
||||||
|
else:
|
||||||
|
order = PurchaseOrder.objects.get(pk=self.kwargs['pk'])
|
||||||
|
return order
|
||||||
|
|
||||||
def create(self, request, *args, **kwargs):
|
def create(self, request, *args, **kwargs):
|
||||||
|
|
||||||
@ -282,23 +286,24 @@ class POReceive(generics.CreateAPIView):
|
|||||||
# Check if the location is not specified for any particular item
|
# Check if the location is not specified for any particular item
|
||||||
for item in items:
|
for item in items:
|
||||||
|
|
||||||
supplier_part = item['supplier_part']
|
line = item['line_item']
|
||||||
|
|
||||||
# Location specified for this part
|
|
||||||
item_location = item['location']
|
|
||||||
|
|
||||||
if not item_location:
|
|
||||||
|
|
||||||
# Both item_location and location are not specified
|
|
||||||
if not location:
|
|
||||||
raise ValidationError({
|
|
||||||
'location': _("Destination location must be specified"),
|
|
||||||
})
|
|
||||||
|
|
||||||
|
if not item.get('location', None):
|
||||||
|
# If a global location is specified, use that
|
||||||
item['location'] = location
|
item['location'] = location
|
||||||
|
|
||||||
|
if not item['location']:
|
||||||
|
# The line item specifies a location?
|
||||||
|
item['location'] = line.get_destination()
|
||||||
|
|
||||||
|
if not item['location']:
|
||||||
|
raise ValidationError({
|
||||||
|
'location': _("Destination location must be specified"),
|
||||||
|
})
|
||||||
|
|
||||||
# Now we can actually receive the items
|
# Now we can actually receive the items
|
||||||
for item in items:
|
for item in items:
|
||||||
|
|
||||||
self.order.receive_line_item(
|
self.order.receive_line_item(
|
||||||
item['line_item'],
|
item['line_item'],
|
||||||
item['location'],
|
item['location'],
|
||||||
|
@ -187,10 +187,13 @@ class POLineItemReceiveSerializer(serializers.Serializer):
|
|||||||
if item.order != self.context['order']:
|
if item.order != self.context['order']:
|
||||||
raise ValidationError(_('Line item does not match purchase order'))
|
raise ValidationError(_('Line item does not match purchase order'))
|
||||||
|
|
||||||
|
return item
|
||||||
|
|
||||||
location = serializers.PrimaryKeyRelatedField(
|
location = serializers.PrimaryKeyRelatedField(
|
||||||
queryset=stock.models.StockLocation.objects.all(),
|
queryset=stock.models.StockLocation.objects.all(),
|
||||||
many=False,
|
many=False,
|
||||||
allow_null=True,
|
allow_null=True,
|
||||||
|
required=False,
|
||||||
label=_('Location'),
|
label=_('Location'),
|
||||||
help_text=_('Select destination location for received items'),
|
help_text=_('Select destination location for received items'),
|
||||||
)
|
)
|
||||||
@ -210,8 +213,9 @@ class POLineItemReceiveSerializer(serializers.Serializer):
|
|||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
fields = [
|
fields = [
|
||||||
'supplier_part',
|
'line_item',
|
||||||
'location',
|
'location',
|
||||||
|
'quantity',
|
||||||
'status',
|
'status',
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -2,7 +2,6 @@
|
|||||||
Tests for the Order API
|
Tests for the Order API
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from InvenTree.stock.models import StockItem
|
|
||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
|
|
||||||
from rest_framework import status
|
from rest_framework import status
|
||||||
@ -10,8 +9,11 @@ from rest_framework import status
|
|||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
|
|
||||||
from InvenTree.api_tester import InvenTreeAPITestCase
|
from InvenTree.api_tester import InvenTreeAPITestCase
|
||||||
|
from InvenTree.status_codes import PurchaseOrderStatus
|
||||||
|
|
||||||
from .models import PurchaseOrder, SalesOrder
|
from stock.models import StockItem
|
||||||
|
|
||||||
|
from .models import PurchaseOrder, PurchaseOrderLineItem, SalesOrder
|
||||||
|
|
||||||
|
|
||||||
class OrderTest(InvenTreeAPITestCase):
|
class OrderTest(InvenTreeAPITestCase):
|
||||||
@ -217,6 +219,11 @@ class PurchaseOrderReceiveTest(OrderTest):
|
|||||||
# Number of stock items which exist at the start of each test
|
# Number of stock items which exist at the start of each test
|
||||||
self.n = StockItem.objects.count()
|
self.n = StockItem.objects.count()
|
||||||
|
|
||||||
|
# Mark the order as "placed" so we can receive line items
|
||||||
|
order = PurchaseOrder.objects.get(pk=1)
|
||||||
|
order.status = PurchaseOrderStatus.PLACED
|
||||||
|
order.save()
|
||||||
|
|
||||||
def test_empty(self):
|
def test_empty(self):
|
||||||
"""
|
"""
|
||||||
Test without any POST data
|
Test without any POST data
|
||||||
@ -325,6 +332,59 @@ class PurchaseOrderReceiveTest(OrderTest):
|
|||||||
# No new stock items have been created
|
# No new stock items have been created
|
||||||
self.assertEqual(self.n, StockItem.objects.count())
|
self.assertEqual(self.n, StockItem.objects.count())
|
||||||
|
|
||||||
|
def test_valid(self):
|
||||||
|
"""
|
||||||
|
Test receipt of valid data
|
||||||
|
"""
|
||||||
|
|
||||||
|
line_1 = PurchaseOrderLineItem.objects.get(pk=1)
|
||||||
|
line_2 = PurchaseOrderLineItem.objects.get(pk=2)
|
||||||
|
|
||||||
|
self.assertEqual(StockItem.objects.filter(supplier_part=line_1.part).count(), 0)
|
||||||
|
self.assertEqual(StockItem.objects.filter(supplier_part=line_2.part).count(), 0)
|
||||||
|
|
||||||
|
self.assertEqual(line_1.received, 0)
|
||||||
|
self.assertEqual(line_2.received, 50)
|
||||||
|
|
||||||
|
# Receive two separate line items against this order
|
||||||
|
data = self.post(
|
||||||
|
self.url,
|
||||||
|
{
|
||||||
|
'items': [
|
||||||
|
{
|
||||||
|
'line_item': 1,
|
||||||
|
'quantity': 50,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'line_item': 2,
|
||||||
|
'quantity': 200,
|
||||||
|
'location': 2, # Explicit location
|
||||||
|
}
|
||||||
|
],
|
||||||
|
'location': 1, # Default location
|
||||||
|
},
|
||||||
|
).data
|
||||||
|
|
||||||
|
# There should be two newly created stock items
|
||||||
|
self.assertEqual(self.n + 2, StockItem.objects.count())
|
||||||
|
|
||||||
|
line_1 = PurchaseOrderLineItem.objects.get(pk=1)
|
||||||
|
line_2 = PurchaseOrderLineItem.objects.get(pk=2)
|
||||||
|
|
||||||
|
self.assertEqual(line_1.received, 50)
|
||||||
|
self.assertEqual(line_2.received, 250)
|
||||||
|
|
||||||
|
stock_1 = StockItem.objects.filter(supplier_part=line_1.part)
|
||||||
|
stock_2 = StockItem.objects.filter(supplier_part=line_2.part)
|
||||||
|
|
||||||
|
# 1 new stock item created for each supplier part
|
||||||
|
self.assertEqual(stock_1.count(), 1)
|
||||||
|
self.assertEqual(stock_2.count(), 1)
|
||||||
|
|
||||||
|
# Different location for each received item
|
||||||
|
self.assertEqual(stock_1.last().location.pk, 1)
|
||||||
|
self.assertEqual(stock_2.last().location.pk, 2)
|
||||||
|
|
||||||
|
|
||||||
class SalesOrderTest(OrderTest):
|
class SalesOrderTest(OrderTest):
|
||||||
"""
|
"""
|
||||||
|
Loading…
Reference in New Issue
Block a user