
    Zi                      
   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          ZEeEeCvr eFdeE deC d          ejG        H                    ddejI        jJ        ejI        jK        ejI        jL        gejM        jN                   ejG        H                    dejG        O                    d          d           ejG        H                    dejG        O                    d          d           ejG        H                    dejG        O                    d          d d!           ejG        P                    eE            ejD        d"          d#k    p ejD        d$          d#k    ZQd%ZRd&ZSd'e"d(dfd)ZT	 	 	 ddeejG                 deejG                 deejG                 d(eejG                 fd*ZU ejD        d+          d#k    ZVeV o ejD        d,          d-k    ZWd.ZXeX d/e$ ZYd0ZZd(ej[        fd1Z\dd2Z]d(e^fd3Z_	 	 	 	 	 	 	 	 	 	 	 dd5e^d6e`d7eea         d8eea         d9eea         d:eea         d;eea         d<eea         d=eea         d>eea         d?eea         d@ee`         d(dfdAZbdd'e!dBe^d(dfdCZc	 	 	 	 	 	 	 	 	 	 	 	 	 dd6e`dEead8eea         dFeea         d9eea         d:eea         dGeea         d;eea         d<eea         d=eea         d>eea         d?eea         d@ee`         d(ee&ddf         fdHZdd(ee&ddf         fdIZed(ee&ddf         fdJZfd(ee&ddf         fdKZgd(ee&ddf         fdLZhd(eeae^f         fdMZi ejj                    d(ee&ddf         fdN            Zkd(ee&ddf         fdOZld(ee&ddf         fdPZmd(ee&ddf         fdQZnd(ee&ddf         fdRZod(ee&ddf         fdSZp ejj                    d(ee&ddf         fdT            Zq ejj                    d(ee&ddf         fdU            Zr ejj        dVW          d(ee&ddf         fdX            Zs ejj        dVW          d(ee&ddf         fdY            Zt ejj        dVW          d(ee&ddf         fdZ            Zu ejj        dVW          d(ee&ddf         fd[            Zv ejj        d"ejw        v rd\gnd]g^          d_ejx        d(ee&ddf         fd`            Zy ejj        d"ejw        v rdagndbg^          d_ejx        d(ee&ddf         fdc            Zzd(e
ea         fddZ{d(e
ea         fdeZ|d(e
eg ee&ddf         f                  fdfZ}d(e
eg ee&ddf         f                  fdgZ~d(e
eg ee&ddf         f                  fdhZd(e
eg ee&ddf         f                  fdiZd(e
eg ee&ddf         f                  fdjZ ejj        dk e            l          d_ejx        d(ee!ddf         fdm            Z ejj        dk e~            l          d_ejx        d(ee!ddf         fdn            Z ejj         e|            ^          d_ejx        d(ee!ddf         fdo            Z ejj        dV e{            l          d_ejx        d(ee!ddf         fdp            Z ejj        dk e            l          d_ejx        d(ee!ddf         fdq            Z ejj        dk e}            l          d_ejx        d(ee!ddf         fdr            Ze5 G ds dte3                      Ze5 G du dve1                      Z ejj        dVW          dwe&d(ee!ddf         fdx            Z G dy dz          Z ejj        dVW          dwe&d(eeddf         fd{            Zd|ead(eea         fd}Zd~e d|ead(dfdZd~e d(dfdZ ejj        dVW          dwe&d|ead(ee ddf         fd            Z ejj                    d_ejx        d(eafd            Zdedef         d(efdZeZdej        d(dfdZ ejj        dVW          de&d|ead(ee ddf         fd            Z ejj        dVW          de&d(ee ddf         fd            Z ejj        dVW          de&d(ee!ddf         fd            Z ejj        dVW          de&d(ee!ddf         fd            Z ejj        dVW          de&d(ee!ddf         fd            Z G d de          Zde(dede	e+         de^d(eee+         ee*         f         f
dZde(dede	e+         de^d(eee+         ee*         f         f
dZd(e
e         fdZ ejj        dk e            l          d_ejx        d(eeddf         fd            Zdej        d(dfdZd~e d(e`fdZ ejj        d          d_ejx        d(ed         fd            Zejj        d(ee>ge?f         fd            Zejj        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%   z!Invalid property testing preset: z. Must be one of .basei_ )deadlinesuppress_health_check	verbosity2   )max_examplesr&   d   r'   i  )r/   stateful_step_countCHROMA_RUST_BINDINGS_TEST_ONLY1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 N)reset)r5   s    S/root/projects/butler/venv/lib64/python3.11/site-packages/chromadb/test/conftest.pyr9   r9   b   s    IIKKKKK    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/   r1   r,   r$   Nc                 $    i | ]\  }}|v 	||S  r>   ).0keyvalueallowable_override_keyss      r:   
<dictcomp>z/override_hypothesis_profile.<locals>.<dictcomp>   s5     
 
 
U--- ---r;   )getCURRENT_PRESET__dict__items
hypothesissettingsdefaultr   )r%   r&   r'   override_profilesoverriding_profileoverridden_settingsrB   s         @r:   override_hypothesis_profilerN   f   s          +..~>>%
 
 
 
09??AA
 
 
 ":#6#>VVBUVVV
#Z%8%@AAAr;   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_ONLYr>   r;   r:   skip_if_not_clusterrZ      s'    ;F    r;   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    r:    generate_self_signed_certificaterk      s    ',,
1122M K 

'+
'
'(((7>>+&& K IK I IJJJN!	
    r;   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    r:   find_free_portrx      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_implrz   r{   allow_resetr|   r}   r~   r   r   r   r   F)r   r   r   r   r   rz   r   r|   r}   r~   r   r   r   r   z0.0.0.0error   )hostry   	log_leveltimeout_keep_alivessl_keyfilessl_certfileN)r   chromadbserverfastapir   uvicornri   app)ry   rz   r{   r|   r}   r~   r   r   r   r   r   r   rI   r   s                 r:   _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

-/     r;   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      rn   )	heartbeatr   timesleep_await_server)r5   r   es      r:   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argsr6   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killra   )r   procrI   systemr5   r   r   r   r   r   r   ctxry   s        r:   ri   z_fastapi_fixture.<locals>.run<  s      {{+D{FF

+*$((C+I/Q%?.H&Sdde ID
 
 
 !!ooi((ZW55Scc;Ns;S;STTT				r;   nt)rx   multiprocessingget_contextr   r   r   tempfileTemporaryDirectorynamecleanupPermissionErrorNotADirectoryErrorr_   )rz   r   r|   r   r}   r~   r   r   r   r   r   r   r   r   ri   r{   r   r   ry   s    ` `  ``  ` `    @@r:   _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rz   r   r>   r;   r:   r   r   w  s    %0000r;   c                  $    t          dd          S )NF'chromadb.api.async_fastapi.AsyncFastAPI)rz   r   r   r>   r;   r:   async_fastapir   {  s    A   r;   c                  "    t          d          S )NTr   r   r>   r;   r:   fastapi_persistentr     s    $////r;   c                  B    t                       t          ddd          S )NFz./servercert.pemz./serverkey.pem)rz   r   r   )rk   r   r>   r;   r:   fastapi_sslr     s.    $&&&#5"3   r;   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_HOSTrm   :r   rn   )r_   getenvsplitint)ry   r   s     r:   _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:r;   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   ry   rI   r   r5   s        r:   basic_http_clientr     s      /11JD$6 $	  H HF
//)
$
$C#
LLNNN
LLL
KKMMMMMr;   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rz   r|   r}   r   r   r   NamedTemporaryFilewritecloser   r   fitems     r:   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   rG   r   r   r   r   )credsr   r   credr   s        r:   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     r:   &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)rz   r   r   r|   r}   r   r   r   )server_authn_fileserver_authz_filer   s      r:   %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c            	   #   (  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           |                                 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:
      - singleton_database
    tokens:
      - singleton-token
z;chromadb.auth.token_authn.TokenAuthenticationServerProvider)rz   r   r   r   r|   r}   )r_   r   rY   r   r   r   r   r   r   r   r   r   r   r   r   r   )r   ry   rI   r   r5   r   r   s          r:   2fastapi_fixture_admin_and_singleton_tenant_db_userr   #  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   rI   r   s     r:   integrationr  Y  sX      
 *H  H HF
LLNNN
LLL
KKMMMMMr;   c               #      K   t          dd          } t          |           }|                                 |V  |                                 dS )r   Tr   r   Nr   r  s     r:   async_integrationr  g  sX      
 *S  H HF
LLNNN
LLL
KKMMMMMr;   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   rz   r   Nr   r  s     r:   python_sqlite_ephemeralr  u  sg       9<??$]  H HF
LLNNN
LLL
KKMMMMMr;   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   rz   r{   r   N)r   r   r   r   r   r   r   r   r   r   r_   )	save_pathrI   r   r   s       r:   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   FTrm   r   r   r   r   r   rz   r   r{   Nr   r  s     r:   rust_sqlite_ephemeralr    sj       ;<??$]	 	 	H HF
LLNNN
LLL
KKMMMMMr;   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
  rI   r   s      r:   rust_sqlite_persistentr    sz       +--I;<??$]#.	 	 	H HF
LLNNN
LLL
KKMMMMMr;   r  r  )paramsrequestc                 6    |                      | j                  S r8   getfixturevalueparamr  s    r:   sqliter         ""7=111r;   r  r  c                 6    |                      | j                  S r8   r  r  s    r:   sqlite_persistentr    r  r;   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  r4   rO   r   r2   r  r  )r_   environappendfixturess    r:   filtered_fixture_namesr$    s      H !BJ..&&&+,,,%33!#67!RZ//'('2:55+-EFOr;   c                  6    d t                      D             } | S )Nc                     g | ]}|d v|	S ))r  r  r  r  r>   )r?   fixtures     r:   
<listcomp>z6filtered_http_server_fixture_names.<locals>.<listcomp>  s:     
 
 


 
 	
 
 
r;   )r$  r"  s    r:   "filtered_http_server_fixture_namesr)    s-    
 
-//
 
 
H Or;   c                  "    t           t          g} | S r8   )r   r   r"  s    r:   system_fixtures_authr+    s    8;H Or;   c                      t           g} | S r8   )r   r"  s    r:    system_fixtures_authn_rbac_authzr-    s     66HOr;   c                      t           g} | S r8   )r   r"  s    r:   1system_fixtures_root_and_singleton_tenant_db_userr/    s     CCHOr;   c                      t           g} | S r8   )r   r"  s    r:   system_fixtures_wrong_authr1    s    67HOr;   c                      t           g} | S r8   )r   r"  s    r:   system_fixtures_sslr3    s    }HOr;   module)r  r  c              #   >   K   |                                  E d {V  d S r8   r  r  s    r:   system_wrong_authr7  $  .       }}r;   c              #   >   K   |                                  E d {V  d S r8   r6  r  s    r:   system_authn_rbac_authzr:  +  r8  r;   c                 6    |                      | j                  S r8   r  r  s    r:   system_http_serverr<  2  s     ""7=111r;   c                 6    |                      | j                  S r8   r  r  s    r:   r   r   9  s    ""7=111r;   c              #   >   K   |                                  E d {V  d S r8   r6  r  s    r:   
system_sslr?  >  ,      }}r;   c              #   >   K   |                                  E d {V  d S r8   r6  r  s    r:   system_authrB  C  r@  r;   c                       e Zd ZdS )AsyncClientCreatorSyncN__name__
__module____qualname__r>   r;   r:   rD  rD  H          Dr;   rD  c                       e Zd ZdS )AsyncAdminClientSyncNrE  r>   r;   r:   rK  rK  M  rI  r;   rK  r   c              #      K   |                                   |                     t                    }t          |t                    rt          |          }|V  d S |V  d S r8   )reset_stater   r   r   r   r   )r   r5   transformeds      r:   r5   r5   R  sg      

//)
$
$C#|$$ )#..					r;   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 r8   )rQ  )selfr   s     r:   __init__zClientFactories.__init__g  s    r;   r   kwargsr6   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 )NrI   databaser   )rD   rQ  rI   MULTI_REGION_ENABLEDDEFAULT_MCMR_DATABASEr   r   ClientCreatorrD  createrR  r!  rT  r   rV  clients       r:   create_clientzClientFactories.create_clientj  s    ::j!!)!%!6F:::j!!).B)!6F: L!189 9 -)?)F)WPV)W)WXXF!((000M///$$V,,,r;   c                 2   | j         j        j        dk    rNt          t          t
                              | j                             }| j                            |           |S t	          j	        | j                   }| j                            |           |S Nr   )
rQ  rI   r   r   r[  rD  from_system_asyncrR  r!  from_systemrT  r^  s     r:   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,,,r;   c                     | j         j        j        dk    r;t          t          t          |i |          }| j                            |           |S t	          |i |}| j                            |           |S ra  )rQ  rI   r   r   r   rK  rR  r!  r]  s       r:   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,,,r;   c                 2   | j         j        j        dk    rNt          t          t
                              | j                             }| j                            |           |S t	          j        | j                   }| j                            |           |S ra  )	rQ  rI   r   r   r   rK  rc  rR  r!  rd  s     r:   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,,,r;   N)rF  rG  rH  __doc__r   __annotations__rR  r   r   rU  r   r[  r_  re  r   rg  ri  r>   r;   r:   rP  rP  ^  s           OOO(*d9o***v    3 # -    &=                r;   rP  c              #     K   |                                   t          |           }|V  t          |j                  dk    rH|j                                        }|                                 ~t          |j                  dk    Fd S d S )Nr   )rM  rP  lenrR  popclear_system_cache)r   	factoriesr^  s      r:   client_factoriesrq    s      
''I
OOO
i(
)
)A
-
-+//11!!### i(
)
)A
-
-
-
-
-
-r;   database_namec                     t          |                     d                    dk    r|                     d          d         nd S )NrR   rn   r   )rm  r   )rr  s    r:   get_topology_namert    sA    *-m.A.A#.F.F*G*G!*K*K=s##A&&QUUr;   r^  c                     |                                  }|j        dk    rd|_        t          |          }|                    |           d S )Nr   r   )get_settingsr   r   create_database)r^  rr  admin_settingsr   s       r:   rw  rw    sQ    ((**N%)RRR)G&''E	-(((((r;   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_NrR   )struuiduuid4rt  rX  rw  set_database)r^  rX  	topo_names      r:   create_isolated_databaser    sg    TZ\\***H!&/22Is?X-FH%%%
!!!!!r;   c              #     K   |                                   | j        j        dk    r0t          t          t
                              | |                    }nt          j        | |          }|V  |	                                 d S Nr   )rX  )
rM  rI   r   r   r   rD  rb  r[  rc  ro  )r   rr  r^  s      r:   r^  r^    s      
&*SSS"44Vm4TT
 

 *6MJJJ
LLL
r;   c                 d    | j                             d          }|rt          rt          S t          S )Ntest_with_multi_region)nodeget_closest_markerrY  rZ  r   )r  has_marks     r:   rr  rr    s6     |../GHHH %( %$$r;   	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
    )rV   rW   r  )r  s    r:   multi_region_testr    s     ;--i888r;   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[mcmr]z[single-region]N)hasattrr  r   rY  _nodeid)r   markerr   s      r:   pytest_itemcollectedr    s    t^$$ 	<'')) 	< 	<F{666%9P?P"&,888	 7 #l;;;DLLL	< 	<r;   r<  c              #   @  K   |                                   | j        j        dk    rIt          t          t
                              | |                    }|V  |                                 d S t          j	        | |          }|V  |                                 d S r  )
rM  rI   r   r   r   rD  rb  ro  r[  rc  )r<  rr  r^  s      r:   http_clientr    s       ""$$$ 	#34	5 	5 "44"] 5  
 
 !!#####*+=VVV!!#####r;   r?  c              #      K   |                                   t          j        |           }|V  |                                 d S r8   )rM  r[  rc  ro  )r?  r^  s     r:   
client_sslr    sI      &z22F
LLL
r;   r7  c              #   n   K   |                                   |                     t                    }|V  d S r8   rM  r   r   )r7  r5   s     r:   api_wrong_credr    s:       !!###

$
$Y
/
/C
IIIIIr;   r:  c              #   n   K   |                                   |                     t                    }|V  d S r8   r  )r:  r5   s     r:   api_with_authn_rbac_authzr  '  s:       '')))
!
*
*9
5
5C
IIIIIr;   rB  c              #   r   K   | }|                                  |                    t                    }|V  d S r8   r  )rB  _sysr5   s      r:   api_with_server_authr  0  s;      D
--	
"
"C
IIIIIr;   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nr6   c                     d S r8   r>   )rT  r  r  r  r  s        r:   __call__zProducerFn.__call__<  s	     	r;   N)rF  rG  rH  r   r   r   r   r   r	   r   r   r  r>   r;   r:   r  r  ;  sp          _-	
  
x((5/9	:     r;   r  r  r  r  r  c                     g }g }t          |          D ]Q}t          |          }|                     ||          }|                    |           |                    |           R||fS r8   )rangenextsubmit_embeddingr!  )	r  r  r  r  submitted_embeddingsseq_ids_r   seq_ids	            r:   produce_n_singler  F  sz     G1XX  **=!<<##A&&&v((r;   c                     g }g }t          |          D ]&}t          |          }|                    |           '|                     ||          }||fS r8   )r  r  r!  submit_embeddings)r  r  r  r  r  r  r  r   s           r:   produce_n_batchr  V  si     !G1XX ' '##A&&&&((8LMMG((r;   c                      t           t          gS r8   )r  r  r>   r;   r:   produce_fn_fixturesr  e  s    o..r;   c              #      K   | j         V  d S r8   r6  r  s    r:   produce_fnsr  i  s       -r;   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    r:   pytest_configurer  p  sA    
I'TUUU
W    r;   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)rv  r   )r^  s    r:   is_client_in_processr  y  s      8D@@r;   T)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: )r  r   loggerdebug)r  	test_names     r:   	log_testsr  ~  sY       !I
LL.9../// 
EEE
LL.9../////r;   c                  *    dt           dt          fd} | S )z"Return mock embeddings for testinginputr6   c                     d | D             S )Nc                 R    g | ]$}t          j        g d t           j                  %S )g?g?g333333?)dtype)nparrayfloat32)r?   r  s     r:   r(  z=mock_embeddings.<locals>._mock_embeddings.<locals>.<listcomp>  s-    KKK
;;;KKKr;   r>   )r  s    r:   _mock_embeddingsz)mock_embeddings.<locals>._mock_embeddings  s    KKUKKKKr;   r!   )r  s    r:   mock_embeddingsr    s2    L	 Lj L L L L r;   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_transformsrG   )r  mock_modulesmock_attributes
mock_modelr`   mocks         r:   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r;   )r6   N)FNNNNNNNNNF)r   )Fr   NNNNNNNNNNF)r   r_   ro   rh   r   r   typingr   r   r   r   r   r   r	   r
   r   r|  r   rH   rV   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   r[  r   chromadb.api.async_clientr   r   AsyncClientCreatorchromadb.utils.async_to_syncr   loggingr  numpyr  unittest.mockr   r    chromadb.api.typesr"   r#   	getLoggerrF  r  VALID_PRESETSr   rE   
ValueErrorrI   register_profileHealthCheckdata_too_largelarge_base_examplefunction_scoped_fixture	Verbosityverboseget_profileload_profileis_spann_disabled_modeskip_reason_spann_disabledskip_reason_spann_enabledr9   rN   rY   rY  MULTI_REGION_TOPOLOGYrZ  COMPACTION_SLEEPMarkDecoratorrZ   rk   r   rx   boolr{  r   r   r   r   r   r   r   r   r'  r   r   r   r   r   r   r  r  r  r  r  r  r   FixtureRequestr  r  r$  r)  r+  r-  r/  r1  r3  r7  r:  r<  r   r?  rB  rD  rK  r5   rP  rq  rt  rw  r  r^  rr  r  r  Itemr  r  r  r  r  r  r  r  r  r  r  Configr  r  r  r  r  r>   r;   r:   <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==&&
*]N]]]]]]     $ $
-16
 "* % 	 	 	   $ $
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    &fdD !   .	&$:L0M    6yt9K/L 6 6 6 6r3fdD !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    "id 233	45   "id 233	45   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    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:     ,+ ,+ , , , , , ,r;   