104 lines
4.1 KiB
Python
104 lines
4.1 KiB
Python
from django.contrib.auth.models import User
|
|
from django.test import TestCase, Client
|
|
from rest_framework import status
|
|
from rest_framework.utils import json
|
|
|
|
from order.models import SaleOrder, SaleOrderLine, Product
|
|
from order.serializers import SaleOrderSerializer
|
|
|
|
|
|
class OrderTests(TestCase):
|
|
def setUp(self) -> None:
|
|
self.product_1: Product = Product.objects.create(
|
|
name="Product 1", unit_price=10.0
|
|
)
|
|
self.product_2: Product = Product.objects.create(
|
|
name="Product 2", unit_price=20.0
|
|
)
|
|
self.product_3: Product = Product.objects.create(
|
|
name="Product 3", unit_price=30.0
|
|
)
|
|
self.product_4: Product = Product.objects.create(
|
|
name="Product 4", unit_price=40.0
|
|
)
|
|
|
|
self.order_1: SaleOrder = SaleOrder.objects.create(name="Order 1")
|
|
self.order_2: SaleOrder = SaleOrder.objects.create(name="Order 2")
|
|
|
|
self.line_1_1: SaleOrderLine = SaleOrderLine.objects.create(
|
|
name="Line 1/Order1", order=self.order_1, product=self.product_1
|
|
)
|
|
self.line_1_2: SaleOrderLine = SaleOrderLine.objects.create(
|
|
name="Line 2/Order 1",
|
|
quantity=3,
|
|
order=self.order_1,
|
|
product=self.product_2,
|
|
)
|
|
|
|
self.line_2_1: SaleOrderLine = SaleOrderLine.objects.create(
|
|
name="Line 1/Order2", order=self.order_2, product=self.product_3
|
|
)
|
|
|
|
self.line_2_2: SaleOrderLine = SaleOrderLine.objects.create(
|
|
name="Line 2/Order2", order=self.order_2, product=self.product_4
|
|
)
|
|
|
|
self.user_foo: User = User.objects.create(username="foo")
|
|
self.user_foo.set_password("foo")
|
|
self.user_foo.save()
|
|
self.user_bar = User.objects.create(username="bar", password="bar")
|
|
|
|
self.client = Client()
|
|
self.client.login(username="foo", password="foo")
|
|
|
|
def test_model_getters(self):
|
|
self.assertEqual(len(self.order_1.saleorderline_set.all()), 2)
|
|
self.assertEqual(self.order_1.total, 0.0)
|
|
self.assertEqual(self.order_1.amount_total, 70.0)
|
|
self.assertEqual(len(self.order_2.saleorderline_set.all()), 2)
|
|
self.assertEqual(self.order_2.total, 0.0)
|
|
self.assertEqual(self.order_2.amount_total, 70.0)
|
|
self.assertIsNotNone(self.line_1_1.product)
|
|
self.assertIsNotNone(self.line_1_2.product)
|
|
self.assertIsNotNone(self.line_2_1.product)
|
|
self.assertIsNotNone(self.line_2_2.product)
|
|
|
|
def test_model_sell(self):
|
|
self.assertIsNone(self.order_1.sold_at)
|
|
self.assertIsNone(self.order_1.sold_to)
|
|
self.order_1.sell(user=self.user_bar)
|
|
old_date = self.order_1.sold_at
|
|
old_user = self.order_1.sold_to
|
|
self.assertIsNotNone(self.order_1.sold_at)
|
|
self.assertIsNotNone(self.order_1.sold_to)
|
|
self.assertEqual(self.order_1.total, self.order_1.amount_total)
|
|
self.assertEqual(self.order_1.total, 70.0)
|
|
self.order_1.sell(user=self.user_bar)
|
|
self.assertEqual(self.order_1.sold_at, old_date)
|
|
self.assertEqual(self.order_1.sold_to, old_user)
|
|
|
|
def test_view_readonly(self):
|
|
response = self.client.patch(
|
|
path="/api/orders/1/",
|
|
data={"sold_at": "foo"},
|
|
content_type="application/json",
|
|
)
|
|
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
|
|
|
|
response = self.client.patch(
|
|
path="/api/orders/1/",
|
|
data={"sold_to": self.user_foo.id},
|
|
content_type="application/json",
|
|
)
|
|
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
|
|
|
|
def test_view_total(self):
|
|
response = self.client.get(path="/api/orders/1/total/")
|
|
self.assertEqual(json.loads(response.content.decode())["amount_total"], 70.0)
|
|
response = self.client.get(path="/api/orders/2/total/")
|
|
self.assertEqual(json.loads(response.content.decode())["amount_total"], 70.0)
|
|
|
|
def test_view_sell(self):
|
|
response = self.client.get(path="/api/orders/2/sold/")
|
|
self.order_2.refresh_from_db()
|
|
self.assertEqual(self.order_2.sold_to, self.user_foo)
|