40 lines
1.6 KiB
Python
40 lines
1.6 KiB
Python
from django.test import TestCase
|
|
from django.contrib.auth import get_user_model
|
|
from datetime import date
|
|
from decimal import Decimal
|
|
|
|
from modules.crm.models import Client
|
|
from modules.invoicing.models import Invoice, InvoiceItem
|
|
from modules.invoicing.services import InvoiceService
|
|
|
|
|
|
class InvoiceServiceTests(TestCase):
|
|
def setUp(self):
|
|
User = get_user_model()
|
|
self.creator = User.objects.create_user(username="creator", email="c@example.com", password="pass")
|
|
self.client = Client.objects.create(name="Test Client")
|
|
|
|
def test_create_full_invoice_creates_invoice_and_items(self):
|
|
items = [
|
|
{"description": "Item A", "quantity": Decimal("2.00"), "unit_price": Decimal("10.00")},
|
|
{"description": "Item B", "quantity": Decimal("1.00"), "unit_price": Decimal("5.50")},
|
|
]
|
|
validated_data = {
|
|
"client": self.client,
|
|
"due_date": date.today(),
|
|
"items": items,
|
|
}
|
|
|
|
invoice = InvoiceService.create_full_invoice(user=self.creator, **validated_data)
|
|
|
|
# Basic assertions
|
|
self.assertIsInstance(invoice, Invoice)
|
|
self.assertEqual(invoice.creator, self.creator)
|
|
self.assertEqual(invoice.client, self.client)
|
|
self.assertEqual(invoice.items.count(), 2)
|
|
|
|
# Total should be 2*10 + 1*5.5 = 25.5
|
|
self.assertEqual(invoice.amount, Decimal("25.50"))
|
|
item_descriptions = [i.description for i in invoice.items.all()]
|
|
self.assertIn("Item A", item_descriptions)
|
|
self.assertIn("Item B", item_descriptions) |