
    Hi+                          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
mZ ddlZ eej                  j                  dd            Z G d d      Z G d d	      Z G d
 d      Zy)u   대시보드 Todo 탭 전환 기능 테스트 (task-871.1)

Playwright를 사용하여 데스크탑 + 모바일 뷰포트에서 탭 전환 기능을 검증합니다.
    N)PathWORKSPACE_ROOTz/home/jay/workspacec                       e Zd ZdZ ej
                  d      d        Zej                  j                  dd       Z	ej                  j                  dd       Z
ddZdd	Zdd
ZddZy)TestTodoTabSwitchingu!   Todo 탭 전환 기능 테스트.T)autousec                     t        j                  g ddd      }|j                  dk7  rt        j                  d       yy)u   서버 실행 확인.)curl-sz-oz	/dev/nullz-wz%{http_code} http://localhost:8000/dashboard/Tcapture_outputtext200z)Dashboard server not running on port 8000N)
subprocessrunstdoutpytestskip)selfresults     5/home/jay/workspace/tests/test_dashboard_todo_tabs.pysetup_serverz!TestTodoTabSwitching.setup_server   s;     g

 ==E!KKCD "    Nc                    K   ddl m}  |       4 d{   }|j                  j                          d{   }|j	                  ddd       d{   }|j                  dd	
       d{    t        j                  d       d{    |j                  d       d{    t        j                  d       d{    |j                  d      }|j                          d{    t        j                  d       d{    |j                  ddd      }|j                          d{    t        j                  d       d{    |j                  d      }|j                          d{    t        j                  d       d{    |j                          d{    ddd      d{    y7 7 7 w7 _7 E7 /7 7 7 7 7 7 g7 L7 67 (# 1 d{  7  sw Y   yxY ww)u2   데스크탑 뷰포트에서 탭 전환 테스트.r   async_playwrightN      widthheightviewportr   load
wait_until      button:has-text("프로젝트")      button:has-text("완료")button   전체Tnameexactu   button:has-text("진행중")playwright.async_apir   chromiumlaunchnew_pagegotoasynciosleepclicklocatorget_by_roleclose)r   r   pbrowserpagedone_button
all_buttonactive_buttons           r   test_desktop_tab_switchingz/TestTodoTabSwitching.test_desktop_tab_switching   s     	:#% 	" 	"JJ--//G ))TS3Q)RRD))>6)RRR--""" **>???--""" ,,'BCK##%%%--""" ))()NJ""$$$--""" !LL)GHM%%'''--"""--/!!5	" 	" 	"/RR" @" &" %" ("!5	" 	" 	" 	"s,  G>GG>G)GG)G
G).G/G)GG)$G%G)G(G)*G+G)G+G)3G4G)G(G)9G!:G)G#G).G%/G)3G>>G'?G>G)
G)G)G)G)G)G)G)G)G)!G)#G)%G)'G>)G;/G20G;7G>c                 f  K   ddl m}  |       4 d{   }|j                  j                          d{   }|j	                  ddd       d{   }|j                  dd	
       d{    t        j                  d       d{    |j                  d       d{    t        j                  d       d{    |j                  d      }|j                          d{    t        j                  d       d{    |j                  ddd      }|j                          d{    t        j                  d       d{    |j                          d{    ddd      d{    y7 j7 K7 17 7 7 7 7 7 7 `7 E7 /7 !# 1 d{  7  sw Y   yxY ww)u/   모바일 뷰포트에서 탭 전환 테스트.r   r   Niw  i,  r   r"   r   r$   r%   r'   r(   r)   r*   r+   r,   Tr-   r0   )r   r   r<   r=   r>   r?   r@   s          r   test_mobile_tab_switchingz.TestTodoTabSwitching.test_mobile_tab_switching?   sv     	:#% 	" 	"JJ--//G ))SC3P)QQD))>6)RRR--""" **>???--""" ,,'BCK##%%%--""" ))()NJ""$$$--"""--/!!+	" 	" 	"/QR" @" &" %"!+	" 	" 	" 	"s  F1E>F1FFFFF.F/FF
F$F%FF(F*F+FF+F3F4FFF(F)F-F18F9F1FFF
FFFFFFFFF1F."F%#F.*F1c                    t        j                  g ddd      }ddl}|j                  |j                        }|j                  dg       }t        |      }d}||kD  }|st        j                  d|fd||f      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t        j                  |      t        j                  |      d
z  }t        j                  d      dz   d|iz  }	t        t        j                  |	            dx}x}}y)u2   API가 전체 이슈를 반환하는지 테스트.r	   r
   z)http://localhost:8000/api/todo?status=allTr   r   Nissues>z/%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} > %(py6)slenpy0py1py3py6u#   전체 이슈가 0건이면 안 됨
>assert %(py8)spy8r   r   jsonloadsr   getrK   
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_saferepr_format_assertmsgAssertionError_format_explanation)
r   r   rT   datarG   @py_assert2@py_assert5@py_assert4@py_format7@py_format9s
             r   test_api_status_allz(TestTodoTabSwitching.test_api_status_all[   s    G

 	zz&--((B'6{EQE{QEEE{QEEEEEEsEEEsEEEEEE6EEE6EEE{EEEQEEE EEEEEEEEr   c           	         t        j                  g ddd      }ddl}|j                  |j                        }|j                  dg       }t        |      }d}||k\  }|st        j                  d|fd||f      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t        j                  |      t        j                  |      d
z  }t        j                  d      dz   d|iz  }	t        t        j                  |	            dx}x}}|D ]   }
|
j
                  }d} ||      }d}||v }|st        j                  d|fd||f      dt        j                         v st        j                  |
      rt        j                  |
      ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}x}x}} y)u2   API가 완료 이슈만 반환하는지 테스트.r	   r
   z*http://localhost:8000/api/todo?status=doneTr   r   NrG   )>=)z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} >= %(py6)srK   rL   u!   완료 이슈 목록이어야 함rQ   rR   statusdone	completedin)zI%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.get
}(%(py4)s)
} in %(py9)sissuerM   py2py4rP   py9assert %(py11)spy11rS   r   r   rT   r`   rG   ra   rb   rc   rd   re   rp   @py_assert1@py_assert3@py_assert8@py_assert7@py_format10@py_format12s                    r   test_api_status_donez)TestTodoTabSwitching.test_api_status_doneh   s   H

 	zz&--((B'6{DaD{aDDD{aDDDDDDsDDDsDDDDDD6DDD6DDD{DDDaDDD!DDDDDDDD 	@E99?X?9X&?*??&*?????&*???????5???5???9???X???&???*?????????	@r   c           	         t        j                  g ddd      }ddl}|j                  |j                        }|j                  dg       }t        |      }d}||kD  }|st        j                  d|fd||f      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t        j                  |      t        j                  |      d
z  }t        j                  d      dz   d|iz  }	t        t        j                  |	            dx}x}}|D ]   }
|
j
                  }d} ||      }d}||v}|st        j                  d|fd||f      dt        j                         v st        j                  |
      rt        j                  |
      ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}x}x}} y)uB   API가 기본적으로 active 이슈만 반환하는지 테스트.r	   r
   zhttp://localhost:8000/api/todoTr   r   NrG   rH   rJ   rK   rL   u#   활성 이슈가 0건이면 안 됨rQ   rR   rj   rk   )not in)zM%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.get
}(%(py4)s)
} not in %(py9)srp   rq   ru   rv   rS   rw   s                    r   test_api_status_defaultz,TestTodoTabSwitching.test_api_status_defaultw   s   <

 	zz&--((B'6{EQE{QEEE{QEEEEEEsEEEsEEEEEE6EEE6EEE{EEEQEEE EEEEEEEE 	DE99CXC9X&C.CC&.CCCCC&.CCCCCCC5CCC5CCC9CCCXCCC&CCC.CCCCCCCCC	Dr   c           	      P   ddl }t        j                  g ddd      }t        |j	                  |j
                        j                  dg             }t        j                  g ddd      }t        |j	                  |j
                        j                  dg             }t        j                  g ddd      }t        |j	                  |j
                        j                  dg             }||z   }||k(  }	|	s't        j                  d	|	fd
||f      dt        j                         v st        j                  |      rt        j                  |      nddt        j                         v st        j                  |      rt        j                  |      nddt        j                         v st        j                  |      rt        j                  |      nddz  }
t        j                  d| d| d| d      dz   d|
iz  }t        t        j                  |            dx}	}y)uI   전체 이슈 = 활성 이슈 + 완료 이슈 수학적 일관성 검증.r   NrF   Tr   rG   rh   r   )==)z%(py0)s == (%(py2)s + %(py3)s)	all_countactive_count
done_count)rM   rr   rO   u   전체(u   ) != 활성(u   ) + 완료()z
>assert %(py6)srP   )rT   r   r   rK   rU   r   rV   rW   rX   rY   rZ   r[   r\   r]   r^   r_   )r   rT   r_allr   r_doner   r_activer   rc   rx   @py_format5rd   s               r   !test_api_status_counts_consistentz6TestTodoTabSwitching.test_api_status_counts_consistent   ss    GX\cg
 

5<<044XrBC	HY]dh
 FMM266xDE
>>"Rcgnrs4::hoo6::8RHI(:5~y55~~~y5~~~~~~y~~~y~~~~~~L~~~L~~~~~~:~~~:~~~~<XdWeepq{p||}7~~~~~~~r   returnN)__name__
__module____qualname____doc__r   fixturer   markr6   rB   rD   rf   r~   r   r    r   r   r   r      sy    +V^^D!E "E [[" "@ [[" "6F@Dr   r   c                       e Zd ZdZej
                  j                  dd       Zej
                  j                  dd       Zy)TestButtonStylesu   버튼 스타일 테스트.Nc                   K   ddl m}  |       4 d{   }|j                  j                          d{   }|j	                  ddd       d{   }|j                  dd	
       d{    t        j                  d       d{    |j                  d       d{    t        j                  d       d{    |j                  d      }|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  }	t        j"                  d      dz   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  }	t        j"                  d|       dz   d|	iz  }
t%        t        j&                  |
            dx}}|j)                          d{    ddd      d{    y7 ~7 _7 E7 -7 7 7 7 7 -7 # 1 d{  7  sw Y   yxY ww)u:   버튼에 cursor-pointer 클래스가 있는지 테스트.r   r   Nr   r   r   r"   r   r$   r%   r'   r(   r)   r*   classis notz%(py0)s is not %(py3)s
class_namerM   rO   Button has no class attribute
>assert %(py5)spy5zcursor-pointerrn   z%(py1)s in %(py3)srN   rO   z'Expected cursor-pointer in class, got: r1   r   r2   r3   r4   r5   r6   r7   r8   r9   get_attributerW   rX   rY   rZ   r[   r\   r]   r^   r_   r;   r   r   r<   r=   r>   r?   r   ra   rx   @py_format4@py_format6@py_assert0s               r   test_button_cursor_pointerz+TestButtonStyles.test_button_cursor_pointer   s     	:#% 	" 	"JJ--//G ))TS3Q)RRD))>6)RRR--""" **>???--""" ,,'BCK*88AAJ%)J:T)JJJ:TJJJJJJ:JJJ:JJJTJJJ+JJJJJJJ#i#z1iii#ziii#iiiiiiziiiziiii5\]g\h3iiiiiii--/!!#	" 	" 	"/RR" @" B "#	" 	" 	" 	"   KJKJ.JJ.JJ..J/J.JJ.$J!%J.J$)J.+J',FJ.<J*=J.KJ,KJ.J.J.J.!J.$J.'J.*J.,K.K 4J75K <Kc                   K   ddl m}  |       4 d{   }|j                  j                          d{   }|j	                  ddd       d{   }|j                  dd	
       d{    t        j                  d       d{    |j                  d       d{    t        j                  d       d{    |j                  d      }|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  }	t        j"                  d      dz   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  }	t        j"                  d|       dz   d|	iz  }
t%        t        j&                  |
            dx}}|j)                          d{    ddd      d{    y7 ~7 _7 E7 -7 7 7 7 7 -7 # 1 d{  7  sw Y   yxY ww)u/   버튼에 최소 높이가 있는지 테스트.r   r   Nr   r   r   r"   r   r$   r%   r'   r(   r)   r*   r   r   r   r   r   r   r   r   zmin-hrn   r   r   zExpected min-h in class, got: r   r   s               r   test_button_min_heightz'TestButtonStyles.test_button_min_height   s     	:#% 	" 	"JJ--//G ))TS3Q)RRD))>6)RRR--""" **>???--""" ,,'BCK*88AAJ%)J:T)JJJ:TJJJJJJ:JJJ:JJJTJJJ+JJJJJJJW7j(WWW7jWWW7WWWWWWjWWWjWWWW,J:,*WWWWWWW--/!!#	" 	" 	"/RR" @" B "#	" 	" 	" 	"r   r   )	r   r   r   r   r   r   r6   r   r   r   r   r   r   r      s?    %[[" ". [[" "r   r   c                       e Zd ZdZddZy)TestServiceWorkerCacheu    Service Worker 캐시 테스트.Nc                    t        t        dz  dz  d      5 }|j                         }ddd       ddl}|j                  }d} ||      }|st        j                  d      d	z   d
t        j                         v st        j                  |      rt        j                  |      nd
t        j                  |      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }t        t        j                  |            dx}x}}y# 1 sw Y   &xY w)uA   Service Worker 캐시 버전이 올바른 형식인지 테스트.	dashboardzsw.jszutf-8)encodingNr   zdashboard-v\d+u.   CACHE_NAME이 dashboard-vN 패턴이어야 함zS
>assert %(py7)s
{%(py7)s = %(py2)s
{%(py2)s = %(py0)s.search
}(%(py4)s, %(py5)s)
}recontent)rM   rr   rs   r   py7)open
_WORKSPACEreadr   searchrW   r]   rY   rZ   r[   r\   r^   r_   )r   fr   r   rx   ry   @py_assert6@py_format8s           r   test_cache_version_updatedz1TestServiceWorkerCache.test_cache_version_updated   s    *{*W4wG 	1ffhG	 	yyf*fy*G4f4ff6fffffffrfffrfffyfff*ffffffGfffGfff4ffffff	 	s   EEr   )r   r   r   r   r   r   r   r   r   r      s    *gr   r   )r   builtinsrY   _pytest.assertion.rewrite	assertionrewriterW   r6   osr   pathlibr   r   environrV   r   r   r   r   r   r   r   <module>r      s`   
   	   "**..!13HIJ
G GT1" 1"h
g 
gr   