
    j|
                         d Z ddlZddlmc mZ ddlmZ ddl	Z	 ee
      j                  j                  j                  dz  Z G d d      Z G d d      Z G d	 d
      Zd Zy)u)  
Static asset tests — Story 2.3 (AC: 5, 6, 7).

Tests verify:
 - Vendor files are served by Flask (primer.css, chart.min.js)
 - tokens.css defines all three domain color tokens
 - app.css implements the [data-loading] loading state pattern
 - No CDN references in app/ HTML/CSS/JS files (NFR-6)
    N)Pathappc                       e Zd Zd Zd Zy)TestVendorAssetsc                    |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	)
z5Primer CSS local copy is present and served by Flask.z /static/vendor/primer/primer.css   ==z3%(py2)s
{%(py2)s = %(py0)s.status_code
} == %(py5)sresponsepy0py2py5assert %(py7)spy7N
getstatus_code
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationselfclientr   @py_assert1@py_assert4@py_assert3@py_format6@py_format8s           =/var/www/html/financials/tests/test_blueprints/test_assets.pytest_primer_css_serves_200z+TestVendorAssets.test_primer_css_serves_200   s    ::@A##*s*#s****#s******x***x***#***s*******    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	)
z3Chart.js local copy is present and served by Flask.z#/static/vendor/chartjs/chart.min.jsr   r	   r   r   r   r   r   Nr   r   s           r&   test_chartjs_serves_200z(TestVendorAssets.test_chartjs_serves_200   s    ::CD##*s*#s****#s******x***x***#***s*******r(   N)__name__
__module____qualname__r'   r*    r(   r&   r   r      s    +
+r(   r   c                       e Zd Zd Zd Zd Zy)TestTokensCSSc                    t         dz  dz  dz  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}}y )Nstaticcss
tokens.cssz--color-safeinz%(py1)s in %(py3)scontentpy1py3assert %(py5)sr   
APP_DIR	read_textr   r   r   r   r   r   r   r   r   r8   @py_assert0@py_assert2@py_format4r$   s         r&   test_safe_color_token_definedz+TestTokensCSS.test_safe_color_token_defined   sx    X%-<GGI(~((((~(((~((((((((((((((((r(   c                    t         dz  dz  dz  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}}y )Nr2   r3   r4   z--color-warningr5   r7   r8   r9   r<   r   r=   r@   s         r&    test_warning_color_token_definedz.TestTokensCSS.test_warning_color_token_defined!   s{    X%-<GGI + G++++ G+++ ++++++G+++G+++++++r(   c                    t         dz  dz  dz  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}}y )Nr2   r3   r4   z--color-dangerr5   r7   r8   r9   r<   r   r=   r@   s         r&   test_danger_color_token_definedz-TestTokensCSS.test_danger_color_token_defined%   s{    X%-<GGI*7****7*********7***7*******r(   N)r+   r,   r-   rD   rF   rH   r.   r(   r&   r0   r0      s    ),+r(   r0   c                       e Zd Zd Zd Zy)
TestAppCSSc                    t         dz  dz  dz  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}}y)z<[data-loading="true"] .fin-content must fade to 0.4 opacity.r2   r3   app.cssz"[data-loading="true"] .fin-contentr5   r7   r8   r9   r<   r   Nzopacity: 0.4zpointer-events: noner=   r@   s         r&   test_data_loading_content_rulez)TestAppCSS.test_data_loading_content_rule+   s0   X%-	9DDF3>3w>>>>3w>>>3>>>>>>w>>>w>>>>>>>(~((((~(((~((((((((((((((((%0%0000%000%0000000000000000r(   c                    t         dz  dz  dz  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}}y)z7[data-loading="true"] .fin-spinner must become visible.r2   r3   rL   z"[data-loading="true"] .fin-spinnerr5   r7   r8   r9   r<   r   Nzdisplay: blockr=   r@   s         r&   test_data_loading_spinner_rulez)TestAppCSS.test_data_loading_spinner_rule2   s    X%-	9DDF3>3w>>>>3w>>>3>>>>>>w>>>w>>>>>>>*7****7*********7***7*******r(   N)r+   r,   r-   rM   rO   r.   r(   r&   rJ   rJ   *   s    1+r(   rJ   c                     g d} g }t         j                  d      D ]Y  }|j                  dv s|j                  d      }| D ]1  }||v s|j	                  |j                  t                d| d       3 [ g }||k(  }|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j                  |      z         dz   d|iz  }t        t        j                  |            dx}}y)z5NFR-6: zero CDN references in app/ HTML/CSS/JS files.)zcdn.zunpkg.z	jsdelivr.zcdnjs.*)z.htmlz.cssz.jsignore)errorsz: contains ''r	   )z%(py0)s == %(py3)s
violations)r   r;   zCDN references found:

z
>assert %(py5)sr   N)r>   rglobsuffixr?   appendrelative_tor   r   r   r   r   r   _format_assertmsgjoinr   r   )	cdn_patternsrU   pathr8   patternrB   r!   rC   r$   s	            r&   'test_no_cdn_references_in_app_directoryr`   9   s    <LJc" ;;22nnHn5G' g%%%++G45\'!L N:NNN:NNNNNN:NNN:NNNNNN6:9NNNNNNNNr(   )__doc__builtinsr   _pytest.assertion.rewrite	assertionrewriter   pathlibr   pytest__file__parentr>   r   r0   rJ   r`   r.   r(   r&   <module>rj      s[       
x.


&
&
-
-
5	+ 	++ ++ +Or(   