Skip to content

Commit

Permalink
added tests for new flask app endpoints. #1662
Browse files Browse the repository at this point in the history
  • Loading branch information
davemfish committed Jan 28, 2025
1 parent 8acd21a commit 24ca23e
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 10 deletions.
1 change: 0 additions & 1 deletion src/natcap/invest/ui_server.py
Original file line number Diff line number Diff line change
Expand Up @@ -286,7 +286,6 @@ def get_supported_languages():
def get_geometamaker_profile():
"""Return the user-profile from geometamaker."""
config = geometamaker.Config()
print(config.profile.model_dump())
return config.profile.model_dump()


Expand Down
60 changes: 51 additions & 9 deletions tests/test_ui_server.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,29 +34,31 @@ def test_get_vector_colnames(self):
# an empty path
response = test_client.post(
f'{ROUTE_PREFIX}/colnames', json={'vector_path': ''})
colnames = json.loads(response.get_data(as_text=True))
self.assertEqual(response.status_code, 422)
colnames = json.loads(response.get_data(as_text=True))
self.assertEqual(colnames, [])
# a vector with one column
path = os.path.join(
TEST_DATA_PATH, 'annual_water_yield', 'input',
'watersheds.shp')
response = test_client.post(
f'{ROUTE_PREFIX}/colnames', json={'vector_path': path})
self.assertEqual(response.status_code, 200)
colnames = json.loads(response.get_data(as_text=True))
self.assertEqual(colnames, ['ws_id'])
# a non-vector file
path = os.path.join(TEST_DATA_PATH, 'ndr', 'input', 'dem.tif')
response = test_client.post(
f'{ROUTE_PREFIX}/colnames', json={'vector_path': path})
colnames = json.loads(response.get_data(as_text=True))
self.assertEqual(response.status_code, 422)
colnames = json.loads(response.get_data(as_text=True))
self.assertEqual(colnames, [])

def test_get_invest_models(self):
"""UI server: get_invest_models endpoint."""
test_client = ui_server.app.test_client()
response = test_client.get(f'{ROUTE_PREFIX}/models')
self.assertEqual(response.status_code, 200)
models_dict = json.loads(response.get_data(as_text=True))
for model in models_dict.values():
self.assertEqual(set(model), {'model_name', 'aliases'})
Expand All @@ -65,6 +67,7 @@ def test_get_invest_spec(self):
"""UI server: get_invest_spec endpoint."""
test_client = ui_server.app.test_client()
response = test_client.post(f'{ROUTE_PREFIX}/getspec', json='sdr')
self.assertEqual(response.status_code, 200)
spec = json.loads(response.get_data(as_text=True))
self.assertEqual(
set(spec),
Expand All @@ -83,6 +86,7 @@ def test_get_invest_validate(self):
'args': json.dumps(args)
}
response = test_client.post(f'{ROUTE_PREFIX}/validate', json=payload)
self.assertEqual(response.status_code, 200)
results = json.loads(response.get_data(as_text=True))
expected = carbon.validate(args)
# These differ only because a tuple was transformed to a list during
Expand All @@ -92,7 +96,7 @@ def test_get_invest_validate(self):
def test_post_datastack_file(self):
"""UI server: post_datastack_file endpoint."""
test_client = ui_server.app.test_client()
self.workspace_dir = tempfile.mkdtemp()
# self.workspace_dir = tempfile.mkdtemp()
expected_datastack = {
'args': {
'workspace_dir': 'foo'
Expand All @@ -105,6 +109,7 @@ def test_post_datastack_file(self):
file.write(json.dumps(expected_datastack))
response = test_client.post(
f'{ROUTE_PREFIX}/post_datastack_file', json={'filepath': filepath})
self.assertEqual(response.status_code, 200)
response_data = json.loads(response.get_data(as_text=True))
self.assertEqual(
set(response_data),
Expand All @@ -114,7 +119,7 @@ def test_post_datastack_file(self):
def test_write_parameter_set_file(self):
"""UI server: write_parameter_set_file endpoint."""
test_client = ui_server.app.test_client()
self.workspace_dir = tempfile.mkdtemp()
# self.workspace_dir = tempfile.mkdtemp()
filepath = os.path.join(self.workspace_dir, 'datastack.json')
payload = {
'filepath': filepath,
Expand All @@ -126,6 +131,7 @@ def test_write_parameter_set_file(self):
}
response = test_client.post(
f'{ROUTE_PREFIX}/write_parameter_set_file', json=payload)
self.assertEqual(response.status_code, 200)
self.assertEqual(
response.json,
{'message': 'Parameter set saved', 'error': False})
Expand All @@ -140,7 +146,7 @@ def test_write_parameter_set_file_error_handling(self):
should catch a ValueError and return an error message.
"""
test_client = ui_server.app.test_client()
self.workspace_dir = tempfile.mkdtemp()
# self.workspace_dir = tempfile.mkdtemp()
filepath = os.path.join(self.workspace_dir, 'datastack.json')
payload = {
'filepath': filepath,
Expand All @@ -155,14 +161,15 @@ def test_write_parameter_set_file_error_handling(self):
side_effect=ValueError(error_message)):
response = test_client.post(
f'{ROUTE_PREFIX}/write_parameter_set_file', json=payload)
self.assertEqual(response.status_code, 200)
self.assertEqual(
response.json,
{'message': error_message, 'error': True})

def test_save_to_python(self):
"""UI server: save_to_python endpoint."""
test_client = ui_server.app.test_client()
self.workspace_dir = tempfile.mkdtemp()
# self.workspace_dir = tempfile.mkdtemp()
filepath = os.path.join(self.workspace_dir, 'script.py')
payload = {
'filepath': filepath,
Expand All @@ -171,14 +178,15 @@ def test_save_to_python(self):
'workspace_dir': 'foo'
}),
}
_ = test_client.post(f'{ROUTE_PREFIX}/save_to_python', json=payload)
response = test_client.post(f'{ROUTE_PREFIX}/save_to_python', json=payload)
self.assertEqual(response.status_code, 200)
# test_cli.py asserts the actual contents of the file
self.assertTrue(os.path.exists(filepath))

def test_build_datastack_archive(self):
"""UI server: build_datastack_archive endpoint."""
test_client = ui_server.app.test_client()
self.workspace_dir = tempfile.mkdtemp()
# self.workspace_dir = tempfile.mkdtemp()
target_filepath = os.path.join(self.workspace_dir, 'data.tgz')
data_path = os.path.join(self.workspace_dir, 'data.csv')
with open(data_path, 'w') as file:
Expand All @@ -194,6 +202,7 @@ def test_build_datastack_archive(self):
}
response = test_client.post(
f'{ROUTE_PREFIX}/build_datastack_archive', json=payload)
self.assertEqual(response.status_code, 200)
self.assertEqual(
response.json,
{'message': 'Datastack archive created', 'error': False})
Expand All @@ -205,7 +214,7 @@ def test_build_datastack_archive_error_handling(self):
should catch a ValueError and return an error message.
"""
test_client = ui_server.app.test_client()
self.workspace_dir = tempfile.mkdtemp()
# self.workspace_dir = tempfile.mkdtemp()
target_filepath = os.path.join(self.workspace_dir, 'data.tgz')
data_path = os.path.join(self.workspace_dir, 'data.csv')
with open(data_path, 'w') as file:
Expand All @@ -224,6 +233,7 @@ def test_build_datastack_archive_error_handling(self):
side_effect=ValueError(error_message)):
response = test_client.post(
f'{ROUTE_PREFIX}/build_datastack_archive', json=payload)
self.assertEqual(response.status_code, 200)
self.assertEqual(
response.json,
{'message': error_message, 'error': True})
Expand All @@ -247,6 +257,7 @@ def test_log_model_start(self, mock_get, mock_post):
}
response = test_client.post(
f'{ROUTE_PREFIX}/log_model_start', json=payload)
self.assertEqual(response.status_code, 200)
self.assertEqual(response.get_data(as_text=True), 'OK')
mock_get.assert_called_once()
mock_post.assert_called_once()
Expand Down Expand Up @@ -276,8 +287,39 @@ def test_log_model_exit(self, mock_get, mock_post):
}
response = test_client.post(
f'{ROUTE_PREFIX}/log_model_exit', json=payload)
self.assertEqual(response.status_code, 200)
self.assertEqual(response.get_data(as_text=True), 'OK')
mock_get.assert_called_once()
mock_post.assert_called_once()
self.assertEqual(mock_post.call_args.args[0], mock_url)
self.assertEqual(mock_post.call_args.kwargs['data'], payload)

@patch('natcap.invest.ui_server.geometamaker.config.platformdirs.user_config_dir')
def test_get_geometamaker_profile(self, mock_user_config_dir):
"""UI server: get_geometamaker_profile endpoint."""
test_client = ui_server.app.test_client()
response = test_client.get(f'{ROUTE_PREFIX}/get_geometamaker_profile')
self.assertEqual(response.status_code, 200)
profile_dict = json.loads(response.get_data(as_text=True))
self.assertIn('contact', profile_dict)
self.assertIn('license', profile_dict)

@patch('natcap.invest.ui_server.geometamaker.config.platformdirs.user_config_dir')
def test_set_geometamaker_profile(self, mock_user_config_dir):
"""UI server: set_geometamaker_profile endpoint."""
mock_user_config_dir.return_value = self.workspace_dir
test_client = ui_server.app.test_client()
payload = {
'contact': {
'individual_name': 'Foo'
},
'license': {
'title': 'Bar'
},
}
response = test_client.post(
f'{ROUTE_PREFIX}/set_geometamaker_profile', json=payload)
self.assertEqual(response.status_code, 200)
self.assertEqual(
response.json,
{'message': 'Metadata profile saved', 'error': False})

0 comments on commit 24ca23e

Please sign in to comment.