
    BTh=                         d Z ddlZddlZddlmZmZ ddlmZmZ ddl	Z	ddl
mZ ddlmZ  G d de      Z G d	 d
e      Zy)zTest suite to check index implementations.

Standard tests for the DocumentIndex abstraction

We don't recommend implementing externally managed DocumentIndex abstractions at this
time.

:private:
    N)ABCabstractmethod)AsyncGenerator	Generator)Document)DocumentIndexc                       e Zd ZdZeej                  deeddf   fd              Z	deddfdZ
deddfdZdeddfdZdeddfd	Zdeddfd
ZdeddfdZdeddfdZdeddfdZdeddfdZdeddfdZdeddfdZy)DocumentIndexerTestSuiteTest suite for checking the read-write of a document index.

    Implementers should subclass this test suite and provide a fixture
    that returns an empty index for each test.
    returnNc                      yzGet the index.N selfs    {/var/www/catia.catastroantioquia-mas.com/valormas/lib/python3.12/site-packages/langchain_tests/integration_tests/indexer.pyindexzDocumentIndexerTestSuite.index   s        r   c                 b    t        j                  |j                        }d|j                  vsJ yz7Verify that there is not parameter called ids in upsertidsNinspect	signatureupsert
parametersr   r   r   s      r    test_upsert_documents_has_no_idsz9DocumentIndexerTestSuite.test_upsert_documents_has_no_ids!   s*    %%ell3	I00000r   c                    t        dddi      t        dddi      g}|j                  |      }t        |d         }|j                  |      }t        |d 	      }|d
   j                  dk(  r7|d
   t        dddi|d
         k(  sJ |d   t        dddi|d         k(  sJ y|d
   t        dddi|d
         k(  sJ |d   t        dddi|d         k(  sJ y)yUpsert works with documents that do not have IDs.

        At the moment, the ID field in documents is optional.
        fooid   page_contentmetadatabar   	succeededc                     | j                   S Nr"   xs    r   <lambda>z=DocumentIndexerTestSuite.test_upsert_no_ids.<locals>.<lambda>4   
    144 r   keyr   r%   r&   r"   N)r   r   sortedgetr%   r   r   	documentsresponser   sorted_documentss         r   test_upsert_no_idsz+DocumentIndexerTestSuite.test_upsert_no_ids&   s/    %4)<%4)<
	 <<	*Xk*+ IIcN	!)@A++u4#A&("dAY3q6+    $A&("dAY3q6+    $A&("dAY3q6+    $A&("dAY3q6+   r   c                    t        t        j                  d            }t        |dddi      t        dddi	      g}|j	                  |      }|d
   }t        t        |      |hz
        d   }|d   g k(  sJ ||v sJ |j                  |      }|d   }|j                  |k(  r&|t        dddi|      t        dddi|      gk(  sJ y|t        dddi|      t        dddi|      gk(  sJ y)6Test an upsert where some docs have ids and some dont.   intr!   r"   r#   r"   r%   r&   r'   r(   r$   r)   r   failedr3   N)	struuidUUIDr   r   listsetr5   r"   r   r   foo_uuidr7   r8   r   other_id	first_docs           r   test_upsert_some_idsz-DocumentIndexerTestSuite.test_upsert_some_idsE   s   tyyQ'(uayI%4)<
	 <<	*{#CH:-.q1!R'''3IIcN	aL	<<8#etQiHMetQiHM!   
 etQiHMetQiHM!   r   c                 ~   t        t        j                  d            }t        |dddi      g}|j	                  |      }|d   }|d   g k(  sJ |j                  |      t        dddi|	      gk(  sJ |j	                  t        |d
ddi      g       |j                  |g      }|t        d
ddi|	      gk(  sJ y)-Test that upsert overwrites existing content.r=   r>   r!   r'   r#   r@   r)   rA   r3   foo2meowr(   N)rB   rC   rD   r   r   r5   r   r   rH   r7   r8   r   s         r   test_upsert_overwritesz/DocumentIndexerTestSuite.test_upsert_overwrites_   s    tyyQ'(uqzJ
	 <<	*{#!R'''yy~%5!*J"
 
 	
 

 	h(6ST+VWXIIxj)	&FA;8L
 
 	
 
r   c                     |j                  dg      g k(  sJ |j                  dg      }d|v r
|d   dk(  sJ d|v r
|d   dk(  sJ d|v r
|d   g k(  sJ d|v r|d   g k(  sJ yy)1Verify that we can delete docs that aren't there.1num_deletedr   
num_failedr)   rA   N)r5   deleter   r   delete_responses      r   test_delete_missing_docsz1DocumentIndexerTestSuite.test_delete_missing_docst   s    yy#2%%%,,u-O+"=1Q666?*"<0A555/)";/2555&"8,222 'r   c                 .   t        t        j                  d            }|j                  t	        |di       g      }||gg dk(  sJ |j                  d|g      }d|v r
|d   dk(  sJ d	|v r
|d	   d
k(  sJ d|v r|d   |gk(  sJ d|v r|d   g k(  sJ yy)3Test deletion of content has appropriate semantics.r=   r>   r!   r@   r)   rA   
missing_idrU   r#   rV   r   r)   rA   N)rB   rC   rD   r   r   rW   r   r   rH   upsert_responserY   s        r   test_delete_semanticsz.DocumentIndexerTestSuite.test_delete_semantics   s     tyyQ'(,,CD
 
b"IIII,,h'?@O+"=1Q666?*"<0A555/)";/H:===&"8,222 'r   c                     t        ddddi      t        ddddi      t        d	d
ddi      g}|j                  |       |j                  ddg       |j                  g d      t        d
ddid	      gk(  sJ y)2Test that we can delete several documents at once.rT   r!   r"   r#   r@   2r'   r(   3baz   rT   rd   re   r3   N)r   r   rW   r5   r   r   r7   s      r   test_bulk_deletez)DocumentIndexerTestSuite.test_bulk_delete   s     %4)D%4)D%4)D
	 	Yc3Z yy)%4)D.
 
 	
 
r   c                     t        j                  t              5  |j                          ddd       y# 1 sw Y   yxY wz+Test delete with no args raises ValueError.N)pytestraises
ValueErrorrW   r   r   s     r   test_delete_no_argsz,DocumentIndexerTestSuite.test_delete_no_args   s,    ]]:& 	LLN	 	 	s   4=c                 N    |j                  dg       |j                  g d       y)7Deleting missing content should not raise an exception.rT   rh   N)rW   rp   s     r   test_delete_missing_contentz4DocumentIndexerTestSuite.test_delete_missing_content   s    cU_%r   c                    t        ddddi      t        ddddi      g}|j                  |      }|ddgg d	k(  sJ |j                  g d
      }t        |d       t        dddid      t        dddid      gk(  sJ y)Test get with missing IDs.rT   r!   r"   r#   r@   rd   r'   r(   r]   rT   rd   re   4c                     | j                   S r+   r,   r-   s    r   r/   zDDocumentIndexerTestSuite.test_get_with_missing_ids.<locals>.<lambda>   
     r   r1   r3   N)r   r   r5   r4   r   r   r7   r`   retrieved_documentss        r   test_get_with_missing_idsz2DocumentIndexerTestSuite.test_get_with_missing_ids   s     %4)D%4)D
	  ,,y1s#
 
 	
 
 $ii(<=)~>%4)D%4)DC
 
 	
 
r   c                 8    |j                  g d      }|g k(  sJ yz!Test get by IDs with missing IDs.rh   N)r5   ri   s      r   test_get_missingz)DocumentIndexerTestSuite.test_get_missing   s     IIo.	Br   )__name__
__module____qualname____doc__r   rm   fixturer   r   r   r   r:   rK   rQ   rZ   ra   rj   rq   rt   r}   r   r   r   r   r
   r
      s    ^^yd!:;   1m 1 1
 $ >- D 4
M 
d 
*3m 3 3(3= 3T 34
m 
 
 4 
& &4 &

} 
 
$m  r   r
   c                       e Zd ZdZeej                  deedf   fd              Z	deddfdZ
deddfdZdeddfdZdeddfd	Zdeddfd
ZdeddfdZdeddfdZdeddfdZdeddfdZdeddfdZdeddfdZy)AsyncDocumentIndexTestSuiter   r   Nc                    K   ywr   r   r   s    r   r   z!AsyncDocumentIndexTestSuite.index   s     s   r   c                 j   K   t        j                  |j                        }d|j                  vsJ ywr   r   r   s      r   r   z<AsyncDocumentIndexTestSuite.test_upsert_documents_has_no_ids   s.     %%ell3	I00000s   13c                   K   t        dddi      t        dddi      g}|j                  |       d{   }t        |d         }|j                  |       d{   }t        |d	 
      }|d   j                  dk(  r7|d   t        dddi|d         k(  sJ |d   t        dddi|d         k(  sJ y|d   t        dddi|d         k(  sJ |d   t        dddi|d         k(  sJ y7 7 w)r    r!   r"   r#   r$   r'   r(   Nr)   c                     | j                   S r+   r,   r-   s    r   r/   z@AsyncDocumentIndexTestSuite.test_upsert_no_ids.<locals>.<lambda>   r0   r   r1   r   r3   )r   aupsertr4   agetr%   r6   s         r   r:   z.AsyncDocumentIndexTestSuite.test_upsert_no_ids   sD     %4)<%4)<
	 y11Xk*+  **S/)	!)@A++u4#A&("dAY3q6+    $A&("dAY3q6+    $A&("dAY3q6+    $A&("dAY3q6+   % 2 *s"   3C3C/&C3C1BC31C3c                   K   t        t        j                  d            }t        |dddi      t        dddi	      g}|j	                  |       d
{   }|d   }t        t        |      |hz
        d   }|d   g k(  sJ ||v sJ |j                  |       d
{   }|d   }|j                  |k(  r&|t        dddi|      t        dddi|      gk(  sJ y
|t        dddi|      t        dddi|      gk(  sJ y
7 7 fw)r<   r=   r>   r!   r"   r#   r@   r'   r(   r$   Nr)   r   rA   r3   )	rB   rC   rD   r   r   rE   rF   r   r"   rG   s           r   rK   z0AsyncDocumentIndexTestSuite.test_upsert_some_ids  s4    tyyQ'(uayI%4)<
	 y11{#CH:-.q1!R'''3**S/)	aL	<<8#etQiHMetQiHM!   
 etQiHMetQiHM!    2 *s&   ADDADDA%DDc                   K   t        t        j                  d            }t        |dddi      g}|j	                  |       d{   }|d   }|d	   g k(  sJ |j                  |       d{   t        dddi|
      gk(  sJ |j	                  t        |dddi      g       d{    |j                  |g       d{   }|t        dddi|
      gk(  sJ y7 7 s7 97 !w)rM   r=   r>   r!   r'   r#   r@   Nr)   rA   r3   rN   rO   r(   )rB   rC   rD   r   r   r   rP   s         r   rQ   z2AsyncDocumentIndexTestSuite.test_upsert_overwrites  s    tyyQ'(uqzJ
	 y11{#!R'''ZZ_$%5!*J)
 
 	
 

 mm&!MN
 	
 	
  **hZ00	&FA;8L
 
 	
 
 2 %
	
 1sH   AC)C!'C)/C#0;C)+C%,C)C'C)#C)%C)'C)c                    K   |j                  dg       d{   g k(  sJ |j                  dg       d{   }d|v r
|d   dk(  sJ d|v r
|d   dk(  sJ d|v r
|d   g k(  sJ d|v r|d   g k(  sJ yy7 ]7 @w)rS   rT   NrU   r   rV   r)   rA   )r   adeleterX   s      r   rZ   z4AsyncDocumentIndexTestSuite.test_delete_missing_docs4  s     ZZ&&",,, %se 44O+"=1Q666?*"<0A555/)";/2555&"8,222 ' '4s   A:A6A:A8?A:8A:c                 ^  K   t        t        j                  d            }|j                  t	        |di       g       d{   }||gg dk(  sJ |j                  d|g       d{   }d|v r
|d   d	k(  sJ d
|v r
|d
   dk(  sJ d|v r|d   |gk(  sJ d|v r|d   g k(  sJ yy7 e7 Aw)r\   r=   r>   r!   r@   Nr]   r^   rU   r#   rV   r   r)   rA   )rB   rC   rD   r   r   r   r_   s        r   ra   z1AsyncDocumentIndexTestSuite.test_delete_semanticsH  s      tyyQ'( %CD!
 
 
b"IIII %|X.F GGO+"=1Q666?*"<0A555/)";/H:===&"8,222 '%

 Hs%   AB-B)%B-)B+*A B-+B-c                 <  K   t        ddddi      t        ddddi      t        d	d
ddi      g}|j                  |       d{    |j                  ddg       d{    |j                  g d       d{   t        d
ddid	      gk(  sJ y7 O7 67 w)rc   rT   r!   r"   r#   r@   rd   r'   r(   re   rf   rg   Nrh   r3   )r   r   r   r   ri   s      r   rj   z,AsyncDocumentIndexTestSuite.test_bulk_deleteb  s      %4)D%4)D%4)D
	 mmI&&&mmS#J'''ZZ00%4)D5
 
 	
 
 	''0s6   ABBB!B"B<B=BBBc                    K   t        j                  t              5  |j                          d{    ddd       y7 # 1 sw Y   yxY wwrl   )rm   rn   ro   r   rp   s     r   rq   z/AsyncDocumentIndexTestSuite.test_delete_no_argsp  s>     ]]:& 	"--/!!	" 	"!	" 	"s)   AA >A 	AA  A	Ac                 ~   K   |j                  dg       d{    |j                  g d       d{    y7  7 w)rs   rT   Nrh   )r   rp   s     r   rt   z7AsyncDocumentIndexTestSuite.test_delete_missing_contentu  s5     mmSE"""mmO,,, 	#,s   =9=;==c                 6  K   t        ddddi      t        ddddi      g}|j                  |       d	{   }|ddgg d
k(  sJ |j                  g d       d	{   }t        |d       t        dddid      t        dddid      gk(  sJ y	7 ]7 8w)rv   rT   r!   r"   r#   r@   rd   r'   r(   Nr]   rw   c                     | j                   S r+   r,   r-   s    r   r/   zGAsyncDocumentIndexTestSuite.test_get_with_missing_ids.<locals>.<lambda>  rz   r   r1   r3   )r   r   r   r4   r{   s        r   r}   z5AsyncDocumentIndexTestSuite.test_get_with_missing_idsz  s      %4)D%4)D
	 !&i 88s#
 
 	
 
 %*JJ/C$DD)~>%4)D%4)DC
 
 	
 
 9
 Es!   5BB&BB7BBc                 T   K   |j                  g d       d{   }|g k(  sJ y7 wr   )r   ri   s      r   r   z,AsyncDocumentIndexTestSuite.test_get_missing  s*       **_55	B 6s   (&()r   r   r   r   r   rm   r   r   r   r   r   r:   rK   rQ   rZ   ra   rj   rq   rt   r}   r   r   r   r   r   r      s	    ^^^M4,?@   1M 1d 1
m  > $ 4
- 
D 
.3M 3d 3(3 34 34
M 
d 
"} " "
-} - -

] 
t 
$M d r   r   )r   r   rC   abcr   r   typingr   r   rm   langchain_core.documentsr   langchain_core.indexing.baser   r
   r   r   r   r   <module>r      s>      # ,  - 6{s {|}# }r   