diff --git a/rhodecode/tests/vcs_operations/conftest.py b/rhodecode/tests/vcs_operations/conftest.py index 25dd31d5..135a2b6b 100644 --- a/rhodecode/tests/vcs_operations/conftest.py +++ b/rhodecode/tests/vcs_operations/conftest.py @@ -318,16 +318,14 @@ def branch_permission_setter(request): branch_permission_setter(repo_name, username, pattern='*', permission='branch.push') """ + from rhodecode.model.permission import PermissionModel - rule_id = None - write_perm_id = None - write_perm = None - rule = None + # Track ALL created permissions for proper cleanup + # Critical for parameterized tests that call this fixture multiple times + created_rules = [] + created_write_perms = [] def _branch_permissions_setter(repo_name, username, pattern="*", permission="branch.push_force"): - global rule_id, write_perm_id - global rule, write_perm - repo = Repository.get_by_repo_name(repo_name) repo_id = repo.repo_id @@ -344,6 +342,7 @@ def branch_permission_setter(request): .first() ) + write_perm = None if not perm: # such user isn't defined in Permissions for repository # we now on-the-fly add new permission @@ -356,6 +355,7 @@ def branch_permission_setter(request): Session().flush() perm = write_perm + created_write_perms.append(write_perm) rule = UserToRepoBranchPermission() rule.rule_to_perm_id = perm.repo_to_perm_id @@ -366,15 +366,25 @@ def branch_permission_setter(request): Session().add(rule) Session().commit() + created_rules.append(rule) + + # Flush permission caches so the change is immediately visible + # Critical for tests with PostgreSQL where permission checks happen + # in separate VCSServer process that needs fresh permission data + PermissionModel().trigger_permission_flush([user_id]) + return rule @request.addfinalizer def cleanup(): - if rule: + # Clean up ALL created rules and permissions, not just the last ones + # Critical for PostgreSQL where orphaned rows cause duplicate results + for rule in created_rules: Session().delete(rule) - Session().commit() - if write_perm: + Session().commit() + + for write_perm in created_write_perms: Session().delete(write_perm) - Session().commit() + Session().commit() return _branch_permissions_setter