
    %~i2(                       d dl mZ 	 d dlZd dlmc mZ d dlZd dl	m
Z
 d dlmZ d dlmZ d dlmZ d dlmZ ej&                  d        Zej&                  d        Z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)    )annotationsN)FastAPI)
TestClient)router)	WikiStorec               #    K   t               } | j                  t               t        d      }t        j
                  }|t        _        t        |       5 }| ddd       |j                          |t        _        y# 1 sw Y   %xY ww)u6   테스트용 FastAPI 클라이언트 (인메모리 DB)z:memory:)db_pathN)r   include_routerr   r   wiki_api_module_storer   close)app
test_storeoriginal_storecs       d/home/jay/projects/insuwiki/.worktrees/task-2064-dev6/scripts/kakao_knowledge/tests/test_wiki_api.pyclientr      st      )Cv :.J$++N'O	C A +O	 s   AB	A=$B	=BB	c                     dddddddgddS )	Nzkakao-test-001u   테스트 항목   보상u   테스트 질문입니다u   테스트 답변입니다	   테스트high)idtitlecategoryquestionanswerkeywords
confidence r       r   sample_entryr!   +   s(     #/- (+ r    c                   | j                  d|      }|j                  }d}||k(  }|st        j                  d|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }t        j                  |j                        dz   d	|iz  }t        t        j                  |            d
x}x}}|j                         S )u-   POST로 항목 생성 후 응답 dict 반환./api/wiki/entriesjson   ==z3%(py2)s
{%(py2)s = %(py0)s.status_code
} == %(py5)sresppy0py2py5z
>assert %(py7)spy7N)poststatus_code
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_saferepr_format_assertmsgtextAssertionError_format_explanationr%   )r   entryr*   @py_assert1@py_assert4@py_assert3@py_format6@py_format8s           r   _createrB   =   s    ;;*;7D-s-s"---s------4---4------s---DII-------99;r    c                      e Zd ZddZy)TestCreateEntryc                   |j                  d|      }|j                  }d}||k(  }|st        j                  d|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      nd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\   POST /api/wiki/entries는 201을 반환하고 생성된 항목의 id를 포함해야 한다.r#   r$   r&   r'   r)   r*   r+   assert %(py7)sr/   Nr   z%(py1)s == %(py4)spy1py4assert %(py6)spy6)r0   r1   r2   r3   r4   r5   r6   r7   r:   r;   r%   selfr   r!   r*   r=   r>   r?   r@   rA   data@py_assert0@py_assert2@py_format5@py_format7s                 r   test_create_entryz!TestCreateEntry.test_create_entryJ   s    {{.\{B&3&3&&&&3&&&&&&t&&&t&&&&&&3&&&&&&&yy{Dz/\$//z/////z////z///////////r    Nr   r   r!   dict)__name__
__module____qualname__rT   r   r    r   rD   rD   I   s    0r    rD   c                      e Zd ZddZddZy)TestGetEntryc                   t        ||       |j                  d|d          }|j                  }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      nd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}}|	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   }|
|k(  }|slt        j                  d|fd|
|f      t        j                  |
      t        j                  |      dz  }dd|iz  }t        t        j                  |            d
x}
x}}y
)uP   POST로 생성 후 GET /api/wiki/entries/{id}로 조회할 수 있어야 한다./api/wiki/entries/r      r'   r)   r*   r+   rF   r/   NrG   rH   rK   rL   r   r   rB   getr1   r2   r3   r4   r5   r6   r7   r:   r;   r%   rM   s                 r   test_get_entryzTestGetEntry.test_get_entryX   s   %zz.|D/A.BCD&3&3&&&&3&&&&&&t&&&t&&&&&&3&&&&&&&yy{Dz/\$//z/////z////z///////////G}5W 55} 55555} 5555}555 55555555J;<
#;;#;;;;;#;;;;;;;#;;;;;;;;r    c                   |j                  d      }|j                  }d}||k(  }|st        j                  d|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}x}}y	)
u=   존재하지 않는 id 조회 시 404를 반환해야 한다.%/api/wiki/entries/nonexistent-id-9999  r'   r)   r*   r+   rF   r/   N)
r`   r1   r2   r3   r4   r5   r6   r7   r:   r;   rN   r   r*   r=   r>   r?   r@   rA   s           r   test_get_entry_not_foundz%TestGetEntry.test_get_entry_not_foundb   s    zzAB&3&3&&&&3&&&&&&t&&&t&&&&&&3&&&&&&&r    NrU   r   r   )rW   rX   rY   ra   rf   r   r    r   r[   r[   W   s    <'r    r[   c                      e Zd ZddZddZy)TestListEntriesc                   t        d      D cg c]  }i |d|dd| d }}|D ]  }t        ||        |j                  d      }|j                  }d}||k(  }	|	st	        j
                  d|	fd	||f      d
t        j                         v st	        j                  |      rt	        j                  |      nd
t	        j                  |      t	        j                  |      dz  }
dd|
iz  }t        t	        j                  |            dx}x}	}|j                         }t        |t              }	|	sddt        j                         v st	        j                  t              rt	        j                  t              nddt        j                         v st	        j                  |      rt	        j                  |      nddt        j                         v st	        j                  t              rt	        j                  t              ndt	        j                  |	      dz  }t        t	        j                  |            d}	t        |      }d}||k(  }|st	        j
                  d|fd||f      dt        j                         v st	        j                  t              rt	        j                  t              nddt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      t	        j                  |      dz  }dd|iz  }t        t	        j                  |            dx}x}}yc c}w )u[   여러 항목 생성 후 GET /api/wiki/entries로 목록을 조회할 수 있어야 한다.   zkakao-test-03du   항목)r   r   r#   r^   r'   r)   r*   r+   rF   r/   N5assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}
isinstancerO   listr,   rI   r-   rJ   z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)slenr,   rI   py3rL   assert %(py8)spy8)rangerB   r`   r1   r2   r3   r4   r5   r6   r7   r:   r;   r%   rn   ro   rr   )rN   r   r!   ientrieser*   r=   r>   r?   r@   rA   rO   rR   rQ   @py_assert5rS   @py_format9s                     r   test_list_entriesz!TestListEntries.test_list_entriesn   s    1X
 Q|P[3#8VA3<P
 
  	AFA	 zz-.&3&3&&&&3&&&&&&t&&&t&&&&&&3&&&&&&&yy{$%%%%%%%%z%%%z%%%%%%$%%%$%%%%%%%%%%%%%%%%%%%4yAyA~yAss44yA
s   Mc                   ddddddddd	dddd
dddddg}|D ]  }t        ||        |j                  d      }|j                  }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }	t        t        j                  |	            dx}x}}|j                         }
t        |
t              }|sddt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  |
      rt        j                  |
      nddt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }t        t        j                  |            d}t        |
      }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  |
      rt        j                  |
      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}d  |
D        }t        |      }|sd!d"t        j                         v st        j                  t              rt        j                  t              nd"t        j                  |      t        j                  |      d#z  }t        t        j                  |            dx}}y)$uI   category/status 필터 쿼리 파라미터가 정상 동작해야 한다.zf-001u   보상1r   qar   r   r   r   r   zf-002u   고지1u   고지의무zf-003u   보상2u!   /api/wiki/entries?category=보상r^   r'   r)   r*   r+   rF   r/   Nrm   rn   rO   ro   rp      rq   rr   rs   ru   rv   c              3  ,   K   | ]  }|d    dk(    yw)r   r   Nr   ).0items     r   	<genexpr>z;TestListEntries.test_list_entries_filter.<locals>.<genexpr>   s     AD4
#x/As   z,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}all)r,   r-   rJ   )rB   r`   r1   r2   r3   r4   r5   r6   r7   r:   r;   r%   rn   ro   rr   r   )rN   r   ry   rz   r*   r=   r>   r?   r@   rA   rO   rR   rQ   r{   rS   r|   s                   r   test_list_entries_filterz(TestListEntries.test_list_entries_filter~   sV    YHRUadeYNX[gjkYHRUade

  	AFA	 zz=>&3&3&&&&3&&&&&&t&&&t&&&&&&3&&&&&&&yy{$%%%%%%%%z%%%z%%%%%%$%%%$%%%%%%%%%%%%%%%%%%%4yAyA~yAss44yAADAAsAAAAAAAAAsAAAsAAAAAAAAAAAAAAr    NrU   rg   )rW   rX   rY   r}   r   r   r    r   ri   ri   m   s     Br    ri   c                      e Zd ZddZddZy)TestUpdateEntryc                   t        ||       |j                  d|d    ddi      }|j                  }d}||k(  }|st        j                  d|fd||f      d	t        j                         v st        j                  |      rt        j                  |      nd	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)uM   PUT /api/wiki/entries/{id}로 항목을 업데이트할 수 있어야 한다.r]   r   r   u   수정된 답변r$   r^   r'   r)   r*   r+   rF   r/   NrG   rH   rK   rL   )rB   putr1   r2   r3   r4   r5   r6   r7   r:   r;   r%   rM   s                 r   test_update_entryz!TestUpdateEntry.test_update_entry   s	   %zz d!3 45./  
 &3&3&&&&3&&&&&&t&&&t&&&&&&3&&&&&&&yy{H~3!33~!33333~!3333~333!33333333r    c                   |j                  dddi      }|j                  }d}||k(  }|st        j                  d|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      d	z  }d
d|iz  }t        t        j                  |            dx}x}}y)uC   존재하지 않는 id 업데이트 시 404를 반환해야 한다.rc   r   u   변경r$   rd   r'   r)   r*   r+   rF   r/   N)
r   r1   r2   r3   r4   r5   r6   r7   r:   r;   re   s           r   test_update_entry_not_foundz+TestUpdateEntry.test_update_entry_not_found   s    zz3H%  
 &3&3&&&&3&&&&&&t&&&t&&&&&&3&&&&&&&r    NrU   rg   )rW   rX   rY   r   r   r   r    r   r   r      s    	4'r    r   c                      e Zd ZddZddZy)TestDeleteEntryc                   t        ||       |j                  d|d          }|j                  }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd	|iz  }t        t        j                  |            d
x}x}}|j                  d|d          }	|	j                  }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |	      rt        j                  |	      ndt        j                  |      t        j                  |      dz  }dd	|iz  }t        t        j                  |            d
x}x}}y
)uJ   DELETE /api/wiki/entries/{id}로 항목을 삭제할 수 있어야 한다.r]   r      r'   r)   r*   r+   rF   r/   Nrd   resp2)rB   deleter1   r2   r3   r4   r5   r6   r7   r:   r;   r`   )
rN   r   r!   r*   r=   r>   r?   r@   rA   r   s
             r   test_delete_entryz!TestDeleteEntry.test_delete_entry   s(   %}}1,t2D1EFG&3&3&&&&3&&&&&&t&&&t&&&&&&3&&&&&&&

/T0B/CDE  'C' C'''' C''''''u'''u''' '''C'''''''r    c                   |j                  d      }|j                  }d}||k(  }|st        j                  d|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}x}}y	)
u=   존재하지 않는 id 삭제 시 404를 반환해야 한다.rc   rd   r'   r)   r*   r+   rF   r/   N)
r   r1   r2   r3   r4   r5   r6   r7   r:   r;   re   s           r   test_delete_entry_not_foundz+TestDeleteEntry.test_delete_entry_not_found   s    }}DE&3&3&&&&3&&&&&&t&&&t&&&&&&3&&&&&&&r    NrU   rg   )rW   rX   rY   r   r   r   r    r   r   r      s    ('r    r   c                      e Zd ZddZy)TestApproveEntryc                   t        ||       |j                  d|d    d      }|j                  }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      nd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)uO   POST /api/wiki/entries/{id}/approve 후 status가 approved가 되어야 한다.r]   r   z/approver^   r'   r)   r*   r+   rF   r/   NstatusapprovedrG   rH   rK   rL   rB   r0   r1   r2   r3   r4   r5   r6   r7   r:   r;   r%   rM   s                 r   test_approve_entryz#TestApproveEntry.test_approve_entry   s    %{{/T0B/C8LM&3&3&&&&3&&&&&&t&&&t&&&&&&3&&&&&&&yy{H~++~++++~+++~++++++++++r    NrU   )rW   rX   rY   r   r   r    r   r   r          ,r    r   c                      e Zd ZddZy)TestRejectEntryc                   t        ||       |j                  d|d    d      }|j                  }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      nd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)uN   POST /api/wiki/entries/{id}/reject 후 status가 rejected가 되어야 한다.r]   r   z/rejectr^   r'   r)   r*   r+   rF   r/   Nr   rejectedrG   rH   rK   rL   r   rM   s                 r   test_reject_entryz!TestRejectEntry.test_reject_entry   s    %{{/T0B/C7KL&3&3&&&&3&&&&&&t&&&t&&&&&&3&&&&&&&yy{H~++~++++~+++~++++++++++r    NrU   )rW   rX   rY   r   r   r    r   r   r      r   r    r   c                      e Zd ZddZy)TestSearchEntriesc                   t        ||       |j                  d      }|j                  }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}x}}|j                         }	t        |	t              }|sd
dt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  |	      rt        j                  |	      nddt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }
t        t        j                  |
            d	}|	D cg c]  }|d   	 }}|d   }||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }t        t        j                  |            d	x}}y	c c}w )uN   GET /api/wiki/search?q=테스트 로 항목을 검색할 수 있어야 한다.u   /api/wiki/search?q=테스트r^   r'   r)   r*   r+   rF   r/   Nrm   rn   rO   ro   rp   r   inz%(py1)s in %(py3)sidsrI   rt   assert %(py5)sr.   )rB   r`   r1   r2   r3   r4   r5   r6   r7   r:   r;   r%   rn   ro   )rN   r   r!   r*   r=   r>   r?   r@   rA   rO   rR   r   r   rP   rQ   @py_format4s                   r   test_search_entriesz%TestSearchEntries.test_search_entries   s   %zz89&3&3&&&&3&&&&&&t&&&t&&&&&&3&&&&&&&yy{$%%%%%%%%z%%%z%%%%%%$%%%$%%%%%%%%%%%%%%%%%%%&*+dtDz++D!(!S((((!S(((!((((((S(((S((((((( ,s   KNrU   )rW   rX   rY   r   r   r    r   r   r      s    	)r    r   c                      e Zd ZddZy)	TestStatsc           	        t        ||       |j                  d      }|j                  }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}x}}|j                         }	d
}
|
|	v }|st        j                  d|fd|
|	f      t        j                  |
      dt        j                         v st        j                  |	      rt        j                  |	      nddz  }dd|iz  }t        t        j                  |            d	x}
}d}
|
|	v }|st        j                  d|fd|
|	f      t        j                  |
      dt        j                         v st        j                  |	      rt        j                  |	      nddz  }dd|iz  }t        t        j                  |            d	x}
}d}
|
|	v }|st        j                  d|fd|
|	f      t        j                  |
      dt        j                         v st        j                  |	      rt        j                  |	      nddz  }dd|iz  }t        t        j                  |            d	x}
}|	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   }
|
j                  }d}d} |||      }d}||k\  }|st        j                  d|fd||f      t        j                  |
      t        j                  |      t        j                  |      t        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d	x}
x}x}x}x}x}}y	)uK   GET /api/wiki/stats 는 total/by_category/by_status를 반환해야 한다.z/api/wiki/statsr^   r'   r)   r*   r+   rF   r/   Ntotalr   r   rO   r   r   r.   by_category	by_status   )>=)z%(py1)s >= %(py4)srH   rK   rL   r   r   )zS%(py9)s
{%(py9)s = %(py3)s
{%(py3)s = %(py1)s.get
}(%(py5)s, %(py7)s)
} >= %(py12)s)rI   rt   r.   r/   py9py12zassert %(py14)spy14r_   )rN   r   r!   r*   r=   r>   r?   r@   rA   rO   rP   rQ   r   rR   rS   @py_assert6@py_assert8@py_assert11@py_assert10@py_format13@py_format15s                        r   
test_statszTestStats.test_stats   s   %zz+,&3&3&&&&3&&&&&&t&&&t&&&&&&3&&&&&&&yy{w$w$w$$$}$$$$}$$$}$$$$$$$$$$$$$$$$"{d""""{d"""{""""""d"""d"""""""G}!!}!!!!}!!!}!!!!!!!!!!M"8"&&8x88&x38q83q88883q888"888&888x8888883888q88888888r    NrU   )rW   rX   rY   r   r   r    r   r   r      s    
9r    r   c                      e Zd ZddZy)TestBulkImportc           	     :   t        d      D cg c]  }d|dd| dd| d| d }}|j                  d	|
      }|j                  }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      nd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}}|
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c c}w )uQ   POST /api/wiki/import로 여러 항목을 일괄 import 할 수 있어야 한다.rk   zimport-rl   u   import 항목r   r   r   r   z/api/wiki/importr$   r^   r'   r)   r*   r+   rF   r/   NimportedrG   rH   rK   rL   r   )rw   r0   r1   r2   r3   r4   r5   r6   r7   r:   r;   r%   )rN   r   rx   ry   r*   r=   r>   r?   r@   rA   rO   rP   rQ   rR   rS   s                  r   test_bulk_importzTestBulkImport.test_bulk_import  s    1X
 QsG$qc/BP[klmnloip~  AB  @C  }D  E
 

 {{-G{<&3&3&&&&3&&&&&&t&&&t&&&&&&3&&&&&&&yy{J$1$1$$$$1$$$$$$1$$$$$$$G}!!}!!!!}!!!}!!!!!!!!!!
s   HNrg   )rW   rX   rY   r   r   r    r   r   r     s    "r    r   )r   r   r<   rV   returnrV   )!
__future__r   builtinsr4   _pytest.assertion.rewrite	assertionrewriter2   pytestfastapir   fastapi.testclientr   kakao_knowledge.wiki_apiwiki_apir   r   kakao_knowledge.wiki_storer   fixturer   r!   rB   rD   r[   ri   r   r   r   r   r   r   r   r   r    r   <module>r      s    "
    ) 2 + 0 , ,$ 	 	"0 0' ', B  BP' '4' '*, ,, ,
) 
)$9 9&" "r    