
    Wid                    >   d Z ddlmZ ddlZddlmc mZ ddl	Z	ddl
Z
ddlmZ ddlmZmZ ddlmZ ddlmZmZmZmZmZ ddlmZmZmZ dd	lmZmZ ddlZe
j>                  jA                  d e! ee"      jF                  jF                  jF                               dd
l$m%Z%m&Z&m'Z' ddl(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z. de'j^                  ddddf	 	 	 	 	 	 	 	 	 	 	 	 	 d,dZ0d-d.dZ1d-d/dZ2d0d1dZ3de'j^                  fd2dZ4e%jj                  df	 	 	 	 	 d3dZ6de'j^                  e%jj                  dddf	 	 	 	 	 	 	 	 	 	 	 	 	 d4dZ7 G d d      Z8 G d d      Z9 G d d      Z: G d d      Z; G d  d!      Z< G d" d#      Z= G d$ d%      Z> G d& d'      Z? G d( d)      Z@ G d* d+      ZAy)5u  RLM Neo-Cortex -- Module 1: Memory Gateway Integration Tests.

Story 1.10: Full CRUD cycle, dedup, tenant isolation, quota enforcement,
surprise tier routing, and health endpoint. All backends are mocked for
CI reproducibility — no live Elestio connections required.

Test coverage:
    Story 1.01 -- Constructor + initialize (BB + WB)
    Story 1.02 -- write_memory core path (BB + WB)
    Story 1.03 -- read_memories + search_memories (BB + WB)
    Story 1.04 -- delete_memory (BB + WB)
    Story 1.05 -- Content hash deduplication (BB + WB)
    Story 1.06 -- health_check (BB + WB)
    Story 1.07 -- Quota enforcement (BB + WB)
    Story 1.08 -- Embedding generation (BB + WB)
    Story 1.09 -- FastAPI router endpoints (BB + WB)
    Story 1.10 -- Integration: full CRUD + isolation + quota + routing

VERIFICATION_STAMP
Story: 1.10
Verified By: parallel-builder
Verified At: 2026-02-26T10:00:00Z
Tests: see results below
Coverage: >=85%
    )annotationsN)asynccontextmanager)UTCdatetime)Path)AnyAsyncGeneratorDictListOptional)	AsyncMock	MagicMockpatch)UUIDuuid4)CustomerTierMemoryRecord
MemoryTier)GatewayNotInitializedErrorMemoryGatewayPartialDeleteErrorQuotaExceededError_compute_hash_normalise_content?zImportant business insightztest-memory-001   c                v    t        | xs
 t               |dd||ddit        j                  t              ||
      S )z*Create a minimal MemoryRecord for testing.testsalescontent_hashabc123)
	tenant_idcontentsourcedomainsurprise_scorememory_tiermetadata
created_at	vector_idpg_id)r   r   r   nowr   )r"   tierr&   r#   	memory_idr+   s         //mnt/e/genesis-system/tests/rlm/test_gateway.py_make_recordr0   9   sD     &uw% (+<<$     c                t   t               }t               }| r| d   }t        |      |_        nt        d      |_        t        | xs g       |_        t        d      |_        t        d      |_        t        |      |_        t        d      |_        t        |      |_        t               |_	        |S )z"Build a minimal fake asyncpg pool.r   return_valueN*   zDELETE 1F)
r   r   fetchrowfetchfetchvalexecute
__aenter__	__aexit__acquireclose)rowspoolconnrows       r/   
_fake_poolrB   P   s    ;D;D 1g!s3!t4 
3DJ 2.DM *5DL  T2DOE2DN$/DLDJKr1   c                    t               }t        t        g             |_        t               |_        t               |_        t               |_        t        | xs g       |_        t               |_        |S )z)Build a minimal fake Qdrant async client.collectionsr3   )r   r   get_collectionscreate_collectionupsertdeletesearchr=   )hitsqdrants     r/   _fake_qdrantrM   n   sZ    [F&2.F  ){FKFMKFM4:26FM;FLMr1   c                $   t               }t        d      |_        t        | rt        |       nd      |_        t        d      |_        t        | dz         |_        t        d      |_        t        d      |_        t               |_        |S )z(Build a minimal fake Redis async client.Tr3   Nr   )	r   pingstrgetsetincrexpirerI   aclose)quotarediss     r/   _fake_redisrX   |   sk    KE-EJUs5zEEIt,EI	2EJ$/EL!,EL;ELLr1   c                @    t               }t        | |f      |_        |S )zABuild a fake SurpriseIntegration that always returns fixed score.r3   )r   score_content)scorer-   surprises      r/   _fake_surpriser]      s    {H&UDMBHOr1   Tc                   ddl m} t               } |t               | | t        j
                  k(  rdnd      }t        |      |_        t        |      |_        t        d      |_        t               |_	        t               |_
        |S )zBuild a fake EntitlementLedger.r   EntitlementManifest    r"   r-   max_memories_per_dayr3   r   )core.rlm.contractsr`   r   r   r   PROFESSIONALget_manifestcheck_quotaincrement_quotaconnectr=   )r-   quota_okr`   ledgermanifests        r/   _fake_ledgerrn      sr    
 7[F"'%)\-F-F%FTCH
 $:F"9F&A6F[FN;FLMr1   c                   K   t        ddd      }t        |      |_        t        |      |_        t        |      |_        t        | |      |_        t        |      |_
        d|_        |S w)z/Build a MemoryGateway with all backends mocked.postgresql://fake/testhttp://localhost:6333redis://localhost:6379pg_dsn
qdrant_url	redis_urlT)r   rB   _pg_poolrM   _qdrantrX   _redisr]   	_surprisern   _ledger_initialized)r[   r-   customer_tierrV   pg_rowsqdrant_hitsgws          r/   _build_gatewayr      sg      
'**
B W%BKk*BJE"BI!%.BLm,BJBOIs   A)A+c                  4   e Zd ZdZej
                  j                  d        Zd Zej
                  j                  d        Z	ej
                  j                  d        Z
d Zej
                  j                  d        Zej
                  j                  d        Zy	)
TestStory101Constructorz=BB + WB tests for MemoryGateway constructor and initialize().c                &  K   |j                  dd       |j                  dd       |j                  dd       t               }t        j                  t        d      5  |j                          d {    d d d        y 7 # 1 sw Y   y xY ww)NDATABASE_URLFraising
QDRANT_URL	REDIS_URLmatch)delenvr   pytestraises
ValueError
initializeselfmonkeypatchr   s      r/   (test_bb01_no_env_vars_raises_value_errorz@TestStory101Constructor.test_bb01_no_env_vars_raises_value_error   s     >59<7;6_]]:^< 	"--/!!	" 	"!	" 	"s0   AB!B5B6B:	BBB
Bc                   t        ddd      }|j                  }d}||u }|st        j                  d|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      d	z  }d
d|iz  }t        t        j                  |            d x}x}}y )Npostgresql://x/yhttp://q	redis://rrs   Fisz6%(py2)s
{%(py2)s = %(py0)s.is_initialized
} is %(py5)sr   py0py2py5assert %(py7)spy7)
r   is_initialized
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationr   r   @py_assert1@py_assert4@py_assert3@py_format6@py_format8s          r/   &test_bb02_explicit_dsn_not_initializedz>TestStory101Constructor.test_bb02_explicit_dsn_not_initialized   s    %!!

   )E) E)))) E))))))r)))r))) )))E)))))))r1   c                \   K   t        ddd      }|j                          d {    y 7 w)Nr   r   r   rs   )r   r=   r   r   s     r/   *test_bb03_close_before_initialize_no_errorzBTestStory101Constructor.test_bb03_close_before_initialize_no_error   s*     %!!

 hhjs   ",*,c                R  K   t                d {   }|j                  }d }||u}|st        j                  d|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}|j                  }d}||u }|st        j                  d|fd	||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}y 7 w)
N)is not)z4%(py2)s
{%(py2)s = %(py0)s._pg_pool
} is not %(py5)sr   r   r   r   Tr   r   )r   rw   r   r   r   r   r   r   r   r   r   r   s          r/   &test_wb01_pg_pool_set_after_initializez>TestStory101Constructor.test_wb01_pg_pool_set_after_initialize   s     !##{{&$&{$&&&&{$&&&&&&r&&&r&&&{&&&$&&&&&&&  (D( D(((( D((((((r(((r((( (((D((((((( $s   F'F$FF'c                   |j                  dd       t               }|j                  }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}y )	Nr   zpostgresql://env/db==)z/%(py2)s
{%(py2)s = %(py0)s._pg_dsn
} == %(py5)sr   r   r   r   )setenvr   _pg_dsnr   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   r   s           r/   "test_wb02_pg_dsn_falls_back_to_envz:TestStory101Constructor.test_wb02_pg_dsn_falls_back_to_env   s    >+@A_zz222z22222z2222222r222r222z22222222222r1   c                $  K   |j                  dd       |j                  dd       |j                  dd       t               }t        j                  t
        d      5  |j                          d {    d d d        y 7 # 1 sw Y   y xY ww)Nr   r   r   Fr   r   r   r   r   r   r   r   r   r   r   s      r/   #test_wb03_missing_qdrant_url_raisesz;TestStory101Constructor.test_wb03_missing_qdrant_url_raises   s~     >+=><7;6_]]:\: 	"--/!!	" 	"!	" 	"s0   AB B4B5B9	BBB	Bc                "  K   |j                  dd       |j                  dd       |j                  dd       t               }t        j                  t
        d      5  |j                          d {    d d d        y 7 # 1 sw Y   y xY ww)	Nr   r   r   r   r   Fr   r   r   r   s      r/   "test_wb04_missing_redis_url_raisesz:TestStory101Constructor.test_wb04_missing_redis_url_raises   s{     >+=><4;6_]]:[9 	"--/!!	" 	"!	" 	"s0   ABB3B4B8	BBBBN)__name__
__module____qualname____doc__r   markasyncior   r   r   r   r   r   r    r1   r/   r   r      s    G [[" "* [[  [[) )3 [[" " [[" "r1   r   c                     e Zd ZdZej
                  j                  d        Zej
                  j                  d        Zej
                  j                  d        Z	ej
                  j                  d        Z
ej
                  j                  d        Zej
                  j                  d        Zej
                  j                  d        Zej
                  j                  d	        Zy
)TestStory102WriteMemoryz!BB + WB tests for write_memory().c                   K   t        ddd      }t        j                  t              5  |j	                  t               ddd       d {    d d d        y 7 # 1 sw Y   y xY ww)Nr   r   r   rs   some contentsrcr%   )r   r   r   r   write_memoryr   r   s     r/    test_bb01_not_initialized_raisesz8TestStory102WriteMemory.test_bb01_not_initialized_raises  sd     %!!

 ]]56 	L//%'>5(KKK	L 	LK	L 	Ls.   (A& A
AA	A&AA#A&c                H  K   t        dt        j                         d {   }|j                  t	               ddd       d {   }|j
                  }t        j                  }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      d	t        j                         v st        j                  t              rt        j                  t              nd	t        j                  |      d
z  }dd|iz  }t        t        j                  |            d x}x}}|j                  j                         j                   j#                          y 7 {7 Zw)N皙?r[   r-   zlow signal noiser   r   r   zP%(py2)s
{%(py2)s = %(py0)s.memory_tier
} == %(py6)s
{%(py6)s = %(py4)s.DISCARD
}recordr   r   r   py4py6assert %(py8)spy8)r   r   DISCARDr   r   r'   r   r   r   r   r   r   r   r   rw   r<   r:   assert_not_awaitedr   r   r   r   @py_assert5r   @py_format7@py_format9s           r/   !test_bb02_discard_tier_not_storedz9TestStory102WriteMemory.test_bb02_discard_tier_not_stored  s     !:3E3EFFuw0BE6RR!!7Z%7%77!%77777!%7777777v777v777!777777Z777Z777%77777777
((;;=	 GRs"   F"F#F"FEF"F"c                R  K   t        dt        j                         d {   }t        d       |_        t               |_        t        d      |_        t               |_        t               |_        |j                  t               ddd       d {   }|j                  }t        j                  }||k(  }|st        j                  d|fd	||f      d
t        j                         v st        j                   |      rt        j"                  |      nd
t        j"                  |      dt        j                         v st        j                   t              rt        j"                  t              ndt        j"                  |      dz  }dd|iz  }t%        t        j&                  |            d x}x}}|j
                  j)                          |j                  j+                          |j                  j+                          |j                  j+                          y 7  7 w)Ng?r   r3   c   zmedium content herer   domr   )zP%(py2)s
{%(py2)s = %(py0)s.memory_tier
} == %(py6)s
{%(py6)s = %(py4)s.WORKING
}r   r   r   r   r   )r   r   WORKINGr   _find_by_hash_write_working	_write_pg_write_qdrant_write_hot_cacher   r   r'   r   r   r   r   r   r   r   r   assert_awaited_oncer   r   s           r/   (test_bb03_working_tier_stored_redis_onlyz@TestStory102WriteMemory.test_bb03_working_tier_stored_redis_only   s[    !:3E3EFF$$7 &K b1$;'kuw0EueTT!!7Z%7%77!%77777!%7777777v777v777!777777Z777Z777%77777777
--/
'')
++-
..0 G Us#   H'H!A2H'H$FH'$H'c                |  K   t        dt        j                         d {   }t        d       |_        t        dgdz        |_        t               |_        t        d      |_        t               |_        t               |_	        |j                  t               ddd	       d {   }|j                  }t        j                  }||k(  }|st        j                  d
|fd||f      dt        j                          v st        j"                  |      rt        j$                  |      ndt        j$                  |      dt        j                          v st        j"                  t              rt        j$                  t              ndt        j$                  |      dz  }dd|iz  }t'        t        j(                  |            d x}x}}|j                  j+                          |j                  j+                          |j                  j-                          |j                  j-                          y 7 7 w)Nr   r   r3   r      r   zgood episodic content herer   r   r   zQ%(py2)s
{%(py2)s = %(py0)s.memory_tier
} == %(py6)s
{%(py6)s = %(py4)s.EPISODIC
}r   r   r   r   r   )r   r   EPISODICr   r   _embedr   r   r   r   r   r   r'   r   r   r   r   r   r   r   r   r   r   r   s           r/   ,test_bb04_episodic_tier_writes_pg_and_qdrantzDTestStory102WriteMemory.test_bb04_episodic_tier_writes_pg_and_qdrant3  sl    !:3F3FGG$$7C53;7	%K a0$;'kuw0LeUZ[[!!8Z%8%88!%88888!%8888888v888v888!888888Z888Z888%88888888
((*
,,.
,,.
..0 H \s#   H<H6BH<)H9*FH<9H<c                H  K   t        dt        j                         d {   }t        d       |_        t        dgdz        |_        t               |_        t        d      |_        t               |_        t               |_	        |j                  t               ddd	       d {   }|j                  }t        j                  }||k(  }|st        j                  d
|fd||f      dt        j                          v st        j"                  |      rt        j$                  |      ndt        j$                  |      dt        j                          v st        j"                  t              rt        j$                  t              ndt        j$                  |      dz  }dd|iz  }t'        t        j(                  |            d x}x}}|j                  j+                          |j                  j+                          |j                  j+                          y 7 7 vw)Ng?r   r3   r   r   r   zvery high signal axiom levelr   r   r   zQ%(py2)s
{%(py2)s = %(py0)s.memory_tier
} == %(py6)s
{%(py6)s = %(py4)s.SEMANTIC
}r   r   r   r   r   )r   r   SEMANTICr   r   r   r   r   r   r   r   r   r'   r   r   r   r   r   r   r   r   r   r   s           r/   1test_bb05_semantic_tier_writes_all_three_backendszITestStory102WriteMemory.test_bb05_semantic_tier_writes_all_three_backendsE  s[    !:3F3FGG$$7C53;7	%K a0$;'kuw0NPUW\]]!!8Z%8%88!%88888!%8888888v888v888!888888Z888Z888%88888888
((*
,,.
//1 H ^s#   H"HBH")H*E3H"H"c                Z  K   t        dt        j                  d       d {   }t        d      |_        t        d      |_        t        t        t        j                  d            |j                  _
        t        j                  t              5 }|j                  t               ddd	       d {    d d d        j                   }|j"                  }d}||k(  }|st%        j&                  d
|fd||f      dt)        j*                         v st%        j,                  |      rt%        j.                  |      ndt%        j.                  |      t%        j.                  |      t%        j.                  |      dz  }dd|iz  }t1        t%        j2                  |            d x}x}x}}|j                   }|j4                  }d}||k(  }|st%        j&                  d
|fd||f      dt)        j*                         v st%        j,                  |      rt%        j.                  |      ndt%        j.                  |      t%        j.                  |      t%        j.                  |      dz  }dd|iz  }t1        t%        j2                  |            d x}x}x}}y 7 v7 # 1 sw Y   xY ww)Nr   rb   )r[   r-   rV   Fr3   )r-   rd   valid content herer   r   r   zH%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.value
}.limit
} == %(py7)sexc_infor   r   r   r   assert %(py9)spy9zJ%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.value
}.current
} == %(py7)s)r   r   r   r   _check_quota_get_quota_countr   r   STARTERr{   rg   r   r   r   r   r   valuelimitr   r   r   r   r   r   r   r   current)	r   r   r   r   r   @py_assert6r   r   @py_format10s	            r/   test_bb06_quota_exceeded_errorz6TestStory102WriteMemory.test_bb06_quota_exceeded_errorV  s    !:3F3FcRR#7'S9"+"(<(<SVW#


 ]]-. 	O(//%'+?NNN	O~~*~##*s*#s****#s******x***x***~***#***s*******~~,~%%,,%,,,,%,,,,,,x,,,x,,,~,,,%,,,,,,,,,, S O	O 	Os;    J+JA3J+ J6J7J;GJ+JJ(#J+c                  K   t        dt        j                         d {   }t        d       |_        t        dgdz        |_        t        d      |_        t               |_        t               |_        |j                  t               ddd	       d {    |j                  j                          y 7 7 !w)
Nr   r   r3   r   r   r   zvalid content to storer   r   )r   r   r   r   r   r   r   r   _increment_quotar   r   r   r   s     r/   &test_wb01_quota_incremented_on_successz>TestStory102WriteMemory.test_wb01_quota_incremented_on_successf  s     !:3F3FGG$$7C53;7	 a0$;'kooeg'?NNN
//1 H 	Os"   B>B:A8B>B< B><B>c                  K   t        dt        j                         d {   }t        d       |_        t        dgdz        |_        t        d      |_        t               |_        t               }|j                  |ddd	       d {    |j                  j                  j                  ddd	       y 7 7 .w)
Nr   r   r3   r   r   r   zbusiness insight contentvoice_agentr   )r   r   r   r   r   r   r   r   r   r   rz   rZ   assert_called_once_with)r   r   tids      r/   +test_wb02_surprise_called_with_correct_argszCTestStory102WriteMemory.test_wb02_surprise_called_with_correct_argss  s     !:3F3FGG$$7C53;7	 a0$;gooc#=}gVVV
""::&w	
 H 	Ws"   B>B:A+B>B<-B><B>N)r   r   r   r   r   r   r   r   r   r   r   r   r  r
  r  r   r1   r/   r   r     s    + [[L L [[> > [[1 1$ [[1 1" [[2 2  [[- - [[	2 	2 [[
 
r1   r   c                     e Zd ZdZej
                  j                  d        Zej
                  j                  d        Zej
                  j                  d        Z	ej
                  j                  d        Z
ej
                  j                  d        Zej
                  j                  d        Zej
                  j                  d        Zy	)
TestStory103ReadSearchz8BB + WB tests for read_memories() and search_memories().c                  K   t                d {   }|j                  t               d       d {   }g }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }dd|iz  }t        t        j                  |            d x}}y 7 7 wN r   z%(py0)s == %(py3)sresultr   py3assert %(py5)sr   )r   read_memoriesr   r   r   r   r   r   r   r   r   r   r   r  @py_assert2r   @py_format4r   s          r/   (test_bb01_empty_query_read_returns_emptyz?TestStory103ReadSearch.test_bb01_empty_query_read_returns_empty  s     !##''44v|vvv $4    C"C!C"C B,C" C"c                  K   t                d {   }|j                  t               d       d {   }g }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }dd|iz  }t        t        j                  |            d x}}y 7 7 wr  )r   search_memoriesr   r   r   r   r   r   r   r   r   r  s          r/   *test_bb02_empty_query_search_returns_emptyzATestStory103ReadSearch.test_bb02_empty_query_search_returns_empty  s     !##))%'266v|vvv $6r  c                  K   dddddddt        j                  i       t        j                  t              dd
}t        |g	       d {   }t               }t               }t        |g
      |_        t        |
      |_	        t        d
      |_
        t        |
      |j                  _        |j                  |d       d {   }t        |      }d}||k(  }|st!        j"                  d|fd||f      dt%        j&                         v st!        j(                  t              rt!        j*                  t              nddt%        j&                         v st!        j(                  |      rt!        j*                  |      ndt!        j*                  |      t!        j*                  |      dz  }	dd|	iz  }
t-        t!        j.                  |
            d x}x}}|d   }|j0                  }d}||k(  }|st!        j"                  d|fd||f      t!        j*                  |      t!        j*                  |      t!        j*                  |      dz  }	dd|	iz  }
t-        t!        j.                  |
            d x}x}x}}y 7 57 w)Nr   mem-001zMy test memory contentvoicer         ?episodic
idr.   r#   r$   r%   r&   r'   r(   r)   r*   )r~   r3   Fzsales insightsr   z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)slenresultsr   py1r  r   r   r   r   z/%(py3)s
{%(py3)s = %(py1)s.content
} == %(py6)sr.  r  r   )jsondumpsr   r,   r   r   r   r   r7   r:   r;   r   rw   r<   r  r+  r   r   r   r   r   r   r   r   r#   )r   rA   r   r  r@   r,  r  r   r   r   r   @py_assert0s               r/   'test_bb03_read_memories_returns_pg_rowsz>TestStory103ReadSearch.test_bb03_read_memories_returns_pg_rows  s     "/"%

2",,s+"
 "3%00g{SE2
#6"6'T:((.>??7| q |q    |q      s   s      7   7   |   q       qz=z!!=%==!%=====!%====z===!===%======== 1 @s&   AJ
I?A<JJF8JJc           
       K   t               }d|_        t        t                     dddddi t	        j
                  t              j                         d|_        t        |g       d {   }t               }t        d	gd
z        |_        |j                  |d       d {   }t        |      }d}||k(  }|st        j                  d|fd||f      dt!        j"                         v st        j$                  t              rt        j&                  t              nddt!        j"                         v st        j$                  |      rt        j&                  |      ndt        j&                  |      t        j&                  |      dz  }dd|iz  }	t)        t        j*                  |	            d x}x}}|d   }
|
j,                  }d}||k(  }|st        j                  d|fd||f      t        j&                  |
      t        j&                  |      t        j&                  |      dz  }dd|iz  }	t)        t        j*                  |	            d x}
x}x}}|d   }
|
j.                  }t0        j2                  }||k(  }|st        j                  d|fd||f      t        j&                  |
      t        j&                  |      dt!        j"                         v st        j$                  t0              rt        j&                  t0              ndt        j&                  |      dz  }dd|iz  }t)        t        j*                  |            d x}
x}x}}y 7 7 w)Nzvec-001zQdrant search resultapifinanceg=
ףp=?semanticr"   r#   r$   r%   r&   r'   r(   r)   )r   r   r   r3   zfinance insightsr   r   r*  r+  r,  r-  r   r   r   r/  r0  )zQ%(py3)s
{%(py3)s = %(py1)s.memory_tier
} == %(py7)s
{%(py7)s = %(py5)s.SEMANTIC
}r   r.  r  r   r   r   r   )r   r)  rP   r   r   r,   r   	isoformatpayloadr   r   r   r!  r+  r   r   r   r   r   r   r   r   r#   r'   r   r   )r   hitr   r  r,  r  r   r   r   r   r3  r  r   r  s                 r/   *test_bb04_search_memories_maps_qdrant_hitszATestStory103ReadSearch.test_bb04_search_memories_maps_qdrant_hits  s    kUW-"%",,s+557	
 "se44gC53;7	**30BCC7| q |q    |q      s   s      7   7   |   q       qz;z!!;%;;!%;;;;;!%;;;;z;;;!;;;%;;;;;;;;qz<z%%<)<)<<%)<<<<<%)<<<<z<<<%<<<<<<<<<<<<)<<<<<<<< 5 Ds%   A(M*M+8M#M$J1MMc           	       K   t                d{   }t               }t               }t        g       |_        t        |      |_        t        d      |_        t        |      |j                  _        |j                  |d       d{    |j                  j                  }g }t        |      }|d   d   }||v }|}	|s!t        |      }
|d   }t        |      }|
|v }|}	|	spt        j                  d|fd||f      dt        j                         v st        j                   t              rt        j"                  t              ndd	t        j                         v st        j                   |      rt        j"                  |      nd	t        j"                  |      t        j"                  |      d
z  }dd|iz  }|j%                  |       |sFt        j                  dfd
f      dt        j                         v st        j                   t              rt        j"                  t              ndd	t        j                         v st        j                   |      rt        j"                  |      nd	t        j"                  |
      dt        j                         v st        j                   t              rt        j"                  t              ndt        j"                        t        j"                  |      dz  }dd|iz  }|j%                  |       t        j&                  |d      i z  }dd|iz  }t)        t        j*                  |            dx}	x}x}x}x}x}
x}x}}y7 [7 w)z=read_memories always passes tenant_id to the PG WHERE clause.Nr3   Fanythingr   in)z0%(py5)s
{%(py5)s = %(py2)s(%(py3)s)
} in %(py8)srP   r  )r   r  r   r   z%(py10)spy10)zV%(py15)s
{%(py15)s = %(py12)s(%(py13)s)
} in %(py21)s
{%(py21)s = %(py17)s(%(py19)s)
})py12py13py15py17py19py21z%(py23)spy23r   zassert %(py26)spy26)r   r   r   r7   r:   r;   r   rw   r<   r  	call_argsrP   r   r   r   r   r   r   append_format_boolopr   r   )r   r   r  r@   rL  r   r   @py_assert7r  r3  @py_assert14@py_assert18@py_assert20@py_assert16r   @py_format11@py_format22@py_format24@py_format25@py_format27s                       r/   test_bb05_read_tenant_isolationz6TestStory103ReadSearch.test_bb05_read_tenant_isolation  s     "##g{B/
#6"6'T:sJ///JJ((	Ks3xK9Q<?Kx?*Kc#hKilK#l:KKh:K.KKKKKx?KKKKKKsKKKsKKKKKK3KKK3KKKxKKK?KKKKKKKh:KKKKKKKcKKKcKKKKKK#KKK#KKKhKKKKKK#KKK#KKKlKKK:KKKKKKKKKKKKKKKK $ 	0s#   M1M+A;M1M.KM1.M1c                `  K   t                d {   }t               }t        g       |_        t        |      |_        t        d      |_        t        |      |j                  _        |j                  t               d       d {    |j                  j                          y 7 7 !w)Nr3   Fz
test query)r   r   r7   r:   r;   r   rw   r<   r  r   r   r   r   r@   s      r/   (test_wb01_pg_pool_acquire_called_on_readz?TestStory103ReadSearch.test_wb01_pg_pool_acquire_called_on_read  s     !##{B/
#6"6'T:uw555

&&( $ 	6s"   B.B*A9B.
B, B.,B.c                  K   t                d {   }t        dgdz        |_        t        g       |j                  _        |j                  t               d       d {    |j                  j                  d       y 7 r7 "w)Nr   r   r3   zmy query)r   r   r   rx   rJ   r!  r   assert_awaited_once_withr   s     r/   test_wb02_search_calls_embedz3TestStory103ReadSearch.test_wb02_search_calls_embed  si     !##C53;7	%26

  *555
		**:6 $ 	6s"   BBAB"B#!BBN)r   r   r   r   r   r   r   r  r"  r4  r>  rY  r\  r_  r   r1   r/   r  r    s    B [[  [[  [[> >6 [[= =. [[L L" [[	) 	) [[7 7r1   r  c                  `   e Zd ZdZej
                  j                  d        Zej
                  j                  d        Zej
                  j                  d        Z	ej
                  j                  d        Z
ej
                  j                  d        Zej
                  j                  d        Zy)	TestStory104DeleteMemoryz"BB + WB tests for delete_memory().c                  K   t                d {   }t        d      |_        |j                  t	               d       d {   }d}||u }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }dd	|iz  }t        t        j                  |            d x}}y 7 7 w)
NFr3   znonexistent-idr   z%(py0)s is %(py3)sr  r  r  r   )r   r   _pg_ownsdelete_memoryr   r   r   r   r   r   r   r   r   r  s          r/   $test_bb01_returns_false_if_not_foundz=TestStory104DeleteMemory.test_bb01_returns_false_if_not_found  s     !##U3''1ABBvvvv	 $ Cs"   C2C.2C2C0B+C20C2c                  K   t                d {   }t        d      |_        t        d      |_        t        d      |_        t        d      |_        |j                  t               d       d {   }d}||u }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }d	d
|iz  }t        t        j                  |            d x}}|j                  j!                          y 7 +7 ǭw)NFr3   Tzmem-from-other-tenantr   rc  r  r  r  r   )r   r   rd  
_pg_delete_qdrant_delete_redis_delete_memoryre  r   r   r   r   r   r   r   r   r   r   r  s          r/   +test_bb02_cross_tenant_delete_returns_falsezDTestStory104DeleteMemory.test_bb02_cross_tenant_delete_returns_false  s     !##U3!u5%59"+">''1HIIvvvv
((* $ Js#   E D;A%E 6D>7CE >E c                P  K   t                d {   }t        d      |_        t        d      |_        t        d      |_        t        d      |_        |j                  t               d       d {   }d}||u }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }dd	|iz  }t        t        j                  |            d x}}y 7 7 w)
NTr3   r$  r   rc  r  r  r  r   )r   r   rd  rh  ri  rj  re  r   r   r   r   r   r   r   r   r   r  s          r/   (test_bb03_successful_delete_returns_truezATestStory104DeleteMemory.test_bb03_successful_delete_returns_true  s     !##T2!t4%48"+">'';;v~vvv $ <s#   D&D!A%D&6D$7B+D&$D&c                4  K   t                d {   }t        d      |_        t        d      |_        t        d      |_        t        d      |_        t        j                  t              5 }|j                  t               d       d {    d d d        d}j                  }|j                  }||v }|st        j                  d|fd||f      t        j                  |      dt!        j"                         v st        j$                  |      rt        j                  |      ndt        j                  |      t        j                  |      d	z  }d
d|iz  }t'        t        j(                  |            d x}x}x}}y 7 w7 # 1 sw Y   xY ww)NTr3   Fr$  
postgresqlrA  )zR%(py1)s in %(py7)s
{%(py7)s = %(py5)s
{%(py5)s = %(py3)s.value
}.backends_failed
}r   r:  r   r   )r   r   rd  rh  ri  rj  r   r   r   re  r   r  backends_failedr   r   r   r   r   r   r   r   )	r   r   r   r3  r   r  r  r   r  s	            r/   ,test_bb04_partial_delete_error_on_pg_failurezETestStory104DeleteMemory.test_bb04_partial_delete_error_on_pg_failure   s    !##T2!u5%48"+">]]-. 	7(""57I666	7=x~~=~===|=====|====|======x===x===~=========== $ 7	7 	7s;   FFA!F2FF
FC3F
FFFc                   	K   t                d {   }g 	t        	fd      |_        t        	fd      |_        |j	                  t               d       d {    	d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      d	z  }d
d|iz  }t        t        j                  |            d x}x}}d}|	v}|st        j                  d|fd|	f      t        j                  |      dt        j                         v st        j                  	      rt        j                  	      nddz  }dd|iz  }t        t        j                  |            d x}}y 7 w7 .w)Nc                .    j                  d      xs dS )NownsFrM  r  midcallss     r/   <lambda>zITestStory104DeleteMemory.test_wb01_pg_owns_called_first.<locals>.<lambda>1  s    U\\&=Q=ZUZ r1   side_effectc                &    j                  d      S )NrI   ru  rv  s     r/   ry  zITestStory104DeleteMemory.test_wb01_pg_owns_called_first.<locals>.<lambda>2  s    u||H?U r1   zany-idr   rt  r   z%(py1)s == %(py4)sr.  r   assert %(py6)sr   rI   )not in)z%(py1)s not in %(py3)srx  r.  r  r  r   )r   r   rd  rh  re  r   r   r   r   r   r   r   r   r   )
r   r   r3  r   r  @py_format5r   r  r   rx  s
            @r/   test_wb01_pg_owns_called_firstz7TestStory104DeleteMemory.test_wb01_pg_owns_called_first-  s     !##,Z[!.UVuw111Qx!6!x6!!!!x6!!!x!!!6!!!!!!!$xu$$$$xu$$$x$$$$$$u$$$u$$$$$$$ $
 	2s#   FFAFFD+FFc                  K   t                d {   }t        d      |_        t        d      |_        t        d      |_        t        d      |_        |j                  t               d       d {    |j                  j                          |j                  j                          |j
                  j                          y 7 7 Uw)NTr3   r$  )	r   r   rd  rh  ri  rj  re  r   r   r   s     r/   (test_wb02_all_backends_called_on_successzATestStory104DeleteMemory.test_wb02_all_backends_called_on_success9  s     !##T2!t4%48"+">uw	222
))+
--/
335 $ 	3s#   CC
A%C6C7ACCN)r   r   r   r   r   r   r   rf  rk  rm  rq  r  r  r   r1   r/   ra  ra    s    , [[  [[
+ 
+ [[  [[	> 	> [[% % [[
6 
6r1   ra  c                  l    e Zd ZdZd Zd Zd Zd Zej                  j                  d        Zd Zd Zy	)
TestStory105Dedupz-BB + WB tests for content hash deduplication.c                   t               }t        |d      }t        |d      }||k(  }|st        j                  d|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      nddt	        j
                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }t        t        j                  |            d }y )	NHello worldr   z%(py0)s == %(py2)sh1h2r   r   assert %(py4)sr   
r   r   r   r   r   r   r   r   r   r   r   r  r  r  r   @py_format3r  s          r/   ,test_bb01_same_content_same_tenant_same_hashz>TestStory105Dedup.test_bb01_same_content_same_tenant_same_hashO  l    g3.3.RxrRrrRRr1   c                   t               }t               }t        |d      }t        |d      }||k7  }|st        j                  d|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      nddt	        j
                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }t        t        j                  |            d }y )	Nr  )!=)z%(py0)s != %(py2)sr  r  r  r  r   r  )r   tid1tid2r  r  r   r  r  s           r/   6test_bb02_same_content_different_tenant_different_hashzHTestStory105Dedup.test_bb02_same_content_different_tenant_different_hashV  ss    ww4/4/RxrRrrRRr1   c                   t               }t        |d      }t        |d      }||k(  }|st        j                  d|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      nddt	        j
                         v st        j                  |      rt        j                  |      nddz  }dd	|iz  }t        t        j                  |            d }y )
NHello Worldhello worldr   r  r  r  r  r  r   r  r  s          r/    test_bb03_case_insensitive_dedupz2TestStory105Dedup.test_bb03_case_insensitive_dedup^  r  r1   c                   t               }t        |d      }t        |d      }||k(  }|st        j                  d|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      nddt	        j
                         v st        j                  |      rt        j                  |      nddz  }dd	|iz  }t        t        j                  |            d }y )
NzHello   Worldr  r   r  r  r  r  r  r   r  r  s          r/   test_bb04_whitespace_collapsedz0TestStory105Dedup.test_bb04_whitespace_collapsede  sl    g303.RxrRrrRRr1   c                  K   t        d      }t        dt        j                         d {   }t	        |      |_        |j                  t               ddd       d {   }|j                  }d}||k(  }|st        j                  d	|fd
||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                   |            d x}x}}t	               |_        y 7 7 ߭w)Nzexisting-001r.   r   r   r3   zBusiness insight contentr   r   r   z1%(py2)s
{%(py2)s = %(py0)s.vector_id
} == %(py5)sr   r   r   r   )r0   r   r   r   r   r   r   r   r*   r   r   r   r   r   r   r   r   r   )	r   existingr   r   r   r   r   r   r   s	            r/   *test_bb05_duplicate_write_returns_existingz<TestStory105Dedup.test_bb05_duplicate_write_returns_existingl  s     .9!:3F3FGG$(;G/
 
 1>1>1111>111111v111v111111>1111111K	 H
s"   +ED?4E"E#CEEc                   d}t        |      }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j
                  t               rt        j                  t               ndt        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}x}}y )	Nz  Hello   World  r  r   )z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py7)sr   r   r   r   )	r   r   r   r   r   r   r   r   r   )r   r   r   r  r   r   r  s          r/   test_wb01_normalise_contentz-TestStory105Dedup.test_wb01_normalise_contentz  s    "5G!"56G-G6-GGGG6-GGGGGG!GGG!GGG"5GGG6GGG-GGGGGGGr1   c                   t        t               d      }t        |      }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd	|iz  }t        t        j                  |            d x}x}}d
 |D        }t        |      }|sddt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      dz  }	t        t        j                  |	            d x}}y )Nr   @   r   r*  r+  hr-  r   r   c              3  $   K   | ]  }|d v  
 yw)0123456789abcdefNr   ).0cs     r/   	<genexpr>zATestStory105Dedup.test_wb02_hash_is_sha256_hex.<locals>.<genexpr>  s     6q1**6s   ,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}allr   r   r   )r   r   r+  r   r   r   r   r   r   r   r   r  )
r   r  r  r   r   r   r   r   r   r  s
             r/   test_wb02_hash_is_sha256_hexz.TestStory105Dedup.test_wb02_hash_is_sha256_hex~  s    %'>21vv|vss11v6A66s666666666s666s66666666666666r1   N)r   r   r   r   r  r  r  r  r   r   r   r  r  r  r   r1   r/   r  r  K  sB    7 [[
  
 H7r1   r  c                  (   e Zd ZdZej
                  j                  d        Zej
                  j                  d        Zej
                  j                  d        Z	ej
                  j                  d        Z
ej
                  j                  d        Zy)TestStory106HealthCheckz!BB + WB tests for health_check().c                \  K   t        ddd      }|j                          d {   }|d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      d	z  }d
d|iz  }t        t        j                  |            d x}x}}y 7 w)Nr   r   r   rs   statusdegradedr   r}  r~  r  r   )r   health_checkr   r   r   r   r   )r   r   r  r3  r   r  r  r   s           r/   'test_bb01_degraded_when_not_initializedz?TestStory106HealthCheck.test_bb01_degraded_when_not_initialized  s     %!!

 ((h-:-:----:------:------- )s   "B,B*BB,c                  K   t                d {   }t               }t        d      |_        t        |      |_        t        d      |_        t        |      |j                  _        t        t        g             |j                  _	        t        d      |j                  _        |j                          d {   }|d   }d}||k(  }|slt        j                  d|fd	||f      t        j                  |      t        j                  |      d
z  }dd|iz  }t!        t        j"                  |            d x}x}}|d   }d}||u }|slt        j                  d|fd||f      t        j                  |      t        j                  |      d
z  }dd|iz  }t!        t        j"                  |            d x}x}}|d   }d}||u }|slt        j                  d|fd||f      t        j                  |      t        j                  |      d
z  }dd|iz  }t!        t        j"                  |            d x}x}}|d   }d}||u }|slt        j                  d|fd||f      t        j                  |      t        j                  |      d
z  }dd|iz  }t!        t        j"                  |            d x}x}}y 7 7 w)Nr   r3   FrD   Tr  healthyr   r}  r~  r  r   pgr   z%(py1)s is %(py4)srL   rW   )r   r   r8   r:   r;   r   rw   r<   rx   rF   ry   rO   r  r   r   r   r   r   	r   r   r@   r  r3  r   r  r  r   s	            r/   &test_bb02_healthy_when_all_backends_okz>TestStory106HealthCheck.test_bb02_healthy_when_all_backends_ok  s    !## {!q1#6"6'T: &/IRT<U%V

" #5		((h,9,9,,,,9,,,,,,9,,,,,,,d|#t#|t####|t###|###t#######h'4'4''''4''''''4'''''''g&$&$&&&&$&&&&&&$&&&&&&&' $ )s#   K	KB/K	 KHK	K	c                  K   t                d {   }t               }t        d      |_        t        |      |_        t        d      |_        t        |      |j                  _        t        t        g             |j                  _	        t        t        d            |j                  _        |j                          d {   }|d   }d}||k(  }|slt        j                  d	|fd
||f      t        j                   |      t        j                   |      dz  }dd|iz  }t#        t        j$                  |            d x}x}}|d   }d}||u }|slt        j                  d|fd||f      t        j                   |      t        j                   |      dz  }dd|iz  }t#        t        j$                  |            d x}x}}y 7 7 w)Nr   r3   FrD   z
Redis downrz  r  r  r   r}  r~  r  r   rW   r   r  )r   r   r8   r:   r;   r   rw   r<   rx   rF   	Exceptionry   rO   r  r   r   r   r   r   r  s	            r/   #test_bb03_degraded_when_redis_failsz;TestStory106HealthCheck.test_bb03_degraded_when_redis_fails  s3    !##{!q1#6"6'T:%.IRT<U%V

""y/FG		((h-:-:----:------:-------g'%'%''''%''''''%''''''' $ )s#   GGB8G	G
DGGc                ^  K   t                d {   }t               }t        d      |_        t        |      |_        t        d      |_        t        |      |j                  _        t        t        g             |j                  _	        t        d      |j                  _        |j                          d {    |j                  j                          |j                  j                  j                          |j                  j                  j                          y 7 7 jw)Nr   r3   FrD   T)r   r   r8   r:   r;   r   rw   r<   rx   rF   ry   rO   r  r   r[  s      r/   #test_wb01_all_three_backends_pingedz;TestStory106HealthCheck.test_wb01_all_three_backends_pinged  s     !##{!q1#6"6'T:%.IRT<U%V

""5		oo))+


""668
		**, $ 	 s#   D-D(B/D- D+A(D-+D-c                l  K   t                d {   }t               }t        d      |_        t        |      |_        t        d      |_        t        |      |j                  _        t        t        g             |j                  _	        t        d      |j                  _        |j                          d {   }d}||v }|st        j                  d|fd||f      t        j                  |      d	t!        j"                         v st        j$                  |      rt        j                  |      nd	d
z  }dd|iz  }t'        t        j(                  |            d x}}d}||v }|st        j                  d|fd||f      t        j                  |      d	t!        j"                         v st        j$                  |      rt        j                  |      nd	d
z  }dd|iz  }t'        t        j(                  |            d x}}d}||v }|st        j                  d|fd||f      t        j                  |      d	t!        j"                         v st        j$                  |      rt        j                  |      nd	d
z  }dd|iz  }t'        t        j(                  |            d x}}|d   }t+        |t,              }	|	sddt!        j"                         v st        j$                  t*              rt        j                  t*              ndt        j                  |      dt!        j"                         v st        j$                  t,              rt        j                  t,              ndt        j                  |	      dz  }t'        t        j(                  |            d x}}	y 7 7 w)Nr   r3   FrD   Tr  rA  z%(py1)s in %(py3)sr  r  r  r   rL   rW   z5assert %(py5)s
{%(py5)s = %(py0)s(%(py2)s, %(py3)s)
}
isinstancebool)r   r   r  r   )r   r   r8   r:   r;   r   rw   r<   rx   rF   ry   rO   r  r   r   r   r   r   r   r   r   r  r  )
r   r   r@   r  r3  r  r  r   r   r   s
             r/   %test_wb02_result_has_all_backend_keysz=TestStory106HealthCheck.test_wb02_result_has_all_backend_keys  s    !##{!q1#6"6'T:%.IRT<U%V

""5		((tv~tvtvv!x6!!!!x6!!!x!!!!!!6!!!6!!!!!!! w&    w&   w      &   &        ,-z,--------z---z---,------------------- $ )s#   N4N.B/N4 N1K.N41N4N)r   r   r   r   r   r   r   r  r  r  r  r  r   r1   r/   r  r    s    + [[. . [[' '. [[( (" [[- -" [[. .r1   r  c                     e Zd ZdZej
                  j                  d        Zej
                  j                  d        Zej
                  j                  d        Z	ej
                  j                  d        Z
ej
                  j                  d        Zej
                  j                  d        Zej
                  j                  d        Zd	 Zy
)TestStory107Quotaz$BB + WB tests for quota enforcement.c                  K   t        t        j                  d       d {   }ddlm}  |t               t        j                  d      }t        |      |j                  _        |j                  t               t        j                         d {   }d}||u }|st        j                  d	|fd
||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }dd|iz  }t!        t        j"                  |            d x}}y 7 7 w)Ni )r}   rV   r   r_   rc   r3   Tr   rc  r  r  r  r   )r   r   QUEENre   r`   r   r   r{   rg   r   r   r   r   r   r   r   r   r   )	r   r   r`   rm   r  r  r   r  r   s	            r/   test_bb01_queen_tier_unlimitedz0TestStory107Quota.test_bb01_queen_tier_unlimited  s     !0B0B%PP:&gL$6$6R
 #,"B

uw0B0BCCv~vvv Q Ds#   ED>A1EEB+EEc                  K   t        d       d {   }|j                  t               t        j                         d {   }d}||u }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }dd	|iz  }t        t        j                  |            d x}}y 7 7 w)
Nd   rV   Tr   rc  r  r  r  r   )r   r   r   r   r  r   r   r   r   r   r   r   r   r  s          r/   $test_bb02_starter_under_limit_passesz6TestStory107Quota.test_bb02_starter_under_limit_passes  s     !,,uw0D0DEEv~vvv -Es"   C1C-/C1C/B+C1/C1c                  K   t        d       d {   }t        d      |j                  _        |j	                  t               t        j                         d {   }d}||u }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      d	z  }d
d|iz  }t        t        j                  |            d x}}y 7 7 w)Nrb   r  500r3   Fr   rc  r  r  r  r   )r   r   ry   rQ   r   r   r   r  r   r   r   r   r   r   r   r   r  s          r/    test_bb03_starter_at_limit_failsz2TestStory107Quota.test_bb03_starter_at_limit_fails  s     !,,!u5		uw0D0DEEvvvv -Es#   DDA
DD
B+D
Dc                l  K   t               }t                d {   }t        d      |_        t        d      |_        ddlm}  ||t        j                  d      }t        |      |j                  _
        t        j                  t              5 }|j                  |ddd	       d {    d d d        j                  }|j                   }||k(  }|st#        j$                  d
|fd||f      dt'        j(                         v st#        j*                  |      rt#        j,                  |      ndt#        j,                  |      t#        j,                  |      dt'        j(                         v st#        j*                  |      rt#        j,                  |      nddz  }	dd|	iz  }
t/        t#        j0                  |
            d x}x}}|j                  }|j2                  }d}||k(  }|st#        j$                  d
|fd||f      dt'        j(                         v st#        j*                  |      rt#        j,                  |      ndt#        j,                  |      t#        j,                  |      t#        j,                  |      dz  }dd|iz  }t/        t#        j0                  |            d x}x}x}}|j                  }|j4                  }d}||k(  }|st#        j$                  d
|fd||f      dt'        j(                         v st#        j*                  |      rt#        j,                  |      ndt#        j,                  |      t#        j,                  |      t#        j,                  |      dz  }dd|iz  }t/        t#        j0                  |            d x}x}x}}y 7 7 # 1 sw Y   xY ww)NFr3   rb   r   r_   rc   r   r   r   r   )zL%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.value
}.tenant_id
} == %(py6)sr   r  r   r   r   r   r   r   r   r   )r   r   r   r   r   re   r`   r   r  r{   rg   r   r   r   r   r  r"   r   r   r   r   r   r   r   r   r  r  )r   r  r   r`   rm   r   r   r   r   r   r   r  r   r  s                 r/   (test_bb04_quota_error_has_correct_fieldsz:TestStory107Quota.test_bb04_quota_error_has_correct_fields
  sL    g!###7'S9:& 4 43
 #,"B

]]-. 	K(//#';UEJJJ	K~~.~''.'3....'3......x...x...~...'......3...3.......~~*~##*s*#s****#s******x***x***~***#***s*******~~,~%%,,%,,,,%,,,,,,x,,,x,,,~,,,%,,,,,,,,,, $ K	K 	Ks;   N4N!A9N4N',N$-N'1K1N4$N''N1,N4c                z  K   ddl m} t                d {   }t               }t	        d       |j
                  _        t        j                  |j                        j                  d      }|j                  |       d {    |j
                  j                  j                  d   d   }t        |      }||v }|s#t        j                  d|fd||f      dt        j                          v st        j"                  t              rt        j$                  t              nddt        j                          v st        j"                  |      rt        j$                  |      ndt        j$                  |      d	t        j                          v st        j"                  |      rt        j$                  |      nd	d
z  }dd|iz  }	t'        t        j(                  |	            d x}}||v }
|
st        j                  d|
fd||f      dt        j                          v st        j"                  |      rt        j$                  |      ndd	t        j                          v st        j"                  |      rt        j$                  |      nd	dz  }dd|iz  }t'        t        j(                  |            d }
y 7 7 6w)Nr   )timezoner3   z%Y-%m-%drA  )z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} in %(py5)srP   r  call_keyr   r.  r  r   r   r   )z%(py0)s in %(py2)stodayr  r  r   )r   r  r   r   r   ry   rQ   r,   utcstrftimer   rL  rP   r   r   r   r   r   r   r   r   )r   r  r   r  r  r  r  r   r   r   r   r  r  s                r/    test_wb01_redis_quota_key_formatz2TestStory107Quota.test_wb01_redis_quota_key_format  s    %!##g!t4		X\\*33J?!!#&&&99==**1-a03x#x8####x8######s###s######3###3###x######8###8#######    u      u   u                 $
 	's#   J;J5A+J;J8H3J;8J;c                  K   t                d {   }t               }t        d      |j                  _        t               |j                  _        |j                  |       d {    |j                  j                  j                          |j                  j
                  j                          |j                  j
                  j                  d   d   }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }d	d
|iz  }t        t        j                   |            d x}}y 7 q7 w)Nr   r3   r   i_ r   r  ttl_argr  r  r   )r   r   r   ry   rS   rT   r	  r   rL  r   r   r   r   r   r   r   r   )r   r   r  r  r  r   r  r   s           r/   +test_wb02_increment_sets_ttl_on_first_writez=TestStory107Quota.test_wb02_increment_sets_ttl_on_first_write+  s     !##g"2		$;		!!#&&&
		**,
		,,.))"",,Q/2  w&    w&      w   w   &        $
 	's#   FFAF'F(DFFc                4  K   ddl m} |t        j                     }d}||k(  }|slt	        j
                  d|fd||f      t	        j                  |      t	        j                  |      dz  }dd|iz  }t        t	        j                  |            d x}x}}y w)	Nr   DAILY_QUOTAra   r   r}  r~  r  r   )	core.rlm.gatewayr  r   rf   r   r   r   r   r   r   r  r3  r   r  r  r   s          r/   &test_wb03_professional_tier_limit_2000z8TestStory107Quota.test_wb03_professional_tier_limit_2000:  sa     0<445==5====5===5==========s   BBc                ,   ddl m} |t        j                     }d}||k(  }|slt	        j
                  d|fd||f      t	        j                  |      t	        j                  |      dz  }dd|iz  }t        t	        j                  |            d x}x}}y )	Nr   r  i'  r   r}  r~  r  r   )	r  r  r   
ENTERPRISEr   r   r   r   r   r  s          r/   %test_wb04_enterprise_tier_limit_10000z7TestStory107Quota.test_wb04_enterprise_tier_limit_10000@  s]    0<223=v=3v====3v===3===v=======r1   N)r   r   r   r   r   r   r   r  r  r  r  r  r  r  r  r   r1   r/   r  r    s    . [[
 
 [[  [[  [[- -$ [[
! 
! [[! ! [[> >
>r1   r  c                  `   e Zd ZdZej
                  j                  d        Zej
                  j                  d        Zej
                  j                  d        Z	ej
                  j                  d        Z
ej
                  j                  d        Zej
                  j                  d        Zy)	TestStory108EmbeddingzBB + WB tests for _embed().c                L  K   t                d {   }ddlm} |j                  d       d {   }t	        |      }||k(  }|s#t        j                  d|fd||f      dt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndd	z  }d
d|iz  }t        t        j                  |            d x}}d |D        }t        |      }	|	sddt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |	      dz  }
t        t        j                  |
            d x}}	y 7 7 w)Nr   EMBEDDING_DIMr  r   z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py5)sr+  vectorr  r  r   r   c              3  &   K   | ]	  }|d k(    yw        Nr   r  vs     r/   r  zTTestStory108Embedding.test_bb01_empty_content_returns_zero_vector.<locals>.<genexpr>S       ,18,   r  r  r  r   re   r  r   r+  r   r   r   r   r   r   r   r   r  r   r   r  r  r  r   r   r   r   r   r  s              r/   +test_bb01_empty_content_returns_zero_vectorzATestStory108Embedding.test_bb01_empty_content_returns_zero_vectorM  s'    !##4yy}$6{+{m++++{m++++++s+++s++++++6+++6+++{++++++m+++m+++++++,V,,s,,,,,,,,,s,,,s,,,,,,,,,,,,,,	 $$    H$HH$H!G/H$!H$c                L  K   t                d {   }ddlm} |j                  d       d {   }t	        |      }||k(  }|s#t        j                  d|fd||f      dt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndd	z  }d
d|iz  }t        t        j                  |            d x}}d |D        }t        |      }	|	sddt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |	      dz  }
t        t        j                  |
            d x}}	y 7 7 w)Nr   r  z   
	  r   r  r+  r  r  r  r   r   c              3  &   K   | ]	  }|d k(    ywr  r   r  s     r/   r  zVTestStory108Embedding.test_bb02_whitespace_only_returns_zero_vector.<locals>.<genexpr>\  r  r  r  r  r  r  r  s              r/   -test_bb02_whitespace_only_returns_zero_vectorzCTestStory108Embedding.test_bb02_whitespace_only_returns_zero_vectorV  s(    !##4yy--6{+{m++++{m++++++s+++s++++++6+++6+++{++++++m+++m+++++++,V,,s,,,,,,,,,s,,,s,,,,,,,,,,,,,,	 $-r  c                n  K   t                d {   }|j                  dd       t               }t        ddgdz  i      |_        t               |_        t        j                  dd|i      5  |j                  d	       d {   }d d d        t              }d}||k(  }|st        j                  d
|fd||f      dt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }	t        t        j                   |	            d x}x}}y 7 7 !# 1 sw Y   !xY ww)NGEMINI_API_KEYzfake-key	embeddingr   r   r3   sys.moduleszgoogle.generativeaiztest content for embeddingr   r*  r+  r  r-  r   r   )r   r   r   embed_content	configurer   dictr   r+  r   r   r   r   r   r   r   r   )
r   r   r   
mock_genair  r  r   r   r   r   s
             r/   +test_bb03_google_genai_path_returns_768_dimzATestStory108Embedding.test_bb03_google_genai_path_returns_768_dim_  s)    !##+Z8[
#,%us{3$

   ){
ZZ(=z'JK 	C99%ABBF	C 6{!c!{c!!!!{c!!!!!!s!!!s!!!!!!6!!!6!!!{!!!c!!!!!!! $ C	C 	Cs;   F5F"AF5/F(F%F(	DF5%F((F2-F5c                F  K   t                d {   }|j                  dd       |j                  dd       t               }t        ddgdz  i      |_        t               |_        t               }t               }t        |      |_        t        d      |_        t        |      |_        t        |      |_	        t        j                  d	d
|i      5  |j                  d       d {   }d d d        t              }d}||k(  }	|	st        j                  d|	fd||f      dt!        j"                         v st        j$                  t              rt        j&                  t              nddt!        j"                         v st        j$                  |      rt        j&                  |      ndt        j&                  |      t        j&                  |      dz  }
dd|
iz  }t)        t        j*                  |            d x}x}	}y 7 7 !# 1 sw Y   !xY ww)Nr  Fr   GOOGLE_API_KEYr  g?r   r3   r  httpxzollama fallback contentr   r*  r+  r  r-  r   r   )r   r   r   r1  raise_for_statusr   r:   r;   postAsyncClientr   r  r   r+  r   r   r   r   r   r   r   r   )r   r   r   mock_response
mock_httpxmock_clientr  r  r   r   r   r   s               r/   )test_bb04_ollama_fallback_returns_768_dimz?TestStory108Embedding.test_bb04_ollama_fallback_returns_768_dimp  s|    !##+U;+U;!&[3%#+4NO)2&[
k!*!D )u =$-@!*!D
ZZ'<= 	@99%>??F	@ 6{!c!{c!!!!{c!!!!!!s!!!s!!!!!!6!!!6!!!{!!!c!!!!!!!% $  @	@ 	@s;   H!HC
H!H0H1H5DH!HHH!c                  
K   t                d {   }|j                  dd       |j                  dd       ddz  }g 
d
fd}||_        |j                  |       d {    t        |      }d}||kD  }|st	        j
                  d	|fd
||f      dt        j                         v st	        j                  t              rt	        j                  t              nddt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      t	        j                  |      dz  }dd|iz  }	t        t	        j                  |	            d x}x}}y 7 i7 w)Nr  Fr   r  xi@  c                :   K   j                  |        dgdz  S w)Nr  r   ru  )r#   captureds    r/   
mock_embedzJTestStory108Embedding.test_wb01_long_content_truncated.<locals>.mock_embed  s     OOG$53;s   i   )>)z/%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} > %(py6)sr+  long_contentr-  r   r   )r#   rP   returnzList[float])r   r   r   r+  r   r   r   r   r   r   r   r   )r   r   r   r  r  r  r   r   r   r   r  s             @r/    test_wb01_long_content_truncatedz6TestStory108Embedding.test_wb01_long_content_truncated  s    !##+U;+U; U{ 	 	ii%%% < (5( 5(((( 5((((((s(((s((((((<(((<((( (((5(((((((# $ 	&s#   F E:AF $E=%DF =F c                  K   t                d {   }|j                  dd       |j                  dd       t               }t               }t        |      |_        t        d      |_        t        t        d            |_        t        |      |_        t        j                  dd	|i      5  |j                  d
       d {   }d d d        ddlm} t              }||k(  }|s#t        j                   d|fd||f      dt#        j$                         v st        j&                  t              rt        j(                  t              nddt#        j$                         v st        j&                  |      rt        j(                  |      ndt        j(                  |      dt#        j$                         v st        j&                  |      rt        j(                  |      nddz  }	dd|	iz  }
t+        t        j,                  |
            d x}}d |D        }t/        |      }|sddt#        j$                         v st        j&                  t.              rt        j(                  t.              ndt        j(                  |      t        j(                  |      dz  }t+        t        j,                  |            d x}}y 7 7  # 1 sw Y    xY ww)Nr  Fr   r  r3   zConnection refusedrz  r  r  zany content herer   r  r   r  r+  r  r  r  r   r   c              3  &   K   | ]	  }|d k(    ywr  r   r  s     r/   r  zVTestStory108Embedding.test_wb02_both_embed_fail_returns_zero_vector.<locals>.<genexpr>  r  r  r  r  r  )r   r   r   r   r:   r;   r  r  r  r   r  r   re   r  r+  r   r   r   r   r   r   r   r   r  )r   r   r   r  r  r  r  r  r   r   r   r   r   r  s                 r/   -test_wb02_both_embed_fail_returns_zero_vectorzCTestStory108Embedding.test_wb02_both_embed_fail_returns_zero_vector  s    !##+U;+U;[
k!*!D )u =$;O1PQ!*!D
ZZ'<= 	999%788F	9 	56{+{m++++{m++++++s+++s++++++6+++6+++{++++++m+++m+++++++,V,,s,,,,,,,,,s,,,s,,,,,,,,,,,,,,! $ 9	9 	9s;   KKB#K4K	K	
KG9K	KKKN)r   r   r   r   r   r   r   r  r   r	  r  r  r  r   r1   r/   r  r  I  s    % [[- - [[- - [[" "  [[" ", [[) )* [[- -r1   r  c                     e Zd ZdZ	 	 	 	 d	 	 	 	 	 	 	 	 	 ddZej                  j                  d        Zej                  j                  d        Z	ej                  j                  d        Z
ej                  j                  d        Zej                  j                  d        Zej                  j                  d	        Zej                  j                  d
        Zy)TestStory109Routerz+BB + WB tests for gateway_router endpoints.Nc                    t               }t        |xs
 t                     |_        t        |xs g       |_        t        |xs ddddd      |_        t        |      |_        |S )z&Build a mock gateway for router tests.r3   r  T)r  r  rL   rW   )r   r   r0   r   r!  r  re  )r   write_recordsearch_resultshealth_resultdelete_resultr   s         r/   _make_router_gatewayz'TestStory109Router._make_router_gateway  sf     [#1OP&N4HbI# 2
ttdC
  %-@	r1   c                t  K   	 ddl m} ddlm} ddlm} t        ddt        j                        }| j                  |	      }        }|j                   ||              |      }t        t                     }|j!                  d
|dddd      }	|	j"                  }
d}|
|k(  }|st%        j&                  d|fd|
|f      dt)        j*                         v st%        j,                  |	      rt%        j.                  |	      ndt%        j.                  |
      t%        j.                  |      dz  }dd|iz  }t1        t%        j2                  |            d x}
x}}|	j5                         }d}||v }|st%        j&                  d|fd||f      t%        j.                  |      dt)        j*                         v st%        j,                  |      rt%        j.                  |      nddz  }dd|iz  }t1        t%        j2                  |            d x}}|d   }d}||k(  }|slt%        j&                  d|fd ||f      t%        j.                  |      t%        j.                  |      d!z  }d"d#|iz  }t1        t%        j2                  |            d x}x}}y # t        $ r t        j                  d       Y w xY ww)$Nr   
TestClientFastAPIfastapi not installedcreate_routerzrouter-test-001r&  )r.   r&   r-   )r#  /api/v1/memory/writezThis is valid memory contentr   r   r"   r#   r$   r%   r1     r   z3%(py2)s
{%(py2)s = %(py0)s.status_code
} == %(py5)srespr   r   r   r.   rA  r  bodyr  r  r   r-   r'  r}  r~  r  r   )fastapi.testclientr*  fastapir,  ImportErrorr   skipcore.rlm.gateway_routerr/  r0   r   r   r'  include_routerrP   r   r  status_coder   r   r   r   r   r   r   r   r1  )r   r*  r,  r/  r   r   appclientr  r5  r   r   r   r   r   r6  r3  r  r  r  r   s                        r/   $test_bb01_write_endpoint_returns_200z7TestStory109Router.test_bb01_write_endpoint_returns_200  s    	15' 	:':CVCV
 &&F&;i=,-C%'l{{15	9
{  &3&3&&&&3&&&&&&t&&&t&&&&&&3&&&&&&&yy{"{d""""{d"""{""""""d"""d"""""""F|)z)|z))))|z)))|)))z)))))))/  	1KK/0	1s(   J8J JJ8J51J84J55J8c                  K   	 ddl m} ddlm} ddlm} | j                         }        }|j                   ||              |      }|j                  dt        t                     ddd	d
      }|j                  }d}	||	k(  }
|
st        j                   d|
fd||	f      dt#        j$                         v st        j&                  |      rt        j(                  |      ndt        j(                  |      t        j(                  |	      dz  }dd|iz  }t+        t        j,                  |            d x}x}
}	y # t        $ r t        j                  d       Y Ow xY ww)Nr   r)  r+  r-  r.  r0  shortr   r   r1  r2  i  r   r4  r5  r   r   r   )r7  r*  r8  r,  r9  r   r:  r;  r/  r'  r<  r  rP   r   r=  r   r   r   r   r   r   r   r   r   r*  r,  r/  r   r>  r?  r5  r   r   r   r   r   s                r/   )test_bb02_write_short_content_returns_422z<TestStory109Router.test_bb02_write_short_content_returns_422  s    	15' 	:&&(i=,-C{{1UW	9
{  &3&3&&&&3&&&&&&t&&&t&&&&&&3&&&&&&&!  	1KK/0	1s(   E#D> D.E#>E E#E  E#c                  K   	 ddl m} ddlm} ddlm} t               }| j                         }t        t        |dd            |_                }|j                   ||              |      }|j                  d	t!        |      d
ddd      }|j"                  }	d}
|	|
k(  }|st%        j&                  d|fd|	|
f      dt)        j*                         v st%        j,                  |      rt%        j.                  |      ndt%        j.                  |	      t%        j.                  |
      dz  }dd|iz  }t1        t%        j2                  |            d x}	x}}
y # t        $ r t        j                  d       Y nw xY ww)Nr   r)  r+  r-  r.  rb   )r  r  rz  r0  zvalid content here pleaser   r   r1  r2  i  r   r4  r5  r   r   r   )r7  r*  r8  r,  r9  r   r:  r;  r/  r   r'  r   r   r   r<  r  rP   r=  r   r   r   r   r   r   r   r   )r   r*  r,  r/  r  r   r>  r?  r5  r   r   r   r   r   s                 r/   $test_bb03_quota_exceeded_returns_429z7TestStory109Router.test_bb03_quota_exceeded_returns_429  s!    	15' 	:g&&(#*3c3G
 i=,-C{{1S2	9
{  &3&3&&&&3&&&&&&t&&&t&&&&&&3&&&&&&&+  	1KK/0	1s(   FE EFE?;F>E??Fc                  K   	 ddl m} ddlm} ddlm} | j                         }        }|j                   ||              |      }|j                  d      }|j                  }d}	||	k(  }
|
st        j                  d|
fd	||	f      d
t        j                          v st        j"                  |      rt        j$                  |      nd
t        j$                  |      t        j$                  |	      dz  }dd|iz  }t'        t        j(                  |            d x}x}
}	|j+                         }|d   }d}
||
k(  }|slt        j                  d|fd||
f      t        j$                  |      t        j$                  |
      dz  }dd|iz  }t'        t        j(                  |            d x}x}}
y # t        $ r t        j                  d       Y w xY ww)Nr   r)  r+  r-  r.  z/api/v1/memory/healthr3  r   r4  r5  r   r   r   r  r  r}  r~  r  r   )r7  r*  r8  r,  r9  r   r:  r;  r/  r'  r<  rQ   r=  r   r   r   r   r   r   r   r   r1  )r   r*  r,  r/  r   r>  r?  r5  r   r   r   r   r   r6  r3  r  r  r   s                     r/   )test_bb04_health_endpoint_returns_healthyz<TestStory109Router.test_bb04_health_endpoint_returns_healthy  s>    	15' 	:&&(i=,-Czz12&3&3&&&&3&&&&&&t&&&t&&&&&&3&&&&&&&yy{H~**~****~***~**********  	1KK/0	1s(   GF6 F&G6GGGGc                  K   	 ddl m} ddlm} ddlm} | j                  d      }        }|j                   ||              |      }|j                  dt                d	      }|j                  }d
}	||	k(  }
|
st        j                  d|
fd||	f      dt!        j"                         v st        j$                  |      rt        j&                  |      ndt        j&                  |      t        j&                  |	      dz  }dd|iz  }t)        t        j*                  |            d x}x}
}	y # t        $ r t        j                  d       Y Ew xY ww)Nr   r)  r+  r-  r.  Fr&  /api/v1/memory/z/nonexistenti  r   r4  r5  r   r   r   )r7  r*  r8  r,  r9  r   r:  r;  r/  r'  r<  rI   r   r=  r   r   r   r   r   r   r   r   rC  s                r/   &test_bb05_delete_not_found_returns_404z9TestStory109Router.test_bb05_delete_not_found_returns_4044  s     	15' 	:&&U&;i=,-C}}uwi|DE&3&3&&&&3&&&&&&t&&&t&&&&&&3&&&&&&&  	1KK/0	1s(   ED4 D$E4EEEEc                  K   	 ddl m} ddlm} ddlm} | j                  d      }        }|j                   ||              |      }|j                  dt                d	      }|j                  }d
}	||	k(  }
|
st        j                  d|
fd||	f      dt!        j"                         v st        j$                  |      rt        j&                  |      ndt        j&                  |      t        j&                  |	      dz  }dd|iz  }t)        t        j*                  |            d x}x}
}	|j-                         d   }d}
||
u }|slt        j                  d|fd||
f      t        j&                  |      t        j&                  |
      dz  }dd|iz  }t)        t        j*                  |            d x}x}}
y # t        $ r t        j                  d       Y w xY ww)Nr   r)  r+  r-  r.  TrJ  rK  z/mem-001r3  r   r4  r5  r   r   r   deletedr   r  r~  r  r   )r7  r*  r8  r,  r9  r   r:  r;  r/  r'  r<  rI   r   r=  r   r   r   r   r   r   r   r   r1  )r   r*  r,  r/  r   r>  r?  r5  r   r   r   r   r   r3  r  r  r   s                    r/   'test_wb01_delete_returns_200_when_foundz:TestStory109Router.test_wb01_delete_returns_200_when_foundG  sL    	15' 	:&&T&:i=,-C}}uwix@A&3&3&&&&3&&&&&&t&&&t&&&&&&3&&&&&&&yy{9%--%----%---%----------  	1KK/0	1s(   G&G F1G&G#G&"G##G&c                  K   	 ddl m} ddlm} ddlm} | j                         }        }|j                   ||              |      }t        t                     }|j                  d|ddd	d
       |j                  j                          |j                  j                   }|d   d   }	d}
|	|
k(  }|slt#        j$                  d|fd|	|
f      t#        j&                  |	      t#        j&                  |
      dz  }dd|iz  }t)        t#        j*                  |            d x}	x}}
|d   d   }	d	}
|	|
k(  }|slt#        j$                  d|fd|	|
f      t#        j&                  |	      t#        j&                  |
      dz  }dd|iz  }t)        t#        j*                  |            d x}	x}}
y # t        $ r t        j                  d       Y w xY ww)Nr   r)  r+  r-  r.  z/api/v1/memory/searchztest query here   g333333?)r"   queryr  	min_scorer2  r   r  r   r}  r~  r  r   rS  )r7  r*  r8  r,  r9  r   r:  r;  r/  r'  r<  rP   r   r  r!  r   rL  r   r   r   r   r   )r   r*  r,  r/  r   r>  r?  r  call_kwargsr3  r   r  r  r   s                 r/   &test_wb02_search_passes_correct_paramsz9TestStory109Router.test_wb02_search_passes_correct_params[  sb    	15' 	:&&(i=,-C%'l+&	3
 	 	..0((221~g&+!+&!++++&!+++&+++!+++++++1~k*1c1*c1111*c111*111c1111111)  	1KK/0	1s(   GF. FG.GGGG)NNNT)
r#  zOptional[MemoryRecord]r$  zOptional[List[MemoryRecord]]r%  zOptional[Dict]r&  r  r  r   )r   r   r   r   r'  r   r   r   r@  rD  rF  rH  rL  rO  rU  r   r1   r/   r!  r!    s   5 047;(,", 5 &	
  
$ [[* *< [[' '. [[' '8 [[+ +( [[' '$ [[. .& [[2 2r1   r!  c                     e Zd ZdZej
                  j                  d        Zej
                  j                  d        Zej
                  j                  d        Z	ej
                  j                  d        Z
ej
                  j                  d        Zej
                  j                  d        Zej
                  j                  d        Zej
                  j                  d	        Zy
)TestStory110Integrationz8Full integration tests using mocked backends end-to-end.c           
       K   t        dt        j                         d {   }t        d       |_        t        dgdz        |_        t        d      |_        t               |_        t               }|j                  |ddd	       d {   }|j                  }t        j                  }||k(  }|st        j                  d
|fd||f      dt        j                         v st        j                  |      rt        j                   |      ndt        j                   |      dt        j                         v st        j                  t              rt        j                   t              ndt        j                   |      dz  }dd|iz  }t#        t        j$                  |            d x}x}}|j&                  }d}	||	k(  }|st        j                  d
|fd||	f      dt        j                         v st        j                  |      rt        j                   |      ndt        j                   |      t        j                   |	      dz  }
dd|
iz  }t#        t        j$                  |            d x}x}}	|j(                  }t+               }||_        t/        |      ddd	ddi t1        j2                  t4              j7                         d|_        t        |g      |j:                  _        |j?                  |d       d {   }tA        |      }d}||k(  }	|	st        j                  d
|	fd||f      dt        j                         v st        j                  t@              rt        j                   t@              nddt        j                         v st        j                  |      rt        j                   |      ndt        j                   |      t        j                   |      dz  }dd|iz  }t#        t        j$                  |            d x}x}	}|d   }|jB                  }d}||k(  }	|	st        j                  d
|	fd||f      t        j                   |      t        j                   |      t        j                   |      dz  }dd|iz  }t#        t        j$                  |            d x}x}x}	}t        d      |_"        t        d      |_#        t        d      |_$        t        d      |_%        |jM                  ||       d {   }d}||u }|st        j                  d |fd!||f      d"t        j                         v st        j                  |      rt        j                   |      nd"t        j                   |      d#z  }d$d%|iz  }
t#        t        j$                  |
            d x}}y 7 7 67 7 w)&Nffffff?r   r3   r   r   r   z&Important business insight for testingr  r   r   r   r   r   r   r   r   )z6%(py2)s
{%(py2)s = %(py0)s.surprise_score
} == %(py5)sr   r   r   r'  r9  zbusiness insightr*  r+  r,  r-  r   r/  r0  Tr   rc  rN  r  r  r   )'r   r   r   r   r   r   r   r   r   r   r'   r   r   r   r   r   r   r   r   r&   r*   r   r)  rP   r   r,   r   r;  r<  rx   rJ   r!  r+  r#   rd  rh  ri  rj  re  )r   r   r  r   r   r   r   r   r   r   r   r   r.   r=  r,  r  r3  rN  r  s                      r/   test_int01_full_crud_cyclez2TestStory110Integration.test_int01_full_crud_cycle  s    !:3F3FGG %$7C53;7	 a0$;g 9='
 
 !!8Z%8%88!%88888!%8888888v888v888!888888Z888Z888%88888888$$,,$,,,,$,,,,,,v,,,v,,,$,,,,,,,,,,$$	 kS?#"%",,s+557	
 &C59

**30BCC7| q |q    |q      s   s      7   7   |   q       qzMz!!M%MM!%MMMMM!%MMMMzMMM!MMM%MMMMMMMM  T2!t4%48"+">((i88w$w$ww$W H
* D 9sI   WW A+WWI7WWHWW	B+WWW	Wc                  K   t                d {   }t               t               }t               }t        |      |_        t        d      |_        fd}t        |      |_        t        |      |j                  _        |j                  d       d {   }|j                  |d       d {   }t        |      }d}||k(  }	|	st        j                  d|	fd||f      d	t        j                         v st        j                  t              rt        j                   t              nd	d
t        j                         v st        j                  |      rt        j                   |      nd
t        j                   |      t        j                   |      dz  }
dd|
iz  }t#        t        j$                  |            d x}x}	}t        |      }d}||k(  }	|	st        j                  d|	fd||f      d	t        j                         v st        j                  t              rt        j                   t              nd	dt        j                         v st        j                  |      rt        j                   |      ndt        j                   |      t        j                   |      dz  }
dd|
iz  }t#        t        j$                  |            d x}x}	}y 7 7 C7 ,w)Nr3   Fc                   K   t        |      t              k(  r%ddddddddt        j                  t              dd	
gS g S w)
Nr   za-memz	A contentsdrY  r'  z{}r(  )rP   r   r,   r   )rR  r  r  tenant_as      r/   selective_fetchzLTestStory110Integration.test_int02_tenant_isolation.<locals>.selective_fetch  sO     3x3x=('k!SC#-4x||\_O`!(	   Is   ?Arz  rR  r   r   r*  r+  	results_ar-  r   r   r   	results_b)r   r   r   r:   r;   r7   r   rw   r<   r  r+  r   r   r   r   r   r   r   r   )r   r   tenant_br@   r`  ra  rb  r  r   r   r   r   r_  s               @r/   test_int02_tenant_isolationz3TestStory110Integration.test_int02_tenant_isolation  s    !##77 {#6"6	 ?;
'T:**8W==	**8W==	9~""~""""~""""""s"""s""""""9"""9"""~""""""""""9~""~""""~""""""s"""s""""""9"""9"""~""""""""""7 $. >=s5   K%KB
K%KK%6K"7H&K%K%"K%c                  K   t        d      }t        dt        j                         d {   }t	        |      |_        t	        d      |_        t               }|j                  |ddd	       d {   }|j                  |ddd	       d {   }|j                  }d}||k(  }|st        j                  d
|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }	dd|	iz  }
t!        t        j"                  |
            d x}x}}|j                  }d}||k(  }|st        j                  d
|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }	dd|	iz  }
t!        t        j"                  |
            d x}x}}|j                  j%                          y 7 7 7 w)Nz	dedup-001r  rY  r   r3   r   zDuplicate content here nowr   r   r   r  r1r   r   r   r2)r0   r   r   r   r   r   r   r   r   r*   r   r   r   r   r   r   r   r   r   )r   r  r   r  rf  rg  r   r   r   r   r   s              r/   &test_int03_dedup_prevents_double_writez>TestStory110Integration.test_int03_dedup_prevents_double_write  sp    +6!:3F3FGG$(; a0g??3(DeUSS??3(DeUSS||*{*|{****|{******r***r***|***{*******||*{*|{****|{******r***r***|***{*******
'') H
 TSs5   +I
IAI
5I6I
IF0I
I
I
c                  K   t        dt        j                         d {   }t        d      |_        t        d      |_        ddlm}  |t               t        j                  d      }t        |      |j                  _        t        j                  t              5  |j!                  t               d	d
d       d {    d d d        y 7 7 # 1 sw Y   y xY ww)Nr   r   Fr3   rb   r   r_   rc   zvalid content text herer   r   )r   r   r   r   r   r   re   r`   r   r   r  r{   rg   r   r   r   r   )r   r   r`   rm   s       r/   &test_int04_quota_stops_writes_at_limitz>TestStory110Integration.test_int04_quota_stops_writes_at_limit  s     !:3F3FGG#7'S9:&gL$8$8s
 #,"B

]]-. 	T//%'+DeUSSS	T 	T H T	T 	Ts:   C!CBC!# CCC
C!CCC!c                Z  K   t               }t        dt        j                         d {   }|j	                  |ddd       d {   }|j
                  }t        j                  }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      d	t        j                         v st        j                  t              rt        j                  t              nd	t        j                  |      d
z  }dd|iz  }t        t        j                  |            d x}x}}t        dt        j                         d {   }	t        d       |	_        t        dgdz        |	_        t        d      |	_        t               |	_        t               |	_        |	j	                  |ddd       d {   }|j
                  }t        j                  }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      d	t        j                         v st        j                  t              rt        j                  t              nd	t        j                  |      d
z  }dd|iz  }t        t        j                  |            d x}x}}y 7 7 7 7 .w)Ng      ?r   zlow signal noise testr   r   r   r   recr   r   r   r   g333333?r3   r   r   r   z%very high signal axiom candidate herer   )r   r   r   r   r   r'   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )
r   r  
gw_discardrl  r   r   r   r   r   gw_semantics
             r/   $test_int05_surprise_routing_by_scorez<TestStory110Integration.test_int05_surprise_routing_by_score  s    g *:;M;MNN
++C1H%QVWW4*"4"44"44444"4444444s444s444444444*444*444"44444444 +J<O<OPP$-4$@!&SECK@ )q 9$-K!'0{$,,S2Y[`bghh5*"5"55"55555"5555555s555s555555555*555*555"55555555 OW Q isH   )L+LL+L"EL+	L%
A0L+:L(;D%L+"L+%L+(L+c                	  K   t        ddd      }t               |_        t               |_        t               |_        t               |_        d|_	        t        d      5  	 ddd       	 dd	lm}  |       |_        t#        d      |_        t#        dgdz        |_        t#        d      |_        t#               |_        t#               |_        t#               |_        t1               }|j3                  |ddd       d{   }|j4                  }||k(  }|st7        j8                  d|fd||f      dt;        j<                         v st7        j>                  |      rt7        j@                  |      ndt7        j@                  |      dt;        j<                         v st7        j>                  |      rt7        j@                  |      nddz  }dd|iz  }tC        t7        jD                  |            dx}}|jF                  }tI        tJ              }	||	v }|s?t7        j8                  d|fd||	f      dt;        j<                         v st7        j>                  |      rt7        j@                  |      ndt7        j@                  |      dt;        j<                         v st7        j>                  tH              rt7        j@                  tH              nddt;        j<                         v st7        j>                  tJ              rt7        j@                  tJ              ndt7        j@                  |	      dz  }
dd|
iz  }tC        t7        jD                  |            dx}x}}	d }|jL                  }||k  }d!}||k  }|r|st7        j8                  d"||fd#|||f      t7        j@                  |      dt;        j<                         v st7        j>                  |      rt7        j@                  |      ndt7        j@                  |      t7        j@                  |      d$z  }d%d&|iz  }tC        t7        jD                  |            dx}x}x}x}}y# 1 sw Y   xY w# t        $ r t        j                   d
       Y w xY w7 {w)'z?Test with actual SurpriseIntegration (no mocked score_content).rp   rq   rr   rs   Tz'core.rlm.gateway.MemoryGateway.__init__Nr   )SurpriseIntegrationz!SurpriseIntegration not availabler3   r   r   r   zPThe customer mentioned they had a very significant breakthrough in their processr  r   r   )z1%(py2)s
{%(py2)s = %(py0)s.tenant_id
} == %(py4)sr   r  r  r  r   rA  )zQ%(py2)s
{%(py2)s = %(py0)s.memory_tier
} in %(py7)s
{%(py7)s = %(py4)s(%(py5)s)
}listr   )r   r   r   r   r   r   r   r  g      ?)<=rs  )z6%(py1)s <= %(py6)s
{%(py6)s = %(py4)s.surprise_score
}z6%(py6)s
{%(py6)s = %(py4)s.surprise_score
} <= %(py8)s)r.  r   r   r   zassert %(py10)srC  )'r   rB   rw   rM   rx   rX   ry   rn   r{   r|   r   core.rlm.surpriserq  rz   r  r   r:  r   r   r   r   r   r   r   r   r   r"   r   r   r   r   r   r   r   r   r'   rr  r   r&   )r   r   rq  r  r   r   r   r  r   r  r   r  r3  r   r  rO  r   rT  s                     r/    test_int06_real_surprise_scoringz8TestStory110Integration.test_int06_real_surprise_scoring  s     +..

 !l!^
M	!^
 <= 			==.0BL %$7C53;7	 a0$;'k%Kg^	
 
 &3&&&&3&&&&&&v&&&v&&&&&&&&&3&&&3&&&&&&&!!5T*%55!%55555!%5555555v555v555!555555T555T555555*555*555%555555552f++2s+22s2+s22222s+s222s222222f222f222+222s222222225	 	  	=KK;<	=
sP   AQ?Q
!Q?*Q <BQ?Q<MQ?
QQ?Q95Q?8Q99Q?c                :  K   t                d {   }t               |j                  _        t               |j                  _        t               |j                  _        |j                          d {    |j                  }d}||u }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}|j                  }d }||u }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}|j                  }d }||u }|st        j                  d|fd	||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}|j                  }d }||u }|st        j                  d|fd
||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}y 7 7 %w)NFr   )z4%(py2)s
{%(py2)s = %(py0)s._initialized
} is %(py5)sr   r   r   r   )z0%(py2)s
{%(py2)s = %(py0)s._pg_pool
} is %(py5)s)z.%(py2)s
{%(py2)s = %(py0)s._redis
} is %(py5)s)z/%(py2)s
{%(py2)s = %(py0)s._qdrant
} is %(py5)s)r   r   ry   rU   rw   r=   rx   r|   r   r   r   r   r   r   r   r   r   s          r/   #test_int07_close_clears_all_handlesz;TestStory110Integration.test_int07_close_clears_all_handles/  s	    !##$;		%K$;

hhj'%'%''''%''''''r'''r''''''%'''''''{{"d"{d""""{d""""""r"""r"""{"""d"""""""yy D yD    yD      r   r   y   D       zz!T!zT!!!!zT!!!!!!r!!!r!!!z!!!T!!!!!!! $ 	s#   NNA"N3N4L"NNc                  K   t                d {   }t               }t        d      |_        t        |      |_        t        d      |_        t        |      |j                  _        t        t        d            |j                  _
        t        d      |j                  _        |j                          d {   }|d   }d}||k(  }|slt        j                  d	|fd
||f      t        j                   |      t        j                   |      dz  }dd|iz  }t#        t        j$                  |            d x}x}}|d   }d}||u }|slt        j                  d|fd||f      t        j                   |      t        j                   |      dz  }dd|iz  }t#        t        j$                  |            d x}x}}|d   }d}||u }|slt        j                  d|fd||f      t        j                   |      t        j                   |      dz  }dd|iz  }t#        t        j$                  |            d x}x}}|d   }d}||u }|slt        j                  d|fd||f      t        j                   |      t        j                   |      dz  }dd|iz  }t#        t        j$                  |            d x}x}}y 7 7 w)Nr   r3   FzQdrant unreachablerz  Tr  r  r   r}  r~  r  r   rL   r   r  r  rW   )r   r   r8   r:   r;   r   rw   r<   r  rx   rF   ry   rO   r  r   r   r   r   r   r  s	            r/   ,test_int08_health_degraded_on_qdrant_failurezDTestStory110Integration.test_int08_health_degraded_on_qdrant_failure>  s    !##{!q1#6"6'T:%.!"67&


" #5		((h-:-:----:------:-------h(5(5((((5((((((5(((((((d|#t#|t####|t###|###t#######g&$&$&&&&$&&&&&&$&&&&&&&! $ )s#   KKB.K?K HKKN)r   r   r   r   r   r   r   rZ  rd  rh  rj  ro  ru  rw  ry  r   r1   r/   rW  rW  {  s    B [[, ,^ [[# #> [[* *  [[T T [[6 6& [[(3 (3V [[" " [[' 'r1   rW  )r"   zOptional[UUID]r-   r   r&   floatr#   rP   r.   rP   r+   intr  r   )N)r>   zOptional[List[Dict]]r  r   )rK   Optional[List]r  r   )r   )rV   r{  r  r   )r[   rz  r-   r   r  r   )r-   r   rk   r  r  r   )r[   rz  r-   r   r}   r   rV   r{  r~   r|  r   r|  r  r   )Br   
__future__r   builtinsr   _pytest.assertion.rewrite	assertionrewriter   r1  sys
contextlibr   r   r   pathlibr   typingr   r	   r
   r   r   unittest.mockr   r   r   uuidr   r   r   pathinsertrP   __file__parentre   r   r   r   r  r   r   r   r   r   r   r   r0   rB   rM   rX   r]   rf   rn   r   r   r   r  ra  r  r  r  r  r!  rW  r   r1   r/   <module>r     s  2 #    
 * "  < < 5 5   3tH~,,33::; < E E  !%!** /&
  	
   .<
 #':;N;N  &22
 , !**".";";""&
   	
    8@" @"Nw
 w
|l7 l7fK6 K6d67 67zZ. Z.BY> Y>@f- f-Z~2 ~2JU' U'r1   