From a98a7f0645797b2f3a9c9cff651671073aabe08b Mon Sep 17 00:00:00 2001 From: yakudza Date: Tue, 26 Aug 2025 18:56:54 +0300 Subject: [PATCH] add tests to employees --- hr/tests/test_employees.py | 108 +++++++++++++++++++++++++++++++++ hr/tests/test_employees_api.py | 49 ++++++++++++++- 2 files changed, 156 insertions(+), 1 deletion(-) diff --git a/hr/tests/test_employees.py b/hr/tests/test_employees.py index 181c15f..f1c855a 100644 --- a/hr/tests/test_employees.py +++ b/hr/tests/test_employees.py @@ -1,16 +1,32 @@ from django.contrib.messages import get_messages +from django.core.files.uploadedfile import SimpleUploadedFile from django.test import ( Client, TestCase, ) from django.urls import reverse +from PIL import Image +from io import BytesIO from hr.models import Employee from hr.tests.factories import ( EmployeeFactory, PositionFactory, ) +def create_dummy_image(): + """Helper function to create a dummy image for tests.""" + image = Image.new('RGB', (100, 100), color='red') + image_io = BytesIO() + image.save(image_io, 'jpeg') + image_io.seek(0) + return SimpleUploadedFile('dummy_avatar.jpg', image_io.read(), content_type='image/jpeg') + + +def create_dummy_cv(): + """Helper function to create a dummy CV for tests.""" + return SimpleUploadedFile('dummy_cv.txt', b'dummy content', 'text/plain') + class EmployeeListViewTest(TestCase): def setUp(self): @@ -93,3 +109,95 @@ def test_successful_employee_creation_message(self): self.assertEqual(len(messages), 1) self.assertEqual(str(messages[0]), 'Працівника успішно створено.') +class EmployeeProfileViewTest(TestCase): + def setUp(self): + self.client = Client() + self.admin_user = EmployeeFactory(is_staff=True, is_superuser=True) + self.non_admin_user = EmployeeFactory() + self.employee = EmployeeFactory(avatar=create_dummy_image(), cv=create_dummy_cv()) + self.url = reverse('hr:employee_profile', kwargs={'pk': self.employee.pk}) + + def test_access_employee_profile_by_admin(self): + self.client.force_login(self.admin_user) + response = self.client.get(self.url) + self.assertEqual(response.status_code, 200) + self.assertTemplateUsed(response, 'employee_profile.html') + + def test_access_employee_profile_by_non_admin(self): + self.client.force_login(self.non_admin_user) + response = self.client.get(self.url) + self.assertEqual(response.status_code, 403) + + def test_employee_profile_content(self): + self.client.force_login(self.admin_user) + response = self.client.get(self.url) + self.assertTrue('employee' in response.context) + self.assertEqual(response.context['employee'], self.employee) + + +class EmployeeUpdateViewTest(TestCase): + def setUp(self): + self.client = Client() + self.admin_user = EmployeeFactory(is_staff=True, is_superuser=True) + self.non_admin_user = EmployeeFactory() + self.employee = EmployeeFactory(avatar=create_dummy_image(), cv=create_dummy_cv()) + self.position = PositionFactory() + self.url = reverse('hr:employee_update', kwargs={'pk': self.employee.pk}) + + def test_update_employee_by_admin(self): + self.client.force_login(self.admin_user) + updated_data = { + 'username': self.employee.username, + 'first_name': 'Updated by Admin', + 'last_name': self.employee.last_name, + 'email': self.employee.email, + 'position': self.position.id, + } + response = self.client.post(self.url, updated_data) + self.assertEqual(response.status_code, 302) + self.employee.refresh_from_db() + self.assertEqual(self.employee.first_name, 'Updated by Admin') + + def test_update_employee_by_non_admin(self): + self.client.force_login(self.non_admin_user) + updated_data = { + 'first_name': 'Should Not Update', + 'position': self.position.id, + } + response = self.client.post(self.url, updated_data) + self.assertEqual(response.status_code, 403) + self.employee.refresh_from_db() + self.assertNotEqual(self.employee.first_name, 'Should Not Update') + + def test_get_update_view_by_admin(self): + self.client.force_login(self.admin_user) + response = self.client.get(self.url) + self.assertEqual(response.status_code, 200) + self.assertTemplateUsed(response, 'employee_form.html') + + +class EmployeeDeleteViewTest(TestCase): + def setUp(self): + self.client = Client() + self.admin_user = EmployeeFactory(is_staff=True, is_superuser=True) + self.non_admin_user = EmployeeFactory() + self.employee_to_delete = EmployeeFactory() + self.url = reverse('hr:employee_delete', kwargs={'pk': self.employee_to_delete.pk}) + + def test_delete_employee_by_admin(self): + self.client.force_login(self.admin_user) + response = self.client.post(self.url) + self.assertEqual(response.status_code, 302) + self.assertFalse(Employee.objects.filter(pk=self.employee_to_delete.pk).exists()) + + def test_delete_employee_by_non_admin(self): + self.client.force_login(self.non_admin_user) + response = self.client.post(self.url) + self.assertEqual(response.status_code, 403) + self.assertTrue(Employee.objects.filter(pk=self.employee_to_delete.pk).exists()) + + def test_get_delete_view_by_admin(self): + self.client.force_login(self.admin_user) + response = self.client.get(self.url) + self.assertEqual(response.status_code, 200) + self.assertTemplateUsed(response, 'employee_confirm_delete.html') \ No newline at end of file diff --git a/hr/tests/test_employees_api.py b/hr/tests/test_employees_api.py index 83051d9..c4d7406 100644 --- a/hr/tests/test_employees_api.py +++ b/hr/tests/test_employees_api.py @@ -5,10 +5,11 @@ APITestCase, ) -from hr.models import Employee +from hr.models import Employee, Position, Department from hr.tests.factories import ( EmployeeFactory, PositionFactory, + DepartmentFactory, ) @@ -49,3 +50,49 @@ def test_search_employee(self): response = self.client.get(reverse('api-hr:employee-list'), {'search': 'Test'}) self.assertEqual(response.status_code, status.HTTP_200_OK) +class PositionViewSetTestCase(APITestCase): + def setUp(self): + self.client = APIClient() + self.user = Employee.objects.create_user(username='testuser', password='testpassword', email='test@gmail.com') + self.client.force_authenticate(user=self.user) + self.department = DepartmentFactory() + self.position = PositionFactory(department=self.department) + + def test_get_position_list(self): + PositionFactory.create_batch(5, department=self.department) + response = self.client.get(reverse('api-hr:position-list')) + + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.data['count'], 6) + + def test_create_position(self): + data = { + 'title': 'new position', + 'department': self.department.pk, + } + response = self.client.post(reverse('api-hr:position-list'), data) + + self.assertEqual(response.status_code, status.HTTP_201_CREATED) + self.assertTrue(Position.objects.filter(title=data['title']).exists()) + + def test_get_single_position(self): + response = self.client.get(reverse('api-hr:position-detail', kwargs={'pk': self.position.pk})) + + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.data['title'], self.position.title) + + def test_update_position(self): + new_title = 'updated title' + data = {'title': new_title} + response = self.client.patch(reverse('api-hr:position-detail', kwargs={'pk': self.position.pk}), data) + self.position.refresh_from_db() + + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(self.position.title, new_title) + + def test_delete_position(self): + position_to_delete = PositionFactory(department=self.department) + response = self.client.delete(reverse('api-hr:position-detail', kwargs={'pk': position_to_delete.pk})) + + self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT) + self.assertFalse(Position.objects.filter(pk=position_to_delete.pk).exists()) \ No newline at end of file