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)