
    ;i5                     (   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ZddlZddlmZ ddlmZmZ ddlZ ee      j*                  j*                  Zedz  Zej0                  j3                  de      Zg ZdZeeuZeZerej>                  Z dZ!e e!uZ"e"ZesB ejF                  defdeef      d	 ejH                         v s ejJ                  e      r ejL                  e      nd	 ejL                  e      d
z  Z'dde'iz  Z(ejS                  e(       er ejF                  de"fde e!f      d	 ejH                         v s ejJ                  e      r ejL                  e      nd	 ejL                  e        ejL                  e!      dz  Z*dde*iz  Z+ejS                  e+        ejX                  ed      i z  Z-dde-iz  Z. e/ ej`                  e.            dxZxZxZxZxZ xZ"Z!ej0                  jc                  e      Z2e2ejf                  d<   ej>                  ji                  e2        G d d      Z5 G d d      Z6 G d d      Z7 G d d      Z8 G d d      Z9 G d d      Z: G d d       Z; G d! d"      Z< G d# d$      Z= G d% d&      Z>y)'u2   Tests for diff-aware-qa.py — TDD (RED → GREEN)    N)Path)	MagicMockpatchzdiff-aware-qa.pydiff_aware_qa)is not)z%(py2)s is not %(py5)sspec)py2py5z%(py7)spy7)z5%(py11)s
{%(py11)s = %(py9)s.loader
} is not %(py14)s)py9py11py14z%(py16)spy16zassert %(py19)spy19c                   $    e Zd Zd Zd Zd Zd Zy)TestParseGitDiffc                    d}t         j                  |      }ddg}||k(  }|st        j                  d|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }dd	|iz  }t        t        j                  |            d x}}y )
Nz2src/api/users.py
frontend/components/UserList.tsx
src/api/users.pyz frontend/components/UserList.tsx==z%(py0)s == %(py3)sresultpy0py3assert %(py5)sr
   
qaparse_diff_output
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationselfrawr   @py_assert2@py_assert1@py_format4@py_format6s          7/home/jay/workspace/scripts/tests/test_diff_aware_qa.pytest_parse_normal_outputz)TestParseGitDiff.test_parse_normal_output   sy    D%%c*,.PQQvQQQQQvQQQQQQQvQQQvQQQQQQQQQQQ    c                 z   t         j                  d      }g }||k(  }|st        j                  d|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }dd|iz  }t        t        j                  |            d x}}y )N r   r   r   r   r   r
   r   )r)   r   r+   r,   r-   r.   s         r/   test_parse_empty_outputz(TestParseGitDiff.test_parse_empty_output"   sj    %%b)v|vvvr1   c                    d}t         j                  |      }ddg}||k(  }|st        j                  d|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }dd	|iz  }t        t        j                  |            d x}}y )
Nz)  src/api/users.py  
  frontend/app.ts  
r   zfrontend/app.tsr   r   r   r   r   r
   r   r(   s          r/   test_parse_strips_whitespacez-TestParseGitDiff.test_parse_strips_whitespace&   sy    ;%%c*,.?@@v@@@@@v@@@@@@@v@@@v@@@@@@@@@@@r1   c                    d}t         j                  |      }ddg}||k(  }|st        j                  d|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }dd	|iz  }t        t        j                  |            d x}}y )
Nzfile_a.py

file_b.ts

z	file_a.pyz	file_b.tsr   r   r   r   r   r
   r   r(   s          r/   test_parse_ignores_blank_linesz/TestParseGitDiff.test_parse_ignores_blank_lines+   sx    *%%c*%{33v33333v3333333v333v33333333333r1   N)__name__
__module____qualname__r0   r4   r6   r8    r1   r/   r   r      s    R
A
4r1   r   c                   N    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y)TestClassifyFilesc                 .   t         j                  dg      }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 )Nzsrc/routes/users.pybackendinz%(py1)s in %(py4)spy1py4assert %(py6)spy6r   classify_filesr    r!   r%   r&   r'   r)   cats@py_assert0@py_assert3r+   @py_format5@py_format7s          r/   test_classify_python_as_backendz1TestClassifyFiles.test_classify_python_as_backend5   sg      "7!89$7Y7$7777$777$7777777777r1   c                 .   t         j                  dg      }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 )Nzcomponents/Button.tsfrontendrA   rC   rD   rG   rH   rI   rK   s          r/   test_classify_ts_as_frontendz.TestClassifyFiles.test_classify_ts_as_frontend9   sk      "8!9:%9j)99%)99999%)9999%999)99999999r1   c                 .   t         j                  dg      }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 )Nzcomponents/Button.tsxrS   rA   rC   rD   rG   rH   rI   rK   s          r/   test_classify_tsx_as_frontendz/TestClassifyFiles.test_classify_tsx_as_frontend=   sk      "9!:;&:$z*::&*:::::&*::::&:::*::::::::r1   c                 .   t         j                  dg      }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 )Nzcomponents/App.jsxrS   rA   rC   rD   rG   rH   rI   rK   s          r/   test_classify_jsx_as_frontendz/TestClassifyFiles.test_classify_jsx_as_frontendA   sk      "6!78#7tJ'77#'77777#'7777#777'77777777r1   c                 .   t         j                  dg      }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 )Nzstyles/main.cssstylerA   rC   rD   rG   rH   rI   rK   s          r/   test_classify_css_as_stylez,TestClassifyFiles.test_classify_css_as_styleE   sg      "3!45 1DM1 M1111 M111 111M1111111r1   c                 .   t         j                  dg      }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 )Nzstyles/theme.scssrZ   rA   rC   rD   rG   rH   rI   rK   s          r/   test_classify_scss_as_stylez-TestClassifyFiles.test_classify_scss_as_styleI   sg      "5!67"3d7m3"m3333"m333"333m3333333r1   c                 .   t         j                  dg      }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 )Nztests/test_users.pytestrA   rC   rD   rG   rH   rI   rK   s          r/   test_classify_test_prefix_pyz.TestClassifyFiles.test_classify_test_prefix_pyM   sg      "7!89$4V4$4444$444$4444444444r1   c                 .   t         j                  dg      }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 )Nzcomponents/Button.test.tsr_   rA   rC   rD   rG   rH   rI   rK   s          r/   test_classify_dottest_tsz*TestClassifyFiles.test_classify_dottest_tsQ   sg      "=!>?*:d6l:*l::::*l:::*:::l:::::::r1   c                 .   t         j                  ddg      }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}}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 )	Nconfig.jsonz	README.mdotherrA   rC   rD   rG   rH   rI   rK   s          r/   test_classify_otherz%TestClassifyFiles.test_classify_otherU   s      -!=>-W-}----}---}----------+d7m+{m++++{m+++{+++m+++++++r1   c                 ,   g d}t         j                  |      }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}}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}}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}}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}}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 )N)api.pyApp.tsx
styles.csstests/test_api.pyrd   rh   r@   rA   rC   rD   rG   rH   ri   rS   rj   rZ   rk   r_   rd   re   rI   )r)   filesrL   rM   rN   r+   rO   rP   s           r/   test_classify_mixed_filesz+TestClassifyFiles.test_classify_mixed_filesZ   s   W  '*4	?*x?****x?***x***?*******,D,,y,,,,,y,,,,y,,,,,,,,,,,,tG},|},,,,|},,,|,,,},,,,,,,"2d6l2"l2222"l222"222l2222222-W-}----}---}----------r1   c           	         t         j                  g       }|j                  } |       }t        |      }h 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                  |      t	        j                  |      t	        j                  |      dz  }dd|iz  }t        t	        j                  |            d x}x}x}x}}y )	N>   r_   re   rZ   r@   rS   r   )zb%(py7)s
{%(py7)s = %(py0)s(%(py5)s
{%(py5)s = %(py3)s
{%(py3)s = %(py1)s.keys
}()
})
} == %(py10)ssetrL   )r   rE   r   r
   r   py10zassert %(py12)spy12)r   rJ   keysro   r    r!   r"   r#   r$   r%   r&   r'   )	r)   rL   r+   @py_assert4@py_assert6@py_assert9@py_assert8@py_format11@py_format13s	            r/   test_classify_returns_all_keysz0TestClassifyFiles.test_classify_returns_all_keysc   s      $99T9;Ts;T#TT#TTTTT#TTTTTTTsTTTsTTTTTT4TTT4TTT9TTT;TTTTTT#TTTTTTTTTr1   N)r9   r:   r;   rQ   rT   rV   rX   r[   r]   r`   rb   rf   rm   ry   r<   r1   r/   r>   r>   4   s:    8:;8245;,
.Ur1   r>   c                   0    e Zd Zd Zd Zd Zd Zd Zd Zy)TestExtractRoutesc                    |dz  }|j                  t        j                  d             t        j	                  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 )
Nviews.pyz                @app.route('/api/users', methods=['GET'])
                def get_users():
                    pass
                
/api/usersrA   z%(py1)s in %(py3)sroutesrE   r   r   r
   
write_texttextwrapdedentr   extract_routes_from_filestrr    r!   r%   r"   r#   r$   r&   r'   r)   tmp_pathfr   rM   r+   r-   r.   s           r/   test_flask_route_decoratorz,TestExtractRoutes.test_flask_route_decoratorl   s    z!	X__ &  	
 ,,SV4%|v%%%%|v%%%|%%%%%%v%%%v%%%%%%%r1   c                    |dz  }|j                  t        j                  d             t        j	                  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 )
N	router.pyz                @router.get('/items/{item_id}')
                async def read_item(item_id: int):
                    pass
                z/items/{item_id}rA   r   r   r   r   r
   r   r   s           r/   test_fastapi_get_decoratorz,TestExtractRoutes.test_fastapi_get_decoratorv   s    {"	X__ &  	
 ,,SV4!+!V++++!V+++!++++++V+++V+++++++r1   c                    |dz  }|j                  d       t        j                  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 )
Nr   z5@router.post("/users")
async def create_user(): pass
z/usersrA   r   r   r   r   r
   )r   r   r   r   r    r!   r%   r"   r#   r$   r&   r'   r   s           r/   test_fastapi_post_decoratorz-TestExtractRoutes.test_fastapi_post_decorator   s    {"	NO,,SV4!x6!!!!x6!!!x!!!!!!6!!!6!!!!!!!r1   c                 &   |dz  }|j                  t        j                  d             t        j	                  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}}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 )Nr}   z                @app.route('/api/users')
                def get_users(): pass

                @app.route('/api/products')
                def get_products(): pass
                r~   rA   r   r   r   r   r
   z/api/productsr   r   s           r/   test_multiple_routes_in_filez.TestExtractRoutes.test_multiple_routes_in_file   s    z!	X__ &  	 ,,SV4%|v%%%%|v%%%|%%%%%%v%%%v%%%%%%%(&((((&(((((((((&(((&(((((((r1   c                    |dz  }|j                  d       t        j                  t        |            }g }||k(  }|st	        j
                  d|fd||f      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      dz  }dd|iz  }t        t	        j                  |            d x}}y )	Nzcomponent.tsxz1export default function App() { return <div/>; }
r   r   r   r   r   r
   )r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   )r)   r   r   r   r+   r,   r-   r.   s           r/   "test_non_python_file_returns_emptyz4TestExtractRoutes.test_non_python_file_returns_empty   s    &	IJ,,SV4v|vvvr1   c                 z   t         j                  d      }g }||k(  }|st        j                  d|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }dd|iz  }t        t        j                  |            d x}}y )Nz/nonexistent/path/file.pyr   r   r   r   r   r
   )
r   r   r    r!   r"   r#   r$   r%   r&   r'   )r)   r   r+   r,   r-   r.   s         r/   #test_nonexistent_file_returns_emptyz5TestExtractRoutes.test_nonexistent_file_returns_empty   sk    ,,-HIv|vvvr1   N)	r9   r:   r;   r   r   r   r   r   r   r<   r1   r/   r{   r{   k   s     &,")r1   r{   c                   *    e Zd Zd Zd Zd Zd Zd Zy)TestExtractComponentsc                    |dz  }|j                  d       t        j                  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 )
NzUserList.tsxz4export default function UserList() { return null; }
UserListrA   r   compsr   r   r
   r   r   extract_components_from_filer   r    r!   r%   r"   r#   r$   r&   r'   r)   r   r   r   rM   r+   r-   r.   s           r/   test_export_default_functionz2TestExtractComponents.test_export_default_function   s    ~%	LM//A7"zU""""zU"""z""""""U"""U"""""""r1   c                    |dz  }|j                  d       t        j                  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 )
Nz
Button.tsxz*export default const Button = () => null;
ButtonrA   r   r   r   r   r
   r   r   s           r/   test_export_default_constz/TestExtractComponents.test_export_default_const   s    |#	BC//A7 x5    x5   x      5   5       r1   c                    |dz  }|j                  d       t        j                  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 )
NzMyWidget.tsxz+// no explicit export default
const x = 1;
MyWidgetrA   r   r   r   r   r
   r   r   s           r/   test_fallback_to_filenamez/TestExtractComponents.test_fallback_to_filename   s    ~%	DE//A7"zU""""zU"""z""""""U"""U"""""""r1   c                    |dz  }|j                  d       t        j                  t        |            }g }||k(  }|st	        j
                  d|fd||f      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      dz  }dd|iz  }t        t	        j                  |            d x}}y )	Nzutils.pyzdef helper(): pass
r   r   r   r   r   r
   )r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   )r)   r   r   r   r+   r,   r-   r.   s           r/   $test_non_frontend_file_returns_emptyz:TestExtractComponents.test_non_frontend_file_returns_empty   s    z!	+,//A7u{uuur1   c                 z   t         j                  d      }g }||k(  }|st        j                  d|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }dd|iz  }t        t        j                  |            d x}}y )Nz/no/such/file.tsxr   r   r   r   r   r
   )
r   r   r    r!   r"   r#   r$   r%   r&   r'   )r)   r   r+   r,   r-   r.   s         r/   r   z9TestExtractComponents.test_nonexistent_file_returns_empty   sk    //0CDu{uuur1   N)r9   r:   r;   r   r   r   r   r   r<   r1   r/   r   r      s    #!#r1   r   c                       e Zd Zd Zd Zy)TestEmptyDiffc                 B   t         j                  g       }|d   }g }||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}|d   }g }||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}|d   }g }||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}d	D ]  }|d
   |   }g }||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changed_filesr   z%(py1)s == %(py4)srD   rG   rH   affected_routesaffected_componentsr@   rS   rZ   r_   re   
categories)r   analyze_changesr    r!   r%   r&   r'   )r)   r   rM   rN   r+   rO   rP   keys           r/   -test_empty_changed_files_gives_empty_analysisz;TestEmptyDiff.test_empty_changed_files_gives_empty_analysis   sp   ##B'o&,",&",,,,&",,,&,,,",,,,,,,'(.B.(B....(B...(...B.......+,22,2222,222,2222222222D 	3C,',22,2222,222,2222222222	3r1   c                    t         j                  g       }|d   }t        |t              }|sddt	        j
                         v st        j                  t              rt        j                  t              ndt        j                  |      dt	        j
                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }t        t        j                  |            d x}}|d   }t        |      }d}||kD  }|st        j                  d|fd||f      d	t	        j
                         v st        j                  t              rt        j                  t              nd	t        j                  |      t        j                  |      t        j                  |      d
z  }dd|iz  }	t        t        j                  |	            d x}x}x}}y )Nsummary5assert %(py5)s
{%(py5)s = %(py0)s(%(py2)s, %(py3)s)
}
isinstancer   r   r	   r   r
   r   >z/%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} > %(py7)slenr   r	   rF   r   assert %(py9)sr   )r   r   r   r   r"   r#   r    r$   r%   r&   r'   r   r!   )
r)   r   r,   rs   r.   rN   rt   @py_assert5@py_format8@py_format10s
             r/   test_empty_summary_stringz'TestEmptyDiff.test_empty_summary_string   s   ##B' +1z+S11111111z111z111+111111S111S1111111111)$)s$%))%))))%))))))s)))s)))$)))%))))))))))r1   N)r9   r:   r;   r   r   r<   r1   r/   r   r      s    3*r1   r   c                       e Zd Zd Zd Zy)TestNonGitDirectoryc                     t        j                  t        j                        5  t        j	                  t        |      d       d d d        y # 1 sw Y   y xY w)Nmainproject_dirbase_ref)pytestraisesr   GitErrorget_changed_filesr   )r)   r   s     r/   "test_get_changed_files_non_git_dirz6TestNonGitDirectory.test_get_changed_files_non_git_dir   sB    ]]2;;' 	M  S]V L	M 	M 	Ms   !AAc                 (   	 t         j                  t        |      d       y # t         j                  $ r}t        |      }|sd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        t        j                  |            d }Y d }~y d }~ww xY w)Nr   r   z,assert %(py3)s
{%(py3)s = %(py0)s(%(py1)s)
}r   exc)r   rE   r   )r   r   r   r   r"   r#   r    r$   r%   r&   r'   )r)   r   r   r+   r-   s        r/   ,test_get_changed_files_returns_error_messagez@TestNonGitDirectory.test_get_changed_files_returns_error_message   s{    	  S]V L{{ 	s8O8OOOOO3OOO3OOOOOOsOOOsOOO8OOOOOO	s    # DCDDN)r9   r:   r;   r   r   r<   r1   r/   r   r      s    Mr1   r   c                       e Zd Zd Zd Zy)TestBaseRefc                    t        d      5 }t        ddd      |_        t        j                         5 }t        |d      j                          t        j                  |d       d	d	d	       |j                  d   d   }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}}d	d	d	       y	# 1 sw Y   xY w# 1 sw Y   y	xY w)uQ   get_changed_files 가 올바른 base-ref 로 git 명령을 조합하는지 검증diff_aware_qa.subprocess.runr   zfile.py
r3   
returncodestdoutstderr.gitdevelopr   Nc              3   $   K   | ]  }d |v  
 yw)r   Nr<   .0parts     r/   	<genexpr>zCTestBaseRef.test_custom_base_ref_used_in_command.<locals>.<genexpr>   s     @TyD(@   ,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}anyr   r	   rF   r   r   return_valuetempfileTemporaryDirectoryr   mkdirr   r   	call_argsr   r"   r#   r    r$   r%   r&   r'   r)   mock_runtmpdir
called_cmdr,   rN   rO   s          r/   $test_custom_base_ref_used_in_commandz0TestBaseRef.test_custom_base_ref_used_in_command   s   12 	Ah$-;WY$ZH!,,. M&VV$**,$$)$LM
 "++A.q1J@Z@@3@@@@@@@@@3@@@3@@@@@@@@@@@@@@	A 	AM M	A 	As#   (E2D8&C	E8E	=EEc                    t        d      5 }t        ddd      |_        t        j                         5 }t        |d      j                          t        j                  |       d d d        |j                  d   d   }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}}d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)Nr   r   r3   r   r   )r   c              3   $   K   | ]  }d |v  
 yw)r   Nr<   r   s     r/   r   z<TestBaseRef.test_default_base_ref_is_main.<locals>.<genexpr>   s     =$v~=r   r   r   r   r   r   s          r/   test_default_base_ref_is_mainz)TestBaseRef.test_default_base_ref_is_main   s    12 	>h$-2b$QH!,,. 9&VV$**,$$$89 "++A.q1J=*==3=========3===3==============	> 	>9 9	> 	>s#   (E1D7%C	E7E 	<EEN)r9   r:   r;   r   r   r<   r1   r/   r   r      s    
A>r1   r   c                   L    e Zd Zh dZh dZd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zy)TestJsonOutputSchema>   r   r   
qa_targetsr   r   r   >   r_   re   rZ   r@   rS   c           
      d   t         j                  g       }| j                  }|j                  } |       }t	        |      }||k  }|s_t        j                  d|fd||f      dt        j                         v st        j                  |       rt        j                  |       ndt        j                  |      dt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}x}x}}y )	N<=)z%(py2)s
{%(py2)s = %(py0)s.REQUIRED_KEYS
} <= %(py11)s
{%(py11)s = %(py4)s(%(py9)s
{%(py9)s = %(py7)s
{%(py7)s = %(py5)s.keys
}()
})
}r)   ro   r   )r   r	   rF   r
   r   r   r   zassert %(py13)spy13)r   r   REQUIRED_KEYSrr   ro   r    r!   r"   r#   r$   r%   r&   r'   )	r)   r   r,   rt   rv   @py_assert10rN   @py_format12@py_format14s	            r/   +test_analyze_changes_has_all_top_level_keysz@TestJsonOutputSchema.test_analyze_changes_has_all_top_level_keys	  s    ##B'!!777S%77!%77777!%7777777t777t777!777777S777S777777777777777777%777777777r1   c           
         t         j                  g       }| j                  }|d   }|j                  } |       }t	        |      }||k  }|s2t        j                  d|fd||f      dt        j                         v st        j                  |       rt        j                  |       ndt        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }	t        t        j                  |	            d x}x}x}x}x}}y )	Nr   r   )z%(py2)s
{%(py2)s = %(py0)s.CATEGORY_KEYS
} <= %(py12)s
{%(py12)s = %(py4)s(%(py10)s
{%(py10)s = %(py8)s
{%(py8)s = %(py6)s.keys
}()
})
}r)   ro   )r   r	   rF   rH   py8rp   rq   zassert %(py14)sr   )r   r   CATEGORY_KEYSrr   ro   r    r!   r"   r#   r$   r%   r&   r'   )
r)   r   r,   r   @py_assert7ru   @py_assert11rN   rx   @py_format15s
             r/   ,test_analyze_changes_categories_has_all_keyszATestJsonOutputSchema.test_analyze_changes_categories_has_all_keys  s    ##B'!!E)=E)=)B)BE)B)DES)D%EE!%EEEEE!%EEEEEEEtEEEtEEE!EEEEEESEEESEEE)=EEE)BEEE)DEEE%EEEEEEEEEr1   c                 "   t         j                  dg      }|d   }t        |t              }|sddt	        j
                         v st        j                  t              rt        j                  t              ndt        j                  |      dt	        j
                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }t        t        j                  |            d x}}y )Na.pyr   r   r   listr   r   r   r   r	  r"   r#   r    r$   r%   r&   r'   r)   r   r,   rs   r.   s        r/   test_changed_files_is_listz/TestJsonOutputSchema.test_changed_files_is_list  s    ##VH- 18z1488888888z888z8881888888488848888888888r1   c                     t         j                  g       }|d   }t        |t              }|sddt	        j
                         v st        j                  t              rt        j                  t              ndt        j                  |      dt	        j
                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }t        t        j                  |            d x}}y )Nr   r   r   r	  r   r
  r  s        r/   test_affected_routes_is_listz1TestJsonOutputSchema.test_affected_routes_is_list  s    ##B' !23:z3T::::::::z:::z:::3::::::T:::T::::::::::r1   c                     t         j                  g       }|d   }t        |t              }|sddt	        j
                         v st        j                  t              rt        j                  t              ndt        j                  |      dt	        j
                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }t        t        j                  |            d x}}y )Nr   r   r   r	  r   r
  r  s        r/    test_affected_components_is_listz5TestJsonOutputSchema.test_affected_components_is_list  s    ##B' !67>z7>>>>>>>>z>>>z>>>7>>>>>>>>>>>>>>>>>>>r1   c                     t         j                  g       }|d   }t        |t              }|sddt	        j
                         v st        j                  t              rt        j                  t              ndt        j                  |      dt	        j
                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }t        t        j                  |            d x}}y )Nr   r   r   r	  r   r
  r  s        r/   test_qa_targets_is_listz,TestJsonOutputSchema.test_qa_targets_is_list  s    ##B' .5z.55555555z555z555.5555555555555555555r1   c                     t         j                  g       }|d   }t        |t              }|sddt	        j
                         v st        j                  t              rt        j                  t              ndt        j                  |      dt	        j
                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }t        t        j                  |            d x}}y )Nr   r   r   r   r   )r   r   r   r   r"   r#   r    r$   r%   r&   r'   r  s        r/   test_summary_is_stringz+TestJsonOutputSchema.test_summary_is_string!  s    ##B' +1z+S11111111z111z111+111111S111S1111111111r1   c                    t         j                  ddg      }t        j                  |      }t        j                  |      }|d   }|d   }||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}y )	Nrh   ri   r   r   r   rD   rG   rH   )
r   r   jsondumpsloadsr    r!   r%   r&   r'   )	r)   r   dumpedreloadedrM   rN   r+   rO   rP   s	            r/   test_json_serializablez+TestJsonOutputSchema.test_json_serializable%  s    ##Xy$9:F#::f%(CF?,CC(,CCCCC(,CCCC(CCC,CCCCCCCCr1   N)r9   r:   r;   r   r  r   r  r  r  r  r  r  r  r<   r1   r/   r   r      s;    M FM8F9;?62Dr1   r   c                       e Zd Zd Zd Zd Zy)TestBuildSummaryc                    ddgg g g g 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}}y )Nr  zb.pyr   2rA   r   sr   r   r
   
r   build_summaryr    r!   r%   r"   r#   r$   r&   r'   r)   rL   r   rM   r+   r-   r.   s          r/   #test_summary_mentions_backend_countz4TestBuildSummary.test_summary_mentions_backend_count0  sj    "F+bRT_abT"saxsasaar1   c                    g g dg g g 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}}y )
N)zA.tsxzB.tsxzC.tsxr   3rA   r   r   r   r   r
   r!  r#  s          r/   $test_summary_mentions_frontend_countz5TestBuildSummary.test_summary_mentions_frontend_count5  sg    +FQS]_jlmT"saxsasaar1   c                 ~   g g g g g d}t         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dt	        j
                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }t        t        j                  |            d }y )Nr   z5assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}r   r   r   )r   rE   r	   rF   )r   r"  r   r   r"   r#   r    r$   r%   r&   r'   )r)   rL   r   rN   rO   s        r/   test_summary_zero_changesz*TestBuildSummary.test_summary_zero_changes:  s    2BQSTT"!S!!!!!!!!z!!!z!!!!!!!!!!!!!!!!!S!!!S!!!!!!!!!!r1   N)r9   r:   r;   r$  r'  r)  r<   r1   r/   r  r  /  s    

"r1   r  c                       e Zd Zd Zd Zd Zy)TestAnalyzeChangesIntegrationc                 l   |dz  }|j                  d       t        j                  t        |      g      }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 )
Nr}   z%@app.route('/ping')
def ping(): pass
z/pingr   rA   rC   rD   rG   rH   	r   r   r   r   r    r!   r%   r&   r'   	r)   r   r   r   rM   rN   r+   rO   rP   s	            r/   "test_backend_files_populate_routesz@TestAnalyzeChangesIntegration.test_backend_files_populate_routesD  s    z!	>?##SVH-3&!233w33333w3333w33333333333r1   c                 l   |dz  }|j                  d       t        j                  t        |      g      }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 )
NzCard.tsxz0export default function Card() { return null; }
Cardr   rA   rC   rD   rG   rH   r-  r.  s	            r/   'test_frontend_files_populate_componentszETestAnalyzeChangesIntegration.test_frontend_files_populate_componentsJ  s    z!	HI##SVH-6 566v66666v6666v66666666666r1   c                 B   |dz  }|j                  d       t        j                  t        |      g      }|d   }t	        |      }d}||kD  }|st        j                  d|fd||f      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      t        j                  |      dz  }d	d
|iz  }	t        t        j                  |	            d x}x}x}}y )Nrh   z)@app.route('/health')
def health(): pass
r   r   r   r   r   r   r   r   )r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   )
r)   r   r   r   r,   rN   rt   r   r   r   s
             r/   +test_qa_targets_non_empty_for_changed_fileszITestAnalyzeChangesIntegration.test_qa_targets_non_empty_for_changed_filesP  s    x	BC##SVH-,',s'(,1,(1,,,,(1,,,,,,s,,,s,,,',,,(,,,1,,,,,,,r1   N)r9   r:   r;   r/  r2  r4  r<   r1   r/   r+  r+  C  s    47-r1   r+  )?__doc__builtinsr"   _pytest.assertion.rewrite	assertionrewriter    importlib.util	importlibr  
subprocesssysr   r   pathlibr   unittest.mockr   r   r   __file__parent_SCRIPTS_DIR_MODULE_PATHutilspec_from_file_locationr   r,   rs   rN   rM   loaderr   @py_assert13@py_assert12r!   r#   r$   r%   r.   r   appendr  @py_format17_format_boolop@py_format18@py_format20r&   r'   module_from_specr   modulesexec_moduler   r>   r{   r   r   r   r   r   r  r+  r<   r1   r/   <module>rQ     s   8       
    *  H~$$++00~~--o|L 34 3t4 3DKK 3t 3Kt3 3 3 3t4 3 3 3 3 3t 3 3 3t 3 3 34 3 3 3 3 3 3 3Kt 3 3 3 3 3D 3 3 3D 3 3 3K 3 3t 3 3 3 3 3 3 3 3 3 3 3 3 3^^$$T*!O     4 401U 1Un0 0l B* *&	 	> >4+D +Db" "(- -r1   