Arch/tests/test_documents.py

155 lines
6.0 KiB
Python
Raw Normal View History

2025-03-03 17:50:11 -03:00
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