from django.test import TestCase, Client from django.urls import reverse from users.models import Employee from .models import Computer, Monitor, Peripheral, HandoverProtocol, DecommissionRecord from django.contrib.auth.models import User class EquipmentModelTests(TestCase): def setUp(self): self.emp = Employee.objects.create( name="Angajat Test", username="angajat.test", role="Consilier", office_number="10", email="test@primariaroman.ro", ) self.pc = Computer.objects.create( equipment_code="92601011", motherboard="ASUS Test", cpu="Intel i5", ram="16GB", storage="512GB SSD", mac_address="00:11:22:33:44:55", os_license="Windows 11 Pro", assigned_to=self.emp, status="activ", ) def test_active_inventory_property(self): # Verify the get_active_inventory property pulls the assigned PC inventory = self.emp.get_active_inventory self.assertIn(self.pc, inventory["computers"]) self.assertEqual(len(inventory["computers"]), 1) def test_handover_protocol_auto_numbering(self): # First protocol should be exactly 1000 pv1 = HandoverProtocol.objects.create(previous_holder=self.emp) self.assertEqual(pv1.document_number, 1000) # Second protocol should increment to 1001 pv2 = HandoverProtocol.objects.create(previous_holder=self.emp) self.assertEqual(pv2.document_number, 1001) class EquipmentViewsTests(TestCase): def setUp(self): self.client = Client() # Creăm un utilizator simplu (non-staff) self.normal_user = User.objects.create_user( username="user.simplu", password="password123", is_staff=False ) # Creăm un utilizator IT (staff) self.staff_user = User.objects.create_user( username="user.it", password="password123", is_staff=True ) def test_dashboard_access_authenticated(self): # Un utilizator logat trebuie să primească status 200 (OK) pe dashboard self.client.login(username="user.simplu", password="password123") response = self.client.get( reverse("equipment:dashboard") ) # Ajustează numele rutei dacă diferă self.assertEqual(response.status_code, 200) def test_dashboard_access_unauthenticated(self): # Un vizitator nelogat trebuie redirecționat (302) către pagina de login response = self.client.get(reverse("equipment:dashboard")) self.assertEqual(response.status_code, 302) self.assertIn("/accounts/login/", response.url) def test_staff_permission_denied_for_normal_users(self): # Un utilizator simplu nu are voie să acceseze formularul de adăugare certificat self.client.login(username="user.simplu", password="password123") response = self.client.get(reverse("equipment:certificate_create")) self.assertEqual( response.status_code, 403 ) # 403 = Forbidden (PermissionDenied) def test_staff_permission_granted_for_it(self): # Un utilizator IT trebuie să poată accesa formularul self.client.login(username="user.it", password="password123") response = self.client.get(reverse("equipment:certificate_create")) self.assertEqual(response.status_code, 200) class EquipmentBusinessLogicTests(TestCase): def setUp(self): self.client = Client() self.staff_user = User.objects.create_user( username="user.it", password="password123", is_staff=True ) self.client.login(username="user.it", password="password123") # Creăm un angajat self.emp = Employee.objects.create( name="Angajat Test", username="angajat.test", role="Inspector" ) # Creăm un calculator activ, atribuit angajatului self.pc = Computer.objects.create( equipment_code="COMP-TEST-01", cpu="Intel i5", ram="16GB", motherboard="ASUS", mac_address="00:00:00:00:00:00", status="activ", assigned_to=self.emp, ) def test_export_csv_headers(self): # Verificăm dacă ruta de export returnează un fișier CSV valid response = self.client.get(reverse("equipment:export_inventory")) self.assertEqual(response.status_code, 200) self.assertEqual(response["Content-Type"], "text/csv; charset=utf-8-sig") self.assertIn( 'attachment; filename="Inventar_Echipamente.csv"', response["Content-Disposition"], ) def test_decommission_logic_updates_status(self): # Simulăm trimiterea formularului de casare (POST request) response = self.client.post( reverse("equipment:decommission_create"), { "document_number": "PV-999", "date": "2026-08-31", "reason": "Test de casare automată", "computers": [self.pc.id], # Selectăm PC-ul creat în setUp # Celelalte pot fi goale dacă nu sunt required }, ) # Status 204 sau 302 confirmă că formularul s-a procesat cu succes self.assertIn(response.status_code, [204, 302]) # Reîncărcăm PC-ul din baza de date pentru a vedea modificările self.pc.refresh_from_db() # Verificăm dacă logica noastră a eliberat echipamentul corect self.assertEqual(self.pc.status, "casat") self.assertIsNone(self.pc.assigned_to)