Readur/migrate_documents_tests.py

166 lines
5.9 KiB
Python

#!/usr/bin/env python3
"""
Script to migrate remaining tests in documents_tests.rs to use the new TestContext pattern.
"""
import re
import sys
def migrate_test_file(file_path):
"""Migrate the documents_tests.rs file to use new test patterns."""
with open(file_path, 'r') as f:
content = f.read()
# Store the original content for comparison
original_content = content
# 1. Remove #[ignore = "Requires PostgreSQL database"] annotations
content = re.sub(r' #\[ignore = "Requires PostgreSQL database"\]\n', '', content)
# 2. Remove old database pool creation lines
content = re.sub(r' let pool = create_test_db_pool\(\)\.await;\n', '', content)
# 3. Remove old Database struct creation lines
content = re.sub(r' let documents_db = Database \{ pool: pool\.clone\(\) \};\n', '', content)
# 4. Replace old user creation with new pattern
# Handle both User and Admin role patterns
content = re.sub(
r' let user = create_test_user\(&pool, UserRole::User\)\.await;',
' let ctx = TestContext::new().await;\n let auth_helper = TestAuthHelper::new(ctx.app.clone());\n let user = auth_helper.create_test_user().await;',
content
)
content = re.sub(
r' let admin = create_test_user\(&pool, UserRole::Admin\)\.await;',
' let admin = auth_helper.create_test_admin().await;',
content
)
# Handle other variations of user creation
content = re.sub(
r' let user1 = create_test_user\(&pool, UserRole::User\)\.await;',
' let ctx = TestContext::new().await;\n let auth_helper = TestAuthHelper::new(ctx.app.clone());\n let user1 = auth_helper.create_test_user().await;',
content
)
content = re.sub(
r' let user2 = create_test_user\(&pool, UserRole::User\)\.await;',
' let user2 = auth_helper.create_test_user().await;',
content
)
content = re.sub(
r' let tenant1_user1 = create_test_user\(&pool, UserRole::User\)\.await;',
' let ctx = TestContext::new().await;\n let auth_helper = TestAuthHelper::new(ctx.app.clone());\n let tenant1_user1 = auth_helper.create_test_user().await;',
content
)
content = re.sub(
r' let tenant1_user2 = create_test_user\(&pool, UserRole::User\)\.await;',
' let tenant1_user2 = auth_helper.create_test_user().await;',
content
)
content = re.sub(
r' let tenant2_user1 = create_test_user\(&pool, UserRole::User\)\.await;',
' let tenant2_user1 = auth_helper.create_test_user().await;',
content
)
content = re.sub(
r' let tenant2_user2 = create_test_user\(&pool, UserRole::User\)\.await;',
' let tenant2_user2 = auth_helper.create_test_user().await;',
content
)
# 5. Replace document creation and insertion pattern
content = re.sub(
r' let ([a-zA-Z0-9_]+) = create_and_insert_test_document\(&pool, ([a-zA-Z0-9_.()]+)\)\.await;',
r' let \1_doc = create_test_document(\2);\n let \1 = ctx.state.db.create_document(\1_doc).await.expect("Failed to create document");',
content
)
# 6. Replace documents_db. with ctx.state.db.
content = re.sub(r'documents_db\.', 'ctx.state.db.', content)
# 7. Replace user.id with user.id() for TestUser instances
# This is tricky because we need to be careful about which instances are TestUser vs regular User
# We'll handle this pattern by pattern based on context
# For delete_document calls that use user.id, user.role pattern
content = re.sub(
r'\.delete_document\(([^,]+), ([a-zA-Z0-9_]+)\.id, ([a-zA-Z0-9_]+)\.role\)',
r'.delete_document(\1, \2.id(), \3.role)',
content
)
# For bulk_delete_documents calls
content = re.sub(
r'\.bulk_delete_documents\(([^,]+), ([a-zA-Z0-9_]+)\.id, ([a-zA-Z0-9_]+)\.role\)',
r'.bulk_delete_documents(\1, \2.id(), \3.role)',
content
)
# For get_document_by_id calls
content = re.sub(
r'\.get_document_by_id\(([^,]+), ([a-zA-Z0-9_]+)\.id, ([a-zA-Z0-9_]+)\.role\)',
r'.get_document_by_id(\1, \2.id(), \3.role)',
content
)
# For create_test_document calls
content = re.sub(
r'create_test_document\(([a-zA-Z0-9_]+)\.id\)',
r'create_test_document(\1.id())',
content
)
# For bind calls in SQL
content = re.sub(
r'\.bind\(([a-zA-Z0-9_]+)\.id\)',
r'.bind(\1.id())',
content
)
# For let user_id assignments
content = re.sub(
r' let user_id = ([a-zA-Z0-9_]+)\.id;',
r' let user_id = \1.id();',
content
)
# Add missing imports if TestContext/TestAuthHelper aren't already imported
# Check if the imports are present
if 'use crate::test_utils::{TestContext, TestAuthHelper};' not in content:
# Find the existing test_utils import and update it
content = re.sub(
r'use crate::test_utils::TestContext;',
'use crate::test_utils::{TestContext, TestAuthHelper};',
content
)
# Check if we made any changes
if content != original_content:
return content
else:
return None
def main():
file_path = '/root/repos/readur/src/tests/documents_tests.rs'
print("Starting migration of documents_tests.rs...")
migrated_content = migrate_test_file(file_path)
if migrated_content:
# Write the migrated content back
with open(file_path, 'w') as f:
f.write(migrated_content)
print("Migration completed successfully!")
else:
print("No changes needed - file is already migrated or no patterns found.")
if __name__ == "__main__":
main()