import uuid from django.test import TestCase from modules.fleet.serializers import CraneSerializer class CraneSerialNumberTests(TestCase): def _base_payload(self): suffix = uuid.uuid4().hex[:6].upper() return { "registration_number": f"ZG-CRN-{suffix}", "make": "Liebherr", "model": "LTM", "year": 2024, "current_mileage": 12000, "service_interval_km": 8000, "is_company_vehicle": True, "is_active": True, } def test_create_crane_with_serial_number_succeeds(self): payload = { **self._base_payload(), "crane_serial_number": "123456", } serializer = CraneSerializer(data=payload) self.assertTrue(serializer.is_valid(), serializer.errors) crane = serializer.save() self.assertEqual(crane.asset_type, "crane") self.assertEqual(crane.crane_serial_number, "123456") def test_create_crane_without_serial_number_fails(self): payload = self._base_payload() serializer = CraneSerializer(data=payload) self.assertFalse(serializer.is_valid()) self.assertIn("crane_serial_number", serializer.errors) def test_crane_serial_number_industry_standard_validation(self): valid_payload = { **self._base_payload(), "registration_number": f"ZG-CRN-{uuid.uuid4().hex[:6].upper()}", "crane_serial_number": "000123", } valid_serializer = CraneSerializer(data=valid_payload) self.assertTrue(valid_serializer.is_valid(), valid_serializer.errors) invalid_serials = [ "12345", # prekratko "1234567", # predugo "12A456", # slova nisu dozvoljena "12 456", # razmaci nisu dozvoljeni "12-456", # specijalni znakovi nisu dozvoljeni "123456", # unicode znamenke nisu dozvoljene (samo ASCII 0-9) ] for value in invalid_serials: with self.subTest(serial=value): payload = { **self._base_payload(), "registration_number": f"ZG-CRN-{uuid.uuid4().hex[:6].upper()}", "crane_serial_number": value, } serializer = CraneSerializer(data=payload) self.assertFalse(serializer.is_valid()) self.assertIn("crane_serial_number", serializer.errors)