From 02478db6cb3d9869f6e6b0f338788e29ce54f528 Mon Sep 17 00:00:00 2001 From: To-Ki-O <108504207+To-Ki-O@users.noreply.github.com> Date: Wed, 29 Mar 2023 13:51:02 +0900 Subject: [PATCH] unit test for download module (#35) * initial commit to do test * modify test.ini and test_download.py in models * move test.ini from root to ckanext/feedback/tests * delete sections that is not needed * delete test.init and modify config/test.ini * add DownloadSummary model test * modify indents in download model test * add download controller test * add test about download service * delete test about download model * commit to checkout * change to use the mock of database access * commit to checkout * commit to checkout * commit to checkout * rewrite the test to use test DB * run isort, black, pflake8 * rename views to services * delete DownloadController.increment_resource_download * delete app_context * sepalate the test of extended_download * modify static initializaer to setup_class * add setup function and move resource and app into it * change setup to setup_method --- ckanext/feedback/controllers/download.py | 4 -- ckanext/feedback/tests/config/test.ini | 1 - .../tests/controllers/test_download.py | 59 ++++++++++++++++ .../tests/services/download/test_summary.py | 70 +++++++++++++++++++ 4 files changed, 129 insertions(+), 5 deletions(-) diff --git a/ckanext/feedback/controllers/download.py b/ckanext/feedback/controllers/download.py index 35e668072..3d0f5253a 100644 --- a/ckanext/feedback/controllers/download.py +++ b/ckanext/feedback/controllers/download.py @@ -5,10 +5,6 @@ class DownloadController: - @staticmethod - def increment_resource_downloads(resource_id): - increment_resource_downloads(resource_id) - # extend default download function to count when a resource is downloaded @staticmethod def extended_download(package_type, id, resource_id, filename=None): diff --git a/ckanext/feedback/tests/config/test.ini b/ckanext/feedback/tests/config/test.ini index 182f6cda9..e49bce5ad 100644 --- a/ckanext/feedback/tests/config/test.ini +++ b/ckanext/feedback/tests/config/test.ini @@ -13,7 +13,6 @@ sqlalchemy.url = postgresql://ckan:ckan@db/ckan_test datastore.write.url = postgresql://ckan:ckan@db/datastore_test datastore.read.url = postgresql://datastore_ro:ckan@db/datastore_test - # Logging configuration [loggers] keys = root, ckan, sqlalchemy diff --git a/ckanext/feedback/tests/controllers/test_download.py b/ckanext/feedback/tests/controllers/test_download.py index e69de29bb..29534e2a1 100644 --- a/ckanext/feedback/tests/controllers/test_download.py +++ b/ckanext/feedback/tests/controllers/test_download.py @@ -0,0 +1,59 @@ +from unittest.mock import patch + +import pytest +from ckan import model +from ckan.tests import factories +from flask import Flask + +from ckanext.feedback.command.feedback import ( + create_download_tables, + create_resource_tables, + create_utilization_tables, + get_engine, +) +from ckanext.feedback.controllers.download import DownloadController +from ckanext.feedback.models.download import DownloadSummary +from ckanext.feedback.models.session import session + + +def get_downloads(resource_id): + count = ( + session.query(DownloadSummary.download) + .filter(DownloadSummary.resource_id == resource_id) + .scalar() + ) + return count + + +@pytest.mark.usefixtures('clean_db', 'with_plugins', 'with_request_context') +class TestDownloadController: + @classmethod + def setup_class(cls): + model.repo.init_db() + engine = get_engine('db', '5432', 'ckan_test', 'ckan', 'ckan') + create_utilization_tables(engine) + create_resource_tables(engine) + create_download_tables(engine) + + def setup_method(self, method): + self.app = Flask(__name__) + + @patch('ckanext.feedback.controllers.download.download') + def test_extended_download(self, download): + resource = factories.Resource() + with self.app.test_request_context(headers={'Sec-Fetch-Dest': 'document'}): + DownloadController.extended_download( + 'package_type', resource['package_id'], resource['id'], None + ) + assert get_downloads(resource['id']) == 1 + assert download + + @patch('ckanext.feedback.controllers.download.download') + def test_extended_download_with_preview(self, download): + resource = factories.Resource() + with self.app.test_request_context(headers={'Sec-Fetch-Dest': 'image'}): + DownloadController.extended_download( + 'package_type', resource['package_id'], resource['id'], None + ) + assert get_downloads(resource['id']) is None + assert download diff --git a/ckanext/feedback/tests/services/download/test_summary.py b/ckanext/feedback/tests/services/download/test_summary.py index e69de29bb..57f735979 100644 --- a/ckanext/feedback/tests/services/download/test_summary.py +++ b/ckanext/feedback/tests/services/download/test_summary.py @@ -0,0 +1,70 @@ +import pytest +from ckan import model +from ckan.tests import factories + +from ckanext.feedback.command.feedback import ( + create_download_tables, + create_resource_tables, + create_utilization_tables, + get_engine, +) +from ckanext.feedback.models.download import DownloadSummary +from ckanext.feedback.models.session import session +from ckanext.feedback.services.download.summary import ( + get_package_downloads, + get_resource_downloads, + increment_resource_downloads, +) + + +def get_downloads(resource_id): + count = ( + session.query(DownloadSummary.download) + .filter(DownloadSummary.resource_id == resource_id) + .scalar() + ) + return count + + +@pytest.mark.usefixtures('clean_db', 'with_plugins', 'with_request_context') +class TestDownloadServices: + @classmethod + def setup_class(cls): + model.repo.init_db() + engine = get_engine('db', '5432', 'ckan_test', 'ckan', 'ckan') + create_utilization_tables(engine) + create_resource_tables(engine) + create_download_tables(engine) + + def test_increment_resource_downloads(self): + resource = factories.Resource() + increment_resource_downloads(resource['id']) + assert get_downloads(resource['id']) == 1 + increment_resource_downloads(resource['id']) + assert get_downloads(resource['id']) == 2 + + def test_get_package_download(self): + resource = factories.Resource() + assert get_package_downloads(resource['package_id']) == 0 + download_summary = DownloadSummary( + id=str('test_id'), + resource_id=resource['id'], + download=1, + created='2023-03-31 01:23:45.123456', + updated='2023-03-31 01:23:45.123456', + ) + session.add(download_summary) + assert get_package_downloads(resource['package_id']) == 1 + + def test_get_resource_download(self): + resource = factories.Resource() + assert get_resource_downloads(resource['id']) == 0 + download_summary = DownloadSummary( + id=str('test_id'), + resource_id=resource['id'], + download=1, + created='2023-03-31 01:23:45.123456', + updated='2023-03-31 01:23:45.123456', + ) + session.add(download_summary) + assert get_resource_downloads(resource['id']) == 1