o
    ie                     @   sP  d Z ddlZddlm  mZ ddlZddlZddl	m
Z
 ejjde
defddZejjde
defdd	Zejjde
defd
dZejjde
defddZejjde
fddZejjde
fddZejjde
defddZejjde
fddZejjde
defddZejjde
defddZejjde
defddZdS )z4Tests for garment analysis and management endpoints.    N)AsyncClientclientsample_jpegc                    sZ  | j ddd|dfidI dH }|j}d}||k}|sOtd|fd	||fd
t v s0t|r5t|nd
t|t|d }dd|i }tt	|d } }}|
 }|d }	d}|	|k}
|
std|
fd|	|ft|	t|d }dd|i }tt	|d }	 }
}|d }	d}|	|k}
|
std|
fd|	|ft|	t|d }dd|i }tt	|d }	 }
}|d }t|}d}||k}|std|fd||fdt v sttrttndt|t|t|d }dd|i }tt	|d } } }}|d d }|d }	d }|	|k}
|
sJtd|
fd|	|ft|	t|d }dd|i }tt	|d }	 }
}|d! }	d"}|	|k}
|
std|
fd|	|ft|	t|d }dd|i }tt	|d }	 }
}|d# d$ }	d%g}|	|k}
|
std|
fd|	|ft|	t|d }dd|i }tt	|d }	 }
}|d& }	d}|	|u}
|
std'|
fd(|	|ft|	t|d }dd|i }tt	|d }	 }
}|d) }	d}|	|u }
|
s%td*|
fd+|	|ft|	t|d }dd|i }tt	|d }	 }
}dS ),uL   POST /garments/analyze with no user_id → global user, face_status=skipped./api/v1/garments/analyzeimagetest.jpg
image/jpegfilesN   ==z3%(py2)s
{%(py2)s = %(py0)s.status_code
} == %(py5)sresppy0py2py5assert %(py7)spy7face_statusnot_usedz%(py1)s == %(py4)spy1py4assert %(py6)spy6user_id$00000000-0000-0000-0000-000000000000garments   >=z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} >= %(py7)slenr   r   r   r   assert %(py9)spy9r   category_maintopcategory_subzt-shirttagscolorblackidis notz%(py1)s is not %(py4)sghost_image_urlisz%(py1)s is %(py4)spoststatus_code
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationjsonr%   r   r   r   @py_assert1@py_assert4@py_assert3@py_format6@py_format8data@py_assert0@py_assert2@py_format5@py_format7@py_assert6@py_assert5@py_format10garment rR   2/home/ubuntu/ootd-poc-server/tests/test_garment.py test_analyze_garment_global_user	   s    jjllrlprT   c                    sH  d}| j dd|idd|dfidI dH }|j}d	}||k}|sTtd
|fd||fdt v s5t|r:t|ndt|t|d }dd|i }tt	|d } }}|
 }	|	d }
d}|
|k}|std
|fd|
|ft|
t|d }dd|i }tt	|d }
 }}|	d }
|
|k}|std
|fd|
|ft|
dt v st|rt|ndd }dd|i }tt	|d }
}|	d }t|}d}||k}|std|fd||fdt v sttrttndt|t|t|d }d d!|i }tt	|d } } }}dS )"uE   POST /garments/analyze with explicit user_id → face_status=skipped.r   r   r   r   r   r   rI   r
   Nr   r   r   r   r   r   r   r   r   r   r   r   r   z%(py1)s == %(py3)sr   py3assert %(py5)sr   r    r!   r"   r$   r%   r&   r'   r(   r7   )r   r   r   r   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   @py_format4rN   rO   rP   rR   rR   rS   !test_analyze_garment_with_user_id   s   j|r[   c                    s  | j dddidd|dfidI dH }|j}d	}||k}|sRtd
|fd||fdt v s3t|r8t|ndt|t|d }dd|i }tt	|d } }}|
 }d}	|	|v }
|
std|
fd|	|ft|	dt v s}t|rt|ndd }dd|i }tt	|d }	}
d}	|	|v }
|
std|
fd|	|ft|	dt v st|rt|ndd }dd|i }tt	|d }	}
|d }	d}|	|v }
|
std|
fd|	|ft|	t|d }dd|i }tt	|d }	 }
}dS )uM   POST /garments/analyze with use_face_id=true → face identification attempt.r   use_face_idtruer   r   r   rU   Nr   r   r   r   r   r   r   r   )in)z%(py1)s in %(py3)srI   rW   rY   r   r    r   )knownunknownnot_detected)z%(py1)s in %(py4)sr   r   r   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   )r   r   r   rD   rE   rF   rG   rH   rI   rJ   rK   rZ   rL   rM   rR   rR   rS   test_analyze_with_face_id/   s   xxprc   c                    s  | j dddidd|dfidI dH }|j}d	}||k}|sRtd
|fd||fdt v s3t|r8t|ndt|t|d }dd|i }tt	|d } }}|
 }|d }	d}|	|k}
|
std
|
fd|	|ft|	t|d }dd|i }tt	|d }	 }
}|d }	d}|	|k}
|
std
|
fd|	|ft|	t|d }dd|i }tt	|d }	 }
}dS )uB   POST /garments/analyze with use_face_id=false → global fallback.r   r\   falser   r   r   rU   Nr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rb   r   r   r   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rR   rR   rS   test_analyze_without_face_id>   s   jnrf   c                       t  }| d| I dH }|j}d}||k}|sOtd|fd||fdt v s0t|r5t	|ndt	|t	|d }dd	|i }t
t|d } }}dS )
u0   GET /garments/{id} with non-existent id → 404./api/v1/garments/N  r   r   r   r   r   r   )uuiduuid4getr9   r:   r;   r<   r=   r>   r?   r@   rA   r   fake_idr   rD   rE   rF   rG   rH   rR   rR   rS   test_get_garment_not_foundL      ro   c                    rg   )
u3   DELETE /garments/{id} with non-existent id → 404.rh   Nri   r   r   r   r   r   r   )rj   rk   deleter9   r:   r;   r<   r=   r>   r?   r@   rA   rm   rR   rR   rS   test_delete_garment_not_foundT   rp   rr   c                    s  | j ddd|dfidI dH }|j}d}||k}|sOtd|fd	||fd
t v s0t|r5t|nd
t|t|d }dd|i }tt	|d } }}|
 d d d }| d| I dH }|j}d}||k}|std|fd	||fd
t v st|rt|nd
t|t|d }dd|i }tt	|d } }}|
 }	|	d }
|
|k}|std|fd|
|ft|
dt v st|rt|ndd }dd|i }tt	|d }
}|	d }
d}|
|k}|s!td|fd|
|ft|
t|d }dd|i }tt	|d }
 }}| d| I dH }|j}d}||k}|sttd|fd	||fd
t v sUt|rZt|nd
t|t|d }dd|i }tt	|d } }}|
 d }
d}|
|u }|std|fd |
|ft|
t|d }dd|i }tt	|d }
 }}| d| I dH }|j}d!}||k}|std|fd	||fd
t v st|rt|nd
t|t|d }dd|i }tt	|d } }}dS )"u+   Full lifecycle: analyze → get → delete.r   r   r   r   r	   Nr   r   r   r   r   r   r   r    r   r/   rh   rV   
garment_idrW   rY   r   r)   r*   r   r   r   r   deletedTr4   r6   ri   )r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rl   rq   )r   r   r   rD   rE   rF   rG   rH   rs   detailrJ   rK   rZ   rL   rM   rR   rR   rS   test_garment_crud_lifecycle\   s"   |lprv   c                    s   t  }| d| dI dH }|j}d}||k}|sPtd|fd||fdt v s1t|r6t	|ndt	|t	|d }d	d
|i }t
t|d } }}dS )u7   POST /garments/{id}/ghost with non-existent id → 404.rh   z/ghostNri   r   r   r   r   r   r   )rj   rk   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rm   rR   rR   rS   test_ghost_generate_not_foundx   s   rw   c                    s  | j dddidd|dfidI dH }|j}d	}||k}|sRtd
|fd||fdt v s3t|r8t|ndt|t|d }dd|i }tt	|d } }}|
 }|d }	d}|	|u }
|
std|
fd|	|ft|	t|d }dd|i }tt	|d }	 }
}|d }	d}|	|u}
|
std|
fd|	|ft|	t|d }dd|i }tt	|d }	 }
}|d }t|}d}||k}|std|fd||fdt v sttrttndt|t|t|d }d d!|i }tt	|d } } }}|d d" }|d# }	d}|	|u }
|
sMtd|
fd|	|ft|	t|d }dd|i }tt	|d }	 }
}|d$ }	d%}|	|k}
|
std
|
fd&|	|ft|	t|d }dd|i }tt	|d }	 }
}|d' }	d}|	|u}
|
std|
fd|	|ft|	t|d }dd|i }tt	|d }	 }
}dS )(uM   POST /garments/analyze with auto_save=false → analysis only, no DB records.r   	auto_saverd   r   r   r   rU   Nr   r   r   r   r   r   r   savedFr4   r6   r   r   r   source_image_pathr0   r2   r    r!   r"   r$   r%   r&   r'   r(   r   r/   r)   r*   r   source_image_urlr7   rC   rR   rR   rS   test_analyze_only_no_save   s   jjllpr|   c              	      sr  | j dddidd|dfidI dH }|j}d	}||k}|sRtd
|fd||fdt v s3t|r8t|ndt|t|d }dd|i }tt	|d } }}|
 }|d }	d}|	|u }
|
std|
fd|	|ft|	t|d }dd|i }tt	|d }	 }
}|d }|dd |d D d}| j d|dI dH }|j}d	}||k}|std
|fd||fdt v st|rt|ndt|t|d }dd|i }tt	|d } }}|
 }|d }t|}|d }t|}||k}|s\td
|fd||fdt v s"ttr'ttndt|t|dt v s=ttrBttndt|t|d  }d!d"|i }tt	|d } } } }}|d D ]9}|d# }	d}|	|u}
|
std$|
fd%|	|ft|	t|d }dd|i }tt	|d }	 }
}qj|d d& d# }| d'| I dH }|j}d	}||k}|std
|fd||fdt v st|rt|ndt|t|d }dd|i }tt	|d } }}|
 d( }	d)}|	|k}
|
s1td
|
fd*|	|ft|	t|d }dd|i }tt	|d }	 }
}dS )+uJ   Full flow: analyze(auto_save=false) → POST /save → garments persisted.r   rx   rd   r   r   r   rU   Nr   r   r   r   r   r   r   ry   Fr4   r6   r   r   r   rz   c                 S   s0   g | ]}|d  | d| d| ddqS )r)   r+   descriptionr,   )r)   r+   r}   r,   )rl   ).0grR   rR   rS   
<listcomp>   s    z/test_analyze_only_then_save.<locals>.<listcomp>r    )rz   r    z/api/v1/garments/save)rB   )zP%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py10)s
{%(py10)s = %(py6)s(%(py8)s)
}r%   )r   r   r   r   py8py10zassert %(py12)spy12r/   r0   r2   r   rh   r)   r*   r   )r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   r%   rl   )r   r   r   rD   rE   rF   rG   rH   analyze_datarJ   rK   rL   rM   source_path	save_body	save_data@py_assert7@py_assert9rO   @py_format11@py_format13r   rs   rR   rR   rS   test_analyze_only_then_save   s2   jptr   c                    s  | j ddd|dfidI dH }|j}d}||k}|sOtd|fd	||fd
t v s0t|r5t|nd
t|t|d }dd|i }tt	|d } }}|
 }|d }	d}|	|u }
|
std|
fd|	|ft|	t|d }dd|i }tt	|d }	 }
}|d d d }	d}|	|u}
|
std|
fd|	|ft|	t|d }dd|i }tt	|d }	 }
}dS )uD   POST /garments/analyze without auto_save → defaults to saved=True.r   r   r   r   r	   Nr   r   r   r   r   r   r   ry   Tr4   r6   r   r   r   r    r   r/   r0   r2   rb   re   rR   rR   rS   #test_analyze_auto_save_default_true   s   jvr   )__doc__builtinsr<   _pytest.assertion.rewrite	assertionrewriter:   rj   pytesthttpxr   markasynciobytesrT   r[   rc   rf   ro   rr   rv   rw   r|   r   r   rR   rR   rR   rS   <module>   s4    "*