feat: suggest confirmed external aliases
This commit is contained in:
@@ -8,6 +8,7 @@ from sqlalchemy import create_engine, func, select
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from app.community_importer import CommunityImportError, stage_observations
|
||||
from app.community_review import ExternalReviewError, map_observation, suggest_aliases
|
||||
from app.database import Base
|
||||
from app.models import CatchReport, DataSource, ExternalEntityAlias, ExternalObservation, Fish, Waterbody
|
||||
from rf4_research.community_sources import parse_rf4db_catches, parse_rf4map_point, parse_rf4posts_spot
|
||||
@@ -129,6 +130,31 @@ def test_auto_publication_requires_enabled_source(db: Session) -> None:
|
||||
assert item is not None and item.status == "staged" and item.catch_report is None
|
||||
|
||||
|
||||
def test_confirmed_aliases_are_suggestions_and_cannot_be_retargeted(db: Session) -> None:
|
||||
source = DataSource(key="rf4db", name="RF4DB", base_url="https://rf4db.com", default_confidence=70, enabled=True)
|
||||
pike = Fish(slug="pike", name_ru="Щука")
|
||||
perch = Fish(slug="perch", name_ru="Окунь")
|
||||
waterbody = Waterbody(slug="test-lake", name_ru="Тестовое озеро")
|
||||
db.add_all([source, pike, perch, waterbody])
|
||||
db.commit()
|
||||
stage_observations(db, [record(external_id="first")])
|
||||
first = db.scalar(select(ExternalObservation).where(ExternalObservation.source_external_id == "first"))
|
||||
assert first is not None
|
||||
map_observation(db, first, pike, waterbody)
|
||||
|
||||
stage_observations(db, [record(external_id="second")])
|
||||
second = db.scalar(select(ExternalObservation).where(ExternalObservation.source_external_id == "second"))
|
||||
assert second is not None
|
||||
suggested_fish, suggested_waterbody = suggest_aliases(db, second)
|
||||
assert (suggested_fish.slug, suggested_waterbody.slug) == ("pike", "test-lake")
|
||||
|
||||
with pytest.raises(ExternalReviewError, match="confirmed fish alias"):
|
||||
map_observation(db, second, perch, waterbody)
|
||||
db.rollback()
|
||||
alias = db.scalar(select(ExternalEntityAlias).where(ExternalEntityAlias.entity_type == "fish"))
|
||||
assert alias is not None and alias.fish_id == pike.id
|
||||
|
||||
|
||||
def test_parser_json_can_be_staged_without_losing_provenance(db: Session) -> None:
|
||||
parsed = parse_rf4db_catches(FIXTURE.read_text(encoding="utf-8"))
|
||||
payload = json.loads(json.dumps([asdict(item) for item in parsed], default=str))
|
||||
|
||||
Reference in New Issue
Block a user