206 lines
6.1 KiB
Python
206 lines
6.1 KiB
Python
import pytest
|
|
import os
|
|
import json
|
|
import shutil
|
|
import time
|
|
import tempfile
|
|
from app import create_app
|
|
|
|
|
|
def init_test_environment(storage_path):
|
|
"""Initialize the test environment with required directories."""
|
|
if os.path.exists(storage_path):
|
|
try:
|
|
shutil.rmtree(storage_path)
|
|
except PermissionError:
|
|
# Try to handle Windows file locking issues
|
|
print(f"Warning: Could not remove {storage_path} directory, retrying...")
|
|
time.sleep(1)
|
|
try:
|
|
shutil.rmtree(storage_path)
|
|
except Exception as e:
|
|
print(f"Failed to remove directory: {e}")
|
|
|
|
# Create main storage directory
|
|
os.makedirs(storage_path, exist_ok=True)
|
|
|
|
# Create required subdirectories
|
|
for dir_name in ["users", "schemas", "filetypes", "projects", "logs"]:
|
|
os.makedirs(os.path.join(storage_path, dir_name), exist_ok=True)
|
|
|
|
# Initialize test data
|
|
initialize_test_data(storage_path)
|
|
|
|
|
|
@pytest.fixture
|
|
def app():
|
|
# Use a unique temporary directory for each test session
|
|
storage_path = tempfile.mkdtemp(prefix="arch_test_")
|
|
|
|
# Set up the test environment
|
|
init_test_environment(storage_path)
|
|
|
|
# Create app with test configuration
|
|
app = create_app("testing")
|
|
|
|
# Update the app's config with our test settings
|
|
app.config.update(
|
|
{
|
|
"TESTING": True,
|
|
"STORAGE_PATH": storage_path,
|
|
"WTF_CSRF_ENABLED": False, # Disable CSRF protection for testing
|
|
"SERVER_NAME": "localhost.localdomain", # Set server name to ensure correct URLs
|
|
}
|
|
)
|
|
|
|
# Create app context
|
|
with app.app_context():
|
|
yield app
|
|
|
|
# Clean up after tests - with retry mechanism for Windows
|
|
max_retries = 3
|
|
retry_delay = 1
|
|
|
|
for attempt in range(max_retries):
|
|
try:
|
|
if os.path.exists(storage_path):
|
|
shutil.rmtree(storage_path)
|
|
break
|
|
except PermissionError:
|
|
if attempt < max_retries - 1:
|
|
print(
|
|
f"Cleanup attempt {attempt+1} failed, retrying in {retry_delay}s..."
|
|
)
|
|
time.sleep(retry_delay)
|
|
else:
|
|
print(f"Warning: Could not clean up {storage_path}")
|
|
|
|
|
|
@pytest.fixture
|
|
def client(app):
|
|
"""Create a test client for the application."""
|
|
with app.test_client() as client:
|
|
# Enable cookies and sessions for the test client
|
|
client.testing = True
|
|
yield client
|
|
|
|
|
|
@pytest.fixture
|
|
def auth(client):
|
|
"""Helper for authentication tests."""
|
|
|
|
class AuthActions:
|
|
def login(self, username="admin", password="admin123"):
|
|
# Use session for better cookie handling
|
|
with client.session_transaction() as session:
|
|
# Pre-clear any existing session data
|
|
session.clear()
|
|
|
|
response = client.post(
|
|
"/auth/login",
|
|
data={"username": username, "password": password},
|
|
follow_redirects=True,
|
|
)
|
|
return response
|
|
|
|
def logout(self):
|
|
return client.get("/auth/logout", follow_redirects=True)
|
|
|
|
return AuthActions()
|
|
|
|
|
|
@pytest.fixture
|
|
def logged_in_client(client, auth):
|
|
"""Client that's already logged in as admin."""
|
|
response = auth.login()
|
|
|
|
# Verify login was successful
|
|
assert response.status_code == 200
|
|
|
|
# Check for expected content in response to confirm logged in state
|
|
assert (
|
|
b"Cerrar" in response.data
|
|
or b"Logout" in response.data
|
|
or b"Panel" in response.data
|
|
)
|
|
|
|
return client
|
|
|
|
|
|
def initialize_test_data(storage_path):
|
|
"""Initialize test data files."""
|
|
# Create test users
|
|
users_data = {
|
|
"admin": {
|
|
"nombre": "Administrador",
|
|
"username": "admin",
|
|
"email": "admin@ejemplo.com",
|
|
"password_hash": "$2b$12$Q5Nz3QSF0FP.mKAxPmWXmurKn1oor4Cl1KbYZAKsFbGcEWWyPHou6", # admin123
|
|
"nivel": 9999,
|
|
"idioma": "es",
|
|
"fecha_caducidad": None,
|
|
"empresa": "ARCH",
|
|
"estado": "activo",
|
|
},
|
|
"user1": {
|
|
"nombre": "Usuario Normal",
|
|
"username": "user1",
|
|
"email": "user1@ejemplo.com",
|
|
"password_hash": "$2b$12$Q5Nz3QSF0FP.mKAxPmWXmurKn1oor4Cl1KbYZAKsFbGcEWWyPHou6", # admin123
|
|
"nivel": 1000,
|
|
"idioma": "es",
|
|
"fecha_caducidad": None,
|
|
"empresa": "ARCH",
|
|
"estado": "activo",
|
|
},
|
|
}
|
|
|
|
with open(f"{storage_path}/users/users.json", "w", encoding="utf-8") as f:
|
|
json.dump(users_data, f, ensure_ascii=False, indent=2)
|
|
|
|
# Create test file types
|
|
filetypes_data = {
|
|
"pdf": {
|
|
"extension": "pdf",
|
|
"descripcion": "Documento PDF",
|
|
"mime_type": "application/pdf",
|
|
"tamano_maximo": 20971520,
|
|
},
|
|
"txt": {
|
|
"extension": "txt",
|
|
"descripcion": "Documento de texto",
|
|
"mime_type": "text/plain",
|
|
"tamano_maximo": 5242880,
|
|
},
|
|
}
|
|
|
|
with open(f"{storage_path}/filetypes/filetypes.json", "w", encoding="utf-8") as f:
|
|
json.dump(filetypes_data, f, ensure_ascii=False, indent=2)
|
|
|
|
# Create test schemas
|
|
schemas_data = {
|
|
"TEST001": {
|
|
"codigo": "TEST001",
|
|
"descripcion": "Esquema de prueba",
|
|
"fecha_creacion": "2023-10-01T10:00:00Z",
|
|
"creado_por": "admin",
|
|
"documentos": [
|
|
{
|
|
"tipo": "pdf",
|
|
"nombre": "Documento de Prueba",
|
|
"nivel_ver": 0,
|
|
"nivel_editar": 1000,
|
|
}
|
|
],
|
|
}
|
|
}
|
|
|
|
with open(f"{storage_path}/schemas/schema.json", "w", encoding="utf-8") as f:
|
|
json.dump(schemas_data, f, ensure_ascii=False, indent=2)
|
|
|
|
# Create indices file
|
|
indices_data = {"max_project_id": 0, "max_document_id": 0}
|
|
|
|
with open(f"{storage_path}/indices.json", "w", encoding="utf-8") as f:
|
|
json.dump(indices_data, f, ensure_ascii=False, indent=2)
|