test: Cover apps/fetch_news.py with unit tests

This commit is contained in:
TrisNol
2023-11-11 11:43:10 +01:00
parent ac6ca3547b
commit 170056bf58
2 changed files with 102 additions and 5 deletions

View File

@ -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

View 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