
     j                        d dl mZ d dlmZ d dlZd dlmZmZ ddZddZ	ddZ
ddZdd	Zdd
ZddZddZddZddZddZddZddZddZy)    )annotations)PathN)assert_safe	scan_pathc                j    | dz  j                  d       t        |       }t        d |D              sJ y )Nzfinance.sqlite3znot realc              3  8   K   | ]  }d |j                   v   yw)forbidden_file_typeNreason.0fs     tests/unit/test_git_safety.py	<genexpr>z9test_git_safety_blocks_sqlite_database.<locals>.<genexpr>   s     CQ$0Cs   
write_textr   anytmp_pathfindingss     r   &test_git_safety_blocks_sqlite_databaser   
   s4    !!--j9"HC(CCCC    c                    | dz  j                  d       | dz  j                  d       t        |       }t        |      dk\  sJ t        j                  t
              5  t        |        d d d        y # 1 sw Y   y xY w)Nz.envz
TOKEN=demozclient_secret.json{}   )r   r   lenpytestraises
ValueErrorr   r   s     r   *test_git_safety_blocks_env_and_credentialsr       sn    ""<0$$006"Hx=A	z	" H  s   A22A;c                    | dz  dz  }|j                  d       |dz  j                  d       t        |       g k(  sJ y )Nexamples	syntheticTparentszaccounts.csvplatform_name
Demo
mkdirr   r   )r   r"   s     r   )test_git_safety_allows_synthetic_examplesr)      sF    *${2HNN4N **+BCX"$$$r   c                    | dz  dz  }|j                  d       |dz  j                  d       |dz  j                  d       | d	z  }|j                          |d
z  j                  d       t        |       g k(  sJ y )NtestsfixturesTr$   zsynthetic_accounts.csvr&   zsynthetic_payload.jsonz{"kind":"synthetic"}zconfig.examplezsettings.jsonz{"token":"replace-me"}r'   )r   r,   config_examples      r   Atest_git_safety_allows_tests_fixtures_and_config_example_csv_jsonr.       s    '!J.HNN4N ((445LM((445KL 00No%112JKX"$$$r   c                    | dz  dz  dz  }|j                  d       |dz  j                  d       t        |       g k(  sJ y )Nsrcjarvis_financeimportsTr$   znormal_module.pyzxfrom __future__ import annotations

def parse_token_name(token_name: str) -> str:
    return token_name.strip().lower()
r'   )r   r0   s     r   ;test_git_safety_does_not_false_positive_normal_source_filesr3   +   sS    
U
-
-	
9CIIdI))	2
 X"$$$r   c                   | dz  j                          | dz  dz  j                  d       | dz  j                  d       | dz  j                          | dz  dz  j                  d       t        |       }|D cg c]  }|j                   }}t	        d	 |D              sJ t	        d
 |D              sJ t	        d |D              sJ y c c}w )Ndataportfolio.csvzreal-ishzGithub_token_secret.txtplaceholderruntimez
cache.jsonr   c              3  $   K   | ]  }d |v  
 yw)&runtime_or_real_data_directory_blockedN r   rs     r   r   zNtest_git_safety_blocks_runtime_dirs_db_json_and_token_names.<locals>.<genexpr>>   s     N71<N   c              3  $   K   | ]  }d |v  
 yw)forbidden_secret_like_filenameNr;   r<   s     r   r   zNtest_git_safety_blocks_runtime_dirs_db_json_and_token_names.<locals>.<genexpr>?   s     F/14Fr>   c              3  $   K   | ]  }d |v  
 yw)csv_json_only_allowedNr;   r<   s     r   r   zNtest_git_safety_blocks_runtime_dirs_db_json_and_token_names.<locals>.<genexpr>@   s     =&!+=r>   )r(   r   r   r   r   )r   r   r   reasonss       r   ;test_git_safety_blocks_runtime_dirs_db_json_and_token_namesrD   6   s    (44Z@))55mD	  "	L(44T:"H!)*Aqxx*G*NgNNNNFgFFFF=W==== +s   8C
c                j    | dz  j                  d       t        |       }t        d |D              sJ y )N	notes.txtz1token=github_pat_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAc              3  :   K   | ]  }|j                   d k(    yw)zsecret_pattern:github_patNr
   r   s     r   r   z=test_git_safety_blocks_github_pat_patterns.<locals>.<genexpr>F        I1qxx66I   r   r   s     r   *test_git_safety_blocks_github_pat_patternsrJ   C   s4    ''(FG"HIIIIIr   c                j    | dz  j                  d       t        |       }t        d |D              sJ y )NrF   z.token=ghp_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBc              3  :   K   | ]  }|j                   d k(    yw)zsecret_pattern:github_ghpNr
   r   s     r   r   z=test_git_safety_blocks_github_ghp_patterns.<locals>.<genexpr>L   rH   rI   r   r   s     r   *test_git_safety_blocks_github_ghp_patternsrM   I   s4    ''(?@"HIIIIIr   c                j    | dz  j                  d       t        |       }t        d |D              sJ y )Nz
id_rsa.txtz_-----BEGIN OPENSSH PRIVATE KEY-----
synthetic-not-a-real-key
-----END OPENSSH PRIVATE KEY-----
c              3  :   K   | ]  }|j                   d k(    yw)zsecret_pattern:private_keyNr
   r   s     r   r   z6test_git_safety_blocks_private_keys.<locals>.<genexpr>V   s     JAqxx77JrI   r   r   s     r   #test_git_safety_blocks_private_keysrP   O   s:    ((	.
 "HJJJJJr   c                    | dz  j                  d       | dz  j                  d       t        |       D cg c]  }|j                   }}|j                  d      dk(  sJ y c c}w )Nr6   zaccount,balance
Demo,1
zexport.jsonz{"realistic":"blocked"}=csv_json_only_allowed_in_examples_synthetic_or_tests_fixturesr   )r   r   r   count)r   r   rC   s      r   5test_git_safety_blocks_csv_json_outside_allowed_pathsrT   Y   sd    ++,GH))*CD!*8!45Aqxx5G5==XY]^^^^ 6s   A"c                    dD ]+  }| |z  }|j                          |dz  j                  d       - t        |       }|D ch c]  }|j                  dk(  s|j                    }}h d|k  sJ y c c}w )N)r5   r8   exportsreportszpayload.txtznot allowed herer:   >   data/payload.txtexports/payload.txtreports/payload.txtruntime/payload.txt)r(   r   r   r   path)r   dirnamefolderr   r   blocked_pathss         r   6test_git_safety_blocks_top_level_runtime_and_data_dirsr`   `   s~    < @G#	-	++,>?@ "H%-f=e1eQVVfMfdhuuuu gs    A/A/c                    | dz  dz  }|j                   j                          |j                  d       t        |       }t	        d |D              sJ t	        d |D              sJ y )NrW   zcrypto_inventory.pdfs   %PDF-1.4 syntheticc              3  n   K   | ]-  }t        |j                        d k(  xr |j                  dk(   / yw)reports/crypto_inventory.pdfr:   Nstrr\   r   r   s     r   r   zBtest_git_safety_blocks_reports_and_pdfs_in_repo.<locals>.<genexpr>q   sA        	AFF55 	AHH@@	A   35c              3  n   K   | ]-  }t        |j                        d k(  xr |j                  dk(   / yw)rc   zforbidden_file_type:.pdfNrd   r   s     r   r   zBtest_git_safety_blocks_reports_and_pdfs_in_repo.<locals>.<genexpr>v   s8       	AFF55`!((F`:``rf   )parentr(   write_bytesr   r   )r   reportr   s      r   /test_git_safety_blocks_reports_and_pdfs_in_repork   j   s}    	!$::F
MM
,-"H     
     r   c                L   | dz  dz  }|j                   j                          |j                  d       |j                   dz  j                  d       t	        |       }|D ch c]  }|j
                  dk(  s|j                    }}d|v sJ t        d |D              sJ y c c}w )	Nbackupsz+finance-runtime-db-20260101T000000Z.sqlite3s   sqlite backup placeholderz2finance-runtime-db-20260101T000000Z.sqlite3.sha256@0000000000000000000000000000000000000000000000000000000000000000r:   3backups/finance-runtime-db-20260101T000000Z.sqlite3c              3  \   K   | ]$  }|j                   d k(  xr |j                  dk(   & yw)ro   zforbidden_file_type:.sqlite3N)r\   r   r   s     r   r   z>test_git_safety_blocks_backup_files_in_repo.<locals>.<genexpr>   s;        	
GG 	7HH66	7s   *,)rh   r(   ri   r   r   r   r\   r   )r   backupr   r   r_   s        r   +test_git_safety_blocks_backup_files_in_reporr   |   s    	!$QQF
MM
34]]IIUUV^_"H%-f=e1eQVVfMf@MQQQ      gs   !B!6B!c                2   | dz  }|dz  j                  d       |dz  dz  j                  d       |dz  dz  j                  d       |dz  dz  d	z  j                  d
       |dz  j                  d       |dz  j                  d       |dz  j                  d       |dz  j                  d       t        |       }|D ci c]  }|j                  |j                   }}|d   dk(  sJ |d   dk(  sJ |d   dk(  sJ d|vsJ d|vsJ d|vsJ y c c}w )NfrontenddistTr$   node_modulespkgz
index.htmlz<div>built</div>zindex.jsz	export {}z.env.developmentz VITE_OPENFIGI_KEY=must-not-existzpackage.jsonz{"private":true}zpackage-lock.jsonz{"lockfileVersion":3}ztsconfig.jsonz{"compilerOptions":{}}zfrontend/dist/index.htmlruntime_cache_file_blockedz"frontend/node_modules/pkg/index.jszfrontend/.env.developmentforbidden_secret_filenamezfrontend/package.jsonzfrontend/package-lock.jsonzfrontend/tsconfig.json)r(   r   r   r\   r   )r   rt   r   r   reasons_by_paths        r   =test_git_safety_blocks_frontend_build_artifacts_and_env_filesr{      s]   *$Hd+&--d-;%112DE&3??L""../QR**+=>##//0GH++,DE"H19:Aqvvqxx':O:56:VVVV?@D````67;VVVV"/999'>>>#?::: ;s   D)r   r   returnNone)
__future__r   pathlibr   r   !jarvis_finance.quality.git_safetyr   r   r   r    r)   r.   r3   rD   rJ   rM   rP   rT   r`   rk   rr   r{   r;   r   r   <module>r      s]    "   DD%%%
>JJK_v$ ;r   