Ë
    Ì
âiØs  ã                   ó4  — d Z ddlZddlZddlmZ ddlmZmZm	Z	 ddl
m
Z
  G d„ d«      Zedk(  ri ee«      j                  j                  j                  Z e ee«      «      Zd	d
dddddddddœgdddddœgdœZej'                  e¬«      Z ede› �«       yy)zm
Coverage Reporter - Generates comprehensive coverage reports for API, Database, Model-Schema, and Migration
é    N)ÚPath)ÚDictÚOptionalÚList)Údatetimec                   ó¬  — e Zd ZdZdefd„Z	 	 	 	 	 	 	 ddee   dee   dee   dee   d	ee   d
ee   dee   defd„Z		 	 	 	 	 	 	 	 ddee   dee   dee   dee   d	ee   d
ee   dee   dedefd„Z
dedefd„Zdedefd„Zdedefd„Zdedefd„Zdedefd„Zdedefd„Zdedefd„Zdee   dee   dee   dee   d	ee   d
ee   dee   dedefd„Zy)ÚCoverageReporterz(Generates comprehensive coverage reportsÚproject_dirc                 óŠ   — t        |«      | _        | j                  dz  dz  | _        | j                  j                  d¬«       y )NÚtestsÚreportsT)Úexist_ok)r   r
   Úreports_dirÚmkdir)Úselfr
   s     ú</home/factor_ks/STREAMA2026/tests/utils/coverage_reporter.pyÚ__init__zCoverageReporter.__init__   s>   € Ü Ó,ˆÔØ×+Ñ+¨gÑ5¸	ÑAˆÔØ×Ñ×Ñ¨ÐÕ-ó    NÚapi_coverageÚdb_coverageÚmodel_schema_coverageÚmigration_consistencyÚschema_payload_issuesÚdatabase_consistency_issuesÚpermissions_summaryÚreturnc           
      óú  — t        j                  «       j                  d«      }| j                  ||||||||«      }	| j	                  ||||||||«      }
| j
                  d|› d�z  }| j
                  d|› d�z  }t        |dd¬«      5 }|j                  |	«       ddd«       t        |dd¬«      5 }|j                  |
«       ddd«       | j
                  d	z  }| j
                  d
z  }t        |dd¬«      5 }|j                  |	«       ddd«       t        |dd¬«      5 }|j                  |
«       ddd«       t        |«      S # 1 sw Y   ŒªxY w# 1 sw Y   ŒŽxY w# 1 sw Y   ŒTxY w# 1 sw Y   t        |«      S xY w)zCGenerate comprehensive coverage report in HTML and Markdown formatsz%Y%m%d_%H%M%Szcoverage-report-z.htmlz.mdÚwzutf-8)ÚencodingNzcoverage-report-latest.htmlzcoverage-report-latest.md)	r   ÚnowÚstrftimeÚ_generate_html_reportÚ_generate_markdown_reportr   ÚopenÚwriteÚstr)r   r   r   r   r   r   r   r   Ú	timestampÚhtml_reportÚ	md_reportÚ	html_fileÚmd_fileÚfÚlatest_htmlÚ	latest_mds                   r   Úgenerate_comprehensive_reportz.CoverageReporter.generate_comprehensive_report   s¥  € ô —L‘L“N×+Ñ+¨OÓ<ˆ	ð ×0Ñ0Ø˜+Ð'<Ð>SÐUjð  mHð  J]ð  _hó
ˆð
 ×2Ñ2Ø˜+Ð'<Ð>SØ!Ð#>Ð@SÐU^ó
ˆ	ð ×$Ñ$Ð)9¸)¸ÀEÐ'JÑJˆ	Ø×"Ñ"Ð'7¸	°{À#Ð%FÑFˆä�)˜S¨7Ô3ð 	!°qØ�G‰G�KÔ ÷	!ô �'˜3¨Ô1ð 	°QØ�G‰G�IÔ÷	ð ×&Ñ&Ð)FÑFˆØ×$Ñ$Ð'BÑBˆ	ä�+˜s¨WÔ5ð 	!¸Ø�G‰G�KÔ ÷	!ô �)˜S¨7Ô3ð 	°qØ�G‰G�IÔ÷	ô �9‹~Ð÷!	!ð 	!ú÷	ð 	ú÷	!ð 	!ú÷	ô �9‹~Ðús0   ÂEÂ0EÃ6EÄE'ÅEÅEÅE$Å'E:r'   c	                 ó–  — dt        j                  «       j                  d«      › d�}	|r|	| j                  |«      z  }	|r|	| j	                  |«      z  }	|r|	| j                  |«      z  }	|r|	| j                  |«      z  }	|r(|	| j                  |«      z  }	|	| j                  |«      z  }	|rd|vr|	| j                  |«      z  }	|	dz  }	|	S )zGenerate HTML coverage reportuÔ  <!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>StreamA2026 Coverage Report</title>
    <style>
        body {
            font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
            max-width: 1200px;
            margin: 0 auto;
            padding: 20px;
            background-color: #f5f5f5;
        }
        .header {
            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
            color: white;
            padding: 30px;
            border-radius: 10px;
            margin-bottom: 30px;
        }
        .header h1 {
            margin: 0;
            font-size: 2em;
        }
        .header .timestamp {
            opacity: 0.8;
            margin-top: 10px;
        }
        .section {
            background: white;
            padding: 25px;
            border-radius: 10px;
            margin-bottom: 20px;
            box-shadow: 0 2px 4px rgba(0,0,0,0.1);
        }
        .section h2 {
            margin-top: 0;
            color: #333;
            border-bottom: 2px solid #667eea;
            padding-bottom: 10px;
        }
        .metric {
            display: inline-block;
            margin: 10px 20px 10px 0;
            padding: 15px 20px;
            background: #f8f9fa;
            border-radius: 8px;
            min-width: 150px;
        }
        .metric .label {
            font-size: 0.85em;
            color: #666;
            text-transform: uppercase;
        }
        .metric .value {
            font-size: 1.8em;
            font-weight: bold;
            color: #333;
        }
        .metric.success .value {
            color: #28a745;
        }
        .metric.warning .value {
            color: #ffc107;
        }
        .metric.error .value {
            color: #dc3545;
        }
        table {
            width: 100%;
            border-collapse: collapse;
            margin-top: 15px;
        }
        th, td {
            padding: 12px;
            text-align: left;
            border-bottom: 1px solid #ddd;
        }
        th {
            background-color: #f8f9fa;
            font-weight: 600;
        }
        tr:hover {
            background-color: #f5f5f5;
        }
        .badge {
            padding: 4px 8px;
            border-radius: 4px;
            font-size: 0.85em;
            font-weight: 600;
        }
        .badge-success {
            background-color: #d4edda;
            color: #155724;
        }
        .badge-warning {
            background-color: #fff3cd;
            color: #856404;
        }
        .badge-danger {
            background-color: #f8d7da;
            color: #721c24;
        }
        .endpoint-list {
            max-height: 300px;
            overflow-y: auto;
            background: #f8f9fa;
            padding: 15px;
            border-radius: 5px;
        }
        .endpoint-item {
            padding: 8px;
            border-bottom: 1px solid #ddd;
        }
        .endpoint-item:last-child {
            border-bottom: none;
        }
        .method {
            display: inline-block;
            padding: 2px 6px;
            border-radius: 3px;
            font-size: 0.8em;
            font-weight: bold;
            margin-right: 8px;
        }
        .method-GET { background: #61affe; color: white; }
        .method-POST { background: #49cc90; color: white; }
        .method-PUT { background: #fca130; color: white; }
        .method-DELETE { background: #f93e3e; color: white; }
        .method-PATCH { background: #50e3c2; color: white; }
    </style>
</head>
<body>
    <div class="header">
        <h1>ðŸ“Š StreamA2026 Coverage Report</h1>
        <div class="timestamp">Generated: ú%Y-%m-%d %H:%M:%Sz</div>
    </div>
Úerrorz
</body>
</html>
)
r   r    r!   Ú_generate_api_coverage_htmlÚ_generate_db_coverage_htmlÚ$_generate_model_schema_coverage_htmlÚ$_generate_migration_consistency_htmlÚ(_generate_schema_payload_validation_htmlÚ#_generate_database_consistency_htmlÚ_generate_permissions_html)
r   r   r   r   r   r   r   r   r'   Úhtmls
             r   r"   z&CoverageReporter._generate_html_reportA   s  € ðH+ôP ,4¯<©<«>×+BÑ+BÐCVÓ+WÐ*Xð YðQJˆñZ Ø�D×4Ñ4°\ÓBÑBˆDñ Ø�D×3Ñ3°KÓ@Ñ@ˆDñ !Ø�D×=Ñ=Ð>SÓTÑTˆDñ !Ø�D×=Ñ=Ð>SÓTÑTˆDñ !Ø�D×AÑAÐBWÓXÑXˆDà�D×<Ñ<Ð=XÓYÑYˆDñ  7Ð2EÑ#EØ�D×3Ñ3Ð4GÓHÑHˆDàð ñ 	ˆð ˆr   Úcoveragec                 ó^  — dj                  |d   |d   dk\  rdn|d   dk\  rdnd|d	   |d   › d
�|d   dk  rdnd|d   |d   › d
�d|j                  dd«      |j                  dd«      › d
�d|d   «      }|j                  dd«      dkD  rv|j                  d«      re|dz  }|d   D ]S  }t        j                  t	        |d   «      «      }t        j                  t	        |d   «      «      }|d|› d|› d|› d�z  }ŒU |dz  }|d   re|dz  }|d   D ]S  }t        j                  t	        |d   «      «      }t        j                  t	        |d   «      «      }|d|› d|› d|› d�z  }ŒU |dz  }|j                  d«      r,|d z  }|d   D ]  }|d|d   › d|d   › d|d   › d!�z  }Œ |dz  }|d"z  }|S )#z"Generate API coverage section HTMLu÷  
    <div class="section">
        <h2>ðŸ”Œ API Endpoint Coverage</h2>
        <div class="metric">
            <div class="label">Total Endpoints</div>
            <div class="value">{}</div>
        </div>
        <div class="metric {}">
            <div class="label">Covered</div>
            <div class="value">{} ({})</div>
        </div>
        <div class="metric {}">
            <div class="label">Unused</div>
            <div class="value">{} ({})</div>
        </div>
        <div class="metric {}">
            <div class="label">Intentionally Unused</div>
            <div class="value">{} ({})</div>
        </div>
        <div class="metric {}">
            <div class="label">New</div>
            <div class="value">{}</div>
        </div>
Útotal_backend_endpointsÚcovered_percentageéZ   ÚsuccesséF   Úwarningr2   Úcovered_countú%Úunused_percentageé
   Úunused_countÚinfoÚintentionally_unused_countr   Úintentionally_unused_percentageÚnew_endpoints_countÚnew_endpointsuI   
        <h3>ðŸ†• New Endpoints</h3>
        <div class="endpoint-list">
ÚmethodÚpathúT
            <div class="endpoint-item">
                <span class="method method-ú">ú</span>
                <code>zX</code>
                <span class="badge badge-success">NEW</span>
            </div>
ú
        </div>
Úunused_endpointsuc   
        <h3>âš ï¸� Unused Endpoints (may be intentional)</h3>
        <div class="endpoint-list">
z[</code>
                <span class="badge badge-warning">UNUSED</span>
            </div>
Úintentionally_unused_endpointsud   
        <h3>ðŸ”§ Intentionally Unused (Internal Features)</h3>
        <div class="endpoint-list">
zZ</code>
                <span class="badge badge-info">INTERNAL</span>
            </div>
ú
    </div>
)ÚformatÚgetÚhtml_escapeÚescaper&   )r   r;   r:   ÚendpointrM   rN   s         r   r3   z,CoverageReporter._generate_api_coverage_htmlù   s¿  € ð÷. �FØÐ.Ñ/Ø!Ð"6Ñ7¸2Ò=‰IÐPXÐYmÑPnÐrtÒPtÁ9ð  {BØ�_Ñ%ØÐ,Ñ-Ð.¨aÐ0Ø!Ð"5Ñ6¸"Ò<‰IÀ'Ø�^Ñ$ØÐ+Ñ,Ð-¨QÐ/ØØ�L‰LÐ5°qÓ9Ø�|‰|Ð=¸qÓAÐBÀ!ÐDØØÐ*Ñ+ó
ð/ 	ðL �<‰<Ð-¨qÓ1°AÒ5¸(¿,¹,ÀÔ:WØð ñ ˆDð % _Ñ5ò 	�Ü$×+Ñ+¬C°¸Ñ0BÓ,CÓD�Ü"×)Ñ)¬#¨h°vÑ.>Ó*?Ó@�Øð ,à,2¨8°2°f°Xð >Ø�fð ðñ ‘ð	ð ð ñ ˆDð Ð&Ò'Øð ñ ˆDð %Ð%7Ñ8ò 	�Ü$×+Ñ+¬C°¸Ñ0BÓ,CÓD�Ü"×)Ñ)¬#¨h°vÑ.>Ó*?Ó@�Øð ,à,2¨8°2°f°Xð >Ø�fð ðñ ‘ð	ð ð ñ ˆDð
 �<‰<Ð8Ô9Øð ñ ˆDð %Ð%EÑFò �Øð ,à,4°XÑ,>Ð+?¸rÀ(È8ÑBTÐAUð VØ Ñ'Ð(ð )ðñ ‘ðð ð ñ ˆDð 	ð ñ 	ˆð ˆr   c                 óÐ   — dj                  |j                  dd«      |j                  dd«      «      }|j                  d«      r|dz  }|d   D ]  }|d|› d�z  }Œ |d	z  }|d
z  }|S )z'Generate database coverage section HTMLua  
    <div class="section">
        <h2>ðŸ—„ï¸� Database Schema Coverage</h2>
        <div class="metric">
            <div class="label">Total Tables</div>
            <div class="value">{}</div>
        </div>
        <div class="metric success">
            <div class="label">Tables in DB</div>
            <div class="value">{}</div>
        </div>
Útotal_tablesúN/AÚtables_in_dbÚmissing_tablesum   
        <h3>â�Œ Missing Tables</h3>
        <table>
            <tr><th>Table Name</th><th>Status</th></tr>
z
            <tr><td><code>zJ</code></td><td><span class="badge badge-danger">MISSING</span></td></tr>
ú
        </table>
rU   )rV   rW   )r   r;   r:   Útables       r   r4   z+CoverageReporter._generate_db_coverage_html^  s°   € ð÷ �FØ�L‰L˜¨Ó/Ø�L‰L˜¨Ó/ó
ð 	ð  �<‰<Ð(Ô)Øð ñ ˆDð
 "Ð"2Ñ3ò �Øð Ø ˜'ð "ðñ ‘ðð ð ñ ˆDð 	ð ñ 	ˆð ˆr   c           
      ó  — dj                  |d   |d   |d   dk\  rdn|d   dk\  rdnd	|d
   |d   › d�«      }|d   rA|dz  }|d   j                  «       D ]!  \  }}|D ]  }|d|› d|d   › d|d   › d�z  }Œ Œ# |dz  }|dz  }|S )z+Generate model-schema coverage section HTMLuÝ  
    <div class="section">
        <h2>ðŸ“‹ Model-Schema Coverage</h2>
        <div class="metric">
            <div class="label">Total Models</div>
            <div class="value">{}</div>
        </div>
        <div class="metric">
            <div class="label">Total Fields</div>
            <div class="value">{}</div>
        </div>
        <div class="metric {}">
            <div class="label">Coverage</div>
            <div class="value">{} ({})</div>
        </div>
Útotal_modelsÚtotal_model_fieldsÚcoverage_percentager?   r@   rA   rB   r2   Úcovered_fieldsrD   Úmissing_from_schemasu�   
        <h3>â�Œ Fields Missing from Schemas</h3>
        <table>
            <tr><th>Model</th><th>Field</th><th>Type</th></tr>
z
            <tr><td>z</td><td><code>Únamez</code></td><td>Útypez</td></tr>
r`   rU   )rV   Úitems)r   r;   r:   Ú
model_nameÚfieldsÚfields         r   r5   z5CoverageReporter._generate_model_schema_coverage_htmlƒ  s  € ð÷ �FØ�^Ñ$ØÐ)Ñ*Ø!Ð"7Ñ8¸BÒ>‰IÐQYÐZoÑQpÐtvÒQvÁIð  }DØÐ%Ñ&ØÐ-Ñ.Ð/¨qÐ1ó
ð 	ð. Ð*Ò+Øð ñ ˆDð
 '/Ð/EÑ&F×&LÑ&LÓ&Nò Ñ"�
˜FØ#ò �EØð !Ø�L °°f±¨Ð>NÈuÐU[É}Èoð ^ðñ ‘Dñðð
 ð ñ ˆDð 	ð ñ 	ˆð ˆr   c           	      ó`  — |d   rdn|d   rdnd}dj                  ||d   rdn|d   rdnd	|j                  d
d«      |j                  dd«      |d   «      }|d   d   rJ|dj                  |d   d   «      z  }d|d   v r)|dj                  dj                  |d   d   «      «      z  }|dz  }|S )z+Generate migration consistency section HTMLÚis_up_to_dater@   Úneeds_upgraderB   r2   ug  
    <div class="section">
        <h2>ðŸ”„ Migration Consistency</h2>
        <div class="metric {}">
            <div class="label">Status</div>
            <div class="value">{}</div>
        </div>
        <div class="metric">
            <div class="label">Current Version</div>
            <div class="value">{}</div>
        </div>
        <div class="metric">
            <div class="label">Latest Migration</div>
            <div class="value">{}</div>
        </div>
        <div class="metric">
            <div class="label">Total Migrations</div>
            <div class="value">{}</div>
        </div>
z
UP TO DATEzNEEDS UPGRADEzDRIFT DETECTEDÚcurrent_versionr]   Úlatest_revisionÚtotal_migrationsÚmodel_changesÚneeds_migrationuB   
        <h3>âš ï¸� Model Changes Detected</h3>
        <p>{}</p>
ÚreasonÚmodified_modelsz$
        <p>Modified models: {}</p>
ú, rU   )rV   rW   Újoin)r   r;   Ústatus_classr:   s       r   r6   z5CoverageReporter._generate_migration_consistency_html°  sý   € à$,¨_Ò$=‘yÐPXÐYhÒPiÁ9Ðovˆð÷& �FØØ$ _Ò5‰LÈhÐWfÒNg¹?Ðm}Ø�L‰LÐ*¨EÓ2Ø�L‰LÐ*¨EÓ2ØÐ'Ñ(ó
ð' 	ð6 �OÑ$Ð%6Ò7Øð ÷ �Fˆ8�OÑ$ XÑ.Ó/ñ0ˆDð ! H¨_Ñ$=Ñ=Øð ç
�Fˆ4�9‰9�X˜oÑ.Ð/@ÑAÓBÓCñD�ð 	ð ñ 	ˆð ˆr   Úissuesc                 ó|  — |sydj                  t        |«      «      }|D �]  }|j                  dk(  r@|dj                  |j                  |j                  |j
                  |j                  «      z  }ŒS|j                  dk(  r5|dj                  |j                  |j
                  |j                  «      z  }Œ—|j                  dk(  r5|dj                  |j                  |j
                  |j                  «      z  }ŒÛ|j                  d	k(  sŒë|d
j                  |j
                  |j                  «      z  }�Œ |dz  }|S )z/Generate schema-payload validation section HTMLuž   
    <div class="section">
        <h2>âœ… Schema-Payload Validation</h2>
        <p>All TypeScript interfaces match backend Pydantic schemas.</p>
    </div>
uÙ   
    <div class="section">
        <h2>âš ï¸� Schema-Payload Validation</h2>
        <div class="metric error">
            <div class="label">Issues Found</div>
            <div class="value">{}</div>
        </div>
Úmissing_interfaceu÷   
        <h3>â�Œ Missing TypeScript Interface</h3>
        <div class="issue-item">
            <p><strong>Endpoint:</strong> {} {}</p>
            <p><strong>Expected:</strong> {}</p>
            <p><strong>Actual:</strong> {}</p>
        </div>
Úextra_fielduý   
        <h3>âš ï¸� Extra Field in Interface</h3>
        <div class="issue-item">
            <p><strong>Field:</strong> <code>{}</code></p>
            <p><strong>Expected:</strong> {}</p>
            <p><strong>Actual:</strong> {}</p>
        </div>
Úmissing_required_fieldu
  
        <h3>â�Œ Missing Required Field in Interface</h3>
        <div class="issue-item">
            <p><strong>Field:</strong> <code>{}</code></p>
            <p><strong>Expected Type:</strong> {}</p>
            <p><strong>Actual:</strong> {}</p>
        </div>
Úorphan_interfaceuÅ   
        <h3>âš ï¸� Orphan TypeScript Interface</h3>
        <div class="issue-item">
            <p><strong>Expected:</strong> {}</p>
            <p><strong>Actual:</strong> {}</p>
        </div>
rU   )rV   ÚlenÚ
issue_typerM   rZ   ÚexpectedÚactualÚ
field_name)r   r{   r:   Úissues       r   r7   z9CoverageReporter._generate_schema_payload_validation_htmlÞ  s@  € áðð÷ �FŒ3ˆv‹;Óð 	ð ó #	)ˆEØ×ÑÐ#6Ò6Øð ÷ �Fˆ5�<‰<˜Ÿ™¨¯©¸¿¹ÓFñG‘ð ×!Ñ! ]Ò2Øð ÷ �Fˆ5×Ñ˜UŸ^™^¨U¯\©\Ó:ñ;‘ð ×!Ñ!Ð%=Ò=Øð ÷ �Fˆ5×Ñ˜UŸ^™^¨U¯\©\Ó:ñ;‘ð ×!Ñ!Ð%7Ó7Øð ÷ �Fˆ5�>‰>˜5Ÿ<™<Ó(ñ)’ð;#	)ðJ 	ð ñ 	ˆð ˆr   c           
      ó
  — |syi }|D ]=  }|j                   |vrg ||j                   <   ||j                      j                  |«       Œ? dj                  t        |«      «      }|j	                  «       D ]‰  \  }}|d|j                  dd«      j                  «       › dt        |«      › d�z  }|D ]L  }|dj                  |j                  |j                  |j                  |j                  |j                  «      z  }ŒN Œ‹ |d	z  }|S )
z-Generate HTML for database consistency issuesuŒ   
    <div class="section">
        <h2>ðŸ—„ï¸� Database Consistency</h2>
        <p>âœ“ No database consistency issues found</p>
    </div>
uz   
    <div class="section">
        <h2>ðŸ—„ï¸� Database Consistency</h2>
        <p><strong>Total Issues:</strong> {}</p>
z
        <h3>Ú_Ú z: z</h3>
a0  
        <div class="issue-item">
            <p><strong>Model:</strong> {}</p>
            <p><strong>Schema:</strong> {}</p>
            <p><strong>Field:</strong> <code>{}</code></p>
            <p><strong>Model Type:</strong> {}</p>
            <p><strong>Schema Type:</strong> {}</p>
        </div>
rU   )r‚   ÚappendrV   r�   rj   ÚreplaceÚtitlerk   Úschema_namer…   Ú
model_typeÚschema_type)r   r{   Úissues_by_typer†   r:   r‚   Útype_issuess          r   r8   z4CoverageReporter._generate_database_consistency_html  sB  € áðð ˆØò 	;ˆEØ×Ñ ~Ñ5Ø35�˜u×/Ñ/Ñ0Ø˜5×+Ñ+Ñ,×3Ñ3°EÕ:ð	;ð
÷ �FŒ3ˆv‹;Óð	 	ð (6×';Ñ';Ó'=ò 	gÑ#ˆJ˜Øð Ø×Ñ  SÓ)×/Ñ/Ó1Ð2°"´S¸Ó5EÐ4Fð Gðñ ˆDð %ò 	g�Øð ÷ �Fˆ5×Ñ˜U×.Ñ.°×0@Ñ0@À%×BRÑBRÐTY×TeÑTeÓfñg‘ñ	gð		gð 	ð ñ 	ˆð ˆr   c                 óú  — dj                  |j                  dd«      «      }|j                  dg «      }|rt|dt        |«      › d�z  }|dz  }|D ]S  }t        j                  t        |d   «      «      }t        j                  t        |d	   «      «      }|d
|› d|› d|› d�z  }ŒU |dz  }|j                  di «      }t        |j                  «       «      D ]ž  }||   }	|d|j                  «       › dt        |	«      › d�z  }|	D ]j  }t        j                  t        |d   «      «      }t        j                  t        |d	   «      «      }dj                  |d   «      }
|d
|› d|› d|› d|
› d�	z  }Œl |dz  }Œ  |dz  }|S )z)Generate permissions summary section HTMLuÎ   
    <div class="section">
        <h2>ðŸ”� Permissions Summary</h2>
        <div class="metric">
            <div class="label">Total Endpoints</div>
            <div class="value">{}</div>
        </div>
Útotal_endpointsr   Úunregisteredzo
        <div class="metric">
            <div class="label">Unregistered</div>
            <div class="value">z</div>
        </div>
u[   
        <h3>ðŸŒ� Unregistered (No Auth Required)</h3>
        <div class="endpoint-list">
rM   rZ   rO   rP   rQ   z</code>
            </div>
rR   Úrolesu   
        <h3>ðŸ‘¤ zq</h3>
        <div class="metric">
            <div class="label">Endpoints</div>
            <div class="value">z:</div>
        </div>
        <div class="endpoint-list">
rx   z7</code>
                <span class="badge badge-info">z</span>
            </div>
rU   )
rV   rW   r�   rX   rY   r&   ÚsortedÚkeysrŒ   ry   )r   r   r:   r”   ÚitemrM   rZ   r•   Ú	role_nameÚ	endpointsÚ	roles_strs              r   r9   z+CoverageReporter._generate_permissions_htmlF  s  € ð÷ �FÐ×"Ñ"Ð#4°aÓ8Ó9ð 	ð +×.Ñ.¨~¸rÓBˆÙØð  ô !$ LÓ 1Ð2ð 3ðñ ˆDð ð ñ ˆDð %ò �Ü$×+Ñ+¬C°°X±Ó,?Ó@�Ü&×-Ñ-¬c°$°zÑ2BÓ.CÓD�Øð ,à,2¨8°2°f°Xð >Ø�jð !ðñ ‘ðð ð ñ ˆDð
 $×'Ñ'¨°Ó4ˆÜ §
¡
£Ó-ò 	ˆIØ˜iÑ(ˆIØð Ø—/‘/Ó#Ð$ð % ô !$ I£Ð/ð 0ð	ñ ˆDð "ò 
�Ü$×+Ñ+¬C°°X±Ó,?Ó@�Ü&×-Ñ-¬c°$°zÑ2BÓ.CÓD�Ø ŸI™I d¨7¡mÓ4�	Øð ,à,2¨8°2°f°Xð >Ø�jð !0Ø09¨{ð ;ð	ñ ‘ð	
ð ð ñ ‰Dð+	ð2 	ð ñ 	ˆð ˆr   c	                 óš  — dt        j                  «       j                  d«      › d�}	|rñ|	d|d   › d|d   › d|d	   › d
|d   › d|d   › d�z  }	|j                  dd«      dkD  r|	d|d   › d|j                  dd«      › d�z  }	|	d|d   › d�z  }	|d   r&|	dz  }	|d   D ]  }
|	d|
d   › d|
d   › d�z  }	Œ |	dz  }	|d   r&|	dz  }	|d   D ]  }
|	d|
d   › d|
d   › d�z  }	Œ |	dz  }	|j                  d «      r&|	d!z  }	|d    D ]  }
|	d|
d   › d|
d   › d�z  }	Œ |	dz  }	|rZ|	d"|j                  d#d$«      › d%|j                  d&d$«      › d�z  }	|j                  d'«      r|	d(z  }	|d'   D ]  }|	d)|› d*�z  }	Œ |	dz  }	|ri|	d+|d,   › d-|d.   › d/|d0   › d|d1   › d2�	z  }	|d3   rF|	d4z  }	|	d5z  }	|d3   j	                  «       D ]!  \  }}|D ]  }|	d6|› d7|d8   › d9|d:   › d;�z  }	Œ Œ# |	dz  }	|r…|d<   rd=n|d>   rd?nd@}|	dA|› dB|j                  dCd$«      › dD|j                  dEd$«      › dF|dG   › d�	z  }	|dH   dI   r8|	dJz  }	|	|dH   dK   › dL�z  }	dM|dH   v r|	dNdOj                  |dH   dM   «      › dL�z  }	|ry|	dPt        |«      › dL�z  }	|D ]b  }|j                  dQv rdRndS}|	|› dT|j                  › d�z  }	|	dU|j                  › d�z  }	|	dV|j                  › d�z  }	|	dW|j                  › dL�z  }	Œd |re|	dXt        |«      › dL�z  }	|D ]N  }|	dY|j                  › d�z  }	|	dZ|j                  › d�z  }	|	d[|j                  › d�z  }	|	d\|j                  › dL�z  }	ŒP |rùd]|vrõ|	d^|j                  d_d«      › dL�z  }	|j                  d`g «      }|r5|	daz  }	|	dbt        |«      › dL�z  }	|D ]  }|	d|d   › d|dc   › d�z  }	Œ |	dz  }	|j                  ddi «      }t        |j                  «       «      D ]e  }||   }|	de|j                  «       › dL�z  }	|	dbt        |«      › dL�z  }	|D ]+  }dOj                  |dd   «      }|	d|d   › d|dc   › df|› d�z  }	Œ- |	dz  }	Œg |	dgz  }	|	S )hz!Generate Markdown coverage reportz.# StreamA2026 Coverage Report

**Generated:** r1   z

---

uY   ## ðŸ”Œ API Endpoint Coverage

| Metric | Value |
|--------|-------|
| Total Endpoints | r=   z |
| Covered | rC   z (r>   z%) |
| Unused | rG   rE   z%) |
rI   r   z| Intentionally Unused | rJ   z| New | rK   z |

rL   u   ### ðŸ†• New Endpoints

z- **rM   z** `rN   z` - NEW
Ú
rS   u2   ### âš ï¸� Unused Endpoints (may be intentional)

z`
rT   u3   ### ðŸ”§ Intentionally Unused (Internal Features)

u\   ## ðŸ—„ï¸� Database Schema Coverage

| Metric | Value |
|--------|-------|
| Total Tables | r\   r]   z |
| Tables in DB | r^   r_   u   ### â�Œ Missing Tables

z- `z` - MISSING
uV   ## ðŸ“‹ Model-Schema Coverage

| Metric | Value |
|--------|-------|
| Total Models | rc   z |
| Total Fields | rd   z |
| Coverage | rf   re   z%) |

rg   u%   ### â�Œ Fields Missing from Schemas

z2| Model | Field | Type |
|-------|-------|------|
z| z | `rh   z` | ri   z |
ro   u   âœ… UP TO DATErp   u   âš ï¸� NEEDS UPGRADEu   â�Œ DRIFT DETECTEDuP   ## ðŸ”„ Migration Consistency

| Metric | Value |
|--------|-------|
| Status | z |
| Current Version | rq   z |
| Latest Migration | rr   z |
| Total Migrations | rs   rt   ru   u#   ### âš ï¸� Model Changes Detected

rv   z

rw   zModified models: rx   u7   ## âš ï¸� Schema-Payload Validation

**Issues Found:** )r   r}   r€   Úmissing_in_backendu   â�Œu   âš ï¸�r‰   zField: z
Expected: zActual: u3   ## ðŸ—„ï¸� Database Consistency

**Total Issues:** z- z	  Model: z
  Schema: z	  Field: r2   u2   ## ðŸ”� Permissions Summary

**Total Endpoints:** r“   r”   u*   ### ðŸŒ� Unregistered (No Auth Required)

z**Count:** rZ   r•   u	   ### ðŸ‘¤ z` - Roles: z3---

*Report generated by StreamA2026 Test System*
)r   r    r!   rW   rj   ry   r�   r‚   r…   rƒ   r„   rk   r�   r–   r—   rŒ   )r   r   r   r   r   r   r   r   r'   ÚmdrZ   ra   rk   rl   rm   Ústatusr†   Úseverityr”   r˜   r•   r™   rš   r›   s                           r   r#   z*CoverageReporter._generate_markdown_report‹  s“  € ðä—‘“×'Ñ'Ð(;Ó<Ð=ð >ðˆñ Øð ð "Ð";Ñ<Ð=ð >Ø˜/Ñ*Ð+¨2¨lÐ;OÑ.PÐ-Qð RØ˜Ñ(Ð)¨¨LÐ9LÑ,MÐ+Nð Oðñ ˆBð ×ÑÐ <¸aÓ@À1ÒDØÐ1°,Ð?[Ñ2\Ð1]Ð]_Ð`l×`pÑ`pð  rSð  UVó  aWð  `Xð  X^ð  _ñ  _�Ø�H˜\Ð*?Ñ@ÐAÀÐHÑHˆBà˜OÒ,ØÐ2Ñ2�Ø ,¨_Ñ =ò U�HØ˜D ¨(Ñ!3Ð 4°D¸À&Ñ9IÐ8JÈ)ÐTÑT‘BðUà�d‘
�àÐ.Ò/ØÐLÑL�Ø ,Ð-?Ñ @ò O�HØ˜D ¨(Ñ!3Ð 4°D¸À&Ñ9IÐ8JÈ#ÐNÑN‘BðOà�d‘
�à×ÑÐ @ÔAØÐMÑM�Ø ,Ð-MÑ Nò O�HØ˜D ¨(Ñ!3Ð 4°D¸À&Ñ9IÐ8JÈ#ÐNÑN‘BðOà�d‘
�ñ Øð ð —/‘/ .°%Ó8Ð9ð :Ø—/‘/ .°%Ó8Ð9ð :ðñ ˆBð �‰Ð/Ô0ØÐ2Ñ2�Ø(Ð)9Ñ:ò 5�EØ˜C ˜w mÐ4Ñ4‘Bð5à�d‘
�ñ !Øð ð (¨Ñ7Ð8ð 9Ø'Ð(<Ñ=Ð>ð ?Ø#Ð$4Ñ5Ð6°bÐ9NÐOdÑ9eÐ8fð gðñ ˆBð %Ð%;Ò<ØÐ?Ñ?�ØÐLÑL�Ø*?Ð@VÑ*W×*]Ñ*]Ó*_ò ZÑ&�J Ø!'ò Z˜Ø  : ,¨d°5¸±=°/ÀÀeÈFÁmÀ_ÐTXÐYÑY™ñZðZð �d‘
�ñ !Ø)>¸Ò)OÑ%ð  pEð  FUò  pVÑUkð  \pˆFØð ð ˆ8ð Ø*×.Ñ.Ð/@À%ÓHÐIð JØ+×/Ñ/Ð0AÀ5ÓIÐJð KØ+Ð,>Ñ?Ð@ð Að	ñ 	ˆBð % _Ñ5Ð6GÒHØÐ=Ñ>�ØÐ.¨Ñ?ÀÑIÐJÈ$ÐOÑO�Ø$Ð(=¸oÑ(NÑNØÐ-¨d¯i©iÐ8MÈoÑ8^Ð_pÑ8qÓ.rÐ-sÐswÐxÑx�Bñ !Øð äÐ,Ó-Ð.ð /ðñ ˆBð
 /ò 4�Ø$)×$4Ñ$4ð  9Rñ  %R™5ð  X`�Ø˜˜
 ! E×$4Ñ$4Ð#5°RÐ8Ñ8�Ø˜ × 0Ñ 0Ð1°Ð4Ñ4�Ø˜
 5§>¡>Ð"2°"Ð5Ñ5�Ø˜ §¡ ¨dÐ3Ñ3‘ð4ñ 'Øð äÐ2Ó3Ð4ð 5ðñ ˆBð
 5ò 9�Ø˜˜5×+Ñ+Ð,¨BÐ/Ñ/�Ø˜	 %×"2Ñ"2Ð!3°2Ð6Ñ6�Ø˜
 5×#4Ñ#4Ð"5°RÐ8Ñ8�Ø˜	 %×"2Ñ"2Ð!3°4Ð8Ñ8‘ð	9ñ  7Ð2EÑ#EØð à)×-Ñ-Ð.?ÀÓCÐDð Eðñ ˆBð /×2Ñ2°>À2ÓFˆLÙØÐDÑE�Ø˜¤C¨Ó$5Ð#6°dÐ;Ñ;�Ø(ò K�DØ˜D  h¡Ð 0°°T¸*Ñ5EÐ4FÀcÐJÑJ‘BðKà�d‘
�ð (×+Ñ+¨G°RÓ8ˆEÜ# E§J¡J£LÓ1ò �	Ø! )Ñ,�	Ø˜	 )§/¡/Ó"3Ð!4°DÐ9Ñ9�Ø˜¤C¨	£NÐ#3°4Ð8Ñ8�Ø%ò `�DØ $§	¡	¨$¨w©-Ó 8�IØ˜D  h¡Ð 0°°T¸*Ñ5EÐ4FÀkÐR[ÐQ\Ð\^Ð_Ñ_‘Bð`ð �d‘
‘ðð 	ÐFÑFˆØˆ	r   )NNNNNNN)NNNNNNNÚ )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r&   r   r   r   Úlistr/   r"   r3   r4   r5   r6   r7   r8   r9   r   r#   © r   r   r	   r	      sK  „ Ù2ð. Có .ð (,Ø&*Ø04Ø04Ø04Ø6:Ø.2ñ,à˜t‘nð,ð ˜d‘^ð,ð  (¨™~ð	,ð
  (¨™~ð,ð  (¨™~ð,ð &.¨d¡^ð,ð & d™^ð,ð 
ó,ð` (,Ø&*Ø04Ø04Ø04Ø6:Ø.2Øñvà˜t‘nðvð ˜d‘^ðvð  (¨™~ð	vð
  (¨™~ðvð  (¨™~ðvð &.¨d¡^ðvð & d™^ðvð ðvð 
óvðpc°Dð c¸Só cðJ#°4ð #¸Có #ðJ+¸Tð +Àcó +ðZ,¸Tð ,Àcó ,ð\;¸tð ;Èó ;ðz)¸$ð )À3ó )ðVC¸dð CÀsó CðJaà˜t‘nðað ˜d‘^ðað  (¨™~ð	að
  (¨™~ðað  (¨™~ðað &.¨d¡^ðað & d™^ðað ðað 
ôar   r	   Ú__main__é4   é-   g      U@é   g      +@é   ÚGETz	/api/testztest.pyrF   )rM   rN   ÚfileÚlineÚPOSTz/api/unusedz	unused.pyé   )r=   rC   r>   rG   rE   rK   rL   rS   )r   zReport generated: )r¦   r:   rX   ÚjsonÚpathlibr   Útypingr   r   r   r   r	   r£   Ú__file__Úparentr
   r&   Úreporterr   r/   Úreport_pathÚprintr¨   r   r   ú<module>r»      sÉ   ðñó Û Ý ß 'Ñ 'Ý ÷añ aðH ˆzÒá�x“.×'Ñ'×.Ñ.×5Ñ5€KÙ¡ KÓ 0Ó1€Hð $&ØØ"ØØ!Ø à k¸9ÈbÑQð
ð  }¸kÐSTÑUð
ñ€Lð ×8Ñ8ÀlÐ8ÓS€KÙ	Ð˜{˜mÐ
,Õ-ð- r   