test_download.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. import pytest
  2. from src.faostat_data_primap.download import (
  3. find_previous_release_path,
  4. )
  5. @pytest.fixture
  6. def temp_domain_directories(tmp_path):
  7. """
  8. Sets up a temporary directory structure for domains and releases for testing.
  9. Parameters
  10. ----------
  11. tmp_path : pathlib.Path
  12. A pytest-provided temporary directory path.
  13. Returns
  14. -------
  15. dict
  16. A dictionary containing the paths to the `downloaded_data` directory,
  17. the specific domain directory, and a list of sorted release paths.
  18. """
  19. downloaded_data = tmp_path / "downloaded_data"
  20. downloaded_data.mkdir()
  21. domains = (
  22. "farm_gate_emissions_crops",
  23. "farm_gate_livestock",
  24. "farm_gate_agriculture_energy",
  25. "land_use_forests",
  26. "land_use_fires",
  27. "land_use_drained_organic_soils",
  28. "pre_post_agricultural_production",
  29. )
  30. domain_paths = []
  31. for domain in domains:
  32. domain_path = downloaded_data / domain
  33. domain_path.mkdir()
  34. domain_paths.append(domain_path)
  35. return {
  36. "downloaded_data": downloaded_data,
  37. "domain_paths": domain_paths,
  38. }
  39. @pytest.mark.parametrize(
  40. "releases," "current_release_date, " "expected_result_date",
  41. [
  42. pytest.param(
  43. ["2023-12-13", "2022-03-18", "2024-11-29", "2024-11-09"],
  44. "2024-11-29",
  45. "2024-11-09",
  46. id="current release is latest release",
  47. ),
  48. pytest.param(
  49. ["2023-12-13", "2022-03-18", "2024-11-29", "2024-11-09"],
  50. "2023-12-13",
  51. "2022-03-18",
  52. id="current somewhere not the latest release",
  53. ),
  54. ],
  55. )
  56. def test_find_previous_release_path_exists(
  57. temp_domain_directories, releases, current_release_date, expected_result_date
  58. ):
  59. domain_path = temp_domain_directories["domain_paths"][
  60. 0
  61. ] # farm_gate_emissions_crops
  62. current_release_path = domain_path / current_release_date
  63. expected_result = domain_path / expected_result_date
  64. release_paths = []
  65. for release in releases:
  66. release_path = domain_path / release
  67. release_path.mkdir()
  68. release_paths.append(release_path)
  69. result = find_previous_release_path(current_release_path)
  70. assert result == expected_result
  71. @pytest.mark.parametrize(
  72. "releases,current_release_date",
  73. [
  74. pytest.param(
  75. ["2023-12-13", "2022-03-18", "2024-11-29", "2024-11-09"],
  76. "2022-03-18",
  77. id="current release is oldest release",
  78. ),
  79. pytest.param(
  80. ["2024-11-09"], "2024-11-09", id="current release is only release"
  81. ),
  82. ],
  83. )
  84. def test_find_previous_release_path_that_does_not_exists(
  85. temp_domain_directories, releases, current_release_date
  86. ):
  87. domain_path = temp_domain_directories["domain_paths"][
  88. 0
  89. ] # farm_gate_emissions_crops
  90. current_release_path = domain_path / current_release_date
  91. release_paths = []
  92. for release in releases:
  93. release_path = domain_path / release
  94. release_path.mkdir()
  95. release_paths.append(release_path)
  96. result = find_previous_release_path(current_release_path)
  97. assert not result
  98. @pytest.mark.parametrize(
  99. "releases,current_release_date, error_msg",
  100. [
  101. pytest.param(
  102. ["2023-12-13", "2022-03-18", "2024-11-29", "20240-11-09"],
  103. "2022-03-18",
  104. (
  105. "All release folders must be in YYYY-MM-DD format, got "
  106. "['2022-03-18', '2023-12-13', '2024-11-29', '20240-11-09']"
  107. ),
  108. id="typo",
  109. ),
  110. pytest.param(
  111. ["20231213", "2022-03-18", "2024-11-29", "2024-11-09"],
  112. "2022-03-18",
  113. (
  114. "All release folders must be in YYYY-MM-DD format, got "
  115. "['2022-03-18', '20231213', '2024-11-09', '2024-11-29']"
  116. ),
  117. id="missing hyphen",
  118. ),
  119. ],
  120. )
  121. def test_find_previous_release_path_wrong_dir_format(
  122. temp_domain_directories, releases, current_release_date, error_msg
  123. ):
  124. domain_path = temp_domain_directories["domain_paths"][
  125. 0
  126. ] # farm_gate_emissions_crops
  127. current_release_path = domain_path / current_release_date
  128. release_paths = []
  129. for release in releases:
  130. release_path = domain_path / release
  131. release_path.mkdir()
  132. release_paths.append(release_path)
  133. with pytest.raises(ValueError) as excinfo:
  134. result = find_previous_release_path(current_release_path) # noqa: F841
  135. assert str(excinfo.value) == error_msg