Spaces:
Running
Running
| from __future__ import annotations | |
| from backend.rules import button_rules | |
| from backend.utils.config_loader import load_scoring_config | |
| from tests.fixtures import bad_page, clean_page | |
| THRESHOLDS = load_scoring_config()["thresholds"] | |
| def rule_ids(issues) -> list[str]: | |
| return [i.rule_id for i in issues] | |
| class TestCleanPage: | |
| def test_no_button_issues(self): | |
| issues = button_rules.analyze(clean_page(), THRESHOLDS) | |
| assert issues == [] | |
| class TestButtonStyleCount: | |
| def test_three_distinct_styles_flagged(self): | |
| page = clean_page() | |
| page["buttons"] = [ | |
| {**page["buttons"][0], "background_color": "#ff0000"}, | |
| {**page["buttons"][0], "background_color": "#00ff00"}, | |
| {**page["buttons"][0], "background_color": "#0000ff"}, | |
| ] | |
| issues = button_rules.analyze(page, THRESHOLDS) | |
| assert any(i.rule_id == "B1_button_style_count" for i in issues) | |
| def test_two_distinct_styles_allowed(self): | |
| issues = button_rules.analyze(clean_page(), THRESHOLDS) | |
| assert not any(i.rule_id == "B1_button_style_count" for i in issues) | |
| def test_bad_page_triggers_b1(self): | |
| issues = button_rules.analyze(bad_page(), THRESHOLDS) | |
| assert any(i.rule_id == "B1_button_style_count" for i in issues) | |
| class TestBorderRadiusVariance: | |
| def test_large_variance_flagged(self): | |
| page = clean_page() | |
| page["buttons"][0]["border_radius_px"] = 2.0 | |
| page["buttons"][1]["border_radius_px"] = 20.0 | |
| issues = button_rules.analyze(page, THRESHOLDS) | |
| assert any(i.rule_id == "B2_border_radius_variance" for i in issues) | |
| def test_consistent_radius_passes(self): | |
| issues = button_rules.analyze(clean_page(), THRESHOLDS) | |
| assert not any(i.rule_id == "B2_border_radius_variance" for i in issues) | |
| class TestFocusStyle: | |
| def test_missing_focus_flagged(self): | |
| page = clean_page() | |
| page["buttons"][0]["has_focus_style"] = False | |
| issues = button_rules.analyze(page, THRESHOLDS) | |
| assert any(i.rule_id == "B3_focus_style" for i in issues) | |
| def test_focus_present_passes(self): | |
| issues = button_rules.analyze(clean_page(), THRESHOLDS) | |
| assert not any(i.rule_id == "B3_focus_style" for i in issues) | |
| def test_bad_page_triggers_b3(self): | |
| issues = button_rules.analyze(bad_page(), THRESHOLDS) | |
| assert any(i.rule_id == "B3_focus_style" for i in issues) | |
| class TestTouchTarget: | |
| def test_small_touch_target_flagged(self): | |
| page = clean_page() | |
| page["buttons"][0]["height_px"] = 28.0 | |
| issues = button_rules.analyze(page, THRESHOLDS) | |
| assert any(i.rule_id == "B4_touch_target" for i in issues) | |
| def test_adequate_touch_target_passes(self): | |
| issues = button_rules.analyze(clean_page(), THRESHOLDS) | |
| assert not any(i.rule_id == "B4_touch_target" for i in issues) | |
| def test_no_buttons_returns_empty(self): | |
| page = clean_page() | |
| page["buttons"] = [] | |
| issues = button_rules.analyze(page, THRESHOLDS) | |
| assert issues == [] | |