180 lines
6.6 KiB
Python
180 lines
6.6 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
|