From b5f2e705ba5577d2538b6fe86f9ce8d6d3a87de7 Mon Sep 17 00:00:00 2001 From: Eric Duvic Date: Fri, 30 Aug 2024 17:03:25 +0300 Subject: [PATCH] Adding tests for tile.py --- tests/api/__init__.py | 0 tests/api/test_idp.py | 0 tests/models/__init__.py | 0 tests/models/test_tile.py | 132 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 132 insertions(+) create mode 100644 tests/api/__init__.py create mode 100644 tests/api/test_idp.py create mode 100644 tests/models/__init__.py create mode 100644 tests/models/test_tile.py diff --git a/tests/api/__init__.py b/tests/api/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/api/test_idp.py b/tests/api/test_idp.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/models/__init__.py b/tests/models/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/models/test_tile.py b/tests/models/test_tile.py new file mode 100644 index 00000000..e40ed0d8 --- /dev/null +++ b/tests/models/test_tile.py @@ -0,0 +1,132 @@ +import pytest +import os +import urllib3 +from dashboard.models.tile import __file__ as module_file +from dashboard.models.tile import CDNTransfer, urllib3 + + +class MockAppConfig: + CDN = "http://mock-cdn.com" + + +@pytest.fixture +def cdn_transfer(): + app_config = MockAppConfig() + return CDNTransfer(app_config) + + +def test_is_updated_etag_mismatch(mocker, cdn_transfer): + mock_request = mocker.patch("urllib3.PoolManager.request") + mock_request.return_value.headers = {"ETag": "new-etag"} + mocker.patch.object(cdn_transfer, "_etag", return_value="old-etag") + + assert cdn_transfer.is_updated() is True + + +def test_is_updated_etag_match(mocker, cdn_transfer): + mock_request = mocker.patch("urllib3.PoolManager.request") + mock_request.return_value.headers = {"ETag": "matching-etag"} + mocker.patch.object(cdn_transfer, "_etag", return_value="matching-etag") + + assert cdn_transfer.is_updated() is False + + +def test_update_etag(mocker, cdn_transfer): + mock_open = mocker.patch("builtins.open", mocker.mock_open()) + + cdn_transfer._update_etag("new-etag") + + mock_open.assert_called_once_with( + os.path.join(os.path.dirname(module_file), "../data/apps.yml-etag"), "w+" + ) + mock_open().write.assert_called_once_with("new-etag") + + +def test_etag_file_exists(mocker, cdn_transfer): + mock_open = mocker.patch("builtins.open", mocker.mock_open(read_data="stored-etag")) + + assert cdn_transfer._etag() == "stored-etag" + mock_open.assert_called_once_with( + os.path.join(os.path.dirname(module_file), "../data/apps.yml-etag"), "r" + ) + + +def test_etag_file_missing(mocker, cdn_transfer): + mock_open = mocker.patch("builtins.open", mocker.mock_open()) + mock_open.side_effect = FileNotFoundError + + assert cdn_transfer._etag() == "12345678" + + +def test_download_config(mocker, cdn_transfer): + mock_response = mocker.Mock() + mock_response.status = 200 + mock_response.headers = {"ETag": "new-etag"} + mock_response.data = b"mock apps.yml content" + mocker.patch.object(urllib3.PoolManager, 'request', return_value=mock_response) + mock_open_yml = mocker.patch("builtins.open", mocker.mock_open()) + mock_open_yml.return_value.fileno.return_value = 3 + mock_open_etag = mocker.patch("builtins.open", mocker.mock_open()) + mock_fsync = mocker.patch('os.fsync') + + cdn_transfer._download_config() + + mock_open_yml.assert_any_call( + os.path.join(os.path.dirname(module_file), "../data/apps.yml"), "wb" + ) + mock_open_yml().write.assert_called_once_with(b"mock apps.yml content") + mock_fsync().assert_called_once_with(3) + mock_open_etag.assert_any_call( + os.path.join(os.path.dirname(module_file), "../data/apps.yml-etag"), "w+" + ) + mock_open_etag().write.assert_called_once_with("new-etag") + +def test_download_config_http_error(mocker, cdn_transfer): + mocker.patch("urllib3.PoolManager.request", side_effect=urllib3.exceptions.HTTPError) + + with pytest.raises(urllib3.exceptions.HTTPError): + cdn_transfer._download_config() + + +def test_load_apps_yml(mocker, cdn_transfer): + mock_open = mocker.patch("builtins.open", mocker.mock_open(read_data="mock apps.yml content")) + + cdn_transfer._load_apps_yml() + + mock_open.assert_called_once_with( + os.path.join(os.path.dirname(module_file), "../data/apps.yml"), "r" + ) + assert cdn_transfer.apps_yml == "mock apps.yml content" + + +def test_sync_config_update(mocker, cdn_transfer): + mocker.patch.object(CDNTransfer, "is_updated", return_value=True) + mock_download = mocker.patch.object(CDNTransfer, "_download_config") + mock_load = mocker.patch.object(CDNTransfer, "_load_apps_yml") + + cdn_transfer.sync_config() + + mock_download.assert_called_once() + mock_load.assert_called_once() + + +def test_sync_config_no_update(mocker, cdn_transfer): + mocker.patch.object(CDNTransfer, "is_updated", return_value=False) + mock_download = mocker.patch.object(CDNTransfer, "_download_config") + mock_load = mocker.patch.object(CDNTransfer, "_load_apps_yml") + + cdn_transfer.sync_config() + + mock_download.assert_not_called() + mock_load.assert_called_once() + + +def test_sync_config_download_error(mocker, cdn_transfer): + mocker.patch.object(CDNTransfer, "is_updated", return_value=True) + mock_download = mocker.patch.object(CDNTransfer, "_download_config", side_effect=Exception("Test Exception")) + mock_load = mocker.patch.object(CDNTransfer, "_load_apps_yml") + + cdn_transfer.sync_config() + + mock_download.assert_called_once() + mock_load.assert_not_called() # if download fails, it shouldn't try to load