rss-news/backend/tests/test_db_repositories.py

119 lines
3.8 KiB
Python

import os
import tempfile
import unittest
from pathlib import Path
from backend.app import config as config_module
from backend.app.db import init_db
from backend.app.repositories import (
ArticleUpsert,
FeedCreate,
RunCreate,
SourceCreate,
create_feed,
create_run,
create_source,
finish_run,
list_articles,
list_feeds,
list_runs,
list_sources,
upsert_article,
)
class TestSQLiteRepositories(unittest.TestCase):
def setUp(self) -> None:
self.tmp_dir = tempfile.TemporaryDirectory()
self.db_path = str(Path(self.tmp_dir.name) / "test.db")
os.environ["APP_DB_PATH"] = self.db_path
config_module.get_settings.cache_clear()
init_db()
def tearDown(self) -> None:
config_module.get_settings.cache_clear()
os.environ.pop("APP_DB_PATH", None)
self.tmp_dir.cleanup()
def test_end_to_end_basic_crud(self) -> None:
source_id = create_source(
SourceCreate(
name="GovData",
base_url="https://data.gov.de",
terms_url="https://www.govdata.de/dl-de/by-2-0",
license_name="dl-de/by-2-0",
risk_level="green",
is_enabled=True,
notes="test source",
last_reviewed_at="2026-02-18T00:00:00Z",
)
)
self.assertGreater(source_id, 0)
feed_id = create_feed(
FeedCreate(
name="GovData RSS",
url="https://example.org/feed.xml",
source_id=source_id,
is_enabled=True,
)
)
self.assertGreater(feed_id, 0)
run_id = create_run(RunCreate(run_type="ingest", status="running", details="start"))
self.assertGreater(run_id, 0)
finish_run(run_id=run_id, status="success", details="ok")
article_id = upsert_article(
ArticleUpsert(
feed_id=feed_id,
source_article_id="abc-1",
source_hash="hash-abc-1",
title="Beispielartikel",
source_url="https://example.org/articles/1",
canonical_url="https://example.org/articles/1",
published_at="2026-02-18T00:00:00Z",
author="Max Mustermann",
summary="Kurzfassung",
content_raw="Originaltext",
content_rewritten="Umschreibung",
word_count=120,
status="review",
meta_json='{"lang":"de"}',
)
)
self.assertGreater(article_id, 0)
# Upsert with same source_url updates same row
article_id_2 = upsert_article(
ArticleUpsert(
feed_id=feed_id,
source_article_id="abc-1",
source_hash="hash-abc-1",
title="Beispielartikel aktualisiert",
source_url="https://example.org/articles/1",
canonical_url="https://example.org/articles/1",
published_at="2026-02-18T00:00:00Z",
author="Max Mustermann",
summary="Kurzfassung 2",
content_raw="Originaltext 2",
content_rewritten="Umschreibung 2",
word_count=140,
status="approved",
meta_json='{"lang":"de","v":2}',
)
)
self.assertEqual(article_id, article_id_2)
self.assertEqual(len(list_sources()), 1)
self.assertEqual(len(list_feeds()), 1)
self.assertEqual(len(list_runs()), 1)
articles = list_articles()
self.assertEqual(len(articles), 1)
self.assertEqual(articles[0]["title"], "Beispielartikel aktualisiert")
self.assertEqual(articles[0]["status"], "approved")
if __name__ == "__main__":
unittest.main()