
    Si9s              	          d 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 ddl	Z	 eej                  j                  dd            Zedz  dz  Zd	 Z e       Zd
ddddddg ddiddddddZ e	j"                         d        Z e	j"                         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)'u  
test_add_team.py

scripts/add-team.py 단위 테스트 (아르고스 작성)

테스트 항목:
- load_config(): teams.json 로드, 파일 없을 때 기본값 반환
- save_config(): 파일 저장, 메타데이터 자동 계산, updated 타임스탬프 설정
- generate_team_id(): 한글→영문 변환, 특수문자 제거, 소문자 처리
- create_team_directory(): 팀 디렉터리 및 기본 파일 생성
- add_team(): 팀 추가, 중복 검사, config 저장, 디렉터리 생성
- list_teams(): 팀 목록 출력, 빈 목록 메시지
- main(): CLI 인수 파싱, --list, --name/--type 필수 검사

격리: monkeypatch로 _mod.CONFIG_FILE 과 _mod.TEAMS_DIR 을 tmp_path로 교체
    N)datetime)PathWORKSPACE_ROOTz/home/jay/workspacescriptsadd-team.pyc                      t         j                  j                  dt              } t         j                  j	                  |       }| j
                  j                  |       |S )u/   add-team.py를 importlib로 로드하여 반환add_team)	importlibutilspec_from_file_location_SCRIPT_PATHmodule_from_specloaderexec_module)specmodules     D/home/jay/workspace/.worktrees/task-2117-dev1/tests/test_add_team.py_load_moduler   #   sC    >>11*lKD^^,,T2FKKF#M    1.0z2026-03-02 04:05:57	dev1-team
   개발1팀   수직조직activehermes)vulcanirisathenaargos)nametypestatusleadmembers      )total_teamsactive_teamsplanned_teamstotal_members)versionupdatedteamsmetadatac              #   (  K   | dz  }|j                          | dz  }|j                          |dz  }|j                  t        j                  t        dd      d       |j                  t        d	|       |j                  t        d
|       |  yw)uS   tmp_path에 config/teams.json을 생성하고 모듈 전역 변수를 패치한다.configr-   
teams.jsonF   ensure_asciiindentutf-8encodingCONFIG_FILE	TEAMS_DIRN)mkdir
write_textjsondumps_SAMPLE_CONFIGsetattr_mod)tmp_pathmonkeypatch
config_dir	teams_dirconfig_files        r   setup_configrG   F   s      H$J7"IOO|+K

>a@7   m[9k95
Ns   BBc              #   ,  K   | dz  }|j                          | dz  }|j                          |dz  }di i d}|j                  t        j                  |dd      d	
       |j	                  t
        d|       |j	                  t
        d|       |  yw)uU   빈 팀 목록을 가진 config를 생성하고 모듈 전역 변수를 패치한다.r0   r-   r1   r   r+   r-   r.   Fr2   r3   r6   r7   r9   r:   N)r;   r<   r=   r>   r@   rA   )rB   rC   rD   rE   rF   emptys         r   empty_configrK   Y   s      H$J7"IOO|+K;E

5uQ7'   m[9k95
Ns   BBc                   4    e Zd ZdZd Zd Zd Zd Zd Zd Z	y)	TestLoadConfigu   load_config() 함수 테스트c                 R    t         j                         }|d   dk(  sJ d|d   v sJ y)u.   기존 teams.json을 올바르게 로드한다r+   r   r   r-   NrA   load_configselfrG   r0   s      r   test_load_config_from_filez)TestLoadConfig.test_load_config_from_fileu   s5    !!#i E)))fWo---r   c                     |dz  dz  }|j                  t        d|       t        j                         }|di i dk(  sJ y)u=   파일이 존재하지 않을 때 기본 dict를 반환한다r0   r1   r9   r   rI   Nr@   rA   rP   rR   rB   rC   missingr0   s        r   test_load_config_missing_filez,TestLoadConfig.test_load_config_missing_file{   sF    X%4D-9!!#URRHHHHr   c                 8    t         j                         }d|v sJ y)u)   로드된 config에 'teams' 키가 있다r-   NrO   rQ   s      r   test_load_config_has_teams_keyz-TestLoadConfig.test_load_config_has_teams_key   s    !!#&   r   c                 P    t         j                         }t        |t              sJ y)u%   load_config()는 dict를 반환한다N)rA   rP   
isinstancedictrQ   s      r   test_load_config_returns_dictz,TestLoadConfig.test_load_config_returns_dict   s     !!#&$'''r   c                 L    t         j                         }|d   d   d   dk(  sJ y)u'   dev1-team의 name이 '개발1팀'이다r-   r   r    r   NrO   rQ   s      r   "test_load_config_team_data_correctz1TestLoadConfig.test_load_config_team_data_correct   s,    !!#g{+F3|CCCr   c                 ~    |dz  dz  }|j                  t        d|       t        j                         }|d   i k(  sJ y)uC   파일 없을 때 반환되는 기본값의 teams는 빈 dict이다nonexistentr1   r9   r-   NrU   rV   s        r   (test_load_config_default_has_empty_teamsz7TestLoadConfig.test_load_config_default_has_empty_teams   sC    ]*\9D-9!!#g"$$$r   N)
__name__
__module____qualname____doc__rS   rX   rZ   r^   r`   rc    r   r   rM   rM   r   s%    (.I!
(
D
%r   rM   c                   :    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
y	)
TestSaveConfigu   save_config() 함수 테스트c                 n    di i d}t         j                  |       |dz  dz  }|j                         sJ y)u/   save_config() 호출 후 파일이 생성된다r   rI   r0   r1   N)rA   save_configexists)rR   rK   rB   r0   rF   s        r   test_save_config_creates_filez,TestSaveConfig.test_save_config_creates_file   s=    "RR@ )L8!!###r   c                    dddddgdddg dd	dd
gddi d}t         j                  |       t        j                  |dz  dz  j	                  d            }|d   d   dk(  sJ |d   d   dk(  sJ |d   d   dk(  sJ |d   d   dk(  sJ y)ue   metadata 필드(total_teams, active_teams, planned_teams, total_members)가 올바르게 계산된다r   u   팀Ar   alicebobr    r"   r$   u   팀Bplannedu   팀Ccharlie)zteam-azteam-bzteam-crI   r0   r1   r6   r7   r.   r'      r(   r2   r)   r%   r*   NrA   rl   r=   loads	read_textrR   rK   rB   r0   saveds        r   !test_save_config_updates_metadataz0TestSaveConfig.test_save_config_updates_metadata   s     #)X7TYJZ[#)Y2N#)X9+V
 
 	 

Hx/,>IISZI[\Z /1444Z 0A555Z 1Q666Z 1Q666r   c                 N   di i d}t        j                         j                  d      }t        j	                  |       t        j                         j                  d      }t        j                  |dz  dz  j                  d            }d|v sJ ||d   cxk  r|k  sJ  J y	)
uA   'updated' 필드가 YYYY-MM-DD HH:MM:SS 형식으로 설정된다r   rI   %Y-%m-%d %H:%M:%Sr0   r1   r6   r7   r,   N)r   nowstrftimerA   rl   r=   rw   rx   )rR   rK   rB   r0   beforeafterrz   s          r   'test_save_config_sets_updated_timestampz6TestSaveConfig.test_save_config_sets_updated_timestamp   s    "RR@(()<= ''(;<

Hx/,>IISZI[\E!!!y)2U22222r   c                     dddddg dii d}t         j                  |       t        j                  |dz  d	z  j	                  d
            }d|d   v sJ |d   d   d   dk(  sJ y)u6   teams 데이터가 파일에 올바르게 저장된다r   znew-team	   신규팀r   rs   )r    r!   r"   r$   rI   r0   r1   r6   r7   r-   r    Nrv   ry   s        r   test_save_config_persists_teamsz.TestSaveConfig.test_save_config_persists_teams   s     [.T]jlm 
 	 

Hx/,>IISZI[\U7^+++W~j)&1[@@@r   c                     |dz  dz  dz  }|dz  }|j                          |j                  t        d|       |j                  t        d|       di i d}t        j                  |       |j	                         sJ y	)
uC   CONFIG_FILE의 부모 디렉터리가 없어도 자동 생성된다nesteddeepr1   r-   r9   r:   r   rI   N)r;   r@   rA   rl   rm   )rR   rB   rC   rF   rE   r0   s         r   #test_save_config_creates_parent_dirz2TestSaveConfig.test_save_config_creates_parent_dir   sz    )F2\Aw&	D-=D+y9"RR@ !!###r   c                     di i d}t         j                  |       t        j                  |dz  dz  j	                  d            }|d   d   d	k(  sJ |d   d
   d	k(  sJ |d   d   d	k(  sJ |d   d   d	k(  sJ y)u=   teams가 빈 dict일 때 metadata 카운트가 모두 0이다r   rI   r0   r1   r6   r7   r.   r'   r   r(   r)   r*   Nrv   ry   s        r   %test_save_config_empty_teams_metadataz4TestSaveConfig.test_save_config_empty_teams_metadata   s    "RR@ 

Hx/,>IISZI[\Z /1444Z 0A555Z 1Q666Z 1Q666r   c                     ddddg dii d}t         j                  |       |dz  dz  j                  d	
      }t        j                  |      }t        |t              sJ y)u(   저장된 파일이 유효한 JSON이다r   t   팀r   rr   rI   r0   r1   r6   r7   N)rA   rl   rx   r=   rw   r\   r]   )rR   rK   rB   r0   contentparseds         r   test_save_config_valid_jsonz*TestSaveConfig.test_save_config_valid_json   se    "cEXbd3e-ftvw h&5@@'@RG$&$'''r   N)rd   re   rf   rg   rn   r{   r   r   r   r   r   rh   r   r   rj   rj      s)    ($7&
3A$	7(r   rj   c                   j    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d Zd Zd Zd Zd Zy)TestGenerateTeamIdu#   generate_team_id() 함수 테스트c                 <    t         j                  d      }|dk(  sJ y)u*   '개발팀' → 'devteam' 로 변환된다	   개발팀devteamNrA   generate_team_idrR   results     r   !test_korean_to_english_conversionz4TestGenerateTeamId.test_korean_to_english_conversion  s     &&{3"""r   c                 <    t         j                  d      }|dk(  sJ y)u>   공백은 하이픈으로 변환된다: 'AI 팀' → 'ai-team'u   AI 팀zai-teamNr   r   s     r   test_spaces_to_hyphensz)TestGenerateTeamId.test_spaces_to_hyphens  s     &&x0"""r   c                 X    t         j                  d      }||j                         k(  sJ y)u#   결과는 소문자로 반환된다u   DEV팀N)rA   r   lowerr   s     r   test_lowercasez!TestGenerateTeamId.test_lowercase  s&    &&x0'''r   c                 l    t         j                  d      }|D ]  }|j                         r|dk(  rJ  y)u@   알파벳, 숫자, 하이픈 외의 특수문자는 제거된다u   개발@#$팀!-N)rA   r   isalnum)rR   r   chs      r   test_special_chars_removedz-TestGenerateTeamId.test_special_chars_removed  s6    &&7 	-B::<29,,	-r   c                 :    t         j                  d      }d|v sJ y)u#   '개발' → 'dev' 로 매핑된다u   개발devNr   r   s     r   test_dev_mappingz#TestGenerateTeamId.test_dev_mapping  s    &&x0r   c                 :    t         j                  d      }d|v sJ y)u$   '팀' → 'team' 으로 매핑된다r   teamNr   r   s     r   test_team_mappingz$TestGenerateTeamId.test_team_mapping  s     &&u-r   c                 :    t         j                  d      }d|v sJ y)u&   '센터' → 'center' 로 매핑된다u   디자인 센터centerNr   r   s     r   test_center_mappingz&TestGenerateTeamId.test_center_mapping$  s!    &&'9:6!!!r   c                 :    t         j                  d      }d|v sJ y)u/   '마케팅' → 'marketing' 으로 매핑된다u   마케팅팀	marketingNr   r   s     r   test_marketing_mappingz)TestGenerateTeamId.test_marketing_mapping)  s     &&~6f$$$r   c                 :    t         j                  d      }d|v sJ y)u)   '보험' → 'insurance' 로 매핑된다u	   보험팀	insuranceNr   r   s     r   test_insurance_mappingz)TestGenerateTeamId.test_insurance_mapping.  s     &&{3f$$$r   c                 :    t         j                  d      }d|v sJ y)u,   '디자인' → 'design' 으로 매핑된다u   디자인팀designNr   r   s     r   test_design_mappingz&TestGenerateTeamId.test_design_mapping3  s     &&~66!!!r   c                 :    t         j                  d      }d|v sJ y)u#   '레드' → 'red' 로 매핑된다u	   레드팀redNr   r   s     r   test_red_mappingz#TestGenerateTeamId.test_red_mapping8  s    &&{3r   c                 :    t         j                  d      }d|v sJ y)u(   '전략' → 'strategy' 로 매핑된다u	   전략팀strategyNr   r   s     r   test_strategy_mappingz(TestGenerateTeamId.test_strategy_mapping=  s     &&{3V###r   c                 :    t         j                  d      }d|v sJ y)u    기존 하이픈은 유지된다r   r   Nr   r   s     r   test_hyphen_preservedz(TestGenerateTeamId.test_hyphen_preservedB  s    &&{3f}}r   c                 R    t         j                  d      }t        |t              sJ y)u   반환값은 str 타입이다r   N)rA   r   r\   strr   s     r   test_returns_stringz&TestGenerateTeamId.test_returns_stringG  s"    &&{3&#&&&r   c                 :    t         j                  d      }d|v sJ y)u)   숫자는 유지된다: 'dev1' → 'dev1'r   1Nr   r   s     r   test_numeric_suffix_preservedz0TestGenerateTeamId.test_numeric_suffix_preservedL  s    &&|4f}}r   N)rd   re   rf   rg   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rh   r   r   r   r      sP    -#
#
(-
 
"
%
%
"

$

'
r   r   c                   L    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)TestCreateTeamDirectoryu(   create_team_directory() 함수 테스트c                 `    t         j                  dd       |dz  dz  j                         sJ y)u    팀 디렉터리가 생성된다	test-team   테스트팀r-   NrA   create_team_directoryis_dirrR   rK   rB   s      r   test_creates_directoryz.TestCreateTeamDirectory.test_creates_directoryZ  s.    "";?7"[088:::r   c                 j    t         j                  dd       |dz  dz  dz  }|j                         sJ y)u   README.md가 생성된다r   r   r-   	README.mdNrA   r   rm   )rR   rK   rB   readmes       r   test_creates_readmez+TestCreateTeamDirectory.test_creates_readme_  s4    "";?G#k1K?}}r   c                 v    t         j                  dd       |dz  dz  dz  }|j                  d      }d|v sJ y)u'   README.md에 팀 이름이 포함된다r   r   r-   r   r6   r7   N)rA   r   rx   )rR   rK   rB   r   r   s        r   test_readme_contains_team_namez6TestCreateTeamDirectory.test_readme_contains_team_namee  sG    "";?G#k1K?""G"4(((r   c                     t         j                  dd       |dz  dz  }|dz  j                         sJ |dz  j                         sJ |dz  j                         sJ y)u7   src/, tests/, docs/ 하위 디렉터리가 생성된다r   r   r-   srctestsdocsNr   )rR   rK   rB   team_dirs       r   test_creates_subdirsz,TestCreateTeamDirectory.test_creates_subdirsl  sf    "";?g%35 ((***7"**,,,6!))+++r   c                 l    t         j                  dd       |dz  dz  dz  dz  j                         sJ y)u   src/.gitkeep이 생성된다r   r   r-   r   .gitkeepNr   r   s      r   test_creates_gitkeep_in_srcz3TestCreateTeamDirectory.test_creates_gitkeep_in_srct  s8    "";?7"[058:EMMOOOr   c                 l    t         j                  dd       |dz  dz  dz  dz  j                         sJ y)u   tests/.gitkeep이 생성된다r   r   r-   r   r   Nr   r   s      r   test_creates_gitkeep_in_testsz5TestCreateTeamDirectory.test_creates_gitkeep_in_testsy  s8    "";?7"[07:ZGOOQQQr   c                     |dz  dz  }|j                  d       |dz  }d}|j                  |d       t        j                  dd	       |j	                  d      |k(  sJ y
)u7   README.md가 이미 존재하면 덮어쓰지 않는다r-   r   T)parentsr   u   # 기존 README 내용r6   r7   r   N)r;   r<   rA   r   rx   )rR   rK   rB   r   r   original_contents         r   test_readme_not_overwrittenz3TestCreateTeamDirectory.test_readme_not_overwritten~  sp    g%3t$K'3*W="";?15EEEEr   c                 T    t         j                  dd      }t        |t              sJ y)u   반환값이 Path 객체이다r   r   N)rA   r   r\   r   rR   rK   rB   r   s       r   test_returns_pathz)TestCreateTeamDirectory.test_returns_path  s$    ++KH&$'''r   c                 J    t         j                  dd      }||dz  dz  k(  sJ y)u9   반환된 Path가 실제 팀 디렉터리를 가리킨다r   r   r-   N)rA   r   r   s       r   test_returns_correct_pathz1TestCreateTeamDirectory.test_returns_correct_path  s,    ++KHG+k9999r   c                     t         j                  dd       t         j                  dd       |dz  dz  j                         sJ y)u?   두 번 호출해도 오류 없이 동작한다 (exist_ok=True)r   r   r-   Nr   r   s      r   test_idempotent_callz,TestCreateTeamDirectory.test_idempotent_call  s>    "";?"";?7"[088:::r   N)rd   re   rf   rg   r   r   r   r   r   r   r   r   r   r   rh   r   r   r   r   W  s:    2;
),P
R

F(
:
;r   r   c                   d    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d Zd Zd Zd Zy)TestAddTeamu   add_team() 함수 테스트c                     t         j                  dddd      }t        j                  |dz  dz  j	                  d	            }|d
   }||d   v sJ |dz  |z  j                         sJ y)uK   새 팀을 추가하면 config에 저장되고 디렉터리가 생성된다r   r   zeusrs   )r    	team_typer#   r"   r0   r1   r6   r7   team_idr-   N)rA   r	   r=   rw   rx   r   )rR   rK   rB   r   rz   r   s         r   test_add_new_teamzTestAddTeam.test_add_new_team  s}    K>PV_hi 

Hx/,>IISZI[\#%.((( 7"W,44666r   c                 X   t         j                         }t        |d   j                               d   }t	        j
                  t              5 }t         j                  dd       t         j                  dd       ddd       j                  j                  dk(  sJ y# 1 sw Y   %xY w)uE   이미 존재하는 team_id로 추가 시 sys.exit(1)이 호출된다r-   r   r   r   r    r   Nr%   )
rA   rP   listkeyspytestraises
SystemExitr	   valuecode)rR   rG   r0   existing_idexc_infos        r   test_duplicate_team_exitsz%TestAddTeam.test_duplicate_team_exits  s     !!#6'?//1215
 ]]:& 	G(MM|~MFMM|~MF	G ~~""a'''	G 	Gs   /B  B)c                     t         j                  ddd       t        j                  t              5 }t         j                  ddd       ddd       j
                  j                  dk(  sJ y# 1 sw Y   %xY w)uI   첫 번째 add 이후 동일 이름으로 다시 추가하면 sys.exit(1)u   AI팀r   rs   r    r   r"   Nr%   )rA   r	   r   r   r   r   r   )rR   rK   r   s      r   test_duplicate_team_id_detectedz+TestAddTeam.test_duplicate_team_id_detected  se    7nYO]]:& 	T(MMw.MS	T~~""a'''	T 	Ts   A//A8c                 V    t         j                  dd      }d|v sJ d|v sJ d|v sJ y)u=   반환된 dict에 team_id, team_info, directory 키가 있다r   r   r   r   	team_info	directoryNrA   r	   rR   rK   r   s      r   test_team_info_structurez$TestAddTeam.test_team_info_structure  s>    NnMF"""f$$$f$$$r   c                     t         j                  ddd      }|d   }|d   dk(  sJ |d   dk(  sJ d|v sJ d	|v sJ d
|v sJ d|v sJ y)uD   team_info에 name, type, status, lead, members, created_at이 있다r   r   r   r    r   r#   r  r    r!   r"   r#   r$   
created_atNr  )rR   rK   r   infos       r   'test_team_info_contains_required_fieldsz3TestAddTeam.test_team_info_contains_required_fields  s{    NnSYZk"F|~---F|~---4~~D   t###r   c                 L    t         j                  dd      }|d   d   dk(  sJ y)u1   status 미지정 시 기본값은 'planned'이다u   기본상태팀r   r   r  r"   rs   Nr  r  s      r   test_default_status_plannedz'TestAddTeam.test_default_status_planned  s-    $5Pk"8,	999r   c                 L    t         j                  dd      }|d   d   g k(  sJ y)u6   members 미지정 시 기본값은 빈 리스트이다u   빈멤버팀r   r   r  r$   Nr  r  s      r   test_members_default_emptyz&TestAddTeam.test_members_default_empty  s,    NnMk"9-333r   c                 N    t         j                  ddd      }|d   d   dk(  sJ y)u.   lead가 team_info에 올바르게 저장된다u	   리더팀r   poseidonr
  r  r#   Nr  r  s      r   test_lead_stored_correctlyz&TestAddTeam.test_lead_stored_correctly  s/    K>PZ[k"6*j888r   c                 V    t         j                  ddddg      }|d   d   ddgk(  sJ y)	u.   전달된 members가 team_info에 저장된다	   멤버팀r   rp   rq   )r    r   r$   r  r$   Nr  r  s      r   test_members_stored_correctlyz)TestAddTeam.test_members_stored_correctly  s:    K>T[]bScdk"9-'51AAAAr   c                 N    t         j                  ddd      }|d   d   dk(  sJ y)u,   status='active'가 올바르게 저장된다u	   활성팀r   r   r  r  r"   Nr  r  s      r   test_active_status_storedz%TestAddTeam.test_active_status_stored  s/    K>RZ[k"8,888r   c                 L    t         j                  dd      }|d   d   dk(  sJ y)u3   team_type이 team_info에 올바르게 저장된다u   횡단조직팀   횡단조직r   r  r!   Nr  r  s      r   test_team_type_storedz!TestAddTeam.test_team_type_stored  s-    $5Pk"6*n<<<r   c                 n    t         j                  dd      }|d   d   }t        j                  |d       y)u.   created_at이 YYYY-MM-DD HH:MM:SS 형식이다u   타임스탬프팀r   r   r  r  r}   N)rA   r	   r   strptime)rR   rK   r   r  s       r   test_created_at_formatz"TestAddTeam.test_created_at_format  s5    $8NSK(6
*&9:r   c                 r    t         j                  dd      }t        |d         }|j                         sJ y)u9   add_team() 후 팀 디렉터리가 실제로 생성된다u	   디렉팀r   r   r  N)rA   r	   r   r   )rR   rK   rB   r   r   s        r   test_directory_createdz"TestAddTeam.test_directory_created   s3    K>J{+,   r   c                     t         j                  dd      }t        j                  |dz  dz  j	                  d            }|d   |d	   v sJ y
)u:   add_team() 후 config 파일에 팀 정보가 저장된다u	   저장팀r   r   r0   r1   r6   r7   r   r-   N)rA   r	   r=   rw   rx   )rR   rK   rB   r   rz   s        r   test_config_saved_to_filez%TestAddTeam.test_config_saved_to_file  sR    K>J

Hx/,>IISZI[\i E'N222r   N)rd   re   rf   rg   r   r   r  r  r  r  r  r  r  r  r  r  r!  r#  rh   r   r   r   r     sL    %
7("(%	$:
4
9
B
9
=
;!3r   r   c                   L    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)TestListTeamsu   list_teams() 함수 테스트c                 l    t         j                          |j                         }d|j                  v sJ y)u,   팀이 있을 때 팀 정보를 출력한다r   NrA   
list_teams
readouterroutrR   rG   capsyscaptureds       r   test_list_teams_with_dataz'TestListTeams.test_list_teams_with_data  s,    $$&hll***r   c                 l    t         j                          |j                         }d|j                  v sJ y)uB   팀이 없을 때 '등록된 팀이 없습니다.'를 출력한다   등록된 팀이 없습니다.Nr'  )rR   rK   r,  r-  s       r   test_list_teams_emptyz#TestListTeams.test_list_teams_empty  s,    $$&/8<<???r   c                 l    t         j                          |j                         }d|j                  v sJ y)u2   팀 이름('개발1팀')이 출력에 포함된다r   Nr'  r+  s       r   test_list_teams_shows_team_namez-TestListTeams.test_list_teams_shows_team_name!  s,    $$&x||+++r   c                 l    t         j                          |j                         }d|j                  v sJ y)u.   팀 리더('hermes')가 출력에 포함된다r   Nr'  r+  s       r   test_list_teams_shows_leadz(TestListTeams.test_list_teams_shows_lead'  ,    $$&8<<'''r   c                 l    t         j                          |j                         }d|j                  v sJ y)u*   팀원 수(4명)가 출력에 포함된다4Nr'  r+  s       r   "test_list_teams_shows_member_countz0TestListTeams.test_list_teams_shows_member_count-  s,    $$&hll"""r   c                 l    t         j                          |j                         }d|j                  v sJ y)u%   총 팀 수가 출력에 포함된다u   총Nr'  r+  s       r   test_list_teams_shows_totalz)TestListTeams.test_list_teams_shows_total3  s,    $$&$$$r   c                 l    t         j                          |j                         }d|j                  v sJ y)u4   팀 유형('수직조직')이 출력에 포함된다r   Nr'  r+  s       r   test_list_teams_shows_typez(TestListTeams.test_list_teams_shows_type9  s,    $$&---r   c                 l    t         j                          |j                         }d|j                  v sJ y)u(   구분선('=')이 출력에 포함된다z
==========Nr'  r+  s       r   test_list_teams_shows_separatorz-TestListTeams.test_list_teams_shows_separator?  r6  r   c                     t         j                  dd       t         j                  dd       t         j                          |j                         }d|j                  v sJ d|j                  v sJ y)u,   여러 팀이 있을 때 모두 출력된다u	   팀알파r   r   u	   팀베타r  N)rA   r	   r(  r)  r*  )rR   rK   rB   r,  r-  s        r   test_list_teams_multiple_teamsz,TestListTeams.test_list_teams_multiple_teamsE  s^    ;.A;.A$$&hll***hll***r   c                 4    t         j                         }|J y)u$   list_teams()는 None을 반환한다N)rA   r(  )rR   rG   r   s      r   test_list_teams_returns_nonez*TestListTeams.test_list_teams_returns_noneO  s    "~~r   N)rd   re   rf   rg   r.  r1  r3  r5  r9  r;  r=  r?  rA  rC  rh   r   r   r%  r%    s8    '+@,(#%.(+r   r%  c                   X    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d Zd Zy)TestCLIMainu   main() CLI 함수 테스트c                     |j                  t        dddg       t        j                          |j	                         }d|j
                  v sJ y)u.   --list 플래그로 팀 목록이 출력된다argvr   --listr   Nr@   sysrA   mainr)  r*  )rR   rG   rC   r,  r-  s        r   test_list_flagzTestCLIMain.test_list_flag]  sB    C-)BC		$$&hll***r   c                 ^    |j                  t        dddg       t        j                          y)uD   --list 플래그 실행 후 반환 (add_team이 호출되지 않음)rG  r   rH  N)r@   rJ  rA   rK  )rR   rG   rC   r,  s       r   test_list_flag_shortz TestCLIMain.test_list_flag_shortd  s"    C-)BC		r   c                     |j                  t        dg d       t        j                          t	        j
                  |dz  dz  j                  d            }t        |d         dk(  sJ y	)
u4   --name과 --type이 제공되면 팀이 추가된다rG  )r   --nameu   CLI테스트팀--typer   r0   r1   r6   r7   r-   r%   N)r@   rJ  rA   rK  r=   rw   rx   len)rR   rK   rB   rC   r,  rz   s         r   test_add_team_via_cliz!TestCLIMain.test_add_team_via_clij  sa    R	
 			

Hx/,>IISZI[\5>"a'''r   c                     |j                  t        dg d       t        j                          |j	                         }d|j
                  v sd|j
                  v sJ yy)u6   팀 추가 성공 시 성공 메시지가 출력된다rG  )r   rP  u   출력테스트팀rQ  r   --leadr   u   완료u   ✅NrI  rR   rK   rC   r,  r-  s        r   test_add_team_cli_outputz$TestCLIMain.test_add_team_cli_outputu  sT    g	
 			$$&8<<'5HLL+@@@+@'r   c                     |j                  t        dg d       t        j                  t              5 }t
        j                          ddd       j                  j                  dk(  sJ y# 1 sw Y   %xY w)u/   --name이 없으면 sys.exit(1)이 호출된다rG  )r   rQ  r   Nr%   	r@   rJ  r   r   r   rA   rK  r   r   rR   rK   rC   r   s       r    test_missing_required_name_exitsz,TestCLIMain.test_missing_required_name_exits  sY    C)RS]]:& 	(IIK	~~""a'''	 	   A,,A5c                     |j                  t        dg d       t        j                  t              5 }t
        j                          ddd       j                  j                  dk(  sJ y# 1 sw Y   %xY w)u/   --type이 없으면 sys.exit(1)이 호출된다rG  )r   rP  u   타입없는팀Nr%   rY  rZ  s       r    test_missing_required_type_exitsz,TestCLIMain.test_missing_required_type_exits  sY    C)UV]]:& 	(IIK	~~""a'''	 	r\  c                     |j                  t        ddg       t        j                  t              5 }t
        j                          ddd       j                  j                  dk(  sJ y# 1 sw Y   %xY w)u6   인수 없이 실행하면 sys.exit(1)이 호출된다rG  r   Nr%   rY  rZ  s       r   test_no_args_exitszTestCLIMain.test_no_args_exits  sZ    C-9]]:& 	(IIK	~~""a'''	 	s   A++A4c                    |j                  t        dg d       t        j                          t	        j
                  |dz  dz  j                  d            }t        |d   j                               d   }|d	   d
k(  sJ |d   dk(  sJ y)u5   --lead, --status 인수가 팀 정보에 반영된다rG  )	r   rP  u   리더상태팀rQ  r   rU  apollo--statusr   r0   r1   r6   r7   r-   r   r#   rb  r"   r   N	r@   rJ  rA   rK  r=   rw   rx   r   valuesrR   rK   rB   rC   rz   r   s         r   test_cli_with_lead_and_statusz)TestCLIMain.test_cli_with_lead_and_status  s    		
 			

Hx/,>IISZI[\E'N))+,Q/F|x'''H~)))r   c                    |j                  t        dg d       t        j                          t	        j
                  |dz  dz  j                  d            }t        |d   j                               d   }d	|d
   v sJ d|d
   v sJ y)u.   --members 인수가 팀 멤버에 반영된다rG  )r   rP  r  rQ  r   z	--membersrp   rq   r0   r1   r6   r7   r-   r   rp   r$   rq   Nrd  rf  s         r   test_cli_with_membersz!TestCLIMain.test_cli_with_members  s    	
 			

Hx/,>IISZI[\E'N))+,Q/$y/)))Y'''r   c                     |j                  t        dg d       t        j                  t              5  t
        j                          ddd       y# 1 sw Y   yxY w)ud   --type에 유효하지 않은 값을 전달하면 sys.exit이 호출된다 (argparse choices 검증)rG  )r   rP  u   잘못된유형팀rQ  u   잘못된유형Nr@   rJ  r   r   r   rA   rK  rR   rK   rC   s      r   test_cli_invalid_type_exitsz'TestCLIMain.test_cli_invalid_type_exits  sD    X	
 ]]:& 	IIK	 	 	   AAc                     |j                  t        dg d       t        j                  t              5  t
        j                          ddd       y# 1 sw Y   yxY w)uf   --status에 유효하지 않은 값을 전달하면 sys.exit이 호출된다 (argparse choices 검증)rG  )r   rP  u   잘못된상태팀rQ  r   rc  invalidNrk  rl  s      r   test_cli_invalid_status_exitsz)TestCLIMain.test_cli_invalid_status_exits  sD    l	
 ]]:& 	IIK	 	 	rn  c                     |j                  t        dddg       t        j                          |j	                         }d|j
                  v sJ y)uL   팀이 없을 때 --list는 '등록된 팀이 없습니다.'를 출력한다rG  r   rH  r0  NrI  rV  s        r   test_cli_list_empty_configz&TestCLIMain.test_cli_list_empty_config  sB    C-)BC		$$&/8<<???r   N)rd   re   rf   rg   rL  rN  rS  rW  r[  r^  r`  rg  ri  rm  rq  rs  rh   r   r   rE  rE  Z  sC    %+	(A(((*&($@r   rE  )rg   importlib.utilr
   r=   osrJ  r   pathlibr   r   environget
_WORKSPACEr   r   rA   r?   fixturerG   rK   rM   rj   r   r   r   r%  rE  rh   r   r   <module>r{     s-  "   	 
    "**..!13HIJ
I%5 ~ $ "<
 	*  $  0&% &%\X( X(@O OnB; B;Ti3 i3b@ @Pv@ v@r   