Files
sbnews/qa/crawler/test_news_collection_static.py
T

49 lines
1.9 KiB
Python

from pathlib import Path
import unittest
ROOT = Path(__file__).resolve().parents[2]
CRAWLER = ROOT / "docker" / "crawler"
class NewsCollectionRegressionTest(unittest.TestCase):
def read(self, name: str) -> str:
return (CRAWLER / name).read_text(encoding="utf-8")
def test_lottery_sources_use_runtime_month(self):
hkjc = self.read("hkjc_lottery_news.py")
taiwan = self.read("taiwan_lottery_news.py")
self.assertNotIn("?ny=2026&nm=6", hkjc)
self.assertIn("LIST_URL_TEMPLATE", hkjc)
self.assertIn("def build_list_url", hkjc)
self.assertNotIn("from=2025-06&to=2026-06", taiwan)
self.assertIn("LIST_API_TEMPLATE", taiwan)
self.assertIn("def build_list_api", taiwan)
def test_general_lottery_task_is_registered(self):
tasks = (ROOT / "docker" / "crawler" / "config" / "crawler_tasks.yaml").read_text(encoding="utf-8")
block_start = tasks.index(" - key: lottery_news")
block = tasks[block_start : tasks.find("\n - key:", block_start + 1)]
self.assertIn("action: lottery_news", block)
self.assertIn("active: true", block)
def test_content_queue_filters_non_publishable_body_not_visibility(self):
source = self.read("article_fetcher.py")
self.assertNotIn("OR is_show = 0", source)
self.assertIn("NOT REGEXP", source)
self.assertIn("MAX_RETRY = 4", source)
def test_rss_categories_allow_summary_to_be_listed(self):
for name in ("lottery_news.py", "crypto_news.py", "nba_news.py", "cba_news.py"):
source = self.read(name)
self.assertIn("allow_summary=True", source, name)
def test_crawler_installs_google_news_decoder(self):
requirements = (CRAWLER / "requirements.txt").read_text(encoding="utf-8")
self.assertRegex(requirements, r"(?m)^googlenewsdecoder(?:[<>=!~].*)?$")
if __name__ == "__main__":
unittest.main()