import uuid from django.test import TestCase from django.core.exceptions import ValidationError from django.db import IntegrityError from modules.crm.models import Client class ClientModelTests(TestCase): def setUp(self): # osnovni validni podaci koje ćemo koristiti u testovima self.base_data = { "name": "Test Client", "tax_id": str(uuid.uuid4()), # jedinstveno "email": f"client+{uuid.uuid4()}@example.test", "address": "Ulica 1", "city": "Grad", "postal_code": "10000", } def test_create_client_success(self): client = Client.objects.create( client_type="legal", **self.base_data ) self.assertIsNotNone(client.pk) self.assertEqual(client.name, "Test Client") self.assertEqual(client.client_type, "legal") # default ordering ili drugi atributi mogu se dodatno provjeriti self.assertTrue(str(client).startswith("Test Client")) self.assertIn(client.tax_id, str(client)) def test_default_client_type_is_legal(self): # Ako eksplicitno ne pošaljemo client_type, default je 'legal' data = dict(self.base_data) data["tax_id"] = str(uuid.uuid4()) data["email"] = f"client+{uuid.uuid4()}@example.test" client = Client.objects.create(**data) self.assertEqual(client.client_type, "legal") def test_str_representation_contains_name_and_taxid(self): client = Client.objects.create(client_type="individual", **self.base_data) expected = f"{client.name} ({client.tax_id})" self.assertEqual(str(client), expected) def test_unique_tax_id_constraint(self): # Prva kreacija prođe Client.objects.create(client_type="legal", **self.base_data) # Pokušaj dupliciranja tax_id-a treba podići IntegrityError dup = dict(self.base_data) dup["email"] = f"client+{uuid.uuid4()}@example.test" # unique email drugi with self.assertRaises(IntegrityError): Client.objects.create(client_type="legal", **dup) def test_unique_email_constraint(self): Client.objects.create(client_type="legal", **self.base_data) dup = dict(self.base_data) dup["tax_id"] = str(uuid.uuid4()) # unique tax_id drugi with self.assertRaises(IntegrityError): Client.objects.create(client_type="legal", **dup) def test_full_clean_validates_email_format(self): data = dict(self.base_data) data["email"] = "not-an-email" client = Client(**data) with self.assertRaises(ValidationError): client.full_clean() # EmailField validation je pokrenuta def test_full_clean_requires_required_fields(self): # Uklonimo obavezno polje name i očekujemo ValidationError data = dict(self.base_data) data.pop("name") client = Client(**data) with self.assertRaises(ValidationError): client.full_clean()