
    ,i                         d Z ddlZddlmc m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        2/home/jay/workspace/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                 r   |j                  d      }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j
                  |      rt        j                  |      ndt        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}}y	)
u)   디자인 키워드 → design 팀 추천   배너 디자인 제작design==z%(py0)s == %(py3)sresultpy0py3assert %(py5)spy5N	_suggest_team
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationselfr"   r+   @py_assert2@py_assert1@py_format4@py_format6s          r   #test_design_keywords_suggest_designz3TestSuggestTeam.test_design_keywords_suggest_design@   sl    ++,EF!!v!!!!v!!!!!!v!!!v!!!!!!!!!!r   c                 r   |j                  d      }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j
                  |      rt        j                  |      ndt        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}}y	)
u,   마케팅 키워드 → marketing 팀 추천u   SEO 콘텐츠 전략 수립	marketingr(   r*   r+   r,   r/   r0   Nr1   r;   s          r   )test_marketing_keywords_suggest_marketingz9TestSuggestTeam.test_marketing_keywords_suggest_marketingE   sl    ++,IJ$$v$$$$v$$$$$$v$$$v$$$$$$$$$$r   c                 r   |j                  d      }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j
                  |      rt        j                  |      ndt        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}}y	)
u*   콘텐츠 키워드 → content 팀 추천u%   블로그 작성 및 포스팅 작성contentr(   r*   r+   r,   r/   r0   Nr1   r;   s          r   %test_content_keywords_suggest_contentz5TestSuggestTeam.test_content_keywords_suggest_contentJ   sl    ++,ST""v""""v""""""v"""v""""""""""r   c                 r   |j                  d      }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j
                  |      rt        j                  |      ndt        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}}y	)
u0   퍼블리싱 키워드 → publishing 팀 추천u   블로그 발행 업로드
publishingr(   r*   r+   r,   r/   r0   Nr1   r;   s          r   +test_publishing_keywords_suggest_publishingz;TestSuggestTeam.test_publishing_keywords_suggest_publishingO   sl    ++,HI%%v%%%%v%%%%%%v%%%v%%%%%%%%%%r   c                 p   |j                  d      }d}||u }|st        j                  d|fd||f      dt        j                         v st        j
                  |      rt        j                  |      ndt        j                  |      dz  }dd|iz  }t        t        j                  |            dx}}y)	u&   매칭 키워드 없으면 None 반환   dispatch.py 버그 수정Nisz%(py0)s is %(py3)sr+   r,   r/   r0   r1   r;   s          r   test_no_match_returns_nonez*TestSuggestTeam.test_no_match_returns_noneT   sk    ++,GHv~vvvr   c                 r   |j                  d      }d}||k7  }|st        j                  d|fd||f      dt        j                         v st        j
                  |      rt        j                  |      ndt        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}}y	)
u3   design anti-keyword 포함 시 design 추천 제외u   이미지 렌더러 HTML 수정r'   )!=)z%(py0)s != %(py3)sr+   r,   r/   r0   Nr1   r;   s          r   !test_anti_keywords_exclude_designz1TestSuggestTeam.test_anti_keywords_exclude_designY   sn     ++,MN!!v!!!!v!!!!!!v!!!v!!!!!!!!!!r   c                 r   |j                  d      }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j
                  |      rt        j                  |      ndt        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}}y	)
u>   여러 팀이 매칭될 때 가장 높은 점수의 팀 추천u+   디자인 이미지 시안 비주얼 제작r'   r(   r*   r+   r,   r/   r0   Nr1   r;   s          r   test_highest_score_winsz'TestSuggestTeam.test_highest_score_wins_   sn     ++,YZ!!v!!!!v!!!!!!v!!!v!!!!!!!!!!r   c                 p   |j                  d      }d}||u }|st        j                  d|fd||f      dt        j                         v st        j
                  |      rt        j                  |      ndt        j                  |      dz  }dd|iz  }t        t        j                  |            dx}}y)	u    빈 작업 설명은 None 반환 NrM   rO   r+   r,   r/   r0   r1   r;   s          r   !test_empty_task_desc_returns_nonez1TestSuggestTeam.test_empty_task_desc_returns_nonee   sj    ++B/v~vvvr   N)__name__
__module____qualname____doc__rA   rD   rG   rJ   rP   rS   rU   rX    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                    |j                  dd      }d}||u}|st        j                  d|fd||f      dt        j                         v st        j
                  |      rt        j                  |      ndt        j                  |      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)u6   dev팀에 디자인 작업 → 경고 메시지 반환	dev1-teamr&   N)is not)z%(py0)s is not %(py3)sr+   r,   r/   r0   r'   inz%(py1)s in %(py3)spy1r.   z--override-routing	_validate_team_routingr3   r4   r5   r6   r7   r8   r9   r:   )r<   r"   r+   r=   r>   r?   r@   @py_assert0s           r   .test_dev_team_with_design_task_returns_warningzFTestValidateTeamRouting.test_dev_team_with_design_task_returns_warnings   s#   44[B[\!!vT!!!!vT!!!!!!v!!!v!!!T!!!!!!!!x6!!!!x6!!!x!!!!!!6!!!6!!!!!!!#-#v----#v---#------v---v-------r   c                 r   |j                  dd      }d}||u }|st        j                  d|fd||f      dt        j                         v st        j
                  |      rt        j                  |      ndt        j                  |      dz  }dd	|iz  }t        t        j                  |            dx}}y)
u)   dev팀에 코딩 작업 → 경고 없음ra   rL   NrM   rO   r+   r,   r/   r0   rh   r;   s          r   +test_dev_team_with_coding_task_returns_nonezCTestValidateTeamRouting.test_dev_team_with_coding_task_returns_nonez   sm    44[B]^v~vvvr   c                 r   |j                  dd      }d}||u }|st        j                  d|fd||f      dt        j                         v st        j
                  |      rt        j                  |      ndt        j                  |      dz  }dd	|iz  }t        t        j                  |            dx}}y)
u;   논리적 팀(design)에 디자인 작업 → 경고 없음r'   r&   NrM   rO   r+   r,   r/   r0   rh   r;   s          r   test_logical_team_returns_nonez6TestValidateTeamRouting.test_logical_team_returns_none   sm    44X?XYv~vvvr   c                 v   |j                  ddd      }d}||u }|st        j                  d|fd||f      dt        j                         v st        j
                  |      rt        j                  |      ndt        j                  |      d	z  }d
d|iz  }t        t        j                  |            dx}}y)u'   override_routing=True → 경고 우회ra   r&   T)override_routingNrM   rO   r+   r,   r/   r0   rh   r;   s          r   &test_override_routing_bypasses_warningz>TestValidateTeamRouting.test_override_routing_bypasses_warning   ss    44[B[nr4sv~vvvr   c                 r   |j                  dd      }d}||u }|st        j                  d|fd||f      dt        j                         v st        j
                  |      rt        j                  |      ndt        j                  |      dz  }dd	|iz  }t        t        j                  |            dx}}y)
uJ   marketing 팀에 마케팅 작업 → 자기 자신이므로 경고 없음rC   u   마케팅 전략 수립NrM   rO   r+   r,   r/   r0   rh   r;   s          r   #test_marketing_team_no_self_warningz;TestValidateTeamRouting.test_marketing_team_no_self_warning   sm    44[B[\v~vvvr   N)	rY   rZ   r[   r\   rk   rm   ro   rr   rt   r]   r   r   r_   r_   p   s    D.


r   r_   c                   .    e Zd ZdZd Zd Zd Zd Zd Zy)TestLoadLogicalTeamsu4   _load_logical_teams() 도메인 매핑 로드 검증c                 d   |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dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }t        t        j                  |            d}y)u   반환값이 dict 타입z5assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}
isinstancer+   dict)r-   rg   py2py4N)
_load_logical_teamsrx   ry   r5   r6   r3   r7   r8   r9   r:   )r<   r"   r+   @py_assert3@py_format5s        r   test_returns_dictz&TestLoadLogicalTeams.test_returns_dict   s    113&$''''''''z'''z''''''&'''&''''''$'''$''''''''''r   c                 n   |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)	u   design 팀 존재r'   rc   re   r+   rf   r/   r0   N)	r|   r3   r4   r8   r5   r6   r7   r9   r:   )r<   r"   r+   rj   r=   r?   r@   s          r   test_has_design_teamz)TestLoadLogicalTeams.test_has_design_team   si    113!x6!!!!x6!!!x!!!!!!6!!!6!!!!!!!r   c                    |j                         }d}|d   }||v }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t	        t        j
                  |            dx}x}}|d   d   }t        |      }d	}	||	kD  }
|
st        j                  d
|
fd||	f      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      t        j                  |	      dz  }dd|iz  }t	        t        j
                  |            dx}x}x}
}	y)u   design 팀에 keywords 존재keywordsr'   rc   z%(py1)s in %(py4)srg   r{   assert %(py6)spy6Nr   >z/%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} > %(py7)slenr-   rz   r{   py7assert %(py9)spy9
r|   r3   r4   r8   r9   r:   r   r5   r6   r7   r<   r"   r+   rj   r}   r=   r~   @py_format7r>   @py_assert6@py_assert5@py_format8@py_format10s                r   test_design_has_keywordsz-TestLoadLogicalTeams.test_design_has_keywords   s    113-VH--z-----z----z-----------(#J/4s/041401444401444444s444s444/444044414444444r   c                    |j                         }d}|d   }||v }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t	        t        j
                  |            dx}x}}|d   d   }t        |      }d	}	||	kD  }
|
st        j                  d
|
fd||	f      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      t        j                  |	      dz  }dd|iz  }t	        t        j
                  |            dx}x}x}
}	y)u"   design 팀에 anti_keywords 존재anti_keywordsr'   rc   r   r   r   r   Nr   r   r   r   r   r   r   r   r   s                r   test_design_has_anti_keywordsz2TestLoadLogicalTeams.test_design_has_anti_keywords   s    1132&"22"22222"2222222"22222222(#O49s4599599995999999s999s999499959999999999r   c                 R   |dz  }|j                  d       dddgg ddii}|dz  j                  t        j                  |      d	
       |j                  }d|_        	 |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# ||_        w xY w)u6   ConfigManager 불가 시 파일 직접 읽기 fallbackconfigT)r   logical_teams	test_teamtest)r   r   descriptionzconstants.jsonzutf-8)encodingFrc   re   r+   rf   r/   r0   N)r!   
write_textjsondumps_CONFIG_AVAILABLEr|   r3   r4   r8   r5   r6   r7   r9   r:   )r<   r"   r   
config_dir	test_dataoriginalr+   rj   r=   r?   r@   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    B5D 	D&N)	rY   rZ   r[   r\   r   r   r   r   r   r]   r   r   rv   rv      s    >(
"
5:6r   rv   )r\   builtinsr5   _pytest.assertion.rewrite	assertionrewriter3   r   r	   r   typespathlibr   pytest
ModuleTyper   fixturer"   r$   r_   rv   r]   r   r   <module>r      sx   	   	 
   D U5E5E . 3 3+ +f H06 06r   