Arch/tests/test_integration.py

163 lines
6.5 KiB
Python
Raw Normal View History

2025-03-03 17:50:11 -03:00
import pytest
import os
import io
from werkzeug.datastructures import FileStorage
class TestIntegration:
"""Test integrations between different components."""
def test_complete_workflow(self, logged_in_client, app):
"""Test a complete workflow from project creation to document download."""
# 1. Create a new project
logged_in_client.post('/projects/create', data={
'codigo': 'WORKFLOW',
'descripcion': 'Proyecto de flujo completo',
'cliente': 'Cliente Integración',
'esquema': 'TEST001',
'destinacion': 'Pruebas de integración',
'notas': 'Notas de proyecto de prueba'
}, follow_redirects=True)
# 2. Find the project ID
project_id = None
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 'WORKFLOW' in d]
assert len(project_dirs) > 0
project_dir = project_dirs[0]
project_id = project_dir.split('_')[0].replace('@', '')
assert project_id is not None
# 3. Upload a document to the project
test_file = FileStorage(
stream=io.BytesIO(b'Content for integration test document'),
filename='integration_doc.txt',
content_type='text/plain',
)
response = logged_in_client.post(
f'/projects/{project_id}/documents/upload',
data={
'tipo_doc': 'Documento de Prueba',
'descripcion': 'Documento de flujo de integración',
'file': test_file
},
content_type='multipart/form-data',
follow_redirects=True
)
assert response.status_code == 200
# 4. 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')
doc_dirs = os.listdir(docs_path)
if doc_dirs:
doc_id = doc_dirs[0].split('_')[0].replace('@', '')
break
assert doc_id is not None
# 5. View document details
response = logged_in_client.get(f'/projects/{project_id}/documents/{doc_id}')
assert response.status_code == 200
assert b'Documento de flujo de integraci' in response.data
# 6. Upload a new version of the document
test_file2 = FileStorage(
stream=io.BytesIO(b'Updated content for version 2'),
filename='integration_doc_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 de integración',
'file': test_file2
},
content_type='multipart/form-data',
follow_redirects=True
)
assert response.status_code == 200
# 7. Download the document
response = logged_in_client.get(f'/projects/{project_id}/documents/{doc_id}/download/latest')
assert response.status_code == 200
assert b'Updated content for version 2' in response.data
# 8. Download a specific version (the first one)
response = logged_in_client.get(f'/projects/{project_id}/documents/{doc_id}/download/1')
assert response.status_code == 200
assert b'Content for integration test document' in response.data
def test_schema_project_document_integration(self, logged_in_client, app):
"""Test integration between schemas, projects and documents."""
# 1. Create a custom schema
logged_in_client.post('/schemas/create', data={
'codigo': 'CUSTOM',
'descripcion': 'Esquema personalizado para integración',
'documentos-0-tipo': 'pdf',
'documentos-0-nombre': 'Informe Principal',
'documentos-0-nivel_ver': 0,
'documentos-0-nivel_editar': 5000,
'documentos-1-tipo': 'txt',
'documentos-1-nombre': 'Notas Adicionales',
'documentos-1-nivel_ver': 0,
'documentos-1-nivel_editar': 1000
}, follow_redirects=True)
# 2. Create a project with the custom schema
logged_in_client.post('/projects/create', data={
'codigo': 'PROJ_SCHEMA',
'descripcion': 'Proyecto con esquema personalizado',
'cliente': 'Cliente Test',
'esquema': 'CUSTOM',
'destinacion': 'Pruebas',
'notas': 'Proyecto para probar integración de esquemas'
}, follow_redirects=True)
# 3. Find the project ID
project_id = None
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 'PROJ_SCHEMA' in d]
assert len(project_dirs) > 0
project_dir = project_dirs[0]
project_id = project_dir.split('_')[0].replace('@', '')
# 4. Verify project uses the custom schema
response = logged_in_client.get(f'/projects/{project_id}')
assert response.status_code == 200
assert b'CUSTOM' in response.data
assert b'Informe Principal' in response.data
assert b'Notas Adicionales' in response.data
# 5. Upload a document of the specified type
test_file = FileStorage(
stream=io.BytesIO(b'Notes content for schema integration'),
filename='notes.txt',
content_type='text/plain',
)
response = logged_in_client.post(
f'/projects/{project_id}/documents/upload',
data={
'tipo_doc': 'Notas Adicionales', # This should match schema document type
'descripcion': 'Notas para prueba de esquema',
'file': test_file
},
content_type='multipart/form-data',
follow_redirects=True
)
assert response.status_code == 200