
    i%                         d 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      Z/home/jay/workspace/.worktrees/task-2116-dev1/tests/test_task_1044_1_archive_title_time.pyserver_modulez TestGetRecordsList.server_module   +     	3zK789    Nc                      t        |d      sJ y)u,   get_records_list 함수가 존재해야 함.get_records_listN)hasattr)r   r   s     r   test_function_existsz'TestGetRecordsList.test_function_exists   s    }&8999r   c                 J    |j                  d      }t        |t              sJ y)u   리스트를 반환해야 함.allN)r   
isinstancelist)r   r   results      r   test_returns_listz$TestGetRecordsList.test_returns_list!   s"    //6&$'''r   c                 ~    |j                  d      }t        |      dkD  rg d}|D ]  }||d   v rJ d| d        yy)u0   각 레코드에 필수 필드가 있어야 함.r   r   )filenametypetitlesizemodifiedend_timeu   필수 필드 'u   '가 없음N)r   len)r   r   r    required_fieldsfields        r   test_record_has_required_fieldsz2TestGetRecordsList.test_record_has_required_fields&   sX    //6v;?[O( Pq	)O_UG;+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   r)   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 ]H  }|j                  dd      }|sJ d|d           ||d   j                  dd      k7  r=J d	|d            y)
u%   제목이 비어있지 않아야 함.r   N
   r%    u   제목이 비어있음: r#   .mdu9   제목이 파일명과 동일함 (제목 추출 실패): )r   r.   replace)r   r   r    recordr%   s        r   test_title_not_emptyz'TestGetRecordsList.test_title_not_empty:   s    //6Sbk 	`FJJw+EI4VJ5G4HII5F:.66r  `J6R\K]J^_` 	`r   returnN)__name__
__module____qualname____doc__r1   fixturer   r   r!   r,   r3   r:    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 ]f  }d|j                  dd      v sd|d   v sJ |d   j                  dd      }t        |      dkD  sE|d   j	                         }|r[J d	|d
            y)u&   콜론 뒤 제목을 추출해야 함.reportN   u   완료 보고서:r%   r6   :   u#   콜론 뒤 제목이 비어있음: r#   )r   r.   splitr)   strip)r   r   r    r9   partsactual_titles         r   test_extracts_title_after_colonz3TestTitleExtraction.test_extracts_title_after_colonR   s    //9Raj 	dF"fjj"&==fWo---w--c15u:>#(8>>#3L'c+NvV`OaNb)cc<	dr   c                    |j                  d      }t        dz  }|j                         rt        |d      5 }t	        j
                  |      j                  di       }ddd       |dd D ]f  }|d   j                  d	d
      }|v s||   j                  dd
      }|s5d|j                  dd
      vsJ|d   |d   j                  d	d
      k7  rfJ  yy# 1 sw Y   yxY w)u;   콜론이 없으면 task-timers.json의 description 사용.r   memory/task-timers.jsonutf-8encodingtasksNr5   r#   r7   r6   descriptionrI   r%   r   r   existsopenjsonloadr.   r8   )	r   r   r    task_timers_pathftimersr9   task_iddescs	            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&2D2L2LUTV2WWWWX	 %7 7s   &CCr;   )	r=   r>   r?   r@   r1   rA   r   rO   ra   rB   r   r   rD   rD   E   s'    )^^ dXr   rD   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 ]T  }|d   j                  d	d
      }|v s||   j                  d      }|s4|j                  d      |k(  rIJ d|d            yy# 1 sw Y   gxY w)u1   task-timers.json의 end_time을 사용해야 함.r   rQ   rR   rS   rU   Nr5   r#   r7   r6   r(   u   end_time 불일치: rW   )	r   r   r    r\   r]   r^   r9   r_   expected_end_times	            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*59JJwNbcijtcubvLwwJx	 %7 7s   &CCc                 j   |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
      sJ d|d            y y# 1 sw Y   JxY w)u2   task-timers.json에 없으면 파일 mtime 사용.r   rQ   rR   rS   rU   Nr#   r7   r6   r(   u   end_time이 없음: rW   )r   r   r    r\   r^   r]   r9   r_   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*-Z1EfZFXEY/ZZ-	7 7s   &B))B2r;   )	r=   r>   r?   r@   r1   rA   r   rg   ri   rB   r   r   rc   rc   q   s&    +^^ x r   rc   c                   (    e Zd ZdZddZddZddZy)TestArchiveViewRenderingu#   ArchiveView.js 렌더링 테스트.Nc                 :    t         dz  }|j                         sJ y)u*   ArchiveView.js 파일이 존재해야 함.#dashboard/components/ArchiveView.jsN)r   rX   )r   r   s     r   test_component_file_existsz3TestArchiveViewRendering.test_component_file_exists   s    AA{{}}r   c                 Z    t         dz  }|j                  d      }d|v sd|v sJ d       yy)u$   end_time 필드를 사용해야 함.rm   rR   rS   z
r.end_timer(   u;   ArchiveView.js에서 end_time 필드를 사용하지 않음Nr   	read_textr   r   contents      r   test_uses_end_time_fieldz1TestArchiveViewRendering.test_uses_end_time_field   s@    AA..'.2 w&**?~A~~?*?&r   c                 n    t         dz  }|j                  d      }d|v sJ d       d|v rd|v sJ d       y	)
u2   날짜뿐만 아니라 시간도 표시해야 함.rm   rR   rS   toLocaleStringu:   toLocaleString 사용하지 않음 (시간 표시 안 됨)hourminuteu1   hour/minute 옵션 없음 (시간 표시 안 됨)Nrp   rr   s      r    test_displays_time_not_just_datez9TestArchiveViewRendering.test_displays_time_not_just_date   sS    AA..'.2  7*h,hh*  X%8m:mm8%8r   r;   )r=   r>   r?   r@   rn   rt   ry   rB   r   r   rk   rk      s    -
	nr   rk   c                        e Zd ZdZddZddZy)TestIntegrationu   통합 테스트.Nc                 F   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  rlg d	}|D ]  }||d   v rJ d
| d        d|d   vrt        j                  d       |dd D ]*  }|d   |d   j                  dd      k7  rJ d|d            yy# t        j                  $ r t        j                  d       Y w xY w)u/   API가 완전한 데이터를 반환해야 함.r   Ncurlz-sz-m5z*http://localhost:8000/api/records?type=allTr5   capture_outputtexttimeout   서버 실행 중 아님   API 응답 파싱 실패)r#   r$   r%   u   API 응답에 'u   ' 필드 없음r(   u3   서버 재시작 필요 (end_time 필드 미반영)rH   r%   r#   r7   r6   u"   제목이 파일명과 동일함: )
subprocessrun
returncodestdoutrL   r1   skiprZ   loadsJSONDecodeErrorr)   r8   )r   r   r    datarequiredr+   r9   s          r   test_api_returns_complete_dataz.TestIntegration.test_api_returns_complete_data   sK   S	   
 !)<)<)>KK23	4::fmm,D t9q=4H! RQ'Q?5')QQ'R a(QR r( Mg&*<*D*D2+  M7z8J7KLM M  ## 	4KK23	4s   C5 5(D D 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J d|d            y# t        j                  $ r t        j                  d       Y Sw xY w)u   빈 제목이 없어야 함.r   Nr}   Tr5   r   r   r   r%   r6   u   빈 제목: r#   )r   r   r   r   rL   r1   r   rZ   r   r   r.   )r   r   r    r   r9   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	> ## 	4KK23	4s   B# #(CCr;   )r=   r>   r?   r@   r   r   rB   r   r   r{   r{      s    !MF>r   r{   )r@   rZ   osr   pathlibr   r1   environr.   r   r   rD   rc   rk   r{   rB   r   r   <module>r      sq   
  	   "**..!13HIJ
2` 2`j)X )XX- -`n n8;> ;>r   