"""Юнит-тесты шкалы загрузки источников (app.core.progress) — чистая логика.""" from app.core.progress import run_percent def test_queued_run_shows_nothing_done(): assert run_percent("queued", "queued", target=100, fetched=0, processed=0) == 0.0 def test_fetch_stage_fills_first_half(): assert run_percent("running", "fetch", target=100, fetched=50, processed=0) == 25.0 assert run_percent("running", "fetch", target=100, fetched=100, processed=0) == 50.0 def test_index_stage_fills_second_half(): # Выборка закончена (50%), проиндексирована половина полученного → 75% assert run_percent("running", "index", target=100, fetched=100, processed=50) == 75.0 assert run_percent("running", "index", target=100, fetched=100, processed=100) == 100.0 def test_partial_fetch_does_not_inflate_index_progress(): """Источник отдал меньше лимита: выборка даёт свои 20%, индексация — свои.""" percent = run_percent("running", "index", target=100, fetched=40, processed=20) assert percent == 45.0 # 20% за выборку + 25% за половину индексации def test_unknown_target_gives_zero_instead_of_division_error(): assert run_percent("running", "fetch", target=0, fetched=17, processed=0) == 0.0 assert run_percent("running", "index", target=0, fetched=0, processed=0) == 0.0 def test_overshoot_is_clamped(): """Источник может вернуть больше лимита — шкала не должна уезжать за 100%.""" assert run_percent("running", "fetch", target=10, fetched=99, processed=0) == 50.0 assert run_percent("running", "index", target=10, fetched=10, processed=99) == 100.0 def test_finished_runs_are_always_full(): """Шкала показывает «работа окончена», исход виден по статусу рядом.""" for status in ("done", "partial", "error", "cancelled"): assert run_percent(status, "finished", target=100, fetched=3, processed=1) == 100.0