
    $/iL              
          d Z ddlZddlmc mZ ddlZddlZddl	Z	ddl
Z
ddlmZ ddlZej                  j                  de	j                  j!                  e	j                  j#                  e	j                  j%                  e      d                   ddlmZmZmZ  G d d      Z G d d	      Z G d
 d      Z G d d      Z G d d      Zedk(  r ej<                  eddg       yy)z
Test Suite for Relationship Mapper (Story KG-003)

Implements black-box and white-box testing as required by GLOBAL_GENESIS_RULES.md
    N)Pathz..)RelationshipMapperstore_relationshipsload_relationshipsc                   @    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zy
)TestRelationshipMapperBlackBoxz&Black box tests for RelationshipMapperc                     t        d      | _        t        j                  ddd      | _        | j                  j                          y)Setup for each test method333333?similarity_thresholdwF.jsonlmodedeletesuffixN)r   mappertempfileNamedTemporaryFile	temp_filecloseselfs    7/mnt/e/genesis-system/tests/test_relationship_mapper.pysetup_methodz+TestRelationshipMapperBlackBox.setup_method   s5    (cB!44#eT\]    c                     t         j                  j                  | j                  j                        r*t        j
                  | j                  j                         yy)zCleanup after each testN)ospathexistsr   nameremover   s    r   teardown_methodz.TestRelationshipMapperBlackBox.teardown_method%   s7    77>>$..--.IIdnn))* /r   c                     ddg}d}| j                   j                  ||      }t        |      }d}||kD  }|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  }t        j                  d
      dz   d|iz  }t        t        j                  |            dx}x}}d |D        }	t        |	      }
|
st        j                  d      dz   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)z4Test that basic relationships are detected from text	Service A	Service Bz(Service A uses Service B for processing.r   >z/%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} > %(py6)slenrelationshipspy0py1py3py6z'Should detect at least one relationship
>assert %(py8)spy8Nc              3   @   K   | ]  }|d    dk(  xr |d   dk(    yw)sourcer&   targetr'   N .0rs     r   	<genexpr>zSTestRelationshipMapperBlackBox.test_basic_relationship_detection.<locals>.<genexpr>2   s2      * X;+-L!H+2LL *s   z/Should find Service A -> Service B relationship.
>assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}anyr.   py2py4)r   map_relationshipsr+   
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_saferepr_format_assertmsgAssertionError_format_explanationr=   r   entitiestextr,   @py_assert2@py_assert5@py_assert4@py_format7@py_format9@py_assert1@py_assert3@py_format5s               r   !test_basic_relationship_detectionz@TestRelationshipMapperBlackBox.test_basic_relationship_detection*   s   -955hE=!PAP!A%PPP!APPPPPPsPPPsPPPPPP=PPP=PPP!PPPAPPP'PPPPPPPP*(* 	]s * * 	] * 	]K\K\+\	] 	]V\V\	] 	]D\D\  	] 	]S\S\  	] 	]S\S\* 	] 	]S\S\* 	] 	] 	]I\I\	] 	]r   c                 X   g d}d}| j                   j                  ||      }t        d |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  }t        j                  d	      d
z   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  }t        j                  d      d
z   d|iz  }t        t        j                  |            dx}}y)z.Test detection of different relationship types)zModule AzModule BzModule CzO
        Module A depends on Module B.
        Module A uses Module C.
        c              3   &   K   | ]	  }|d      ywrelation_typeNr7   r8   s     r   r;   zRTestRelationshipMapperBlackBox.test_multiple_relationship_types.<locals>.<genexpr>?   s     GAQ/Gs   
depends_oninz%(py1)s in %(py3)srelation_typesr/   r0   z%Should detect depends_on relationship
>assert %(py5)spy5NuseszShould detect uses relationship)r   rA   setrB   rC   rG   rD   rE   rF   rH   rI   rJ   )	r   rL   rM   r,   r_   @py_assert0rN   @py_format4@py_format6s	            r    test_multiple_relationship_typesz?TestRelationshipMapperBlackBox.test_multiple_relationship_types5   s    7
 55hEGGGV|~-VVV|~VVV|VVVVVV~VVV~VVVV/VVVVVVVJv'JJJvJJJvJJJJJJJJJJJJJ)JJJJJJJr   c                    ddg}d}| j                   j                  ||      }|D cg c]  }|d   dk(  s| }}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  }	t        j                  d      dz   d|	iz  }
t        t        j                  |
            dx}x}}yc c}w )z.Test that empty text produces no relationshipszEntity AzEntity B detection_methodpattern_matchr   ==z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)sr+   pattern_relsr-   z2Empty text should produce no pattern relationshipsr2   r3   N)r   rA   r+   rB   rC   rD   rE   rF   rG   rH   rI   rJ   )r   rL   rM   r,   r:   rp   rN   rO   rP   rQ   rR   s              r   #test_no_relationships_in_empty_textzBTestRelationshipMapperBlackBox.test_no_relationships_in_empty_textC   s    
+55hE $1]aA6H4I_4\]]< [A[ A%[[[ A[[[[[[s[[[s[[[[[[<[[[<[[[ [[[A[[['[[[[[[[[ ^s
   E#E#c                 >   ddg}d}| j                   j                  ||      }t        || j                  j                        }d}||kD  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }t        j                  d	      d
z   d|iz  }t        t        j                  |            dx}}t        | j                  j                        }	t        |	      }||k(  }
|
s9t        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  }t        j                  d      dz   d|iz  }t        t        j                  |            dx}}
|	d   d   }d}||u}|st        j                  d|fd||f      t        j                  |      t        j                  |      dz  }t        j                  d      dz   d|iz  }t        t        j                  |            dx}x}}|	d   d   }d}||u}|st        j                  d|fd||f      t        j                  |      t        j                  |      dz  }t        j                  d      dz   d|iz  }t        t        j                  |            dx}x}}y)z0Test that relationships can be stored and loadedzEntity XzEntity Yz.Entity X references Entity Y in documentation.r   r(   )z%(py0)s > %(py3)scountr.   r0   z&Should store at least one relationshipra   rb   Nrm   z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py5)sr+   loadedr.   r/   r0   rb   z(Should load same number of relationships
>assert %(py7)spy7r5   )is not)z%(py1)s is not %(py4)sr/   r@   z&Loaded relationship should have source
>assert %(py6)sr1   r6   z&Loaded relationship should have target)r   rA   r   r   r"   rB   rC   rD   rE   rF   rG   rH   rI   rJ   r   r+   )r   rL   rM   r,   rs   rN   rS   rf   rg   rv   rP   @py_format8re   rT   rU   rQ   s                   r   !test_store_and_load_relationshipsz@TestRelationshipMapperBlackBox.test_store_and_load_relationshipsN   s   
+?55hE#M4>>3F3FGBuqyBBBuqBBBBBBuBBBuBBBqBBBBBBBBBB#DNN$7$786{O{e#OOO{eOOOOOOsOOOsOOOOOO6OOO6OOO{OOOOOOeOOOeOOOO%OOOOOOOay"X$X"$.XXX"$XXX"XXX$XXX0XXXXXXXXay"X$X"$.XXX"$XXX"XXX$XXX0XXXXXXXXr   c           	      .   ddddddi ddd	dd
ddi dg}t        || j                  j                         t        | j                  j                  d      }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  }t        j                  d      dz   d|iz  }t        t        j                  |            dx}x}}|d   d   }d}	||	k\  }|st        j                  d|fd||	f      t        j                  |      t        j                  |	      dz  }
t        j                  d      dz   d|
iz  }t        t        j                  |            dx}x}}	y)z1Test loading relationships with confidence filterABrc   ?test
2026-01-25r5   r6   rZ   
confidencerk   	timestampmetadataCD      ?皙?min_confidence   rm   ro   r+   rv   r-   z.Should only load high confidence relationshipsr2   r3   Nr   r   >=)z%(py1)s >= %(py4)sr{   z)Loaded relationship should meet thresholdr|   r1   r   r   r"   r   r+   rB   rC   rD   rE   rF   rG   rH   rI   rJ   r   test_relationshipsrv   rN   rO   rP   rQ   rR   re   rT   rU   s              r   test_filtering_by_confidencez;TestRelationshipMapperBlackBox.test_filtering_by_confidence]   sa   
 v!vL v!vL
 	.0C0CD#DNN$7$7L6{QaQ{aQQQ{aQQQQQQsQQQsQQQQQQ6QQQ6QQQ{QQQaQQQ!QQQQQQQQay&Z#Z&#-ZZZ&#ZZZ&ZZZ#ZZZ/ZZZZZZZZr   c           	      .   ddddddi ddd	d
dddi dg}t        || j                  j                         t        | j                  j                  d      }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  }t        j                  d      dz   d|iz  }t        t        j                  |            dx}x}}|d   d   }d}	||	k(  }|st        j                  d|fd||	f      t        j                  |      t        j                  |	      dz  }
t        j                  d      dz   d|
iz  }t        t        j                  |            dx}x}}	y)z+Test loading relationships filtered by typer   r   r[   r   r   r   r   r   r   rc   rZ   r   rm   ro   r+   rv   r-   z)Should only load depends_on relationshipsr2   r3   Nr   rZ   z%(py1)s == %(py4)sr{   z*Loaded relationship should be correct typer|   r1   r   r   s              r   test_filtering_by_typez5TestRelationshipMapperBlackBox.test_filtering_by_types   sa    |!vL v!vL
 	.0C0CD#DNN$7$7|T6{LaL{aLLL{aLLLLLLsLLLsLLLLLL6LLL6LLL{LLLaLLL!LLLLLLLLay)g\g)\9ggg)\ggg)ggg\ggg;ggggggggr   N)__name__
__module____qualname____doc__r   r$   rV   rh   rq   r~   r   r   r7   r   r   r   r      s3    0+
	]K	\Y[,hr   r   c                   R    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zy)TestRelationshipMapperWhiteBoxz7White box tests for RelationshipMapper internal methodsc                 &    t        d      | _        y)r
   r   r   N)r   r   r   s    r   r   z+TestRelationshipMapperWhiteBox.setup_method   s    (cBr   c                    g d}d}| j                   j                  ||      }t        |      }d}||kD  }|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  }t        j                  d	      d
z   d|iz  }t        t        j                  |            dx}x}}d |D        }	t        |	      }
|
st        j                  d      dz   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}	}
d |D        }	t        |	      }
|
st        j                  d      dz   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)zTest Python import detection)DatabaseUserServiceAuthenticationz\
import Database
from UserService import get_user
from Authentication import verify
        r   r(   r*   r+   r,   r-   z"Should detect import relationshipsr2   r3   Nc              3   ,   K   | ]  }|d    dk(    ywrZ   r[   Nr7   r8   s     r   r;   zQTestRelationshipMapperWhiteBox.test_detect_code_imports_python.<locals>.<genexpr>        M!1_%5M   z&Should create depends_on relationshipsr<   r=   r>   c              3   ,   K   | ]  }|d    dk(    yw)rk   code_importNr7   r8   s     r   r;   zQTestRelationshipMapperWhiteBox.test_detect_code_imports_python.<locals>.<genexpr>   s     Qa1'(M9Qr   zShould mark as code_import)r   _detect_code_importsr+   rB   rC   rD   rE   rF   rG   rH   rI   rJ   r=   rK   s               r   test_detect_code_imports_pythonz>TestRelationshipMapperWhiteBox.test_detect_code_imports_python   s   @ 88xH=!KAK!A%KKK!AKKKKKKsKKKsKKKKKK=KKK=KKK!KKKAKKK'KKKKKKKKM}M 	5sMM 	5M 	5#4#44	5 	5.4f	5 	544  	5 	5+49  	5 	5+49 N 	5 	5+49 N 	5 	5 	5!4!4	5 	5Q=Q 	)sQQ 	)Q 	)(((	) 	)"(&	) 	)((  	) 	)(y  	) 	)(y R 	) 	)(y R 	) 	) 	)((	) 	)r   c                    t        j                         5 }t        |      dz  }|j                          |dz  }|j	                          ddg}| j
                  j                  t        |      |      }t        |      }d}||kD  }|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  }	t        j                  d
      dz   d|	iz  }
t!        t        j"                  |
            dx}x}}d |D        }t%        |      }|st        j                  d      dz   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}}ddd       y# 1 sw Y   yxY w)z)Test file structure containment detectionr   z
handler.pyhandlerr   r(   r*   r+   r,   r-   z&Should detect containment relationshipr2   r3   Nc              3   ,   K   | ]  }|d    dk(    yw)rZ   containsNr7   r8   s     r   r;   zTTestRelationshipMapperWhiteBox.test_detect_contains_relationships.<locals>.<genexpr>   s     OAq)Z7Or   z$Should create contains relationshipsr<   r=   r>   )r   TemporaryDirectoryr   mkdirtouchr   _detect_contains_relationshipsstrr+   rB   rC   rD   rE   rF   rG   rH   rI   rJ   r=   )r   tmpdirservice_dir	test_filerL   r,   rN   rO   rP   rQ   rR   rS   rT   rU   s                 r   "test_detect_contains_relationshipszATestRelationshipMapperWhiteBox.test_detect_contains_relationships   s    ((* 	7fv,6K#l2IOO%y1H KKFFIM }%SS%)SSS%SSSSSS3SSS3SSSSSS}SSS}SSS%SSSSSS+SSSSSSSSOO 73OO 7O 7%6%667 7067 766  7 7-6Y  7 7-6Y P 7 7-6Y P 7 7 7#6#67 7	7 	7 	7s   I	I''I0c                    ddg}d}| j                   j                  ||      }t        |      }d}||kD  }|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  }t        j                  d
      dz   d|iz  }t        t        j                  |            dx}x}}d |D        }	t        |	      }
|
st        j                  d      dz   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}	}
d |D        }	t        |	      }
|
st        j                  d      dz   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)z9Test documentation reference detection via markdown linkszAPI Documentation	UserGuidez
        See the [API Documentation](./api.md) for details.
        Refer to [UserGuide](#user-guide) for instructions.
        r   r(   r*   r+   r,   r-   z%Should detect reference relationshipsr2   r3   Nc              3   ,   K   | ]  }|d    dk(    yw)rZ   
referencesNr7   r8   s     r   r;   zWTestRelationshipMapperWhiteBox.test_detect_references_markdown_links.<locals>.<genexpr>   r   r   z&Should create references relationshipsr<   r=   r>   c              3   *   K   | ]  }d |d   v   yw)link_urlr   Nr7   r8   s     r   r;   zWTestRelationshipMapperWhiteBox.test_detect_references_markdown_links.<locals>.<genexpr>   s     F1::.Fs   zShould include link metadatar   _detect_referencesr+   rB   rC   rD   rE   rF   rG   rH   rI   rJ   r=   rK   s               r   %test_detect_references_markdown_linkszDTestRelationshipMapperWhiteBox.test_detect_references_markdown_links   s   '5
 66tXF=!NAN!A%NNN!ANNNNNNsNNNsNNNNNN=NNN=NNN!NNNANNN'NNNNNNNNM}M 	5sMM 	5M 	5#4#44	5 	5.4f	5 	544  	5 	5+49  	5 	5+49 N 	5 	5+49 N 	5 	5 	5!4!4	5 	5FF 	+sFF 	+F 	+***	+ 	+$*F	+ 	+**  	+ 	+!*  	+ 	+!* G 	+ 	+!* G 	+ 	+ 	+**	+ 	+r   c                     ddg}d}| j                   j                  ||      }t        |      }d}||kD  }|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  }t        j                  d
      dz   d|iz  }t        t        j                  |            dx}x}}d |D        }	t        |	      }
|
st        j                  d      dz   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)z Test textual reference detectionConfigurationzSetup GuidezX
        See Configuration for more details.
        Documented in Setup Guide.
        r   r(   r*   r+   r,   r-   z Should detect textual referencesr2   r3   Nc              3   ,   K   | ]  }|d    dk(    yw)rk   textual_referenceNr7   r8   s     r   r;   zPTestRelationshipMapperWhiteBox.test_detect_references_textual.<locals>.<genexpr>   s     WA1'(,??Wr   z Should mark as textual referencer<   r=   r>   r   rK   s               r   test_detect_references_textualz=TestRelationshipMapperWhiteBox.test_detect_references_textual   ss   #]3
 66tXF=!IAI!A%III!AIIIIIIsIIIsIIIIII=III=III!IIIAIII'IIIIIIIIWW 	/sWW 	/W 	/...	/ 	/(.	/ 	/..  	/ 	/%.Y  	/ 	/%.Y X 	/ 	/%.Y X 	/ 	/ 	/..	/ 	/r   c                 d   g d}| j                   j                  |d      }|D cg c]  }|d   dk(  r
|d   |d   f }}t        |      }d}||kD  }|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  }t        j                  d      dz   d|iz  }	t        t        j                  |	            dx}x}}d |D        }
t        |
      }|st        j                  d      dz   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 similarity detection for similar entities)r   UserServiceImplDataServiceNrZ   
similar_tor5   r6   r   r(   r*   r+   similar_pairsr-   zShould detect similar entitiesr2   r3   c              3   0   K   | ]  }d |v xr d|v   yw)r   r   Nr7   )r9   pairs     r   r;   zMTestRelationshipMapperWhiteBox.test_detect_similarity_high.<locals>.<genexpr>   s+      
 d"@'8D'@@
s   z8Should detect UserService and UserServiceImpl as similarr<   r=   r>   )r   _detect_similarityr+   rB   rC   rD   rE   rF   rG   rH   rI   rJ   r=   )r   rL   r,   r:   r   rN   rO   rP   rQ   rR   rS   rT   rU   s                r   test_detect_similarity_highz:TestRelationshipMapperWhiteBox.test_detect_similarity_high   s   D66xF >K ?_-= H+q{3 ? ? =!GAG!A%GGG!AGGGGGGsGGGsGGGGGG=GGG=GGG!GGGAGGG'GGGGGGGG
%
 	Fs 
 
 	F 
 	F 5F4EE	F 	F @Fv	F 	F .F-E  	F 	F =FI  	F 	F =FI
 	F 	F =FI
 	F 	F 	F 3F2E	F 	F?s   H-c                    ddg}| j                   j                  |d      }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  }t        j                  d
      dz   d|iz  }t        t        j                  |            dx}x}}y)z7Test that dissimilar entities are not marked as similarAppleZebraNr   rm   ro   r+   r,   r-   z)Dissimilar entities should not be relatedr2   r3   )r   r   r+   rB   rC   rD   rE   rF   rG   rH   rI   rJ   )r   rL   r,   rN   rO   rP   rQ   rR   s           r   test_detect_similarity_lowz9TestRelationshipMapperWhiteBox.test_detect_similarity_low   s    W%66xF =!SQS!Q&SSS!QSSSSSSsSSSsSSSSSS=SSS=SSS!SSSQSSS(SSSSSSSSr   c                    | 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  }t        j                  d      dz   d	|iz  }t        t        j                  |            d
x}}y
)z1Test similarity calculation for identical stringsr   g      ?rm   z%(py0)s == %(py3)s
similarityrt   z/Identical strings should have similarity of 1.0ra   rb   Nr   _calculate_similarityrB   rC   rD   rE   rF   rG   rH   rI   rJ   r   r   rN   rS   rf   rg   s         r   #test_calculate_similarity_identicalzBTestRelationshipMapperWhiteBox.test_calculate_similarity_identical   sz    [[66vvF
 SzS SSSzSSSSSSSzSSSzSSSSSSS"SSSSSSSr   c                    | 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  }t        j                  d      d	z   d
|iz  }t        t        j                  |            dx}}y)z1Test similarity calculation for different stringsappleoranger   <z%(py0)s < %(py3)sr   rt   z,Different strings should have low similarityra   rb   Nr   r   s         r   #test_calculate_similarity_differentzBTestRelationshipMapperWhiteBox.test_calculate_similarity_different   sz    [[66wI
OzCOOOzCOOOOOOzOOOzOOOCOOO!OOOOOOOr   c           	         | j                   j                  dddddddi      }|d	   }d}||k(  }|st        j                  d
|fd||f      t        j                  |      t        j                  |      dz  }t        j
                  d      dz   d|iz  }t        t        j                  |            dx}x}}|d   }d}||k(  }|st        j                  d
|fd||f      t        j                  |      t        j                  |      dz  }t        j
                  d      dz   d|iz  }t        t        j                  |            dx}x}}|d   }d}||k(  }|st        j                  d
|fd||f      t        j                  |      t        j                  |      dz  }t        j
                  d      dz   d|iz  }t        t        j                  |            dx}x}}|d   }d}||k(  }|st        j                  d
|fd||f      t        j                  |      t        j                  |      dz  }t        j
                  d      dz   d|iz  }t        t        j                  |            dx}x}}|d   }d}||k(  }|st        j                  d
|fd||f      t        j                  |      t        j                  |      dz  }t        j
                  d      dz   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  }t        j
                  d      dz   d |iz  }t        t        j                  |            dx}}|d!   d   }d}||k(  }|st        j                  d
|fd||f      t        j                  |      t        j                  |      dz  }t        j
                  d"      dz   d|iz  }t        t        j                  |            dx}x}}y)#z0Test relationship creation has correct structurer   rc   r   g333333?r   keyvalue)r5   rZ   r6   r   source_typer   r5   rm   r   r{   zShould have correct sourcer|   r1   Nr6   zShould have correct targetrZ   z!Should have correct relation typer   zShould have correct confidencerk   z$Should have correct detection methodr   r\   r^   relr`   zShould have timestampra   rb   r   zShould preserve metadata)r   _create_relationshiprB   rC   rG   rH   rI   rJ   rD   rE   rF   )	r   r   re   rT   rN   rU   rQ   rf   rg   s	            r   "test_create_relationship_structurezATestRelationshipMapperWhiteBox.test_create_relationship_structure   s   kk.. W% / 
 8}AA}#AAA}AAA}AAAAAA%AAAAAAAA8}AA}#AAA}AAA}AAAAAA%AAAAAAAA?#RvR#v-RRR#vRRR#RRRvRRR/RRRRRRRR< JDJ D(JJJ DJJJ JJJDJJJ*JJJJJJJJ%&X&X&&0XXX&&XXX&XXX&XXX2XXXXXXXX:{c!:::{c:::{::::::c:::c::::#::::::::u%LL%0LLL%LLL%LLLLLL2LLLLLLLLr   c                 <  
 ddg}g d}|D ]  \  }
| j                   j                  ||      }|D cg c]  }|d   dk(  s| }}
fd|D        }t        |      }|st        j                  d
 d| d	      d
z   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 that all defined patterns are usedr   r   ))zA uses Brc   )zA depends on Br[   )zA configures B
configures)zA generates B	generates)zA monitors Bmonitors)zA contains Br   )zA references Br   rk   rl   c              3   .   K   | ]  }|d    k(    ywrY   r7   )r9   r:   expected_types     r   r;   zHTestRelationshipMapperWhiteBox.test_patterns_coverage.<locals>.<genexpr>   s     Qqq)]:Qs   zShould detect z pattern in ''r<   r=   r>   N)r   rA   r=   rB   rH   rD   rE   rF   rG   rI   rJ   )r   rL   
test_casesrM   r,   r:   rp   rS   rT   rU   r   s             @r   test_patterns_coveragez5TestRelationshipMapperWhiteBox.test_patterns_coverage  s1   :

 $. 	ED- KK99(DIM'4a!:L8MQ`8`AaLaQLQ E3QQ EQ E3D3D.}TF!DE E>DfE E,D,D  E E;D9  E E;D9 R E E;D9 R E E E1D1DE E		Eas   DDN)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r7   r   r   r   r      sC    AC)"7$+ /F$TT
P
M&Er   r   c                   .    e Zd ZdZd Zd Zd Zd Zd Zy)!TestRelationshipMapperIntegrationz-Integration tests combining multiple featuresc                    t        d      }g d}d}t        j                  ddd      5 }|j                  }d	d	d	       	 |j	                  ||      }t        |      }d
}||kD  }	|	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  }
t        j                  d      dz   d|
iz  }t        t        j                  |            d	x}x}	}t        |      }t        |      }	||	k(  }|s9t        j                  d|fd||	f      dt        j                         v st        j                  |      rt        j                  |      n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                  |	      dz  }t        j                  d      dz   d|iz  }t        t        j                  |            d	x}}	t!        |      }t        |      }||k(  }	|	s9t        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  }t        j                  d      dz   d|iz  }t        t        j                  |            d	x}}	t!        |d      }t        |      }||k  }	|	s9t        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  }t        j                  d#      dz   d|iz  }t        t        j                  |            d	x}}	t!        |d$%      }d& |D        }t#        |      }|st        j                  d'      d(z   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}}t$        j&                  j)                  |      rt%        j*                  |       y	y	# 1 sw Y   `xY w# t$        j&                  j)                        rt%        j*                  |       w w xY w)+z9Test complete pipeline: detect -> store -> load -> filterr   r   )ServiceAServiceBServiceCz
        ServiceA uses ServiceB for authentication.
        ServiceB depends on ServiceC.
        See [ServiceA Documentation](./docs/servicea.md) for details.

        import ServiceB
        from ServiceC import authenticate
        r   Fr   r   Nr   r(   r*   r+   r,   r-   zShould detect relationshipsr2   r3   rm   )z0%(py0)s == %(py5)s
{%(py5)s = %(py2)s(%(py3)s)
}rs   )r.   r?   r0   rb   zShould store all relationshipsrx   ry   ru   rv   rw   zShould load all relationshipsr   r   )<=)z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} <= %(py5)s	high_confz#Filtered results should be <= totalr[   r   c              3   ,   K   | ]  }|d    dk(    ywr   r7   r8   s     r   r;   zGTestRelationshipMapperIntegration.test_full_pipeline.<locals>.<genexpr>O  s     Naq)\9Nr   z+Should only return depends_on relationshipsr<   allr>   )r   r   r   r"   rA   r+   rB   rC   rD   rE   rF   rG   rH   rI   rJ   r   r   r   r   r    r!   r#   )r   r   rL   rM   fr   r,   rN   rO   rP   rQ   rR   rs   rS   rg   r}   rv   r   r[   rT   rU   s                        r   test_full_pipelinez4TestRelationshipMapperIntegration.test_full_pipeline+  s   #=7 ((c%Q 	UVI		%"44XtDM}%HH%)HHH%HHHHHH3HHH3HHHHHH}HHH}HHH%HHHHHH+HHHHHHHH (yAE.P5..PPP5.PPPPPP5PPP5PPPPPPCPPPCPPPPPPPPPPPP.PPP0PPPPPPP (	2Fv;H;%'HHH;%HHHHHH3HHH3HHHHHHvHHHvHHH;HHHHHH%HHH%HHHH)HHHHHHH +9SIIy>Q>U*QQQ>UQQQQQQ3QQQ3QQQQQQyQQQyQQQ>QQQQQQUQQQUQQQQ,QQQQQQQ+I\RJN:N >3NN >N >,=,==> >7=v> >%=%=  > >4=I  > >4=I O > >4=I O > > >*=*=> > ww~~i(		)$ )3	 	2 ww~~i(		)$ )s   ZXZ# Z #7[c                    t               }g d}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  }t        j                  d	      d
z   d|iz  }	t        t        j                  |	            dx}x}}y)z1Test handling of entities with special characters)z	Service-Az	Service.B	Service_Cz'Service-A uses Service.B and Service_C.r   r   z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} >= %(py6)sr+   r,   r-   z&Should not crash on special charactersr2   r3   Nr   rA   r+   rB   rC   rD   rE   rF   rG   rH   rI   rJ   
r   r   rL   rM   r,   rN   rO   rP   rQ   rR   s
             r   !test_edge_case_special_characterszCTestRelationshipMapperIntegration.test_edge_case_special_charactersV  s    #%:8004@ =!PQP!Q&PPP!QPPPPPPsPPPsPPPPPP=PPP=PPP!PPPQPPP(PPPPPPPPr   c                    t               }ddg}ddz  }|j                  ||      }t        |      }d}||kD  }|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  }t        j                  d      dz   d|iz  }	t        t        j                  |	            dx}x}}y)zTest handling of very long textEntityAEntityBzEntityA uses EntityB. i  r   r(   r*   r+   r,   r-   z(Should detect relationships in long textr2   r3   Nr  r  s
             r   test_edge_case_very_long_textz?TestRelationshipMapperIntegration.test_edge_case_very_long_texta  s    #%y) ($.004@ =!QAQ!A%QQQ!AQQQQQQsQQQsQQQQQQ=QQQ=QQQ!QQQAQQQ'QQQQQQQQr   c                    t               }g }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  }t        j                  d      d	z   d
|iz  }	t        t        j                  |	            dx}x}}y)z"Test handling of empty entity listzSome text without entities.r   rm   ro   r+   r,   r-   z(Should return empty list for no entitiesr2   r3   Nr  r  s
             r   test_edge_case_no_entitiesz<TestRelationshipMapperIntegration.test_edge_case_no_entitiesn  s    #%,004@=!RQR!Q&RRR!QRRRRRRsRRRsRRRRRR=RRR=RRR!RRRQRRR(RRRRRRRRr   c           	      t   ddddddi dddddddi dg}t        j                  dd	d
      5 }|j                  }ddd       	 t        |      }d}||k(  }|st	        j
                  d|fd||f      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      dz  }t	        j                  d      dz   d|iz  }t        t	        j                  |            dx}}t        |      }	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  }t	        j                  d      dz   d|iz  }t        t	        j                  |            dx}x}}
t        j                   j#                  |      rt        j$                  |       yy# 1 sw Y   ;xY w# t        j                   j#                        rt        j$                  |       w w xY w)z/Test that duplicate relationships can be storedr   r   rc   r   r   r   r   r   Fr   r   N   rm   r   rs   rt   z1Should store both relationships even if duplicatera   rb   ro   r+   rv   r-   zShould load both relationshipsr2   r3   )r   r   r"   r   rB   rC   rD   rE   rF   rG   rH   rI   rJ   r   r+   r   r    r!   r#   )r   	test_relsr   r   rs   rN   rS   rf   rg   rv   rO   rP   rQ   rR   s                 r   &test_edge_case_duplicate_relationshipszHTestRelationshipMapperIntegration.test_edge_case_duplicate_relationshipsx  s    v!v)r v!v)r
	 ((c%Q 	UVI			%'	9=ER5A:RRR5ARRRRRR5RRR5RRRARRRRRRRRRR'	2Fv;E!E;!#EEE;!EEEEEE3EEE3EEEEEEvEEEvEEE;EEE!EEE%EEEEEEEE ww~~i(		)$ )	 	 ww~~i(		)$ )s   I3G:J  3I= 7J7N)	r   r   r   r   r   r  r  r
  r  r7   r   r   r   r   (  s"    7)%V	QRS%r   r   c                       e Zd ZdZd Zy)!TestRelationshipMapperPerformancezPerformance baseline testsc                    ddl }t        d      }t        d      D cg c]  }d| 	 }}d}|j                         }|j                  ||      }|j                         |z
  }d}	||	k  }
|
st	        j
                  d	|
fd
||	f      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |	      dz  }t	        j                  d|dd      dz   d|iz  }t        t	        j                  |            dx}
}	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  }t	        j                  d      dz   d|iz  }t        t	        j                  |            dx}	x}}yc c}w )z.Test performance with large number of entitiesr   Ngffffff?r   d   Entity_z5Entity_0 uses Entity_1. Entity_1 depends on Entity_2.g      @r   r   elapsedrt   zProcessing took too long: z.2fsra   rb   r   r  r+   r,   r-   zShould return resultsr2   r3   )timer   rangerA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   r+   )r   r  r   irL   rM   
start_timer,   r  rN   rS   rf   rg   rO   rP   rQ   rR   s                    r   "test_performance_large_entity_listzDTestRelationshipMapperPerformance.test_performance_large_entity_list  so   #= ,1:6agaSM66FYY[
004@))+
* Iw}IIIwIIIIIIwIIIwIIIIII :73-qIIIIIII=!?Q?!Q&???!Q??????s???s??????=???=???!???Q???(???????? 7s   IN)r   r   r   r   r  r7   r   r   r  r    s    $@r   r  c                       e Zd ZdZd Zy) TestRelationshipMapperRegressionz7Regression tests to ensure existing functionality worksc                 X
   t               }g d}d}|j                  ||      }t        |      }d}||kD  }|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  }t        j                  d	      d
z   d|iz  }	t        t        j                  |	            dx}x}}|D 
cg c]  }
|
d   dk(  r
|
d   dk(  r|
 }}
|D 
cg c]  }
|
d   dk(  r
|
d   dk(  r|
 }}
|D 
cg c]  }
|
d   dk(  r
|
d   dk(  r|
 }}
t        |      }d}||kD  }|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  }t        j                  d      d
z   d|iz  }	t        t        j                  |	            dx}x}}t        |      }d}||kD  }|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  }t        j                  d      d
z   d|iz  }	t        t        j                  |	            dx}x}}t        |      }d}||kD  }|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  }t        j                  d      d
z   d|iz  }	t        t        j                  |	            dx}x}}yc c}
w c c}
w c c}
w )z8Test that the original example from the code still works)zUser Servicer   zAuthentication ModulezMonitoring Toolz
        The User Service uses the Database to store user information.
        The Authentication Module depends on the User Service for authentication.
        The Monitoring Tool monitors the User Service and the Database.
        r   r(   r*   r+   r,   r-   z1Should detect relationships from original exampler2   r3   NrZ   rc   rk   rl   r[   r   	uses_relsz"Should detect 'uses' relationshipsdepends_relsz(Should detect 'depends_on' relationshipsmonitors_relsz&Should detect 'monitors' relationshipsr  )r   r   rL   rM   r,   rN   rO   rP   rQ   rR   r:   r  r  r   s                 r   !test_original_example_still_workszBTestRelationshipMapperRegression.test_original_example_still_works  s\   #%[ 004@ =!ZAZ!A%ZZZ!AZZZZZZsZZZsZZZZZZ=ZZZ=ZZZ!ZZZAZZZ'ZZZZZZZZ !. b1)V3:L8MQ`8`  b	 b#0 kaO,<CUAVZiAi  k k$1 jq_-;BT@UYh@h  j j 9~GG~!GGG~GGGGGGsGGGsGGGGGG9GGG9GGG~GGGGGG#GGGGGGGG< P1P 1$PPP 1PPPPPPsPPPsPPPPPP<PPP<PPP PPP1PPP&PPPPPPPP=!OAO!A%OOO!AOOOOOOsOOOsOOOOOO=OOO=OOO!OOOAOOO'OOOOOOOObkjs   T-T"T'N)r   r   r   r   r!  r7   r   r   r  r    s    APr   r  __main__z-vz
--tb=short)r   builtinsrD   _pytest.assertion.rewrite	assertionrewriterB   pytestjsonr   r   pathlibr   sysr    insertabspathjoindirname__file__"core.knowledge.relationship_mapperr   r   r   r   r   r   r  r  r   mainr7   r   r   <module>r2     s       	   
 277??277<<0I4#PQ R jh jhbTE TEvk% k%d@ @4P P@ zFKK4./ r   