This commit is contained in:
25
backend/core/users/tests/test_models.py
Normal file
25
backend/core/users/tests/test_models.py
Normal file
@@ -0,0 +1,25 @@
|
||||
import pytest
|
||||
from django.contrib.auth import get_user_model
|
||||
|
||||
User = get_user_model()
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_create_user():
|
||||
"""Testira kreiranje standardnog korisnika."""
|
||||
user = User.objects.create_user(
|
||||
email="test@example.com",
|
||||
password="password123"
|
||||
)
|
||||
assert user.email == "test@example.com"
|
||||
assert user.check_password("password123")
|
||||
assert user.is_active is True
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_create_superuser():
|
||||
"""Testira kreiranje superuser-a."""
|
||||
admin = User.objects.create_superuser(
|
||||
email="admin@example.com",
|
||||
password="password123"
|
||||
)
|
||||
assert admin.is_superuser is True
|
||||
assert admin.is_staff is True
|
||||
37
backend/core/users/tests/test_permissions.py
Normal file
37
backend/core/users/tests/test_permissions.py
Normal file
@@ -0,0 +1,37 @@
|
||||
# backend/core/users/tests/test_permissions.py
|
||||
|
||||
import pytest
|
||||
from rest_framework import status
|
||||
from rest_framework.test import APIClient
|
||||
from django.contrib.auth import get_user_model
|
||||
|
||||
User = get_user_model()
|
||||
|
||||
@pytest.mark.django_db
|
||||
class TestUserPermissions:
|
||||
|
||||
def setup_method(self):
|
||||
self.client = APIClient()
|
||||
# Kreiramo dva korisnika
|
||||
self.user1 = User.objects.create_user(email="user1@erp.hr", password="password123")
|
||||
self.user2 = User.objects.create_user(email="user2@erp.hr", password="password123")
|
||||
|
||||
def test_user_cannot_edit_other_user(self):
|
||||
"""Osigurava da user1 ne može mijenjati podatke od user2."""
|
||||
self.client.force_authenticate(user=self.user1)
|
||||
|
||||
# Pokušavamo patchati user2 (pretpostavljamo URL /api/users/{id}/)
|
||||
response = self.client.patch(f'/api/users/{self.user2.id}/', {"first_name": "Haker"})
|
||||
|
||||
# Trebali bismo dobiti 403 Forbidden ili 404 (ovisno kako skrivaš postojanje drugih)
|
||||
assert response.status_code in [status.HTTP_403_FORBIDDEN, status.HTTP_404_NOT_FOUND]
|
||||
|
||||
def test_authenticated_user_can_edit_self(self):
|
||||
"""Osigurava da user1 može mijenjati svoje podatke."""
|
||||
self.client.force_authenticate(user=self.user1)
|
||||
|
||||
response = self.client.patch(f'/api/users/{self.user1.id}/', {"first_name": "Ime"})
|
||||
|
||||
assert response.status_code == status.HTTP_200_OK
|
||||
self.user1.refresh_from_db()
|
||||
assert self.user1.first_name == "Ime"
|
||||
56
backend/core/users/tests/test_seed_all_models_command.py
Normal file
56
backend/core/users/tests/test_seed_all_models_command.py
Normal file
@@ -0,0 +1,56 @@
|
||||
import uuid
|
||||
|
||||
import pytest
|
||||
from django.contrib.auth import get_user_model
|
||||
|
||||
from core.management.commands.seed_all_models import Command
|
||||
from modules.fleet.models import Vehicle, VehicleServiceRecord
|
||||
from modules.task_management.models import Task
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_seed_service_records_creates_record_with_task_and_task_vehicle():
|
||||
user = get_user_model().objects.create_user(
|
||||
email=f"seed-test-{uuid.uuid4().hex[:8]}@example.test",
|
||||
password="pass12345",
|
||||
)
|
||||
vehicle = Vehicle.objects.create(
|
||||
registration_number=f"ST-{uuid.uuid4().hex[:6].upper()}",
|
||||
asset_type="crane",
|
||||
)
|
||||
task = Task.objects.create(
|
||||
title=f"Task {uuid.uuid4().hex[:6]}",
|
||||
status="aktivan",
|
||||
vehicle=vehicle,
|
||||
assigned_to=user,
|
||||
)
|
||||
|
||||
cmd = Command()
|
||||
before = VehicleServiceRecord.objects.count()
|
||||
cmd._seed_service_records(1, [user], [task])
|
||||
|
||||
assert VehicleServiceRecord.objects.count() == before + 1
|
||||
record = VehicleServiceRecord.objects.order_by("-created_at").first()
|
||||
assert record is not None
|
||||
assert record.task_id == task.id
|
||||
assert record.vehicle_id == task.vehicle_id
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_seed_service_records_skips_tasks_without_vehicle():
|
||||
user = get_user_model().objects.create_user(
|
||||
email=f"seed-test-{uuid.uuid4().hex[:8]}@example.test",
|
||||
password="pass12345",
|
||||
)
|
||||
task = Task.objects.create(
|
||||
title=f"Task {uuid.uuid4().hex[:6]}",
|
||||
status="aktivan",
|
||||
vehicle=None,
|
||||
assigned_to=user,
|
||||
)
|
||||
|
||||
cmd = Command()
|
||||
before = VehicleServiceRecord.objects.count()
|
||||
cmd._seed_service_records(1, [user], [task])
|
||||
|
||||
assert VehicleServiceRecord.objects.count() == before
|
||||
35
backend/core/users/tests/test_services.py
Normal file
35
backend/core/users/tests/test_services.py
Normal file
@@ -0,0 +1,35 @@
|
||||
import pytest
|
||||
from django.core.exceptions import ValidationError as DjangoValidationError
|
||||
from rest_framework.exceptions import ValidationError as DRFValidationError
|
||||
from core.users.services import UserService
|
||||
from django.contrib.auth import get_user_model
|
||||
|
||||
User = get_user_model()
|
||||
|
||||
@pytest.mark.django_db
|
||||
class TestUserService:
|
||||
|
||||
def setup_method(self):
|
||||
self.user = User.objects.create_user(
|
||||
email="servis@primjer.hr",
|
||||
password="password123"
|
||||
)
|
||||
|
||||
def test_update_profile_success(self):
|
||||
"""Testira uspješno ažuriranje profila preko servisa."""
|
||||
new_data = {"first_name": "Novi", "last_name": "Korisnik"}
|
||||
|
||||
updated_user = UserService.update_user_profile(self.user, new_data)
|
||||
|
||||
assert updated_user.first_name == "Novi"
|
||||
assert updated_user.last_name == "Korisnik"
|
||||
# Provjera da email nije promijenjen ako nismo poslali
|
||||
assert updated_user.email == "servis@primjer.hr"
|
||||
|
||||
def test_update_profile_invalid_data(self):
|
||||
"""Testira validaciju (npr. neispravan format podataka)."""
|
||||
# Pretpostavimo da dodamo logiku u serializer koja brani prazno ime
|
||||
invalid_data = {"first_name": ""}
|
||||
|
||||
with pytest.raises(DRFValidationError):
|
||||
UserService.update_user_profile(self.user, invalid_data)
|
||||
61
backend/core/users/tests/test_users.py
Normal file
61
backend/core/users/tests/test_users.py
Normal file
@@ -0,0 +1,61 @@
|
||||
import pytest
|
||||
from django.urls import reverse
|
||||
from rest_framework import status
|
||||
from rest_framework.test import APIClient
|
||||
from django.contrib.auth import get_user_model
|
||||
|
||||
User = get_user_model()
|
||||
|
||||
@pytest.mark.django_db
|
||||
class TestUserAPI:
|
||||
|
||||
def setup_method(self):
|
||||
self.client = APIClient()
|
||||
self.user_data = {
|
||||
"email": "test@primjer.hr",
|
||||
"first_name": "Test",
|
||||
"last_name": "Korisnik",
|
||||
"password": "strongpassword123"
|
||||
}
|
||||
self.user = User.objects.create_user(**self.user_data)
|
||||
|
||||
def test_get_me_authenticated(self):
|
||||
"""Testira dohvat vlastitih podataka (uspjeh)."""
|
||||
self.client.force_authenticate(user=self.user)
|
||||
url = reverse('user-me') # Provjeri naziv u routeru
|
||||
|
||||
response = self.client.get(url)
|
||||
|
||||
assert response.status_code == status.HTTP_200_OK
|
||||
assert response.data['email'] == self.user.email
|
||||
assert 'is_serviser' in response.data
|
||||
|
||||
def test_get_me_unauthenticated(self):
|
||||
"""Testira pristup bez prijave (neuspjeh)."""
|
||||
url = reverse('user-me')
|
||||
|
||||
response = self.client.get(url)
|
||||
|
||||
# Ovisno o tvojim permission_classes, ovdje bi trebalo biti 401 ili 403
|
||||
assert response.status_code in [status.HTTP_401_UNAUTHORIZED, status.HTTP_403_FORBIDDEN]
|
||||
|
||||
def test_user_creation(self):
|
||||
"""Testira osnovno stvaranje korisnika u bazi."""
|
||||
assert User.objects.count() == 1
|
||||
assert self.user.is_serviser is False
|
||||
|
||||
def test_update_user_via_api(self):
|
||||
"""Testira cjelokupan tok: API -> ViewSet -> Service."""
|
||||
self.client.force_authenticate(user=self.user)
|
||||
url = reverse('user-detail', kwargs={'pk': self.user.id}) # Provjeri basename
|
||||
|
||||
new_data = {"first_name": "Inženjer"}
|
||||
|
||||
# Simuliramo PATCH zahtjev
|
||||
response = self.client.patch(url, new_data)
|
||||
|
||||
# Osvježi instancu iz baze
|
||||
self.user.refresh_from_db()
|
||||
|
||||
assert response.status_code == status.HTTP_200_OK
|
||||
assert self.user.first_name == "Inženjer"
|
||||
Reference in New Issue
Block a user