
    Ri.                        d Z ddlZddlmZ ddlZej
                  j                  d e ee      j                  j                               ddl
mZ  G d d      Z G d d      Z G d	 d
      Z G d d      Z G d d      Z G d d      Z G d d      Z G d d      Z G d d      Z G d d      Z G d d      Zy)z-Tests for curl_to_fetcher.py - TDD RED phase.    N)Path
parse_curlc                   ,    e Zd ZddZddZddZddZy)TestBasicGetUrlNc                 B    t        d      }|d   dk(  sJ |d   dk(  sJ y )Nzcurl 'https://example.com'urlhttps://example.commethodGETr   selfresults     S/home/jay/workspace/.worktrees/task-2117-dev1/scripts/tests/test_curl_to_fetcher.pytest_simple_urlzTestBasicGetUrl.test_simple_url   s3    89e} 5555h5(((    c                 .    t        d      }|d   dk(  sJ y )Nz1curl -H 'Accept: text/html' 'https://example.com'r	   r
   r   r   s     r   test_url_as_last_argz$TestBasicGetUrl.test_url_as_last_arg   s     OPe} 5555r   c                 .    t        d      }|d   dk(  sJ y )Nz!curl https://example.com/path?q=1r	   zhttps://example.com/path?q=1r   r   s     r   test_url_without_quotesz'TestBasicGetUrl.test_url_without_quotes   s     ?@e} >>>>r   c                     t        d      }|d   dk(  sJ |d   dk(  sJ |d   i k(  sJ |d   i k(  sJ |j                  d      J |j                  d
      J y	)u$   URL만 있는 최소 curl 명령어.zcurl https://example.comr	   r
   r   r   headerscookiesdataNproxy)r   getr   s     r   test_minimal_curlz!TestBasicGetUrl.test_minimal_curl   s    67e} 5555h5(((i B&&&i B&&&zz&!)))zz'"***r   returnN)__name__
__module____qualname__r   r   r   r    r   r   r   r      s    )
6?+r   r   c                   4    e Zd ZddZddZddZddZddZy)TestPostRequestNc                 B    t        d      }|d   dk(  sJ |d   dk(  sJ y )Nz/curl -X POST -d 'key=value' https://example.comr   POSTr   	key=valuer   r   s     r   test_post_with_data_flagz(TestPostRequest.test_post_with_data_flag.   s2    MNh6)))f~,,,r   c                 B    t        d      }|d   dk(  sJ |d   dk(  sJ y)u0   --data가 있으면 -X 없어도 POST로 추론.z+curl --data 'key=value' https://example.comr   r'   r   r(   Nr   r   s     r   test_post_inferred_from_dataz,TestPostRequest.test_post_inferred_from_data3   s2    IJh6)))f~,,,r   c                 B    t        d      }|d   dk(  sJ |d   dk(  sJ y )Nz.curl --data-raw 'raw body' https://example.comr   zraw bodyr   r'   r   r   s     r   test_data_rawzTestPostRequest.test_data_raw9   s2    LMf~+++h6)))r   c                 B    t        d      }|d   dk(  sJ |d   dk(  sJ y )Nz4curl --data-binary 'binary body' https://example.comr   zbinary bodyr   r'   r   r   s     r   test_data_binaryz TestPostRequest.test_data_binary>   s2    RSf~...h6)))r   c                 h    d}t        d| d      }|d   dk(  sJ |d   |k(  sJ |d   d   d	k(  sJ y
)u   data가 JSON인 경우.z{"name": "test", "value": 42}z5curl -X POST -H 'Content-Type: application/json' -d 'z' https://api.example.comr   r'   r   r   Content-Typeapplication/jsonNr   )r   	json_bodyr   s      r   test_post_with_json_dataz(TestPostRequest.test_post_with_json_dataC   s^    3	G	{Rkl
 h6)))f~***i 04FFFFr   r   )r    r!   r"   r)   r+   r-   r/   r4   r#   r   r   r%   r%   -   s    -
-*
*
Gr   r%   c                   ,    e Zd ZddZddZddZddZy)TestHeaderParsingNc                 4    t        d      }|d   d   dk(  sJ y )Nz/curl -H 'Accept: text/html' https://example.comr   Accept	text/htmlr   r   s     r   test_single_headerz$TestHeaderParsing.test_single_headerR   s%    MNi *k999r   c                 N    t        d      }|d   d   dk(  sJ |d   d   dk(  sJ y )NzHcurl -H 'Accept: text/html' -H 'Accept-Language: ko' https://example.comr   r8   r9   Accept-Languagekor   r   s     r   test_multiple_headersz'TestHeaderParsing.test_multiple_headersV   s>    iji *k999i !23t;;;r   c                 4    t        d      }|d   d   dk(  sJ y )Nz6curl -H "Accept: application/json" https://example.comr   r8   r2   r   r   s     r   test_header_with_double_quotesz0TestHeaderParsing.test_header_with_double_quotes[   s&    TUi *.@@@@r   c                 4    t        d      }|d   d   dk(  sJ y )Nz;curl --header 'User-Agent: Mozilla/5.0' https://example.comr   z
User-AgentMozilla/5.0r   r   s     r   test_long_header_optionz)TestHeaderParsing.test_long_header_option_   s%    YZi .-???r   r   )r    r!   r"   r:   r>   r@   rC   r#   r   r   r6   r6   Q   s    :<
A@r   r6   c                       e Zd ZddZddZy)TestCookieFromHeaderNc                 `    t        d      }d|d   vsJ |d   d   dk(  sJ |d   d   dk(  sJ y )	Nz>curl -H 'Cookie: session=abc123; user=xyz' https://example.comCookier   r   sessionabc123userxyzr   r   s     r   'test_cookie_header_extracted_to_cookiesz<TestCookieFromHeader.test_cookie_header_extracted_to_cookiesh   sP    \]vi0000i +x777i (E111r   c                 `    t        d      }d|d   vsJ |d   d   dk(  sJ |d   d   dk(  sJ y )	NzIcurl -H 'Accept: text/html' -H 'Cookie: token=secret' https://example.comrG   r   r   tokensecretr8   r9   r   r   s     r   +test_cookie_header_does_not_pollute_headersz@TestCookieFromHeader.test_cookie_header_does_not_pollute_headersn   sP    jkvi0000i )X555i *k999r   r   )r    r!   r"   rL   rP   r#   r   r   rE   rE   g   s    2:r   rE   c                   ,    e Zd ZddZddZddZddZy)TestBCookieFlagNc                 4    t        d      }|d   d   dk(  sJ y )Nz,curl -b 'session=abc123' https://example.comr   rH   rI   r   r   s     r   test_b_flag_single_cookiez)TestBCookieFlag.test_b_flag_single_cookiey   s%    JKi +x777r   c                 N    t        d      }|d   d   dk(  sJ |d   d   dk(  sJ y )Nz6curl -b 'session=abc123; user=xyz' https://example.comr   rH   rI   rJ   rK   r   r   s     r   test_b_flag_multiple_cookiesz,TestBCookieFlag.test_b_flag_multiple_cookies}   s=    TUi +x777i (E111r   c                 4    t        d      }|d   d   dk(  sJ y )Nz1curl --cookie 'token=mytoken' https://example.comr   rN   mytokenr   r   s     r   test_cookie_long_flagz%TestBCookieFlag.test_cookie_long_flag   s%    OPi )Y666r   c                 N    t        d      }|d   d   dk(  sJ |d   d   dk(  sJ y)u1   -b 와 -H Cookie: 가 동시에 있으면 병합.z2curl -b 'a=1' -H 'Cookie: b=2' https://example.comr   a1b2Nr   r   s     r   %test_b_flag_merges_with_cookie_headerz5TestBCookieFlag.test_b_flag_merges_with_cookie_header   s=    PQi %,,,i %,,,r   r   )r    r!   r"   rT   rV   rY   r_   r#   r   r   rR   rR   x   s    82
7-r   rR   c                       e Zd ZddZddZy)	TestProxyNc                 .    t        d      }|d   dk(  sJ y )Nz;curl -x 'http://proxy.example.com:8080' https://example.comr   zhttp://proxy.example.com:8080r   r   s     r   test_x_proxyzTestProxy.test_x_proxy   s     YZg"AAAAr   c                 .    t        d      }|d   dk(  sJ y )Nz@curl --proxy 'http://proxy.example.com:3128' https://example.comr   zhttp://proxy.example.com:3128r   r   s     r   test_proxy_long_flagzTestProxy.test_proxy_long_flag   s     ^_g"AAAAr   r   )r    r!   r"   rc   re   r#   r   r   ra   ra      s    BBr   ra   c                       e Zd ZddZddZy)TestMultilineCurlNc                 f    d}t        |      }|d   dk(  sJ |d   d   dk(  sJ |d   d   dk(  sJ y )	NzRcurl 'https://example.com' \
  -H 'Accept: text/html' \
  -H 'Accept-Language: ko'r	   r
   r   r8   r9   r<   r=   r   r   curl_cmdr   s      r    test_backslash_line_continuationz2TestMultilineCurl.test_backslash_line_continuation   sU    qH%e} 5555i *k999i !23t;;;r   c                     d}t        |      }|d   dk(  sJ |d   dk(  sJ |d   d   dk(  sJ |d   d	   d
k(  sJ |d   d   dk(  sJ |d   d   dk(  sJ |d   dk(  sJ y)u9   실제 DevTools에서 복사한 멀티라인 curl 형식.zcurl 'https://api.example.com/data' \
  -X 'POST' \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer token123' \
  -H 'Cookie: session=abc; csrf=xyz' \
  --data-raw '{"key": "value"}'r	   zhttps://api.example.com/datar   r'   r   r1   r2   AuthorizationzBearer token123r   rH   abccsrfrK   r   z{"key": "value"}Nr   ri   s      r   test_devtools_style_multilinez/TestMultilineCurl.test_devtools_style_multiline   s    0 	 H%e} >>>>h6)))i 04FFFFi 15FFFFi +u444i (E111f~!3333r   r   )r    r!   r"   rk   rp   r#   r   r   rg   rg      s    <4r   rg   c                       e Zd ZddZddZy)TestCompressedIgnoredNc                 N    t        d      }|d   dk(  sJ d|vsJ |d   dk(  sJ y )Nz'curl --compressed 'https://example.com'r	   r
   
compressedr   r   r   r   s     r   test_compressed_flag_ignoredz2TestCompressedIgnored.test_compressed_flag_ignored   sA    EFe} 55556)))h5(((r   c                 T    t        d      }|d   dk(  sJ |d   d   dk(  sJ d|vsJ y )Nz>curl -H 'Accept: text/html' --compressed 'https://example.com'r	   r
   r   r8   r9   rt   r   r   s     r    test_compressed_with_other_flagsz6TestCompressedIgnored.test_compressed_with_other_flags   sF    \]e} 5555i *k9996)))r   r   )r    r!   r"   ru   rw   r#   r   r   rr   rr      s    )*r   rr   c                   ,    e Zd ZddZddZddZddZy)TestErrorHandlingNc                 z    t        j                  t        d      5  t        d       d d d        y # 1 sw Y   y xY w)Ncurl)match pytestraises
ValueErrorr   r   s    r   test_empty_string_raisesz*TestErrorHandling.test_empty_string_raises   s,    ]]:V4 	rN	 	 	s   1:c                 v    t        j                  t              5  t        d       d d d        y # 1 sw Y   y xY w)Nz   r~   r   s    r   test_whitespace_only_raisesz-TestErrorHandling.test_whitespace_only_raises   s+    ]]:& 	u	 	 	   /8c                 v    t        j                  t              5  t        d       d d d        y # 1 sw Y   y xY w)Nzcurl -H 'Accept: text/html'r~   r   s    r   test_no_url_raisesz$TestErrorHandling.test_no_url_raises   s,    ]]:& 	645	6 	6 	6r   c                 v    t        j                  t              5  t        d       d d d        y # 1 sw Y   y xY w)Nzwget https://example.comr~   r   s    r    test_missing_curl_command_raisesz2TestErrorHandling.test_missing_curl_command_raises   s,    ]]:& 	312	3 	3 	3r   r   )r    r!   r"   r   r   r   r   r#   r   r   ry   ry      s    63r   ry   c                   $    e Zd ZddZddZddZy)TestPutDeleteMethodNc                 .    t        d      }|d   dk(  sJ y )Nz*curl -X PUT https://example.com/resource/1r   PUTr   r   s     r   test_put_methodz#TestPutDeleteMethod.test_put_method   s     HIh5(((r   c                 .    t        d      }|d   dk(  sJ y )Nz-curl -X DELETE https://example.com/resource/1r   DELETEr   r   s     r   test_delete_methodz&TestPutDeleteMethod.test_delete_method   s     KLh8+++r   c                 .    t        d      }|d   dk(  sJ y )Nz1curl --request PUT https://example.com/resource/1r   r   r   r   s     r   test_request_long_flagz*TestPutDeleteMethod.test_request_long_flag   s     OPh5(((r   r   )r    r!   r"   r   r   r   r#   r   r   r   r      s    ),)r   r   c                       e Zd ZddZy)TestComplexDevToolsOutputNc                    d}t        |      }|d   dk(  sJ |d   dk(  sJ |d   d   dk(  sJ |d   d	   d
k(  sJ |d   d   dk(  sJ |d   d   dk(  sJ d|d   vsJ |d   d   dk(  sJ |d   d   dk(  sJ |d   d   dk(  sJ y)u8   실제 DevTools 복사 스타일의 복잡한 명령어.ab  curl 'https://www.example.com/api/search?q=test&page=1' \
  -H 'authority: www.example.com' \
  -H 'accept: text/html,application/xhtml+xml' \
  -H 'accept-language: ko-KR,ko;q=0.9' \
  -H 'cookie: _ga=GA1.2.123456789; session_id=abcdef123456; csrftoken=xyz987' \
  -H 'referer: https://www.example.com/' \
  -H 'user-agent: Mozilla/5.0' \
  --compressedr	   z0https://www.example.com/api/search?q=test&page=1r   r   r   acceptztext/html,application/xhtml+xmlzaccept-languagezko-KR,ko;q=0.9refererzhttps://www.example.com/z
user-agentrB   cookier   _gazGA1.2.123456789
session_idabcdef123456	csrftokenxyz987Nr   ri   s      r   test_full_devtools_curlz1TestComplexDevToolsOutput.test_full_devtools_curl   s     	 H%e} RRRRh5(((i *.OOOOi !237GGGGi +/IIIIi .-???vi0000i '+<<<<i ..@@@i -999r   r   )r    r!   r"   r   r#   r   r   r   r      s    :r   r   )__doc__syspathlibr   r   pathinsertstr__file__parentcurl_to_fetcherr   r   r%   r6   rE   rR   ra   rg   rr   ry   r   r   r#   r   r   <module>r      s    3 
   3tH~,,334 5 &+ +8G GH@ @,: :"- -0B B4 4>* *"3 3*) )": :r   