163 lines
6.5 KiB
Python
163 lines
6.5 KiB
Python
|
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
|