Add test coverage for CLI commands, Flask routes, and shared DB methods
74 new tests across 3 files: - test_cli.py: CLI help, version, config, report generation, wg/viz/pipeline subcommands - test_web.py: All public pages, admin pages (dev/prod), API JSON endpoints, CSV export, 404s - test_db_shared.py: rated_count, gap_count, false_positive_names, category_counts, source_counts, draft_author_count_map, search_gaps, search_authors Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
175
tests/test_db_shared.py
Normal file
175
tests/test_db_shared.py
Normal file
@@ -0,0 +1,175 @@
|
||||
"""Tests for shared Database query methods added in the DB refactor."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
|
||||
# ── rated_count ───────────────────────────────────────────────────────
|
||||
|
||||
|
||||
def test_rated_count_returns_int(seeded_db):
|
||||
result = seeded_db.rated_count()
|
||||
assert isinstance(result, int)
|
||||
assert result == 5 # seeded_db has 5 ratings
|
||||
|
||||
|
||||
def test_rated_count_empty(tmp_db):
|
||||
result = tmp_db.rated_count()
|
||||
assert result == 0
|
||||
|
||||
|
||||
# ── gap_count ─────────────────────────────────────────────────────────
|
||||
|
||||
|
||||
def test_gap_count_empty(tmp_db):
|
||||
result = tmp_db.gap_count()
|
||||
assert isinstance(result, int)
|
||||
assert result == 0
|
||||
|
||||
|
||||
def test_gap_count_after_insert(seeded_db):
|
||||
seeded_db.conn.execute(
|
||||
"INSERT INTO gaps (topic, description, category, severity) VALUES (?, ?, ?, ?)",
|
||||
("Test Gap", "A test gap", "A2A protocols", "high"),
|
||||
)
|
||||
seeded_db.conn.commit()
|
||||
assert seeded_db.gap_count() == 1
|
||||
|
||||
|
||||
# ── false_positive_names ──────────────────────────────────────────────
|
||||
|
||||
|
||||
def test_false_positive_names_empty(seeded_db):
|
||||
result = seeded_db.false_positive_names()
|
||||
assert isinstance(result, set)
|
||||
assert len(result) == 0
|
||||
|
||||
|
||||
def test_false_positive_names_after_flag(seeded_db):
|
||||
seeded_db.conn.execute(
|
||||
"UPDATE ratings SET false_positive = 1 WHERE draft_name = 'draft-alpha-agent-comm'"
|
||||
)
|
||||
seeded_db.conn.commit()
|
||||
result = seeded_db.false_positive_names()
|
||||
assert "draft-alpha-agent-comm" in result
|
||||
assert len(result) == 1
|
||||
|
||||
|
||||
# ── category_counts ──────────────────────────────────────────────────
|
||||
|
||||
|
||||
def test_category_counts_returns_dict(seeded_db):
|
||||
result = seeded_db.category_counts()
|
||||
assert isinstance(result, dict)
|
||||
assert len(result) > 0
|
||||
|
||||
|
||||
def test_category_counts_values_are_ints(seeded_db):
|
||||
result = seeded_db.category_counts()
|
||||
for k, v in result.items():
|
||||
assert isinstance(k, str)
|
||||
assert isinstance(v, int)
|
||||
assert v > 0
|
||||
|
||||
|
||||
# ── source_counts ────────────────────────────────────────────────────
|
||||
|
||||
|
||||
def test_source_counts_returns_list(seeded_db):
|
||||
result = seeded_db.source_counts()
|
||||
assert isinstance(result, list)
|
||||
|
||||
|
||||
def test_source_counts_tuples(seeded_db):
|
||||
result = seeded_db.source_counts()
|
||||
for item in result:
|
||||
assert isinstance(item, tuple)
|
||||
assert len(item) == 2
|
||||
|
||||
|
||||
# ── draft_author_count_map ───────────────────────────────────────────
|
||||
|
||||
|
||||
def test_draft_author_count_map_returns_dict(seeded_db):
|
||||
result = seeded_db.draft_author_count_map()
|
||||
assert isinstance(result, dict)
|
||||
# seeded_db has 4 drafts with authors
|
||||
assert len(result) >= 3
|
||||
|
||||
|
||||
def test_draft_author_count_map_values(seeded_db):
|
||||
result = seeded_db.draft_author_count_map()
|
||||
# draft-alpha-agent-comm has 2 authors
|
||||
assert result.get("draft-alpha-agent-comm") == 2
|
||||
# draft-beta-ml-traffic has 1 author
|
||||
assert result.get("draft-beta-ml-traffic") == 1
|
||||
|
||||
|
||||
def test_draft_author_count_map_empty(tmp_db):
|
||||
result = tmp_db.draft_author_count_map()
|
||||
assert result == {}
|
||||
|
||||
|
||||
# ── search_gaps ──────────────────────────────────────────────────────
|
||||
|
||||
|
||||
def test_search_gaps_empty_db(tmp_db):
|
||||
result = tmp_db.search_gaps("anything")
|
||||
assert isinstance(result, list)
|
||||
assert len(result) == 0
|
||||
|
||||
|
||||
def test_search_gaps_finds_match(seeded_db):
|
||||
seeded_db.conn.execute(
|
||||
"INSERT INTO gaps (topic, description, category, severity) VALUES (?, ?, ?, ?)",
|
||||
("Agent Discovery Gap", "No standard for agent discovery", "Agent discovery/reg", "high"),
|
||||
)
|
||||
seeded_db.conn.commit()
|
||||
result = seeded_db.search_gaps("discovery")
|
||||
assert len(result) == 1
|
||||
assert result[0]["topic"] == "Agent Discovery Gap"
|
||||
|
||||
|
||||
def test_search_gaps_no_match(seeded_db):
|
||||
seeded_db.conn.execute(
|
||||
"INSERT INTO gaps (topic, description, category, severity) VALUES (?, ?, ?, ?)",
|
||||
("Agent Discovery Gap", "No standard", "Agent discovery/reg", "high"),
|
||||
)
|
||||
seeded_db.conn.commit()
|
||||
result = seeded_db.search_gaps("zzz-nonexistent-zzz")
|
||||
assert len(result) == 0
|
||||
|
||||
|
||||
# ── search_authors ───────────────────────────────────────────────────
|
||||
|
||||
|
||||
def test_search_authors_by_name(seeded_db):
|
||||
result = seeded_db.search_authors("Alice")
|
||||
assert len(result) >= 1
|
||||
assert any(a["name"] == "Alice Researcher" for a in result)
|
||||
|
||||
|
||||
def test_search_authors_by_affiliation(seeded_db):
|
||||
result = seeded_db.search_authors("ExampleCorp")
|
||||
assert len(result) >= 2 # Alice and Carol
|
||||
|
||||
|
||||
def test_search_authors_no_match(seeded_db):
|
||||
result = seeded_db.search_authors("zzz-nonexistent-zzz")
|
||||
assert len(result) == 0
|
||||
|
||||
|
||||
def test_search_authors_empty_db(tmp_db):
|
||||
result = tmp_db.search_authors("anyone")
|
||||
assert isinstance(result, list)
|
||||
assert len(result) == 0
|
||||
|
||||
|
||||
# ── search_authors dict shape ────────────────────────────────────────
|
||||
|
||||
|
||||
def test_search_authors_result_shape(seeded_db):
|
||||
result = seeded_db.search_authors("Alice")
|
||||
for item in result:
|
||||
assert "person_id" in item
|
||||
assert "name" in item
|
||||
assert "affiliation" in item
|
||||
Reference in New Issue
Block a user