Spaces:
Running
Running
| """ | |
| Module 10 — CSS Generator. | |
| """ | |
| from __future__ import annotations | |
| import pytest | |
| from backend.services import css_generator, scoring_engine | |
| from tests.fixtures import bad_page, clean_page | |
| def bad_css(): | |
| return css_generator.generate(scoring_engine.analyze(bad_page())) | |
| def clean_css(): | |
| return css_generator.generate(scoring_engine.analyze(clean_page())) | |
| class TestCssStructure: | |
| def test_returns_string(self, bad_css): | |
| assert isinstance(bad_css, str) | |
| def test_not_empty(self, bad_css): | |
| assert len(bad_css) > 50 | |
| def test_has_uicopilot_header(self, bad_css): | |
| assert "UICopilot" in bad_css | |
| def test_has_root_block(self, bad_css): | |
| assert ":root {" in bad_css | |
| def test_has_space_tokens(self, bad_css): | |
| assert "--space-" in bad_css | |
| def test_has_font_size_token(self, bad_css): | |
| assert "--font-size-body" in bad_css | |
| def test_has_button_tokens(self, bad_css): | |
| assert "--btn-padding-y" in bad_css | |
| def test_is_valid_css_structure(self, bad_css): | |
| open_count = bad_css.count("{") | |
| close_count = bad_css.count("}") | |
| assert open_count == close_count, "Mismatched braces" | |
| class TestCssBadPageFixes: | |
| def test_typography_block_present(self, bad_css): | |
| assert "Typography Fixes" in bad_css | |
| def test_button_block_present(self, bad_css): | |
| assert "Button Fixes" in bad_css | |
| def test_focus_visible_included(self, bad_css): | |
| assert ":focus-visible" in bad_css | |
| def test_form_block_present(self, bad_css): | |
| assert "Form Fixes" in bad_css | |
| def test_table_block_present(self, bad_css): | |
| assert "Table Fixes" in bad_css | |
| def test_zebra_striping_included(self, bad_css): | |
| assert "nth-child(even)" in bad_css | |
| def test_spacing_block_present(self, bad_css): | |
| assert "Spacing Fixes" in bad_css | |
| class TestCssTokenValues: | |
| def test_grid_scale_multiples(self, bad_css): | |
| # 8pt grid: space-8, space-16, space-24, space-32 should all appear | |
| for val in (8, 16, 24, 32): | |
| assert f"--space-{val}:" in bad_css | |
| def test_min_height_token_numeric(self, bad_css): | |
| assert "--btn-min-height:" in bad_css | |
| idx = bad_css.index("--btn-min-height:") | |
| snippet = bad_css[idx:idx + 30] | |
| assert "px" in snippet | |
| class TestCssIsIdempotent: | |
| def test_same_result_same_css(self): | |
| result = scoring_engine.analyze(bad_page()) | |
| assert css_generator.generate(result) == css_generator.generate(result) | |
| class TestCssCleanPage: | |
| def test_clean_page_still_produces_tokens(self, clean_css): | |
| assert ":root {" in clean_css | |
| assert "--font-size-body" in clean_css | |
| def test_clean_page_fewer_fix_blocks(self, clean_css, bad_css): | |
| assert len(clean_css) < len(bad_css) | |