
    (<if                        d 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j                  j                  d e ee      j                  j                               ddlZdZdZdZdZdd	ed
efdZded	ed
efdZ G d d      Z G d d      Z G d d      Z G d d      Z G d d      Z G d d      Z G d d      Zy)ua  Tests for passive-feedback.py - TDD RED phase (구현체 없음, 테스트만 작성).

1. test_snapshot_save: snapshot 저장 → 파일 존재 + 내용 + 메타데이터 확인
2. test_detect_diff_normal: diff 정상 추출 + passive-diffs.jsonl 기록 확인
3. test_detect_whitespace_only: 공백만 변경 시 None 반환
4. test_learning_extraction: learning → learnings.jsonl에 jay-feedback source 저장
5. test_history: get_history → passive-diffs.jsonl 정상 반환
6. test_ai_call_mocking: anthropic SDK 모킹 검증
7. test_snapshot_path_auto_creation: 디렉토리 없어도 자동 생성
    N)Path)	MagicMockpatchzsatori-cardnewsu+   상담 예약하기
지금 신청하세요
u,   지금 무료 상담
지금 신청하세요
u-   상담 예약하기  
지금 신청하세요
textreturnc                 L    t               }| |_        t               }|g|_        |S )N)r   r   content)r   r	   resps      T/home/jay/workspace/.worktrees/task-2057-dev2/scripts/tests/test_passive_feedback.py_ai_mockr      s%    kGGL;D9DLK    pathc                 ,    | j                  |d       | S )Nutf-8encoding)
write_text)r   r   s     r   _writer   &   s    OOD7O+Kr   c                       e Zd ZdeddfdZy)TestSnapshotSavetmp_pathr   Nc                 `   t        |      t        j                  d<   t        |dz  t              }t        j                  t        t        |      d      }t        |d         }|j                         sJ |j                  d      t        k(  sJ |d   t        k(  sJ |d	   dk(  sJ |d
   sJ y )NWORKSPACE_ROOT
source.txttask-001)
skill_name	file_pathtask_idsnapshot_pathr   r   r   r   	timestamp)strosenvironr   ORIGINALpfsave_snapshotSKILLr   exists	read_text)selfr   srcresultsnaps        r   test_snapshot_savez#TestSnapshotSave.test_snapshot_save,   s    '*8}

#$X,h7!!Uc#hPZ[F?+,{{}}~~w~/8;;;l#u,,,i J...k"""r   )__name__
__module____qualname__r   r.    r   r   r   r   +   s    #4 #D #r   r   c                       e Zd ZdeddfdZy)TestDetectDiffNormalr   r   Nc                 4   t        |      t        j                  d<   t        |dz  t              }t        |dz  t
              }t        d      5 }t               }||j                  _	        t               |j                  j                  _	        t        j                  t        t        |      t        |      d      }d d d        J |dz  dz  t        z  d	z  }|j!                         sJ |j#                  d
      j%                         j'                         D cg c]  }t)        j*                  |       }	}t-        |	      dk(  sJ |	d   }
|
d   t        k(  sJ |
d   dk(  sJ d|
v sJ d|
v sJ t/        |
d   t0              sJ y # 1 sw Y   xY wc c}w )Nr   orig.txtmod.txtpassive_feedback.anthropictask-002r   memoryskill-feedbackpassive-diffs.jsonlr   r      r   r   r   r    diff_summary
diff_lines)r!   r"   r#   r   r$   MODIFIEDr   r   	Anthropicreturn_valuer   messagescreater%   detect_diffr'   r(   r)   strip
splitlinesjsonloadslen
isinstancelist)r*   r   origmod	mock_anthclientr,   	diff_filelrecordsrecs              r   test_detect_diff_normalz,TestDetectDiffNormal.test_detect_diff_normal;   s   '*8}

#$h+X6X	)84/0 	TI[F/5I,2:*FOO""/^^E3t9c#h
SF		T !!!x'*::UBEZZ	!!!*3*=*=w*=*O*U*U*W*b*b*deQ4::a=ee7|q   aj< E)))9~+++c!!!$$$#l+T222#	T 	T fs   A.F	F	F)r/   r0   r1   r   rV   r2   r   r   r4   r4   :   s    3 3 3r   r4   c                       e Zd ZdeddfdZy)TestDetectWhitespaceOnlyr   r   Nc                     t        |      t        j                  d<   t        |dz  t              }t        |dz  t
              }t        j                  t        t        |      t        |            }|J y )Nr   r6   r7   )	r!   r"   r#   r   r$   WHITESPACE_ONLYr%   rF   r'   )r*   r   rN   rO   r,   s        r   test_detect_whitespace_onlyz4TestDetectWhitespaceOnly.test_detect_whitespace_onlyU   s[    '*8}

#$h+X6X	)?;s4y#c(;~~r   )r/   r0   r1   r   r[   r2   r   r   rX   rX   T   s    D T r   rX   c                       e Zd ZdeddfdZy)TestLearningExtractionr   r   Nc                 4   t        |      t        j                  d<   t        |dz  t              }t        |dz  t
              }d}t        d      5 }t               }||j                  _	        t        |      |j                  j                  _	        t        j                  t        t        |      t        |      d       d d d        |dz  d	z  d
z  }|j!                         sJ |j#                  d      j%                         j'                         D cg c]  }t)        j*                  |       }	}|	D 
cg c]  }
|
j-                  d      dk(  s|
 }}
|sJ d       |d   }|d   t        k(  sJ |d   J |d   |k(  sJ y # 1 sw Y   xY wc c}w c c}
w )Nr   r6   r7   uE   CTA는 '예약' 대신 '무료' 키워드 포함 시 전환율 향상r8   ztask-003r:   r;   zskill-learningzlearnings.jsonlr   r   sourcezjay-feedbacku1   jay-feedback source 레코드가 있어야 한다r   r   
expires_atlearning)r!   r"   r#   r   r$   rA   r   r   rB   rC   r   rD   rE   r%   rF   r'   r(   r)   rG   rH   rI   rJ   get)r*   r   rN   rO   learning_textrP   rQ   learnings_filerS   rT   rjay_recordsrU   s                r   test_learning_extractionz/TestLearningExtraction.test_learning_extraction`   s   '*8}

#$h+X6X	)84_/0 	KI[F/5I,2:=2IFOO""/NN5#d)SXzJ		K "H,/??BSS$$&&&*8*B*BG*B*T*Z*Z*\*g*g*ijQ4::a=jj")OQQUU8_-NqOOOOO{!n< E)))< (((:-///	K 	K kOs   A/FF6FFF)r/   r0   r1   r   rg   r2   r   r   r]   r]   _   s    0 0$ 0r   r]   c                   ,    e Zd ZdeddfdZdeddfdZy)TestHistoryr   r   Nc           
         t        |      t        j                  d<   |dz  dz  t        z  }|j	                  dd       dt        ddd	g d
dddt        dddg dddg}|dz  j                  dj                  d |D              d       t        j                  t              }t        |t              sJ t        |      dk(  sJ |d   d   dk(  sJ |d   d   dk(  sJ y )Nr   r;   r<   T)parentsexist_okz2026-03-25T12:00:00r   z
memory/...u
   CTA 변경u   무료 효과적z	learn-001)r    r   r   r   r?   r@   learning_extractedlearning_idz2026-03-25T13:00:00r9   u   헤드라인 수정u"   숫자 포함 시 클릭률 향상z	learn-002r=   
c              3   J   K   | ]  }t        j                  |d         yw)F)ensure_asciiN)rI   dumps).0re   s     r   	<genexpr>z+TestHistory.test_history.<locals>.<genexpr>   s     FAdjj77Fs   !#r   r      r   r   r>   )r!   r"   r#   r'   mkdirr   joinr%   get_historyrL   rM   rK   )r*   r   diff_dirrowshistorys        r   test_historyzTestHistory.test_historyx   s   '*8}

#$h&)99EAtd3 3#%!- , &8*	 3#%!- 5 &J*	
, 
)	)55IIFFFQX 	6 	
 ..''4(((7|q   qz)$
222qz)$
222r   c                 x    t        |      t        j                  d<   t        j                  t
              g k(  sJ y )Nr   )r!   r"   r#   r%   rx   r'   )r*   r   s     r   test_history_empty_when_no_filez+TestHistory.test_history_empty_when_no_file   s,    '*8}

#$~~e$***r   )r/   r0   r1   r   r|   r~   r2   r   r   ri   ri   w   s)    #3T #3d #3J+ + +r   ri   c                       e Zd ZdeddfdZy)TestAiCallMockingr   r   Nc                    t        |      t        j                  d<   t        |dz  t              }t        |dz  t
              }t        d      5 }t               }||j                  _	        t               |j                  j                  _	        t        j                  t        t        |      t        |             |j                  j!                          |j                  j                  j!                          |j                  j                  j"                  }|j$                  r|j$                  n|d   }d|j'                  dd      v sJ 	 d d d        y # 1 sw Y   y xY w)	Nr   r6   r7   r8   r>   zclaude-sonnet-4-6model )r!   r"   r#   r   r$   rA   r   r   rB   rC   r   rD   rE   r%   rF   r'   assert_called_once	call_argskwargsrb   )r*   r   rN   rO   rP   rQ   call_kwargsr   s           r   test_ai_call_mockingz&TestAiCallMocking.test_ai_call_mocking   s   '*8}

#$h+X6X	)84/0 
	BI[F/5I,2:*FOO""/NN5#d)SX6224OO""557 //00::K+6+=+=['';q>F&&**Wb*AAAA
	B 
	B 
	Bs   C=EE)r/   r0   r1   r   r   r2   r   r   r   r      s    BT Bd Br   r   c                       e Zd ZdeddfdZy)TestSnapshotPathAutoCreationr   r   Nc                 `   t        |      t        j                  d<   |dz  dz  t        z  dz  }|j	                         rJ t        |dz  t              }t        j                  t        t        |            }|j	                         sJ t        |d         j	                         sJ |d   J y )	Nr   r;   r<   	snapshotsr   )r   r   r   r   )
r!   r"   r#   r'   r(   r   r$   r%   r&   r   )r*   r   snap_dirr+   r,   s        r    test_snapshot_path_auto_creationz=TestSnapshotPathAutoCreation.test_snapshot_path_auto_creation   s    '*8}

#$h&)99EAKO??$$$X,h7!!Uc#hG   F?+,33555i (((r   )r/   r0   r1   r   r   r2   r   r   r   r      s    
) 
)$ 
)r   r   )u5   CTA는 '무료' 키워드 포함 시 전환율 향상)__doc__rI   r"   syspathlibr   unittest.mockr   r   pytestr   insertr!   __file__parentpassive_feedbackr%   r'   r$   rA   rZ   r   r   r   r4   rX   r]   ri   r   r   r2   r   r   <module>r      s   	  	 
  *  3tH~,,334 5 :;C3 U^  S T 
# #3 34 0 00(+ (+VB B&) )r   