
    _j                      "   U d dl Z d dlZd dlZd dlZd dlZd dlZd dlmZmZm	Z	m
Z
mZmZmZmZmZ d dlmZ d dlZd dlZd dlZd dlmZ d dlmZ d dlmZ d dlmZ d dlZd dlm Z m!Z!m"Z" d d	l#m$Z$m%Z%m&Z& d d
l'm(Z( d dl)m*Z*m+Z+ d dl,m-Z.m/Z/ d dl0m1Z1m2Z3 d dl4m5Z5 d dl6Z6d dl7Z7d dl8Z9d dl:m;Z; d dlm<Z< d dl=m>Z>m?Z? d dlZ e6j@        eA          ZBg dZC ejD        dd          ZE ejD        d          dk    ZFeEeCvr eGdeE deC d          dejH        jI        ejH        jJ        ejH        jK        gejL        jM        dZNeOePef         eQd<   eFreejR        jS        hZT eUejR        dd          ZVeVeTW                    eV           eNX                     eYd ejR        D                       d             ejZ        j[        di eN ejZ        [                    dejZ        \                    d!          d"#           ejZ        [                    d$ejZ        \                    d!          d%#           ejZ        [                    d&ejZ        \                    d!          d'd%(           ejZ        ]                    eE            ejD        d)          dk    p ejD        d*          dk    Z^d+Z_d,Z`d-e"d.dfd/Za	 	 	 ddeejZ                 d$eejZ                 d&eejZ                 d.eejZ                 fd0Zb ejD        d1          dk    Zcec o ejD        d2          d3k    Zdd4Zeee d5e$ Zfd6Zgd.ejh        fd7Zidd8Zjd.ekfd9Zl	 	 	 	 	 	 	 	 	 	 	 dd;ekd<emd=eeP         d>eeP         d?eeP         d@eeP         dAeeP         dBeeP         dCeeP         dDeeP         dEeeP         dFeem         d.dfdGZndd-e!dHekd.dfdIZo	 	 	 	 	 	 	 	 	 	 	 	 	 dd<emdKePd>eeP         dLeeP         d?eeP         d@eeP         dMeeP         dAeeP         dBeeP         dCeeP         dDeeP         dEeeP         dFeem         d.ee&ddf         fdNZpd.ee&ddf         fdOZqd.ee&ddf         fdPZrd.ee&ddf         fdQZsd.ee&ddf         fdRZtd.eePekf         fdSZu ejv                    d.ee&ddf         fdT            Zwd.ee&ddf         fdUZxd.ee&ddf         fdVZyd.ee&ddf         fdWZzd.ee&ddf         fdXZ{	 ddYePd.ee&ddf         fdZZ| ejv                    d.ee&ddf         fd[            Z} ejv                    d.ee&ddf         fd\            Z~ ejv        d]^          d.ee&ddf         fd_            Z ejv        d]^          d.ee&ddf         fd`            Z ejv        d]^          d.ee&ddf         fda            Z ejv        d]^          d.ee&ddf         fdb            Z ejv        d)ej        v rdcgnddge          dfej        d.ee&ddf         fdg            Z ejv        d)ej        v rdhgndige          dfej        d.ee&ddf         fdj            Zd.e
eP         fdkZd.e
eP         fdlZd.e
eg ee&ddf         f                  fdmZd.e
eg ee&ddf         f                  fdnZd.e
eg ee&ddf         f                  fdoZd.e
eg ee&ddf         f                  fdpZd.e
eg ee&ddf         f                  fdqZ ejv        dr e            s          dfej        d.ee!ddf         fdt            Z ejv        dr e            s          dfej        d.ee!ddf         fdu            Z ejv         e            e          dfej        d.ee!ddf         fdv            Z ejv        d] e            s          dfej        d.ee!ddf         fdw            Z ejv        dr e            s          dfej        d.ee!ddf         fdx            Z ejv        dr e            s          dfej        d.ee!ddf         fdy            Ze5 G dz d{e3                      Ze5 G d| d}e1                      Z ejv        d]^          d~e&d.ee!ddf         fd            Z G d d          Z ejv        d]^          d~e&d.eeddf         fd            ZdePd.eeP         fdZde dePd.dfdZde d.dfdZ ejv        d]^          d~e&dePd.ee ddf         fd            Zejv        dfej        d.ePfd            Zdej        d.dfdZdedef         d.efdZeZdej        d.dfdZ ejv        d]^          de&dePd.ee ddf         fd            Z ejv        d]^          de&d.ee ddf         fd            Z ejv        d]^          de&d.ee!ddf         fd            Z ejv        d]^          de&d.ee!ddf         fd            Z ejv        d]^          de&d.ee!ddf         fd            Z G d de          Zde(dede	e+         dekd.eee+         ee*         f         f
dZde(dede	e+         dekd.eee+         ee*         f         f
dZd.e
e         fdZ ejv        dr e            s          dfej        d.eeddf         fd            Zdej        d.dfdZde d.emfdZ ejv        d          dfej        d.ed         fd            Zejv        d.ee>ge?f         fd            Zejv        de<d.e<fd            ZdS )    N)	Any	GeneratorIteratorListOptionalSequenceTupleCallablecast)UUID)ConnectError)Protocol)AsyncFastAPI)FastAPI)	ClientAPI	ServerAPIBaseAPI)DEFAULT_DATABASESettingsSystem)Producer)SeqIdOperationRecord)ClientAdminClient)AsyncAdminClientAsyncClient)async_class_to_sync)	MagicMock)MonkeyPatch	Documents
EmbeddingsfastnormalslowPROPERTY_TESTING_PRESETr%   #CHROMA_HYPOTHESIS_CI_REPRODUCE_ONLY1z!Invalid property testing preset: z. Must be one of .i_ )deadlinesuppress_health_check	verbositybase_hypothesis_settingsexplainc              #   ,   K   | ]}|t           v|V  d S N)disabled_phases).0phases     S/var/www/FlaskApp/flask-venv/lib/python3.11/site-packages/chromadb/test/conftest.py	<genexpr>r7   K   s5       
 
53O3OE3O3O3O3O
 
    T)phases
print_blobbase2   )max_examplesr&   d   r'   i  )r=   stateful_step_countCHROMA_RUST_BINDINGS_TEST_ONLYCHROMA_INTEGRATION_TEST_ONLYzPSPANN creation/modification disallowed in Rust bindings or integration test modezMSPANN creation/modification allowed in Rust bindings or integration test modeapireturnc                 .    |                                   d S r2   )reset)rB   s    r6   rE   rE   q   s    IIKKKKKr8   c                 .   g d| ||d}|                     t                    }|Ffd|j                                        D             }t	          j        t          j        j        fi |S t          t          j        t          j        j                  S )a%  Override Hypothesis settings for specific profiles.

    For example, to override max_examples only when the current profile is 'fast':

    override_hypothesis_profile(
        fast=hypothesis.settings(max_examples=50),
    )

    Settings will be merged with the default/active profile.
    )r,   r=   r?   r-   r$   Nc                 $    i | ]\  }}|v 	||S  rH   )r4   keyvalueallowable_override_keyss      r6   
<dictcomp>z/override_hypothesis_profile.<locals>.<dictcomp>   s5     
 
 
U--- ---r8   )getCURRENT_PRESET__dict__items
hypothesissettingsdefaultr   )r%   r&   r'   override_profilesoverriding_profileoverridden_settingsrK   s         @r6   override_hypothesis_profilerW   u   s          +..~>>%
 
 
 
09??AA
 
 
 ":#6#>VVBUVVV
#Z%8%@AAAr8   CHROMA_CLUSTER_TEST_ONLYMULTI_REGIONtrueztilt-spanning+x   c                  N    t           j                            t          d          S )Nz5Requires Kubernetes to be running with a valid config)reason)pytestmarkskipifNOT_CLUSTER_ONLYrH   r8   r6   skip_if_not_clusterrc      s'    ;F    r8   c                     t           j                            t           j                            t           j                            t
                              d          } t          d|             t           j                            |           st          d|            t          j
        dddddd	d
dddddddd| g           d S )Nzopenssl.cnfzConfig path: zConfig file not found at opensslreqz-x509z-newkeyzrsa:4096z-keyoutzserverkey.pemz-outzservercert.pemz-days365z-nodesz-subjz/CN=localhostz-config)ospathjoindirnameabspath__file__printexistsFileNotFoundError
subprocessrun)config_paths    r6    generate_self_signed_certificatert      s    ',,
1122M K 

'+
'
'(((7>>+&& K IK I IJJJN!	
    r8   c                  <   t          j         t           j        t           j                  5 } |                     d           |                     t           j        t           j        d           |                                 d         cd d d            S # 1 swxY w Y   d S )N) r      )socketAF_INETSOCK_STREAMbind
setsockopt
SOL_SOCKETSO_REUSEADDRgetsockname)ss    r6   find_free_portr      s    	v~v'9	:	: "a	w	V&(;Q???}}q!" " " " " " " " " " " " " " " " " "s   ABBBFportis_persistentpersist_directorychroma_server_authn_provider$chroma_server_authn_credentials_filechroma_server_authn_credentials"chroma_auth_token_transport_headerchroma_server_authz_providerchroma_server_authz_config_filechroma_server_ssl_certfilechroma_server_ssl_keyfile;chroma_overwrite_singleton_tenant_database_access_from_authc                 (   |r!|rt          ddddd||d|||||||          }nt          ddddddd|||||||          }t          j        j                            |          }t          j        |                                d| d	d
|
|	           dS )zRun a Chroma server locallychromadb.api.segment.SegmentAPI chromadb.db.impl.sqlite.SqliteDB7chromadb.segment.impl.manager.local.LocalSegmentManagerT)chroma_api_implchroma_sysdb_implchroma_producer_implchroma_consumer_implchroma_segment_manager_implr   r   allow_resetr   r   r   r   r   r   r   F)r   r   r   r   r   r   r   r   r   r   r   r   r   r   z0.0.0.0error   )hostr   	log_leveltimeout_keep_alivessl_keyfilessl_certfileN)r   chromadbserverfastapir   uvicornrr   app)r   r   r   r   r   r   r   r   r   r   r   r   rR   r   s                 r6   _run_serverr      s      "
* "
=@!C!C(a'/)E1U,K/Q)E,K ID
 
 
$ =@!C!C(a)E1U,K/Q)E,K ID
 
 
  _$,,X66FK

-/     r8   attemptsc                     	 |                                   d S # t          $ r:}|dk    r|t          j        d           t	          | |dz              Y d }~d S d }~ww xY w)N      rw   )	heartbeatr   timesleep_await_server)rB   r   es      r6   r   r     sx    - - - -b==GJqMMM#x!|,,,,,,,,,-s    
A/AAchromadb.api.fastapi.FastAPIr   chroma_client_auth_providerchroma_client_auth_credentialsc              #     
K   t                      t          j        d          dd|||||	
|f}dt          dt          t
          ddf         f
fd}| rt          j                    }| |j        |||||	
|f} ||          E d{V  	 |	                                 dS # t          t          f$ r}t          j        dk    rn|Y d}~dS d}~ww xY w ||          E d{V  dS )zmFixture generator that launches a server in a separate process, and yields a
    fastapi client connect to itspawnFNargsrC   c              3     K                        t          | d          }|                                 t          dd

rdnd	
  
        }t	          |          }|                    t                    }|                                 t          t          |t                    r|nt          |                     |V  |                                 |                                 |                                 d S )NT)targetr   daemon	localhostF)
r   chroma_server_hostchroma_server_http_portr   r   r   r   chroma_server_ssl_verifychroma_server_ssl_enabledr   )Processr   startr   r   instancer   r   
isinstancer   r   stopkillrj   )r   procrR   systemrB   r   r   r   r   r   r   ctxr   s        r6   rr   z_fastapi_fixture.<locals>.runK  s      {{+D{FF

+*$((C+I/Q%?.H&Sdde ID
 
 
 !!ooi((ZW55Scc;Ns;S;STTT				r8   nt)r   multiprocessingget_contextr   r   r   tempfileTemporaryDirectorynamecleanupPermissionErrorNotADirectoryErrorrh   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   rr   r   r   r   r   s    ` `  ``  ` `    @@r6   _fastapi_fixturer     s     $ D

%g
.
.C 	$,'*$'"!C	 	8# )FD$$67             0   $799"(0+.(+&%G
 3t99
	%%'''''  !34 	 	 	w$ 	 3t99s   B4 4C#CC#c                  "    t          d          S )NFr   r   rH   r8   r6   r   r     s    %0000r8   c                  $    t          dd          S )NF'chromadb.api.async_fastapi.AsyncFastAPI)r   r   r   rH   r8   r6   async_fastapir     s    A   r8   c                  "    t          d          S )NTr   r   rH   r8   r6   fastapi_persistentr     s    $////r8   c                  B    t                       t          ddd          S )NFz./servercert.pemz./serverkey.pem)r   r   r   )rt   r   rH   r8   r6   fastapi_sslr     s.    $&&&#5"3   r8   c                     d} d}t          j        d          rit          j        dd                              d          d         }t          t          j        dd                              d          d                   } || fS )zGet server host and port from CHROMA_SERVER_HOST environment variable.

    Returns:
        Tuple of (host, port) from environment, or defaults (localhost, 8000) if not set.
    i@  r   CHROMA_SERVER_HOSTrv   :r   rw   )rh   getenvsplitint)r   r   s     r6   _get_server_host_port_from_envr     s~     DD	y%&& Fy-r2288==a@291266<<SAA!DEE:r8   c               #     K   t                      \  } }t          d|| d          }t          |          }|                    t                    }t          |           |                                 |V  |                                 d S )Nr   T)r   r   r   r   )r   r   r   r   r   r   r   r   )r   r   rR   r   rB   s        r6   basic_http_clientr     s      /11JD$6 $	  H HF
//)
$
$C#
LLNNN
LLL
KKMMMMMr8   c               #      K   t          j        ddd          5 } |                     d           |                                  t	          dd| j        dd	          D ]}|V  	 d d d            d S # 1 swxY w Y   d S )
Nw	.htpasswdFsuffixdeleteCadmin:$2y$05$e5sRb6NCcSH3YfbIxe1AGu2h5K7OOd982OXKmd8WyQ3DRQ4MvpnZS
;chromadb.auth.basic_authn.BasicAuthenticationServerProvider1chromadb.auth.basic_authn.BasicAuthClientProvideradmin:adminr   r   r   r   r   r   NamedTemporaryFilewritecloser   r   fitems     r6   0fastapi_server_basic_auth_valid_cred_single_userr     s      
 
	$SU	K	K	K q	VWWW				$)f12([+8
 
 
 	 	D JJJJ		                    A
A22A69A6c               #   J  K   dddd} t          j        ddd          5 }|                                 D ] \  }}|                    | d	| d
           !|                                 t          dd|j        dd          D ]}|V  	 d d d            d S # 1 swxY w Y   d S )Nz<$2y$10$kY9hn.Wlfcj7n1Cnjmy1kuIhEFIVBsfbNWLQ5ahoKmdc2HLA4oP6iz<$2y$10$CymQ63tic/DRj8dD82915eoM4ke3d6RaNKU4dj4IVJlHyea0yeGDSz<$2y$05$e5sRb6NCcSH3YfbIxe1AGu2h5K7OOd982OXKmd8WyQ3DRQ4MvpnZS)useruser2adminr   r   Fr   r   
r   r   r   r   )r   r   rP   r   r   r   r   )credsr   r   credr   s        r6   3fastapi_server_basic_auth_valid_cred_multiple_usersr     s(      OOO E
 
	$SU	K	K	K q++-- 	( 	(JD$GGt&&d&&&''''				$)f12([+8
 
 
 	 	D JJJJ	                 s   A*BBBc               #      K   t          j        ddd          5 } |                     d           |                                  t	          dd| j        dd	          D ]}|V  	 d d d            d S # 1 swxY w Y   d S )
Nr   r   Fr   r   r   r   zadmin:admin1r   r   r   s     r6   &fastapi_server_basic_auth_invalid_credr     s      		$SU	K	K	K q	VWWW				$)f12([+9
 
 
 	 	D JJJJ		                 r   c               #     K   t          j        ddd          5 } |                     d           |                                  t          j        ddd          5 }|                    d           |                                 t	          ddd	d
| j        d|j                  D ]}|V  	 d d d            n# 1 swxY w Y   d d d            d S # 1 swxY w Y   d S )Nr   r   Fr   r   z.authzaL  
roles_mapping:
    admin:
        actions:
            [
                "system:reset",
                "tenant:create_tenant",
                "tenant:get_tenant",
                "db:create_database",
                "db:get_database",
                "db:list_collections",
                "db:create_collection",
                "db:get_or_create_collection",
                "collection:get_collection",
                "collection:delete_collection",
                "collection:update_collection",
                "collection:add",
                "collection:delete",
                "collection:get",
                "collection:query",
                "collection:peek",
                "collection:update",
                "collection:upsert",
                "collection:count",
            ]
users:
- id: admin
  role: admin
    r   r   r   z?chromadb.auth.simple_rbac_authz.SimpleRBACAuthorizationProvider)r   r   r   r   r   r   r   r   )server_authn_fileserver_authz_filer   s      r6   %fastapi_server_basic_authn_rbac_authzr    s     		$K
 
 
 5	R	
 	
 	
 	!!!(
 
 
 -	##  > ##%%%(#,_/<-j5F5K-n0A0F   	 	 



	I-	 -	 -	 -	 -	 -	 -	 -	 -	 -	 -	 -	 -	 -	 -	5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5s7   ACAB9-C9B=	=C B=	CCCsingleton_databasec           	   #   0  K   t          j        d          rt          syt                      \  }}t	          d||dddd          }t          |          }|                    t                    }t          |           |	                                 |V  d S t          j        dd	d
          5 }|                    d|  d           |                                 t          ddddd|j                  D ]}|V  	 d d d            d S # 1 swxY w Y   d S )Nr   r   Tz1chromadb.auth.token_authn.TokenAuthClientProviderzadmin-tokenF)r   r   r   r   r   r   r   r   z.authnr   z
users:
  - id: admin
    tokens:
      - admin-token
  - id: singleton_user
    tenant: singleton_tenant
    databases:
      - z%
    tokens:
      - singleton-token
z;chromadb.auth.token_authn.TokenAuthenticationServerProvider)r   r   r   r   r   r   )rh   r   rb   r   r   r   r   r   r   r   r   r   r   r   r   r   )r  r   r   rR   r   rB   r   r   s           r6   2fastapi_fixture_admin_and_singleton_tenant_db_userr  2  s      
y%&& /? 355
d:#$(([+8HM	
 	
 	
 !!ooi((c 
	$S%	H	H	H A	 
  	
 	
 	
 	
			$HL([+8)f12
 
 
 	 	D JJJJ	#                 s   .ADDDc               #      K   t          dd          } t          |           }|                                 |V  |                                 dS )Fixture generator for returning a client configured via environmenet
    variables, intended for externally configured integration tests
    Tr   r   r   Nr   r   r   r   rR   r   s     r6   integrationr  h  sX      
 *H  H HF
LLNNN
LLL
KKMMMMMr8   c               #      K   t          dd          } t          |           }|                                 |V  |                                 dS )r  Tr   r	  Nr
  r  s     r6   async_integrationr  v  sX      
 *S  H HF
LLNNN
LLL
KKMMMMMr8   function)scopec            	   #      K   t          ddddddd          } t          |           }|                                 |V  |                                 dS )z>Fixture generator for segment-based API using in-memory Sqliter   r   r   FT)r   r   r   r   r   r   r   Nr
  r  s     r6   python_sqlite_ephemeralr    sg       9<??$]  H HF
LLNNN
LLL
KKMMMMMr8   c            
   #   l  K   t          j                    } t          ddddddd| j                  }t	          |          }|                                 |V  |                                 	 |                                  dS # t          t          f$ r}t          j        dk    rn|Y d}~dS d}~ww xY w)z?Fixture generator for segment-based API using persistent Sqliter   r   r   T)r   r   r   r   r   r   r   r   r   N)r   r   r   r   r   r   r   r   r   r   rh   )	save_pathrR   r   r   s       r6   python_sqlite_persistentr    s       +--I9<??$]#.	 	 	H HF
LLNNN
LLL
KKMMM
 /0   7d??G DDDDDs   .B B3B..B3c            
   #      K   t          dddddddd          } t          |           }|                                 |V  |                                 dS )	z:Fixture generator for system using ephemeral Rust bindings!chromadb.api.rust.RustBindingsAPIr   r   FTrv   r   r   r   r   r   r   r   r   Nr
  r  s     r6   rust_sqlite_ephemeralr    sj       ;<??$]	 	 	H HF
LLNNN
LLL
KKMMMMMr8   c            
   #      K   t          j                    } t          ddddddd| j                  }t	          |          }|                                 |V  |                                 dS )z0Fixture generator for system using Rust bindingsr  r   r   Tr  N)r   r   r   r   r   r   r   )r  rR   r   s      r6   rust_sqlite_persistentr    sz       +--I;<??$]#.	 	 	H HF
LLNNN
LLL
KKMMMMMr8   r  r  )paramsrequestc                 6    |                      | j                  S r2   getfixturevalueparamr  s    r6   sqliter#         ""7=111r8   r  r  c                 6    |                      | j                  S r2   r  r"  s    r6   sqlite_persistentr&    r$  r8   c                      g d} dt           j        v r*|                     d           |                     d           dt           j        v rddg} dt           j        v rdg} dt           j        v rd	d
g} | S )N)r   r   r   sqlite_fixturer&  CHROMA_INTEGRATION_TESTr  r  rA   rX   r   r@   r  r  )rh   environappendfixturess    r6   filtered_fixture_namesr.    s      H !BJ..&&&+,,,%33!#67!RZ//'('2:55+-EFOr8   c                  6    d t                      D             } | S )Nc                     g | ]}|d v|	S ))r  r  r  r  rH   )r4   fixtures     r6   
<listcomp>z6filtered_http_server_fixture_names.<locals>.<listcomp>  s:     
 
 


 
 	
 
 
r8   )r.  r,  s    r6   "filtered_http_server_fixture_namesr3    s-    
 
-//
 
 
H Or8   c                  "    t           t          g} | S r2   )r   r   r,  s    r6   system_fixtures_authr5    s    8;H Or8   c                      t           g} | S r2   )r  r,  s    r6    system_fixtures_authn_rbac_authzr7    s     66HOr8   c                      t           g} | S r2   )r  r,  s    r6   1system_fixtures_root_and_singleton_tenant_db_userr9  "  s     CCHOr8   c                      t           g} | S r2   )r   r,  s    r6   system_fixtures_wrong_authr;  )  s    67HOr8   c                      t           g} | S r2   )r   r,  s    r6   system_fixtures_sslr=  .  s    }HOr8   module)r  r  c              #   >   K   |                                  E d {V  d S r2   r!  r"  s    r6   system_wrong_authrA  3  .       }}r8   c              #   >   K   |                                  E d {V  d S r2   r@  r"  s    r6   system_authn_rbac_authzrD  :  rB  r8   c                 6    |                      | j                  S r2   r  r"  s    r6   system_http_serverrF  A  s     ""7=111r8   c                 6    |                      | j                  S r2   r  r"  s    r6   r   r   H  s    ""7=111r8   c              #   >   K   |                                  E d {V  d S r2   r@  r"  s    r6   
system_sslrI  M  ,      }}r8   c              #   >   K   |                                  E d {V  d S r2   r@  r"  s    r6   system_authrL  R  rJ  r8   c                       e Zd ZdS )AsyncClientCreatorSyncN__name__
__module____qualname__rH   r8   r6   rN  rN  W          Dr8   rN  c                       e Zd ZdS )AsyncAdminClientSyncNrO  rH   r8   r6   rU  rU  \  rS  r8   rU  r   c              #      K   |                                   |                     t                    }t          |t                    rt          |          }|V  d S |V  d S r2   )reset_stater   r   r   r   r   )r   rB   transformeds      r6   rB   rB   a  sg      

//)
$
$C#|$$ )#..					r8   c                       e Zd ZU dZeed<   g Zee         ed<   defdZ	de
de
defd	Zdefd
Zde
de
defdZdefdZdS )ClientFactorieszThis allows consuming tests to be parameterized by async/sync versions of the client and papers over the async implementation.
    If you don't need to manually construct clients, use the `client` fixture instead.
    _system_created_clientsr   c                     || _         d S r2   )r[  )selfr   s     r6   __init__zClientFactories.__init__v  s    r8   r   kwargsrC   c                    |                     d          | j        j        |d<   |                     d          t          r
t          |d<   | j        j        j        dk    r@t          t          t          j	        |i |          }| j
                            |           |S t          |i |}| j
                            |           |S )NrR   databaser   )rM   r[  rR   MULTI_REGION_ENABLEDDEFAULT_MCMR_DATABASEr   r   ClientCreatorrN  creater\  r+  r^  r   r`  clients       r6   create_clientzClientFactories.create_clienty  s    ::j!!)!%!6F:::j!!).B)!6F: L!189 9 -)?)F)WPV)W)WXXF!((000M///$$V,,,r8   c                 2   | j         j        j        dk    rNt          t          t
                              | j                             }| j                            |           |S t	          j	        | j                   }| j                            |           |S Nr   )
r[  rR   r   r   re  rN  from_system_asyncr\  r+  from_systemr^  rh  s     r6   create_client_from_systemz)ClientFactories.create_client_from_system  s    L!189 9 5GGUU F !((000M*4<88$$V,,,r8   c                     | j         j        j        dk    r;t          t          t          |i |          }| j                            |           |S t	          |i |}| j                            |           |S rk  )r[  rR   r   r   r   rU  r\  r+  rg  s       r6   create_admin_clientz#ClientFactories.create_admin_client  s    L!189 9 +';T'LV'L'LMMF!((000Md-f--$$V,,,r8   c                 2   | j         j        j        dk    rNt          t          t
                              | j                             }| j                            |           |S t	          j        | j                   }| j                            |           |S rk  )	r[  rR   r   r   r   rU  rm  r\  r+  rn  s     r6   create_admin_client_from_systemz/ClientFactories.create_admin_client_from_system  s    L!189 9 +';'G'G'U'UVVF!((000M(66$$V,,,r8   N)rP  rQ  rR  __doc__r   __annotations__r\  r   r   r_  r   re  ri  ro  r   rq  rs  rH   r8   r6   rZ  rZ  m  s           OOO(*d9o***v    3 # -    &=                r8   rZ  c              #     K   |                                   t          |           }|V  t          |j                  dk    rH|j                                        }|                                 ~t          |j                  dk    Fd S d S )Nr   )rW  rZ  lenr\  popclear_system_cache)r   	factoriesrh  s      r6   client_factoriesr{    s      
''I
OOO
i(
)
)A
-
-+//11!!### i(
)
)A
-
-
-
-
-
-r8   database_namec                     t          |                     d                    dk    r|                     d          d         nd S )Nr[   rw   r   )rw  r   )r|  s    r6   get_topology_namer~    sA    *-m.A.A#.F.F*G*G!*K*K=s##A&&QUUr8   rh  c                     |                                  }|j        dk    rd|_        t          |          }|                    |           d S )Nr   r   )get_settingsr   r   create_database)rh  r|  admin_settingsr   s       r6   r  r    sQ    ((**N%)RRR)G&''E	-(((((r8   c                     dt          t          j                              z   }t          | j                  }||dz   |z   }t          | |           |                     |           dS )zHCreate an isolated database for a test and updates the client to use it.test_Nr[   )struuiduuid4r~  rb  r  set_database)rh  rb  	topo_names      r6   create_isolated_databaser    sg    TZ\\***H!&/22Is?X-FH%%%
!!!!!r8   c              #     K   |                                   | j        j        dk    r0t          t          t
                              | |                    }nt          j        | |          }|V  |	                                 d S Nr   )rb  )
rW  rR   r   r   r   rN  rl  re  rm  ry  )r   r|  rh  s      r6   rh  rh    s      
&*SSS"44Vm4TT
 

 *6MJJJ
LLL
r8   c                 6    t          t          | j                  S r2   )r   r  r!  r"  s    r6   r|  r|    s    W]###r8   metafuncc                 B   d| j         v rt          j        t          d          g}t          rX| j                            d          r>|                    t          j        t          dt          j	        j
                             |                     d|d           d	S d	S )
zNParameterize database_name based on whether the test opted in to multi-region.r|  classic)idtest_with_multi_regionzmulti-region-db)r  marksT)indirectN)fixturenamesr_   r!  r   rc  
definitionget_closest_markerr+  rd  r`   r  parametrize)r  r  s     r6   pytest_generate_testsr    s    (///,/I>>>? 		H$7$J$J$%
 %
 		 MM)( +<     	_ftDDDDD 0/r8   	test_func.c                 @    t           j                            |           S )zOpt-in decorator for multi-region testing.

    If MULTI_REGION_ENABLED: Test runs with MCMR database (tilt-spanning+default_database)
    If not MULTI_REGION_ENABLED: Test runs with default database only
    )r_   r`   r  )r  s    r6   multi_region_testr    s     ;--i888r8   r   c                     t          | d          rQ|                                 D ]+}|j        dk    rt          rdnd}| j         | | _         dS ,| j         d| _        dS dS )z'Modify test names to show database typeiter_markersr  z[multi-region]z[single-region]N)hasattrr  r   rc  _nodeid)r   markerr   s      r6   pytest_itemcollectedr    s    t^$$ 	<'')) 	< 	<F{666-AX))GX"&,888	 7 #l;;;DLLL	< 	<r8   rF  c              #   @  K   |                                   | j        j        dk    rIt          t          t
                              | |                    }|V  |                                 d S t          j	        | |          }|V  |                                 d S r  )
rW  rR   r   r   r   rN  rl  ry  re  rm  )rF  r|  rh  s      r6   http_clientr    s       ""$$$ 	#34	5 	5 "44"] 5  
 
 !!#####*+=VVV!!#####r8   rI  c              #      K   |                                   t          j        |           }|V  |                                 d S r2   )rW  re  rm  ry  )rI  rh  s     r6   
client_sslr  2  sI      &z22F
LLL
r8   rA  c              #   n   K   |                                   |                     t                    }|V  d S r2   rW  r   r   )rA  rB   s     r6   api_wrong_credr  :  s:       !!###

$
$Y
/
/C
IIIIIr8   rD  c              #   n   K   |                                   |                     t                    }|V  d S r2   r  )rD  rB   s     r6   api_with_authn_rbac_authzr  C  s:       '')))
!
*
*9
5
5C
IIIIIr8   rL  c              #   r   K   | }|                                  |                    t                    }|V  d S r2   r  )rL  _sysrB   s      r6   api_with_server_authr  L  s;      D
--	
"
"C
IIIIIr8   c                   ^    e Zd Zdededee         dedee	e         e	e
         f         f
dZdS )
ProducerFnproducercollection_id
embeddingsnrC   c                     d S r2   rH   )r^  r  r  r  r  s        r6   __call__zProducerFn.__call__X  s
     =@Cr8   N)rP  rQ  rR  r   r   r   r   r   r	   r   r   r  rH   r8   r6   r  r  W  s{        @@ @ _-	@
 @ 
x((5/9	:@ @ @ @ @ @r8   r  r  r  r  r  c                     g }g }t          |          D ]Q}t          |          }|                     ||          }|                    |           |                    |           R||fS r2   )rangenextsubmit_embeddingr+  )	r  r  r  r  submitted_embeddingsseq_ids_r   seq_ids	            r6   produce_n_singler  a  sz     G1XX  **=!<<##A&&&v((r8   c                     g }g }t          |          D ]&}t          |          }|                    |           '|                     ||          }||fS r2   )r  r  r+  submit_embeddings)r  r  r  r  r  r  r  r   s           r6   produce_n_batchr  q  si     !G1XX ' '##A&&&&((8LMMG((r8   c                      t           t          gS r2   )r  r  rH   r8   r6   produce_fn_fixturesr    s    o..r8   c              #      K   | j         V  d S r2   r@  r"  s    r6   produce_fnsr    s       -r8   configc                 ^    |                      dd           |                      dd           dS )zRegister custom markersmarkersz+dual_database: run test with both databaseszMtest_with_multi_region: run test with MCMR database when MULTI_REGION_ENABLEDN)addinivalue_line)r  s    r6   pytest_configurer    sA    
I'TUUU
W    r8   c                 8    |                                  j        du S )ziReturns True if the client is in-process (a SQLite client), False if it's out-of-process (a HTTP client).N)r  r   )rh  s    r6   is_client_in_processr    s      8D@@r8   )autouse)NNNc              #      K   | j         j        }t                              d|            dV  t                              d|            dS )z2Automatically logs the start and end of each test.zStarting test: NzFinished test: )noder   loggerdebug)r  	test_names     r6   	log_testsr    sY       !I
LL.9../// 
EEE
LL.9../////r8   c                  *    dt           dt          fd} | S )z"Return mock embeddings for testinginputrC   c                     d | D             S )Nc                 R    g | ]$}t          j        g d t           j                  %S )g?g?g333333?)dtype)nparrayfloat32)r4   r  s     r6   r2  z=mock_embeddings.<locals>._mock_embeddings.<locals>.<listcomp>  s-    KKK
;;;KKKr8   rH   )r  s    r6   _mock_embeddingsz)mock_embeddings.<locals>._mock_embeddings  s    KKUKKKKr8   r!   )r  s    r6   mock_embeddingsr    s2    L	 Lj L L L L r8   monkeypatchc                 t   t                      t                      t                      t                      t                      t                      t                      t                      t                      t                      t                      d}|                     t          dt          t          j        fi |           t                      t                      t                      t                      t                      t                      d}t                      }t          j        g dg          |j        _        t          j        g dg          |j	        _        |t                      |f|d         j
        _        |                                D ]\  }}|                     ||d           | S )zMock common dependencies)PILtorchopenaicoheresentence_transformersollamaInstructorEmbeddingvoyageaitext2vec	open_clipboto3modules)z	PIL.Imagez)sentence_transformers.SentenceTransformerzollama.ClientzInstructorEmbedding.INSTRUCTORzvoyageai.Clientztext2vec.SentenceModelr  r  F)raising)r   setattrsysdictr  r  r  encode_textreturn_valueencode_imagecreate_model_and_transformsrP   )r  mock_modulesmock_attributes
mock_modelri   mocks         r6   mock_common_depsr    si   
 {{++++!*++({{KKKK[[ L YS[(I(IL(I(IJJJ [[5>[["*3++$;;"+++ O J*,(OOO3D*E*EJ'+-8___4E+F+FJ(JL9F &++-- 7 7
dD$6666r8   )r;   )rC   N)FNNNNNNNNNF)r   )Fr   NNNNNNNNNNF)r  )r   rh   rx   rq   r   r   typingr   r   r   r   r   r   r	   r
   r   r  r   rQ   r_   r   httpxr   typing_extensionsr   chromadb.api.async_fastapir   chromadb.api.fastapir   chromadb.server.fastapir   chromadb.apir   r   r   chromadb.configr   r   r   chromadb.ingestr   chromadb.typesr   r   chromadb.api.clientr   re  r   chromadb.api.async_clientr   r   AsyncClientCreatorchromadb.utils.async_to_syncr   loggingr  numpyr  unittest.mockr   r    chromadb.api.typesr"   r#   	getLoggerrP  r  VALID_PRESETSr   rN   HYPOTHESIS_CI_REPRODUCE_ONLY
ValueErrorHealthCheckdata_too_largelarge_base_examplefunction_scoped_fixture	Verbosityverboser/   r  r  ru  Phaseshrinkr3   getattrexplain_phaseaddupdatetuplerR   register_profileget_profileload_profileis_spann_disabled_modeskip_reason_spann_disabledskip_reason_spann_enabledrE   rW   rb   rc  MULTI_REGION_TOPOLOGYrd  COMPACTION_SLEEPMarkDecoratorrc   rt   r   r   boolr   r   r   r   r   r   r   r   r1  r   r   r   r   r  r  r  r  r  r  r  r  r*  FixtureRequestr#  r&  r.  r3  r5  r7  r9  r;  r=  rA  rD  rF  r   rI  rL  rN  rU  rB   rZ  r{  r~  r  r  rh  r|  Metafuncr  r  r  Itemr  r  r  r  r  r  r  r  r  r  r  Configr  r  r  r  r  rH   r8   r6   <module>r,     s        				       
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
                   & & & & & & 3 3 3 3 3 3 ( ( ( ( ( (     6 6 6 6 6 6 6 6 6 6 > > > > > > > > > > $ $ $ $ $ $ 1 1 1 1 1 1 1 1 D D D D D D D D        = < < < < <  



     # # # # # #       4 4 4 4 4 4 4 4 		8	$	$***4f==(ry)NOOSVV &&
*]N]]]]]]  
 -16
 %-, , $sCx.      !'./OGJ,i>>M M***##u 
 
)/
 
 
 
 
 	 $    %
  $ H H/G H H H 
  $ $
J++F33" %      $ $j!--f55C %      $ $
##F++	 %          0 0 0
 BI.//36 8ry/00C7 
 W  T 
w 4    
 +/,0*.(B (B
:&
'(BZ()(B :&
'(B j!"	(B (B (B (BV 29788C? ++S		.0I0IV0S ' 0EE3CEE  V1       :" " " " "  '+26:>598<265904/3RW; ;
;;  }; #+3-	;
 +33-; &.c]; )1; #+3-; &.c]; !);  (}; BJ$; 
; ; ; ;|- -y -C - - - - -  92615:>59488<265904/3RWh hhh #+3-h "*#	h
 +33-h &.c]h %-SMh )1h #+3-h &.c]h !)h  (}h BJ$h vtT!"h h h hV164-. 1 1 1 1yt!34    0IfdD&89 0 0 0 0YvtT12    c3h      9VT4%78    ")FDRVDV:W    &Y
D$>    .	&$:L0M    6yt9K/L 6 6 6 6t 33 33vtT!"3 3 3 3l 
YvtT12 
 
 
 
 
9VT4%78 
 
 
 
 j!!!64+=!>    "!" j!!!)FD$,>"?    "!> j!!!yt);<    "!$ j!!!	&$*< =    "!& '2:55 $$$
#	$  
2F) 2id8J.K 2 2 2 
2 '2:55 %%%
$	%  
2v4 264QUCU9V 2 2 2 
2S	    *DI    d8B	&$:L0M,M#NO    $R64-../+    4R64-../<    D"id@R6S2S)T$U    
T(2yt9K/L+L"MN    
 h'A'A'C'CDDD"y$$%   ED h'G'G'I'IJJJ"y$$%   KJ 99;;<<<2"2y$$%2 2 2 =<2 j)?)?)A)ABBB2F) 2i	48M.N 2 2 2 CB2 h':':'<'<===- )ItT<Q2R    >= h';';'='=>>>. 9Yd=R3S    ?> 	 	 	 	 	/ 	 	 	 	 	 	 	 	+ 	 	 	 j!!! 9Yd%:;    "!F F F F F F F FR j!!!	V 		/42M(N 	 	 	 "!	VS VXc] V V V V)I )c )d ) ) ) )"Y "4 " " " " j!!! 6  #  )ItT<Q2R       "!  $60 $S $ $ $ $EFO E E E E E"9#s(!3 9 9 9 9 9 + <v{ <t < < < < j!!!$$/2$y$$%$ $ $ "!$. j!!! 6  i	40E&F       "!  j!!!y$$%   "! j!!!#y$$%   "! j!!!f 9dD;P1Q    "!@ @ @ @ @ @ @ @))) )) 	)
 8O$huo56) ) ) ) ))) )) 	)
 8O$huo56) ) ) )/T*- / / / / h':':'<'<==="z4%&   >=V] t    A At A A A A
 0v, 0;K1L 0 0 0 0 9+z"9:     ,+ ,+ , , , , , ,r8   