
    (iq%                        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mZmZ ddlZe
j"                  j%                  d e ee      j*                  j*                               ddlmZ ej0                  d        Zej0                  d        Zej0                  d        Zej0                  d	        Zej0                  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)u_   
TDD RED phase: test_preview_manager.py
PreviewManager 클래스에 대한 테스트 스위트
    N)Path)	MagicMockpatch)PreviewManagerc                      ddddddddS )	N      )insuwikiInfoKeyword
ThreadAuto  z/home/jay/projects100.76.130.39)port_assignments	next_portprojects_dirtailscale_ip r       9/home/jay/workspace/scripts/tests/test_preview_manager.pyconfig_datar      s'     

 ,'	 	r   c                 X    | dz  }|j                  t        j                  |             |S )Nzpreview-ports.json)
write_textjsondumps)tmp_pathr   config_paths      r   config_filer   '   s*    11K4::k23r   c                     | dz  S )Nzpreview-state.jsonr   )r   s    r   
state_filer    .   s    ***r   c                 0    | dz  }|j                          |S )Nprojects)mkdir)r   ds     r   r   r   3   s    :AGGIHr   c                 T    t        t        |       t        |      t        |            S )Nr   
state_pathr   )r   str)r   r    r   s      r   managerr)   :   s&    $z?& r   c                 
   |dz  }|j                          ddddi}|dz  j                  t        j                  |             | j	                  t        |            }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/   package.json에 next가 있으면 nextjs 감지myappdependenciesz^14.0.0^18.0.0)nextreactpackage.jsonnextjs==z%(py0)s == %(py3)sresultpy0py3assert %(py5)spy5Nr#   r   r   r   detect_project_typer(   
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanation	r)   r   project_dirpackage_jsonr5   @py_assert2@py_assert1@py_format4@py_format6s	            r   test_detect_nextjsrL   H   s    W$KY?L >!--djj.FG(([)9:F6X6X66Xr   c                    |dz  }|j                          ddiddid}|dz  j                  t        j                  |             | j	                  t        |            }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-   package.json에 vite가 있으면 vite 감지viteappvitez^5.0.0r/   r-   )devDependenciesr,   r0   r2   r4   r5   r6   r9   r:   Nr;   rE   s	            r   test_detect_viterQ   U   s    Y&K"H- ),L >!--djj.FG(([)9:F6V6V66Vr   c                    |dz  }|j                          |dz  j                  d       | j                  t        |            }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}}|dz  }|j                          |dz  j                  d       | j                  t        |            }	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)u8   requirements.txt 또는 app.py가 있으면 flask 감지	flaskapp1zrequirements.txtzflask==2.3.0
gunicorn==21.0.0
flaskr2   r4   result1r6   r9   r:   N	flaskapp2zapp.pyz.from flask import Flask
app = Flask(__name__)
result2r#   r   r<   r(   r=   r>   r?   r@   rA   rB   rC   rD   )
r)   r   project_dir1rU   rH   rI   rJ   rK   project_dir2rW   s
             r   test_detect_flaskr[   c   s7    k)L&&223UV))#l*;<G7g7g77g k)LH(()[\))#l*;<G7g7g77gr   c                    |dz  }|j                          |dz  j                  d       | j                  t        |            }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$   manage.py가 있으면 django 감지	djangoappz	manage.pyz$#!/usr/bin/env python
import django
djangor2   r4   r5   r6   r9   r:   NrX   r)   r   rF   r5   rH   rI   rJ   rK   s           r   test_detect_djangor`   v   s    [(K;**+ST(([)9:F6X6X66Xr   c                    |dz  }|j                          | j                  t        |            }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 반환emptyappNisz%(py0)s is %(py3)sr5   r6   r9   r:   )r#   r<   r(   r=   r>   r?   r@   rA   rB   rC   rD   r_   s           r   test_detect_unknownrf      s    Z'K(([)9:F6T>6T66Tr   c                    | j                   }d} ||      }d}||k(  }|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}}| j                   }d
} ||      }d}||k(  }|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}}| j                   }d} ||      }d}||k(  }|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}}| 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}}	| 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	)uA   기본 프로젝트는 설정 포트, 신규는 3004부터 할당r   r   r2   )zN%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.get_port
}(%(py4)s)
} == %(py9)sr)   r7   py2py4py6py9assert %(py11)spy11Nr   r	   r   r
   
NewProjectr   r4   new_portr6   r9   r:   AnotherProjecti  	new_port2)	get_portr=   r>   r?   r@   rA   rB   rC   rD   )r)   rI   @py_assert3@py_assert5@py_assert8@py_assert7@py_format10@py_format12rp   rH   rJ   rK   rr   s                r   test_port_allocationrz      s    /J/J'/4/'4////'4//////7///7//////J///'///4///////2M2M*2d2*d2222*d22222272227222222M222*222d22222221L1L)1T1)T1111)T11111171117111111L111)111T1111111 -H8t8t88t   !12I9999r   c                 L   | j                   }d} ||      }d}||u }|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}}t        d
      5 }t               }	d|	j                  _        t        |	      |j                  _        t        d      |j                  _        | 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}}d	d	d	       y	# 1 sw Y   y	xY w)u"   이미 사용 중인 포트 감지iN  Trc   )zZ%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.check_port_available
}(%(py4)s)
} is %(py9)sr)   rh   rm   rn   Nzsocket.socketr   )return_valueFr   re   r5   r6   r9   r:   )check_port_availabler=   r>   r?   r@   rA   rB   rC   rD   r   r   
connect_exr|   	__enter____exit__)r)   rI   rt   ru   rv   rw   rx   ry   mock_socket_class	mock_sockr5   rH   rJ   rK   s                 r   test_port_conflictr      sd    ''66'.6$6.$6666.$66666676667666'666666.666$6666666 
	 #4K	,-	)3<)3T&&02;2O&&/--d3vvvv  s   	DHH#c                    | 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}}| 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   URL 형식 검증: http://<tailscale_ip>:<port>/r   http://100.76.130.39:3001/r2   r4   urlr6   r9   r:   Nr   zhttp://100.76.130.39:3004/url2)	get_preview_urlr=   r>   r?   r@   rA   rB   rC   rD   )r)   r   rH   rI   rJ   rK   r   s          r   test_preview_url_formatr      s    

!
!$
'C..3.....3.......3...3...........""4(D//4/////4///////4///4///////////r   c                    t        t        |       t        |      t        |            }|j                  d   d   }d}||k(  }|slt        j                  d|fd||f      t        j
                  |      t        j
                  |      dz  }dd	|iz  }	t        t        j                  |	            d
x}x}}|j                  d   }d}||k(  }|slt        j                  d|fd||f      t        j
                  |      t        j
                  |      dz  }dd	|iz  }	t        t        j                  |	            d
x}x}}|j                  d   }d}||k(  }|slt        j                  d|fd||f      t        j
                  |      t        j
                  |      dz  }dd	|iz  }	t        t        j                  |	            d
x}x}}y
)u'   설정 파일을 정상적으로 로드r&   r   r   r   r2   z%(py1)s == %(py4)spy1rj   assert %(py6)srk   Nr   r   r   r   )r   r(   configr=   r>   rB   rC   rD   )
r   r    r   r   mgr@py_assert0rt   rH   @py_format5@py_format7s
             r   test_load_configr      s-   
$z?&C
 ::()*5==5====5===5==========::k"*d*"d****"d***"***d*******::n%88%8888%888%8888888888r   c           	         ddddddddd	ii}| j                  |       |j                  } |       }|sd
dt        j                         v st	        j
                  |      rt	        j                  |      ndt	        j                  |      t	        j                  |      dz  }t        t	        j                  |            dx}}t        j                  |j                               }|d   d   d   }d}||k(  }|slt	        j                  d|fd||f      t	        j                  |      t	        j                  |      dz  }dd|iz  }	t        t	        j                  |	            dx}x}}|d   d   d   }d}||k(  }|slt	        j                  d|fd||f      t	        j                  |      t	        j                  |      dz  }dd|iz  }	t        t	        j                  |	            dx}x}}y)u   상태를 JSON 파일에 저장previewsr   r   i90  r1   r   z2026-03-09T10:00:00z/home/jay/projects/insuwikiportpidproject_typer   
started_atrF   zAassert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}r    )r7   ri   rj   Nr   r2   r   r   r   rk   r   )
save_stateexistsr?   r@   r=   rA   rB   rC   rD   r   loads	read_textr>   )
r)   r    staterI   rt   r   loadedr   rH   r   s
             r   test_save_stater      sj    	 (33<	
E u::ZZ
,,./F*j)&19T91T99991T9991999T9999999*j)%09E90E99990E9990999E9999999r   c           	         | j                         }di i}||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}}dd	d
ddddddii}|j                  t        j                  |             | j                         }|d   d	   d   }	d
}
|	|
k(  }|slt        j                  d|fd|	|
f      t        j                  |	      t        j                  |
      dz  }dd|iz  }t        t        j                  |            dx}	x}}
|d   d	   d   }	d}
|	|
k(  }|slt        j                  d|fd|	|
f      t        j                  |	      t        j                  |
      dz  }dd|iz  }t        t        j                  |            dx}	x}}
y)u8   상태 파일 로드: 파일 없으면 빈 상태 반환r   r2   r4   r5   r6   r9   r:   Nr   r	   i rO   zhttp://100.76.130.39:3002/z2026-03-09T11:00:00z/home/jay/projects/InfoKeywordr   r   r   r   r   rk   r   )
load_stater=   r>   r?   r@   rA   rB   rC   rD   r   r   r   )r)   r    r5   rH   rI   rJ   rK   r   r   r   rt   r   r   s                r   test_load_stater      s}    !F "%%6%%%%%6%%%%%%%6%%%6%%%%%%%%%%% 	 &33?	
E $**U+,!F*m,V4<<4<<<<4<<<4<<<<<<<<<<*m,^<FF<FFFF<FFF<FFFFFFFFFFr   ))__doc__builtinsr?   _pytest.assertion.rewrite	assertionrewriter=   r   ossocketsyspathlibr   unittest.mockr   r   pytestpathinsertr(   __file__parentpreview_managerr   fixturer   r   r    r   r)   rL   rQ   r[   r`   rf   rz   r   r   r   r   r   r   r   r   <module>r      s  
   	  
  *  3tH~,,334 5 * 
 
   + +    
&**0	9":,Gr   