Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactor test_export_html to work with modules #121

Merged
merged 2 commits into from
Nov 29, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 32 additions & 16 deletions pywikitools/test/test_export_html.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
- export content.json (with current content)

Run tests:
python3 pywikitools/test/test_export_html.py
python3 pywikitools/test/test_export_html.py
"""

from os.path import abspath, dirname, join, exists
Expand All @@ -17,11 +17,12 @@

import requests
from unittest.mock import Mock, patch
from configparser import ConfigParser

from pywikitools.fortraininglib import ForTrainingLib
from pywikitools.resourcesbot.changes import ChangeLog, ChangeType
from pywikitools.resourcesbot.data_structures import LanguageInfo, json_decode
from pywikitools.resourcesbot.export_html import ExportHTML
from pywikitools.resourcesbot.modules.export_html import ExportHTML


class TestExportHTML(unittest.TestCase):
Expand All @@ -37,19 +38,23 @@ def setUpClass(self):

@patch("os.makedirs")
def test_run_with_empty_base_folder(self, mock_makedirs):
with self.assertLogs('pywikitools.resourcesbot.export_html', level='WARNING'):
export_html = ExportHTML(self.fortraininglib, "", force_rewrite=False)
empty_config = ConfigParser()
with self.assertLogs('pywikitools.resourcesbot.modules.export_html', level='WARNING'):
export_html = ExportHTML(self.fortraininglib, empty_config, None)

# run() should return without doing anything because of empty base folder
export_html.run(self.language_info, self.english_info, ChangeLog(), ChangeLog())
export_html.run(self.language_info, self.english_info, ChangeLog(), ChangeLog(), force_rewrite=False)
mock_makedirs.assert_not_called()

def test_run_filters_unfinished_worksheets(self):
fortraininglib_mock = Mock()
temp_config = ConfigParser()
temp_config.add_section("Paths")
with tempfile.TemporaryDirectory() as temp_dir:
export_html = ExportHTML(fortraininglib_mock, temp_dir, force_rewrite=False)
temp_config.set("Paths", "htmlexport", temp_dir)
export_html = ExportHTML(fortraininglib_mock, temp_config, None)
with patch.object(export_html, 'has_relevant_change', return_value=False) as mock_has_relevant_change:
export_html.run(self.language_info, self.english_info, ChangeLog(), ChangeLog())
export_html.run(self.language_info, self.english_info, ChangeLog(), ChangeLog(), force_rewrite=False)
calls = [call[0][0] for call in mock_has_relevant_change.call_args_list]
# Healing is finished, Church is an unfinished worksheet
self.assertIn('Healing', calls)
Expand All @@ -63,11 +68,14 @@ def test_directory_structure_creation(self):
with tempfile.TemporaryDirectory() as temp_dir:
# Create target paths to check later
base_folder = join(temp_dir, "not_existing_yet")
config = ConfigParser()
config.add_section("Paths")
config.set("Paths", "htmlexport", base_folder)

# Base folder should be created directly when initializing the class
export_html = ExportHTML(self.fortraininglib, base_folder, force_rewrite=False)
export_html = ExportHTML(self.fortraininglib, config, None)
self.assertTrue(exists(base_folder))
export_html.run(self.language_info, self.english_info, ChangeLog(), ChangeLog())
export_html.run(self.language_info, self.english_info, ChangeLog(), ChangeLog(), force_rewrite=False)

# Assert that the right directories were created
self.assertTrue(exists(join(base_folder, "ru")))
Expand All @@ -76,7 +84,7 @@ def test_directory_structure_creation(self):

# assert that the method still works if the folders are already there
with self.assertNoLogs(level='WARNING'):
export_html.run(self.language_info, self.english_info, ChangeLog(), ChangeLog())
export_html.run(self.language_info, self.english_info, ChangeLog(), ChangeLog(), force_rewrite=False)

@patch('pywikitools.fortraininglib.ForTrainingLib.get_page_html')
def test_download_and_save_transformed_html_and_images(self, mock_get_page_html):
Expand All @@ -86,6 +94,9 @@ def test_download_and_save_transformed_html_and_images(self, mock_get_page_html)
changelog.add_change('Healing', ChangeType.UPDATED_WORKSHEET)
changelog.add_change("Church", ChangeType.NEW_WORKSHEET)

config = ConfigParser()
config.add_section("Paths")

# Mock the response for the image download
response = requests.Response()
response.status_code = 200
Expand All @@ -94,10 +105,11 @@ def test_download_and_save_transformed_html_and_images(self, mock_get_page_html)

# Initialize the ExportHTML class with a valid base folder
with tempfile.TemporaryDirectory() as temp_dir:
export_html = ExportHTML(self.fortraininglib, temp_dir, force_rewrite=False)
config.set("Paths", "htmlexport", temp_dir)
export_html = ExportHTML(self.fortraininglib, config, None)

with patch('requests.get', return_value=response):
export_html.run(self.language_info, self.english_info, changelog, ChangeLog())
export_html.run(self.language_info, self.english_info, changelog, ChangeLog(), force_rewrite=False)

# Assert the file was created correctly
path_to_transformed_html = join(temp_dir, 'ru', 'Исцеление.html')
Expand All @@ -119,7 +131,11 @@ def test_download_and_save_transformed_html_and_images(self, mock_get_page_html)
self.assertEqual(expected_file.read(), test_file.read())

def test_complex_export_html(self):
config = ConfigParser()
config.add_section("Paths")

with tempfile.TemporaryDirectory() as temp_dir:
config.set("Paths", "htmlexport", temp_dir)
ar_changelog = ChangeLog()
# normal worksheet
ar_changelog.add_change('Hearing_from_God', ChangeType.UPDATED_WORKSHEET)
Expand All @@ -138,8 +154,8 @@ def test_complex_export_html(self):
with open(join(dirname(abspath(__file__)), "data", "en.json"), 'r') as f:
en_language_info: LanguageInfo = json.load(f, object_hook=json_decode)

export_html = ExportHTML(self.fortraininglib, temp_dir, force_rewrite=False)
export_html.run(ar_language_info, en_language_info, ar_changelog, ChangeLog())
export_html = ExportHTML(self.fortraininglib, config, None)
export_html.run(ar_language_info, en_language_info, ar_changelog, ChangeLog(), force_rewrite=False)

self.assertTrue(exists(join(temp_dir, 'ar', 'files', 'Head-32.png')))
self.assertTrue(exists(expected_path_hearing))
Expand All @@ -148,9 +164,9 @@ def test_complex_export_html(self):

# run with force rewrite
self.assertFalse(exists(expected_path_prayer))
export_html = ExportHTML(self.fortraininglib, temp_dir, force_rewrite=True)
export_html = ExportHTML(self.fortraininglib, config, None)
with self.assertLogs():
export_html.run(ar_language_info, en_language_info, ar_changelog, ChangeLog())
export_html.run(ar_language_info, en_language_info, ar_changelog, ChangeLog(), force_rewrite=True)
self.assertTrue(exists(expected_path_prayer))


Expand Down