1+ import shutil
12from unittest .mock import call , patch
23
34import pytest
45
56from climateset import TEST_DIR
6- from climateset .download .downloader import Downloader , download_from_config_file
7- from climateset .utils import get_yaml_config
7+ from climateset .download .cmip6_downloader import CMIP6Downloader
8+ from climateset .download .constants .esgf import CMIP6 , INPUT4MIPS
9+ from climateset .download .downloader import download_from_config_file
10+ from climateset .download .downloader_config import (
11+ create_cmip6_downloader_config_from_file ,
12+ create_input4mips_downloader_config_from_file ,
13+ )
14+ from climateset .download .input4mips_downloader import Input4MipsDownloader
815
916MINIMAL_DATASET_CONFIG_PATH = TEST_DIR / "resources/test_minimal_dataset.yaml"
17+ TEST_TMP_DIR = TEST_DIR / "resources/.tmp"
1018
11- DOWNLOAD_RAW_INPUT_SINGLE_VAR = "climateset.download.downloader.Downloader.download_raw_input_single_var"
19+ DOWNLOAD_RAW_INPUT_SINGLE_VAR = (
20+ "climateset.download.input4mips_downloader.Input4MipsDownloader.download_raw_input_single_var"
21+ )
1222DOWNLOAD_META_HISTORIC_SINGLE_VAR = (
13- "climateset.download.downloader.Downloader .download_meta_historic_biomassburning_single_var"
23+ "climateset.download.input4mips_downloader.Input4MipsDownloader .download_meta_historic_biomassburning_single_var"
1424)
15- DOWNLOAD_MODEL_SINGLE_VAR = "climateset.download.downloader.Downloader .download_from_model_single_var"
25+ DOWNLOAD_MODEL_SINGLE_VAR = "climateset.download.cmip6_downloader.CMIP6Downloader .download_from_model_single_var"
1626SUBPROCESS_RUN = "subprocess.run"
1727
1828EXPECTED_MINIMAL_RAW_INPUT_CALLS = [
3646]
3747
3848EXPECTED_MINIMAL_MODEL_CALLS = [
39- call (variable = "tas" , experiment = "historical" ),
40- call (variable = "tas" , experiment = "ssp126" ),
49+ call (project = "CMIP6" , variable = "tas" , experiment = "historical" ),
50+ call (project = "CMIP6" , variable = "tas" , experiment = "ssp126" ),
4151]
4252
4353
54+ def delete_tmp_dir ():
55+ shutil .rmtree (TEST_TMP_DIR , ignore_errors = True )
56+
57+
4458@pytest .fixture ()
4559def mock_raw_input_single_var ():
4660 with patch (DOWNLOAD_RAW_INPUT_SINGLE_VAR ) as mock_function :
@@ -66,71 +80,83 @@ def mock_subprocess_run():
6680
6781
6882@pytest .fixture
69- def simple_downloader_object ():
83+ def input4mips_downloader_object ():
7084 config_source = MINIMAL_DATASET_CONFIG_PATH
71- config = get_yaml_config (config_source )
72- model = config [ "models" ][ 0 ]
73- downloader_kwargs = config [ "downloader_kwargs" ]
74- return Downloader ( model = model , ** downloader_kwargs )
85+ config = create_input4mips_downloader_config_from_file (config_source )
86+ config . data_dir = TEST_TMP_DIR
87+ yield Input4MipsDownloader ( config = config )
88+ delete_tmp_dir ( )
7589
7690
77- def test_downloader_init (simple_downloader_object ):
78- assert isinstance (simple_downloader_object , Downloader )
91+ @pytest .fixture
92+ def cmip6_downloader_object ():
93+ config_source = MINIMAL_DATASET_CONFIG_PATH
94+ config = create_cmip6_downloader_config_from_file (config_source )
95+ config .data_dir = TEST_TMP_DIR
96+ yield CMIP6Downloader (config = config )
97+ delete_tmp_dir ()
98+
7999
100+ def test_downloader_init (input4mips_downloader_object , cmip6_downloader_object ):
101+ assert isinstance (input4mips_downloader_object , Input4MipsDownloader )
102+ assert isinstance (cmip6_downloader_object , CMIP6Downloader )
80103
81- def test_downloader_base_params (simple_downloader_object ):
82- assert simple_downloader_object .model == "NorESM2-LM"
83- assert simple_downloader_object .experiments == ["historical" , "ssp126" ]
84104
105+ def test_downloader_base_params (input4mips_downloader_object , cmip6_downloader_object ):
106+ assert input4mips_downloader_object .config .project == INPUT4MIPS
107+ assert input4mips_downloader_object .config .experiments == ["historical" , "ssp126" ]
108+ assert cmip6_downloader_object .config .project == CMIP6
109+ assert cmip6_downloader_object .config .model == ["NorESM2-LM" ]
110+ assert cmip6_downloader_object .config .experiments == ["historical" , "ssp126" ]
85111
86- def test_downloader_max_possible_member_number (simple_downloader_object ):
87- assert simple_downloader_object .max_ensemble_members == 1
88112
113+ def test_downloader_max_possible_member_number (cmip6_downloader_object ):
114+ assert cmip6_downloader_object .config .max_ensemble_members == 10
89115
90- def test_downloader_variables (simple_downloader_object ):
91- assert simple_downloader_object .raw_vars == [
116+
117+ def test_downloader_variables (input4mips_downloader_object , cmip6_downloader_object ):
118+ assert cmip6_downloader_object .config .variables == ["tas" ]
119+ assert input4mips_downloader_object .config .variables == [
92120 "CO2_em_anthro" ,
93121 "CO2_em_AIR_anthro" ,
94122 "CH4_em_openburning" ,
95123 "CH4_em_anthro" ,
96124 "CH4_em_AIR_anthro" ,
97125 ]
98- assert simple_downloader_object .biomass_vars == ["CO2" , "CH4" ]
99- assert simple_downloader_object .model_vars == ["tas" ]
100- assert simple_downloader_object .meta_vars_percentage == [
126+ assert input4mips_downloader_object .config .biomass_vars == ["CO2" , "CH4" ]
127+ assert input4mips_downloader_object .config .meta_vars_percentage == [
101128 "CH4_percentage_AGRI" ,
102129 "CH4_percentage_BORF" ,
103130 "CH4_percentage_DEFO" ,
104131 "CH4_percentage_PEAT" ,
105132 "CH4_percentage_SAVA" ,
106133 "CH4_percentage_TEMF" ,
107134 ]
108- assert simple_downloader_object .meta_vars_share == ["CH4_openburning_share" ]
135+ assert input4mips_downloader_object . config .meta_vars_share == ["CH4_openburning_share" ]
109136
110137
111- def test_downloader_model_params (simple_downloader_object ):
112- assert simple_downloader_object .model_node_link == "https://esgf-data.dkrz.de/esg-search"
113- assert simple_downloader_object .model_source_center == "NCC"
138+ def test_downloader_model_params (cmip6_downloader_object ):
139+ assert cmip6_downloader_object .config .node_link == "http://esgf-node.llnl.gov/esg-search/"
114140
115141
116- def test_download_raw_input (simple_downloader_object , mock_raw_input_single_var , mock_meta_historic_single_var ):
117- simple_downloader_object . download_raw_input ()
142+ def test_download_raw_input (input4mips_downloader_object , mock_raw_input_single_var , mock_meta_historic_single_var ):
143+ input4mips_downloader_object . download ()
118144 assert mock_raw_input_single_var .call_args_list == EXPECTED_MINIMAL_RAW_INPUT_CALLS
119145 assert mock_raw_input_single_var .call_count == 8
120146 assert mock_meta_historic_single_var .call_args_list == EXPECTED_MINIMAL_META_HISTORIC_CALLS
121147 assert mock_meta_historic_single_var .call_count == 6
122148
123149
124- def test_download_from_model (simple_downloader_object , mock_model_single_var ):
125- simple_downloader_object . download_from_model ()
150+ def test_download_from_model (cmip6_downloader_object , mock_model_single_var ):
151+ cmip6_downloader_object . download ()
126152 assert mock_model_single_var .call_args_list == EXPECTED_MINIMAL_MODEL_CALLS
127153 assert mock_model_single_var .call_count == 2
128154
129155
130156def test_download_from_config_file (
131- simple_downloader_object , mock_raw_input_single_var , mock_meta_historic_single_var , mock_model_single_var
157+ input4mips_downloader_object , mock_raw_input_single_var , mock_meta_historic_single_var , mock_model_single_var
132158):
133- download_from_config_file (config = MINIMAL_DATASET_CONFIG_PATH )
159+ download_from_config_file (config_file = MINIMAL_DATASET_CONFIG_PATH )
134160
135161 assert mock_raw_input_single_var .call_args_list == EXPECTED_MINIMAL_RAW_INPUT_CALLS
136162 assert mock_raw_input_single_var .call_count == 8
@@ -153,26 +179,25 @@ def _assert_content_is_in_wget_script(mock_call, string_content):
153179 assert string_content in wget_script_content
154180
155181
156- def test_download_raw_input_single_var (simple_downloader_object , mock_subprocess_run ):
182+ def test_download_raw_input_single_var (input4mips_downloader_object , mock_subprocess_run ):
157183 download_subprocess = mock_subprocess_run
158- simple_downloader_object .download_raw_input_single_var (variable = "CO2_em_anthro" , institution_id = "PNNL-JGCRI" )
184+ input4mips_downloader_object .download_raw_input_single_var (variable = "CO2_em_anthro" , institution_id = "PNNL-JGCRI" )
159185
160186 expected_files = [
161- "CO2-em-anthro_input4MIPs_emissions_CMIP_CEDS-2017-05-18_gn_175001-179912.nc" ,
162- "CO2-em-anthro_input4MIPs_emissions_CMIP_CEDS-2017-05-18_gn_180001-184912.nc" ,
163- "CO2-em-anthro_input4MIPs_emissions_CMIP_CEDS-2017-05-18_gn_185001-185012.nc" ,
164- "CO2-em-anthro_input4MIPs_emissions_CMIP_CEDS-2017-05-18_gn_185101-189912.nc" ,
165- "CO2-em-anthro_input4MIPs_emissions_CMIP_CEDS-2017-05-18_gn_190001-194912.nc" ,
166- "CO2-em-anthro_input4MIPs_emissions_CMIP_CEDS-2017-05-18_gn_195001-199912.nc" ,
167- "CO2-em-anthro_input4MIPs_emissions_CMIP_CEDS-2017-05-18_gn_200001-201412.nc" ,
187+ "CO2-em-anthro_input4MIPs_emissions_CMIP_CEDS-CMIP-2024-11-25_gn_175001-179912.nc" ,
188+ "CO2-em-anthro_input4MIPs_emissions_CMIP_CEDS-CMIP-2024-11-25_gn_180001-184912.nc" ,
189+ "CO2-em-anthro_input4MIPs_emissions_CMIP_CEDS-CMIP-2024-11-25_gn_185001-189912.nc" ,
190+ "CO2-em-anthro_input4MIPs_emissions_CMIP_CEDS-CMIP-2024-11-25_gn_190001-194912.nc" ,
191+ "CO2-em-anthro_input4MIPs_emissions_CMIP_CEDS-CMIP-2024-11-25_gn_195001-199912.nc" ,
192+ "CO2-em-anthro_input4MIPs_emissions_CMIP_CEDS-CMIP-2024-11-25_gn_200001-202212.nc" ,
168193 ]
169194 download_subprocess .assert_called_once ()
170195 for f in expected_files :
171196 _assert_content_is_in_wget_script (download_subprocess , f )
172197
173198
174- def test_download_meta_historic_biomassburning_single_var (simple_downloader_object , mock_subprocess_run ):
175- simple_downloader_object .download_meta_historic_biomassburning_single_var (
199+ def test_download_meta_historic_biomassburning_single_var (input4mips_downloader_object , mock_subprocess_run ):
200+ input4mips_downloader_object .download_meta_historic_biomassburning_single_var (
176201 variable = "CH4_percentage_AGRI" , institution_id = "VUA"
177202 )
178203
@@ -184,8 +209,8 @@ def test_download_meta_historic_biomassburning_single_var(simple_downloader_obje
184209 _assert_content_is_in_wget_script (mock_call = mock_subprocess_run , string_content = f )
185210
186211
187- def test_download_from_model_single_var (simple_downloader_object , mock_subprocess_run ):
188- simple_downloader_object .download_from_model_single_var (variable = "tas" , experiment = "ssp126" )
212+ def test_download_from_model_single_var (cmip6_downloader_object , mock_subprocess_run ):
213+ cmip6_downloader_object .download_from_model_single_var (variable = "tas" , experiment = "ssp126" )
189214
190215 expected_files = [
191216 "tas_Amon_NorESM2-LM_ssp126_r1i1p1f1_gn_201501-202012.nc" ,
@@ -198,6 +223,6 @@ def test_download_from_model_single_var(simple_downloader_object, mock_subproces
198223 "tas_Amon_NorESM2-LM_ssp126_r1i1p1f1_gn_208101-209012.nc" ,
199224 "tas_Amon_NorESM2-LM_ssp126_r1i1p1f1_gn_209101-210012.nc" ,
200225 ]
201- mock_subprocess_run .assert_called_once ()
226+ mock_subprocess_run .assert_called ()
202227 for f in expected_files :
203228 _assert_content_is_in_wget_script (mock_call = mock_subprocess_run , string_content = f )
0 commit comments