
    Si                         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Zdedej                  fdZ	 ej                         d        Z G d d	      Z G d
 d      Z G d d      Zy)uy  
test_dispatch_routing.py

dispatch.py 논리적 팀 라우팅 기능 단위 테스트 (토트 작성)

테스트 항목:
- _load_logical_teams(): config/constants.json에서 logical_teams 도메인 매핑 로드
- _suggest_team(): 키워드 매칭으로 적합한 논리적 팀 추천
- _validate_team_routing(): dev팀에 논리적 팀 소관 작업 위임 시 경고 반환
    N)Pathtmp_pathreturnc                    t        t        j                  j                  dd            }t	        |      t
        j                  vr)t
        j                  j                  dt	        |             ddl}t        t
        j                  j                               D ]  }|dk(  s	t
        j                  |=  ddl}| |_        |S )uF   dispatch 모듈을 tmp_path를 WORKSPACE로 설정하여 로드한다.WORKSPACE_ROOTz/home/jay/workspacer   Ndispatch)r   osenvirongetstrsyspathinsertprompts.team_promptslistmoduleskeysr   	WORKSPACE)r   	workspacepromptsmod_name	_dispatchs        L/home/jay/workspace/.worktrees/task-2117-dev1/tests/test_dispatch_routing.py_load_dispatch_with_workspacer      s    RZZ^^$46KLMI
9~SXX%3y>*))+, &z!H%& !"I    c                 v    | dz  j                  dd       | dz  dz  j                  dd       t        |       S )u:   격리된 WORKSPACE를 사용하는 dispatch 모듈 반환memoryT)parentsexist_oktasks)mkdirr   )r   s    r   dispatch_modr"   0   sD     t<7"))$)F(22r   c                   @    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zy
)TestSuggestTeamu1   _suggest_team() 키워드 매칭 정확도 검증c                 4    |j                  d      }|dk(  sJ y)u)   디자인 키워드 → design 팀 추천   배너 디자인 제작designN_suggest_teamselfr"   results      r   #test_design_keywords_suggest_designz3TestSuggestTeam.test_design_keywords_suggest_design@   s!    ++,EF!!!r   c                 4    |j                  d      }|dk(  sJ y)u,   마케팅 키워드 → marketing 팀 추천u   SEO 콘텐츠 전략 수립	marketingNr(   r*   s      r   )test_marketing_keywords_suggest_marketingz9TestSuggestTeam.test_marketing_keywords_suggest_marketingE   s!    ++,IJ$$$r   c                 4    |j                  d      }|dk(  sJ y)u*   콘텐츠 키워드 → content 팀 추천u%   블로그 작성 및 포스팅 작성contentNr(   r*   s      r   %test_content_keywords_suggest_contentz5TestSuggestTeam.test_content_keywords_suggest_contentJ   s!    ++,ST"""r   c                 4    |j                  d      }|dk(  sJ y)u0   퍼블리싱 키워드 → publishing 팀 추천u   블로그 발행 업로드
publishingNr(   r*   s      r   +test_publishing_keywords_suggest_publishingz;TestSuggestTeam.test_publishing_keywords_suggest_publishingO   s!    ++,HI%%%r   c                 .    |j                  d      }|J y)u&   매칭 키워드 없으면 None 반환   dispatch.py 버그 수정Nr(   r*   s      r   test_no_match_returns_nonez*TestSuggestTeam.test_no_match_returns_noneT   s    ++,GH~~r   c                 4    |j                  d      }|dk7  sJ y)u3   design anti-keyword 포함 시 design 추천 제외u   이미지 렌더러 HTML 수정r'   Nr(   r*   s      r   !test_anti_keywords_exclude_designz1TestSuggestTeam.test_anti_keywords_exclude_designY   s#     ++,MN!!!r   c                 4    |j                  d      }|dk(  sJ y)u>   여러 팀이 매칭될 때 가장 높은 점수의 팀 추천u+   디자인 이미지 시안 비주얼 제작r'   Nr(   r*   s      r   test_highest_score_winsz'TestSuggestTeam.test_highest_score_wins_   s#     ++,YZ!!!r   c                 .    |j                  d      }|J y)u    빈 작업 설명은 None 반환 Nr(   r*   s      r   !test_empty_task_desc_returns_nonez1TestSuggestTeam.test_empty_task_desc_returns_nonee   s    ++B/~~r   N)__name__
__module____qualname____doc__r-   r0   r3   r6   r9   r;   r=   r@    r   r   r$   r$   =   s-    ;"
%
#
&

""r   r$   c                   .    e Zd ZdZd Zd Zd Zd Zd Zy)TestValidateTeamRoutingu:   _validate_team_routing() 라우팅 검증 정확도 검증c                 H    |j                  dd      }|J d|v sJ d|v sJ y)u6   dev팀에 디자인 작업 → 경고 메시지 반환	dev1-teamr&   Nr'   z--override-routing_validate_team_routingr*   s      r   .test_dev_team_with_design_task_returns_warningzFTestValidateTeamRouting.test_dev_team_with_design_task_returns_warnings   s=    44[B[\!!!6!!!#v---r   c                 0    |j                  dd      }|J y)u)   dev팀에 코딩 작업 → 경고 없음rI   r8   NrJ   r*   s      r   +test_dev_team_with_coding_task_returns_nonezCTestValidateTeamRouting.test_dev_team_with_coding_task_returns_nonez   s    44[B]^~~r   c                 0    |j                  dd      }|J y)u;   논리적 팀(design)에 디자인 작업 → 경고 없음r'   r&   NrJ   r*   s      r   test_logical_team_returns_nonez6TestValidateTeamRouting.test_logical_team_returns_none   s    44X?XY~~r   c                 4    |j                  ddd      }|J y)u'   override_routing=True → 경고 우회rI   r&   T)override_routingNrJ   r*   s      r   &test_override_routing_bypasses_warningz>TestValidateTeamRouting.test_override_routing_bypasses_warning   s%    44[B[nr4s~~r   c                 0    |j                  dd      }|J y)uJ   marketing 팀에 마케팅 작업 → 자기 자신이므로 경고 없음r/   u   마케팅 전략 수립NrJ   r*   s      r   #test_marketing_team_no_self_warningz;TestValidateTeamRouting.test_marketing_team_no_self_warning   s    44[B[\~~r   N)	rA   rB   rC   rD   rL   rN   rP   rS   rU   rE   r   r   rG   rG   p   s    D.


r   rG   c                   .    e Zd ZdZd Zd Zd Zd Zd Zy)TestLoadLogicalTeamsu4   _load_logical_teams() 도메인 매핑 로드 검증c                 H    |j                         }t        |t              sJ y)u   반환값이 dict 타입N)_load_logical_teams
isinstancedictr*   s      r   test_returns_dictz&TestLoadLogicalTeams.test_returns_dict   s     113&$'''r   c                 0    |j                         }d|v sJ y)u   design 팀 존재r'   N)rY   r*   s      r   test_has_design_teamz)TestLoadLogicalTeams.test_has_design_team   s    1136!!!r   c                 b    |j                         }d|d   v sJ t        |d   d         dkD  sJ y)u   design 팀에 keywords 존재keywordsr'   r   NrY   lenr*   s      r   test_design_has_keywordsz-TestLoadLogicalTeams.test_design_has_keywords   s@    113VH----6(#J/01444r   c                 b    |j                         }d|d   v sJ t        |d   d         dkD  sJ y)u"   design 팀에 anti_keywords 존재anti_keywordsr'   r   Nra   r*   s      r   test_design_has_anti_keywordsz2TestLoadLogicalTeams.test_design_has_anti_keywords   s@    113&"22226(#O45999r   c                    |dz  }|j                  d       dddgg ddii}|dz  j                  t        j                  |      d	
       |j                  }d|_        	 |j                         }d|v sJ 	 ||_        y# ||_        w xY w)u6   ConfigManager 불가 시 파일 직접 읽기 fallbackconfigT)r   logical_teams	test_teamtest)r`   re   descriptionzconstants.jsonzutf-8)encodingFN)r!   
write_textjsondumps_CONFIG_AVAILABLErY   )r+   r"   r   
config_dir	test_dataoriginalr,   s          r   %test_fallback_when_config_unavailablez:TestLoadLogicalTeams.test_fallback_when_config_unavailable   s     (
$'!'%'#)
	 
&	&224::i3HSZ2[  11).&	6!557F&(((-5L*XL*s    A? ?	BN)	rA   rB   rC   rD   r\   r^   rc   rf   ru   rE   r   r   rW   rW      s    >(
"
5:6r   rW   )rD   ro   r	   r   typespathlibr   pytest
ModuleTyper   fixturer"   r$   rG   rW   rE   r   r   <module>r{      st   	  	 
   D U5E5E . 3 3+ +f H06 06r   