Ë
    ÕÓêj$  ã                   óÖ   — d Z ddlZddlmc mZ ddlZddlm	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 d„ Zd	„ Zd
„ Zd„ Zd„ Zd„ Zd„ Zd„ Zedk(  r e
j:                  edg«       yy)z°Tests for temporal validity functionality (MemStrata pattern).

Tests bi-temporal ledger with valid_from, valid_to, superseded_by fields
and deterministic supersedence checks.
é    N©Ú	MagicMock©ÚSQLiteDatabase)ÚKnowledgeDocumentÚDocumentStatus)ÚMemoryService)ÚKnowledgeNavigatorc                  óÀ
  — t        dddddddt        j                  i t        j                  «       t        j                  «       ¬«      } d	}t	        | |«      }|sÖd
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  }t        t        j                  |«      «      ‚dx}}d}t	        | |«      }|sÖd
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  }t        t        j                  |«      «      ‚dx}}d}t	        | |«      }|sÖd
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  }t        t        j                  |«      «      ‚dx}}| j                  }d}||k(  }|s­t        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(  }|s­t        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(  }|s­t        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)z>Test that KnowledgeDocument has temporal fields with defaults.útest-docútest-sourceúfile:///test.txtÚabc123ú
text/plainÚreviewedÚpersonal©Údocument_idÚ	source_idÚ
source_uriÚcontent_sha256Ú
media_typeÚtrustÚsensitivityÚstatusÚmetadataÚ
created_atÚ
updated_atÚ
valid_fromz5assert %(py5)s
{%(py5)s = %(py0)s(%(py1)s, %(py3)s)
}ÚhasattrÚdoc)Úpy0Úpy1Úpy3Úpy5NÚvalid_toÚsuperseded_byç        ©ú==)z2%(py2)s
{%(py2)s = %(py0)s.valid_from
} == %(py5)s©r"   Úpy2r%   úassert %(py7)sÚpy7)z0%(py2)s
{%(py2)s = %(py0)s.valid_to
} == %(py5)sÚ ©z5%(py2)s
{%(py2)s = %(py0)s.superseded_by
} == %(py5)s)r   r   ÚINDEXEDÚtimer    Ú@py_builtinsÚlocalsÚ
@pytest_arÚ_should_repr_global_nameÚ	_safereprÚAssertionErrorÚ_format_explanationr   Ú_call_reprcomparer&   r'   )r!   Ú@py_assert2Ú@py_assert4Ú@py_format6Ú@py_assert1Ú@py_assert3Ú@py_format8s          ú?/home/oem/CyberBrain26-unified/tests/test_knowledge_temporal.pyÚ'test_knowledge_document_temporal_fieldsrB      sø  € ä
ØØØ%ØØØØÜ×%Ñ%ØÜ—9‘9“;Ü—9‘9“;ô€Cð %Ð%Œ7�3˜Ó%Ð%Ñ%×%×%×%×%Õ%Œ7×%×%Ó%Œ7×%×%×%×%×%Ò%�3×%×%Ó%�3×%×%Ô%˜×%×%Ò%Ð%×%×%×%×%×%Ò%Ø"Ð#Œ7�3˜
Ó#Ð#Ñ#×#×#×#×#Õ#Œ7×#×#Ó#Œ7×#×#×#×#×#Ò#�3×#×#Ó#�3×#×#Ô#˜
×#×#Ò#Ð#×#×#×#×#×#Ò#Ø'Ð(Œ7�3˜Ó(Ð(Ñ(×(×(×(×(Õ(Œ7×(×(Ó(Œ7×(×(×(×(×(Ò(�3×(×(Ó(�3×(×(Ô(˜×(×(Ò(Ð(×(×(×(×(×(Ò(Ø�>‰>Ð ˜SÐ ˆ>˜SÑ × × Õ ˆ>˜S× × × × × Ñ ˆ3× × Ó ˆ3× × Ô ˆ>× × Ò ˜S× × × × × × Ó Ø�<‰<Ð˜3Ðˆ<˜3Ñ××Õˆ<˜3×××××Ñˆ3××Óˆ3××Ôˆ<××Ò˜3××××××ÓØ×ÑÐ" Ð"Ð Ñ"×"×"Õ"Ð ×"×"×"×"×"Ñ"ˆ3×"×"Ó"ˆ3×"×"Ô"Ð×"×"Ò" ×"×"×"×"×"×"Ô"ó    c                  ó  — t        j                   «       } t        dddddddt        j                  i | | | | dz   d	¬
«      }|j                  }|| k(  }|sÚt        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                  | «      rt        j                  | «      nddœz  }dd|iz  }t        t        j                  |«      «      ‚dx}}|j                  }d}| |z   }||k(  }|sît        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                  | «      rt        j                  | «      ndt        j                  |«      dœz  }dd|iz  }	t        t        j                  |	«      «      ‚dx}x}x}}|j                  }d	}
||
k(  }|s­t        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)z5Test KnowledgeDocument with explicit temporal values.r   r   r   r   r   r   r   i  ú	newer-doc©r   r   r   r   r   r   r   r   r   r   r   r   r&   r'   r)   )z2%(py2)s
{%(py2)s = %(py0)s.valid_from
} == %(py4)sr!   Únow©r"   r,   Úpy4úassert %(py6)sÚpy6N)z<%(py2)s
{%(py2)s = %(py0)s.valid_to
} == (%(py4)s + %(py6)s))r"   r,   rI   rK   zassert %(py9)sÚpy9r0   r+   r-   r.   )r2   r   r   r1   r   r5   r:   r3   r4   r6   r7   r8   r9   r&   r'   )rG   r!   r>   r?   Ú@py_format5Ú@py_format7Ú@py_assert5Ú@py_assert7r@   Ú@py_format10r<   r=   s               rA   Ú0test_knowledge_document_temporal_fields_explicitrR   *   sÐ  € ä
�)‰)‹+€CÜ
ØØØ%ØØØØÜ×%Ñ%ØØØØØ�t‘Ø!ô€Cð" �>‰>Ð ˆ>˜SÑ × × Õ ˆ>˜S× × × × × Ñ ˆ3× × Ó ˆ3× × Ô ˆ>× × × × × Ð ˜S× × Ó ˜S× × × × × × Ó Ø�<‰<Ð% Ð%˜3 ™:Ð%ˆ<˜:Ñ%×%×%Õ%ˆ<˜:×%×%×%×%×%Ñ%ˆ3×%×%Ó%ˆ3×%×%Ô%ˆ<×%×%×%×%×%Ð%˜3×%×%Ó%˜3×%×%Ô% ×%×%×%×%×%×%Õ%Ø×ÑÐ+ Ð+Ð Ñ+×+×+Õ+Ð ×+×+×+×+×+Ñ+ˆ3×+×+Ó+ˆ3×+×+Ô+Ð×+×+Ò+ ×+×+×+×+×+×+Ô+rC   c                  óD  — t        «       } t        dddddddt        j                  i t	        j                  «       t	        j                  «       t	        j                  «       dz
  d	d
¬«      }| j                  |«      }d}||u }|s™t        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)z>Test check_temporal_validity returns True for active document.z
active-docr   r   r   r   r   r   éd   r(   r/   rF   T©Úis©z%(py0)s is %(py3)sÚresult©r"   r$   úassert %(py5)sr%   N©r
   r   r   r1   r2   Úcheck_temporal_validityr5   r:   r3   r4   r6   r7   r8   r9   ©Ú	navigatorr!   rX   r;   r>   Ú@py_format4r=   s          rA   Ú,test_check_temporal_validity_active_documentr`   C   sÅ   € ä"Ó$€Iä
Ø ØØ%ØØØØÜ×%Ñ%ØÜ—9‘9“;Ü—9‘9“;Ü—9‘9“; Ñ$ØØô€Cð" ×.Ñ.¨sÓ3€FØÐˆ6�Tˆ>××Õˆ6�T×××××Ñˆ6××Óˆ6××Ô�T××××××ÒrC   c                  ón  — t        «       } t        dddddddt        j                  i t	        j                  «       t	        j                  «       t	        j                  «       dz
  t	        j                  «       d	z
  d
¬«      }| j                  |«      }d}||u }|s™t        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)zCTest check_temporal_validity returns False for superseded document.zold-docr   r   r   r   r   r   rT   é
   znew-docrF   FrU   rW   rX   rY   rZ   r%   Nr[   r]   s          rA   Ú0test_check_temporal_validity_superseded_documentrc   \   sÐ   € ä"Ó$€Iä
ØØØ%ØØØØÜ×%Ñ%ØÜ—9‘9“;Ü—9‘9“;Ü—9‘9“; Ñ$Ü—‘“˜rÑ!Øô€Cð" ×.Ñ.¨sÓ3€FØÐˆ6�Uˆ?××Õˆ6�U×××××Ñˆ6××Óˆ6××Ô�U××××××ÒrC   c                  ó  — t        «       } t        d«      D �cg c]Œ  }t        d|› �dd|› d�dddd	t        j                  i t        j
                  «       t        j
                  «       t        j
                  «       d
z
  |dk  rdnt        j
                  «       dz
  |dk  rdnd¬«      ‘ŒŽ }}| j                  |«      }t        |«      }d}||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                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚dx}x}}d„ |D «       }	t!        |	«      }
|
s•d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c c}w )z:Test get_valid_documents filters out superseded documents.é   zdoc-r   zfile:///testz.txtr   r   r   r   rT   é   r(   rb   r/   rE   rF   r)   ©z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)sÚlenÚvalid©r"   r#   r$   rK   úassert %(py8)sÚpy8Nc              3   ó:   K  — | ]  }|j                   d k(  –— Œ y­w)r/   N)r'   )Ú.0Úds     rA   ú	<genexpr>z>test_get_valid_documents_filters_superseded.<locals>.<genexpr>�   s   è ø€ Ò4¨ˆq�‰ "Õ$Ñ4ùs   ‚z,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}ÚallrH   )r
   Úranger   r   r1   r2   Úget_valid_documentsrh   r5   r:   r3   r4   r6   r7   r8   r9   rq   )r^   ÚiÚdocsri   r;   rO   r<   rN   Ú@py_format9r>   r?   rM   s               rA   Ú+test_get_valid_documents_filters_supersededrw   u   s¦  € ä"Ó$€Iô& �q“ö#ð" ô! 	Ø˜q˜c˜
Ø#Ø% a S¨Ð-Ø#Ø#ØØ"Ü!×)Ñ)ØÜ—y‘y“{Ü—y‘y“{Ü—y‘y“{ SÑ(Ø šE‘S¤t§y¡y£{°RÑ'7Ø ! A¢™"¨;ö	
ð€Dð ð( ×)Ñ)¨$Ó/€EÜˆu‹:Ð˜Ðˆ:˜‰?××Õˆ:˜×××××ÑŒ3××ÓŒ3×××××Òˆu××Óˆu××Ôˆ:××Ò˜××××××ÓÙ4¨eÔ4Ð4Œ3Ð4Ó4Ð4Ñ4×4×4×4×4Õ4Œ3×4×4Ó4Œ3×4×4Ô4Ð4×4×4Ò4Ð4×4×4×4×4×4Ó4ùò-s   ˜BI<c                  óŠ  ‡— ddl m}  ddlm}  | |¬«      }t	        | | «       ¬«      }dddd	œd
ddd	œg}t        j
                  «       Šˆfd„}||_        g }|D ]U  }|j                  d«      }|j                  |«      }	|	sŒ(|j                  j                  |	‰«      sŒE|j                  |«       ŒW t        |«      }
d}|
|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"                  |
«      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)z?Test that MemoryService temporal filtering works via navigator.r   r   r   )Úspec)ÚdatabaseÚ	audit_logúdoc-1gÍÌÌÌÌÌì?z
active doc)ÚidÚscoreÚtextúdoc-2gš™™™™™é?zsuperseded docc                 óà   •— | dk(  r0t        dddddddt        j                  i ‰dz
  ‰dz
  ‰dz
  d	d
¬«      S | dk(  r3t        dddddddt        j                  i ‰dz
  ‰dz
  ‰dz
  ‰dz
  d¬«      S y )Nr|   r   zfile:///test1.txtr   r   r   r   rT   r(   r/   rF   r€   zfile:///test2.txtÚdef456rb   zdoc-3)r   r   r1   )Údoc_idÚcurrent_times    €rA   Úmock_get_documentzEtest_memory_service_temporal_filter_direct.<locals>.mock_get_document¥   s·   ø€ Ø�WÒÜ$Ø#Ø'Ø.Ø'Ø'Ø Ø&Ü%×-Ñ-ØØ'¨#Ñ-Ø'¨#Ñ-Ø'¨#Ñ-ØØ ôð ð  �wÒÜ$Ø#Ø'Ø.Ø'Ø'Ø Ø&Ü%×-Ñ-ØØ'¨#Ñ-Ø'¨#Ñ-Ø'¨#Ñ-Ø%¨Ñ*Ø%ôð ð  rC   r}   é   r)   rg   rh   Úvalid_resultsrj   rk   rl   N)z%(py1)s == %(py4)s)r#   rI   rJ   rK   )Úunittest.mockr   Ú$cyberbrain26.data_plane.sqlite_storer   r	   r2   Úget_documentÚgetr^   r\   Úappendrh   r5   r:   r3   r4   r6   r7   r8   r9   )r   r   Úmock_dbÚserviceÚmock_resultsr…   r‡   rX   rƒ   Údocumentr;   rO   r<   rN   rv   Ú@py_assert0r?   rM   r„   s                     @rA   Ú*test_memory_service_temporal_filter_directr’   ’   s£  ø€ å'åCá˜^Ô,€GÜØÙ“+ô€Gð  ¨lÑ;Ø Ð.>Ñ?ð€Lô
 —9‘9“;€Lô#ðJ -€GÔð €MØò )ˆØ—‘˜DÓ!ˆØ×'Ñ'¨Ó/ˆÚ˜×)Ñ)×AÑAÀ(ÈLÕYØ× Ñ  Õ(ð	)ô ˆ}ÓÐ" Ð"Ð Ñ"×"×"Õ"Ð ×"×"×"×"×"Ñ"Œ3×"×"Ó"Œ3×"×"×"×"×"Ò"ˆ}×"×"Ó"ˆ}×"×"Ô"Ð×"×"Ò" ×"×"×"×"×"×"Ó"Ø˜Ñ˜DÑ!Ð, WÐ,Ð! WÑ,×,×,Õ,Ð! W×,×,Ó,Ð!×,×,Ò, W×,×,×,×,×,×,Ô,rC   c                  ó4  — t        «       } t        dddddddt        j                  i t	        j                  «       t	        j                  «       ¬«      }| j                  |d	«      }|j                  }d}||k(  }|s­t        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(  }|s­t        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}||kD  }|s­t        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        j                  } |«       }	d}
|	|
z   }||k  }|�st        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                  |«      t        j                  |	«      t        j                  |
«      dœz  }dd|iz  }t        t        j                  |«      «      ‚dx}x}x}x}	x}
}y)z5Test supersede_document method in KnowledgeNavigator.zdoc-to-superseder   r   r   r   r   r   r   z
new-doc-idr)   )z3%(py2)s
{%(py2)s = %(py0)s.document_id
} == %(py5)sÚsuperseded_docr+   r-   r.   Nr0   r   )ú>)z/%(py2)s
{%(py2)s = %(py0)s.valid_to
} > %(py5)sr†   )ú<=)zn%(py2)s
{%(py2)s = %(py0)s.valid_to
} <= (%(py8)s
{%(py8)s = %(py6)s
{%(py6)s = %(py4)s.time
}()
} + %(py10)s)r2   )r"   r,   rI   rK   rl   Úpy10zassert %(py13)sÚpy13)r
   r   r   r1   r2   Úsupersede_documentr   r5   r:   r3   r4   r6   r7   r8   r9   r'   r&   )r^   r!   r”   r>   r<   r?   r=   r@   rO   rP   Ú@py_assert9Ú@py_assert11Ú@py_format12Ú@py_format14s                 rA   Útest_supersede_documentrž   Ø   sx  € ä"Ó$€Iä
Ø&ØØ%ØØØØÜ×%Ñ%ØÜ—9‘9“;Ü—9‘9“;ô€Cð ×1Ñ1°#°|ÓD€Nà×%Ñ%Ð;Ð);Ð;Ð%Ð);Ñ;×;×;Õ;Ð%Ð);×;×;×;×;×;Ñ;ˆ>×;×;Ó;ˆ>×;×;Ô;Ð%×;×;Ò;Ð);×;×;×;×;×;×;Ó;Ø×'Ñ'Ð7¨<Ð7Ð'¨<Ñ7×7×7Õ7Ð'¨<×7×7×7×7×7Ñ7ˆ>×7×7Ó7ˆ>×7×7Ô7Ð'×7×7Ò7¨<×7×7×7×7×7×7Ó7Ø×"Ñ"Ð& QÐ&Ð" QÑ&×&×&Õ&Ð" Q×&×&×&×&×&Ñ&ˆ>×&×&Ó&ˆ>×&×&Ô&Ð"×&×&Ò& Q×&×&×&×&×&×&Ó&Ø×"Ñ"Ð5¤d§i¡iÐ5¡i£kÐ5°AÐ5 k°A¡oÐ5Ð" oÑ5×5×5Ö5Ð" o×5×5×5×5×5Ñ5ˆ>×5×5Ó5ˆ>×5×5Ô5Ð"×5×5×5×5×5Ð5¤d×5×5Ó5¤d×5×5Ô5 i×5×5Ò5 k×5×5Ò5°A×5×5×5×5×5×5×5Ò5rC   c                  óš  — t        «       } t        dddddddt        j                  i t	        j                  «       t	        j                  «       t	        j                  «       dz
  t	        j                  «       d	z
  d
¬«      }| j                  |«      }d}||u }|s™t        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}}t        dddddddt        j                  i t	        j                  «       t	        j                  «       t	        j                  «       dz
  dd¬«      }| j                  |«      }d}||u }|s™t        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)z&Test edge cases for temporal validity.zexpired-docr   r   r   r   r   r   rT   rb   r/   rF   TrU   rW   rX   rY   rZ   r%   Nzsuperseded-docr(   rE   Fr[   )r^   Údoc1rX   r;   r>   r_   r=   Údoc2s           rA   Ú!test_temporal_validity_edge_casesr¢   ò   s�  € ä"Ó$€Iô Ø!ØØ%ØØØØÜ×%Ñ%ØÜ—9‘9“;Ü—9‘9“;Ü—9‘9“; Ñ$Ü—‘“˜rÑ!Øô€Dð& ×.Ñ.¨tÓ4€FØÐˆ6�Tˆ>××Õˆ6�T×××××Ñˆ6××Óˆ6××Ô�T××××××Ñô Ø$ØØ%ØØØØÜ×%Ñ%ØÜ—9‘9“;Ü—9‘9“;Ü—9‘9“; Ñ$ØØ!ô€Dð" ×.Ñ.¨tÓ4€FØÐˆ6�Uˆ?××Õˆ6�U×××××Ñˆ6××Óˆ6××Ô�U××××××ÒrC   Ú__main__z-v)Ú__doc__Úbuiltinsr3   Ú_pytest.assertion.rewriteÚ	assertionÚrewriter5   r2   rˆ   r   Úpytestr‰   r   Ú&cyberbrain26.knowledge_plane.contractsr   r   Ú+cyberbrain26.knowledge_plane.memory_servicer	   Ú'cyberbrain26.knowledge_plane.navigationr
   rB   rR   r`   rc   rw   r’   rž   r¢   Ú__name__ÚmainÚ__file__© rC   rA   ú<module>r±      sr   ðñ÷ „ ƒÝ #ã å ?ß TÝ EÝ Fò#ò0,ò2ò2ò25ò:C-òL6ò4.ðb ˆzÒØ€F‡K�K�˜4Ð Õ!ð rC   