| 
 | 1 | +import json  | 
 | 2 | +import logging  | 
 | 3 | +import os  | 
 | 4 | +from collections.abc import Iterator  | 
 | 5 | +from pathlib import Path  | 
 | 6 | +from typing import Literal  | 
 | 7 | + | 
 | 8 | +import pytest  | 
 | 9 | +import requests  | 
 | 10 | +import urllib3  | 
 | 11 | +from vectorize_client.api.ai_platform_connectors_api import AIPlatformConnectorsApi  | 
 | 12 | +from vectorize_client.api.destination_connectors_api import DestinationConnectorsApi  | 
 | 13 | +from vectorize_client.api.pipelines_api import PipelinesApi  | 
 | 14 | +from vectorize_client.api.source_connectors_api import SourceConnectorsApi  | 
 | 15 | +from vectorize_client.api.uploads_api import UploadsApi  | 
 | 16 | +from vectorize_client.api_client import ApiClient  | 
 | 17 | +from vectorize_client.configuration import Configuration  | 
 | 18 | +from vectorize_client.models.ai_platform_config_schema import AIPlatformConfigSchema  | 
 | 19 | +from vectorize_client.models.ai_platform_type_for_pipeline import (  | 
 | 20 | +    AIPlatformTypeForPipeline,  | 
 | 21 | +)  | 
 | 22 | +from vectorize_client.models.create_source_connector_request import (  | 
 | 23 | +    CreateSourceConnectorRequest,  | 
 | 24 | +)  | 
 | 25 | +from vectorize_client.models.destination_connector_type_for_pipeline import (  | 
 | 26 | +    DestinationConnectorTypeForPipeline,  | 
 | 27 | +)  | 
 | 28 | +from vectorize_client.models.file_upload import FileUpload  | 
 | 29 | +from vectorize_client.models.pipeline_ai_platform_connector_schema import (  | 
 | 30 | +    PipelineAIPlatformConnectorSchema,  | 
 | 31 | +)  | 
 | 32 | +from vectorize_client.models.pipeline_configuration_schema import (  | 
 | 33 | +    PipelineConfigurationSchema,  | 
 | 34 | +)  | 
 | 35 | +from vectorize_client.models.pipeline_destination_connector_schema import (  | 
 | 36 | +    PipelineDestinationConnectorSchema,  | 
 | 37 | +)  | 
 | 38 | +from vectorize_client.models.pipeline_source_connector_schema import (  | 
 | 39 | +    PipelineSourceConnectorSchema,  | 
 | 40 | +)  | 
 | 41 | +from vectorize_client.models.schedule_schema import ScheduleSchema  | 
 | 42 | +from vectorize_client.models.schedule_schema_type import ScheduleSchemaType  | 
 | 43 | +from vectorize_client.models.source_connector_type import SourceConnectorType  | 
 | 44 | +from vectorize_client.models.start_file_upload_to_connector_request import (  | 
 | 45 | +    StartFileUploadToConnectorRequest,  | 
 | 46 | +)  | 
 | 47 | + | 
 | 48 | +logger = logging.getLogger(__name__)  | 
 | 49 | + | 
 | 50 | + | 
 | 51 | +@pytest.fixture(scope="session")  | 
 | 52 | +def api_token() -> str:  | 
 | 53 | +    token = os.getenv("VECTORIZE_TOKEN")  | 
 | 54 | +    if not token:  | 
 | 55 | +        msg = "Please set the VECTORIZE_TOKEN environment variable"  | 
 | 56 | +        raise ValueError(msg)  | 
 | 57 | +    return token  | 
 | 58 | + | 
 | 59 | + | 
 | 60 | +@pytest.fixture(scope="session")  | 
 | 61 | +def org_id() -> str:  | 
 | 62 | +    org = os.getenv("VECTORIZE_ORG")  | 
 | 63 | +    if not org:  | 
 | 64 | +        msg = "Please set the VECTORIZE_ORG environment variable"  | 
 | 65 | +        raise ValueError(msg)  | 
 | 66 | +    return org  | 
 | 67 | + | 
 | 68 | + | 
 | 69 | +@pytest.fixture(scope="session")  | 
 | 70 | +def environment() -> Literal["prod", "dev", "local", "staging"]:  | 
 | 71 | +    env = os.getenv("VECTORIZE_ENV", "prod")  | 
 | 72 | +    if env not in {"prod", "dev", "local", "staging"}:  | 
 | 73 | +        msg = "Invalid VECTORIZE_ENV environment variable."  | 
 | 74 | +        raise ValueError(msg)  | 
 | 75 | +    return env  # type: ignore[return-value]  | 
 | 76 | + | 
 | 77 | + | 
 | 78 | +@pytest.fixture(scope="session")  | 
 | 79 | +def api_client(api_token: str, environment: str) -> Iterator[ApiClient]:  | 
 | 80 | +    header_name = None  | 
 | 81 | +    header_value = None  | 
 | 82 | +    if environment == "prod":  | 
 | 83 | +        host = "https://api.vectorize.io/v1"  | 
 | 84 | +    elif environment == "dev":  | 
 | 85 | +        host = "https://api-dev.vectorize.io/v1"  | 
 | 86 | +    elif environment == "local":  | 
 | 87 | +        host = "http://localhost:3000/api"  | 
 | 88 | +        header_name = "x-lambda-api-key"  | 
 | 89 | +        header_value = api_token  | 
 | 90 | +    else:  | 
 | 91 | +        host = "https://api-staging.vectorize.io/v1"  | 
 | 92 | + | 
 | 93 | +    with ApiClient(  | 
 | 94 | +        Configuration(host=host, access_token=api_token, debug=True),  | 
 | 95 | +        header_name,  | 
 | 96 | +        header_value,  | 
 | 97 | +    ) as api:  | 
 | 98 | +        yield api  | 
 | 99 | + | 
 | 100 | + | 
 | 101 | +@pytest.fixture(scope="session")  | 
 | 102 | +def pipeline_id(api_client: ApiClient, org_id: str) -> Iterator[str]:  | 
 | 103 | +    pipelines = PipelinesApi(api_client)  | 
 | 104 | + | 
 | 105 | +    connectors_api = SourceConnectorsApi(api_client)  | 
 | 106 | +    response = connectors_api.create_source_connector(  | 
 | 107 | +        org_id,  | 
 | 108 | +        CreateSourceConnectorRequest(FileUpload(name="from api", type="FILE_UPLOAD")),  | 
 | 109 | +    )  | 
 | 110 | +    source_connector_id = response.connector.id  | 
 | 111 | +    logger.info("Created source connector %s", source_connector_id)  | 
 | 112 | + | 
 | 113 | +    uploads_api = UploadsApi(api_client)  | 
 | 114 | +    upload_response = uploads_api.start_file_upload_to_connector(  | 
 | 115 | +        org_id,  | 
 | 116 | +        source_connector_id,  | 
 | 117 | +        StartFileUploadToConnectorRequest(  # type: ignore[call-arg]  | 
 | 118 | +            name="research.pdf",  | 
 | 119 | +            content_type="application/pdf",  | 
 | 120 | +            metadata=json.dumps({"created-from-api": True}),  | 
 | 121 | +        ),  | 
 | 122 | +    )  | 
 | 123 | + | 
 | 124 | +    urllib3.PoolManager()  | 
 | 125 | +    this_dir = Path(__file__).parent  | 
 | 126 | +    file_path = this_dir / "research.pdf"  | 
 | 127 | + | 
 | 128 | +    with file_path.open("rb") as f:  | 
 | 129 | +        http_response = requests.put(  | 
 | 130 | +            upload_response.upload_url,  | 
 | 131 | +            data=f,  | 
 | 132 | +            headers={  | 
 | 133 | +                "Content-Type": "application/pdf",  | 
 | 134 | +            },  | 
 | 135 | +            timeout=60,  | 
 | 136 | +        )  | 
 | 137 | +        http_response.raise_for_status()  | 
 | 138 | +        logger.info("Upload successful")  | 
 | 139 | + | 
 | 140 | +    ai_platforms = AIPlatformConnectorsApi(api_client).get_ai_platform_connectors(  | 
 | 141 | +        org_id  | 
 | 142 | +    )  | 
 | 143 | +    builtin_ai_platform = next(  | 
 | 144 | +        c.id for c in ai_platforms.ai_platform_connectors if c.type == "VECTORIZE"  | 
 | 145 | +    )  | 
 | 146 | +    logger.info("Using AI platform %s", builtin_ai_platform)  | 
 | 147 | + | 
 | 148 | +    vector_databases = DestinationConnectorsApi(api_client).get_destination_connectors(  | 
 | 149 | +        org_id  | 
 | 150 | +    )  | 
 | 151 | +    builtin_vector_db = next(  | 
 | 152 | +        c.id for c in vector_databases.destination_connectors if c.type == "VECTORIZE"  | 
 | 153 | +    )  | 
 | 154 | +    logger.info("Using destination connector %s", builtin_vector_db)  | 
 | 155 | + | 
 | 156 | +    pipeline_response = pipelines.create_pipeline(  | 
 | 157 | +        org_id,  | 
 | 158 | +        PipelineConfigurationSchema(  # type: ignore[call-arg]  | 
 | 159 | +            source_connectors=[  | 
 | 160 | +                PipelineSourceConnectorSchema(  | 
 | 161 | +                    id=source_connector_id,  | 
 | 162 | +                    type=SourceConnectorType.FILE_UPLOAD,  | 
 | 163 | +                    config={},  | 
 | 164 | +                )  | 
 | 165 | +            ],  | 
 | 166 | +            destination_connector=PipelineDestinationConnectorSchema(  | 
 | 167 | +                id=builtin_vector_db,  | 
 | 168 | +                type=DestinationConnectorTypeForPipeline.VECTORIZE,  | 
 | 169 | +                config={},  | 
 | 170 | +            ),  | 
 | 171 | +            ai_platform_connector=PipelineAIPlatformConnectorSchema(  | 
 | 172 | +                id=builtin_ai_platform,  | 
 | 173 | +                type=AIPlatformTypeForPipeline.VECTORIZE,  | 
 | 174 | +                config=AIPlatformConfigSchema(),  | 
 | 175 | +            ),  | 
 | 176 | +            pipeline_name="Test pipeline",  | 
 | 177 | +            schedule=ScheduleSchema(type=ScheduleSchemaType.MANUAL),  | 
 | 178 | +        ),  | 
 | 179 | +    )  | 
 | 180 | +    pipeline_id = pipeline_response.data.id  | 
 | 181 | +    logger.info("Created pipeline %s", pipeline_id)  | 
 | 182 | + | 
 | 183 | +    yield pipeline_id  | 
 | 184 | + | 
 | 185 | +    try:  | 
 | 186 | +        pipelines.delete_pipeline(org_id, pipeline_id)  | 
 | 187 | +    except Exception:  | 
 | 188 | +        logger.exception("Failed to delete pipeline %s", pipeline_id)  | 
0 commit comments