
    'j/                        d Z ddlZddlZddlZddlZddlZddlZdZ	dZ
 ej                  de	        ej                  de
       de	iZej                  j                  dd	      Zej                  j!                  e      Zeej$                  d<   ej&                  j)                  e       ddlZej.                  j1                  d      xs  ed
      j5                  e	      e_        ddlmZ  ee	      e_         eej6                        e	k(  sJ  eej6                               d Z e       Z  e!de        ejD                  jF                  Z$ G d d      Z%g Z&d Z'e'ejD                  _#        d e_(         ejR                  e	      Z*ejV                  e*_,        e*j[                  d      j]                         Z/e/J d       e/d   Z0 e!de0       e*j[                  de0f      j]                         Z1e1d   Z2 e!d e3e1             e*j[                  de0f      j]                         d   Z4e*j[                  de4f      j]                         Z5 e!d e3e5             ddlZ ejl                  d       ejo                  e0d       e*j[                  de2f      j]                         Z8 e!d e3e8             e8d    e4k(  sJ e8       e*j[                  d!e4f      j]                         Z9e9d"   d#k(  sJ e9       e9d$   d%k(  sJ e9d&   J e*j[                  d'e0f      j]                         Z:e:d(   d#k(  re:d)   d*k(  sJ e:d+   d%k(  sJ  e!d,        e;e&      d-k(  rd.e&d   v sJ  e;e&      Z<e*j[                  d/e0f      j]                         d   Z=d0 e_(        g Z>ddl?Z?ddl@Z@	 ejo                  e0d        e!d2        e;e&      e<k(  sJ d3        e!d4       e*j[                  d5e4f       e*j                          e*j[                  d6      j]                         d   ZDd7 e_(        e*j[                  d6      j]                         d   ZD e?j                         ZF e@j                  eF      5  ejo                  eDd       ddd        ej                  eFj                         j                         j                         d8         ZLeLd9   d:k(  sJ eL       e*j[                  d;e2f      j]                         ZMeMd    e4k(  sJ eM       e*j[                  d<e4f      j]                         ZNeNd"   d#k(  sJ  e!d=       e*j[                  d>e2f       e*j                          d? ZOeOejD                  _#        e*j[                  d@e4dAf       e*j                          e*j[                  dB      j]                         d   ZP	 dC e_(        ejo                  ePd       e*j[                  d;e2f      j]                         ZTeTd    J eT       e*j[                  dEePf      j]                         ZUeUd(   dFk(  reUd)   dGk(  sJ  e!dH       e$ejD                  _#        e*j                           e       ZW e!dIeW        e!dJ       y# eA$ rZBd1 eeB      v sJ eB       Y dZB[BdZB[Bww xY w# 1 sw Y   xY w# eQ$ r#ZB e!dD eReB      j                         Y dZB[BdZB[Bww xY w)Ku7  
AA-043-P2W tests against a fresh knowledge.db copy.
Covers: WRITE_CONFIRMED sets current_graph_version_id, ADOPT_EXISTING too,
graphiti_state='done', failure path does NOT set the pointer, recovery,
re-run no duplicate write, queue 890 untouched (productive DB never opened
for writes here — all on copies).
    Nz$/tmp/aa043-p2i/dbs/knowledge-test.dbz /tmp/aa043-p2i/dbs/state-test.dbz+/opt/struktur/youtube-research/knowledge.dbzB/opt/struktur/obsidian-graphiti-import/obsidian_graphiti_import.dbAA043_KNOWLEDGE_DB
p2w_writerz-/tmp/aa043-p2i/aa043_single_writer_staging.pypathlib)Pathc                      t        j                  t              } t         j                  | _        i }dD ]*  }| j                  d|       j                         d   ||<   , | j                          |S )N)source_processing_registrysource_versionsreconciliation_decisionsgraphiti_import_queuezSELECT COUNT(*) c FROM c)sqlite3connectKNOWLEDGE_DBRowrow_factoryexecutefetchoneclose)r   outts      /tmp/p2w_test.pycountsr   $   sk    %Aw{{q}
CC J4QC89BBDSIAJ GGIJ    zBEFORE:c                   $    e Zd Zd Zd Zd Zd Zy)FakeRespc                 X    t        j                  ddi      j                         | _        y )Nuuidtest-episode-uuid-123)jsondumpsencodedataselfs    r   __init__zFakeResp.__init__3   s     DJJ8O/P$Q$X$X$Z	r   c                     | j                   S N)r"   r#   s    r   readzFakeResp.read4   s    499$r   c                     | S r'    r#   s    r   	__enter__zFakeResp.__enter__5   s    r   c                      y)NFr*   )r$   as     r   __exit__zFakeResp.__exit__6   s    5r   N)__name__
__module____qualname__r%   r(   r+   r.   r*   r   r   r   r   2   s    Z$$(r   r   c                 T    t         j                  | j                         t               S r'   )postedappendfull_urlr   reqr-   kws      r   fake_urlopenr9   8   s    
MM#,,:r   c                      g S r'   r*   r*   r   r   <lambda>r;   =   s    b r   zlSELECT id FROM graphiti_import_queue WHERE obsidian_path LIKE '%SOL_006_CLOSURE_REPORT%' AND action='CREATE'z%queue row for pilot not found in copyidzpilot queue id:a$  SELECT r.id, r.current_graph_version_id, r.current_state
                   FROM source_processing_registry r
                   JOIN source_versions sv ON sv.registry_id=r.id
                   JOIN graphiti_import_queue q ON q.source_version_id=sv.version_id
                   WHERE q.id=?zregistry before:z>SELECT source_version_id FROM graphiti_import_queue WHERE id=?zSSELECT graphiti_state, reconciliation_state FROM source_versions WHERE version_id=?zversion before:z/opt/obsidian-vaultF)dry_runzYSELECT current_graph_version_id, current_state FROM source_processing_registry WHERE id=?zregistry after confirmed:current_graph_version_idzXSELECT graphiti_state, episode_uuid, verified_at FROM source_versions WHERE version_id=?graphiti_statedoneepisode_uuidr   verified_atzaSELECT graphiti_status, graphiti_episode_id, remote_outcome FROM graphiti_import_queue WHERE id=?graphiti_statusremote_outcomeWRITE_CONFIRMEDgraphiti_episode_idzOPASS WRITE_CONFIRMED setzt current_graph_version_id=889 + graphiti_state='done'   z	/episodesz<SELECT import_identity FROM graphiti_import_queue WHERE id=?c                       dddt         z   dgiS )Nepisodesr   zimport_identity:r   source_description)iidr*   r   r   r;   r;   g   s     z-D,s2%4 $5 6 r   zqueue_status_not_eligible:donez)re-run rejected: status done not eligiblezduplicate POST happened!z?PASS Re-Run nach Success -> kein Duplicate-Write (Status-Guard)an  INSERT INTO graphiti_import_queue(source_type,obsidian_path,content_hash,
    graphiti_status,created_at,updated_at,reconciliation_record_id,source_version_id,
    import_identity,knowledge_unit_identity,action)
    VALUES('obsidian','P2W/test.md','cc','queued','2026-01-01','2026-01-01',
    'aa043:obsidian-general:p2wtest',?, 'f'*64 ,'__source__','ADD_KNOWLEDGE')zdSELECT id FROM graphiti_import_queue WHERE reconciliation_record_id='aa043:obsidian-general:p2wtest'c                      dddgS )Nzadopted-uuid-42zPimport_identity:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffrJ   r*   r*   r   r   r;   r;   ~   s     179 : r   actionADOPT_EXISTINGzJSELECT current_graph_version_id FROM source_processing_registry WHERE id=?z=SELECT graphiti_state FROM source_versions WHERE version_id=?z2PASS ADOPT_EXISTING setzt current_graph_version_idzNUPDATE source_processing_registry SET current_graph_version_id=NULL WHERE id=?c                     t        d      )Nzsimulated timeout)TimeoutErrorr6   s      r   failing_urlopenrS      s    
*
++r   ab  INSERT INTO graphiti_import_queue(source_type,obsidian_path,content_hash,
    graphiti_status,created_at,updated_at,reconciliation_record_id,source_version_id,
    import_identity,knowledge_unit_identity,action)
    VALUES('obsidian','P2W/fail.md','dd','queued','2026-01-01','2026-01-01',
    'aa043:obsidian-general:p2wfail',?, ?, '__source__','CREATE')@eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeezdSELECT id FROM graphiti_import_queue WHERE reconciliation_record_id='aa043:obsidian-general:p2wfail'c                      g S r'   r*   r*   r   r   r;   r;      s    " r   zfailure raised (expected):zLSELECT graphiti_status, remote_outcome FROM graphiti_import_queue WHERE id=?
processingUNKNOWN_REMOTE_OUTCOMEz<PASS Failure setzt Graph-Zeiger NICHT; Retry-State vorhandenzAFTER:z=== P2W: all tests passed ===)X__doc__importlib.util	importlibr   shutilr   sysurllib.requesturllibr   STATE_DBcopyfileos_envutilspec_from_file_locationspecmodule_from_specmmodulesloaderexec_moduleos_osenvironget
__import__r   DBr   _Pstrr   beforeprintrequesturlopen_real_urlopenr   r3   r9   	inventoryr   r   r   r   r   r   qqidregrid_regdictvidv0chdirrunreg1v1qqlenn_posted_beforerL   buf_outio
contextlibRuntimeErrorecommitq2StringIOb2redirect_stdoutloadsgetvaluestrip
splitlinesout2reg2v2rS   q3	Exceptiontyper/   reg3str   afterr*   r   r   <module>r      s5       
 5- =| L TV^ _
	-~~--ACNN##D)L      
{{+,X
90E0J0J<0X 	,
144yL  +#add) +  
 i  &&) )
 
 & GOOL!7;;1=II|}  G  G  I} == =}g   ii # &)F	, -5HJ	 
 d) $s) $iiPSVRXYbbdefgYYdgjflmvvx b "  			
   c5 yylovnxy  C  C  E !4: .&'3. 4 4.YYilokqr{{}	
v% )r )%	.44 44	-$ $$YYruxtz{  E  E  G	
&2.>+?CT+T TT	
 $;; ;; W X
6{aK6!94 44 f+iiNQTPVW``bcde6
 9EE#uE 1 2
6{o% A'A A% G H 		 Q
 f 
YYuv  B  CD  E:YYuv  B  CD  ER[[]Z# EE"eEtzz"++-%%'224R89H~)) /4 /)yy]`g_ijssu&'3. 4 4.YYNQTPVW``b	
v% %% : ; 		
Z]d\f g 
,(  		 E HKFm	U
 
YYuv  B  CD  E:AKEE"eE 	yy]`g_ijssu&'/ 5 5/YY]`b_dennp	
,4D1EIa1a aa D E&  	 h  % &w  9+s1v58q859* 4  :	
&Q(8(899:s<   Y) !Z,Z )Z
.ZZ
Z[Z==[