running extract_messages extracting messages from invenio_users_resources/__init__.py (encoding="utf-8") extracting messages from invenio_users_resources/config.py (encoding="utf-8") extracting messages from invenio_users_resources/entity_resolvers.py (encoding="utf-8") extracting messages from invenio_users_resources/ext.py (encoding="utf-8") extracting messages from invenio_users_resources/forms.py (encoding="utf-8") extracting messages from invenio_users_resources/models.py (encoding="utf-8") extracting messages from invenio_users_resources/permissions.py (encoding="utf-8") extracting messages from invenio_users_resources/proxies.py (encoding="utf-8") extracting messages from invenio_users_resources/views.py (encoding="utf-8") extracting messages from invenio_users_resources/notifications/__init__.py (encoding="utf-8") extracting messages from invenio_users_resources/notifications/filters.py (encoding="utf-8") extracting messages from invenio_users_resources/notifications/generators.py (encoding="utf-8") extracting messages from invenio_users_resources/records/__init__.py (encoding="utf-8") extracting messages from invenio_users_resources/records/api.py (encoding="utf-8") extracting messages from invenio_users_resources/records/hooks.py (encoding="utf-8") extracting messages from invenio_users_resources/records/models.py (encoding="utf-8") extracting messages from invenio_users_resources/records/dumpers/__init__.py (encoding="utf-8") extracting messages from invenio_users_resources/records/dumpers/email.py (encoding="utf-8") extracting messages from invenio_users_resources/records/mappings/__init__.py (encoding="utf-8") extracting messages from invenio_users_resources/records/mappings/os-v1/__init__.py (encoding="utf-8") extracting messages from invenio_users_resources/records/mappings/os-v2/__init__.py (encoding="utf-8") extracting messages from invenio_users_resources/records/mappings/v7/__init__.py (encoding="utf-8") extracting messages from invenio_users_resources/records/systemfields/__init__.py (encoding="utf-8") extracting messages from invenio_users_resources/resources/__init__.py (encoding="utf-8") extracting messages from invenio_users_resources/resources/domains/__init__.py (encoding="utf-8") extracting messages from invenio_users_resources/resources/domains/config.py (encoding="utf-8") extracting messages from invenio_users_resources/resources/domains/resource.py (encoding="utf-8") extracting messages from invenio_users_resources/resources/groups/__init__.py (encoding="utf-8") extracting messages from invenio_users_resources/resources/groups/config.py (encoding="utf-8") extracting messages from invenio_users_resources/resources/groups/errors.py (encoding="utf-8") extracting messages from invenio_users_resources/resources/groups/resource.py (encoding="utf-8") extracting messages from invenio_users_resources/resources/users/__init__.py (encoding="utf-8") extracting messages from invenio_users_resources/resources/users/config.py (encoding="utf-8") extracting messages from invenio_users_resources/resources/users/errors.py (encoding="utf-8") extracting messages from invenio_users_resources/resources/users/resource.py (encoding="utf-8") extracting messages from invenio_users_resources/services/__init__.py (encoding="utf-8") extracting messages from invenio_users_resources/services/common.py (encoding="utf-8") extracting messages from invenio_users_resources/services/generators.py (encoding="utf-8") extracting messages from invenio_users_resources/services/params.py (encoding="utf-8") extracting messages from invenio_users_resources/services/permissions.py (encoding="utf-8") extracting messages from invenio_users_resources/services/results.py (encoding="utf-8") extracting messages from invenio_users_resources/services/schemas.py (encoding="utf-8") extracting messages from invenio_users_resources/services/domains/__init__.py (encoding="utf-8") extracting messages from invenio_users_resources/services/domains/components.py (encoding="utf-8") extracting messages from invenio_users_resources/services/domains/config.py (encoding="utf-8") extracting messages from invenio_users_resources/services/domains/facets.py (encoding="utf-8") extracting messages from invenio_users_resources/services/domains/service.py (encoding="utf-8") extracting messages from invenio_users_resources/services/domains/tasks.py (encoding="utf-8") extracting messages from invenio_users_resources/services/groups/__init__.py (encoding="utf-8") extracting messages from invenio_users_resources/services/groups/config.py (encoding="utf-8") extracting messages from invenio_users_resources/services/groups/facets.py (encoding="utf-8") extracting messages from invenio_users_resources/services/groups/results.py (encoding="utf-8") extracting messages from invenio_users_resources/services/groups/service.py (encoding="utf-8") extracting messages from invenio_users_resources/services/groups/tasks.py (encoding="utf-8") extracting messages from invenio_users_resources/services/users/__init__.py (encoding="utf-8") extracting messages from invenio_users_resources/services/users/config.py (encoding="utf-8") extracting messages from invenio_users_resources/services/users/facets.py (encoding="utf-8") extracting messages from invenio_users_resources/services/users/lock.py (encoding="utf-8") extracting messages from invenio_users_resources/services/users/results.py (encoding="utf-8") extracting messages from invenio_users_resources/services/users/search_params.py (encoding="utf-8") extracting messages from invenio_users_resources/services/users/service.py (encoding="utf-8") extracting messages from invenio_users_resources/services/users/tasks.py (encoding="utf-8") extracting messages from invenio_users_resources/templates/security/email/new_user_via_admin.html (encoding="utf-8") extracting messages from invenio_users_resources/templates/semantic-ui/invenio_users_resources/settings/notifications.html (encoding="utf-8") writing PO template file to /dev/null rabbitmq Pulling redis Pulling opensearch Pulling postgresql Pulling redis Pulled rabbitmq Pulled postgresql Pulled opensearch Pulled Network docker_services_cli_default Creating Network docker_services_cli_default Created Container docker_services_cli-postgresql-1 Creating Container docker_services_cli-opensearch-1 Creating Container docker_services_cli-rabbitmq-1 Creating Container docker_services_cli-redis-1 Creating Container docker_services_cli-redis-1 Created Container docker_services_cli-postgresql-1 Created Container docker_services_cli-opensearch-1 Created Container docker_services_cli-rabbitmq-1 Created Container docker_services_cli-opensearch-1 Starting Container docker_services_cli-rabbitmq-1 Starting Container docker_services_cli-redis-1 Starting Container docker_services_cli-postgresql-1 Starting Container docker_services_cli-postgresql-1 Started Container docker_services_cli-redis-1 Started Container docker_services_cli-opensearch-1 Started Container docker_services_cli-rabbitmq-1 Started ============================= test session starts ============================== platform linux -- Python 3.14.2, pytest-8.4.2, pluggy-1.6.0 rootdir: /home/runner/work/rdm-14-tests/rdm-14-tests/workdir/tests/invenio-users-resources/patched configfile: setup.cfg testpaths: docs, tests, invenio_users_resources plugins: flask-1.3.0, black-0.6.0, github-actions-annotate-failures-0.4.2, pycodestyle-2.5.0, cov-7.1.0, invenio-4.0.1, pydocstyle-2.4.0, isort-4.0.0 collected 388 items docs/conf.py ... [ 0%] tests/administration/__init__.py ... [ 1%] tests/administration/domains.py ... [ 2%] tests/administration/records.py ... [ 3%] tests/administration/users.py ... [ 3%] tests/conftest.py ... [ 4%] tests/resources/test_resources_domains.py ............ [ 7%] tests/resources/test_resources_groups.py [ 10%] tests/resources/test_resources_users.py ::error file=workdir/tests/invenio-users-resources/patched/tests/resources/test_resources_users.py,line=241::test_user_groups_endpoints%0A%0Aopensearchpy.exceptions.ConflictError: ConflictError(409, 'version_conflict_engine_exception', '[2]: version conflict, current version [1] is higher than the one provided [0]') F.::error file=workdir/tests/invenio-users-resources/patched/tests/resources/test_resources_users.py,line=276::test_user_groups_bulk_set%0A%0Aopensearchpy.exceptions.ConflictError: ConflictError(409, 'version_conflict_engine_exception', '[2]: version conflict, current version [1] is higher than the one provided [0]') F::error file=workdir/tests/invenio-users-resources/patched/tests/resources/test_resources_users.py,line=300::test_user_groups_bulk_add%0A%0Aopensearchpy.exceptions.ConflictError: ConflictError(409, 'version_conflict_engine_exception', '[2]: version conflict, current version [1] is higher than the one provided [0]') F::error file=workdir/tests/invenio-users-resources/patched/tests/resources/test_resources_users.py,line=321::test_user_groups_bulk_remove%0A%0Aopensearchpy.exceptions.ConflictError: ConflictError(409, 'version_conflict_engine_exception', '[2]: version conflict, current version [1] is higher than the one provided [0]') F.......... [ 17%] tests/services/test_generators.py [ 18%] tests/services/test_schemas.py .... [ 19%] tests/services/test_service_groups.py [ 25%] tests/services/test_service_tasks_domains.py [ 26%] tests/services/users/test_service_users.py [ 34%] ::error file=workdir/tests/invenio-users-resources/patched/tests/services/users/test_service_users.py,line=594::test_group_mutation_advances_search_revision%0A%0Aassert 0 > 0 F...........::error file=workdir/tests/invenio-users-resources/patched/tests/services/users/test_service_users.py,line=712::test_set_groups_protected_role_allowed%0A%0Aopensearchpy.exceptions.ConflictError: ConflictError(409, 'version_conflict_engine_exception', '[3]: version conflict, current version [1] is higher than the one provided [0]') F.. [ 46%] tests/services/users/test_user_moderation.py [ 48%] tests/test_invenio_users_resources.py .... [ 49%] tests/test_notifications.py [ 50%] tests/test_user_roles_admin.py [ 52%] invenio_users_resources/__init__.py ... [ 52%] invenio_users_resources/config.py ... [ 53%] invenio_users_resources/entity_resolvers.py ... [ 54%] invenio_users_resources/ext.py ... [ 55%] invenio_users_resources/forms.py ... [ 55%] invenio_users_resources/models.py ... [ 56%] invenio_users_resources/notifications/__init__.py ... [ 57%] invenio_users_resources/notifications/filters.py ... [ 58%] invenio_users_resources/notifications/generators.py ... [ 59%] invenio_users_resources/permissions.py ... [ 59%] invenio_users_resources/proxies.py ... [ 60%] invenio_users_resources/records/__init__.py ... [ 61%] invenio_users_resources/records/api.py ... [ 62%] invenio_users_resources/records/dumpers/__init__.py ... [ 62%] invenio_users_resources/records/dumpers/email.py ... [ 63%] invenio_users_resources/records/hooks.py ... [ 64%] invenio_users_resources/records/mappings/__init__.py ... [ 65%] invenio_users_resources/records/mappings/os-v1/__init__.py ... [ 65%] invenio_users_resources/records/mappings/os-v2/__init__.py ... [ 66%] invenio_users_resources/records/mappings/v7/__init__.py ... [ 67%] invenio_users_resources/records/models.py ... [ 68%] invenio_users_resources/records/systemfields/__init__.py ... [ 69%] invenio_users_resources/resources/__init__.py ... [ 69%] invenio_users_resources/resources/domains/__init__.py ... [ 70%] invenio_users_resources/resources/domains/config.py ... [ 71%] invenio_users_resources/resources/domains/resource.py ... [ 72%] invenio_users_resources/resources/groups/__init__.py ... [ 72%] invenio_users_resources/resources/groups/config.py ... [ 73%] invenio_users_resources/resources/groups/errors.py ... [ 74%] invenio_users_resources/resources/groups/resource.py ... [ 75%] invenio_users_resources/resources/users/__init__.py ... [ 76%] invenio_users_resources/resources/users/config.py ... [ 76%] invenio_users_resources/resources/users/errors.py ... [ 77%] invenio_users_resources/resources/users/resource.py ... [ 78%] invenio_users_resources/services/__init__.py ... [ 79%] invenio_users_resources/services/common.py ... [ 79%] invenio_users_resources/services/domains/__init__.py ... [ 80%] invenio_users_resources/services/domains/components.py ... [ 81%] invenio_users_resources/services/domains/config.py ... [ 82%] invenio_users_resources/services/domains/facets.py ... [ 82%] invenio_users_resources/services/domains/service.py ... [ 83%] invenio_users_resources/services/domains/tasks.py ... [ 84%] invenio_users_resources/services/generators.py ... [ 85%] invenio_users_resources/services/groups/__init__.py ... [ 86%] invenio_users_resources/services/groups/config.py ... [ 86%] invenio_users_resources/services/groups/facets.py ... [ 87%] invenio_users_resources/services/groups/results.py ... [ 88%] invenio_users_resources/services/groups/service.py ... [ 89%] invenio_users_resources/services/groups/tasks.py ... [ 89%] invenio_users_resources/services/params.py ... [ 90%] invenio_users_resources/services/permissions.py ... [ 91%] invenio_users_resources/services/results.py ... [ 92%] invenio_users_resources/services/schemas.py ... [ 93%] invenio_users_resources/services/users/__init__.py ... [ 93%] invenio_users_resources/services/users/config.py ... [ 94%] invenio_users_resources/services/users/facets.py ... [ 95%] invenio_users_resources/services/users/lock.py ... [ 96%] invenio_users_resources/services/users/results.py ... [ 96%] invenio_users_resources/services/users/search_params.py ... [ 97%] invenio_users_resources/services/users/service.py ... [ 98%] invenio_users_resources/services/users/tasks.py ... [ 99%] invenio_users_resources/views.py ... [100%] =================================== FAILURES =================================== __________________________ test_user_groups_endpoints __________________________ client = > headers = {'accept': 'application/json', 'content-type': 'application/json'} user_moderator = user_pub = group = def test_user_groups_endpoints(client, headers, user_moderator, user_pub, group): """Manage user roles through users groups endpoints.""" client = user_moderator.login(client) res = client.get(f"/users/{user_pub.id}/groups", headers=headers) assert res.status_code == 200 assert isinstance(res.json["groups"], list) > res = client.put( f"/users/{user_pub.id}/groups", json={"groups": [" it-dep "]}, headers=headers, ) tests/resources/test_resources_users.py:241: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ venv/lib/python3.14/site-packages/werkzeug/test.py:1172: in put return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ venv/lib/python3.14/site-packages/flask/testing.py:235: in open response = super().open( venv/lib/python3.14/site-packages/werkzeug/test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ venv/lib/python3.14/site-packages/werkzeug/test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ venv/lib/python3.14/site-packages/werkzeug/test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ venv/lib/python3.14/site-packages/flask/app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ venv/lib/python3.14/site-packages/flask/app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ venv/lib/python3.14/site-packages/flask/app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ venv/lib/python3.14/site-packages/flask/app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ venv/lib/python3.14/site-packages/flask/app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ venv/lib/python3.14/site-packages/flask/app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ venv/lib/python3.14/site-packages/flask_resources/resources.py:65: in view return view_meth() ^^^^^^^^^^^ venv/lib/python3.14/site-packages/flask_resources/content_negotiation.py:116: in inner_content_negotiation return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ venv/lib/python3.14/site-packages/flask_resources/parsers/decorators.py:51: in inner return f(self, *args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^ venv/lib/python3.14/site-packages/flask_resources/parsers/decorators.py:90: in inner return f(self, *args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^ invenio_users_resources/resources/users/resource.py:160: in set_groups return self._set_groups_response() ^^^^^^^^^^^^^^^^^^^^^^^^^^^ invenio_users_resources/resources/users/resource.py:166: in _set_groups_response data = self.service.set_groups( venv/lib/python3.14/site-packages/invenio_db/uow.py:248: in inner uow.commit() venv/lib/python3.14/site-packages/invenio_db/uow.py:192: in commit op.on_commit(self) venv/lib/python3.14/site-packages/invenio_records_resources/services/uow.py:137: in on_commit self._indexer.index(self._record, arguments=arguments) venv/lib/python3.14/site-packages/invenio_indexer/api.py:176: in index return self.client.index( venv/lib/python3.14/site-packages/opensearchpy/client/utils.py:176: in _wrapped return func(*args, params=params, headers=headers, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ venv/lib/python3.14/site-packages/opensearchpy/client/__init__.py:491: in index return self.transport.perform_request( venv/lib/python3.14/site-packages/opensearchpy/transport.py:457: in perform_request raise e venv/lib/python3.14/site-packages/opensearchpy/transport.py:418: in perform_request status, headers_response, data = connection.perform_request( venv/lib/python3.14/site-packages/opensearchpy/connection/http_urllib3.py:308: in perform_request self._raise_error( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = , status_code = 409 raw_data = '{"error":{"root_cause":[{"type":"version_conflict_engine_exception","reason":"[2]: version conflict, current version ... provided [0]","index":"users-user-v3.0.0-1782199650","shard":"0","index_uuid":"b0TEblJKRCKUfg95lzrc9Q"},"status":409}' content_type = 'application/json' def _raise_error( self, status_code: int, raw_data: Union[str, bytes], content_type: Optional[str] = None, ) -> None: """Locate appropriate exception and raise it.""" error_message = raw_data additional_info = None try: content_type = ( "text/plain" if content_type is None else content_type.split(";")[0].strip() ) if raw_data and content_type == "application/json": additional_info = json.loads(raw_data) error_message = additional_info.get("error", error_message) if isinstance(error_message, dict) and "type" in error_message: error_message = error_message["type"] except (ValueError, TypeError) as err: logger.warning("Undecodable raw error response from server: %s", err) > raise HTTP_EXCEPTIONS.get(status_code, TransportError)( status_code, error_message, additional_info ) E opensearchpy.exceptions.ConflictError: ConflictError(409, 'version_conflict_engine_exception', '[2]: version conflict, current version [1] is higher than the one provided [0]') venv/lib/python3.14/site-packages/opensearchpy/connection/base.py:315: ConflictError ------------------------------ Captured log call ------------------------------- WARNING opensearch:base.py:280 PUT http://localhost:9200/users-user-v3.0.0/_doc/2?refresh=true&version=0&version_type=external_gte [status:409 request:0.006s] __________________________ test_user_groups_bulk_set ___________________________ client = > headers = {'accept': 'application/json', 'content-type': 'application/json'} user_moderator = user_pub = group = , group2 = def test_user_groups_bulk_set(client, headers, user_moderator, user_pub, group, group2): """Bulk set roles via the groups endpoint.""" client = user_moderator.login(client) > res = client.put( f"/users/{user_pub.id}/groups", json={"groups": ["it-dep", "hr-dep"]}, headers=headers, ) tests/resources/test_resources_users.py:276: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ venv/lib/python3.14/site-packages/werkzeug/test.py:1172: in put return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ venv/lib/python3.14/site-packages/flask/testing.py:235: in open response = super().open( venv/lib/python3.14/site-packages/werkzeug/test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ venv/lib/python3.14/site-packages/werkzeug/test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ venv/lib/python3.14/site-packages/werkzeug/test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ venv/lib/python3.14/site-packages/flask/app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ venv/lib/python3.14/site-packages/flask/app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ venv/lib/python3.14/site-packages/flask/app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ venv/lib/python3.14/site-packages/flask/app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ venv/lib/python3.14/site-packages/flask/app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ venv/lib/python3.14/site-packages/flask/app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ venv/lib/python3.14/site-packages/flask_resources/resources.py:65: in view return view_meth() ^^^^^^^^^^^ venv/lib/python3.14/site-packages/flask_resources/content_negotiation.py:116: in inner_content_negotiation return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ venv/lib/python3.14/site-packages/flask_resources/parsers/decorators.py:51: in inner return f(self, *args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^ venv/lib/python3.14/site-packages/flask_resources/parsers/decorators.py:90: in inner return f(self, *args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^ invenio_users_resources/resources/users/resource.py:160: in set_groups return self._set_groups_response() ^^^^^^^^^^^^^^^^^^^^^^^^^^^ invenio_users_resources/resources/users/resource.py:166: in _set_groups_response data = self.service.set_groups( venv/lib/python3.14/site-packages/invenio_db/uow.py:248: in inner uow.commit() venv/lib/python3.14/site-packages/invenio_db/uow.py:192: in commit op.on_commit(self) venv/lib/python3.14/site-packages/invenio_records_resources/services/uow.py:137: in on_commit self._indexer.index(self._record, arguments=arguments) venv/lib/python3.14/site-packages/invenio_indexer/api.py:176: in index return self.client.index( venv/lib/python3.14/site-packages/opensearchpy/client/utils.py:176: in _wrapped return func(*args, params=params, headers=headers, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ venv/lib/python3.14/site-packages/opensearchpy/client/__init__.py:491: in index return self.transport.perform_request( venv/lib/python3.14/site-packages/opensearchpy/transport.py:457: in perform_request raise e venv/lib/python3.14/site-packages/opensearchpy/transport.py:418: in perform_request status, headers_response, data = connection.perform_request( venv/lib/python3.14/site-packages/opensearchpy/connection/http_urllib3.py:308: in perform_request self._raise_error( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = , status_code = 409 raw_data = '{"error":{"root_cause":[{"type":"version_conflict_engine_exception","reason":"[2]: version conflict, current version ... provided [0]","index":"users-user-v3.0.0-1782199650","shard":"0","index_uuid":"b0TEblJKRCKUfg95lzrc9Q"},"status":409}' content_type = 'application/json' def _raise_error( self, status_code: int, raw_data: Union[str, bytes], content_type: Optional[str] = None, ) -> None: """Locate appropriate exception and raise it.""" error_message = raw_data additional_info = None try: content_type = ( "text/plain" if content_type is None else content_type.split(";")[0].strip() ) if raw_data and content_type == "application/json": additional_info = json.loads(raw_data) error_message = additional_info.get("error", error_message) if isinstance(error_message, dict) and "type" in error_message: error_message = error_message["type"] except (ValueError, TypeError) as err: logger.warning("Undecodable raw error response from server: %s", err) > raise HTTP_EXCEPTIONS.get(status_code, TransportError)( status_code, error_message, additional_info ) E opensearchpy.exceptions.ConflictError: ConflictError(409, 'version_conflict_engine_exception', '[2]: version conflict, current version [1] is higher than the one provided [0]') venv/lib/python3.14/site-packages/opensearchpy/connection/base.py:315: ConflictError ------------------------------ Captured log call ------------------------------- WARNING opensearch:base.py:280 PUT http://localhost:9200/users-user-v3.0.0/_doc/2?refresh=true&version=0&version_type=external_gte [status:409 request:0.004s] __________________________ test_user_groups_bulk_add ___________________________ client = > headers = {'accept': 'application/json', 'content-type': 'application/json'} user_moderator = user_pub = group = , group2 = def test_user_groups_bulk_add(client, headers, user_moderator, user_pub, group, group2): """Bulk add roles appends without removing existing roles.""" client = user_moderator.login(client) > client.put( f"/users/{user_pub.id}/groups", json={"groups": ["it-dep"]}, headers=headers, ) tests/resources/test_resources_users.py:300: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ venv/lib/python3.14/site-packages/werkzeug/test.py:1172: in put return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ venv/lib/python3.14/site-packages/flask/testing.py:235: in open response = super().open( venv/lib/python3.14/site-packages/werkzeug/test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ venv/lib/python3.14/site-packages/werkzeug/test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ venv/lib/python3.14/site-packages/werkzeug/test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ venv/lib/python3.14/site-packages/flask/app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ venv/lib/python3.14/site-packages/flask/app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ venv/lib/python3.14/site-packages/flask/app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ venv/lib/python3.14/site-packages/flask/app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ venv/lib/python3.14/site-packages/flask/app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ venv/lib/python3.14/site-packages/flask/app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ venv/lib/python3.14/site-packages/flask_resources/resources.py:65: in view return view_meth() ^^^^^^^^^^^ venv/lib/python3.14/site-packages/flask_resources/content_negotiation.py:116: in inner_content_negotiation return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ venv/lib/python3.14/site-packages/flask_resources/parsers/decorators.py:51: in inner return f(self, *args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^ venv/lib/python3.14/site-packages/flask_resources/parsers/decorators.py:90: in inner return f(self, *args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^ invenio_users_resources/resources/users/resource.py:160: in set_groups return self._set_groups_response() ^^^^^^^^^^^^^^^^^^^^^^^^^^^ invenio_users_resources/resources/users/resource.py:166: in _set_groups_response data = self.service.set_groups( venv/lib/python3.14/site-packages/invenio_db/uow.py:248: in inner uow.commit() venv/lib/python3.14/site-packages/invenio_db/uow.py:192: in commit op.on_commit(self) venv/lib/python3.14/site-packages/invenio_records_resources/services/uow.py:137: in on_commit self._indexer.index(self._record, arguments=arguments) venv/lib/python3.14/site-packages/invenio_indexer/api.py:176: in index return self.client.index( venv/lib/python3.14/site-packages/opensearchpy/client/utils.py:176: in _wrapped return func(*args, params=params, headers=headers, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ venv/lib/python3.14/site-packages/opensearchpy/client/__init__.py:491: in index return self.transport.perform_request( venv/lib/python3.14/site-packages/opensearchpy/transport.py:457: in perform_request raise e venv/lib/python3.14/site-packages/opensearchpy/transport.py:418: in perform_request status, headers_response, data = connection.perform_request( venv/lib/python3.14/site-packages/opensearchpy/connection/http_urllib3.py:308: in perform_request self._raise_error( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = , status_code = 409 raw_data = '{"error":{"root_cause":[{"type":"version_conflict_engine_exception","reason":"[2]: version conflict, current version ... provided [0]","index":"users-user-v3.0.0-1782199650","shard":"0","index_uuid":"b0TEblJKRCKUfg95lzrc9Q"},"status":409}' content_type = 'application/json' def _raise_error( self, status_code: int, raw_data: Union[str, bytes], content_type: Optional[str] = None, ) -> None: """Locate appropriate exception and raise it.""" error_message = raw_data additional_info = None try: content_type = ( "text/plain" if content_type is None else content_type.split(";")[0].strip() ) if raw_data and content_type == "application/json": additional_info = json.loads(raw_data) error_message = additional_info.get("error", error_message) if isinstance(error_message, dict) and "type" in error_message: error_message = error_message["type"] except (ValueError, TypeError) as err: logger.warning("Undecodable raw error response from server: %s", err) > raise HTTP_EXCEPTIONS.get(status_code, TransportError)( status_code, error_message, additional_info ) E opensearchpy.exceptions.ConflictError: ConflictError(409, 'version_conflict_engine_exception', '[2]: version conflict, current version [1] is higher than the one provided [0]') venv/lib/python3.14/site-packages/opensearchpy/connection/base.py:315: ConflictError ------------------------------ Captured log call ------------------------------- WARNING opensearch:base.py:280 PUT http://localhost:9200/users-user-v3.0.0/_doc/2?refresh=true&version=0&version_type=external_gte [status:409 request:0.005s] _________________________ test_user_groups_bulk_remove _________________________ client = > headers = {'accept': 'application/json', 'content-type': 'application/json'} user_moderator = user_pub = group = , group2 = def test_user_groups_bulk_remove( client, headers, user_moderator, user_pub, group, group2 ): """Bulk remove roles via a single request.""" client = user_moderator.login(client) > client.put( f"/users/{user_pub.id}/groups", json={"groups": ["it-dep", "hr-dep"]}, headers=headers, ) tests/resources/test_resources_users.py:321: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ venv/lib/python3.14/site-packages/werkzeug/test.py:1172: in put return self.open(*args, **kw) ^^^^^^^^^^^^^^^^^^^^^^ venv/lib/python3.14/site-packages/flask/testing.py:235: in open response = super().open( venv/lib/python3.14/site-packages/werkzeug/test.py:1116: in open response_parts = self.run_wsgi_app(request.environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ venv/lib/python3.14/site-packages/werkzeug/test.py:988: in run_wsgi_app rv = run_wsgi_app(self.application, environ, buffered=buffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ venv/lib/python3.14/site-packages/werkzeug/test.py:1264: in run_wsgi_app app_rv = app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ venv/lib/python3.14/site-packages/flask/app.py:1536: in __call__ return self.wsgi_app(environ, start_response) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ venv/lib/python3.14/site-packages/flask/app.py:1514: in wsgi_app response = self.handle_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^ venv/lib/python3.14/site-packages/flask/app.py:1511: in wsgi_app response = self.full_dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ venv/lib/python3.14/site-packages/flask/app.py:919: in full_dispatch_request rv = self.handle_user_exception(e) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ venv/lib/python3.14/site-packages/flask/app.py:917: in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ venv/lib/python3.14/site-packages/flask/app.py:902: in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ venv/lib/python3.14/site-packages/flask_resources/resources.py:65: in view return view_meth() ^^^^^^^^^^^ venv/lib/python3.14/site-packages/flask_resources/content_negotiation.py:116: in inner_content_negotiation return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ venv/lib/python3.14/site-packages/flask_resources/parsers/decorators.py:51: in inner return f(self, *args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^ venv/lib/python3.14/site-packages/flask_resources/parsers/decorators.py:90: in inner return f(self, *args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^ invenio_users_resources/resources/users/resource.py:160: in set_groups return self._set_groups_response() ^^^^^^^^^^^^^^^^^^^^^^^^^^^ invenio_users_resources/resources/users/resource.py:166: in _set_groups_response data = self.service.set_groups( venv/lib/python3.14/site-packages/invenio_db/uow.py:248: in inner uow.commit() venv/lib/python3.14/site-packages/invenio_db/uow.py:192: in commit op.on_commit(self) venv/lib/python3.14/site-packages/invenio_records_resources/services/uow.py:137: in on_commit self._indexer.index(self._record, arguments=arguments) venv/lib/python3.14/site-packages/invenio_indexer/api.py:176: in index return self.client.index( venv/lib/python3.14/site-packages/opensearchpy/client/utils.py:176: in _wrapped return func(*args, params=params, headers=headers, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ venv/lib/python3.14/site-packages/opensearchpy/client/__init__.py:491: in index return self.transport.perform_request( venv/lib/python3.14/site-packages/opensearchpy/transport.py:457: in perform_request raise e venv/lib/python3.14/site-packages/opensearchpy/transport.py:418: in perform_request status, headers_response, data = connection.perform_request( venv/lib/python3.14/site-packages/opensearchpy/connection/http_urllib3.py:308: in perform_request self._raise_error( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = , status_code = 409 raw_data = '{"error":{"root_cause":[{"type":"version_conflict_engine_exception","reason":"[2]: version conflict, current version ... provided [0]","index":"users-user-v3.0.0-1782199650","shard":"0","index_uuid":"b0TEblJKRCKUfg95lzrc9Q"},"status":409}' content_type = 'application/json' def _raise_error( self, status_code: int, raw_data: Union[str, bytes], content_type: Optional[str] = None, ) -> None: """Locate appropriate exception and raise it.""" error_message = raw_data additional_info = None try: content_type = ( "text/plain" if content_type is None else content_type.split(";")[0].strip() ) if raw_data and content_type == "application/json": additional_info = json.loads(raw_data) error_message = additional_info.get("error", error_message) if isinstance(error_message, dict) and "type" in error_message: error_message = error_message["type"] except (ValueError, TypeError) as err: logger.warning("Undecodable raw error response from server: %s", err) > raise HTTP_EXCEPTIONS.get(status_code, TransportError)( status_code, error_message, additional_info ) E opensearchpy.exceptions.ConflictError: ConflictError(409, 'version_conflict_engine_exception', '[2]: version conflict, current version [1] is higher than the one provided [0]') venv/lib/python3.14/site-packages/opensearchpy/connection/base.py:315: ConflictError ------------------------------ Captured log call ------------------------------- WARNING opensearch:base.py:280 PUT http://localhost:9200/users-user-v3.0.0/_doc/2?refresh=true&version=0&version_type=external_gte [status:409 request:0.004s] _________________ test_group_mutation_advances_search_revision _________________ user_service = user_moderator = user_pub = group = def test_group_mutation_advances_search_revision( user_service, user_moderator, user_pub, group ): """Role-only mutations advance the revision used for search indexing.""" before_revision_id = user_service.record_cls.get_record(user_pub.id).revision_id user_service.add_group(user_moderator.identity, user_pub.id, "it-dep") after_revision_id = user_service.record_cls.get_record(user_pub.id).revision_id > assert after_revision_id > before_revision_id E assert 0 > 0 tests/services/users/test_service_users.py:594: AssertionError ____________________ test_set_groups_protected_role_allowed ____________________ app = user_service = user_moderator = user_pub = user_res = group = def test_set_groups_protected_role_allowed( app, user_service, user_moderator, user_pub, user_res, group ): """Protected roles can be managed through user-role assignment endpoints.""" user_service.set_groups(user_moderator.identity, user_pub.id, ["it-dep"]) previous = app.config.get("USERS_RESOURCES_PROTECTED_GROUP_NAMES", []) app.config["USERS_RESOURCES_PROTECTED_GROUP_NAMES"] = ["it-dep"] try: result_remove = user_service.set_groups( user_moderator.identity, user_pub.id, [] ) assert result_remove["removed"] == ["it-dep"] > result_add = user_service.set_groups( user_moderator.identity, user_res.id, ["it-dep"] ) tests/services/users/test_service_users.py:712: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ venv/lib/python3.14/site-packages/invenio_db/uow.py:248: in inner uow.commit() venv/lib/python3.14/site-packages/invenio_db/uow.py:192: in commit op.on_commit(self) venv/lib/python3.14/site-packages/invenio_records_resources/services/uow.py:137: in on_commit self._indexer.index(self._record, arguments=arguments) venv/lib/python3.14/site-packages/invenio_indexer/api.py:176: in index return self.client.index( venv/lib/python3.14/site-packages/opensearchpy/client/utils.py:176: in _wrapped return func(*args, params=params, headers=headers, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ venv/lib/python3.14/site-packages/opensearchpy/client/__init__.py:491: in index return self.transport.perform_request( venv/lib/python3.14/site-packages/opensearchpy/transport.py:457: in perform_request raise e venv/lib/python3.14/site-packages/opensearchpy/transport.py:418: in perform_request status, headers_response, data = connection.perform_request( venv/lib/python3.14/site-packages/opensearchpy/connection/http_urllib3.py:308: in perform_request self._raise_error( _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = , status_code = 409 raw_data = '{"error":{"root_cause":[{"type":"version_conflict_engine_exception","reason":"[3]: version conflict, current version ... provided [0]","index":"users-user-v3.0.0-1782199666","shard":"0","index_uuid":"B-zYKjpSRmijHZzFf5KoCQ"},"status":409}' content_type = 'application/json' def _raise_error( self, status_code: int, raw_data: Union[str, bytes], content_type: Optional[str] = None, ) -> None: """Locate appropriate exception and raise it.""" error_message = raw_data additional_info = None try: content_type = ( "text/plain" if content_type is None else content_type.split(";")[0].strip() ) if raw_data and content_type == "application/json": additional_info = json.loads(raw_data) error_message = additional_info.get("error", error_message) if isinstance(error_message, dict) and "type" in error_message: error_message = error_message["type"] except (ValueError, TypeError) as err: logger.warning("Undecodable raw error response from server: %s", err) > raise HTTP_EXCEPTIONS.get(status_code, TransportError)( status_code, error_message, additional_info ) E opensearchpy.exceptions.ConflictError: ConflictError(409, 'version_conflict_engine_exception', '[3]: version conflict, current version [1] is higher than the one provided [0]') venv/lib/python3.14/site-packages/opensearchpy/connection/base.py:315: ConflictError ------------------------------ Captured log call ------------------------------- WARNING opensearch:base.py:280 PUT http://localhost:9200/users-user-v3.0.0/_doc/3?refresh=true&version=0&version_type=external_gte [status:409 request:0.003s] =============================== warnings summary =============================== tests/resources/test_resources_groups.py::test_group_create_api tests/resources/test_resources_users.py::test_read_self_serialization tests/services/test_generators.py::test_group_not_managed_generator tests/services/test_service_groups.py::test_groups_sort tests/services/test_service_tasks_domains.py::test_import_domain_blocklist tests/services/users/test_service_users.py::test_search_restricted tests/services/users/test_user_moderation.py::test_moderation_callbacks_success tests/test_notifications.py::test_user_recipient_generator tests/test_user_roles_admin.py::test_read_includes_roles self.init_app(app) result = self._write_client.setex( ================================ tests coverage ================================ _______________ coverage: platform linux, python 3.14.2-final-0 ________________ Name Stmts Miss Cover Missing invenio_users_resources/__init__.py 2 0 100% invenio_users_resources/config.py 39 0 100% invenio_users_resources/entity_resolvers.py 86 48 44% 31-40, 44-50, 54, 58, 62-63, 67-91, 103-104, 108, 112, 116, 120, 129-133, 137-142, 146-147, 157, 170-171, 175, 179, 183, 187 invenio_users_resources/ext.py 64 5 92% 111-114, 122 invenio_users_resources/forms.py 14 5 64% 25-27, 33-34 invenio_users_resources/models.py 10 4 60% 16, 20, 24, 34 invenio_users_resources/notifications/__init__.py 0 0 100% invenio_users_resources/notifications/filters.py 11 1 91% 18 invenio_users_resources/notifications/generators.py 37 15 59% 20, 42, 46-48, 56-57, 62-63, 71-72, 75-80 invenio_users_resources/permissions.py 3 0 100% invenio_users_resources/proxies.py 12 0 100% invenio_users_resources/records/__init__.py 2 0 100% invenio_users_resources/records/api.py 387 31 92% 88, 92, 101, 107, 146, 155, 157, 260-264, 285-286, 295, 302, 309, 316, 329-330, 334-335, 376, 447, 508, 545-553, 575, 589 invenio_users_resources/records/dumpers/__init__.py 2 0 100% invenio_users_resources/records/dumpers/email.py 15 0 100% invenio_users_resources/records/hooks.py 57 27 53% 18-25, 44-51, 54-61, 85, 90, 94, 100 invenio_users_resources/records/mappings/__init__.py 0 0 100% invenio_users_resources/records/mappings/os-v1/__init__.py 0 0 100% invenio_users_resources/records/mappings/os-v2/__init__.py 0 0 100% invenio_users_resources/records/mappings/v7/__init__.py 0 0 100% invenio_users_resources/records/models.py 98 6 94% 50, 81, 86, 179-181 invenio_users_resources/records/systemfields/__init__.py 76 0 100% invenio_users_resources/resources/__init__.py 4 0 100% invenio_users_resources/resources/domains/__init__.py 3 0 100% invenio_users_resources/resources/domains/config.py 11 0 100% invenio_users_resources/resources/domains/resource.py 6 0 100% invenio_users_resources/resources/groups/__init__.py 3 0 100% invenio_users_resources/resources/groups/config.py 24 0 100% invenio_users_resources/resources/groups/errors.py 8 0 100% invenio_users_resources/resources/groups/resource.py 39 1 97% 80 invenio_users_resources/resources/users/__init__.py 3 0 100% invenio_users_resources/resources/users/config.py 25 0 100% invenio_users_resources/resources/users/errors.py 4 0 100% invenio_users_resources/resources/users/resource.py 106 17 84% 47, 80, 87-92, 147-154, 171, 177-184, 212-216, 230-234 invenio_users_resources/services/__init__.py 4 0 100% invenio_users_resources/services/common.py 13 0 100% invenio_users_resources/services/domains/__init__.py 3 0 100% invenio_users_resources/services/domains/components.py 27 6 78% 45-54 invenio_users_resources/services/domains/config.py 27 0 100% invenio_users_resources/services/domains/facets.py 7 0 100% invenio_users_resources/services/domains/service.py 8 0 100% invenio_users_resources/services/domains/tasks.py 61 15 75% 20-25, 31-36, 66-68 invenio_users_resources/services/generators.py 149 13 91% 45, 62-67, 94, 103, 190, 205, 230, 281, 306 invenio_users_resources/services/groups/__init__.py 3 0 100% invenio_users_resources/services/groups/config.py 32 0 100% invenio_users_resources/services/groups/facets.py 3 0 100% invenio_users_resources/services/groups/results.py 57 4 93% 34, 54, 72, 78 invenio_users_resources/services/groups/service.py 74 12 84% 40-41, 46-47, 74-75, 99-100, 156, 162-166 invenio_users_resources/services/groups/tasks.py 21 8 62% 22-23, 29-34 invenio_users_resources/services/params.py 9 0 100% invenio_users_resources/services/permissions.py 37 0 100% invenio_users_resources/services/results.py 29 0 100% invenio_users_resources/services/schemas.py 158 10 94% 235-238, 246, 249, 252, 295, 307, 317 invenio_users_resources/services/users/__init__.py 3 0 100% invenio_users_resources/services/users/config.py 54 4 93% 70-73 invenio_users_resources/services/users/facets.py 8 0 100% invenio_users_resources/services/users/lock.py 11 0 100% invenio_users_resources/services/users/results.py 93 9 90% 15, 21-23, 33, 83, 87, 124, 130 invenio_users_resources/services/users/search_params.py 23 8 65% 32-50 invenio_users_resources/services/users/service.py 226 14 94% 142, 148-149, 158, 164-166, 178, 355, 384, 408, 431, 443, 457 invenio_users_resources/services/users/tasks.py 54 10 81% 51-52, 58-63, 103-108 invenio_users_resources/views.py 11 0 100% TOTAL 2356 273 88% =========================== short test summary info ============================ FAILED tests/resources/test_resources_users.py::test_user_groups_endpoints - opensearchpy.exceptions.ConflictError: ConflictError(409, 'version_conflict_engine_exception', '[2]: version conflict, current version [1] is higher than the one provided [0]') FAILED tests/resources/test_resources_users.py::test_user_groups_bulk_set - opensearchpy.exceptions.ConflictError: ConflictError(409, 'version_conflict_engine_exception', '[2]: version conflict, current version [1] is higher than the one provided [0]') FAILED tests/resources/test_resources_users.py::test_user_groups_bulk_add - opensearchpy.exceptions.ConflictError: ConflictError(409, 'version_conflict_engine_exception', '[2]: version conflict, current version [1] is higher than the one provided [0]') FAILED tests/resources/test_resources_users.py::test_user_groups_bulk_remove - opensearchpy.exceptions.ConflictError: ConflictError(409, 'version_conflict_engine_exception', '[2]: version conflict, current version [1] is higher than the one provided [0]') FAILED tests/services/users/test_service_users.py::test_group_mutation_advances_search_revision - assert 0 > 0 FAILED tests/services/users/test_service_users.py::test_set_groups_protected_role_allowed - opensearchpy.exceptions.ConflictError: ConflictError(409, 'version_conflict_engine_exception', '[3]: version conflict, current version [1] is higher than the one provided [0]') ============ 6 failed, 382 passed, 25 warnings in 67.50s (0:01:07) ============= Container docker_services_cli-redis-1 Stopping Container docker_services_cli-postgresql-1 Stopping Container docker_services_cli-opensearch-1 Stopping Container docker_services_cli-rabbitmq-1 Stopping Container docker_services_cli-redis-1 Stopped Container docker_services_cli-redis-1 Removing Container docker_services_cli-redis-1 Removed Container docker_services_cli-postgresql-1 Stopped Container docker_services_cli-postgresql-1 Removing Container docker_services_cli-postgresql-1 Removed Container docker_services_cli-opensearch-1 Stopped Container docker_services_cli-opensearch-1 Removing Container docker_services_cli-opensearch-1 Removed Container docker_services_cli-rabbitmq-1 Stopped Container docker_services_cli-rabbitmq-1 Removing Container docker_services_cli-rabbitmq-1 Removed Network docker_services_cli_default Removing Network docker_services_cli_default Removed