
    Riq%                        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m	Z	 ddl
Z
ej                  j                  d e ee      j                  j                               ddlmZ e
j$                  d        Ze
j$                  d        Ze
j$                  d        Ze
j$                  d	        Ze
j$                  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       S/home/jay/workspace/.worktrees/task-2117-dev1/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(  sJ y)	u/   package.json에 next가 있으면 nextjs 감지myappdependenciesz^14.0.0^18.0.0)nextreactpackage.jsonnextjsNr#   r   r   r   detect_project_typer(   r)   r   project_dirpackage_jsonresults        r   test_detect_nextjsr8   H   sj    W$KY?L >!--djj.FG(([)9:FXr   c                     |dz  }|j                          ddiddid}|dz  j                  t        j                  |             | j	                  t        |            }|dk(  sJ y)	u-   package.json에 vite가 있으면 vite 감지viteappvitez^5.0.0r/   r-   )devDependenciesr,   r0   Nr2   r4   s        r   test_detect_viter=   U   sp    Y&K"H- ),L >!--djj.FG(([)9:FVr   c                 ,   |dz  }|j                          |dz  j                  d       | j                  t        |            }|dk(  sJ |dz  }|j                          |dz  j                  d       | j                  t        |            }|dk(  sJ y)	u8   requirements.txt 또는 app.py가 있으면 flask 감지	flaskapp1zrequirements.txtzflask==2.3.0
gunicorn==21.0.0
flask	flaskapp2zapp.pyz.from flask import Flask
app = Flask(__name__)
Nr#   r   r3   r(   )r)   r   project_dir1result1project_dir2result2s         r   test_detect_flaskrG   c   s     k)L&&223UV))#l*;<Gg k)LH(()[\))#l*;<Ggr   c                     |dz  }|j                          |dz  j                  d       | j                  t        |            }|dk(  sJ y)u$   manage.py가 있으면 django 감지	djangoappz	manage.pyz$#!/usr/bin/env python
import django
djangoNrB   r)   r   r5   r7   s       r   test_detect_djangorL   v   sO    [(K;**+ST(([)9:FXr   c                 j    |dz  }|j                          | j                  t        |            }|J y)u&   아무 파일도 없으면 None 반환emptyappN)r#   r3   r(   rK   s       r   test_detect_unknownrO      s7    Z'K(([)9:F>>r   c                     | j                  d      dk(  sJ | j                  d      dk(  sJ | j                  d      dk(  sJ | j                  d      }|dk(  sJ | j                  d	      }|d
k(  sJ y)uA   기본 프로젝트는 설정 포트, 신규는 3004부터 할당r   r   r   r	   r   r
   
NewProjectr   AnotherProjecti  N)get_port)r)   new_port	new_port2s      r   test_port_allocationrV      s     J'4///M*d222L)T111 -Ht   !12Ir   c                 @   | j                  d      du sJ t        d      5 }t               }d|j                  _        t        |      |j                  _        t        d      |j                  _        | j                  d      }|du sJ 	 ddd       y# 1 sw Y   yxY w)	u"   이미 사용 중인 포트 감지iN  Tzsocket.socketr   )return_valueFr   N)check_port_availabler   r   
connect_exrX   	__enter____exit__)r)   mock_socket_class	mock_sockr7   s       r   test_port_conflictr_      s     ''.$666 
	 #4K	,-	)3<)3T&&02;2O&&/--d3  s   A)BBc                 d    | j                  d      }|dk(  sJ | j                  d      }|dk(  sJ y)u0   URL 형식 검증: http://<tailscale_ip>:<port>/r   http://100.76.130.39:3001/r   zhttp://100.76.130.39:3004/N)get_preview_url)r)   urlurl2s      r   test_preview_url_formatre      s@    

!
!$
'C....""4(D////r   c                     t        t        |       t        |      t        |            }|j                  d   d   dk(  sJ |j                  d   dk(  sJ |j                  d   dk(  sJ y	)
u'   설정 파일을 정상적으로 로드r&   r   r   r   r   r   r   r   N)r   r(   config)r   r    r   r   mgrs        r   test_load_configri      sp    
$z?&C
 ::()*5===::k"d***::n%888r   c           	          ddddddddd	ii}| j                  |       |j                         sJ t        j                  |j	                               }|d   d   d
   dk(  sJ |d   d   d   dk(  sJ y)u   상태를 JSON 파일에 저장previewsr   r   i90  r1   ra   z2026-03-09T10:00:00z/home/jay/projects/insuwikiportpidproject_typerc   
started_atr5   rm   rn   N)
save_stateexistsr   loads	read_text)r)   r    stateloadeds       r   test_save_staterw      s     	 (33<	
E uZZ
,,./F*j)&1T999*j)%0E999r   c           	          | j                         }|di ik(  sJ ddddddddd	ii}|j                  t        j                  |             | j                         }|d   d   d
   dk(  sJ |d   d   d   dk(  sJ y)u8   상태 파일 로드: 파일 없으면 빈 상태 반환rk   r   r	   i r;   zhttp://100.76.130.39:3002/z2026-03-09T11:00:00z/home/jay/projects/InfoKeywordrl   rm   ro   N)
load_stater   r   r   )r)   r    r7   ru   rv   s        r   test_load_staterz      s     !Fj"%%%% 	 &33?	
E $**U+,!F*m,V4<<<*m,^<FFFr   )#__doc__r   ossocketsyspathlibr   unittest.mockr   r   pytestpathinsertr(   __file__parentpreview_managerr   fixturer   r   r    r   r)   r8   r=   rG   rL   rO   rV   r_   re   ri   rw   rz   r   r   r   <module>r      s   
  	  
  *  3tH~,,334 5 * 
 
   + +    
&**0	9":,Gr   