o
    }oi-/                     @   sP  d dl Z d dlZd dlmZmZ d dlZd dlZd dlm	Z	 d dl
mZmZmZmZmZmZmZmZ d dlmZ d dlmZ d dlmZ ejdd	 Zejd
d Zejdd Zejdd ZG dd dZG dd dZG dd dZG dd dZG dd dZ G dd dZ!G dd dZ"G dd dZ#G d d! d!Z$G d"d# d#Z%dS )$    N)	MagicMockpatch)
TestClient)ChatCompletionRequestCompletionRequestTritonSettings_helper_funappconvert_numpydict_to_strquery_llm_async)r   )r   )r	   c                   C      t tS N)r   r	    r   r   X/home/ubuntu/.local/lib/python3.10/site-packages/tests/deploy/test_deployment_service.pyclient&      r   c                  c   sH    t d} | j}d|_d|_|V  W d    d S 1 sw   Y  d S )Nz@nemo.deploy.service.fastapi_interface_to_pytriton.TritonSettings@  	localhost)r   return_valuetriton_service_porttriton_service_ipmockinstancer   r   r   mock_triton_settings+   s   
"r   c                   C   r   r   )r   rest_appr   r   r   r   rest_client4   r   r   c                  c   sZ    t d} | j}d|_d|_d|_d|_d|_|V  W d    d S 1 s&w   Y  d S )Nz1nemo.deploy.service.rest_model_api.TritonSettings  r   <   F)r   r   r   r   triton_request_timeoutopenai_format_responseoutput_generation_logitsr   r   r   r   mock_rest_triton_settings9   s   
"r#   c                   @      e Zd Zdd Zdd ZdS )TestTritonSettingsc                 C   sZ   t jtji dd t }|jdksJ |jdksJ W d    d S 1 s&w   Y  d S )NTclearr   0.0.0.0r   dictosenvironr   r   r   selfsettingsr   r   r   test_default_valuesF   s
   "z&TestTritonSettings.test_default_valuesc                 C   s`   t jtjddddd t }|jdksJ |jdksJ W d    d S 1 s)w   Y  d S )N9000	127.0.0.1)TRITON_PORTTRITON_HTTP_ADDRESSTr&   (#  r)   r-   r   r   r   test_custom_valuesL   s
   "z%TestTritonSettings.test_custom_valuesN__name__
__module____qualname__r0   r6   r   r   r   r   r%   E   s    r%   c                   @   $   e Zd Zdd Zdd Zdd ZdS )TestCompletionRequestc                 C   s   t ddd}|jdksJ |jdksJ |jdksJ |jdks"J |jdks)J |jdks0J |jd u s7J |jdu s>J d S )	N
test_modeltest promptmodelprompt         ?        r   F)	r   r@   rA   
max_tokenstemperaturetop_ptop_klogprobsechor.   requestr   r   r   test_default_completions_valuesT   s   z5TestCompletionRequest.test_default_completions_valuesc                 C   st   t ddddgd}|jdksJ |jdddgksJ |jdks#J |jdks*J |jdks1J |jd	ks8J d S )
Nr=   usertest messagerolecontentr@   messagesrB   rC   rD   r   )r   r@   rT   rE   rF   rG   rH   rK   r   r   r   test_default_chat_values_   s   z.TestCompletionRequest.test_default_chat_valuesc                 C   s"   t ddddd}|jdksJ d S )Nr=   r>   rD   )r@   rA   rF   rG      )r   rH   rK   r   r   r   test_greedy_paramsh   s   z(TestCompletionRequest.test_greedy_paramsN)r8   r9   r:   rM   rU   rW   r   r   r   r   r<   S   s    	r<   c                   @      e Zd Zdd ZdS )TestHealthEndpointsc                 C   0   | d}|jdksJ | ddiksJ d S Nz
/v1/health   statusokgetstatus_codejson)r.   r   responser   r   r   test_health_checkn      
z%TestHealthEndpoints.test_health_checkN)r8   r9   r:   rd   r   r   r   r   rY   m       rY   c                   @   r$   )TestUtilityFunctionsc                 C   s   t g d}t|g dksJ t ddgdt ddgid}t|ddgdddgidks3J t ddgt ddgg}t|ddgddggksOJ d S )N)rV         rV   rh   cri      )ab)nparrayr
   )r.   arrnestedlstr   r   r   test_convert_numpyu   s   "" z'TestUtilityFunctions.test_convert_numpyc                 C   s6   ddd}t |}t|tsJ t||ksJ d S )Nvalue*   )keynumber)r   
isinstancestrrb   loads)r.   	test_dictresultr   r   r   test_dict_to_str   s   
z%TestUtilityFunctions.test_dict_to_strN)r8   r9   r:   rs   r}   r   r   r   r   rg   t   s    rg   c                   @   r$   )TestLLMQueryFunctionsc                 C   s~   t  }ddi|j_td|d& tdddgdd	d
dddddd}|ddiks(J |j  W d    d S 1 s8w   Y  d S )Ntestrc   zEnemo.deploy.service.fastapi_interface_to_pytriton.NemoQueryLLMPyTorchr   http://testr=   r>   ffffff?
   ?Td   Fr   urlr@   promptsrF   rH   rG   compute_logprob
max_lengthapply_chat_templaterJ   n_top_logprobs)r   	query_llmr   r   r   assert_called_once)r.   mock_nqr|   r   r   r   test_helper_fun   s&   "z%TestLLMQueryFunctions.test_helper_func                 C   s|   ddi}t d|d* dd l}| }|tdddgd	d
ddddddd}||ks,J W d    d S 1 s7w   Y  d S )Nr   rc   z=nemo.deploy.service.fastapi_interface_to_pytriton._helper_funr   r   r   r=   r>   r   r   r   Tr   Fr   )r   asyncioget_event_looprun_until_completer   )r.   mock_resultr   loopr|   r   r   r   test_query_llm_async   s*   "z*TestLLMQueryFunctions.test_query_llm_asyncN)r8   r9   r:   r   r   r   r   r   r   r~      s    r~   c                   @   r$   )TestAPIEndpointsc                 C   s   ddggddggddiddiggdd	gi}t d
|d5 |jdddddd}|jdks0J | }|d d d dks@J d|d d v sJJ W d    d S 1 sUw   Y  d S )Nchoicestest responserC   g       @rl   g      ?rm   )token_logprobstop_logprobs)textrI   Anemo.deploy.service.fastapi_interface_to_pytriton.query_llm_asyncr   /v1/completions/r=   r>   rV   )r@   rA   rI   rb   r\   r   r   rI   r   postra   rb   r.   r   mock_outputrc   datar   r   r   test_completions_v1   s   	"z$TestAPIEndpoints.test_completions_v1c                 C   s   dddggigi}t d|d> |jdddd	d
gdd}|jdks%J | }|d d d d dks7J |d d d d dksEJ W d    d S 1 sPw   Y  d S )Nr   r   r   r   r   z/v1/chat/completions/r=   rN   rO   rP   rS   r   r\   r   messagerQ   	assistantrR   r   r   r   r   r   test_chat_completions_v1   s   "z)TestAPIEndpoints.test_chat_completions_v1N)r8   r9   r:   r   r   r   r   r   r   r      s    r   c                   @   r$   )TestRestTritonSettingsc                 C   s   t jtji dd/ t }|jdksJ |jdksJ |jdks"J |jdu s)J |j	du s0J W d    d S 1 s;w   Y  d S )NTr&   r   r(   r   F
r   r*   r+   r,   RestTritonSettingsr   r   r    r!   r"   r-   r   r   r   r0      s   "z*TestRestTritonSettings.test_default_valuesc                 C   s   t jtjdddddddd/ t }|jdksJ |jdks!J |jd	ks(J |jdu s/J |j	du s6J W d    d S 1 sAw   Y  d S )
Nr1   r2   120True)r3   r4   TRITON_REQUEST_TIMEOUTOPENAI_FORMAT_RESPONSEOUTPUT_GENERATION_LOGITSTr&   r5   x   r   r-   r   r   r   r6      s"   "z)TestRestTritonSettings.test_custom_valuesNr7   r   r   r   r   r      s    	r   c                   @   rX   )TestRestCompletionRequestc                 C   s   t ddd}|jdksJ |jdksJ |jdksJ |jdks"J |jdks)J |jdks0J |jdu s7J |jd u s>J |j	dksEJ d S )	Nr=   r>   r?   rB   rC   rD   rV   F)
RestCompletionRequestr@   rA   rE   rF   rG   rH   streamstopfrequency_penaltyrK   r   r   r   r0      s   z-TestRestCompletionRequest.test_default_valuesN)r8   r9   r:   r0   r   r   r   r   r      rf   r   c                   @   r$   )TestRestHealthEndpointsc                 C   rZ   r[   r_   )r.   r   rc   r   r   r   rd     re   z)TestRestHealthEndpoints.test_health_checkc                 C   sl   t d(}t }d|_||_|d}|jdksJ | ddiks$J W d    d S 1 s/w   Y  d S )Nzrequests.getr\   z/v1/triton_healthr]   z$Triton server is reachable and ready)r   r   ra   r   r`   rb   )r.   r   mock_getmock_responserc   r   r   r   test_triton_health_success  s   

"z2TestRestHealthEndpoints.test_triton_health_successN)r8   r9   r:   rd   r   r   r   r   r   r     s    r   c                   @   r;   )TestRestCompletionsEndpointc              
   C   s   dgg}t d/}|j}||j_|jddddddd	d
d}|jdks%J | ddiks/J W d    d S 1 s:w   Y  d S )Nr   /nemo.deploy.service.rest_model_api.NemoQueryLLMr   r=   r>   r   r   r   r   )r@   rA   rE   rF   rG   rH   r   r\   output)r   r   r   r   ra   rb   )r.   r   r   mock_llmmock_instancerc   r   r   r   test_completions_success  s"   
"z4TestRestCompletionsEndpoint.test_completions_successc                 C   s   dgg}d|_ td+}|j}||j_|jddddd}|jd	ks$J | d
diks.J W d    d S 1 s9w   Y  d S )Nr   Fr   r   r=   r>   r?   r   r\   r   )r!   r   r   r   r   ra   rb   )r.   r   r#   r   r   r   rc   r   r   r    test_completions_standard_format,  s   
"z<TestRestCompletionsEndpoint.test_completions_standard_formatc                 C   sv   t d-}|j}td|j_|jddddd}|jdksJ | d	d
iks)J W d    d S 1 s4w   Y  d S )Nr   z
Test errorr   r=   r>   r?   r   r\   errorzAn exception occurred)r   r   	Exceptionr   side_effectr   ra   rb   )r.   r   r   r   rc   r   r   r   test_completions_error_handling8  s   
"z;TestRestCompletionsEndpoint.test_completions_error_handlingN)r8   r9   r:   r   r   r   r   r   r   r   r     s    r   )&rb   r+   unittest.mockr   r   numpyrn   pytestfastapi.testclientr   1nemo.deploy.service.fastapi_interface_to_pytritonr   r   r   r   r	   r
   r   r   "nemo.deploy.service.rest_model_apir   r   r   fixturer   r   r   r#   r%   r<   rY   rg   r~   r   r   r   r   r   r   r   r   r   <module>   s8   (




/"