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)