
    W$ig                       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
mZ ddlmZmZ ddlZddlmZ ddlmZ ddlmZmZ 	 	 	 	 	 d"	 	 	 	 	 	 	 	 	 	 	 d#d	Z	 	 	 	 d$	 	 	 	 	 	 	 	 	 d%d
Z	 	 d&	 	 	 	 	 d'dZd(dZ	 	 	 	 d)	 	 	 	 	 	 	 	 	 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      Z" G d d      Z# G d d      Z$ G d  d!      Z%y)+u}  
tests/track_b/test_story_8_07.py

Story 8.07: GitOpsPRCreator — GitHub PR Automation

Tests for core/evolution/gitops_pr_creator.py.

ALL external services (HTTP and git) are fully mocked.
No real GitHub API calls or git subprocess calls are made.

BB Tests (Black Box):
    BB1: Valid proposal + arena result → PRResult with pr_url, branch_name, pr_number
    BB2: Branch name follows genesis-auto-refactor-{epoch_id} format
    BB3: PR body contains Shadow Arena metrics (pass_rate, ready_for_pr)
    BB4: create_pr returns PRResult dataclass with all 3 fields populated

WB Tests (White Box):
    WB1: GitHub API call uses Bearer token from constructor (header verified)
    WB2: Git operations use correct branch naming (mock call log verified)
    WB3: PR title matches [Genesis Auto] {file_path} — Epoch {epoch_id}
    WB4: Git operations target E: drive paths (no C: drive refs)
    )annotationsN)Any)	MagicMockcallCodeProposalArenaResult)GitOpsPRCreatorPRResultc                *    t        | ||||xs i       S )N	file_pathcode_contenttest_file_pathtest_contentconfig_changesr   r   s        6/mnt/e/genesis-system/tests/track_b/test_story_8_07.pymake_proposalr   *   s%     !%!%+     c                6    t        | ||ng |xs ddd|      S )N      ??old_success_ratenew_success_rate	pass_rateaxiom_violationsimproved_metricsready_for_prr	   r   s       r   make_arena_resultr"   :   s2     -=-I)r) > #=! r   c                $    t        | |d      }|S )zGReturn a mock http_client that returns a realistic GitHub API response.)html_urlnumberreturn_valuer   )r$   	pr_numbermocks      r   make_http_mockr+   I   s    
 x9"MNDKr   c                     t        d      S )zIReturn a mock git_runner that records all calls and returns empty string. r&   r(    r   r   make_git_mockr/   R   s    "%%r   c                b    |xs
 t               }|xs
 t               }t        | |||      }|||fS )zMConstruct a GitOpsPRCreator with fresh mocks and return (creator, http, git).github_tokengithub_repohttp_client
git_runner)r+   r/   r   )tokenrepo	http_mockgit_mockhttpgitcreators          r   make_creatorr=   W   sB     ((D

%moC	G D#r   c                  $    e Zd Zd Zd Zd Zd Zy) TestBB1ValidInputsReturnPRResultc                   t               \  }}}t               }t               }|j                  ||d      }t	        |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dt        j                         v st        j                  t
              rt        j                  t
              ndt        j                  |      dz  }t        t        j                  |            d }y )N	epoch_001epoch_idz5assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}
isinstanceresultr   )py0py1py2py4)r=   r   r"   	create_prrD   r   @py_builtinslocals
@pytest_ar_should_repr_global_name	_safereprAssertionError_format_explanation)	selfr<   r:   r;   proposalarenarE   @py_assert3@py_format5s	            r   test_returns_prresult_instancez?TestBB1ValidInputsReturnPRResult.test_returns_prresult_instanceo   s    )^s ?!#""8U["I&(++++++++z+++z++++++&+++&++++++(+++(++++++++++r   c                   t        t        d            \  }}}t               }t               }|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}	}y )Nz%https://github.com/owner/repo/pull/77)r$   r8   rA   rB   ==z.%(py2)s
{%(py2)s = %(py0)s.pr_url
} == %(py5)srE   rF   rH   py5assert %(py7)spy7)r=   r+   r   r"   rJ   pr_urlrM   _call_reprcomparerK   rL   rN   rO   rP   rQ   rR   r<   r:   r;   rS   rT   rE   @py_assert1@py_assert4rU   @py_format6@py_format8s               r   test_pr_url_is_populatedz9TestBB1ValidInputsReturnPRResult.test_pr_url_is_populatedx   s    )$.UV
s !?!#""8U["I}}G GG} GGGGG} GGGGGGGvGGGvGGG}GGG GGGGGGGGr   c                   t        t        d            \  }}}t               }t               }|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}	}y )Nc   r)   rY   rA   rB   rZ   z1%(py2)s
{%(py2)s = %(py0)s.pr_number
} == %(py5)srE   r]   r_   r`   )r=   r+   r   r"   rJ   r)   rM   rb   rK   rL   rN   rO   rP   rQ   rc   s               r   "test_pr_number_is_integer_from_apizCTestBB1ValidInputsReturnPRResult.test_pr_number_is_integer_from_api   s    )NR4PQs ?!#""8U["I%2%2%%%%2%%%%%%v%%%v%%%%%%2%%%%%%%r   c                    t               \  }}}t               }t               }|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}}y )
N	epoch_042rB   zgenesis-auto-refactor-epoch_042rZ   z3%(py2)s
{%(py2)s = %(py0)s.branch_name
} == %(py5)srE   r]   r_   r`   r=   r   r"   rJ   branch_namerM   rb   rK   rL   rN   rO   rP   rQ   rR   r<   _rS   rT   rE   rd   re   rU   rf   rg   s              r   test_branch_name_in_resultz;TestBB1ValidInputsReturnPRResult.test_branch_name_in_result   s    $A ?!#""8U["I!!F%FF!%FFFFF!%FFFFFFFvFFFvFFF!FFF%FFFFFFFFr   N)__name__
__module____qualname__rW   rh   rm   ru   r.   r   r   r?   r?   n   s    ,	H&Gr   r?   c                  $    e Zd Zd Zd Zd Zd Zy)TestBB2BranchNameFormatc                    t               \  }}}t               }t               }|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}	}y )
N	epoch_007rB   genesis-auto-refactor-epoch_007rZ   rp   rE   r]   r_   r`   rq   )rR   r<   rt   r;   rS   rT   rE   rd   re   rU   rf   rg   s               r   test_branch_uses_epoch_idz1TestBB2BranchNameFormat.test_branch_uses_epoch_id   s    &.C ?!#""8U["I!!F%FF!%FFFFF!%FFFFFFFvFFFvFFF!FFF%FFFFFFFFr   c                2   t               \  }}}t               }t               }|j                  ||d      }|j                  }|j
                  }d}	 ||	      }
|
sddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |	      t        j                  |
      dz  }t        t        j                  |            d x}x}x}	}
y )Nxyzzy_99rB   genesis-auto-refactor-zmassert %(py8)s
{%(py8)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.branch_name
}.startswith
}(%(py6)s)
}rE   )rF   rH   rI   py6py8)r=   r   r"   rJ   rr   
startswithrK   rL   rM   rN   rO   rP   rQ   )rR   r<   rt   r;   rS   rT   rE   rd   rU   @py_assert5@py_assert7@py_format9s               r   +test_branch_prefix_is_genesis_auto_refactorzCTestBB2BranchNameFormat.test_branch_prefix_is_genesis_auto_refactor   s    &.C ?!#""8UZ"H!!F!,,F-EF,-EFFFFFFFFvFFFvFFF!FFF,FFF-EFFFFFFFFFFr   c                
   d}t               \  }}}t               }t               }|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                  |	      dz  }dd	|iz  }t        t        j                  |            d x}x}
}	y )
N epoch_long_name_with_underscoresrB   r   rZ   rp   rE   r]   r_   r`   rq   )rR   epochr<   rt   r;   rS   rT   rE   rd   re   rU   rf   rg   s                r   +test_branch_suffix_matches_epoch_id_exactlyzCTestBB2BranchNameFormat.test_branch_suffix_matches_epoch_id_exactly   s    2&.C ?!#""8UU"C!!E'=eW%EE!%EEEEE!%EEEEEEEvEEEvEEE!EEE%EEEEEEEEr   c                   t               \  }}}t               }t               }|j                  ||d       |j                  d   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
   }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}||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}||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|   rB   r   checkoutrZ   z%(py1)s == %(py4)srG   rI   assert %(py6)sr      z-b   r}      main)
r=   r   r"   rJ   call_args_listrM   rb   rO   rP   rQ   )rR   r<   rt   r;   rS   rT   first_call_args@py_assert0rU   @py_assert2rV   @py_format7s               r   ,test_git_checkout_called_with_correct_branchzDTestBB2BranchNameFormat.test_git_checkout_called_with_correct_branch   s   &.C ?!#(EK@ ,,Q/215q!/Z/!Z////!Z///!///Z///////q!)T)!T))))!T)))!)))T)))))))q!F%FF!%FFFFF!%FFFF!FFF%FFFFFFFFq!+V+!V++++!V+++!+++V+++++++r   N)rv   rw   rx   r~   r   r   r   r.   r   r   rz   rz      s    GGF,r   rz   c                  >    e Zd Zd
dZd Zd Zd Zd Zd Zd Z	d Z
y	)!TestBB3PRBodyContainsArenaMetricsc                `    |j                   }|d   j                  d      xs |d   d   }|d   S )z5Extract the PR body from the captured http mock call.r   jsonr   r   body	call_argsgetrR   r:   call_kwargs	body_jsons       r   _get_pr_body_from_mockz8TestBB3PRBodyContainsArenaMetrics._get_pr_body_from_mock   s:    nn &a.,,V4IAq8I	  r   c                   t        t                     \  }}}t               }t        d      }|j	                  ||d       | j                  |      }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 )NrY   r   )r   rA   rB   z90.0%inz%(py1)s in %(py3)sr   rG   py3assert %(py5)sr^   r=   r+   r   r"   rJ   r   rM   rb   rO   rK   rL   rN   rP   rQ   rR   r<   r:   r;   rS   rT   r   r   r   @py_format4rf   s              r   test_pr_body_contains_pass_ratezATestBB3PRBodyContainsArenaMetrics.test_pr_body_contains_pass_rate   s    )$&
s !?!C0(EK@**40w$w$w$$r   c                   t        t                     \  }}}t               }t        d      }|j	                  ||d       | j                  |      }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 )NrY   T)r!   rA   rB   Truer   r   r   r   r   r^   r   r   s              r   'test_pr_body_contains_ready_for_pr_truezITestBB3PRBodyContainsArenaMetrics.test_pr_body_contains_ready_for_pr_true   s    )N4DEs ?!t4(EK@**40v~vvr   c                   t        t                     \  }}}t               }t        dd      }|j	                  ||d       | j                  |      }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 )NrY   Fr   )r!   r   rA   rB   Falser   r   r   r   r   r^   r   r   s              r   (test_pr_body_contains_ready_for_pr_falsezJTestBB3PRBodyContainsArenaMetrics.test_pr_body_contains_ready_for_pr_false   s    )N4DEs ?!uD(EK@**40w$w$w$$r   c                   t        t                     \  }}}t               }t               }|j	                  ||d       | j                  |      }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 )
NrY   epoch_special_99rB   r   r   r   r   r   r^   r   r   s              r   test_pr_body_contains_epoch_idz@TestBB3PRBodyContainsArenaMetrics.test_pr_body_contains_epoch_id   s    )N4DEs ?!#(E4FG**40!)!T))))!T)))!))))))T)))T)))))))r   c                F   t        t                     \  }}}t               }t        ddgdd      }|j	                  ||d       | j                  |      }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}}y )NrY   	no_sqlitee_drive_onlyFr   )r   r!   r   rA   rB   r   r   r   r   r   r^   r   r   s              r   3test_pr_body_contains_axiom_violations_when_presentzUTestBB3PRBodyContainsArenaMetrics.test_pr_body_contains_axiom_violations_when_present   s   )N4DEs ?!)>:
 	(EK@**40"{d""""{d"""{""""""d"""d"""""""%~%%%%~%%%~%%%%%%%%%%%%%%%%r   c                   t        t                     \  }}}t               }t        g       }|j	                  ||d       | j                  |      }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 )NrY   )r   rA   rB   Noner   r   r   r   r   r^   r   r   s              r   *test_pr_body_shows_none_when_no_violationszLTestBB3PRBodyContainsArenaMetrics.test_pr_body_shows_none_when_no_violations  s    )N4DEs ?!26(EK@**40v~vvr   c                D   t        t                     \  }}}t               }t        ddd      }|j	                  ||d       | j                  |      }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}}y )NrY   g?gq=
ףp?r   )r    rA   rB   r   r   r   r   r   r   r^   r   r   r   s              r   &test_pr_body_contains_improved_metricszHTestBB3PRBodyContainsArenaMetrics.test_pr_body_contains_improved_metrics  s   )N4DEs ?!254P
 	(EK@**40!)!T))))!T)))!))))))T)))T)))))))!)!T))))!T)))!))))))T)))T)))))))r   Nr:   r   returnstr)rv   rw   rx   r   r   r   r   r   r   r   r   r.   r   r   r   r      s*    !*&*r   r   c                  6    e Zd Zd Zd Zd Zd Zd Zd Zd Z	y)	TestBB4PRResultDataclassc                   t         j                  } |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 )NzNassert %(py5)s
{%(py5)s = %(py2)s
{%(py2)s = %(py0)s.is_dataclass
}(%(py3)s)
}dataclassesr   )rF   rH   r   r^   )
r   is_dataclassr   rK   rL   rM   rN   rO   rP   rQ   )rR   rd   re   rf   s       r   test_prresult_is_a_dataclassz5TestBB4PRResultDataclass.test_prresult_is_a_dataclass-  s    ''1'11111111{111{111'1111111111111111111r   c                   t        j                  t              D ch c]  }|j                   }}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 c c}w )Nra   r   r   fieldsr   r   r^   r   r   r   namerM   rb   rO   rK   rL   rN   rP   rQ   rR   fr   r   r   r   rf   s          r   test_prresult_has_pr_url_fieldz7TestBB4PRResultDataclass.test_prresult_has_pr_url_field0  s    "-"4"4X">?Q!&&??!x6!!!!x6!!!x!!!!!!6!!!6!!!!!!! @   Cc                   t        j                  t              D ch c]  }|j                   }}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 c c}w )Nrr   r   r   r   r   r   r^   r   r   s          r   #test_prresult_has_branch_name_fieldz<TestBB4PRResultDataclass.test_prresult_has_branch_name_field4  s    "-"4"4X">?Q!&&??&}&&&&}&&&}&&&&&&&&&&&&&&&& @r   c                   t        j                  t              D ch c]  }|j                   }}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 c c}w )Nr)   r   r   r   r   r   r^   r   r   s          r   !test_prresult_has_pr_number_fieldz:TestBB4PRResultDataclass.test_prresult_has_pr_number_field8  s    "-"4"4X">?Q!&&??${f$$$${f$$${$$$$$$f$$$f$$$$$$$ @r   c                :   t        t        dd            \  }}}t               }t               }|j	                  ||d      }|j
                  }d}||k7  }|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}||k7  }|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}||k7  }|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 )Nzhttps://github.com/x/y/pull/5   )r$   r)   rY   e99rB   r-   !=)z.%(py2)s
{%(py2)s = %(py0)s.pr_url
} != %(py5)srE   r]   r_   r`   )z3%(py2)s
{%(py2)s = %(py0)s.branch_name
} != %(py5)sr   )z1%(py2)s
{%(py2)s = %(py0)s.pr_number
} != %(py5)s)r=   r+   r   r"   rJ   ra   rM   rb   rK   rL   rN   rO   rP   rQ   rr   r)   rs   s              r   )test_all_three_fields_populated_in_resultzBTestBB4PRResultDataclass.test_all_three_fields_populated_in_result<  s   $$.MYZ[
A !?!#""8UU"C}}""}""""}""""""v"""v"""}""""""""""!!'R'!R''''!R''''''v'''v'''!'''R'''''''$1$1$$$$1$$$$$$v$$$v$$$$$$1$$$$$$$r   c                   t        t        d            \  }}}t               }t               }|j	                  ||d      }|j
                  }t        |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                  |      d	t        j                         v st        j                  t              rt        j                  t              nd	t        j                  |      d
z  }t        t        j                  |            d x}}y )N   rk   rY   e1rB   zTassert %(py6)s
{%(py6)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.pr_number
}, %(py4)s)
}rD   rE   int)rF   rG   r   rI   r   )r=   r+   r   r"   rJ   r)   rD   r   rK   rL   rM   rN   rO   rP   rQ   )	rR   r<   rt   rS   rT   rE   r   r   r   s	            r   test_pr_number_is_int_not_strz6TestBB4PRResultDataclass.test_pr_number_is_int_not_strI  s    $~/KLA ?!#""8UT"B **0z*C00000000z000z000000&000&000*000000C000C0000000000r   c                   t        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                  }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 )Nzhttps://example.com/pull/1z	my-branchr   )ra   rr   r)   rZ   r\   prr]   r_   r`   rp   rl   )r   ra   rM   rb   rK   rL   rN   rO   rP   rQ   rr   r)   )rR   r   rd   re   rU   rf   rg   s          r   $test_can_construct_prresult_directlyz=TestBB4PRResultDataclass.test_can_construct_prresult_directlyR  s]   9{^_`yy888y88888y8888888r888r888y88888888888~~,,~,,,,~,,,,,,r,,,r,,,~,,,,,,,,,,|| q |q    |q      r   r   |   q       r   N)
rv   rw   rx   r   r   r   r   r   r   r   r.   r   r   r   r   ,  s%    2"'%%1!r   r   c                  $    e Zd Zd Zd Zd Zd Zy)TestWB1GitHubTokenInHeaderc                   d}t        |      \  }}}t               }t               }|j                  ||d       |j                  }|d   j                  d      xs |d   d   }|j
                  }	d	}
 |	|
      }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                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}	x}
x}x}}y )Nghp_secret_super_token_xyzr6   rA   rB   r   headersr   r   AuthorizationBearer rZ   )zI%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.get
}(%(py4)s)
} == %(py9)s)rF   rH   rI   r   py9zassert %(py11)spy11r=   r   r"   rJ   r   r   rM   rb   rK   rL   rN   rO   rP   rQ   )rR   r6   r<   r:   r;   rS   rT   r   r   rd   rU   r   @py_assert8r   @py_format10@py_format12s                   r   )test_bearer_token_in_authorization_headerzDTestWB1GitHubTokenInHeader.test_bearer_token_in_authorization_header_  s
   ,)6s ?!#(EK@ NN	!!((3Fy|A{{@?@{?+@/@@+/@@@@@+/@@@@@@@w@@@w@@@{@@@?@@@+@@@/@@@@@@@@@r   c                   d}d}t               }t               }t        |      \  }}}t        |      \  }}	}|j                  ||d       |j                  ||d       |j                  d   j                  d      xs |j                  d   d	   }
|	j                  d   j                  d      xs |	j                  d   d	   }|
d
   }|d
   }||k7  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}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
   }||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}y )N	token_aaa	token_bbbr   r   rB   r   r   r   r   r   r   z%(py1)s != %(py4)sr   r   r   r   rZ   r   )r   r"   r=   rJ   r   r   rM   rb   rO   rP   rQ   )rR   token_atoken_brS   rT   	creator_ahttp_art   	creator_bhttp_b	headers_a	headers_br   rU   r   rV   r   s                    r   /test_different_tokens_produce_different_headerszJTestWB1GitHubTokenInHeader.test_different_tokens_produce_different_headersl  s    ?!#+':	61+':	61Hed;Hed;$$Q'++I6P&:J:J1:Ma:P	$$Q'++I6P&:J:J1:Ma:P	)GY-GG)-GGGGG)-GGGG)GGG-GGGGGGGG	"@i&@@"&@@@@@"&@@@@"@@@&@@@@@@@@	"@i&@@"&@@@@@"&@@@@"@@@&@@@@@@@@r   c                   t        d      \  }}}t               }t               }|j                  ||d       |j                  }|d   j                  d      xs |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  }
dd|
iz  }t        t        j                  |            d x}}	y )Nzmyorg/myrepo)r7   rA   rB   r   urlr   r   r   r   r   r^   r=   r   r"   rJ   r   r   rM   rb   rO   rK   rL   rN   rP   rQ   )rR   r<   r:   r;   rS   rT   r   r  r   r   r   rf   s               r   !test_github_api_url_contains_repoz<TestWB1GitHubTokenInHeader.test_github_api_url_contains_repo  s    )~>s ?!#(EK@NN	Q<##E*=il1o$~$$$$~$$$~$$$$$$$$$$$$$$$$r   c                   t               \  }}}t               }t               }|j                  ||d       |j                  }|d   j                  d      xs |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 )NrA   rB   r   methodr   POSTrZ   z%(py0)s == %(py3)srF   r   r   r^   r   )rR   r<   r:   r;   rS   rT   r   r	  r   rd   r   rf   s               r   test_http_method_is_postz3TestWB1GitHubTokenInHeader.test_http_method_is_post  s    )^s ?!#(EK@NN	l&&x0CIaLOvvvvr   N)rv   rw   rx   r   r  r  r  r.   r   r   r   r   ^  s    AA&	%	 r   r   c                  $    e Zd Zd Zd Zd Zd Zy)TestWB2GitBranchNamingc                   t               \  }}}t               }t               }|j                  ||d       |j                  }|d   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  }
d	d
|
iz  }t        t        j                  |            d x}}	y )N
epoch_testrB   r   r   r   r   
first_argsr   r   r^   )r=   r   r"   rJ   r   rM   rb   rO   rK   rL   rN   rP   rQ   )rR   r<   rt   r;   rS   rT   	all_callsr  r   r   r   rf   s               r   test_checkout_is_first_git_callz6TestWB2GitBranchNaming.test_checkout_is_first_git_call  s    &.C ?!#(ELA&&	q\!_Q'
'zZ''''zZ'''z''''''Z'''Z'''''''r   c                   t               \  }}}t               }t               }|j                  ||d       |j                  D cg c]
  }|d   d    }}|D cg c]	  }d|v s| }	}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}||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}}
y c c}w c c}w )N
epoch_pushrB   r   pushr   >=z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} >= %(py6)slen
push_callsrF   rG   r   r   assert %(py8)sr   originr   r   	push_argsr   r   r^   z genesis-auto-refactor-epoch_pushr=   r   r"   rJ   r   r  rM   rb   rK   rL   rN   rO   rP   rQ   )rR   r<   rt   r;   rS   rT   call_calls_argsargsr  r   r   re   r   r   r   r   r   rf   s                      r   !test_push_origin_branch_is_calledz8TestWB2GitBranchNaming.test_push_origin_branch_is_called  s   &.C ?!#(ELA+.+=+=>a!A$q'>>'5Ht4dH
H:#!#!####!######s###s######:###:######!#######qM	$x9$$$$x9$$$x$$$$$$9$$$9$$$$$$$1>1Y>>>>1Y>>>1>>>>>>Y>>>Y>>>>>>> ?Hs   K
	K$Kc                   t               \  }}}t        d      }t               }|j                  ||d       |j                  D cg c]
  }|d   d    }}|D cg c]	  }d|v s| }	}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   }||v }
|
slt        j                  d|
fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}
}y c c}w c c}w )Nzcore/interceptors/my_fix.pyr   rA   rB   r   addr   r  r  r  	add_callsr  r  r   r   )z%(py1)s in %(py4)sr   r   r   r!  )rR   r<   rt   r;   rS   rT   r"  r#  r$  r)  r   r   re   r   r   r   rU   rV   s                     r   (test_git_add_includes_proposal_file_pathz?TestWB2GitBranchNaming.test_git_add_includes_proposal_file_path  sV   &.C +HI!#(EK@+.+=+=>a!A$q'>>&4FdTF	F9~""~""""~""""""s"""s""""""9"""9"""~"""""""""",<	!<,<<<<,<<<,<<<<<<<<<< ?Fs   G<	H&Hc                   t               \  }}}t        d      }t               }|j                  ||d       |j                  D cg c]
  }|d   d    }}|D cg c]	  }d|v s| }	}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j                  |      }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 c c}w c c}w )Nz core/interceptors/special_fix.pyr'  rA   rB   r   commitr   r  r  r  commit_callsr  r  r    zspecial_fix.pyr   r   full_cmdr   r   r^   )r=   r   r"   rJ   r   r  rM   rb   rK   rL   rN   rO   rP   rQ   join)rR   r<   rt   r;   rS   rT   r"  r#  r$  r-  r   r   re   r   r   commit_argsr/  r   r   rf   s                       r   *test_git_commit_message_contains_file_pathzATestWB2GitBranchNaming.test_git_commit_message_contains_file_path  s}   &.C +MN!#(EK@+.+=+=>a!A$q'>>)7L8t;KLL< %A% A%%%% A%%%%%%s%%%s%%%%%%<%%%<%%% %%%A%%%%%%%"1o88K(+8++++8+++++++++8+++8+++++++ ?Ls   H8	H=&H=N)rv   rw   rx   r  r%  r*  r2  r.   r   r   r  r    s    	(?
=,r   r  c                  ,    e Zd ZddZd Zd Zd Zd Zy)TestWB3PRTitleFormatc                `    |j                   }|d   j                  d      xs |d   d   }|d   S )Nr   r   r   r   titler   r   s       r   _get_pr_title_from_mockz,TestWB3PRTitleFormat._get_pr_title_from_mock  s8    nn%a.,,V4IAq8I	!!r   c                   t               \  }}}t               }t               }|j                  ||d       | j	                  |      }|j
                  }d} ||      }	|	sddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |	      dz  }
t        t        j                  |
            d x}x}}	y )NrA   rB   z[Genesis Auto]zLassert %(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.startswith
}(%(py4)s)
}r6  rF   rH   rI   r   )r=   r   r"   rJ   r7  r   rK   rL   rM   rN   rO   rP   rQ   )rR   r<   r:   rt   rS   rT   r6  rd   rU   r   r   s              r   &test_pr_title_starts_with_genesis_autoz;TestWB3PRTitleFormat.test_pr_title_starts_with_genesis_auto  s    '>q ?!#(EK@,,T21 01 011111111u111u111111 01111111111r   c                   t               \  }}}t        d      }t               }|j                  ||d       | j	                  |      }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 )Nz#core/interceptors/my_interceptor.pyr'  rA   rB   r   r   r6  r   r   r^   r=   r   r"   rJ   r7  rM   rb   rO   rK   rL   rN   rP   rQ   rR   r<   r:   rt   rS   rT   r6  r   r   r   rf   s              r    test_pr_title_contains_file_pathz5TestWB3PRTitleFormat.test_pr_title_contains_file_path  s    '>q +PQ!#(EK@,,T24=4====4===4================r   c                   t               \  }}}t               }t               }|j                  ||d       | j	                  |      }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 )	Nepoch_unique_007rB   r   r   r6  r   r   r^   r<  r=  s              r   test_pr_title_contains_epoch_idz4TestWB3PRTitleFormat.test_pr_title_contains_epoch_id  s    '>q ?!#(E4FG,,T2!*!U****!U***!******U***U*******r   c                   t               \  }}}t        d      }t               }|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                  |      d	z  }	d
d|	iz  }
t        t        j                  |
            d x}}y )Nzcore/fix.pyr'  ro   rB   u.   [Genesis Auto] core/fix.py — Epoch epoch_042rZ   r  r6  r  r   r^   )r=   r   r"   rJ   r7  rM   rb   rK   rL   rN   rO   rP   rQ   )rR   r<   r:   rt   rS   rT   r6  r   rd   r   rf   s              r   test_pr_title_exact_formatz/TestWB3PRTitleFormat.test_pr_title_exact_format  s    '>q =9!#(EK@,,T2HHuHHHHHuHHHHHHHuHHHuHHHHHHHHHHHr   Nr   )rv   rw   rx   r7  r:  r>  rA  rC  r.   r   r   r4  r4    s    "
2>+Ir   r4  c                  $    e Zd Zd Zd Zd Zd Zy)TestWB4EDriveOnlyc                   ddl m} t        |      }|j                  }d} ||      }|st	        j
                  d| d      dz   dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      t	        j                  |      t	        j                  |      dz  }t        t	        j                  |            d x}x}}y )	Nr   
_REPO_ROOTz/mnt/ez%_REPO_ROOT must be on E: drive (got: )zN
>assert %(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.startswith
}(%(py4)s)
}repo_root_strr9  ) core.evolution.gitops_pr_creatorrH  r   r   rM   _format_assertmsgrK   rL   rN   rO   rP   rQ   )rR   rH  rJ  rd   rU   r   r   s          r   test_repo_root_is_on_e_drivez.TestWB4EDriveOnly.test_repo_root_is_on_e_drive  s    ?J'' 	
 	
'1 	
1 	
  4M?!D	
 	
	6	
 	
   	
 	
 		  	
 	
 		 ( 	
 	
 		 )1 	
 	
 		 2 	
 	
 	
 	
 	
 	
r   c                0   d}t        |      j                         }g }d}||v}|}|rd}||v}|}|sXt        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  }
|j                  |
       |rt        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  }|j                  |       t        j                  |d      i z  }dd|iz  }t        t        j                  |            dx}x}x}x}x}}y)zCVerify the module source code contains no C: drive hardcoded paths.9/mnt/e/genesis-system/core/evolution/gitops_pr_creator.pyC:\C:/not in)z%(py3)s not in %(py5)scontent)r   r^   z%(py7)sr`   )z%(py10)s not in %(py12)s)py10py12z%(py14)spy14r   zassert %(py17)spy17N)openreadrM   rb   rO   rK   rL   rN   append_format_booloprP   rQ   )rR   module_pathrT  rd   r   re   r   @py_assert9@py_assert11rf   rg   @py_format13@py_format15@py_format16@py_format18s                  r   test_no_c_drive_refs_in_modulez0TestWB4EDriveOnly.test_no_c_drive_refs_in_module  s     H 	 {#((*=v=vW$==g)=====vW===v======W===W=======g=========g===g==============r   c                $   ddl }ddlm} t        j                  t              } |d      5 }t        ddd      |_        |j                  dg       ddd       j                  }t        |d         d	kD  r|d	   j                  d
      xs |d   d	   n|d	   j                  d
      }|j                  j                  j                  d
      xs t        t              }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# 1 sw Y   5xY w)z@Verify the default git runner operates in /mnt/e/genesis-system.r   N)patchzsubprocess.runokr-   )
returncodestdoutstderrstatusr   cwd/mnt/e/r   r   r   r   r^   )
subprocessunittest.mockrf  r   __new__r   r'   _default_git_runnerr   r  r   kwargsr   rH  rM   rb   rO   rK   rL   rN   rP   rQ   )rR   rn  rf  r<   mock_runr   rl  r   r   r   rf   s              r   &test_default_git_runner_uses_mnt_e_cwdz8TestWB4EDriveOnly.test_default_git_runner_uses_mnt_e_cwd  s.   '!))/:#$ 	4$-4PR$SH!''
3	4 ((@CKPQN@SVW@Wk!n  '<;q>!+<]hij]k]o]opu]v  ''++E2Ec*oyCyCyCC	4 	4s   &FFc                z   ddl m}m} ddlm} t               \  }}}g d}ddl}|j                  j                  }fd}	|j                  |j                  d|	      5  |j                  |j                  d      5  |j                  dd	       d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}}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}}
y# 1 sw Y   xY w# 1 sw Y   xY w)zEGitOpsPRCreator._write_file should write under /mnt/e/genesis-system.r   )rf  r   rG  Nc                :    j                  t        |              y )N)r[  r   )	self_pathrT  rr  written_pathss      r   capture_writezSTestWB4EDriveOnly.test_write_file_does_not_reference_c_drive.<locals>.capture_write;  s      Y0r   
write_textmkdirzcore/interceptors/test.pyrT  r   rZ   )z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)sr  rx  r  r  r   rm  r   r   writtenr   r   r^   rP  rR  )z%(py1)s not in %(py3)srQ  )ro  rf  r   rK  rH  r=   pathlibPathrz  object_write_filer  rM   rb   rK   rL   rN   rO   rP   rQ   )rR   rf  r   rH  r<   rt   original_writer}  originalry  r   r   re   r   r   r|  r   r   rf   rx  s                      @r   *test_write_file_does_not_reference_c_drivez<TestWB4EDriveOnly.test_write_file_does_not_reference_c_drive-  sK   2?$A 	<<**	1 \\',,mD 	LgllG4 L##$?KL	L =!&Q&!Q&&&&!Q&&&&&&s&&&s&&&&&&=&&&=&&&!&&&Q&&&&&&&"#yG####yG###y######G###G#######$vW$$$$vW$$$v$$$$$$W$$$W$$$$$$$#uG####uG###u######G###G#######L L	L 	Ls$   N0;N#N0#N-	(N00N:N)rv   rw   rx   rM  rd  rt  r  r.   r   r   rE  rE  
  s    
> "$r   rE  c                  0    e Zd Zd Zd Zd Zd Zd Zd Zy)TestEdgeCasesc                    t        ddi      }t        |      \  }}}t               }t               }|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}	}y)z7If GitHub API returns no number, pr_number should be 0.r$   zhttps://example.com/pull/0r&   rY   r   rB   r   rZ   rl   rE   r]   r_   r`   N)r   r=   r   r"   rJ   r)   rM   rb   rK   rL   rN   rO   rP   rQ   rR   r:   r<   rt   rS   rT   rE   rd   re   rU   rf   rg   s               r   %test_api_returns_zero_number_fallbackz3TestEdgeCases.test_api_returns_zero_number_fallbackO  s    z3O&PQ$t4A ?!#""8UT"B$1$1$$$$1$$$$$$v$$$v$$$$$$1$$$$$$$r   c                <   t        i       }t        |      \  }}}t               }t               }|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}||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}	}y)zEIf GitHub API returns empty dict, PRResult still valid with defaults.r&   rY   r   rB   r-   rZ   r\   rE   r]   r_   r`   Nr   rl   zgenesis-auto-refactor-e1rp   )r   r=   r   r"   rJ   ra   rM   rb   rK   rL   rN   rO   rP   rQ   r)   rr   r  s               r   $test_api_returns_empty_dict_fallbackz2TestEdgeCases.test_api_returns_empty_dict_fallbackZ  s   b)$t4A ?!#""8UT"B}}""}""""}""""""v"""v"""}""""""""""$1$1$$$$1$$$$$$v$$$v$$$$$$1$$$$$$$!!?%??!%?????!%???????v???v???!???%????????r   c                ~   t               \  }}}t        dddgi      }t               }|j                  ||d       |j                  d   j                  d      xs |j                  d	   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  }
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}}	y)z:If scar_ids in config_changes, they appear in the PR body.scar_idsscar_001scar_002)r   rA   rB   r   r   r   r   r   r   r   r   r   r^   Nr  )rR   r<   r:   rt   rS   rT   	call_jsonr   r   r   r   rf   s               r   %test_scar_ids_in_pr_body_when_presentz3TestEdgeCases.test_scar_ids_in_pr_body_when_presentg  s.   '>q &Z(@A
 "#(EK@NN1%))&1IT^^A5Fq5I	 !zT!!!!zT!!!z!!!!!!T!!!T!!!!!!!!zT!!!!zT!!!z!!!!!!T!!!T!!!!!!!r   c                   |j                  dd       |j                  dd       t        t               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}}|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)z8Constructor reads GITHUB_TOKEN and GITHUB_REPO from env.GITHUB_TOKENenv_token_xyzGITHUB_REPOzenv_owner/env_repo)r4   r5   rZ   z-%(py2)s
{%(py2)s = %(py0)s.token
} == %(py5)sr<   r]   r_   r`   Nz,%(py2)s
{%(py2)s = %(py0)s.repo
} == %(py5)ssetenvr   r+   r/   r6   rM   rb   rK   rL   rN   rO   rP   rQ   r7   rR   monkeypatchr<   rd   re   rU   rf   rg   s           r   #test_constructor_uses_env_fallbacksz1TestEdgeCases.test_constructor_uses_env_fallbacksv  s   >?;=*>?!n.>=?[}}//}////}//////w///w///}//////////||333|33333|3333333w333w333|33333333333r   c                   |j                  dd       |j                  dd       t        ddt               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}}|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)z?Explicit constructor params take precedence over env variables.r  	env_tokenr  zenv/repoexplicit_tokenzexplicit/repor1   rZ   r  r<   r]   r_   r`   Nr  r  r  s           r   -test_constructor_explicit_params_override_envz;TestEdgeCases.test_constructor_explicit_params_override_env  s   >;7=*5!)'&($	
 }}0 00} 00000} 0000000w000w000}000 00000000||..|....|......w...w...|..........r   c                <   t               }t               }g }t        d      D ]C  }t               \  }}}|j	                  ||d|d      }|j                  |j                         E |d   }|d   }	||	k7  }
|
slt        j                  d|
fd||	f      t        j                  |      t        j                  |	      d	z  }d
d|iz  }t        t        j                  |            dx}x}
}	|d   }|d   }	||	k7  }
|
slt        j                  d|
fd||	f      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)z,Each epoch_id produces a unique branch name.r   epoch_03drB   r   r   r   r   r   r   r   Nr   c              3  >   K   | ]  }|j                  d         yw)r   N)r   ).0bs     r   	<genexpr>zZTestEdgeCases.test_multiple_different_epochs_produce_different_branches.<locals>.<genexpr>  s     Ka1<< 89Ks   z,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}all)rF   rH   rI   )r   r"   ranger=   rJ   r[  rr   rM   rb   rO   rP   rQ   r  rK   rL   rN   )rR   rS   rT   resultsir<   rt   rE   r   rU   r   rV   r   rd   s                 r   9test_multiple_different_epochs_produce_different_brancheszGTestEdgeCases.test_multiple_different_epochs_produce_different_branches  sm    ?!#q 	/A(NMGQ&&x6!CAQ&RFNN6--.	/
 qz'WQZ'zZ''''zZ'''z'''Z'''''''qz'WQZ'zZ''''zZ'''z'''Z'''''''K7KKsKKKKKKKKKsKKKsKKKKKKKKKKKKKKr   N)	rv   rw   rx   r  r  r  r  r  r  r.   r   r   r  r  N  s"    	%@"4/Lr   r  c                      e Zd Zd Zd Zd Zy)TestImportAndVerificationStampc                Z   ddl m} 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 )	Nr   )r   is notz%(py0)s is not %(py3)sr   r  r   r^   )
rK  r   rM   rb   rK   rL   rN   rO   rP   rQ   )rR   r   r   rd   r   rf   s         r   !test_gitops_pr_creator_importablez@TestImportAndVerificationStamp.test_gitops_pr_creator_importable  s^    D&**d****d************d*******r   c                Z   ddl m} 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 )	Nr   )r   r  r  r   r  r   r^   )
rK  r   rM   rb   rK   rL   rN   rO   rP   rQ   )rR   r   r   rd   r   rf   s         r   test_prresult_importablez7TestImportAndVerificationStamp.test_prresult_importable  s^    =##xt####xt######x###x###t#######r   c                   d}t        |      j                         }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}}y )
NrO  VERIFICATION_STAMPr   r   rT  r   r   r^   zStory: 8.07)
rY  rZ  rM   rb   rO   rK   rL   rN   rP   rQ   )rR   r]  rT  r   r   r   rf   s          r   !test_verification_stamp_in_modulez@TestImportAndVerificationStamp.test_verification_stamp_in_module  s    Q{#((*#.#w....#w...#......w...w.......'}''''}'''}''''''''''''''''r   N)rv   rw   rx   r  r  r  r.   r   r   r  r    s    +$(r   r  )zcore/interceptors/test_fix.pyz$class TestFix(BaseInterceptor): passz#tests/interceptors/test_test_fix.pyzdef test_it(): passN)r   r   r   r   r   r   r   r   r   dict | Noner   r   )r   NNT)
r   floatr   zlist[str] | Noner    r  r!   boolr   r
   )z%https://github.com/owner/repo/pull/42*   )r$   r   r)   r   r   r   )r   r   )ghp_test_token_abc123z
owner/repoNN)
r6   r   r7   r   r8   MagicMock | Noner9   r  r   z,tuple[GitOpsPRCreator, MagicMock, MagicMock])&__doc__
__future__r   builtinsrK   _pytest.assertion.rewrite	assertionrewriterM   r   typingr   ro  r   r   pytestcore.evolution.code_proposerr   core.evolution.shadow_arenar
   rK  r   r   r   r"   r+   r/   r=   r?   rz   r   r   r   r  r4  rE  r  r  r.   r   r   <module>r     s  . #      )  5 3 F 5>?-"&  	
   " )-$(	& " 	
   < & )"&!%	
   	
 2.%G %GZ), ),bX* X*@*! *!d5  5 z3, 3,v,I ,Ih<$ <$HNL NLl( (r   