SciPeerAI-API / tests /test_granularity_analyzer.py
Abu-Sameer-66
deploy: SciPeerAI v2.2.0
c94f46f
# tests/test_granularity_analyzer.py
#
# Test suite for Statistical Granularity Analyzer.
# 8 tests covering digit preference, Benford's Law,
# round numbers, uniform precision, and risk levels.
import pytest
from src.scipeerai.modules.granularity_analyzer import GranularityAnalyzer
engine = GranularityAnalyzer()
def test_digit_preference_detected():
"""Too many 0s and 5s in decimal values."""
text = (
"Results: 2.50 3.50 4.50 1.50 2.00 3.00 "
"4.00 5.00 1.00 6.50 7.50 8.00 n=20 p=0.05"
)
r = engine.analyze(text)
assert r.flags_count >= 1
assert r.risk_level in ("medium", "high", "critical")
def test_clean_data_passes():
"""Natural varied decimal values — low risk."""
text = (
"Values recorded: 2.34 1.87 3.92 4.13 2.76 "
"1.53 3.47 2.19 4.82 1.63 n=45 p=0.032"
)
r = engine.analyze(text)
assert r.risk_level in ("low", "medium")
def test_insufficient_data():
"""Less than 5 decimal values — low risk."""
r = engine.analyze(
"The study found significant results with "
"p=0.04 and mean=2.5 in the sample group."
)
assert r.risk_level == "low"
def test_round_numbers_detected():
"""All whole number decimals — suspicious."""
text = (
"mean=1.0 sd=2.0 score=3.0 value=4.0 "
"outcome=5.0 measure=6.0 result=7.0 n=20"
)
r = engine.analyze(text)
assert r.flags_count >= 1
def test_granularity_score_range():
"""Score must be between 0 and 1."""
text = (
"Results showed mean=2.50 sd=1.00 p=0.050 n=20. "
"Secondary mean=3.50 sd=2.00 p=0.040 n=15."
)
r = engine.analyze(text)
assert 0.0 <= r.granularity_score <= 1.0
def test_flag_structure():
"""Flags have correct fields."""
text = (
"Results: 2.50 3.50 4.50 1.50 2.00 3.00 "
"4.00 5.00 1.00 6.50 n=20 p=0.05"
)
r = engine.analyze(text)
if r.flags_count > 0:
flag = r.flags[0]
assert hasattr(flag, 'flag_type')
assert hasattr(flag, 'severity')
assert hasattr(flag, 'description')
assert hasattr(flag, 'evidence')
assert hasattr(flag, 'suggestion')
def test_summary_contains_key_info():
"""Summary mentions anomaly score and risk level."""
text = (
"Results showed mean=2.50 sd=1.00 p=0.050 n=20. "
"Values: 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0"
)
r = engine.analyze(text)
assert "Granularity" in r.summary
assert r.risk_level.upper() in r.summary
def test_risk_level_valid():
"""Risk level must be one of four valid values."""
text = (
"Results showed mean=2.50 sd=1.00 p=0.050 n=20. "
"Secondary mean=3.50 sd=2.00 p=0.040 n=15."
)
r = engine.analyze(text)
assert r.risk_level in ("low", "medium", "high", "critical")