You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
motief/tests/test_validate_svd_themes.py

137 lines
3.7 KiB

# tests/test_validate_svd_themes.py
"""Tests for scripts/validate_svd_themes.py."""
import pytest
def test_check_canonical_right_on_right_no_left_right_pole():
"""Validation should work without left_pole/right_pole in themes."""
import sys
sys.path.insert(0, ".")
from scripts.validate_svd_themes import check_canonical_right_on_right
# Mock party positions
party_positions = {
"PVV": {1: 0.5},
"FVD": {1: 0.4},
"SP": {1: -0.5},
"GroenLinks-PvdA": {1: -0.4},
}
party_avg_vectors = {
"PVV": [0.5],
"FVD": [0.4],
"SP": [-0.5],
"GroenLinks-PvdA": [-0.4],
}
# Themes WITHOUT left_pole/right_pole
themes = {
1: {
"label": "Test axis",
"positive_pole": "Right",
"negative_pole": "Left",
"flip": False,
}
}
canonical_right = frozenset(["PVV", "FVD"])
canonical_left = frozenset(["SP", "GroenLinks-PvdA"])
divergences = check_canonical_right_on_right(
party_positions,
party_avg_vectors,
themes,
canonical_right,
canonical_left,
num_components=1,
)
# Should return empty list (no divergences) because right parties are on right
assert divergences == []
def test_check_canonical_right_on_right_detects_divergence():
"""Validation should detect when right parties are NOT on right."""
import sys
sys.path.insert(0, ".")
from scripts.validate_svd_themes import check_canonical_right_on_right
# Mock party positions where right parties are on LEFT
# The flip will be computed as True (since right_mean=-0.45 < left_mean=0.45)
# After flip: right parties will be on the RIGHT side (correct)
# So no divergence in this case - the flip mechanism works
party_positions = {
"PVV": {1: -0.5}, # Right party on left side
"FVD": {1: -0.4},
"SP": {1: 0.5}, # Left party on right side
"GroenLinks-PvdA": {1: 0.4},
}
party_avg_vectors = {
"PVV": [-0.5],
"FVD": [-0.4],
"SP": [0.5],
"GroenLinks-PvdA": [0.4],
}
themes = {
1: {
"label": "Test axis",
"positive_pole": "Right",
"negative_pole": "Left",
"flip": False, # Will be overridden by compute_flip_direction
}
}
canonical_right = frozenset(["PVV", "FVD"])
canonical_left = frozenset(["SP", "GroenLinks-PvdA"])
divergences = check_canonical_right_on_right(
party_positions,
party_avg_vectors,
themes,
canonical_right,
canonical_left,
num_components=1,
)
# No divergence because flip=True was computed and corrected the issue
assert divergences == []
def test_check_canonical_right_on_right_missing_party_data():
"""Validation should detect when canonical party data is missing."""
import sys
sys.path.insert(0, ".")
from scripts.validate_svd_themes import check_canonical_right_on_right
# Empty party positions - no data for canonical parties
party_positions = {}
party_avg_vectors = {}
themes = {
1: {
"label": "Test axis",
"positive_pole": "Right",
"negative_pole": "Left",
"flip": False,
}
}
canonical_right = frozenset(["PVV", "FVD"])
canonical_left = frozenset(["SP", "GroenLinks-PvdA"])
divergences = check_canonical_right_on_right(
party_positions,
party_avg_vectors,
themes,
canonical_right,
canonical_left,
num_components=1,
)
# Should detect missing party data
assert len(divergences) == 1
assert divergences[0]["issue"] == "missing_canonical_party_data"