import pytest import os import io import json from werkzeug.datastructures import FileStorage class TestDocuments: """Test document management functionality.""" def setup_project(self, logged_in_client, app): """Helper to create a test project.""" # Create a project logged_in_client.post( "/projects/create", data={ "codigo": "TESTDOC", "descripcion": "Proyecto para documentos", "cliente": "Cliente Test", "esquema": "TEST001", "destinacion": "Pruebas", "notas": "Proyecto para pruebas de documentos", }, follow_redirects=True, ) # Find the project ID with app.app_context(): projects_dir = os.path.join(app.config["STORAGE_PATH"], "projects") project_dirs = [d for d in os.listdir(projects_dir) if "TESTDOC" in d] assert len(project_dirs) > 0 project_dir = project_dirs[0] return project_dir.split("_")[0].replace("@", "") def test_upload_document(self, logged_in_client, app): """Test uploading a document to a project.""" # Create a project and get its ID project_id = self.setup_project(logged_in_client, app) # Create a test file test_file = FileStorage( stream=io.BytesIO(b"This is a test document content."), filename="test_document.txt", content_type="text/plain", ) # Upload the document response = logged_in_client.post( f"/projects/{project_id}/documents/upload", data={ "tipo_doc": "Documento de Prueba", # Match schema type from TEST001 "descripcion": "Documento de prueba para tests", "file": test_file, }, content_type="multipart/form-data", follow_redirects=True, ) assert response.status_code == 200 # Verify document was created with app.app_context(): project_path = None projects_dir = os.path.join(app.config["STORAGE_PATH"], "projects") for dir_name in os.listdir(projects_dir): if dir_name.startswith(f"@{project_id}_"): project_path = os.path.join(projects_dir, dir_name) break assert project_path is not None # Check for documents directory with content docs_path = os.path.join(project_path, "documents") assert os.path.exists(docs_path) # Should have at least one document folder assert len(os.listdir(docs_path)) > 0 def test_document_versions(self, logged_in_client, app): """Test document versioning functionality.""" # Create a project and upload first version project_id = self.setup_project(logged_in_client, app) # Upload first version test_file1 = FileStorage( stream=io.BytesIO(b"Document content version 1"), filename="test_versioning.txt", content_type="text/plain", ) logged_in_client.post( f"/projects/{project_id}/documents/upload", data={ "tipo_doc": "Documento de Prueba", "descripcion": "Documento para pruebas de versiones", "file": test_file1, }, content_type="multipart/form-data", follow_redirects=True, ) # Find the document ID doc_id = None with app.app_context(): projects_dir = os.path.join(app.config["STORAGE_PATH"], "projects") for dir_name in os.listdir(projects_dir): if dir_name.startswith(f"@{project_id}_"): project_path = os.path.join(projects_dir, dir_name) docs_path = os.path.join(project_path, "documents") # Get first document directory doc_dirs = os.listdir(docs_path) if doc_dirs: doc_id = doc_dirs[0].split("_")[0].replace("@", "") break assert doc_id is not None # Upload second version of the same document test_file2 = FileStorage( stream=io.BytesIO(b"Document content version 2 - UPDATED"), filename="test_versioning_v2.txt", content_type="text/plain", ) response = logged_in_client.post( f"/projects/{project_id}/documents/{doc_id}/upload", data={"descripcion": "Segunda versiĆ³n del documento", "file": test_file2}, content_type="multipart/form-data", follow_redirects=True, ) assert response.status_code == 200 # Check for multiple versions in metadata with app.app_context(): projects_dir = os.path.join(app.config["STORAGE_PATH"], "projects") for dir_name in os.listdir(projects_dir): if dir_name.startswith(f"@{project_id}_"): project_path = os.path.join(projects_dir, dir_name) docs_path = os.path.join(project_path, "documents") # Find document directory for doc_dir in os.listdir(docs_path): if doc_dir.startswith(f"@{doc_id}_"): doc_path = os.path.join(docs_path, doc_dir) meta_path = os.path.join(doc_path, "meta.json") # Check metadata for versions if os.path.exists(meta_path): with open(meta_path, "r") as f: metadata = json.load(f) assert "versions" in metadata assert len(metadata["versions"]) >= 2