
    Siu                        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ej                  j                  dd            Z ee      ej                  vr"ej                  j                  d ee             edz  Z ee      ej                  vr"ej                  j                  d ee             ddlmZ d	efd
Zd	efdZd	efdZd	efdZd	efdZd	efdZd	efdZd	efdZd	efdZd	efdZd	efdZd	efdZd	efdZd	efdZ d	efdZ!d	efdZ"d	efdZ#d	efdZ$d	efdZ%d	efdZ&d	efdZ'd Z(d  Z)d! Z*d" Z+d# Z,d$ Z-d	efd%Z.d	efd&Z/d	efd'Z0y)(u8  
test_auto_merge.py

auto_merge.py TDD 테스트 (토르 작성)

테스트 항목:
1. test_scan_done_files: .done 파일 감지, .done.clear 제외
2. test_try_claim_success: 원자적 선점 성공
3. test_try_claim_already_claimed: 이미 선점된 경우 False
4. test_parse_done_valid: 정상 JSON 파싱
5. test_parse_done_invalid: 비정상 JSON 처리
6. test_parse_done_legacy_format: 구형 포맷 (merge_needed 없음) 처리
7. test_analyze_report: mock으로 parse_report 결과 검증
8. test_resolve_project_path_from_report: 보고서에서 프로젝트 경로 추출
9. test_execute_merge_success: 머지 성공 시나리오 (subprocess mock)
10. test_execute_merge_conflict: 머지 충돌 시나리오
11. test_run_tests_pytest: pytest 실행 성공
12. test_run_tests_timeout: 타임아웃 처리
13. test_revert_merge: 되돌리기 테스트
14. test_log_result: merge-log.json 기록
15. test_dry_run: 드라이런 모드에서 실제 머지 없음
16. test_run_full_flow: 전체 흐름 통합 테스트 (mock 기반)
17. test_load_env_keys: .env.keys 파싱
    N)Path)	MagicMockpatchWORKSPACE_ROOT/home/jay/workspacescripts)
AutoMergertmp_pathc                 n   | dz  dz  }|j                  d       |dz  }|j                  dd       |d	z  }|j                  d
d       |dz  j                  dd       |dz  j                  dd       t        t        |             }|j	                         }t        |      dk(  sJ |d   |k(  sJ y)uF   미처리 .done 파일 스캔: .done.clear 없는 것만 반환한다.memoryeventsTparentsztask-100.1.donez+{"task_id": "task-100.1", "status": "done"}utf-8encodingztask-101.1.donez+{"task_id": "task-101.1", "status": "done"}ztask-101.1.done.clear{}ztask-102.1.done.clearworkspace_path   r   N)mkdir
write_textr	   strscan_done_fileslen)r
   
events_dirf1f2mergerresults         F/home/jay/workspace/.worktrees/task-2117-dev1/tests/test_auto_merge.pytest_scan_done_filesr"   3   s    H$x/JT" 
'	'BMM?'MR 
'	'BMM?'MR))55dW5M ))55dW5Ms8}5F##%Fv;!!9??    c                    | dz  dz  }|j                  d       |dz  }|j                  dd       t        t        |       	      }|j	                  |      }|du sJ |d
z  j                         sJ |dz  j                         rJ y)uL   원자적 선점: .done.merging 파일을 생성하고 True를 반환한다.r   r   Tr   ztask-200.1.donez{"task_id": "task-200.1"}r   r   r   ztask-200.1.done.mergingztask-200.1.done.clearN)r   r   r	   r   	try_claimexistsr
   r   	done_filer   r    s        r!   test_try_claim_successr)   P   s    H$x/JT"..I4wGs8}5Fi(FT>>22::<<<44<<>>>>r#   c                     | dz  dz  }|j                  d       |dz  }|j                  dd       |d	z  j                  d
d       t        t        |             }|j	                  |      }|du sJ y)uT   원자적 선점: .done.merging 파일이 이미 존재하면 False를 반환한다.r   r   Tr   ztask-201.1.donez{"task_id": "task-201.1"}r   r   ztask-201.1.done.mergingr   r   FN)r   r   r	   r   r%   r'   s        r!   test_try_claim_already_claimedr+   g   s    H$x/JT"..I4wG++77w7Os8}5Fi(FU??r#   c                 8   | dz  dz  }|j                  d       |dz  }ddddd	d
}|j                  t        j                  |      d       t	        t        |             }|j                  |      }|d   dk(  sJ |d   d	k(  sJ |d   du sJ |d   dk(  sJ y)uK   정상 JSON .done 파일 파싱: task_id, team_id, merge_needed 등 추출.r   r   Tr   task-391.1.done
task-391.1donetask/task-391.1-dev1dev1task_idstatusmerge_neededmerge_branchteam_idr   r   r   r3   r7   r5   r6   N)r   r   jsondumpsr	   r   
parse_done)r
   r   r(   	done_datar   r    s         r!   test_parse_done_validr<   |   s    H$x/JT"..I.I I.As8}5Fy)F),,,)&&&.!T))).!%;;;;r#   c                    | dz  dz  }|j                  d       |dz  }|j                  dd       t        t        |       	      }t	        j
                  |d
      5 }t        j                  t        d      5  |j                  |       ddd       |j                          ddd       y# 1 sw Y   "xY w# 1 sw Y   yxY w)uC   비정상 JSON: escalate를 호출하고 예외를 발생시킨다.r   r   Tr   ztask-bad.donezNOT VALID JSON{{{{r   r   r   escalateJSONmatchN)r   r   r	   r   r   objectpytestraises
ValueErrorr:   assert_called_once)r
   r   r(   r   mock_escalates        r!   test_parse_done_invalidrH      s    H$x/JT"_,I-@s8}5F	fj	) +]]]:V4 	)i(	)((*+ +	) 	)+ +s$   B9:B-B9-B6	2B99Cc                 :   | dz  dz  }|j                  d       |dz  }dddd	}|j                  t        j                  |      d
       t	        t        |             }|j                  |      }|j                  dd      du sJ |d   dk(  sJ |d   dk(  sJ y)uG   구형 포맷: merge_needed 없는 파일도 올바르게 파싱한다.r   r   Tr   ztask-old.donedev2z2026-03-01T10:00:00g      ^@)r7   end_timeduration_secondsr   r   r   r5   Fr7   r3   ztask-oldN)r   r   r8   r9   r	   r   r:   get)r
   r   r(   legacy_datar   r    s         r!   test_parse_done_legacy_formatrO      s    H$x/JT"_,I)!K
 K07Cs8}5Fy)F ::ne,555)&&&)
***r#   c                 D   | dz  dz  }|j                  d       |dz  }|j                  dd       d	d
dddg d}t        t        |             }t	        d|      5  |j                  d	      }ddd       d   du sJ |d   dk(  sJ |d   dk(  sJ y# 1 sw Y   'xY w)uF   analyze_report: parse_report를 mock으로 대체하여 결과 검증.r   reportsTr   task-391.1.mdu   # task-391.1 보고서
r   r   r.   r1   r0   z3/home/jay/projects/MyApp/.worktrees/task-391.1-dev1)r3   teamr5   r6   merge_worktreefilesr   auto_merge.parse_reportreturn_valueNr5   r6   rT   )r   r   r	   r   r   analyze_report)r
   reports_dirreport_filemock_reportr   r    s         r!   test_analyze_reportr]      s    X%	1Kd# /K5H  .OK s8}5F	({	C 5&&|45 .!T))).!%;;;;"#'\\\\5 5s   BBc                 l    t        t        |             }ddgd}|j                  d|      }|dk(  sJ y)uO   보고서 데이터에서 /home/jay/projects/... 패턴 경로를 추출한다.r   z8/home/jay/projects/ThreadAuto/.worktrees/task-391.1-dev1z%/home/jay/projects/ThreadAuto/main.pyrT   rU   r.   /home/jay/projects/ThreadAutoNr	   r   resolve_project_pathr
   r   report_datar    s       r!   %test_resolve_project_path_from_reportre      sF    s8}5F U9:K
 (({CF4444r#   c                 j    t        t        |             }dg d}|j                  d|      }|dk(  sJ y)u<   merge_worktree에서 프로젝트 경로를 역추적한다.r   z7/home/jay/projects/MyProject/.worktrees/task-391.1-dev1r_   r.   z/home/jay/projects/MyProjectNra   rc   s       r!   'test_resolve_project_path_from_worktreerg      sC    s8}5F TK
 (({CF3333r#   c                 d    t        t        |             }dg d}|j                  d|      }|J y)u5   경로를 찾을 수 없을 때 None을 반환한다.r   Nr_   z
task-999.9ra   rc   s       r!   test_resolve_project_path_noneri     s=    s8}5F K
 (({CF>>r#   c                 .   t        t        |             }t        j                  ddd      }t	               }d|_        ||_        d|_        t        d|      5  |j                  d	d
d      }ddd       d   dk(  sJ |d   dk(  sJ y# 1 sw Y   xY w)uC   머지 성공: worktree_manager.py subprocess 호출 결과 파싱.r   mergedr0   r4   branchr    subprocess.runrW   /home/jay/projects/MyAppr.   r1   Nr4   rm   )
r	   r   r8   r9   r   
returncodestdoutstderrr   execute_merge)r
   r   mock_outputmock_resultr    s        r!   test_execute_merge_successrw     s    s8}5F**<RSTK+KK$KK	k	: X%%&@,PVWX (x'''(5555	X Xs   BBc                 f   t        t        |             }t        j                  ddd      }t	               }d|_        ||_        d|_        t        d|      5  t        j                  t        d	
      5  |j                  ddd       ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w)uE   머지 충돌: subprocess 오류 시 RuntimeError를 발생시킨다.r   errorz<Merge conflict detected while merging 'task/task-391.1-dev1')r4   messager   conflictro   rW   zconflict|errorr@   rp   r.   r1   N)r	   r   r8   r9   r   rq   rr   rs   r   rC   rD   RuntimeErrorrt   )r
   r   mock_error_outputrv   s       r!   test_execute_merge_conflictr~   .  s    s8}5F

'ef +KK*K#K	k	: S]]</?@ 	S  !;\6R	SS S	S 	SS Ss$   B'6B
B'B$	 B''B0c                    t        t        |             }| dz  }|j                          t               }d|_        d|_        d|_        t        d|      5  t        dd	      5  |j                  t        |            }d
d
d
       d
d
d
       d   du sJ d|d   v sJ t        |d   t              sJ y
# 1 sw Y   9xY w# 1 sw Y   =xY w)u1   pytest 실행 성공: passed=True, output 포함.r   	myprojectr   z5 passed in 1.23srn   ro   rW   shutil.which/usr/bin/pytestNpassedToutputduration)r	   r   r   r   rq   rr   rs   r   	run_tests
isinstancefloat)r
   r   project_dirrv   r    s        r!   test_run_tests_pytestr   E  s    s8}5F [(K+KK,KK	k	: 8>0AB 	8%%c+&67F	88 (t###vh''''fZ(%000	8 	88 8s$   C%B8 C8C	=CCc                 |   ddl }t        t        |             }| dz  }|j                          t	        d|j                  dd            5  t	        d	d
      5  |j                  t        |            }ddd       ddd       d   du sJ d|d   j                         v sJ y# 1 sw Y   2xY w# 1 sw Y   6xY w)uB   테스트 타임아웃: passed=False, output에 timeout 메시지.r   Nr   r   ro   rC   i,  )side_effectr   r   rW   r   Ftimeoutr   )
subprocessr	   r   r   r   TimeoutExpiredr   lower)r
   r   r   r   r    s        r!   test_run_tests_timeoutr   `  s    s8}5F[(K	Z-F-FxQT-U	V 8>0AB 	8%%c+&67F	88 (u$$$x(..0000		8 	88 8s$   B2B&5B2&B/	+B22B;c                 &   t        t        |             }t               }d|_        d|_        d|_        t        d|      5 }|j                  d      }ddd       d	u sJ j                  d   d   }d
|v sJ d|v sJ d|v sJ y# 1 sw Y   4xY w)u;   머지 되돌리기: git reset --hard HEAD~1 호출 확인.r   r   zHEAD is now at abc1234rn   ro   rW   rp   NTgitresetz--hard)	r	   r   r   rq   rr   rs   r   revert_merge	call_args)r
   r   rv   mock_runr    called_argss         r!   test_revert_merger   v  s    s8}5F+KK1KK	k	: Ah$$%?@A T>>$$Q'*KKk!!!{"""A As   BBc           
         | dz  }|j                          |dz  }ddddgi}|j                  t        j                  |      d       t	        t        |       	      }d
ddddddddd	}|j                  d
|       t        j                  |j                  d            }t        |d         dk(  sJ |d   d   d   dk(  sJ |d   d   d   d
k(  sJ y)uI   merge-log.json에 결과를 추가한다. 기존 entries는 유지된다.r   merge-log.jsonentriesz
task-100.1successr3   r4   r   r   r   r.   z2026-03-07T15:30:00+09:00Tauto_mergedr`   r0   passg      )@)	r3   	timestampr5   actionprojectrm   test_resultrL   r4      r   r3   r   N)
r   r   r8   r9   r	   r   
log_resultloads	read_textr   )r
   
memory_dir	merge_logexistingr   	new_entrysaveds          r!   test_log_resultr     s   H$J--I	JKLHH-@s8}5F02( 
I lI.JJy**G*<=EuY A%%%Ay)\999Ay)\999r#   c                 D   | dz  }|j                          t        t        |             }ddd}|j                  d|       |dz  }|j	                         sJ t        j                  |j                  d            }t        |d	         d
k(  sJ |d	   d   d   dk(  sJ y)u0   merge-log.json이 없으면 새로 생성한다.r   r   
task-500.1r   r   r   r   r   r   r   r   r3   N)	r   r	   r   r   r&   r8   r   r   r   )r
   r   r   r   r   r   s         r!   test_log_result_creates_filer     s    H$Js8}5F(I>I
lI.--IJJy**G*<=EuY A%%%Ay)\999r#   c                    | dz  dz  }|j                  d       | dz  dz  }|j                  d       |dz  }dddd	d
d}|j                  t        j                  |      d       |dz  }|j                  dd       ddd	ddgd}t	        t        |       d      }t        d|      5  t        j                  |d      5 }t        j                  |d      5 }	|j                         }
ddd       ddd       ddd       j                          	j                          
d   dk\  sJ y# 1 sw Y   DxY w# 1 sw Y   HxY w# 1 sw Y   LxY w)uA   드라이런 모드: 실제 머지 없이 분석만 수행한다.r   r   Tr   rQ   r-   r.   r/   r0   r1   r2   r   r   rR   # task-391.1
5/home/jay/projects/TestApp/.worktrees/task-391.1-dev1"/home/jay/projects/TestApp/main.pyr3   r5   r6   rT   rU   )r   dry_runrV   rW   rt   r   N	processedr   )
r   r   r8   r9   r	   r   r   rB   runassert_not_called)r
   r   rZ   r(   r;   r[   r\   r   
mock_merge
mock_testsr    s              r!   test_dry_runr     st   H$x/JT"X%	1Kd# ..I.I I.A /K+g>  .Q67K s8}dCF	({	C &\\&/2 	&jfk2 &j&	&&   "  " +!###& &	& 	&& &s<   ,ED:D.+D:3E.D73D::E	?EEc           
         | dz  dz  }|j                  d       | dz  dz  }|j                  d       |dz  }dddd	d
d}|j                  t        j                  |      d       |dz  }|j                  dd       ddd	ddgd}t	        t        |             }t        d|      5  t        j                  |ddd	d      5  t        j                  |ddddd      5  |j                         }ddd       ddd       ddd       d   dk(  sJ |d   dk(  sJ |d    d!k(  sJ |j                         sJ d"       | dz  d#z  }	|	j                         sJ t        j                  |	j                  d            }
t        |
d$         dk(  sJ |
d$   d!   d%   dk(  sJ y# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w)&u`   전체 흐름 통합 테스트: scan → claim → parse → analyze → merge → test → log.r   r   Tr   rQ   r-   r.   r/   r0   r1   r2   r   r   rR   r   r   r   r   r   rV   rW   rt   rk   rl   r   5 passedg      ?r   r   r   Nr   r   	escalatedr   uA   .done 파일은 아누가 처리할 때까지 유지되어야 함r   r   r3   )r   r   r8   r9   r	   r   r   rB   r   r&   r   r   r   )r
   r   rZ   r(   r;   r[   r\   r   r    r   log_datas              r!   test_run_full_flowr     s"   H$x/JT"X%	1Kd# ..I.I I.A /K+g>  .Q67K s8}5F	({	C &\\&/8_u@vw 	&(,
PST &
  &	&& +!###(q   +!### bbb 8#&66Izz)--w-?@Hx	"#q(((Iq!),<<<'& &	& 	&& &s<   +F=F1$F%5F1=F=%F.*F11F:	6F==Gc           
      f   | dz  dz  }|j                  d       | dz  dz  }|j                  d       |dz  }dddd	d
}|j                  t        j                  |      d       |dz  }|j                  dd       dddddgd}t	        t        |             }t        d|      5  t        j                  |dddd      5  t        j                  |ddddd      5  t        j                  |dd      5 }t        j                  |d      5 }	|j                         }
d d d        d d d        d d d        d d d        d d d        j                          	j                          
d!   d"k(  sJ y # 1 sw Y   TxY w# 1 sw Y   XxY w# 1 sw Y   \xY w# 1 sw Y   `xY w# 1 sw Y   dxY w)#u<   테스트 실패 시 머지 revert + escalate 호출 확인.r   r   Tr   rQ   ztask-392.1.donez
task-392.1r/   rJ   r3   r4   r5   r7   r   r   ztask-392.1.mdz# task-392.1
ztask/task-392.1-dev2z5/home/jay/projects/TestApp/.worktrees/task-392.1-dev2r   r   r   rV   rW   rt   rk   rl   r   FzFAILED 2 errorsg       @r   r   r>   Nr   r   )
r   r   r8   r9   r	   r   r   rB   r   rF   )r
   r   rZ   r(   r;   r[   r\   r   mock_revertrG   r    s              r!   test_run_full_flow_test_failurer   .  s   H$x/JT"X%	1Kd#..I	I I.A/K+g>  .Q67K s8}5F	({	C 	.\\&/8_u@vw 	.(-9JX[\ .
 \\&.tL .P[fj9 .]!'...	.	. ""$$$&+!###. .. .. .	. 	.	. 	.sl   *F'F#F<F	E7$F	,F4F<F'7F <F	FFFFF$	 F''F0c                     | dz  }|j                  dd       t        t        |             }|j                         }|d   dk(  sJ |d   d	k(  sJ |d
   dk(  sJ dt        |j	                               vsJ y)u6   .env.keys 파일을 파싱하여 dict로 반환한다.z	.env.keysux   export COKACDIR_KEY_ANU=abc123def456
export COKACDIR_KEY_DEV1=xyz789
# 주석
export WORKSPACE_ROOT=/home/jay/workspace
r   r   r   COKACDIR_KEY_ANUabc123def456COKACDIR_KEY_DEV1xyz789r   r   #N)r   r	   r   _load_env_keyskeys)r
   env_filer   r    s       r!   test_load_env_keysr   `  s    +%H	6    s8}5F""$F$%777%&(222"#'<<<<c&++-((((r#   c                  l    t        j                  d      dk(  sJ t        j                  d      dk(  sJ y)u   'dev1-team' → 'dev1' 변환.	dev1-teamr1   z	dev2-teamrJ   Nr	   _team_id_to_short r#   r!   !test_team_id_to_short_with_suffixr   z  s4    ''4>>>''4>>>r#   c                  l    t        j                  d      dk(  sJ t        j                  d      dk(  sJ y)u+   이미 short 형식이면 그대로 반환.r1   rJ   Nr   r   r#   r!   #test_team_id_to_short_already_shortr     s4    ''/6999''/6999r#   c                      t        j                  d      dk(  sJ t        j                  d      dk(  sJ t        j                  d      dk(  sJ y)u<   빈 문자열, 'team'만 있는 경우 등 엣지 케이스.rn   rS   zcustom-teamcustomNr   r   r#   r!    test_team_id_to_short_edge_casesr     sM    ''+r111''/6999''6(BBBr#   c                  B    ddd} t        j                  |       dk(  sJ y)u(   merge_branch에서 team_short 역추출.r0   Nr6   rT   r1   r	   _extract_team_short_from_reportrd   s    r!   #test_extract_team_short_from_branchr     s%    #9TRK55kBfLLLr#   c                  B    ddd} t        j                  |       dk(  sJ y)u*   merge_worktree에서 team_short 역추출.Nz1/home/jay/projects/App/.worktrees/task-391.1-dev2r   rJ   r   r   s    r!   %test_extract_team_short_from_worktreer     s,     MK 55kBfLLLr#   c                  <    ddd} t        j                  |       J y)u   둘 다 없으면 None 반환.Nr   r   r   s    r!   test_extract_team_short_noner     s#    #'4@K55kBJJJr#   c                    | dz  dz  }|j                  d       | dz  dz  }|j                  d       |dz  }ddd	d
}|j                  t        j                  |      d       |dz  }|j                  dd       dd	ddg d}t	        t        |             }t        d|      5  |j                         }ddd       |dz  }	|	j                         rJ d       |j                         sJ d       d   dk(  sJ y# 1 sw Y   GxY w)ug   merge_needed=False인 경우 .done.clear를 생성하지 않고 .done 파일도 건드리지 않는다.r   r   Tr   rQ   ztask-500.1.doner   r/   F)r3   r4   r5   r   r   ztask-500.1.mdu   # task-500.1
머지 불필요
Nr   r   rV   rW   ztask-500.1.done.clearu3   .done.clear가 생성되면 안 됨 (경합 방지)uA   .done 파일이 유지되어야 함 (notify-completion에 위임)skippedr   )	r   r   r8   r9   r	   r   r   r   r&   )
r
   r   rZ   r(   r;   r[   r\   r   r    
clear_files
             r!    test_merge_needed_false_no_claimr     sB   H$x/JT"X%	1Kd# ..II
 I.A /K=P  K s8}5F	({	C  55J  "Y$YY" bbb)!!! s   (C??Dc           
         | dz  dz  }|j                  d       | dz  dz  }|j                  d       |dz  }dddd	d
d}|j                  t        j                  |      d       |dz  }|j                  dd       ddd	dg d}t	        t        |             }t        d|      5  t        j                  |ddd	d      5  t        j                  |ddddd      5  t        j                  |d      5 }|j                         }	ddd       ddd       ddd       ddd       j                  d       	d   dk(  sJ y# 1 sw Y   =xY w# 1 sw Y   AxY w# 1 sw Y   ExY w# 1 sw Y   IxY w)u9   머지 성공 후 notify_anu()가 호출되는지 확인.r   r   Tr   rQ   ztask-501.1.donez
task-501.1r/   ztask/task-501.1-dev1r   r2   r   r   ztask-501.1.mdz# task-501.1
z5/home/jay/projects/TestApp/.worktrees/task-501.1-dev1r   r   rV   rW   rt   rk   rl   r   r   g      ?r   
notify_anuNr   )
r   r   r8   r9   r	   r   r   rB   r   assert_called_once_with)
r
   r   rZ   r(   r;   r[   r\   r   mock_notifyr    s
             r!   "test_notify_anu_called_after_merger     s   H$x/JT"X%	1Kd#..I.I I.A/K+g>  .QK s8}5F	({	C *\\$,8NO
 	*
 (,
PST *
 \\&,7 *;#ZZ\F**	** ''5(q   	* ** *	* 	** *sT   *E+E#E:E	EEE+EEEEE(	$E++E4c           
          | dz  dz  }|j                  d       | dz  dz  }|j                  d       |dz  }dddd	d
}|j                  t        j                  |      d       |dz  }|j                  dd       dddddgd}t	        t        |             }t        d|      5  t        j                  |dddd      5 }t        j                  |ddddd      5  t        j                  |d      5  |j                          ddd       ddd       ddd       ddd       j                          |j                  d   }	|	d    }
|
d!k(  sJ d"|
 d#       y# 1 sw Y   VxY w# 1 sw Y   ZxY w# 1 sw Y   ^xY w# 1 sw Y   bxY w)$uN   execute_merge에 team_id가 아닌 team_short(dev1)가 전달되는지 확인.r   r   Tr   rQ   ztask-502.1.donez
task-502.1r/   r   r   r   r   ztask-502.1.mdz# task-502.1
ztask/task-502.1-dev1z5/home/jay/projects/TestApp/.worktrees/task-502.1-dev1r   r   r   rV   rW   rt   rk   rl   r   okg      ?r   r   Nr   r   r1   u)   team_short가 'dev1'이어야 하는데 '')r   r   r8   r9   r	   r   r   rB   r   rF   r   )r
   r   rZ   r(   r;   r[   r\   r   r   r   actual_team_shorts              r!   %test_team_short_used_in_execute_merger     s   H$x/JT"X%	1Kd#..I	I I.A/K+g>  .Q67K s8}5F	({	C !\\$,8NO
 	! (,#N !
 \\&,7 !JJL!!	!! !!#$$Q'I!!&h*STeSffg(hh&! !! !	! 	!! !sT   *FE8#E,:E 	E,E8F E)%E,,E51E88F	=FF)1__doc__r8   ossyspathlibr   unittest.mockr   r   rC   environrM   	WORKSPACEr   pathinsertSCRIPTS
auto_merger	   r"   r)   r+   r<   rH   rO   r]   re   rg   ri   rw   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r#   r!   <module>r      s  2  	 
  *   02GHI	y>!HHOOAs9~& i
w<sxxHHOOAs7|$ !4 :?T ?.T *<D <:+d +*+D +8]$ ]B
5D 
5
4d 
4
T 
$6 6.S$ S.1D 161T 1,# #2:d :>:4 :,*$4 *$d5= 5=p*$d *$d) )4?:CMMK("t ("`-! -!j/iD /ir#   