1386 lines
105 KiB
Plaintext
1386 lines
105 KiB
Plaintext
============================= test session starts =============================
|
||
platform win32 -- Python 3.12.6, pytest-8.4.1, pluggy-1.6.0 -- C:\Users\igor_\Dev\EUSRR\.venv\Scripts\python.exe
|
||
cachedir: .pytest_cache
|
||
django: version: 5.2.4, settings: eusrr_backend.settings (from ini)
|
||
rootdir: C:\Users\igor_\Dev\EUSRR\backend
|
||
configfile: pytest.ini
|
||
plugins: anyio-4.12.0, asyncio-1.3.0, django-4.11.1
|
||
asyncio: mode=Mode.AUTO, debug=False, asyncio_default_fixture_loop_scope=function, asyncio_default_test_loop_scope=function
|
||
collecting ... collected 150 items
|
||
|
||
tests/api/v1/employees/test_department_head_rights.py::test_head_can_update_department_without_explicit_role_perms FAILED [ 0%]
|
||
tests/api/v1/employees/test_department_head_rights.py::test_head_can_set_member_role_and_non_head_cannot FAILED [ 1%]
|
||
tests/api/v1/employees/test_department_head_rights.py::test_head_can_change_head_and_loses_rights_afterwards FAILED [ 2%]
|
||
tests/api/v1/employees/test_department_membership_separation.py::test_add_member_requires_manage_and_does_not_assign_role FAILED [ 2%]
|
||
tests/api/v1/employees/test_department_membership_separation.py::test_all_three_actions_require_auth_and_permissions FAILED [ 3%]
|
||
tests/api/v1/employees/test_department_membership_separation.py::test_set_member_role_requires_assign_not_manage FAILED [ 4%]
|
||
tests/api/v1/employees/test_department_membership_separation.py::test_set_member_role_does_not_create_membership_and_does_not_toggle_active FAILED [ 4%]
|
||
tests/api/v1/employees/test_department_membership_separation.py::test_add_member_ignores_role_parameter FAILED [ 5%]
|
||
tests/api/v1/employees/test_department_membership_separation.py::test_remove_member_requires_manage_and_does_not_touch_role FAILED [ 6%]
|
||
tests/api/v1/employees/test_department_roles.py::test_list_filtered_by_department FAILED [ 6%]
|
||
tests/api/v1/employees/test_department_roles.py::test_create_requires_assign_department_role FAILED [ 7%]
|
||
tests/api/v1/employees/test_department_roles.py::test_update_and_destroy_scope_enforced FAILED [ 8%]
|
||
tests/api/v1/employees/test_department_roles.py::test_perm_choices_and_perms_and_set_perms FAILED [ 8%]
|
||
tests/api/v1/employees/test_department_roles.py::test_set_perms_validates_payload FAILED [ 9%]
|
||
tests/api/v1/employees/test_department_roles.py::test_back_compat_permissions_field_contains_ids FAILED [ 10%]
|
||
tests/api/v1/employees/test_department_roles.py::test_create_with_scoped_permission_codes_and_update_name FAILED [ 10%]
|
||
tests/api/v1/employees/test_department_roles.py::test_cross_department_access_denied_for_set_perms FAILED [ 11%]
|
||
tests/api/v1/employees/test_department_roles_extra.py::test_unauth_cannot_list_or_get PASSED [ 12%]
|
||
tests/api/v1/employees/test_department_roles_extra.py::test_read_only_allowed_without_assign FAILED [ 12%]
|
||
tests/api/v1/employees/test_department_roles_extra.py::test_staff_override_for_write FAILED [ 13%]
|
||
tests/api/v1/employees/test_department_roles_extra.py::test_ordering_stable_by_name_then_id FAILED [ 14%]
|
||
tests/api/v1/employees/test_department_roles_extra.py::test_set_perms_ids_take_precedence_over_codes FAILED [ 14%]
|
||
tests/api/v1/employees/test_department_roles_extra.py::test_serializer_codes_override_scoped_permissions_on_create FAILED [ 15%]
|
||
tests/api/v1/employees/test_department_roles_extra.py::test_perm_choices_fields_and_nonempty FAILED [ 16%]
|
||
tests/api/v1/employees/test_department_roles_extra.py::test_destroy_requires_assign_in_same_department FAILED [ 16%]
|
||
tests/api/v1/employees/test_department_roles_extra.py::test_set_perms_dedup_and_replace_semantics FAILED [ 17%]
|
||
tests/api/v1/employees/test_departments.py::test_list_requires_auth PASSED [ 18%]
|
||
tests/api/v1/employees/test_departments.py::test_list_ok_for_authenticated FAILED [ 18%]
|
||
tests/api/v1/employees/test_departments.py::test_search_and_ordering FAILED [ 19%]
|
||
tests/api/v1/employees/test_departments.py::test_employees_count_adds_head_if_not_in_links FAILED [ 20%]
|
||
tests/api/v1/employees/test_departments.py::test_employees_count_not_double_count_head_if_in_links FAILED [ 20%]
|
||
tests/api/v1/employees/test_departments.py::test_create_requires_staff FAILED [ 21%]
|
||
tests/api/v1/employees/test_departments.py::test_destroy_requires_staff FAILED [ 22%]
|
||
tests/api/v1/employees/test_departments.py::test_partial_update_name_requires_manage_perm FAILED [ 22%]
|
||
tests/api/v1/employees/test_departments.py::test_partial_update_head_requires_change_head_perm FAILED [ 23%]
|
||
tests/api/v1/employees/test_departments.py::test_partial_update_head_same_value_does_not_require_extra_perm FAILED [ 24%]
|
||
tests/api/v1/employees/test_departments.py::test_set_head_by_role_with_perm FAILED [ 24%]
|
||
tests/api/v1/employees/test_departments.py::test_set_head_validation_inactive_employee FAILED [ 25%]
|
||
tests/api/v1/employees/test_departments.py::test_set_head_remove_with_null FAILED [ 26%]
|
||
tests/api/v1/employees/test_departments.py::test_set_head_requires_perm FAILED [ 26%]
|
||
tests/api/v1/employees/test_departments.py::test_set_member_role_happy_path FAILED [ 27%]
|
||
tests/api/v1/employees/test_departments.py::test_set_member_role_reject_foreign_role FAILED [ 28%]
|
||
tests/api/v1/employees/test_departments.py::test_set_member_role_requires_perm FAILED [ 28%]
|
||
tests/api/v1/employees/test_departments.py::test_set_member_role_missing_employee_id FAILED [ 29%]
|
||
tests/api/v1/employees/test_email_verification_security.py::TestEmailChangeResetsVerification::test_change_email_resets_email_verified_for_self FAILED [ 30%]
|
||
tests/api/v1/employees/test_email_verification_security.py::TestEmailChangeResetsVerification::test_change_email_via_me_endpoint_resets_verification FAILED [ 30%]
|
||
tests/api/v1/employees/test_email_verification_security.py::TestEmailChangeResetsVerification::test_change_email_sends_verification_code FAILED [ 31%]
|
||
tests/api/v1/employees/test_email_verification_security.py::TestEmailChangeResetsVerification::test_change_other_fields_does_not_reset_verification FAILED [ 32%]
|
||
tests/api/v1/employees/test_email_verification_security.py::TestEmailChangeResetsVerification::test_change_email_to_same_value_does_not_reset FAILED [ 32%]
|
||
tests/api/v1/employees/test_email_verification_security.py::TestUnverifiedUserRestrictions::test_unverified_user_cannot_create_department SKIPPED [ 33%]
|
||
tests/api/v1/employees/test_email_verification_security.py::TestUnverifiedUserRestrictions::test_unverified_user_cannot_update_other_employee SKIPPED [ 34%]
|
||
tests/api/v1/employees/test_email_verification_security.py::TestUnverifiedUserRestrictions::test_unverified_user_can_update_self_non_critical_fields FAILED [ 34%]
|
||
tests/api/v1/employees/test_email_verification_security.py::TestUnverifiedUserRestrictions::test_unverified_user_can_verify_email FAILED [ 35%]
|
||
tests/api/v1/employees/test_email_verification_security.py::TestUnverifiedUserRestrictions::test_unverified_user_can_resend_code FAILED [ 36%]
|
||
tests/api/v1/employees/test_email_verification_security.py::TestResendEmailLogic::test_resend_email_generates_new_code FAILED [ 36%]
|
||
tests/api/v1/employees/test_email_verification_security.py::TestResendEmailLogic::test_resend_email_to_verified_user_fails FAILED [ 37%]
|
||
tests/api/v1/employees/test_email_verification_security.py::TestResendEmailLogic::test_resend_email_to_nonexistent_user_fails PASSED [ 38%]
|
||
tests/api/v1/employees/test_email_verification_security.py::TestResendEmailLogic::test_old_code_becomes_invalid_after_resend FAILED [ 38%]
|
||
tests/api/v1/employees/test_email_verification_security.py::TestStaffCanBypassRestrictions::test_admin_created_user_is_verified_by_default SKIPPED [ 39%]
|
||
tests/api/v1/employees/test_email_verification_security.py::TestStaffCanBypassRestrictions::test_superuser_is_verified_by_default PASSED [ 40%]
|
||
tests/api/v1/employees/test_email_verification_security.py::TestEmailVerificationWorkflow::test_full_registration_and_verification_flow FAILED [ 40%]
|
||
tests/api/v1/employees/test_email_verification_security.py::TestEmailVerificationWorkflow::test_change_email_and_verify_new_one FAILED [ 41%]
|
||
tests/api/v1/employees/test_employee_actions.py::test_list_requires_auth_and_filtering PASSED [ 42%]
|
||
tests/api/v1/employees/test_employee_actions.py::test_create_requires_perm_or_staff PASSED [ 42%]
|
||
tests/api/v1/employees/test_employee_actions.py::test_dismissal_deactivates_employee_and_links PASSED [ 43%]
|
||
tests/api/v1/employees/test_employee_actions.py::test_non_dismissal_activates_employee PASSED [ 44%]
|
||
tests/api/v1/employees/test_employee_actions.py::test_update_to_dismissed_applies_effects PASSED [ 44%]
|
||
tests/api/v1/employees/test_employee_actions.py::test_delete_requires_perm_or_staff PASSED [ 45%]
|
||
tests/api/v1/employees/test_employee_actions.py::test_dismissal_syncs_to_ldap_if_has_dn PASSED [ 46%]
|
||
tests/api/v1/employees/test_employee_actions.py::test_dismissal_handles_ldap_error_gracefully PASSED [ 46%]
|
||
tests/api/v1/employees/test_employee_actions.py::test_non_dismissal_syncs_activation_to_ldap PASSED [ 47%]
|
||
tests/api/v1/employees/test_employee_actions.py::test_dismissal_skips_ldap_if_no_dn PASSED [ 48%]
|
||
tests/api/v1/employees/test_employee_actions.py::test_dismissal_works_when_ldap_disabled FAILED [ 48%]
|
||
tests/api/v1/employees/test_employee_actions.py::test_dismissal_moves_to_dismissed_ou PASSED [ 49%]
|
||
tests/api/v1/employees/test_employee_actions.py::test_restoration_moves_from_dismissed_to_users FAILED [ 50%]
|
||
tests/api/v1/employees/test_employee_actions.py::test_dismissal_without_department_moves_to_dismissed PASSED [ 50%]
|
||
tests/api/v1/employees/test_employees.py::test_list_requires_auth PASSED [ 51%]
|
||
tests/api/v1/employees/test_employees.py::test_list_ok_for_authenticated PASSED [ 52%]
|
||
tests/api/v1/employees/test_employees.py::test_retrieve_requires_auth PASSED [ 52%]
|
||
tests/api/v1/employees/test_employees.py::test_retrieve_ok PASSED [ 53%]
|
||
tests/api/v1/employees/test_employees.py::test_search_by_email_and_last_name PASSED [ 54%]
|
||
tests/api/v1/employees/test_employees.py::test_filter_by_department_includes_members_and_head PASSED [ 54%]
|
||
tests/api/v1/employees/test_employees.py::test_filter_by_position PASSED [ 55%]
|
||
tests/api/v1/employees/test_employees.py::test_filter_by_skills_any_of PASSED [ 56%]
|
||
tests/api/v1/employees/test_employees.py::test_filter_by_email_verified_and_active PASSED [ 56%]
|
||
tests/api/v1/employees/test_employees.py::test_filter_actually_active_logic PASSED [ 57%]
|
||
tests/api/v1/employees/test_employees.py::test_create_requires_staff FAILED [ 58%]
|
||
tests/api/v1/employees/test_employees.py::test_partial_update_self_allowed PASSED [ 58%]
|
||
tests/api/v1/employees/test_employees.py::test_partial_update_other_forbidden_for_regular_user PASSED [ 59%]
|
||
tests/api/v1/employees/test_employees.py::test_partial_update_other_allowed_for_staff PASSED [ 60%]
|
||
tests/api/v1/employees/test_employees.py::test_destroy_requires_admin FAILED [ 60%]
|
||
tests/api/v1/employees/test_employees.py::test_me_get_returns_current_user PASSED [ 61%]
|
||
tests/api/v1/employees/test_employees.py::test_me_patch_updates_profile PASSED [ 62%]
|
||
tests/api/v1/employees/test_employees.py::test_me_patch_rejects_when_all_contacts_empty FAILED [ 62%]
|
||
tests/api/v1/employees/test_employees_fields_in_list.py::test_list_includes_basic_fields FAILED [ 63%]
|
||
tests/api/v1/employees/test_employees_fields_in_list.py::test_list_departments_include_role FAILED [ 64%]
|
||
tests/api/v1/employees/test_ldap_optional_departments.py::test_department_list_accessible_without_ldap PASSED [ 64%]
|
||
tests/api/v1/employees/test_ldap_optional_departments.py::test_retrieve_department_without_ldap PASSED [ 65%]
|
||
tests/api/v1/employees/test_ldap_optional_groups.py::test_create_group_with_ldap SKIPPED [ 66%]
|
||
tests/api/v1/employees/test_ldap_optional_groups.py::test_create_group_without_ldap ERROR [ 66%]
|
||
tests/api/v1/employees/test_ldap_optional_groups.py::test_add_members_with_ldap SKIPPED [ 67%]
|
||
tests/api/v1/employees/test_ldap_optional_groups.py::test_add_members_without_ldap ERROR [ 68%]
|
||
tests/api/v1/employees/test_ldap_optional_groups.py::test_destroy_group_with_ldap SKIPPED [ 68%]
|
||
tests/api/v1/employees/test_ldap_optional_groups.py::test_destroy_group_without_ldap ERROR [ 69%]
|
||
tests/api/v1/employees/test_ldap_optional_groups.py::test_get_members_with_ldap SKIPPED [ 70%]
|
||
tests/api/v1/employees/test_ldap_optional_groups.py::test_get_members_without_ldap ERROR [ 70%]
|
||
tests/api/v1/employees/test_ldap_optional_helpers.py::test_is_ldap_enabled_returns_true_when_enabled PASSED [ 71%]
|
||
tests/api/v1/employees/test_ldap_optional_helpers.py::test_is_ldap_enabled_returns_false_when_disabled PASSED [ 72%]
|
||
tests/api/v1/employees/test_ldap_optional_helpers.py::test_is_ldap_enabled_returns_false_when_not_set PASSED [ 72%]
|
||
tests/api/v1/employees/test_ldap_optional_helpers.py::test_ldap_try_success_with_ldap_enabled PASSED [ 73%]
|
||
tests/api/v1/employees/test_ldap_optional_helpers.py::test_ldap_try_ldap_error_returns_502 PASSED [ 74%]
|
||
tests/api/v1/employees/test_ldap_optional_helpers.py::test_ldap_try_skips_when_ldap_disabled PASSED [ 74%]
|
||
tests/api/v1/employees/test_ldap_optional_helpers.py::test_ldap_try_service_error_returns_502 PASSED [ 75%]
|
||
tests/api/v1/employees/test_ldap_optional_helpers.py::test_ldap_try_db_error_returns_502 PASSED [ 76%]
|
||
tests/api/v1/employees/test_ldap_optional_register.py::test_register_with_ldap_creates_user_in_ldap_and_db SKIPPED [ 76%]
|
||
tests/api/v1/employees/test_ldap_optional_register.py::test_register_with_ldap_duplicate_email_returns_400 SKIPPED [ 77%]
|
||
tests/api/v1/employees/test_ldap_optional_register.py::test_register_without_ldap_creates_user_only_in_db FAILED [ 78%]
|
||
tests/api/v1/employees/test_ldap_optional_register.py::test_register_without_ldap_duplicate_email_returns_400 PASSED [ 78%]
|
||
tests/api/v1/employees/test_ldap_optional_register.py::test_register_validates_required_fields[with_ldap] SKIPPED [ 79%]
|
||
tests/api/v1/employees/test_ldap_optional_register.py::test_register_validates_required_fields[without_ldap] SKIPPED [ 80%]
|
||
tests/api/v1/employees/test_ldap_optional_verify_email.py::test_verify_email_with_ldap_activates_user_in_ldap_and_db SKIPPED [ 80%]
|
||
tests/api/v1/employees/test_ldap_optional_verify_email.py::test_verify_email_without_ldap_activates_user_only_in_db PASSED [ 81%]
|
||
tests/api/v1/employees/test_ldap_optional_verify_email.py::test_verify_email_with_wrong_code_returns_400_without_ldap PASSED [ 82%]
|
||
tests/api/v1/employees/test_ldap_optional_verify_email.py::test_verify_email_already_verified_returns_400_without_ldap PASSED [ 82%]
|
||
tests/api/v1/employees/test_ldap_optional_verify_email.py::test_verify_email_nonexistent_user_returns_404_without_ldap PASSED [ 83%]
|
||
tests/api/v1/employees/test_ldap_optional_verify_email.py::test_verify_email_empty_code_returns_400_without_ldap PASSED [ 84%]
|
||
tests/api/v1/employees/test_ldap_optional_verify_email.py::test_verify_email_ldap_error_returns_502 SKIPPED [ 84%]
|
||
tests/api/v1/employees/test_positions.py::test_list_requires_auth PASSED [ 85%]
|
||
tests/api/v1/employees/test_positions.py::test_create_permissions FAILED [ 86%]
|
||
tests/api/v1/employees/test_positions.py::test_update_permissions_and_search_ordering FAILED [ 86%]
|
||
tests/api/v1/employees/test_positions.py::test_delete_permissions PASSED [ 87%]
|
||
tests/api/v1/employees/test_positions.py::test_set_groups_requires_special_perm FAILED [ 88%]
|
||
tests/api/v1/employees/test_positions.py::test_add_and_remove_groups_and_permissions_endpoint FAILED [ 88%]
|
||
tests/api/v1/employees/test_positions.py::test_groups_payload_validation PASSED [ 89%]
|
||
tests/api/v1/employees/test_role_assignment.py::TestRoleAssignmentEndpoints::test_assign_role_to_any_employee FAILED [ 90%]
|
||
tests/api/v1/employees/test_role_assignment.py::TestRoleAssignmentEndpoints::test_revoke_role FAILED [ 90%]
|
||
tests/api/v1/employees/test_role_assignment.py::TestRoleAssignmentEndpoints::test_assignments_list FAILED [ 91%]
|
||
tests/api/v1/employees/test_role_assignment.py::TestRoleAssignmentEndpoints::test_assign_requires_permission FAILED [ 92%]
|
||
tests/api/v1/employees/test_role_assignment.py::TestRoleAssignmentEndpoints::test_assign_with_dept_permission FAILED [ 92%]
|
||
tests/api/v1/employees/test_role_assignment.py::TestRoleAssignmentPermissions::test_permission_check_via_role_assignment FAILED [ 93%]
|
||
tests/api/v1/employees/test_role_assignment.py::TestRoleAssignmentPermissions::test_inactive_assignment_does_not_grant_permission FAILED [ 94%]
|
||
tests/api/v1/employees/test_skills.py::test_list_search_ordering_requires_auth PASSED [ 94%]
|
||
tests/api/v1/employees/test_skills.py::test_create_allowed_for_regular_user PASSED [ 95%]
|
||
tests/api/v1/employees/test_skills.py::test_update_delete_permissions PASSED [ 96%]
|
||
tests/api/v1/employees/test_skills.py::test_staff_bypasses_permissions PASSED [ 96%]
|
||
tests/api/v1/employees/test_skills.py::test_bulk_create_by_regular_user PASSED [ 97%]
|
||
tests/api/v1/employees/test_skills.py::test_merge_requires_perm_and_reassigns PASSED [ 98%]
|
||
tests/api/v1/employees/test_skills.py::test_merge_same_id_and_invalid_ids PASSED [ 98%]
|
||
tests/api/v1/employees/test_skills.py::test_merge_without_reassign_or_delete PASSED [ 99%]
|
||
tests/api/v1/employees/test_skills.py::test_merge_idempotent_if_employee_already_has_target PASSED [100%]
|
||
|
||
=================================== ERRORS ====================================
|
||
______________ ERROR at setup of test_create_group_without_ldap _______________
|
||
Fixture "make_user" called directly. Fixtures are not meant to be called directly,
|
||
but are created automatically when test functions request them as parameters.
|
||
See https://docs.pytest.org/en/stable/explanation/fixtures.html for more information about fixtures, and
|
||
https://docs.pytest.org/en/stable/deprecations.html#calling-fixtures-directly
|
||
_______________ ERROR at setup of test_add_members_without_ldap _______________
|
||
Fixture "make_user" called directly. Fixtures are not meant to be called directly,
|
||
but are created automatically when test functions request them as parameters.
|
||
See https://docs.pytest.org/en/stable/explanation/fixtures.html for more information about fixtures, and
|
||
https://docs.pytest.org/en/stable/deprecations.html#calling-fixtures-directly
|
||
______________ ERROR at setup of test_destroy_group_without_ldap ______________
|
||
Fixture "make_user" called directly. Fixtures are not meant to be called directly,
|
||
but are created automatically when test functions request them as parameters.
|
||
See https://docs.pytest.org/en/stable/explanation/fixtures.html for more information about fixtures, and
|
||
https://docs.pytest.org/en/stable/deprecations.html#calling-fixtures-directly
|
||
_______________ ERROR at setup of test_get_members_without_ldap _______________
|
||
Fixture "make_user" called directly. Fixtures are not meant to be called directly,
|
||
but are created automatically when test functions request them as parameters.
|
||
See https://docs.pytest.org/en/stable/explanation/fixtures.html for more information about fixtures, and
|
||
https://docs.pytest.org/en/stable/deprecations.html#calling-fixtures-directly
|
||
================================== FAILURES ===================================
|
||
_________ test_head_can_update_department_without_explicit_role_perms _________
|
||
employees\ldap\services\department_service.py:136: in update_department
|
||
current_dn = self._get_department_dn(dept)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
employees\ldap\services\department_service.py:981: in _get_department_dn
|
||
raise DirectoryServiceError(
|
||
E employees.ldap.errors.DirectoryServiceError: Department has no ldap_dn in sync state
|
||
|
||
The above exception was the direct cause of the following exception:
|
||
tests\api\v1\employees\test_department_head_rights.py:97: in test_head_can_update_department_without_explicit_role_perms
|
||
resp = api_client.patch(url, {"description": "new"}, format="json")
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
..\.venv\Lib\site-packages\rest_framework\test.py:315: in patch
|
||
response = super().patch(
|
||
..\.venv\Lib\site-packages\rest_framework\test.py:221: in patch
|
||
return self.generic('PATCH', path, data, content_type, **extra)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
..\.venv\Lib\site-packages\rest_framework\test.py:237: in generic
|
||
return super().generic(
|
||
..\.venv\Lib\site-packages\django\test\client.py:671: in generic
|
||
return self.request(**r)
|
||
^^^^^^^^^^^^^^^^^
|
||
..\.venv\Lib\site-packages\rest_framework\test.py:289: in request
|
||
return super().request(**kwargs)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
..\.venv\Lib\site-packages\rest_framework\test.py:241: in request
|
||
request = super().request(**kwargs)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
..\.venv\Lib\site-packages\django\test\client.py:1087: in request
|
||
self.check_exception(response)
|
||
..\.venv\Lib\site-packages\django\test\client.py:802: in check_exception
|
||
raise exc_value
|
||
..\.venv\Lib\site-packages\django\core\handlers\exception.py:55: in inner
|
||
response = get_response(request)
|
||
^^^^^^^^^^^^^^^^^^^^^
|
||
..\.venv\Lib\site-packages\django\core\handlers\base.py:197: in _get_response
|
||
response = wrapped_callback(request, *callback_args, **callback_kwargs)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
..\.venv\Lib\site-packages\django\views\decorators\csrf.py:65: in _view_wrapper
|
||
return view_func(request, *args, **kwargs)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
..\.venv\Lib\site-packages\rest_framework\viewsets.py:125: in view
|
||
return self.dispatch(request, *args, **kwargs)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
..\.venv\Lib\site-packages\rest_framework\views.py:515: in dispatch
|
||
response = self.handle_exception(exc)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
..\.venv\Lib\site-packages\rest_framework\views.py:475: in handle_exception
|
||
self.raise_uncaught_exception(exc)
|
||
..\.venv\Lib\site-packages\rest_framework\views.py:486: in raise_uncaught_exception
|
||
raise exc
|
||
..\.venv\Lib\site-packages\rest_framework\views.py:512: in dispatch
|
||
response = handler(request, *args, **kwargs)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
api\v1\employees\views\departments.py:269: in partial_update
|
||
instance = svc.update_department(instance, changes)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
employees\ldap\directory_service.py:218: in update_department
|
||
return self._department_service.update_department(dept, changes)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
employees\ldap\services\department_service.py:138: in update_department
|
||
raise DirectoryServiceError(
|
||
E employees.ldap.errors.DirectoryServiceError: <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DN <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (sync state): Department has no ldap_dn in sync state
|
||
---------------------------- Captured stderr setup ----------------------------
|
||
Creating test database for alias 'default'...
|
||
|
||
---------------------------- Captured stderr call -----------------------------
|
||
[ERROR] 2026-02-16 17:34:50,458 django.request:253 Internal Server Error: /api/v1/departments/1/
|
||
Traceback (most recent call last):
|
||
File "C:\Users\igor_\Dev\EUSRR\backend\employees\ldap\services\department_service.py", line 136, in update_department
|
||
current_dn = self._get_department_dn(dept)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
File "C:\Users\igor_\Dev\EUSRR\backend\employees\ldap\services\department_service.py", line 981, in _get_department_dn
|
||
raise DirectoryServiceError(
|
||
employees.ldap.errors.DirectoryServiceError: Department has no ldap_dn in sync state
|
||
|
||
The above exception was the direct cause of the following exception:
|
||
|
||
Traceback (most recent call last):
|
||
File "C:\Users\igor_\Dev\EUSRR\.venv\Lib\site-packages\django\core\handlers\exception.py", line 55, in inner
|
||
response = get_response(request)
|
||
^^^^^^^^^^^^^^^^^^^^^
|
||
File "C:\Users\igor_\Dev\EUSRR\.venv\Lib\site-packages\django\core\handlers\base.py", line 197, in _get_response
|
||
response = wrapped_callback(request, *callback_args, **callback_kwargs)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
File "C:\Users\igor_\Dev\EUSRR\.venv\Lib\site-packages\django\views\decorators\csrf.py", line 65, in _view_wrapper
|
||
return view_func(request, *args, **kwargs)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
File "C:\Users\igor_\Dev\EUSRR\.venv\Lib\site-packages\rest_framework\viewsets.py", line 125, in view
|
||
return self.dispatch(request, *args, **kwargs)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
File "C:\Users\igor_\Dev\EUSRR\.venv\Lib\site-packages\rest_framework\views.py", line 515, in dispatch
|
||
response = self.handle_exception(exc)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
File "C:\Users\igor_\Dev\EUSRR\.venv\Lib\site-packages\rest_framework\views.py", line 475, in handle_exception
|
||
self.raise_uncaught_exception(exc)
|
||
File "C:\Users\igor_\Dev\EUSRR\.venv\Lib\site-packages\rest_framework\views.py", line 486, in raise_uncaught_exception
|
||
raise exc
|
||
File "C:\Users\igor_\Dev\EUSRR\.venv\Lib\site-packages\rest_framework\views.py", line 512, in dispatch
|
||
response = handler(request, *args, **kwargs)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
File "C:\Users\igor_\Dev\EUSRR\backend\api\v1\employees\views\departments.py", line 269, in partial_update
|
||
instance = svc.update_department(instance, changes)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
File "C:\Users\igor_\Dev\EUSRR\backend\employees\ldap\directory_service.py", line 218, in update_department
|
||
return self._department_service.update_department(dept, changes)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
File "C:\Users\igor_\Dev\EUSRR\backend\employees\ldap\services\department_service.py", line 138, in update_department
|
||
raise DirectoryServiceError(
|
||
employees.ldap.errors.DirectoryServiceError: <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DN <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (sync state): Department has no ldap_dn in sync state
|
||
______________ test_head_can_set_member_role_and_non_head_cannot ______________
|
||
tests\api\v1\employees\test_department_head_rights.py:118: in test_head_can_set_member_role_and_non_head_cannot
|
||
assert resp.status_code == status.HTTP_200_OK
|
||
E assert 502 == 200
|
||
E + where 502 = <Response status_code=502, "application/json">.status_code
|
||
E + and 200 = status.HTTP_200_OK
|
||
---------------------------- Captured stderr call -----------------------------
|
||
[ERROR] 2026-02-16 17:34:50,809 django.request:253 Bad Gateway: /api/v1/departments/2/set_member_role/
|
||
____________ test_head_can_change_head_and_loses_rights_afterwards ____________
|
||
tests\api\v1\employees\test_department_head_rights.py:143: in test_head_can_change_head_and_loses_rights_afterwards
|
||
assert resp.status_code == status.HTTP_200_OK
|
||
E assert 400 == 200
|
||
E + where 400 = <Response status_code=400, "application/json">.status_code
|
||
E + and 200 = status.HTTP_200_OK
|
||
---------------------------- Captured stderr call -----------------------------
|
||
[WARNING] 2026-02-16 17:34:50,890 django.request:253 Bad Request: /api/v1/departments/3/set_head/
|
||
__________ test_add_member_requires_manage_and_does_not_assign_role ___________
|
||
Fixture "make_user" called directly. Fixtures are not meant to be called directly,
|
||
but are created automatically when test functions request them as parameters.
|
||
See https://docs.pytest.org/en/stable/explanation/fixtures.html for more information about fixtures, and
|
||
https://docs.pytest.org/en/stable/deprecations.html#calling-fixtures-directly
|
||
_____________ test_all_three_actions_require_auth_and_permissions _____________
|
||
Fixture "make_user" called directly. Fixtures are not meant to be called directly,
|
||
but are created automatically when test functions request them as parameters.
|
||
See https://docs.pytest.org/en/stable/explanation/fixtures.html for more information about fixtures, and
|
||
https://docs.pytest.org/en/stable/deprecations.html#calling-fixtures-directly
|
||
_______________ test_set_member_role_requires_assign_not_manage _______________
|
||
Fixture "make_user" called directly. Fixtures are not meant to be called directly,
|
||
but are created automatically when test functions request them as parameters.
|
||
See https://docs.pytest.org/en/stable/explanation/fixtures.html for more information about fixtures, and
|
||
https://docs.pytest.org/en/stable/deprecations.html#calling-fixtures-directly
|
||
_ test_set_member_role_does_not_create_membership_and_does_not_toggle_active __
|
||
Fixture "make_user" called directly. Fixtures are not meant to be called directly,
|
||
but are created automatically when test functions request them as parameters.
|
||
See https://docs.pytest.org/en/stable/explanation/fixtures.html for more information about fixtures, and
|
||
https://docs.pytest.org/en/stable/deprecations.html#calling-fixtures-directly
|
||
___________________ test_add_member_ignores_role_parameter ____________________
|
||
Fixture "make_user" called directly. Fixtures are not meant to be called directly,
|
||
but are created automatically when test functions request them as parameters.
|
||
See https://docs.pytest.org/en/stable/explanation/fixtures.html for more information about fixtures, and
|
||
https://docs.pytest.org/en/stable/deprecations.html#calling-fixtures-directly
|
||
_________ test_remove_member_requires_manage_and_does_not_touch_role __________
|
||
Fixture "make_user" called directly. Fixtures are not meant to be called directly,
|
||
but are created automatically when test functions request them as parameters.
|
||
See https://docs.pytest.org/en/stable/explanation/fixtures.html for more information about fixtures, and
|
||
https://docs.pytest.org/en/stable/deprecations.html#calling-fixtures-directly
|
||
______________________ test_list_filtered_by_department _______________________
|
||
Fixture "make_user" called directly. Fixtures are not meant to be called directly,
|
||
but are created automatically when test functions request them as parameters.
|
||
See https://docs.pytest.org/en/stable/explanation/fixtures.html for more information about fixtures, and
|
||
https://docs.pytest.org/en/stable/deprecations.html#calling-fixtures-directly
|
||
_________________ test_create_requires_assign_department_role _________________
|
||
Fixture "make_user" called directly. Fixtures are not meant to be called directly,
|
||
but are created automatically when test functions request them as parameters.
|
||
See https://docs.pytest.org/en/stable/explanation/fixtures.html for more information about fixtures, and
|
||
https://docs.pytest.org/en/stable/deprecations.html#calling-fixtures-directly
|
||
___________________ test_update_and_destroy_scope_enforced ____________________
|
||
Fixture "make_user" called directly. Fixtures are not meant to be called directly,
|
||
but are created automatically when test functions request them as parameters.
|
||
See https://docs.pytest.org/en/stable/explanation/fixtures.html for more information about fixtures, and
|
||
https://docs.pytest.org/en/stable/deprecations.html#calling-fixtures-directly
|
||
__________________ test_perm_choices_and_perms_and_set_perms __________________
|
||
Fixture "make_user" called directly. Fixtures are not meant to be called directly,
|
||
but are created automatically when test functions request them as parameters.
|
||
See https://docs.pytest.org/en/stable/explanation/fixtures.html for more information about fixtures, and
|
||
https://docs.pytest.org/en/stable/deprecations.html#calling-fixtures-directly
|
||
______________________ test_set_perms_validates_payload _______________________
|
||
Fixture "make_user" called directly. Fixtures are not meant to be called directly,
|
||
but are created automatically when test functions request them as parameters.
|
||
See https://docs.pytest.org/en/stable/explanation/fixtures.html for more information about fixtures, and
|
||
https://docs.pytest.org/en/stable/deprecations.html#calling-fixtures-directly
|
||
_______________ test_back_compat_permissions_field_contains_ids _______________
|
||
Fixture "make_user" called directly. Fixtures are not meant to be called directly,
|
||
but are created automatically when test functions request them as parameters.
|
||
See https://docs.pytest.org/en/stable/explanation/fixtures.html for more information about fixtures, and
|
||
https://docs.pytest.org/en/stable/deprecations.html#calling-fixtures-directly
|
||
__________ test_create_with_scoped_permission_codes_and_update_name ___________
|
||
Fixture "make_user" called directly. Fixtures are not meant to be called directly,
|
||
but are created automatically when test functions request them as parameters.
|
||
See https://docs.pytest.org/en/stable/explanation/fixtures.html for more information about fixtures, and
|
||
https://docs.pytest.org/en/stable/deprecations.html#calling-fixtures-directly
|
||
______________ test_cross_department_access_denied_for_set_perms ______________
|
||
Fixture "make_user" called directly. Fixtures are not meant to be called directly,
|
||
but are created automatically when test functions request them as parameters.
|
||
See https://docs.pytest.org/en/stable/explanation/fixtures.html for more information about fixtures, and
|
||
https://docs.pytest.org/en/stable/deprecations.html#calling-fixtures-directly
|
||
____________________ test_read_only_allowed_without_assign ____________________
|
||
Fixture "make_user" called directly. Fixtures are not meant to be called directly,
|
||
but are created automatically when test functions request them as parameters.
|
||
See https://docs.pytest.org/en/stable/explanation/fixtures.html for more information about fixtures, and
|
||
https://docs.pytest.org/en/stable/deprecations.html#calling-fixtures-directly
|
||
________________________ test_staff_override_for_write ________________________
|
||
Fixture "make_user" called directly. Fixtures are not meant to be called directly,
|
||
but are created automatically when test functions request them as parameters.
|
||
See https://docs.pytest.org/en/stable/explanation/fixtures.html for more information about fixtures, and
|
||
https://docs.pytest.org/en/stable/deprecations.html#calling-fixtures-directly
|
||
____________________ test_ordering_stable_by_name_then_id _____________________
|
||
Fixture "make_user" called directly. Fixtures are not meant to be called directly,
|
||
but are created automatically when test functions request them as parameters.
|
||
See https://docs.pytest.org/en/stable/explanation/fixtures.html for more information about fixtures, and
|
||
https://docs.pytest.org/en/stable/deprecations.html#calling-fixtures-directly
|
||
________________ test_set_perms_ids_take_precedence_over_codes ________________
|
||
Fixture "make_user" called directly. Fixtures are not meant to be called directly,
|
||
but are created automatically when test functions request them as parameters.
|
||
See https://docs.pytest.org/en/stable/explanation/fixtures.html for more information about fixtures, and
|
||
https://docs.pytest.org/en/stable/deprecations.html#calling-fixtures-directly
|
||
_________ test_serializer_codes_override_scoped_permissions_on_create _________
|
||
Fixture "make_user" called directly. Fixtures are not meant to be called directly,
|
||
but are created automatically when test functions request them as parameters.
|
||
See https://docs.pytest.org/en/stable/explanation/fixtures.html for more information about fixtures, and
|
||
https://docs.pytest.org/en/stable/deprecations.html#calling-fixtures-directly
|
||
____________________ test_perm_choices_fields_and_nonempty ____________________
|
||
Fixture "make_user" called directly. Fixtures are not meant to be called directly,
|
||
but are created automatically when test functions request them as parameters.
|
||
See https://docs.pytest.org/en/stable/explanation/fixtures.html for more information about fixtures, and
|
||
https://docs.pytest.org/en/stable/deprecations.html#calling-fixtures-directly
|
||
_______________ test_destroy_requires_assign_in_same_department _______________
|
||
Fixture "make_user" called directly. Fixtures are not meant to be called directly,
|
||
but are created automatically when test functions request them as parameters.
|
||
See https://docs.pytest.org/en/stable/explanation/fixtures.html for more information about fixtures, and
|
||
https://docs.pytest.org/en/stable/deprecations.html#calling-fixtures-directly
|
||
_________________ test_set_perms_dedup_and_replace_semantics __________________
|
||
Fixture "make_user" called directly. Fixtures are not meant to be called directly,
|
||
but are created automatically when test functions request them as parameters.
|
||
See https://docs.pytest.org/en/stable/explanation/fixtures.html for more information about fixtures, and
|
||
https://docs.pytest.org/en/stable/deprecations.html#calling-fixtures-directly
|
||
_______________________ test_list_ok_for_authenticated ________________________
|
||
Fixture "make_user" called directly. Fixtures are not meant to be called directly,
|
||
but are created automatically when test functions request them as parameters.
|
||
See https://docs.pytest.org/en/stable/explanation/fixtures.html for more information about fixtures, and
|
||
https://docs.pytest.org/en/stable/deprecations.html#calling-fixtures-directly
|
||
__________________________ test_search_and_ordering ___________________________
|
||
Fixture "make_user" called directly. Fixtures are not meant to be called directly,
|
||
but are created automatically when test functions request them as parameters.
|
||
See https://docs.pytest.org/en/stable/explanation/fixtures.html for more information about fixtures, and
|
||
https://docs.pytest.org/en/stable/deprecations.html#calling-fixtures-directly
|
||
_______________ test_employees_count_adds_head_if_not_in_links ________________
|
||
Fixture "make_user" called directly. Fixtures are not meant to be called directly,
|
||
but are created automatically when test functions request them as parameters.
|
||
See https://docs.pytest.org/en/stable/explanation/fixtures.html for more information about fixtures, and
|
||
https://docs.pytest.org/en/stable/deprecations.html#calling-fixtures-directly
|
||
___________ test_employees_count_not_double_count_head_if_in_links ____________
|
||
Fixture "make_user" called directly. Fixtures are not meant to be called directly,
|
||
but are created automatically when test functions request them as parameters.
|
||
See https://docs.pytest.org/en/stable/explanation/fixtures.html for more information about fixtures, and
|
||
https://docs.pytest.org/en/stable/deprecations.html#calling-fixtures-directly
|
||
_________________________ test_create_requires_staff __________________________
|
||
Fixture "make_user" called directly. Fixtures are not meant to be called directly,
|
||
but are created automatically when test functions request them as parameters.
|
||
See https://docs.pytest.org/en/stable/explanation/fixtures.html for more information about fixtures, and
|
||
https://docs.pytest.org/en/stable/deprecations.html#calling-fixtures-directly
|
||
_________________________ test_destroy_requires_staff _________________________
|
||
Fixture "make_user" called directly. Fixtures are not meant to be called directly,
|
||
but are created automatically when test functions request them as parameters.
|
||
See https://docs.pytest.org/en/stable/explanation/fixtures.html for more information about fixtures, and
|
||
https://docs.pytest.org/en/stable/deprecations.html#calling-fixtures-directly
|
||
________________ test_partial_update_name_requires_manage_perm ________________
|
||
Fixture "make_user" called directly. Fixtures are not meant to be called directly,
|
||
but are created automatically when test functions request them as parameters.
|
||
See https://docs.pytest.org/en/stable/explanation/fixtures.html for more information about fixtures, and
|
||
https://docs.pytest.org/en/stable/deprecations.html#calling-fixtures-directly
|
||
_____________ test_partial_update_head_requires_change_head_perm ______________
|
||
Fixture "make_user" called directly. Fixtures are not meant to be called directly,
|
||
but are created automatically when test functions request them as parameters.
|
||
See https://docs.pytest.org/en/stable/explanation/fixtures.html for more information about fixtures, and
|
||
https://docs.pytest.org/en/stable/deprecations.html#calling-fixtures-directly
|
||
_______ test_partial_update_head_same_value_does_not_require_extra_perm _______
|
||
Fixture "make_user" called directly. Fixtures are not meant to be called directly,
|
||
but are created automatically when test functions request them as parameters.
|
||
See https://docs.pytest.org/en/stable/explanation/fixtures.html for more information about fixtures, and
|
||
https://docs.pytest.org/en/stable/deprecations.html#calling-fixtures-directly
|
||
_______________________ test_set_head_by_role_with_perm _______________________
|
||
Fixture "make_user" called directly. Fixtures are not meant to be called directly,
|
||
but are created automatically when test functions request them as parameters.
|
||
See https://docs.pytest.org/en/stable/explanation/fixtures.html for more information about fixtures, and
|
||
https://docs.pytest.org/en/stable/deprecations.html#calling-fixtures-directly
|
||
_________________ test_set_head_validation_inactive_employee __________________
|
||
Fixture "make_user" called directly. Fixtures are not meant to be called directly,
|
||
but are created automatically when test functions request them as parameters.
|
||
See https://docs.pytest.org/en/stable/explanation/fixtures.html for more information about fixtures, and
|
||
https://docs.pytest.org/en/stable/deprecations.html#calling-fixtures-directly
|
||
_______________________ test_set_head_remove_with_null ________________________
|
||
Fixture "make_user" called directly. Fixtures are not meant to be called directly,
|
||
but are created automatically when test functions request them as parameters.
|
||
See https://docs.pytest.org/en/stable/explanation/fixtures.html for more information about fixtures, and
|
||
https://docs.pytest.org/en/stable/deprecations.html#calling-fixtures-directly
|
||
_________________________ test_set_head_requires_perm _________________________
|
||
Fixture "make_user" called directly. Fixtures are not meant to be called directly,
|
||
but are created automatically when test functions request them as parameters.
|
||
See https://docs.pytest.org/en/stable/explanation/fixtures.html for more information about fixtures, and
|
||
https://docs.pytest.org/en/stable/deprecations.html#calling-fixtures-directly
|
||
_______________________ test_set_member_role_happy_path _______________________
|
||
Fixture "make_user" called directly. Fixtures are not meant to be called directly,
|
||
but are created automatically when test functions request them as parameters.
|
||
See https://docs.pytest.org/en/stable/explanation/fixtures.html for more information about fixtures, and
|
||
https://docs.pytest.org/en/stable/deprecations.html#calling-fixtures-directly
|
||
__________________ test_set_member_role_reject_foreign_role ___________________
|
||
Fixture "make_user" called directly. Fixtures are not meant to be called directly,
|
||
but are created automatically when test functions request them as parameters.
|
||
See https://docs.pytest.org/en/stable/explanation/fixtures.html for more information about fixtures, and
|
||
https://docs.pytest.org/en/stable/deprecations.html#calling-fixtures-directly
|
||
_____________________ test_set_member_role_requires_perm ______________________
|
||
Fixture "make_user" called directly. Fixtures are not meant to be called directly,
|
||
but are created automatically when test functions request them as parameters.
|
||
See https://docs.pytest.org/en/stable/explanation/fixtures.html for more information about fixtures, and
|
||
https://docs.pytest.org/en/stable/deprecations.html#calling-fixtures-directly
|
||
__________________ test_set_member_role_missing_employee_id ___________________
|
||
Fixture "make_user" called directly. Fixtures are not meant to be called directly,
|
||
but are created automatically when test functions request them as parameters.
|
||
See https://docs.pytest.org/en/stable/explanation/fixtures.html for more information about fixtures, and
|
||
https://docs.pytest.org/en/stable/deprecations.html#calling-fixtures-directly
|
||
_ TestEmailChangeResetsVerification.test_change_email_resets_email_verified_for_self _
|
||
Fixture "make_user" called directly. Fixtures are not meant to be called directly,
|
||
but are created automatically when test functions request them as parameters.
|
||
See https://docs.pytest.org/en/stable/explanation/fixtures.html for more information about fixtures, and
|
||
https://docs.pytest.org/en/stable/deprecations.html#calling-fixtures-directly
|
||
_ TestEmailChangeResetsVerification.test_change_email_via_me_endpoint_resets_verification _
|
||
Fixture "make_user" called directly. Fixtures are not meant to be called directly,
|
||
but are created automatically when test functions request them as parameters.
|
||
See https://docs.pytest.org/en/stable/explanation/fixtures.html for more information about fixtures, and
|
||
https://docs.pytest.org/en/stable/deprecations.html#calling-fixtures-directly
|
||
_ TestEmailChangeResetsVerification.test_change_email_sends_verification_code _
|
||
Fixture "make_user" called directly. Fixtures are not meant to be called directly,
|
||
but are created automatically when test functions request them as parameters.
|
||
See https://docs.pytest.org/en/stable/explanation/fixtures.html for more information about fixtures, and
|
||
https://docs.pytest.org/en/stable/deprecations.html#calling-fixtures-directly
|
||
_ TestEmailChangeResetsVerification.test_change_other_fields_does_not_reset_verification _
|
||
Fixture "make_user" called directly. Fixtures are not meant to be called directly,
|
||
but are created automatically when test functions request them as parameters.
|
||
See https://docs.pytest.org/en/stable/explanation/fixtures.html for more information about fixtures, and
|
||
https://docs.pytest.org/en/stable/deprecations.html#calling-fixtures-directly
|
||
_ TestEmailChangeResetsVerification.test_change_email_to_same_value_does_not_reset _
|
||
Fixture "make_user" called directly. Fixtures are not meant to be called directly,
|
||
but are created automatically when test functions request them as parameters.
|
||
See https://docs.pytest.org/en/stable/explanation/fixtures.html for more information about fixtures, and
|
||
https://docs.pytest.org/en/stable/deprecations.html#calling-fixtures-directly
|
||
_ TestUnverifiedUserRestrictions.test_unverified_user_can_update_self_non_critical_fields _
|
||
Fixture "make_user" called directly. Fixtures are not meant to be called directly,
|
||
but are created automatically when test functions request them as parameters.
|
||
See https://docs.pytest.org/en/stable/explanation/fixtures.html for more information about fixtures, and
|
||
https://docs.pytest.org/en/stable/deprecations.html#calling-fixtures-directly
|
||
____ TestUnverifiedUserRestrictions.test_unverified_user_can_verify_email _____
|
||
Fixture "make_user" called directly. Fixtures are not meant to be called directly,
|
||
but are created automatically when test functions request them as parameters.
|
||
See https://docs.pytest.org/en/stable/explanation/fixtures.html for more information about fixtures, and
|
||
https://docs.pytest.org/en/stable/deprecations.html#calling-fixtures-directly
|
||
_____ TestUnverifiedUserRestrictions.test_unverified_user_can_resend_code _____
|
||
Fixture "make_user" called directly. Fixtures are not meant to be called directly,
|
||
but are created automatically when test functions request them as parameters.
|
||
See https://docs.pytest.org/en/stable/explanation/fixtures.html for more information about fixtures, and
|
||
https://docs.pytest.org/en/stable/deprecations.html#calling-fixtures-directly
|
||
__________ TestResendEmailLogic.test_resend_email_generates_new_code __________
|
||
Fixture "make_user" called directly. Fixtures are not meant to be called directly,
|
||
but are created automatically when test functions request them as parameters.
|
||
See https://docs.pytest.org/en/stable/explanation/fixtures.html for more information about fixtures, and
|
||
https://docs.pytest.org/en/stable/deprecations.html#calling-fixtures-directly
|
||
________ TestResendEmailLogic.test_resend_email_to_verified_user_fails ________
|
||
Fixture "make_user" called directly. Fixtures are not meant to be called directly,
|
||
but are created automatically when test functions request them as parameters.
|
||
See https://docs.pytest.org/en/stable/explanation/fixtures.html for more information about fixtures, and
|
||
https://docs.pytest.org/en/stable/deprecations.html#calling-fixtures-directly
|
||
_______ TestResendEmailLogic.test_old_code_becomes_invalid_after_resend _______
|
||
Fixture "make_user" called directly. Fixtures are not meant to be called directly,
|
||
but are created automatically when test functions request them as parameters.
|
||
See https://docs.pytest.org/en/stable/explanation/fixtures.html for more information about fixtures, and
|
||
https://docs.pytest.org/en/stable/deprecations.html#calling-fixtures-directly
|
||
_ TestEmailVerificationWorkflow.test_full_registration_and_verification_flow __
|
||
tests\api\v1\employees\test_email_verification_security.py:430: in test_full_registration_and_verification_flow
|
||
assert response.status_code in [
|
||
E assert 400 in [201, 502]
|
||
E + where 400 = <Response status_code=400, "application/json">.status_code
|
||
---------------------------- Captured stderr call -----------------------------
|
||
[WARNING] 2026-02-16 17:34:51,498 django.request:253 Bad Request: /api/v1/auth/register/
|
||
------------------------------ Captured log call ------------------------------
|
||
WARNING api.v1.employees.views.auth:auth.py:161 [REGISTER] Received data: {'email': 'newuser@test.com', 'password': 'TestPass123!', 'password_confirmation': 'TestPass123!', 'first_name': 'New', 'last_name': 'User', 'telegram': '@newuser', 'birth_date': '1990-01-01', 'phone_number': '+79001234569'}
|
||
WARNING api.v1.employees.views.auth:auth.py:162 [REGISTER] Content-Type: application/json
|
||
WARNING api.v1.employees.views.auth:auth.py:180 [REGISTER] Validation errors: {'avatar': [ErrorDetail(string='<27><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.', code='required')], 'gender': [ErrorDetail(string='<27><><EFBFBD><EFBFBD> "<22><><EFBFBD>" <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.', code='required')]}
|
||
_____ TestEmailVerificationWorkflow.test_change_email_and_verify_new_one ______
|
||
Fixture "make_user" called directly. Fixtures are not meant to be called directly,
|
||
but are created automatically when test functions request them as parameters.
|
||
See https://docs.pytest.org/en/stable/explanation/fixtures.html for more information about fixtures, and
|
||
https://docs.pytest.org/en/stable/deprecations.html#calling-fixtures-directly
|
||
___________________ test_dismissal_works_when_ldap_disabled ___________________
|
||
tests\api\v1\employees\test_employee_actions.py:430: in test_dismissal_works_when_ldap_disabled
|
||
mock_update.assert_not_called()
|
||
..\..\..\AppData\Local\Programs\Python\Python312\Lib\unittest\mock.py:908: in assert_not_called
|
||
raise AssertionError(msg)
|
||
E AssertionError: Expected 'update_user' to not have been called. Called 1 times.
|
||
E Calls: [call(<Employee: U T>, changes={'is_active': False})].
|
||
------------------------------ Captured log call ------------------------------
|
||
ERROR api.v1.employees.views.actions:actions.py:154 Failed to move dismissed employee: LDAP move user to base failed: {'result': 53, 'description': 'unwillingToPerform', 'dn': '', 'message': 'no global superior knowledge', 'referrals': None, 'type': 'modDNResponse'}
|
||
_______________ test_restoration_moves_from_dismissed_to_users ________________
|
||
tests\api\v1\employees\test_employee_actions.py:515: in test_restoration_moves_from_dismissed_to_users
|
||
emp = _user(is_active=False) # <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
^^^^^^^^^^^^^^^^^^^^^^
|
||
E TypeError: _user() got an unexpected keyword argument 'is_active'
|
||
_________________________ test_create_requires_staff __________________________
|
||
tests\api\v1\employees\test_employees.py:286: in test_create_requires_staff
|
||
assert resp.status_code == status.HTTP_400_BAD_REQUEST
|
||
E assert 201 == 400
|
||
E + where 201 = <Response status_code=201, "application/json">.status_code
|
||
E + and 400 = status.HTTP_400_BAD_REQUEST
|
||
---------------------------- Captured stderr call -----------------------------
|
||
[WARNING] 2026-02-16 17:34:53,338 django.request:253 Forbidden: /api/v1/employees/
|
||
_________________________ test_destroy_requires_admin _________________________
|
||
employees\ldap\services\user_service.py:190: in delete_user_in_ldap_only
|
||
dn = self._get_employee_dn(instance)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
employees\ldap\services\user_service.py:855: in _get_employee_dn
|
||
raise DirectoryServiceError("Employee has no ldap_dn")
|
||
E employees.ldap.errors.DirectoryServiceError: Employee has no ldap_dn
|
||
|
||
During handling of the above exception, another exception occurred:
|
||
common\external_sync_mixin.py:188: in _perform_with_sync_instance
|
||
sync_method(**external_data)
|
||
employees\ldap\directory_service.py:133: in delete_user_in_ldap_only
|
||
return self._user_service.delete_user_in_ldap_only(instance)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
employees\ldap\services\user_service.py:193: in delete_user_in_ldap_only
|
||
logger.warning(
|
||
^^^^^^
|
||
E NameError: name 'logger' is not defined
|
||
|
||
During handling of the above exception, another exception occurred:
|
||
tests\api\v1\employees\test_employees.py:346: in test_destroy_requires_admin
|
||
resp = api_client.delete(url)
|
||
^^^^^^^^^^^^^^^^^^^^^^
|
||
..\.venv\Lib\site-packages\rest_framework\test.py:323: in delete
|
||
response = super().delete(
|
||
..\.venv\Lib\site-packages\rest_framework\test.py:225: in delete
|
||
return self.generic('DELETE', path, data, content_type, **extra)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
..\.venv\Lib\site-packages\rest_framework\test.py:237: in generic
|
||
return super().generic(
|
||
..\.venv\Lib\site-packages\django\test\client.py:671: in generic
|
||
return self.request(**r)
|
||
^^^^^^^^^^^^^^^^^
|
||
..\.venv\Lib\site-packages\rest_framework\test.py:289: in request
|
||
return super().request(**kwargs)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
..\.venv\Lib\site-packages\rest_framework\test.py:241: in request
|
||
request = super().request(**kwargs)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
..\.venv\Lib\site-packages\django\test\client.py:1087: in request
|
||
self.check_exception(response)
|
||
..\.venv\Lib\site-packages\django\test\client.py:802: in check_exception
|
||
raise exc_value
|
||
..\.venv\Lib\site-packages\django\core\handlers\exception.py:55: in inner
|
||
response = get_response(request)
|
||
^^^^^^^^^^^^^^^^^^^^^
|
||
..\.venv\Lib\site-packages\django\core\handlers\base.py:197: in _get_response
|
||
response = wrapped_callback(request, *callback_args, **callback_kwargs)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
..\.venv\Lib\site-packages\django\views\decorators\csrf.py:65: in _view_wrapper
|
||
return view_func(request, *args, **kwargs)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
..\.venv\Lib\site-packages\rest_framework\viewsets.py:125: in view
|
||
return self.dispatch(request, *args, **kwargs)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
..\.venv\Lib\site-packages\rest_framework\views.py:515: in dispatch
|
||
response = self.handle_exception(exc)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
..\.venv\Lib\site-packages\rest_framework\views.py:475: in handle_exception
|
||
self.raise_uncaught_exception(exc)
|
||
..\.venv\Lib\site-packages\rest_framework\views.py:486: in raise_uncaught_exception
|
||
raise exc
|
||
..\.venv\Lib\site-packages\rest_framework\views.py:512: in dispatch
|
||
response = handler(request, *args, **kwargs)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
..\.venv\Lib\site-packages\rest_framework\mixins.py:91: in destroy
|
||
self.perform_destroy(instance)
|
||
common\external_sync_mixin.py:103: in perform_destroy
|
||
return self._perform_with_sync_instance(instance, 'destroy', super().perform_destroy)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
common\external_sync_mixin.py:201: in _perform_with_sync_instance
|
||
raise ExternalSyncError(error_response)
|
||
E common.external_sync_mixin.ExternalSyncError
|
||
---------------------------- Captured stderr call -----------------------------
|
||
[WARNING] 2026-02-16 17:34:53,602 django.request:253 Forbidden: /api/v1/employees/74/
|
||
[ERROR] 2026-02-16 17:34:53,681 common.external_sync_mixin:195 External sync failed, rolling back: name 'logger' is not defined
|
||
[ERROR] 2026-02-16 17:34:53,684 django.request:253 Internal Server Error: /api/v1/employees/74/
|
||
Traceback (most recent call last):
|
||
File "C:\Users\igor_\Dev\EUSRR\backend\employees\ldap\services\user_service.py", line 190, in delete_user_in_ldap_only
|
||
dn = self._get_employee_dn(instance)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
File "C:\Users\igor_\Dev\EUSRR\backend\employees\ldap\services\user_service.py", line 855, in _get_employee_dn
|
||
raise DirectoryServiceError("Employee has no ldap_dn")
|
||
employees.ldap.errors.DirectoryServiceError: Employee has no ldap_dn
|
||
|
||
During handling of the above exception, another exception occurred:
|
||
|
||
Traceback (most recent call last):
|
||
File "C:\Users\igor_\Dev\EUSRR\backend\common\external_sync_mixin.py", line 188, in _perform_with_sync_instance
|
||
sync_method(**external_data)
|
||
File "C:\Users\igor_\Dev\EUSRR\backend\employees\ldap\directory_service.py", line 133, in delete_user_in_ldap_only
|
||
return self._user_service.delete_user_in_ldap_only(instance)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
File "C:\Users\igor_\Dev\EUSRR\backend\employees\ldap\services\user_service.py", line 193, in delete_user_in_ldap_only
|
||
logger.warning(
|
||
^^^^^^
|
||
NameError: name 'logger' is not defined
|
||
|
||
During handling of the above exception, another exception occurred:
|
||
|
||
Traceback (most recent call last):
|
||
File "C:\Users\igor_\Dev\EUSRR\.venv\Lib\site-packages\django\core\handlers\exception.py", line 55, in inner
|
||
response = get_response(request)
|
||
^^^^^^^^^^^^^^^^^^^^^
|
||
File "C:\Users\igor_\Dev\EUSRR\.venv\Lib\site-packages\django\core\handlers\base.py", line 197, in _get_response
|
||
response = wrapped_callback(request, *callback_args, **callback_kwargs)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
File "C:\Users\igor_\Dev\EUSRR\.venv\Lib\site-packages\django\views\decorators\csrf.py", line 65, in _view_wrapper
|
||
return view_func(request, *args, **kwargs)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
File "C:\Users\igor_\Dev\EUSRR\.venv\Lib\site-packages\rest_framework\viewsets.py", line 125, in view
|
||
return self.dispatch(request, *args, **kwargs)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
File "C:\Users\igor_\Dev\EUSRR\.venv\Lib\site-packages\rest_framework\views.py", line 515, in dispatch
|
||
response = self.handle_exception(exc)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
File "C:\Users\igor_\Dev\EUSRR\.venv\Lib\site-packages\rest_framework\views.py", line 475, in handle_exception
|
||
self.raise_uncaught_exception(exc)
|
||
File "C:\Users\igor_\Dev\EUSRR\.venv\Lib\site-packages\rest_framework\views.py", line 486, in raise_uncaught_exception
|
||
raise exc
|
||
File "C:\Users\igor_\Dev\EUSRR\.venv\Lib\site-packages\rest_framework\views.py", line 512, in dispatch
|
||
response = handler(request, *args, **kwargs)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
File "C:\Users\igor_\Dev\EUSRR\.venv\Lib\site-packages\rest_framework\mixins.py", line 91, in destroy
|
||
self.perform_destroy(instance)
|
||
File "C:\Users\igor_\Dev\EUSRR\backend\common\external_sync_mixin.py", line 103, in perform_destroy
|
||
return self._perform_with_sync_instance(instance, 'destroy', super().perform_destroy)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
File "C:\Users\igor_\Dev\EUSRR\backend\common\external_sync_mixin.py", line 201, in _perform_with_sync_instance
|
||
raise ExternalSyncError(error_response)
|
||
common.external_sync_mixin.ExternalSyncError
|
||
------------------------------ Captured log call ------------------------------
|
||
ERROR api.v1.employees.views.employees:employees.py:193 LDAP sync failed for destroy on Employee None: name 'logger' is not defined
|
||
Traceback (most recent call last):
|
||
File "C:\Users\igor_\Dev\EUSRR\backend\employees\ldap\services\user_service.py", line 190, in delete_user_in_ldap_only
|
||
dn = self._get_employee_dn(instance)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
File "C:\Users\igor_\Dev\EUSRR\backend\employees\ldap\services\user_service.py", line 855, in _get_employee_dn
|
||
raise DirectoryServiceError("Employee has no ldap_dn")
|
||
employees.ldap.errors.DirectoryServiceError: Employee has no ldap_dn
|
||
|
||
During handling of the above exception, another exception occurred:
|
||
|
||
Traceback (most recent call last):
|
||
File "C:\Users\igor_\Dev\EUSRR\backend\common\external_sync_mixin.py", line 188, in _perform_with_sync_instance
|
||
sync_method(**external_data)
|
||
File "C:\Users\igor_\Dev\EUSRR\backend\employees\ldap\directory_service.py", line 133, in delete_user_in_ldap_only
|
||
return self._user_service.delete_user_in_ldap_only(instance)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
File "C:\Users\igor_\Dev\EUSRR\backend\employees\ldap\services\user_service.py", line 193, in delete_user_in_ldap_only
|
||
logger.warning(
|
||
^^^^^^
|
||
NameError: name 'logger' is not defined
|
||
________________ test_me_patch_rejects_when_all_contacts_empty ________________
|
||
tests\api\v1\employees\test_employees.py:385: in test_me_patch_rejects_when_all_contacts_empty
|
||
assert r.status_code == status.HTTP_400_BAD_REQUEST
|
||
E assert 200 == 400
|
||
E + where 200 = <Response status_code=200, "application/json">.status_code
|
||
E + and 400 = status.HTTP_400_BAD_REQUEST
|
||
_______________________ test_list_includes_basic_fields _______________________
|
||
Fixture "make_user" called directly. Fixtures are not meant to be called directly,
|
||
but are created automatically when test functions request them as parameters.
|
||
See https://docs.pytest.org/en/stable/explanation/fixtures.html for more information about fixtures, and
|
||
https://docs.pytest.org/en/stable/deprecations.html#calling-fixtures-directly
|
||
_____________________ test_list_departments_include_role ______________________
|
||
Fixture "make_user" called directly. Fixtures are not meant to be called directly,
|
||
but are created automatically when test functions request them as parameters.
|
||
See https://docs.pytest.org/en/stable/explanation/fixtures.html for more information about fixtures, and
|
||
https://docs.pytest.org/en/stable/deprecations.html#calling-fixtures-directly
|
||
_____________ test_register_without_ldap_creates_user_only_in_db ______________
|
||
tests\api\v1\employees\test_ldap_optional_register.py:120: in test_register_without_ldap_creates_user_only_in_db
|
||
assert response.status_code == status.HTTP_201_CREATED
|
||
E assert 400 == 201
|
||
E + where 400 = <Response status_code=400, "application/json">.status_code
|
||
E + and 201 = status.HTTP_201_CREATED
|
||
---------------------------- Captured stderr call -----------------------------
|
||
[WARNING] 2026-02-16 17:34:54,064 django.request:253 Bad Request: /api/v1/auth/register/
|
||
------------------------------ Captured log call ------------------------------
|
||
WARNING api.v1.employees.views.auth:auth.py:161 [REGISTER] Received data: {'email': 'test4000@example.com', 'first_name': 'Test', 'last_name': 'User', 'phone_number': '+79990001000', 'password': 'SecurePass123!', 'whatsapp': '+79990001001', 'birth_date': '1990-01-01'}
|
||
WARNING api.v1.employees.views.auth:auth.py:162 [REGISTER] Content-Type: application/json
|
||
WARNING api.v1.employees.views.auth:auth.py:180 [REGISTER] Validation errors: {'avatar': [ErrorDetail(string='<27><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.', code='required')], 'gender': [ErrorDetail(string='<27><><EFBFBD><EFBFBD> "<22><><EFBFBD>" <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.', code='required')]}
|
||
___________________________ test_create_permissions ___________________________
|
||
tests\api\v1\employees\test_positions.py:83: in test_create_permissions
|
||
resp = api_client.post(url, {"name": "NewPos"}, format="json")
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
..\.venv\Lib\site-packages\rest_framework\test.py:299: in post
|
||
response = super().post(
|
||
..\.venv\Lib\site-packages\rest_framework\test.py:213: in post
|
||
return self.generic('POST', path, data, content_type, **extra)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
..\.venv\Lib\site-packages\rest_framework\test.py:237: in generic
|
||
return super().generic(
|
||
..\.venv\Lib\site-packages\django\test\client.py:671: in generic
|
||
return self.request(**r)
|
||
^^^^^^^^^^^^^^^^^
|
||
..\.venv\Lib\site-packages\rest_framework\test.py:289: in request
|
||
return super().request(**kwargs)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
..\.venv\Lib\site-packages\rest_framework\test.py:241: in request
|
||
request = super().request(**kwargs)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
..\.venv\Lib\site-packages\django\test\client.py:1087: in request
|
||
self.check_exception(response)
|
||
..\.venv\Lib\site-packages\django\test\client.py:802: in check_exception
|
||
raise exc_value
|
||
..\.venv\Lib\site-packages\django\core\handlers\exception.py:55: in inner
|
||
response = get_response(request)
|
||
^^^^^^^^^^^^^^^^^^^^^
|
||
..\.venv\Lib\site-packages\django\core\handlers\base.py:197: in _get_response
|
||
response = wrapped_callback(request, *callback_args, **callback_kwargs)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
..\.venv\Lib\site-packages\django\views\decorators\csrf.py:65: in _view_wrapper
|
||
return view_func(request, *args, **kwargs)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
..\.venv\Lib\site-packages\rest_framework\viewsets.py:125: in view
|
||
return self.dispatch(request, *args, **kwargs)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
..\.venv\Lib\site-packages\rest_framework\views.py:515: in dispatch
|
||
response = self.handle_exception(exc)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
..\.venv\Lib\site-packages\rest_framework\views.py:475: in handle_exception
|
||
self.raise_uncaught_exception(exc)
|
||
..\.venv\Lib\site-packages\rest_framework\views.py:486: in raise_uncaught_exception
|
||
raise exc
|
||
..\.venv\Lib\site-packages\rest_framework\views.py:512: in dispatch
|
||
response = handler(request, *args, **kwargs)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
..\.venv\Lib\site-packages\rest_framework\mixins.py:19: in create
|
||
self.perform_create(serializer)
|
||
api\v1\employees\views\positions.py:136: in perform_create
|
||
err = _ldap_try(lambda: DirectoryService().reconcile_position(pos))
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
api\v1\employees\views\_helpers.py:39: in _ldap_try
|
||
fn()
|
||
api\v1\employees\views\positions.py:136: in <lambda>
|
||
err = _ldap_try(lambda: DirectoryService().reconcile_position(pos))
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
employees\ldap\directory_service.py:373: in reconcile_position
|
||
return self._position_service.reconcile_position(pos)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
employees\ldap\services\position_service.py:72: in reconcile_position
|
||
return self._reconcile_position(conn, pos)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
employees\ldap\services\position_service.py:358: in _reconcile_position
|
||
pos_dn = self._ensure_position_group(conn, pos)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
employees\ldap\services\position_service.py:212: in _ensure_position_group
|
||
ensure_container_exists(conn, self._positions_base())
|
||
^^^^^^^^^^^^^^^^^^^^^^
|
||
employees\ldap\services\position_service.py:170: in _positions_base
|
||
raise RuntimeError("LDAP_POSITIONS_BASE is not configured")
|
||
E RuntimeError: LDAP_POSITIONS_BASE is not configured
|
||
---------------------------- Captured stderr call -----------------------------
|
||
[WARNING] 2026-02-16 17:34:54,287 django.request:253 Forbidden: /api/v1/positions/
|
||
[ERROR] 2026-02-16 17:34:54,312 django.request:253 Internal Server Error: /api/v1/positions/
|
||
Traceback (most recent call last):
|
||
File "C:\Users\igor_\Dev\EUSRR\.venv\Lib\site-packages\django\core\handlers\exception.py", line 55, in inner
|
||
response = get_response(request)
|
||
^^^^^^^^^^^^^^^^^^^^^
|
||
File "C:\Users\igor_\Dev\EUSRR\.venv\Lib\site-packages\django\core\handlers\base.py", line 197, in _get_response
|
||
response = wrapped_callback(request, *callback_args, **callback_kwargs)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
File "C:\Users\igor_\Dev\EUSRR\.venv\Lib\site-packages\django\views\decorators\csrf.py", line 65, in _view_wrapper
|
||
return view_func(request, *args, **kwargs)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
File "C:\Users\igor_\Dev\EUSRR\.venv\Lib\site-packages\rest_framework\viewsets.py", line 125, in view
|
||
return self.dispatch(request, *args, **kwargs)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
File "C:\Users\igor_\Dev\EUSRR\.venv\Lib\site-packages\rest_framework\views.py", line 515, in dispatch
|
||
response = self.handle_exception(exc)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
File "C:\Users\igor_\Dev\EUSRR\.venv\Lib\site-packages\rest_framework\views.py", line 475, in handle_exception
|
||
self.raise_uncaught_exception(exc)
|
||
File "C:\Users\igor_\Dev\EUSRR\.venv\Lib\site-packages\rest_framework\views.py", line 486, in raise_uncaught_exception
|
||
raise exc
|
||
File "C:\Users\igor_\Dev\EUSRR\.venv\Lib\site-packages\rest_framework\views.py", line 512, in dispatch
|
||
response = handler(request, *args, **kwargs)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
File "C:\Users\igor_\Dev\EUSRR\.venv\Lib\site-packages\rest_framework\mixins.py", line 19, in create
|
||
self.perform_create(serializer)
|
||
File "C:\Users\igor_\Dev\EUSRR\backend\api\v1\employees\views\positions.py", line 136, in perform_create
|
||
err = _ldap_try(lambda: DirectoryService().reconcile_position(pos))
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
File "C:\Users\igor_\Dev\EUSRR\backend\api\v1\employees\views\_helpers.py", line 39, in _ldap_try
|
||
fn()
|
||
File "C:\Users\igor_\Dev\EUSRR\backend\api\v1\employees\views\positions.py", line 136, in <lambda>
|
||
err = _ldap_try(lambda: DirectoryService().reconcile_position(pos))
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
File "C:\Users\igor_\Dev\EUSRR\backend\employees\ldap\directory_service.py", line 373, in reconcile_position
|
||
return self._position_service.reconcile_position(pos)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
File "C:\Users\igor_\Dev\EUSRR\backend\employees\ldap\services\position_service.py", line 72, in reconcile_position
|
||
return self._reconcile_position(conn, pos)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
File "C:\Users\igor_\Dev\EUSRR\backend\employees\ldap\services\position_service.py", line 358, in _reconcile_position
|
||
pos_dn = self._ensure_position_group(conn, pos)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
File "C:\Users\igor_\Dev\EUSRR\backend\employees\ldap\services\position_service.py", line 212, in _ensure_position_group
|
||
ensure_container_exists(conn, self._positions_base())
|
||
^^^^^^^^^^^^^^^^^^^^^^
|
||
File "C:\Users\igor_\Dev\EUSRR\backend\employees\ldap\services\position_service.py", line 170, in _positions_base
|
||
raise RuntimeError("LDAP_POSITIONS_BASE is not configured")
|
||
RuntimeError: LDAP_POSITIONS_BASE is not configured
|
||
_________________ test_update_permissions_and_search_ordering _________________
|
||
tests\api\v1\employees\test_positions.py:109: in test_update_permissions_and_search_ordering
|
||
resp = api_client.patch(url_detail, {"description": "updated"}, format="json")
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
..\.venv\Lib\site-packages\rest_framework\test.py:315: in patch
|
||
response = super().patch(
|
||
..\.venv\Lib\site-packages\rest_framework\test.py:221: in patch
|
||
return self.generic('PATCH', path, data, content_type, **extra)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
..\.venv\Lib\site-packages\rest_framework\test.py:237: in generic
|
||
return super().generic(
|
||
..\.venv\Lib\site-packages\django\test\client.py:671: in generic
|
||
return self.request(**r)
|
||
^^^^^^^^^^^^^^^^^
|
||
..\.venv\Lib\site-packages\rest_framework\test.py:289: in request
|
||
return super().request(**kwargs)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
..\.venv\Lib\site-packages\rest_framework\test.py:241: in request
|
||
request = super().request(**kwargs)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
..\.venv\Lib\site-packages\django\test\client.py:1087: in request
|
||
self.check_exception(response)
|
||
..\.venv\Lib\site-packages\django\test\client.py:802: in check_exception
|
||
raise exc_value
|
||
..\.venv\Lib\site-packages\django\core\handlers\exception.py:55: in inner
|
||
response = get_response(request)
|
||
^^^^^^^^^^^^^^^^^^^^^
|
||
..\.venv\Lib\site-packages\django\core\handlers\base.py:197: in _get_response
|
||
response = wrapped_callback(request, *callback_args, **callback_kwargs)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
..\.venv\Lib\site-packages\django\views\decorators\csrf.py:65: in _view_wrapper
|
||
return view_func(request, *args, **kwargs)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
..\.venv\Lib\site-packages\rest_framework\viewsets.py:125: in view
|
||
return self.dispatch(request, *args, **kwargs)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
..\.venv\Lib\site-packages\rest_framework\views.py:515: in dispatch
|
||
response = self.handle_exception(exc)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
..\.venv\Lib\site-packages\rest_framework\views.py:475: in handle_exception
|
||
self.raise_uncaught_exception(exc)
|
||
..\.venv\Lib\site-packages\rest_framework\views.py:486: in raise_uncaught_exception
|
||
raise exc
|
||
..\.venv\Lib\site-packages\rest_framework\views.py:512: in dispatch
|
||
response = handler(request, *args, **kwargs)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
..\.venv\Lib\site-packages\rest_framework\mixins.py:82: in partial_update
|
||
return self.update(request, *args, **kwargs)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
..\.venv\Lib\site-packages\rest_framework\mixins.py:68: in update
|
||
self.perform_update(serializer)
|
||
api\v1\employees\views\positions.py:142: in perform_update
|
||
_ldap_try(lambda: DirectoryService().reconcile_position(pos))
|
||
api\v1\employees\views\_helpers.py:39: in _ldap_try
|
||
fn()
|
||
api\v1\employees\views\positions.py:142: in <lambda>
|
||
_ldap_try(lambda: DirectoryService().reconcile_position(pos))
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
employees\ldap\directory_service.py:373: in reconcile_position
|
||
return self._position_service.reconcile_position(pos)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
employees\ldap\services\position_service.py:72: in reconcile_position
|
||
return self._reconcile_position(conn, pos)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
employees\ldap\services\position_service.py:358: in _reconcile_position
|
||
pos_dn = self._ensure_position_group(conn, pos)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
employees\ldap\services\position_service.py:212: in _ensure_position_group
|
||
ensure_container_exists(conn, self._positions_base())
|
||
^^^^^^^^^^^^^^^^^^^^^^
|
||
employees\ldap\services\position_service.py:170: in _positions_base
|
||
raise RuntimeError("LDAP_POSITIONS_BASE is not configured")
|
||
E RuntimeError: LDAP_POSITIONS_BASE is not configured
|
||
---------------------------- Captured stderr call -----------------------------
|
||
[WARNING] 2026-02-16 17:34:54,410 django.request:253 Forbidden: /api/v1/positions/6/
|
||
[ERROR] 2026-02-16 17:34:54,435 django.request:253 Internal Server Error: /api/v1/positions/6/
|
||
Traceback (most recent call last):
|
||
File "C:\Users\igor_\Dev\EUSRR\.venv\Lib\site-packages\django\core\handlers\exception.py", line 55, in inner
|
||
response = get_response(request)
|
||
^^^^^^^^^^^^^^^^^^^^^
|
||
File "C:\Users\igor_\Dev\EUSRR\.venv\Lib\site-packages\django\core\handlers\base.py", line 197, in _get_response
|
||
response = wrapped_callback(request, *callback_args, **callback_kwargs)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
File "C:\Users\igor_\Dev\EUSRR\.venv\Lib\site-packages\django\views\decorators\csrf.py", line 65, in _view_wrapper
|
||
return view_func(request, *args, **kwargs)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
File "C:\Users\igor_\Dev\EUSRR\.venv\Lib\site-packages\rest_framework\viewsets.py", line 125, in view
|
||
return self.dispatch(request, *args, **kwargs)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
File "C:\Users\igor_\Dev\EUSRR\.venv\Lib\site-packages\rest_framework\views.py", line 515, in dispatch
|
||
response = self.handle_exception(exc)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
File "C:\Users\igor_\Dev\EUSRR\.venv\Lib\site-packages\rest_framework\views.py", line 475, in handle_exception
|
||
self.raise_uncaught_exception(exc)
|
||
File "C:\Users\igor_\Dev\EUSRR\.venv\Lib\site-packages\rest_framework\views.py", line 486, in raise_uncaught_exception
|
||
raise exc
|
||
File "C:\Users\igor_\Dev\EUSRR\.venv\Lib\site-packages\rest_framework\views.py", line 512, in dispatch
|
||
response = handler(request, *args, **kwargs)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
File "C:\Users\igor_\Dev\EUSRR\.venv\Lib\site-packages\rest_framework\mixins.py", line 82, in partial_update
|
||
return self.update(request, *args, **kwargs)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
File "C:\Users\igor_\Dev\EUSRR\.venv\Lib\site-packages\rest_framework\mixins.py", line 68, in update
|
||
self.perform_update(serializer)
|
||
File "C:\Users\igor_\Dev\EUSRR\backend\api\v1\employees\views\positions.py", line 142, in perform_update
|
||
_ldap_try(lambda: DirectoryService().reconcile_position(pos))
|
||
File "C:\Users\igor_\Dev\EUSRR\backend\api\v1\employees\views\_helpers.py", line 39, in _ldap_try
|
||
fn()
|
||
File "C:\Users\igor_\Dev\EUSRR\backend\api\v1\employees\views\positions.py", line 142, in <lambda>
|
||
_ldap_try(lambda: DirectoryService().reconcile_position(pos))
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
File "C:\Users\igor_\Dev\EUSRR\backend\employees\ldap\directory_service.py", line 373, in reconcile_position
|
||
return self._position_service.reconcile_position(pos)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
File "C:\Users\igor_\Dev\EUSRR\backend\employees\ldap\services\position_service.py", line 72, in reconcile_position
|
||
return self._reconcile_position(conn, pos)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
File "C:\Users\igor_\Dev\EUSRR\backend\employees\ldap\services\position_service.py", line 358, in _reconcile_position
|
||
pos_dn = self._ensure_position_group(conn, pos)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
File "C:\Users\igor_\Dev\EUSRR\backend\employees\ldap\services\position_service.py", line 212, in _ensure_position_group
|
||
ensure_container_exists(conn, self._positions_base())
|
||
^^^^^^^^^^^^^^^^^^^^^^
|
||
File "C:\Users\igor_\Dev\EUSRR\backend\employees\ldap\services\position_service.py", line 170, in _positions_base
|
||
raise RuntimeError("LDAP_POSITIONS_BASE is not configured")
|
||
RuntimeError: LDAP_POSITIONS_BASE is not configured
|
||
____________________ test_set_groups_requires_special_perm ____________________
|
||
tests\api\v1\employees\test_positions.py:163: in test_set_groups_requires_special_perm
|
||
resp = api_client.post(url_set, {"groups": [grp1.id, grp2.id]}, format="json")
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
..\.venv\Lib\site-packages\rest_framework\test.py:299: in post
|
||
response = super().post(
|
||
..\.venv\Lib\site-packages\rest_framework\test.py:213: in post
|
||
return self.generic('POST', path, data, content_type, **extra)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
..\.venv\Lib\site-packages\rest_framework\test.py:237: in generic
|
||
return super().generic(
|
||
..\.venv\Lib\site-packages\django\test\client.py:671: in generic
|
||
return self.request(**r)
|
||
^^^^^^^^^^^^^^^^^
|
||
..\.venv\Lib\site-packages\rest_framework\test.py:289: in request
|
||
return super().request(**kwargs)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
..\.venv\Lib\site-packages\rest_framework\test.py:241: in request
|
||
request = super().request(**kwargs)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
..\.venv\Lib\site-packages\django\test\client.py:1087: in request
|
||
self.check_exception(response)
|
||
..\.venv\Lib\site-packages\django\test\client.py:802: in check_exception
|
||
raise exc_value
|
||
..\.venv\Lib\site-packages\django\core\handlers\exception.py:55: in inner
|
||
response = get_response(request)
|
||
^^^^^^^^^^^^^^^^^^^^^
|
||
..\.venv\Lib\site-packages\django\core\handlers\base.py:197: in _get_response
|
||
response = wrapped_callback(request, *callback_args, **callback_kwargs)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
..\.venv\Lib\site-packages\django\views\decorators\csrf.py:65: in _view_wrapper
|
||
return view_func(request, *args, **kwargs)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
..\.venv\Lib\site-packages\rest_framework\viewsets.py:125: in view
|
||
return self.dispatch(request, *args, **kwargs)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
..\.venv\Lib\site-packages\rest_framework\views.py:515: in dispatch
|
||
response = self.handle_exception(exc)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
..\.venv\Lib\site-packages\rest_framework\views.py:475: in handle_exception
|
||
self.raise_uncaught_exception(exc)
|
||
..\.venv\Lib\site-packages\rest_framework\views.py:486: in raise_uncaught_exception
|
||
raise exc
|
||
..\.venv\Lib\site-packages\rest_framework\views.py:512: in dispatch
|
||
response = handler(request, *args, **kwargs)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
api\v1\employees\views\positions.py:70: in set_groups
|
||
err2 = _ldap_try(lambda: DirectoryService().reconcile_position(pos))
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
api\v1\employees\views\_helpers.py:39: in _ldap_try
|
||
fn()
|
||
api\v1\employees\views\positions.py:70: in <lambda>
|
||
err2 = _ldap_try(lambda: DirectoryService().reconcile_position(pos))
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
employees\ldap\directory_service.py:373: in reconcile_position
|
||
return self._position_service.reconcile_position(pos)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
employees\ldap\services\position_service.py:72: in reconcile_position
|
||
return self._reconcile_position(conn, pos)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
employees\ldap\services\position_service.py:358: in _reconcile_position
|
||
pos_dn = self._ensure_position_group(conn, pos)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
employees\ldap\services\position_service.py:212: in _ensure_position_group
|
||
ensure_container_exists(conn, self._positions_base())
|
||
^^^^^^^^^^^^^^^^^^^^^^
|
||
employees\ldap\services\position_service.py:170: in _positions_base
|
||
raise RuntimeError("LDAP_POSITIONS_BASE is not configured")
|
||
E RuntimeError: LDAP_POSITIONS_BASE is not configured
|
||
---------------------------- Captured stderr call -----------------------------
|
||
[WARNING] 2026-02-16 17:34:54,593 django.request:253 Forbidden: /api/v1/positions/9/set_groups/
|
||
[ERROR] 2026-02-16 17:34:54,620 django.request:253 Internal Server Error: /api/v1/positions/9/set_groups/
|
||
Traceback (most recent call last):
|
||
File "C:\Users\igor_\Dev\EUSRR\.venv\Lib\site-packages\django\core\handlers\exception.py", line 55, in inner
|
||
response = get_response(request)
|
||
^^^^^^^^^^^^^^^^^^^^^
|
||
File "C:\Users\igor_\Dev\EUSRR\.venv\Lib\site-packages\django\core\handlers\base.py", line 197, in _get_response
|
||
response = wrapped_callback(request, *callback_args, **callback_kwargs)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
File "C:\Users\igor_\Dev\EUSRR\.venv\Lib\site-packages\django\views\decorators\csrf.py", line 65, in _view_wrapper
|
||
return view_func(request, *args, **kwargs)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
File "C:\Users\igor_\Dev\EUSRR\.venv\Lib\site-packages\rest_framework\viewsets.py", line 125, in view
|
||
return self.dispatch(request, *args, **kwargs)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
File "C:\Users\igor_\Dev\EUSRR\.venv\Lib\site-packages\rest_framework\views.py", line 515, in dispatch
|
||
response = self.handle_exception(exc)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
File "C:\Users\igor_\Dev\EUSRR\.venv\Lib\site-packages\rest_framework\views.py", line 475, in handle_exception
|
||
self.raise_uncaught_exception(exc)
|
||
File "C:\Users\igor_\Dev\EUSRR\.venv\Lib\site-packages\rest_framework\views.py", line 486, in raise_uncaught_exception
|
||
raise exc
|
||
File "C:\Users\igor_\Dev\EUSRR\.venv\Lib\site-packages\rest_framework\views.py", line 512, in dispatch
|
||
response = handler(request, *args, **kwargs)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
File "C:\Users\igor_\Dev\EUSRR\backend\api\v1\employees\views\positions.py", line 70, in set_groups
|
||
err2 = _ldap_try(lambda: DirectoryService().reconcile_position(pos))
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
File "C:\Users\igor_\Dev\EUSRR\backend\api\v1\employees\views\_helpers.py", line 39, in _ldap_try
|
||
fn()
|
||
File "C:\Users\igor_\Dev\EUSRR\backend\api\v1\employees\views\positions.py", line 70, in <lambda>
|
||
err2 = _ldap_try(lambda: DirectoryService().reconcile_position(pos))
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
File "C:\Users\igor_\Dev\EUSRR\backend\employees\ldap\directory_service.py", line 373, in reconcile_position
|
||
return self._position_service.reconcile_position(pos)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
File "C:\Users\igor_\Dev\EUSRR\backend\employees\ldap\services\position_service.py", line 72, in reconcile_position
|
||
return self._reconcile_position(conn, pos)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
File "C:\Users\igor_\Dev\EUSRR\backend\employees\ldap\services\position_service.py", line 358, in _reconcile_position
|
||
pos_dn = self._ensure_position_group(conn, pos)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
File "C:\Users\igor_\Dev\EUSRR\backend\employees\ldap\services\position_service.py", line 212, in _ensure_position_group
|
||
ensure_container_exists(conn, self._positions_base())
|
||
^^^^^^^^^^^^^^^^^^^^^^
|
||
File "C:\Users\igor_\Dev\EUSRR\backend\employees\ldap\services\position_service.py", line 170, in _positions_base
|
||
raise RuntimeError("LDAP_POSITIONS_BASE is not configured")
|
||
RuntimeError: LDAP_POSITIONS_BASE is not configured
|
||
_____________ test_add_and_remove_groups_and_permissions_endpoint _____________
|
||
tests\api\v1\employees\test_positions.py:192: in test_add_and_remove_groups_and_permissions_endpoint
|
||
resp = api_client.post(url_add, {"groups": [gA.id]}, format="json")
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
..\.venv\Lib\site-packages\rest_framework\test.py:299: in post
|
||
response = super().post(
|
||
..\.venv\Lib\site-packages\rest_framework\test.py:213: in post
|
||
return self.generic('POST', path, data, content_type, **extra)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
..\.venv\Lib\site-packages\rest_framework\test.py:237: in generic
|
||
return super().generic(
|
||
..\.venv\Lib\site-packages\django\test\client.py:671: in generic
|
||
return self.request(**r)
|
||
^^^^^^^^^^^^^^^^^
|
||
..\.venv\Lib\site-packages\rest_framework\test.py:289: in request
|
||
return super().request(**kwargs)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
..\.venv\Lib\site-packages\rest_framework\test.py:241: in request
|
||
request = super().request(**kwargs)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
..\.venv\Lib\site-packages\django\test\client.py:1087: in request
|
||
self.check_exception(response)
|
||
..\.venv\Lib\site-packages\django\test\client.py:802: in check_exception
|
||
raise exc_value
|
||
..\.venv\Lib\site-packages\django\core\handlers\exception.py:55: in inner
|
||
response = get_response(request)
|
||
^^^^^^^^^^^^^^^^^^^^^
|
||
..\.venv\Lib\site-packages\django\core\handlers\base.py:197: in _get_response
|
||
response = wrapped_callback(request, *callback_args, **callback_kwargs)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
..\.venv\Lib\site-packages\django\views\decorators\csrf.py:65: in _view_wrapper
|
||
return view_func(request, *args, **kwargs)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
..\.venv\Lib\site-packages\rest_framework\viewsets.py:125: in view
|
||
return self.dispatch(request, *args, **kwargs)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
..\.venv\Lib\site-packages\rest_framework\views.py:515: in dispatch
|
||
response = self.handle_exception(exc)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
..\.venv\Lib\site-packages\rest_framework\views.py:475: in handle_exception
|
||
self.raise_uncaught_exception(exc)
|
||
..\.venv\Lib\site-packages\rest_framework\views.py:486: in raise_uncaught_exception
|
||
raise exc
|
||
..\.venv\Lib\site-packages\rest_framework\views.py:512: in dispatch
|
||
response = handler(request, *args, **kwargs)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
api\v1\employees\views\positions.py:87: in add_groups
|
||
err2 = _ldap_try(lambda: DirectoryService().reconcile_position(pos))
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
api\v1\employees\views\_helpers.py:39: in _ldap_try
|
||
fn()
|
||
api\v1\employees\views\positions.py:87: in <lambda>
|
||
err2 = _ldap_try(lambda: DirectoryService().reconcile_position(pos))
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
employees\ldap\directory_service.py:373: in reconcile_position
|
||
return self._position_service.reconcile_position(pos)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
employees\ldap\services\position_service.py:72: in reconcile_position
|
||
return self._reconcile_position(conn, pos)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
employees\ldap\services\position_service.py:358: in _reconcile_position
|
||
pos_dn = self._ensure_position_group(conn, pos)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
employees\ldap\services\position_service.py:212: in _ensure_position_group
|
||
ensure_container_exists(conn, self._positions_base())
|
||
^^^^^^^^^^^^^^^^^^^^^^
|
||
employees\ldap\services\position_service.py:170: in _positions_base
|
||
raise RuntimeError("LDAP_POSITIONS_BASE is not configured")
|
||
E RuntimeError: LDAP_POSITIONS_BASE is not configured
|
||
---------------------------- Captured stderr call -----------------------------
|
||
[ERROR] 2026-02-16 17:34:54,811 django.request:253 Internal Server Error: /api/v1/positions/10/add_groups/
|
||
Traceback (most recent call last):
|
||
File "C:\Users\igor_\Dev\EUSRR\.venv\Lib\site-packages\django\core\handlers\exception.py", line 55, in inner
|
||
response = get_response(request)
|
||
^^^^^^^^^^^^^^^^^^^^^
|
||
File "C:\Users\igor_\Dev\EUSRR\.venv\Lib\site-packages\django\core\handlers\base.py", line 197, in _get_response
|
||
response = wrapped_callback(request, *callback_args, **callback_kwargs)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
File "C:\Users\igor_\Dev\EUSRR\.venv\Lib\site-packages\django\views\decorators\csrf.py", line 65, in _view_wrapper
|
||
return view_func(request, *args, **kwargs)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
File "C:\Users\igor_\Dev\EUSRR\.venv\Lib\site-packages\rest_framework\viewsets.py", line 125, in view
|
||
return self.dispatch(request, *args, **kwargs)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
File "C:\Users\igor_\Dev\EUSRR\.venv\Lib\site-packages\rest_framework\views.py", line 515, in dispatch
|
||
response = self.handle_exception(exc)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
File "C:\Users\igor_\Dev\EUSRR\.venv\Lib\site-packages\rest_framework\views.py", line 475, in handle_exception
|
||
self.raise_uncaught_exception(exc)
|
||
File "C:\Users\igor_\Dev\EUSRR\.venv\Lib\site-packages\rest_framework\views.py", line 486, in raise_uncaught_exception
|
||
raise exc
|
||
File "C:\Users\igor_\Dev\EUSRR\.venv\Lib\site-packages\rest_framework\views.py", line 512, in dispatch
|
||
response = handler(request, *args, **kwargs)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
File "C:\Users\igor_\Dev\EUSRR\backend\api\v1\employees\views\positions.py", line 87, in add_groups
|
||
err2 = _ldap_try(lambda: DirectoryService().reconcile_position(pos))
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
File "C:\Users\igor_\Dev\EUSRR\backend\api\v1\employees\views\_helpers.py", line 39, in _ldap_try
|
||
fn()
|
||
File "C:\Users\igor_\Dev\EUSRR\backend\api\v1\employees\views\positions.py", line 87, in <lambda>
|
||
err2 = _ldap_try(lambda: DirectoryService().reconcile_position(pos))
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
File "C:\Users\igor_\Dev\EUSRR\backend\employees\ldap\directory_service.py", line 373, in reconcile_position
|
||
return self._position_service.reconcile_position(pos)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
File "C:\Users\igor_\Dev\EUSRR\backend\employees\ldap\services\position_service.py", line 72, in reconcile_position
|
||
return self._reconcile_position(conn, pos)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
File "C:\Users\igor_\Dev\EUSRR\backend\employees\ldap\services\position_service.py", line 358, in _reconcile_position
|
||
pos_dn = self._ensure_position_group(conn, pos)
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
File "C:\Users\igor_\Dev\EUSRR\backend\employees\ldap\services\position_service.py", line 212, in _ensure_position_group
|
||
ensure_container_exists(conn, self._positions_base())
|
||
^^^^^^^^^^^^^^^^^^^^^^
|
||
File "C:\Users\igor_\Dev\EUSRR\backend\employees\ldap\services\position_service.py", line 170, in _positions_base
|
||
raise RuntimeError("LDAP_POSITIONS_BASE is not configured")
|
||
RuntimeError: LDAP_POSITIONS_BASE is not configured
|
||
________ TestRoleAssignmentEndpoints.test_assign_role_to_any_employee _________
|
||
Fixture "make_user" called directly. Fixtures are not meant to be called directly,
|
||
but are created automatically when test functions request them as parameters.
|
||
See https://docs.pytest.org/en/stable/explanation/fixtures.html for more information about fixtures, and
|
||
https://docs.pytest.org/en/stable/deprecations.html#calling-fixtures-directly
|
||
________________ TestRoleAssignmentEndpoints.test_revoke_role _________________
|
||
Fixture "make_user" called directly. Fixtures are not meant to be called directly,
|
||
but are created automatically when test functions request them as parameters.
|
||
See https://docs.pytest.org/en/stable/explanation/fixtures.html for more information about fixtures, and
|
||
https://docs.pytest.org/en/stable/deprecations.html#calling-fixtures-directly
|
||
______________ TestRoleAssignmentEndpoints.test_assignments_list ______________
|
||
Fixture "make_user" called directly. Fixtures are not meant to be called directly,
|
||
but are created automatically when test functions request them as parameters.
|
||
See https://docs.pytest.org/en/stable/explanation/fixtures.html for more information about fixtures, and
|
||
https://docs.pytest.org/en/stable/deprecations.html#calling-fixtures-directly
|
||
_________ TestRoleAssignmentEndpoints.test_assign_requires_permission _________
|
||
Fixture "make_user" called directly. Fixtures are not meant to be called directly,
|
||
but are created automatically when test functions request them as parameters.
|
||
See https://docs.pytest.org/en/stable/explanation/fixtures.html for more information about fixtures, and
|
||
https://docs.pytest.org/en/stable/deprecations.html#calling-fixtures-directly
|
||
________ TestRoleAssignmentEndpoints.test_assign_with_dept_permission _________
|
||
Fixture "make_user" called directly. Fixtures are not meant to be called directly,
|
||
but are created automatically when test functions request them as parameters.
|
||
See https://docs.pytest.org/en/stable/explanation/fixtures.html for more information about fixtures, and
|
||
https://docs.pytest.org/en/stable/deprecations.html#calling-fixtures-directly
|
||
___ TestRoleAssignmentPermissions.test_permission_check_via_role_assignment ___
|
||
Fixture "make_user" called directly. Fixtures are not meant to be called directly,
|
||
but are created automatically when test functions request them as parameters.
|
||
See https://docs.pytest.org/en/stable/explanation/fixtures.html for more information about fixtures, and
|
||
https://docs.pytest.org/en/stable/deprecations.html#calling-fixtures-directly
|
||
_ TestRoleAssignmentPermissions.test_inactive_assignment_does_not_grant_permission _
|
||
Fixture "make_user" called directly. Fixtures are not meant to be called directly,
|
||
but are created automatically when test functions request them as parameters.
|
||
See https://docs.pytest.org/en/stable/explanation/fixtures.html for more information about fixtures, and
|
||
https://docs.pytest.org/en/stable/deprecations.html#calling-fixtures-directly
|
||
============================== warnings summary ===============================
|
||
..\.venv\Lib\site-packages\pyasn1\codec\ber\encoder.py:952
|
||
C:\Users\igor_\Dev\EUSRR\.venv\Lib\site-packages\pyasn1\codec\ber\encoder.py:952: DeprecationWarning: tagMap is deprecated. Please use TAG_MAP instead.
|
||
warnings.warn(f"{attr} is deprecated. Please use {newAttr} instead.", DeprecationWarning)
|
||
|
||
..\.venv\Lib\site-packages\pyasn1\codec\ber\encoder.py:952
|
||
C:\Users\igor_\Dev\EUSRR\.venv\Lib\site-packages\pyasn1\codec\ber\encoder.py:952: DeprecationWarning: typeMap is deprecated. Please use TYPE_MAP instead.
|
||
warnings.warn(f"{attr} is deprecated. Please use {newAttr} instead.", DeprecationWarning)
|
||
|
||
-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
|
||
=========================== short test summary info ===========================
|
||
FAILED tests/api/v1/employees/test_department_head_rights.py::test_head_can_update_department_without_explicit_role_perms
|
||
FAILED tests/api/v1/employees/test_department_head_rights.py::test_head_can_set_member_role_and_non_head_cannot
|
||
FAILED tests/api/v1/employees/test_department_head_rights.py::test_head_can_change_head_and_loses_rights_afterwards
|
||
FAILED tests/api/v1/employees/test_department_membership_separation.py::test_add_member_requires_manage_and_does_not_assign_role
|
||
FAILED tests/api/v1/employees/test_department_membership_separation.py::test_all_three_actions_require_auth_and_permissions
|
||
FAILED tests/api/v1/employees/test_department_membership_separation.py::test_set_member_role_requires_assign_not_manage
|
||
FAILED tests/api/v1/employees/test_department_membership_separation.py::test_set_member_role_does_not_create_membership_and_does_not_toggle_active
|
||
FAILED tests/api/v1/employees/test_department_membership_separation.py::test_add_member_ignores_role_parameter
|
||
FAILED tests/api/v1/employees/test_department_membership_separation.py::test_remove_member_requires_manage_and_does_not_touch_role
|
||
FAILED tests/api/v1/employees/test_department_roles.py::test_list_filtered_by_department
|
||
FAILED tests/api/v1/employees/test_department_roles.py::test_create_requires_assign_department_role
|
||
FAILED tests/api/v1/employees/test_department_roles.py::test_update_and_destroy_scope_enforced
|
||
FAILED tests/api/v1/employees/test_department_roles.py::test_perm_choices_and_perms_and_set_perms
|
||
FAILED tests/api/v1/employees/test_department_roles.py::test_set_perms_validates_payload
|
||
FAILED tests/api/v1/employees/test_department_roles.py::test_back_compat_permissions_field_contains_ids
|
||
FAILED tests/api/v1/employees/test_department_roles.py::test_create_with_scoped_permission_codes_and_update_name
|
||
FAILED tests/api/v1/employees/test_department_roles.py::test_cross_department_access_denied_for_set_perms
|
||
FAILED tests/api/v1/employees/test_department_roles_extra.py::test_read_only_allowed_without_assign
|
||
FAILED tests/api/v1/employees/test_department_roles_extra.py::test_staff_override_for_write
|
||
FAILED tests/api/v1/employees/test_department_roles_extra.py::test_ordering_stable_by_name_then_id
|
||
FAILED tests/api/v1/employees/test_department_roles_extra.py::test_set_perms_ids_take_precedence_over_codes
|
||
FAILED tests/api/v1/employees/test_department_roles_extra.py::test_serializer_codes_override_scoped_permissions_on_create
|
||
FAILED tests/api/v1/employees/test_department_roles_extra.py::test_perm_choices_fields_and_nonempty
|
||
FAILED tests/api/v1/employees/test_department_roles_extra.py::test_destroy_requires_assign_in_same_department
|
||
FAILED tests/api/v1/employees/test_department_roles_extra.py::test_set_perms_dedup_and_replace_semantics
|
||
FAILED tests/api/v1/employees/test_departments.py::test_list_ok_for_authenticated
|
||
FAILED tests/api/v1/employees/test_departments.py::test_search_and_ordering
|
||
FAILED tests/api/v1/employees/test_departments.py::test_employees_count_adds_head_if_not_in_links
|
||
FAILED tests/api/v1/employees/test_departments.py::test_employees_count_not_double_count_head_if_in_links
|
||
FAILED tests/api/v1/employees/test_departments.py::test_create_requires_staff
|
||
FAILED tests/api/v1/employees/test_departments.py::test_destroy_requires_staff
|
||
FAILED tests/api/v1/employees/test_departments.py::test_partial_update_name_requires_manage_perm
|
||
FAILED tests/api/v1/employees/test_departments.py::test_partial_update_head_requires_change_head_perm
|
||
FAILED tests/api/v1/employees/test_departments.py::test_partial_update_head_same_value_does_not_require_extra_perm
|
||
FAILED tests/api/v1/employees/test_departments.py::test_set_head_by_role_with_perm
|
||
FAILED tests/api/v1/employees/test_departments.py::test_set_head_validation_inactive_employee
|
||
FAILED tests/api/v1/employees/test_departments.py::test_set_head_remove_with_null
|
||
FAILED tests/api/v1/employees/test_departments.py::test_set_head_requires_perm
|
||
FAILED tests/api/v1/employees/test_departments.py::test_set_member_role_happy_path
|
||
FAILED tests/api/v1/employees/test_departments.py::test_set_member_role_reject_foreign_role
|
||
FAILED tests/api/v1/employees/test_departments.py::test_set_member_role_requires_perm
|
||
FAILED tests/api/v1/employees/test_departments.py::test_set_member_role_missing_employee_id
|
||
FAILED tests/api/v1/employees/test_email_verification_security.py::TestEmailChangeResetsVerification::test_change_email_resets_email_verified_for_self
|
||
FAILED tests/api/v1/employees/test_email_verification_security.py::TestEmailChangeResetsVerification::test_change_email_via_me_endpoint_resets_verification
|
||
FAILED tests/api/v1/employees/test_email_verification_security.py::TestEmailChangeResetsVerification::test_change_email_sends_verification_code
|
||
FAILED tests/api/v1/employees/test_email_verification_security.py::TestEmailChangeResetsVerification::test_change_other_fields_does_not_reset_verification
|
||
FAILED tests/api/v1/employees/test_email_verification_security.py::TestEmailChangeResetsVerification::test_change_email_to_same_value_does_not_reset
|
||
FAILED tests/api/v1/employees/test_email_verification_security.py::TestUnverifiedUserRestrictions::test_unverified_user_can_update_self_non_critical_fields
|
||
FAILED tests/api/v1/employees/test_email_verification_security.py::TestUnverifiedUserRestrictions::test_unverified_user_can_verify_email
|
||
FAILED tests/api/v1/employees/test_email_verification_security.py::TestUnverifiedUserRestrictions::test_unverified_user_can_resend_code
|
||
FAILED tests/api/v1/employees/test_email_verification_security.py::TestResendEmailLogic::test_resend_email_generates_new_code
|
||
FAILED tests/api/v1/employees/test_email_verification_security.py::TestResendEmailLogic::test_resend_email_to_verified_user_fails
|
||
FAILED tests/api/v1/employees/test_email_verification_security.py::TestResendEmailLogic::test_old_code_becomes_invalid_after_resend
|
||
FAILED tests/api/v1/employees/test_email_verification_security.py::TestEmailVerificationWorkflow::test_full_registration_and_verification_flow
|
||
FAILED tests/api/v1/employees/test_email_verification_security.py::TestEmailVerificationWorkflow::test_change_email_and_verify_new_one
|
||
FAILED tests/api/v1/employees/test_employee_actions.py::test_dismissal_works_when_ldap_disabled
|
||
FAILED tests/api/v1/employees/test_employee_actions.py::test_restoration_moves_from_dismissed_to_users
|
||
FAILED tests/api/v1/employees/test_employees.py::test_create_requires_staff
|
||
FAILED tests/api/v1/employees/test_employees.py::test_destroy_requires_admin
|
||
FAILED tests/api/v1/employees/test_employees.py::test_me_patch_rejects_when_all_contacts_empty
|
||
FAILED tests/api/v1/employees/test_employees_fields_in_list.py::test_list_includes_basic_fields
|
||
FAILED tests/api/v1/employees/test_employees_fields_in_list.py::test_list_departments_include_role
|
||
FAILED tests/api/v1/employees/test_ldap_optional_register.py::test_register_without_ldap_creates_user_only_in_db
|
||
FAILED tests/api/v1/employees/test_positions.py::test_create_permissions - Ru...
|
||
FAILED tests/api/v1/employees/test_positions.py::test_update_permissions_and_search_ordering
|
||
FAILED tests/api/v1/employees/test_positions.py::test_set_groups_requires_special_perm
|
||
FAILED tests/api/v1/employees/test_positions.py::test_add_and_remove_groups_and_permissions_endpoint
|
||
FAILED tests/api/v1/employees/test_role_assignment.py::TestRoleAssignmentEndpoints::test_assign_role_to_any_employee
|
||
FAILED tests/api/v1/employees/test_role_assignment.py::TestRoleAssignmentEndpoints::test_revoke_role
|
||
FAILED tests/api/v1/employees/test_role_assignment.py::TestRoleAssignmentEndpoints::test_assignments_list
|
||
FAILED tests/api/v1/employees/test_role_assignment.py::TestRoleAssignmentEndpoints::test_assign_requires_permission
|
||
FAILED tests/api/v1/employees/test_role_assignment.py::TestRoleAssignmentEndpoints::test_assign_with_dept_permission
|
||
FAILED tests/api/v1/employees/test_role_assignment.py::TestRoleAssignmentPermissions::test_permission_check_via_role_assignment
|
||
FAILED tests/api/v1/employees/test_role_assignment.py::TestRoleAssignmentPermissions::test_inactive_assignment_does_not_grant_permission
|
||
ERROR tests/api/v1/employees/test_ldap_optional_groups.py::test_create_group_without_ldap
|
||
ERROR tests/api/v1/employees/test_ldap_optional_groups.py::test_add_members_without_ldap
|
||
ERROR tests/api/v1/employees/test_ldap_optional_groups.py::test_destroy_group_without_ldap
|
||
ERROR tests/api/v1/employees/test_ldap_optional_groups.py::test_get_members_without_ldap
|
||
====== 74 failed, 59 passed, 13 skipped, 2 warnings, 4 errors in 17.79s =======
|