mirror of
https://github.com/fhswf/aki_prj23_transparenzregister.git
synced 2025-06-21 23:23:55 +02:00
test: Cover apps/fetch_news.py with unit tests
This commit is contained in:
@ -27,12 +27,12 @@ from aki_prj23_transparenzregister.utils.mongo.news_mongo_service import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def fetch_news_cli() -> None:
|
def fetch_news_cli() -> None: # pragma: no cover
|
||||||
"""A cli interface to fetch latest news articles on a schedule."""
|
"""A cli interface to fetch latest news articles on a schedule."""
|
||||||
parser = argparse.ArgumentParser(
|
parser = argparse.ArgumentParser(
|
||||||
prog="Process and transform data",
|
prog="Fetch News on schedule",
|
||||||
description="Copy data from one SQL database to another.",
|
description="Fetch latest news articles from various sources on a schedule and transfer them to MongoDB.",
|
||||||
epilog="Example: 'data-transformation secrets.json' or 'data-transformation ENV_VARS_'",
|
epilog="Example: 'fetch-news-schedule secrets.json' or 'fetchh-news-schedule ENV_VARS_'",
|
||||||
)
|
)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
"config",
|
"config",
|
||||||
@ -52,11 +52,14 @@ def fetch_news_cli() -> None:
|
|||||||
time.sleep(30)
|
time.sleep(30)
|
||||||
|
|
||||||
|
|
||||||
def schedule(config_provider: ConfigProvider) -> None:
|
def schedule(config_provider: ConfigProvider) -> int:
|
||||||
"""Scheduled job to fetch news articles and transfer them to MongoDB.
|
"""Scheduled job to fetch news articles and transfer them to MongoDB.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
config_provider (ConfigProvider): ConfigProvider to get the MongoDB connection string
|
config_provider (ConfigProvider): ConfigProvider to get the MongoDB connection string
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
int: Number of new documents inserted into MongoDB
|
||||||
"""
|
"""
|
||||||
logger.info("Starting scheduled job")
|
logger.info("Starting scheduled job")
|
||||||
mongo_news_service = MongoNewsService(
|
mongo_news_service = MongoNewsService(
|
||||||
@ -95,3 +98,4 @@ def schedule(config_provider: ConfigProvider) -> None:
|
|||||||
)
|
)
|
||||||
logger.info("Finished scheduled job")
|
logger.info("Finished scheduled job")
|
||||||
logger.info("=========================================")
|
logger.info("=========================================")
|
||||||
|
return count_new_documents
|
||||||
|
93
tests/apps/fetch_news_test.py
Normal file
93
tests/apps/fetch_news_test.py
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
"""Testing apps/fetch_news.py."""
|
||||||
|
from unittest.mock import Mock, patch
|
||||||
|
|
||||||
|
from aki_prj23_transparenzregister.apps import fetch_news
|
||||||
|
from aki_prj23_transparenzregister.models.news import News
|
||||||
|
|
||||||
|
|
||||||
|
def test_import() -> None:
|
||||||
|
assert fetch_news is not None
|
||||||
|
|
||||||
|
|
||||||
|
@patch("aki_prj23_transparenzregister.apps.fetch_news.MongoNewsService")
|
||||||
|
@patch("aki_prj23_transparenzregister.apps.fetch_news.MongoConnector")
|
||||||
|
@patch("aki_prj23_transparenzregister.apps.fetch_news.HandelsblattRSS")
|
||||||
|
@patch("aki_prj23_transparenzregister.apps.fetch_news.TagesschauAPI")
|
||||||
|
def test_schedule(
|
||||||
|
mock_tagesschau_api: Mock,
|
||||||
|
mock_handelsblatt_rss: Mock,
|
||||||
|
mock_mongo_connector: Mock,
|
||||||
|
mock_mongo_news_service: Mock,
|
||||||
|
) -> None:
|
||||||
|
mock_mongo_connector.return_value = Mock()
|
||||||
|
mock_mongo_news_service.return_value = Mock(
|
||||||
|
get_by_id=Mock(return_value=None), insert=Mock(return_value=Mock)
|
||||||
|
)
|
||||||
|
|
||||||
|
mock_news_handelsblatt = [
|
||||||
|
News(
|
||||||
|
id="test",
|
||||||
|
title="The oldest and strongest emotion of mankind is fear, and the oldest and strongest kind of fear is fear of the unknown",
|
||||||
|
date="2023-11-10T09:10:27+0100",
|
||||||
|
source_url="https://www.handelsblatt.com/test",
|
||||||
|
text="",
|
||||||
|
),
|
||||||
|
News(
|
||||||
|
id="test",
|
||||||
|
title="That is not dead which can eternal lie, And with strange aeons even death may die.",
|
||||||
|
date="2023-11-10T09:10:27+0100",
|
||||||
|
source_url="https://www.handelsblatt.com/test",
|
||||||
|
text="",
|
||||||
|
),
|
||||||
|
]
|
||||||
|
mock_news_tagesschau = [
|
||||||
|
News(
|
||||||
|
id="test",
|
||||||
|
title="I know always that I am an outsider; a stranger in this century and among those who are still men.",
|
||||||
|
date="2023-11-10T09:10:27+0100",
|
||||||
|
source_url="https://www.tagesschau.de/test",
|
||||||
|
text="",
|
||||||
|
),
|
||||||
|
News(
|
||||||
|
id="test",
|
||||||
|
title="Ph'nglui mglw'nafh Cthulhu R'lyeh wgah'nagl fhtagn.",
|
||||||
|
date="2023-11-10T09:10:27+0100",
|
||||||
|
source_url="https://www.tagesschau.de/test",
|
||||||
|
text="",
|
||||||
|
),
|
||||||
|
]
|
||||||
|
mock_tagesschau_api.return_value = Mock(
|
||||||
|
get_news_for_category=Mock(return_value=mock_news_tagesschau)
|
||||||
|
)
|
||||||
|
mock_handelsblatt_rss.return_value = Mock(
|
||||||
|
get_news_for_category=Mock(return_value=mock_news_handelsblatt)
|
||||||
|
)
|
||||||
|
assert fetch_news.schedule(Mock()) == len(
|
||||||
|
mock_news_handelsblatt + mock_news_tagesschau
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@patch("aki_prj23_transparenzregister.apps.fetch_news.MongoNewsService")
|
||||||
|
@patch("aki_prj23_transparenzregister.apps.fetch_news.MongoConnector")
|
||||||
|
@patch("aki_prj23_transparenzregister.apps.fetch_news.HandelsblattRSS")
|
||||||
|
@patch("aki_prj23_transparenzregister.apps.fetch_news.TagesschauAPI")
|
||||||
|
def test_schedule_error(
|
||||||
|
mock_tagesschau_api: Mock,
|
||||||
|
mock_handelsblatt_rss: Mock,
|
||||||
|
mock_mongo_connector: Mock,
|
||||||
|
mock_mongo_news_service: Mock,
|
||||||
|
) -> None:
|
||||||
|
mock_mongo_connector.return_value = Mock()
|
||||||
|
mock_mongo_news_service.return_value = Mock(
|
||||||
|
get_by_id=Mock(return_value=None), insert=Mock(return_value=Mock)
|
||||||
|
)
|
||||||
|
|
||||||
|
mock_news_handelsblatt = None
|
||||||
|
mock_news_tagesschau = None
|
||||||
|
mock_tagesschau_api.return_value = Mock(
|
||||||
|
get_news_for_category=Mock(return_value=mock_news_tagesschau)
|
||||||
|
)
|
||||||
|
mock_handelsblatt_rss.return_value = Mock(
|
||||||
|
get_news_for_category=Mock(return_value=mock_news_handelsblatt)
|
||||||
|
)
|
||||||
|
assert fetch_news.schedule(Mock()) == 0
|
Reference in New Issue
Block a user