From 999f6584c8df0ca8d6b9e45af447e07f797cd63e Mon Sep 17 00:00:00 2001 From: John Sharples Date: Wed, 20 Sep 2023 06:55:47 +0000 Subject: [PATCH 1/2] feature_2253_extract_tiles_tests --- .../extract_tiles/test_extract_tiles.py | 117 +++++++++++++++--- 1 file changed, 100 insertions(+), 17 deletions(-) diff --git a/internal/tests/pytests/wrappers/extract_tiles/test_extract_tiles.py b/internal/tests/pytests/wrappers/extract_tiles/test_extract_tiles.py index aa71f0eb56..5f10b5fe17 100644 --- a/internal/tests/pytests/wrappers/extract_tiles/test_extract_tiles.py +++ b/internal/tests/pytests/wrappers/extract_tiles/test_extract_tiles.py @@ -1,13 +1,12 @@ # !/usr/bin/env python3 import pytest - +from unittest import mock import os import datetime from metplus.wrappers.extract_tiles_wrapper import ExtractTilesWrapper - def extract_tiles_wrapper(metplus_config): config = metplus_config config.set('config', 'PROCESS_LIST', 'ExtractTiles') @@ -34,26 +33,42 @@ def extract_tiles_wrapper(metplus_config): config.set('config', 'EXTRACT_TILES_OUTPUT_DIR', '{OUTPUT_BASE}/extract_tiles') + config.set('config','FCST_EXTRACT_TILES_INPUT_TEMPLATE', '{INPUT_BASE}/fcst{lead?fmt=%HHH}.grb2') + config.set('config','OBS_EXTRACT_TILES_INPUT_TEMPLATE', '{INPUT_BASE}/obs{lead?fmt=%HHH}.grb2') + config.set('config','FCST_EXTRACT_TILES_OUTPUT_TEMPLATE', 'fcst_out.nc') + config.set('config','OBS_EXTRACT_TILES_OUTPUT_TEMPLATE', 'obs_out.nc') + config.set('config','FCST_EXTRACT_TILES_INPUT_DIR', '{INPUT_BASE}/fcst_tiles') + config.set('config','OBS_EXTRACT_TILES_INPUT_DIR', '{INPUT_BASE}/obs_tiles') + + config.set('config','FCST_VAR1_NAME','TMP') + config.set('config','FCST_VAR1_LEVELS', 'Z2') + config.set('config','OBS_VAR1_NAME', 'TMP') + config.set('config','OBS_VAR1_LEVELS', 'Z2') + wrapper = ExtractTilesWrapper(config) return wrapper -def get_storm_lines(wrapper): - filter_file = os.path.join(wrapper.config.getdir('METPLUS_BASE'), - 'internal', 'tests', - 'data', - 'stat_data', - 'fake_filter_20141214_00.tcst') - return get_input_lines(filter_file) +def get_test_file(wrapper, input_type): + if input_type == "mtd": + return os.path.join(wrapper.config.getdir('METPLUS_BASE'), + 'internal', 'tests', + 'data', + 'mtd', + 'fake_mtd_2d.txt') + if input_type == "storm": + return os.path.join(wrapper.config.getdir('METPLUS_BASE'), + 'internal', 'tests', + 'data', + 'stat_data', + 'fake_filter_20141214_00.tcst') +def get_storm_lines(wrapper): + return get_input_lines(get_test_file(wrapper, 'storm')) + def get_mtd_lines(wrapper): - input_file = os.path.join(wrapper.config.getdir('METPLUS_BASE'), - 'internal', 'tests', - 'data', - 'mtd', - 'fake_mtd_2d.txt') - return get_input_lines(input_file) + return get_input_lines(get_test_file(wrapper, 'mtd')) def get_input_lines(filepath): @@ -197,11 +212,79 @@ def test_get_grid_info(metplus_config, lat, lon, expected_result): @pytest.mark.parametrize( 'lat, lon, expected_result', [ (-54.9, -168.6, 'latlon 60 60 -70.0 -183.5 0.5 0.5'), - + (-37.8136, 144.9631, 'latlon 60 60 -53.0 130.0 0.5 0.5'), ] ) @pytest.mark.wrapper def test_get_grid(metplus_config, lat, lon, expected_result): wrapper = extract_tiles_wrapper(metplus_config) - storm_data = {'ALAT': lat, 'ALON': lon} + storm_data = { + 'ALAT': lat, + 'ALON': lon, + 'BLAT': lat, + 'BLON': lon, + 'CENTROID_LAT': lat, + 'CENTROID_LON': lon, + } assert(wrapper.get_grid('FCST', storm_data) == expected_result) + assert(wrapper.get_grid('OBS', storm_data) == expected_result) + assert(wrapper.get_grid('foo', storm_data,'MTD') == expected_result) + + # check error is raised + wrapper.get_grid('TIGER', storm_data) + last_err = wrapper.logger.error.call_args_list[-1][0][0] + assert "Invalid data type provided to get_grid: TIGER" in last_err + + +@pytest.mark.parametrize( +'tool_config,input_type',[ + #TC stat + ({ + 'EXTRACT_TILES_TC_STAT_INPUT_TEMPLATE': 'filter_{init?fmt=%Y%m%d}.tcst', + 'EXTRACT_TILES_TC_STAT_INPUT_DIR': '{INPUT_BASE}', + }, + "storm"), + #MTD + ({ + 'EXTRACT_TILES_MTD_INPUT_TEMPLATE': 'filter_{init?fmt=%Y%m%d}.tcst', + 'EXTRACT_TILES_MTD_INPUT_DIR': '{INPUT_BASE}' + }, + "mtd"), +] +) +def test_run_extract_tiles(metplus_config, tool_config, input_type): + config = metplus_config + for key, value in tool_config.items(): + config.set('config', key, value) + + with mock.patch.object(os.path, "exists", return_value=True): + wrapper = extract_tiles_wrapper(config) + test_file = get_test_file(wrapper, input_type) + with mock.patch.object(wrapper, + "get_location_input_file", + return_value=test_file): + wrapper.run_all_times() + assert wrapper.isOK + + +def test_get_location_input_file(metplus_config): + config = metplus_config + config.set('config', 'EXTRACT_TILES_TC_STAT_INPUT_TEMPLATE', 'filter_{init?fmt=%Y%m%d}.tcst') + config.set('config', 'EXTRACT_TILES_TC_STAT_INPUT_DIR', '/input/base/') + + wrapper = extract_tiles_wrapper(config) + time_info = { + 'loop_by': 'init', + 'init': datetime.datetime(2014, 12, 14, 0, 0), + } + + # Check error on missing file + path = wrapper.get_location_input_file(time_info, 'TC_STAT') + last_err = wrapper.logger.error.call_args_list[-1][0][0] + assert 'Could not find TC_STAT file: /input/base/filter_201412' in last_err + assert path == None + + with mock.patch.object(os.path, "exists", return_value=True): + path = wrapper.get_location_input_file(time_info, 'TC_STAT') + assert path == '/input/base/filter_20141214.tcst' + From e77709b0bbe2609e2a262bdca31ad6b8946598ff Mon Sep 17 00:00:00 2001 From: John Sharples Date: Tue, 26 Sep 2023 02:12:21 +0000 Subject: [PATCH 2/2] small typo --- .../tests/pytests/wrappers/extract_tiles/test_extract_tiles.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/tests/pytests/wrappers/extract_tiles/test_extract_tiles.py b/internal/tests/pytests/wrappers/extract_tiles/test_extract_tiles.py index 5f10b5fe17..9183821f1e 100644 --- a/internal/tests/pytests/wrappers/extract_tiles/test_extract_tiles.py +++ b/internal/tests/pytests/wrappers/extract_tiles/test_extract_tiles.py @@ -281,7 +281,7 @@ def test_get_location_input_file(metplus_config): # Check error on missing file path = wrapper.get_location_input_file(time_info, 'TC_STAT') last_err = wrapper.logger.error.call_args_list[-1][0][0] - assert 'Could not find TC_STAT file: /input/base/filter_201412' in last_err + assert 'Could not find TC_STAT file: /input/base/filter_20141214.tcst' in last_err assert path == None with mock.patch.object(os.path, "exists", return_value=True):