
    9!i&>                    ,   d Z ddlmZ ddlZddlmc mZ ddl	Z	e	j                  j                  dd       ddlZddlmZmZmZ  ej"                         dId       ZdJdZdJdZdJd	ZdJd
ZdJdZdJdZdJdZdJdZdJdZdJdZdJdZ	 	 dJdZdJdZdJdZ dJdZ!dJdZ"dJdZ#dJdZ$dJdZ%e&dk(  rddl'Z' e       Z(dd fdd fdd  fd!d" fd#d$ fd%d& fd'd( fd)d* fd+d, fd-d. fd/d0 fd1d2 fd3d4 fd5d6 fd7d8 fd9d: fd;d< fd=d> fd?d@ fgZ)dZ* e+e)      Z,e)D ]  \  Z-Z.	  e.         e/dAe-        e*dBz  Z*  e/dEe* dFe, dG       e*e,k(  r	 e/dH       y e	jf                  dB       yy# e0$ r)Z1 e/dCe- dDe1         e'jd                          Y dZ1[1zdZ1[1ww xY w)Ku<  
Tests for Story 8.02 (Track B): AxiomaticTests — Compiled GLOBAL_GENESIS_RULES Assertions

Black Box tests (BB): verify public contract — axiom violations detected correctly,
    clean inputs pass, all 5 axioms checked independently.
White Box tests (WB): verify internal mechanics — non-fail-fast accumulation,
    empty violations list, AxiomViolation field structure, OCC safe pattern,
    Gemini with auth passes.

Story: 8.02
File under test: core/evolution/axiomatic_tests.py

ALL tests are pure Python — NO external I/O, NO mocks needed, NO network calls.
    )annotationsNz/mnt/e/genesis-system)AxiomaticTestsAxiomResultAxiomViolationc                     t               S )z,Fresh AxiomaticTests instance for each test.)r        6/mnt/e/genesis-system/tests/track_b/test_story_8_02.pycheckerr   "   s     r	   c                   d}| j                  |i       }|j                  }d}||u }|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 cg 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  }t        j                  d|	       dz   d|iz  }t        t        j                  |            d
x}
}y
c c}w )uD   BB1: Code containing 'import sqlite3' → AXIOM_NO_SQLITE violation.z1import sqlite3
conn = sqlite3.connect(':memory:')code_contentstate_contentFisz.%(py2)s
{%(py2)s = %(py0)s.passed
} is %(py5)sresultpy0py2py5assert %(py7)spy7NAXIOM_NO_SQLITEinz%(py1)s in %(py3)s	axiom_idspy1py3z-Expected AXIOM_NO_SQLITE in violations, got: 
>assert %(py5)sr   run_allpassed
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanation
violationsaxiom_id_format_assertmsgr   coder   @py_assert1@py_assert4@py_assert3@py_format6@py_format8vr   @py_assert0@py_assert2@py_format4s                r
   -test_bb1_sqlite_import_raises_axiom_no_sqliter<   -   sI   ?D__$b_AF==!E!=E!!!!=E!!!!!!6!!!6!!!=!!!E!!!!!!!%+%6%677I7 	)  	          !*    !*    8	{C     8   +F?c                   ddd}| j                  d|      }|j                  }d}||u }|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 cg 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  }t        j                  d|	       dz   d|iz  }t        t        j                  |            dx}
}yc c}w )uK   BB2: State dict containing 'sk-abc123' → AXIOM_NO_API_KEY_LEAK violation.zsk-abc123xyzzgpt-4)
openai_keymodelzprint('hello')r   Fr   r   r   r   r   r   NAXIOM_NO_API_KEY_LEAKr   r   r   r   z3Expected AXIOM_NO_API_KEY_LEAK in violations, got: r"   r   r#   )r   stater   r3   r4   r5   r6   r7   r8   r   r9   r:   r;   s                r
   6test_bb2_api_key_in_state_raises_axiom_no_api_key_leakrC   9   sO   )G<E__*:%_PF==!E!=E!!!!=E!!!!!!6!!!6!!!=!!!E!!!!!!!%+%6%677I7" "i/  "i    #      '0    '0    >i[I     8s   .Gc                   d}| j                  |ddi      }|j                  }d}||u }|st        j                  d|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      d	z  }t        j                  d
|j                         dz   d|iz  }t        t        j                  |            dx}x}}|j                  }g }||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  }t        j                  d|j                         dz   d|iz  }t        t        j                  |            dx}x}}y)u=   BB3: Clean code + clean state → passed=True, violations=[].zimport psycopg2
conn = psycopg2.connect(host='elestio.example.com')
cur.execute('UPDATE entities SET data=%s WHERE version=1', (data,))
statusokr   Tr   r   r   r   z)Expected passed=True but got violations: z
>assert %(py7)sr   N==)z2%(py2)s
{%(py2)s = %(py0)s.violations
} == %(py5)sz Expected empty violations, got: )r$   r%   r&   r'   r(   r)   r*   r+   r0   r.   r,   r-   )r   r2   r   r3   r4   r5   r6   r7   s           r
   &test_bb3_clean_code_clean_state_passesrI   E   s   	P 	
 __$x>N_OF== D =D   =D                  !    4F4E4E3FG       "                    !#    +6+<+<*=>     r	   c                   d}| j                  |i       }|j                  }d}||u }|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 cg 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  }t        j                  d|	       dz   d|iz  }t        t        j                  |            d
x}
}y
c c}w )uP   BB4: Code with INSERT but no 'WHERE version =' → AXIOM_OCC_REQUIRED violation.zLcur.execute('INSERT INTO sessions (id, data) VALUES (%s, %s)', (sid, data))
r   Fr   r   r   r   r   r   NAXIOM_OCC_REQUIREDr   r   r   r   z0Expected AXIOM_OCC_REQUIRED in violations, got: r"   r   r#   r1   s                r
   9test_bb4_insert_without_version_check_raises_occ_requiredrL   V   sQ    	X 	 __$b_AF==!E!=E!!!!=E!!!!!!6!!!6!!!=!!!E!!!!!!!%+%6%677I7 9,  9           $-    $-    ;9+F     8r=   c                   d}| j                  |i       }|j                  }d}||u }|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 cg 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  }t        j                  d|	       dz   d|iz  }t        t        j                  |            d
x}
}y
c c}w )uH   BB5: Code containing 'C:\Users\...' path → AXIOM_NO_C_DRIVE violation.zAwith open('C:\Users\P3\data\output.txt', 'w') as f: f.write(data)r   Fr   r   r   r   r   r   NAXIOM_NO_C_DRIVEr   r   r   r   z.Expected AXIOM_NO_C_DRIVE in violations, got: r"   r   r#   r1   s                r
   -test_bb5_c_drive_path_raises_axiom_no_c_driverO   d   sI   OD__$b_AF==!E!=E!!!!=E!!!!!!6!!!6!!!=!!!E!!!!!!!%+%6%677I7 *            "+    "+    9D     8r=   c                   d}| j                  |i       }|j                  }d}||u }|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 cg 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  }t        j                  d|	       dz   d|iz  }t        t        j                  |            d
x}
}y
c c}w )uQ   BB6: Code referencing gemini.google.com without login/auth → AXIOM_GEMINI_AUTH.zcimport requests
response = requests.get('https://gemini.google.com/chat')
result = response.json()
r   Fr   r   r   r   r   r   NAXIOM_GEMINI_AUTHr   r   r   r   z/Expected AXIOM_GEMINI_AUTH in violations, got: r"   r   r#   r1   s                r
   5test_bb6_gemini_without_auth_raises_axiom_gemini_authrR   p   sP   	% 	
 __$b_AF==!E!=E!!!!=E!!!!!!6!!!6!!!=!!!E!!!!!!!%+%6%677I7 )+  )          #,    #,    :)E     8r=   c           	        d}| j                  |i       }|j                  }d}||u }|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                  }t        |      }d}	||	k\  }
|
s[t        j                  d|
fd||	f      dt	        j
                         v st        j                  t              rt        j                  t              nddt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |	      dz  }t        j                  dt        |j                         d|j                  D cg c]  }|j                   c}       dz   d|iz  }t        t        j                  |            d
x}x}x}
}	|j                  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}}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 )uN   WB1: Code triggering 3 separate violations → all 3 returned (not fail-fast).zimport sqlite3
conn = sqlite3.connect('local.db')
cur.execute('INSERT INTO logs (msg) VALUES (%s)', (msg,))
path = 'C:\Users\P3\data\output.txt'
r   Fr   r   r   r   r   r   N   )>=)zP%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.violations
})
} >= %(py8)slenr   r    r!   r   py8z Expected >=3 violations but got : z
>assert %(py10)spy10r   r   r   r   r   assert %(py5)sr   rK   rN   )r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   rV   r0   r/   )r   r2   r   r3   r4   r5   r6   r7   r:   @py_assert7@py_assert6@py_format9r8   @py_format11r   r9   r;   s                    r
   +test_wb1_all_5_axioms_checked_not_fail_fastr`      s   	7 	 __$b_AF==!E!=E!!!!=E!!!!!!6!!!6!!!=!!!E!!!!!!!   3 ! Q !Q&   !Q                        !    "    &'    +3v/@/@+A*B" & 1 121AJJ2
3	5      &,%6%677I7)	))))	)))))))))	)))	))))))),9,,,,9,,,,,,,,,9,,,9,,,,,,,************************ 37s   Q4/Q9c                0   | j                  di       }|j                  }d}||u }|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
}||u}|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                  }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}}|j                  }t        |      }d}
||
k(  }|s
t        j                  d|fd||
f      dt	        j
                         v st        j                  t              rt        j                  t              nddt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |
      dz  }dd|iz  }t        t        j                  |            d
x}x}x}}
y
)zHWB2: When all axioms pass, violations is [] (not None, not other falsy).zx = 1r   Tr   r   r   r   r   r   N)is not)z6%(py2)s
{%(py2)s = %(py0)s.violations
} is not %(py5)sUassert %(py6)s
{%(py6)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.violations
}, %(py4)s)
}
isinstancelistr   r    r!   py4py6r   rG   )zP%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.violations
})
} == %(py8)srV   rW   zassert %(py10)srZ   )r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   rd   re   rV   )r   r   r3   r4   r5   r6   r7   r:   @py_assert5@py_format7r\   r]   r^   r_   s                 r
   7test_wb2_violations_is_empty_list_not_none_when_passingrk      s;   __'_DF== D =D    =D      6   6   =   D       (D(D((((D((((((6(((6((((((D(((((((''.:'........:...:......f...f...'...................  &3 !&Q&!Q&&&&!Q&&&&&&3&&&3&&&&&&v&&&v&&& &&&!&&&Q&&&&&&&r	   c                l   d}| j                  |i       }|j                  }|st        j                  d      dz   dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }t        t        j                  |            d}|j                  d   }d	}t        ||      }|st        j                  d
      dz   dt	        j
                         v st        j                  t              rt        j                  t              nddt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }t        t        j                  |            dx}}d}t        ||      }|st        j                  d      dz   dt	        j
                         v st        j                  t              rt        j                  t              nddt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }t        t        j                  |            dx}}d}t        ||      }|st        j                  d      dz   dt	        j
                         v st        j                  t              rt        j                  t              nddt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }t        t        j                  |            dx}}g }|j                  }t        |t              }	|	}
|	r|j                  }|}
|
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t	        j
                         v st        j                  t              rt        j                  t              ndt        j                  |	      dz  }|j                  |       |	rlddt	        j
                         v st        j                  |      rt        j                  |      ndt        j                        dz  }|j                  |       t        j                  |d      i z  }dd|iz  }t        t        j                  |            dx}
x}x}x}	}g }|j                   }t        |t              }	|	}
|	r|j                   }|}
|
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t	        j
                         v st        j                  t              rt        j                  t              ndt        j                  |	      dz  }|j                  |       |	rlddt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }|j                  |       t        j                  |d      i z  }dd|iz  }t        t        j                  |            dx}
x}x}x}	}g }|j"                  }t        |t              }	|	}
|	r|j"                  }|}
|
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t	        j
                         v st        j                  t              rt        j                  t              ndt        j                  |	      dz  }|j                  |       |	rlddt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }|j                  |       t        j                  |d      i z  }dd|iz  }t        t        j                  |            dx}
x}x}x}	}y)zMWB3: AxiomViolation dataclass exposes axiom_id, description, evidence fields.zimport sqlite3r   zExpected at least one violationz0
>assert %(py2)s
{%(py2)s = %(py0)s.violations
}r   )r   r   Nr   r/   z!AxiomViolation missing 'axiom_id'z7
>assert %(py5)s
{%(py5)s = %(py0)s(%(py1)s, %(py3)s)
}hasattr	violationr   r    r!   r   descriptionz$AxiomViolation missing 'description'evidencez!AxiomViolation missing 'evidence'zL%(py8)s
{%(py8)s = %(py2)s(%(py5)s
{%(py5)s = %(py3)s.axiom_id
}, %(py6)s)
}rd   str)r   r!   r   rh   rX   z(%(py12)s
{%(py12)s = %(py10)s.axiom_id
})rZ   py12zassert %(py15)spy15zO%(py8)s
{%(py8)s = %(py2)s(%(py5)s
{%(py5)s = %(py3)s.description
}, %(py6)s)
}z+%(py12)s
{%(py12)s = %(py10)s.description
}zL%(py8)s
{%(py8)s = %(py2)s(%(py5)s
{%(py5)s = %(py3)s.evidence
}, %(py6)s)
}z(%(py12)s
{%(py12)s = %(py10)s.evidence
})r$   r.   r&   r0   r(   r)   r*   r+   r,   r-   rm   r/   rd   rr   append_format_booloprp   rq   )r   r2   r   r3   @py_format3rn   r:   r4   r6   r\   r9   @py_assert11r^   @py_format13@py_format14@py_format16s                   r
   -test_wb3_axiom_violation_has_all_three_fieldsr|      s   D__$b_AF??????????6???6?????????!!!$I )N79j)N)NN+NNNNNNN7NNN7NNNNNN9NNN9NNNjNNN)NNNNNN+T79m,T,TT.TTTTTTT7TTT7TTTTTT9TTT9TTTmTTT,TTTTTT(N79j)N)NN+NNNNNNN7NNN7NNNNNN9NNN9NNNjNNN)NNNNNNEi((E:(#.E.E.93E3EE3EEEEEEE:EEE:EEEEEEiEEEiEEE(EEEEEE#EEE#EEE.EEEE.EEEEE9EEE9EEE3EEEEEEEEEEEEEEKi++K:+S1K1K1i6K6KK6KKKKKKK:KKK:KKKKKKiKKKiKKK+KKKKKKSKKKSKKK1KKKK1KKKKKiKKKiKKK6KKKKKKKKKKKKKKEi((E:(#.E.E.93E3EE3EEEEEEE:EEE:EEEEEEiEEEiEEE(EEEEEE#EEE#EEE.EEEE.EEEEE9EEE9EEE3EEEEEEEEEEEEEEr	   c                   d}| j                  |i       }|j                  D cg 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  }t        j                  d|       d	z   d
|iz  }t        t        j                  |            dx}}yc c}w )uO   WB4: UPDATE with 'WHERE version =' present → no AXIOM_OCC_REQUIRED violation.zWcur.execute(
    'UPDATE sessions SET data=%s WHERE version=%s',
    (data, version)
)
r   rK   not inz%(py1)s not in %(py3)sr   r   zYAXIOM_OCC_REQUIRED should not trigger when 'WHERE version =' is present. Got violations: r"   r   Nr$   r.   r/   r&   r'   r+   r(   r)   r*   r0   r,   r-   	r   r2   r   r8   r   r9   r:   r;   r6   s	            r
   Atest_wb4_insert_with_version_check_does_not_trigger_occ_violationr      s    	 	 __$b_AF%+%6%677I7 y0  y           (1    (1   $+	'     8   C8c                   d}| j                  |i       }|j                  D cg 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  }t        j                  d|       d	z   d
|iz  }t        t        j                  |            dx}}yc c}w )uP   WB5: Code with gemini.google.com AND 'login' → no AXIOM_GEMINI_AUTH violation.z# Navigate to Gemini and login
driver.get('https://gemini.google.com')
login_button = driver.find_element(By.ID, 'login')
login_button.click()
r   rQ   r~   r   r   r   zNAXIOM_GEMINI_AUTH should not trigger when 'login' is present. Got violations: r"   r   Nr   r   s	            r
   Atest_wb5_gemini_with_login_does_not_trigger_gemini_auth_violationr      s    	! 	 __$b_AF%+%6%677I7 i/  i          '0    '0   $+	'     8r   c                   d}| j                  |i       }|j                  D cg 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  }t        j                  d|       d	z   d
|iz  }t        t        j                  |            dx}}yc c}w )uS   WB6 (extra): gemini.google.com + 'auth' in code → no AXIOM_GEMINI_AUTH violation.z# Ensure authenticated session before accessing Gemini
auth_token = get_auth_token()
url = 'https://gemini.google.com/chat'
headers = {'Authorization': f'Bearer {auth_token}'}
r   rQ   r~   r   r   r   zMAXIOM_GEMINI_AUTH should not trigger when 'auth' is present. Got violations: r"   r   Nr   r   s	            r
   Htest_wb6_gemini_with_auth_keyword_does_not_trigger_gemini_auth_violationr      s    
	@ 	 __$b_AF%+%6%677I7 i/  i          '0    '0   $+	'     8r   c                   dddii}| j                  d|      }|j                  D cg 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 )zDTELNYX_API_KEY pattern in state dict triggers AXIOM_NO_API_KEY_LEAK.envTELNYX_API_KEYKEY_secret123passr   rA   r   r   r   r   r[   r   Nr$   r.   r/   r&   r'   r+   r(   r)   r*   r,   r-   	r   rB   r   r8   r   r9   r:   r;   r6   s	            r
   -test_api_key_in_state_telnyx_pattern_detectedr      s    %78E__&_FF%+%6%677I7"/"i////"i///"//////i///i/////// 8s   C#c                   ddd}| j                  d|      }|j                  D cg 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 )z@'API_KEY=' pattern in state dict triggers AXIOM_NO_API_KEY_LEAK.zAPI_KEY=supersecretz	us-east-1)configregionr   r   rA   r   r   r   r   r[   r   Nr   r   s	            r
   5test_api_key_in_state_api_key_equals_pattern_detectedr      s    ,DE__&_FF%+%6%677I7"/"i////"i///"//////i///i/////// 8s   C"c                   d}| j                  |i       }|j                  D cg 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 )z5'C:/' (forward slash) path triggers AXIOM_NO_C_DRIVE.z,output = open('C:/Users/P3/output.csv', 'w')r   rN   r   r   r   r   r[   r   Nr   r   s	            r
   +test_c_drive_forward_slash_pattern_detectedr     s    9D__$b_AF%+%6%677I7************************ 8   Cc                   | j                  di       }d}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                  |      t	        j                  |      dz  }t        t	        j                  |            dx}}d	}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                  |      t	        j                  |      dz  }t        t	        j                  |            dx}}|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}}|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)z?AxiomResult has 'passed' (bool) and 'violations' (list) fields.zx = 42r   r%   z5assert %(py5)s
{%(py5)s = %(py0)s(%(py1)s, %(py3)s)
}rm   r   ro   Nr.   zQassert %(py6)s
{%(py6)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.passed
}, %(py4)s)
}rd   boolrf   rc   re   )r$   rm   r(   r)   r&   r*   r+   r,   r-   r%   rd   r   r.   re   )r   r   r:   r4   r6   ri   rj   s          r
   9test_axiom_result_is_dataclass_with_passed_and_violationsr     sB   __("_EF#$768$$$$$$$$7$$$7$$$$$$6$$$6$$$8$$$$$$$$$$'(76<((((((((7(((7((((((6(((6(((<((((((((((mm*:mT********:***:******f***f***m******T***T**********''.:'........:...:......f...f...'...................r	   c                   d}| j                  |i       }|j                  D cg 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 )zP'sqlite3' as a bare token (not import statement) still triggers AXIOM_NO_SQLITE.z<conn = sqlite3.connect(':memory:')  # using sqlite3 directlyr   r   r   r   r   r   r[   r   Nr   r   s	            r
   &test_import_sqlite_bare_token_detectedr     s    ID__$b_AF%+%6%677I7)	))))	)))))))))	)))	))))))) 8r   c                   d}| j                  |i       }|j                  D cg 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 )zMLowercase 'insert into' (no WHERE version=) also triggers AXIOM_OCC_REQUIRED.z=cur.execute('insert into events (name) values (%s)', (name,))r   rK   r   r   r   r   r[   r   Nr   r   s	            r
   &test_occ_check_case_insensitive_insertr     s    JD__$b_AF%+%6%677I7,9,,,,9,,,,,,,,,9,,,9,,,,,,, 8r   c                   d}| j                  |i       }|j                  D cg 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 )zC'WHERE version = 5' (space before =) correctly satisfies OCC check.z0UPDATE sessions SET state = %s WHERE version = 5r   rK   r~   r   r   r   r[   r   Nr   r   s	            r
   3test_update_with_where_version_equals_space_variantr   (  s    =D__$b_AF%+%6%677I70y0000y000000000y000y0000000 8r   __main__u'   BB1: import sqlite3 → AXIOM_NO_SQLITEc                      t        t              S N)r<   _checkerr   r	   r
   <lambda>r   ;      >xH r	   u.   BB2: sk-xxx in state → AXIOM_NO_API_KEY_LEAKc                      t        t              S r   )rC   r   r   r	   r
   r   r   =  s    GQ r	   u-   BB3: clean code + clean state → passed=Truec                      t        t              S r   )rI   r   r   r	   r
   r   r   ?      7A r	   u8   BB4: INSERT without WHERE version → AXIOM_OCC_REQUIREDc                      t        t              S r   )rL   r   r   r	   r
   r   r   A      J8T r	   u'   BB5: C:\Users path → AXIOM_NO_C_DRIVEc                      t        t              S r   )rO   r   r   r	   r
   r   r   C  r   r	   u4   BB6: gemini.google.com no auth → AXIOM_GEMINI_AUTHc                      t        t              S r   )rR   r   r   r	   r
   r   r   E      FxP r	   z.WB1: 3 violations all returned (not fail-fast)c                      t        t              S r   )r`   r   r   r	   r
   r   r   G      <XF r	   z*WB2: violations=[] (not None) when passingc                      t        t              S r   )rk   r   r   r	   r
   r   r   I  s    HR r	   z$WB3: AxiomViolation has all 3 fieldsc                      t        t              S r   )r|   r   r   r	   r
   r   r   K  r   r	   u6   WB4: INSERT + WHERE version= → no AXIOM_OCC_REQUIREDc                      t        t              S r   )r   r   r   r	   r
   r   r   M      RS[\ r	   u7   WB5: gemini.google.com + login → no AXIOM_GEMINI_AUTHc                      t        t              S r   )r   r   r   r	   r
   r   r   O  r   r	   u>   WB6: gemini.google.com + auth keyword → no AXIOM_GEMINI_AUTHc                      t        t              S r   )r   r   r   r	   r
   r   r   Q  s    YZbc r	   u7   EDGE: TELNYX_API_KEY in state → AXIOM_NO_API_KEY_LEAKc                      t        t              S r   )r   r   r   r	   r
   r   r   S  r   r	   u1   EDGE: API_KEY= in state → AXIOM_NO_API_KEY_LEAKc                      t        t              S r   )r   r   r   r	   r
   r   r   U  r   r	   u,   EDGE: C:/ forward slash → AXIOM_NO_C_DRIVEc                      t        t              S r   )r   r   r   r	   r
   r   r   W  r   r	   z0EDGE: AxiomResult has passed + violations fieldsc                      t        t              S r   )r   r   r   r	   r
   r   r   Y  r   r	   u,   EDGE: bare sqlite3 token → AXIOM_NO_SQLITEc                      t        t              S r   )r   r   r   r	   r
   r   r   [  r   r	   u=   EDGE: lowercase insert without version → AXIOM_OCC_REQUIREDc                      t        t              S r   )r   r   r   r	   r
   r   r   ]  r   r	   u?   EDGE: WHERE version = 5 space variant → no AXIOM_OCC_REQUIREDc                      t        t              S r   )r   r   r   r	   r
   r   r   _  s    DXN r	   z	  [PASS]    z	  [FAIL] rY   
/z tests passedz(ALL TESTS PASSED -- Story 8.02 (Track B))returnr   )r   r   )4__doc__
__future__r   builtinsr(   _pytest.assertion.rewrite	assertionrewriter&   syspathinsertpytestcore.evolution.axiomatic_testsr   r   r   fixturer   r<   rC   rI   rL   rO   rR   r`   rk   r|   r   r   r   r   r   r   r   r   r   r   __name__	tracebackr   testsr%   rV   totalnamefnprint	Exceptionexc	print_excexitr   r	   r
   <module>r      sw   #   
 * +    		"	*+,'F$""000+/*-1 zH	2	H	J	9	Q	S	8	A	C	C	T	V	3	H	J	?	P	R	9	F	H	5	R	T	/	H	J	A	\	^	B	\	^	I	c	e	B	H	J	<	P	R	7	F	H	;	T	V	7	A	C	H	A	C	J	N	PK'ER FJE "b	"DIdV$%aKF	" 
Bvhawm
,-89y h  	"IdV2cU+,I!!	"s   E%%F*FF