
    i%                         d Z ddlZddlmc mZ ddlZddlZddl	m	Z	 ddl
mZ ddlZ eej                  j                  dd            Z G d d      Z G d	 d
      Z G d d      Z G d d      Z G d d      Zy)u   task-1044.1: 대시보드 기록 탭 제목 통일 + 완료 시간 표시 테스트

server.py의 get_records_list()와 ArchiveView.js의 수정을 검증합니다.
    N)datetime)PathWORKSPACE_ROOTz/home/jay/workspacec                   \    e Zd ZdZej
                  d        Zd	dZd	dZd	dZ	d	dZ
d	dZy)
TestGetRecordsListu$   get_records_list() 함수 테스트.c                 n    ddl }|j                  j                  dt        t        dz               ddl}|S u   dashboard.server 모듈 로드.r   N	dashboardsyspathinsertstr
_WORKSPACEserverselfr   r   s      @/home/jay/workspace/tests/test_task_1044_1_archive_title_time.pyserver_modulez TestGetRecordsList.server_module   +     	3zK789    Nc                    d}t        ||      }|sd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  }t        t        j                  |            dx}}y)u,   get_records_list 함수가 존재해야 함.get_records_listz5assert %(py5)s
{%(py5)s = %(py0)s(%(py1)s, %(py3)s)
}hasattrr   )py0py1py3py5N)r   @py_builtinslocals
@pytest_ar_should_repr_global_name	_safereprAssertionError_format_explanation)r   r   @py_assert2@py_assert4@py_format6s        r   test_function_existsz'TestGetRecordsList.test_function_exists   s}    &89w}&899999999w999w999999}999}999&89999999999r   c                 f   |j                  d      }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}y)u   리스트를 반환해야 함.allz5assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}
isinstanceresultlist)r   r   py2py4N)
r   r,   r.   r   r    r!   r"   r#   r$   r%   )r   r   r-   @py_assert3@py_format5s        r   test_returns_listz$TestGetRecordsList.test_returns_list!   s    //6&$''''''''z'''z''''''&'''&''''''$'''$''''''''''r   c                    |j                  d      }t        |      dkD  rg d}|D ]  }|d   }||v }|st        j                  d|fd||f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }t        j                  d| d	      d
z   d|iz  }t        t        j                  |            dx}} yy)u0   각 레코드에 필수 필드가 있어야 함.r+   r   )filenametypetitlesizemodifiedend_timeinz%(py0)s in %(py3)sfieldr   r   u   필수 필드 'u   '가 없음
>assert %(py5)sr   N)r   lenr!   _call_reprcomparer   r    r"   r#   _format_assertmsgr$   r%   )	r   r   r-   required_fieldsr>   r&   @py_assert1@py_format4r(   s	            r   test_record_has_required_fieldsz2TestGetRecordsList.test_record_has_required_fields&   s    //6v;?[O( P &q	Ou	)OOOu	OOOOOOuOOOuOOO	OOO_UG;+OOOOOOOP r   c                     |j                  d      }t        |      dkD  r.|d   j                  d      }|r	 t        j                  |       yyy# t
        $ r t        j                  d|        Y yw xY w)u$   end_time이 ISO format이어야 함.r+   r   r:   u"   end_time이 ISO format이 아님: N)r   rA   getr   fromisoformat
ValueErrorpytestfail)r   r   r-   r:   s       r   test_end_time_is_iso_formatz.TestGetRecordsList.test_end_time_is_iso_format.   sw    //6v;?ay}}Z0HQ**84   " QKK"DXJ OPQs   A !A32A3c           
         |j                  d      }|dd D ]  }|j                  dd      }|st        j                  d|d          dz   d	dt	        j
                         v st        j                  |      rt        j                  |      ndiz  }t        t        j                  |            |d   }|j                  }d
}d}	 |||	      }
||
k7  }|st        j                  d|fd||
f      dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      t        j                  |	      t        j                  |
      dz  }t        j                  d|d          dz   d|iz  }t        t        j                  |            dx}x}x}x}x}	}
 y)u%   제목이 비어있지 않아야 함.r+   N
   r7    u   제목이 비어있음: r5   
>assert %(py0)sr   .md!=)zX%(py0)s != %(py11)s
{%(py11)s = %(py5)s
{%(py5)s = %(py3)s.replace
}(%(py7)s, %(py9)s)
})r   r   r   py7py9py11u9   제목이 파일명과 동일함 (제목 추출 실패): z
>assert %(py13)spy13)r   rI   r!   rC   r   r    r"   r#   r$   r%   replacerB   )r   r   r-   recordr7   @py_format1r&   r'   @py_assert6@py_assert8@py_assert10rE   @py_format12@py_format14s                 r   test_title_not_emptyz'TestGetRecordsList.test_title_not_empty:   s   //6Sbk 	`FJJw+EII4VJ5G4HIIIIIII5III5IIIII":. `.66 ```6r `5   ` `N_N_`5  ` `Y_Y_` `G_G_  ` `V_V_  ` `V_V_ / ` `V_V_ 7 ` `V_V_ ` `V_V_ ` `V_V_ ` `N_N_J6R\K]J^_` ` `L_L_` ` `	`r   returnN)__name__
__module____qualname____doc__rL   fixturer   r)   r3   rG   rN   rb    r   r   r   r      s7    .^^ :(
P
Q`r   r   c                   D    e Zd ZdZej
                  d        ZddZddZy)TestTitleExtractionu   제목 추출 로직 테스트.c                 n    ddl }|j                  j                  dt        t        dz               ddl}|S r	   r   r   s      r   r   z!TestTitleExtraction.server_moduleH   r   r   Nc                    |j                  d      }|dd D ]P  }d|j                  dd      v sd}|d   }||v }|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      }	t        |	      dkD  s|	d   j                         }
|
rt        j                  d|d          dz   ddt        j                         v st        j                  |
      rt        j                  |
      ndiz  }t        t        j                  |             y)u&   콜론 뒤 제목을 추출해야 함.reportN   u   완료 보고서:r7   rQ   :r;   )z%(py1)s in %(py4)s)r   r0   zassert %(py6)spy6   u#   콜론 뒤 제목이 비어있음: r5   rR   r   actual_title)r   rI   r!   rB   r#   r$   r%   splitrA   striprC   r   r    r"   )r   r   r-   r[   @py_assert0r1   r&   r2   @py_format7partsrt   r\   s               r   test_extracts_title_after_colonz3TestTitleExtraction.test_extracts_title_after_colonR   s   //9Raj 	dF"fjj"&==-fWo-so----so---s---o-------w--c15u:>#(8>>#3L'cc+NvV`OaNb)ccccccc<ccc<ccccc	dr   c           
      z   |j                  d      }t        dz  }|j                         rt        |d      5 }t	        j
                  |      j                  di       }ddd       |dd D ]>  }|d   j                  d	d
      }|v s||   j                  dd
      }|s6d|j                  dd
      vsK|d   }	|d   }
|
j                  }d	}d
} |||      }|	|k7  }|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}}A yy# 1 sw Y   SxY w)u;   콜론이 없으면 task-timers.json의 description 사용.r+   memory/task-timers.jsonutf-8encodingtasksNrP   r5   rS   rQ   descriptionrq   r7   rT   zY%(py1)s != %(py12)s
{%(py12)s = %(py6)s
{%(py6)s = %(py4)s.replace
}(%(py8)s, %(py10)s)
}r   r0   rr   py8py10py12zassert %(py14)spy14)r   r   existsopenjsonloadrI   rZ   r!   rB   r#   r$   r%   )r   r   r-   task_timers_pathftimersr[   task_iddescrw   r1   @py_assert5@py_assert7@py_assert9@py_assert11r&   @py_format13@py_format15s                     r   test_fallback_to_descriptionz0TestTitleExtraction.test_fallback_to_description_   s{   //6%(AA""$&9 7Q1))'267 !"+ X ,44UB?f$!'?..}bAD6::gr+B B%gW&2DW2D2L2LWUWTVW2LUTV2WW2WWWWW2WWWWWWW2DWWW2LWWWUWWWTVWWW2WWWWWWWWWX	 %7 7s   &F00F:rc   )	re   rf   rg   rh   rL   ri   r   rz   r   rj   r   r   rl   rl   E   s'    )^^ dXr   rl   c                   D    e Zd ZdZej
                  d        ZddZddZy)TestEndTimeExtractionu!   end_time 추출 로직 테스트.c                 n    ddl }|j                  j                  dt        t        dz               ddl}|S r	   r   r   s      r   r   z#TestEndTimeExtraction.server_modulet   r   r   Nc           	         |j                  d      }t        dz  }|j                         rt        |d      5 }t	        j
                  |      j                  di       }ddd       |dd D ]x  }|d   j                  d	d
      }|v s||   j                  d      }|s5|j                  }	d}
 |	|
      }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |	      t        j                  |
      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }t        j                  d|d          dz   d|iz  }t        t        j                   |            dx}	x}
x}}{ yy# 1 sw Y   xY w)u1   task-timers.json의 end_time을 사용해야 함.r+   r|   r}   r~   r   NrP   r5   rS   rQ   r:   )==)zI%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.get
}(%(py4)s)
} == %(py8)sr[   expected_end_time)r   r/   r0   rr   r   u   end_time 불일치: z
>assert %(py10)sr   )r   r   r   r   r   r   rI   rZ   r!   rB   r   r    r"   r#   rC   r$   r%   )r   r   r-   r   r   r   r[   r   r   rE   r1   r   r   @py_format9@py_format11s                  r   test_uses_task_timers_end_timez4TestEndTimeExtraction.test_uses_task_timers_end_time~   s   //6%(AA""$&9 7Q1))'267 !"+ x ,44UB?f$(.w(;(;J(G%(%zzw*wz*5w59JJwww59Jwwwwwwvwwwvwwwzwww*www5wwwwww9Jwww9JwwwwNbcijtcubvLwwwwwwwwx	 %7 7s   &G**G4c                    |j                  d      }t        dz  }i }|j                         r;t        |d      5 }t	        j
                  |      j                  di       }ddd       |D ]  }|d   j                  dd	      }||vs|j                  }d
}	 ||	      }
|
st        j                  d|d          dz   dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |	      t        j                  |
      dz  }t        t        j                  |            dx}x}	}
 y y# 1 sw Y   xY w)u2   task-timers.json에 없으면 파일 mtime 사용.r+   r|   r}   r~   r   Nr5   rS   rQ   r:   u   end_time이 없음: zG
>assert %(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.get
}(%(py4)s)
}r[   )r   r/   r0   rr   )r   r   r   r   r   r   rI   rZ   r!   rC   r   r    r"   r#   r$   r%   )r   r   r-   r   r   r   r[   r   rE   r1   r   rx   s               r   test_fallback_to_mtimez,TestEndTimeExtraction.test_fallback_to_mtime   s%   //6 &(AA""$&9 7Q1))'267  	FZ(00;Gf$zzZ*Zz*-Z-ZZ1EfZFXEY/ZZZZZZZvZZZvZZZzZZZ*ZZZ-ZZZZZZ	7 7s   &E&&E0rc   )	re   rf   rg   rh   rL   ri   r   r   r   rj   r   r   r   r   q   s&    +^^ x r   r   c                   (    e Zd ZdZddZddZddZy)TestArchiveViewRenderingu#   ArchiveView.js 렌더링 테스트.Nc                 b   t         dz  }|j                  } |       }|sddt        j                         v st	        j
                  |      rt	        j                  |      ndt	        j                  |      t	        j                  |      dz  }t        t	        j                  |            dx}}y)u*   ArchiveView.js 파일이 존재해야 함.#dashboard/components/ArchiveView.jszAassert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}r   )r   r/   r0   N)	r   r   r   r    r!   r"   r#   r$   r%   )r   r   rE   r1   r2   s        r   test_component_file_existsz3TestArchiveViewRendering.test_component_file_exists   sd    AA{{{}}tt{}r   c                 \   t         dz  }|j                  d      }g }d}||v }|}|sd}||v }|}|snt        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  }
|j                  |
       |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  }|j                  |       t        j                  |d      i z  }t        j                  d      dz   d|iz  }t        t        j                  |            dx}x}x}x}x}}y)u$   end_time 필드를 사용해야 함.r   r}   r~   z
r.end_timer:   r;   z%(py3)s in %(py5)scontentr   r   %(py7)srV   z%(py10)s in %(py12)sr   r   %(py14)sr   rs   u;   ArchiveView.js에서 end_time 필드를 사용하지 않음
>assert %(py17)spy17N)r   	read_textr!   rB   r#   r   r    r"   append_format_booloprC   r$   r%   )r   r   r   rE   r&   r'   rw   r   r   r(   @py_format8r   r   @py_format16@py_format18s                  r   test_uses_end_time_fieldz1TestArchiveViewRendering.test_uses_end_time_field   s    AA..'.2 	|~|w&~*~**?~~~~|w~~~|~~~~~~w~~~w~~~~~~~*~~~*~~~~~~~~~~~~~~~~~~~A~~~~~~~~r   c                    t         dz  }|j                  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  }t        j                  d	      d
z   d|iz  }t        t        j                  |            dx}}g }d}||v }|}|rd}	|	|v }
|
}|snt        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  }|j                  |       |rt        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  }|j                  |       t        j                  |d      i z  }t        j                  d      dz   d|iz  }t        t        j                  |            dx}x}x}x}x}	}
y)u2   날짜뿐만 아니라 시간도 표시해야 함.r   r}   r~   toLocaleStringr;   )z%(py1)s in %(py3)sr   )r   r   u:   toLocaleString 사용하지 않음 (시간 표시 안 됨)r@   r   Nhourminuter   r   r   rV   r   r   r   r   r   u1   hour/minute 옵션 없음 (시간 표시 안 됨)r   r   )r   r   r!   rB   r#   r   r    r"   rC   r$   r%   r   r   )r   r   r   rw   r&   rF   r(   rE   r'   r   r   r   r   r   r   r   s                   r    test_displays_time_not_just_datez9TestArchiveViewRendering.test_displays_time_not_just_date   s[   AA..'.2  h7*hhh7hhhhhhhhh7hhh7hhhh,hhhhhhh 	nvmv mXmX%8mmmmvmmmvmmmmmmmmmmmmmmmmXmmmXmmmmmmmmmmmmmmmmmmm:mmmmmmmmr   rc   )re   rf   rg   rh   r   r   r   rj   r   r   r   r      s    -
	nr   r   c                        e Zd ZdZddZddZy)TestIntegrationu   통합 테스트.Nc           
      ~   ddl }|j                  g dddd      }|j                  dk7  s|j                  j	                         st        j                  d       	 t        j                  |j                        }t              dkD  rg d	}|D ]  }|d   }||v }|st        j                  d
|fd||f      dt        j                         v st        j                  |      rt        j                   |      ndt        j                   |      dz  }t        j"                  d| d      dz   d|iz  }	t%        t        j&                  |	            dx}} d|d   vrt        j                  d       |dd D ]  }
|
d   }|
d   }|j(                  }d}d} |||      }||k7  }|st        j                  d|fd||f      t        j                   |      t        j                   |      t        j                   |      t        j                   |      t        j                   |      t        j                   |      dz  }t        j"                  d|
d          dz   d|iz  }t%        t        j&                  |            dx}x}x}x}x}x}} yy# t        j                  $ r t        j                  d       Y Aw xY w)u/   API가 완전한 데이터를 반환해야 함.r   Ncurlz-sz-m5z*http://localhost:8000/api/records?type=allTrP   capture_outputtexttimeout   서버 실행 중 아님   API 응답 파싱 실패)r5   r6   r7   r;   r=   r>   r?   u   API 응답에 'u   ' 필드 없음r@   r   r:   u3   서버 재시작 필요 (end_time 필드 미반영)rp   r7   r5   rS   rQ   rT   r   r   u"   제목이 파일명과 동일함: z
>assert %(py14)sr   )
subprocessrun
returncodestdoutrv   rL   skipr   loadsJSONDecodeErrorrA   r!   rB   r   r    r"   r#   rC   r$   r%   rZ   )r   r   r-   datarequiredr>   r&   rE   rF   r(   r[   rw   r1   r   r   r   r   r   r   s                      r   test_api_returns_complete_dataz.TestIntegration.test_api_returns_complete_data   s   S	   
 !)<)<)>KK23	4::fmm,D t9q=4H! R $QQu'QQQuQQQQQQuQQQuQQQQQQ?5')QQQQQQQR a(QR r( Mg M&*< M*<*D*D MMM*D2+ M +  M;L;LM + M MCL9 ' M MCL9 += M MCL9 +E M MCL9 M MCL9 M MCL9+ M M;L;L7z8J7KLM M M9L9LM M M MM  ## 	4KK23	4s   J (J<;J<c                    ddl }|j                  g dddd      }|j                  dk7  s|j                  j	                         st        j                  d       	 t        j                  |j                        }D ]  }|j                  d	d
      }|rt        j                  d|d          dz   dd	t        j                         v st        j                  |      rt        j                   |      nd	iz  }t#        t        j$                  |             y# t        j                  $ r t        j                  d       Y w xY w)u   빈 제목이 없어야 함.r   Nr   TrP   r   r   r   r7   rQ   u   빈 제목: r5   rR   r   )r   r   r   r   rv   rL   r   r   r   r   rI   r!   rC   r   r    r"   r#   r$   r%   )r   r   r-   r   r[   r7   r\   s          r   test_no_empty_titlesz$TestIntegration.test_no_empty_titles   s    S	   
 !)<)<)>KK23	4::fmm,D  	>FJJw+E==L
);(<=======5===5=====	> ## 	4KK23	4s   D (EErc   )re   rf   rg   rh   r   r   rj   r   r   r   r      s    !MF>r   r   )rh   builtinsr   _pytest.assertion.rewrite	assertionrewriter!   r   osr   pathlibr   rL   environrI   r   r   rl   r   r   r   rj   r   r   <module>r      su   
   	   "**..!13HIJ
2` 2`j)X )XX- -`n n8;> ;>r   