diff --git a/src/evagram/website/backend/api/test_models.py b/src/evagram/website/backend/api/test_models.py index a950d80..dc17a87 100644 --- a/src/evagram/website/backend/api/test_models.py +++ b/src/evagram/website/backend/api/test_models.py @@ -20,7 +20,7 @@ def setUp(self): self.variable = Variables.objects.create(variable_name="brightnessTemperature", channel=1) # Create a group self.group = Groups.objects.create(group_name="gsi_hofx_vs_jedi_hofx") - + def test_plot_creation(self): """Test that a plot can be created successfully.""" plot = Plots.objects.create( @@ -35,12 +35,12 @@ def test_plot_creation(self): plot_count = Plots.objects.count() self.assertEqual(plot_count, 1) self.assertEqual(plot.plot_type, PlotType.SCATTER) - + def test_experiment_unique_together_constraint(self): """Test the unique together constraint for Experiments.""" with self.assertRaises(Exception): Experiments.objects.create(experiment_name="test_experiment", owner=self.owner) - + def test_variable_unique_together_constraint(self): """Test the unique together constraint for Variables.""" with self.assertRaises(Exception): @@ -79,4 +79,4 @@ def test_plot_type_constraint(self): observation=self.observation, variable=self.variable, group=self.group - ) \ No newline at end of file + ) diff --git a/src/evagram/website/backend/api/test_views.py b/src/evagram/website/backend/api/test_views.py index c572c0d..ea23402 100644 --- a/src/evagram/website/backend/api/test_views.py +++ b/src/evagram/website/backend/api/test_views.py @@ -1,172 +1,113 @@ from django.test import TestCase -from api.models import Owners, Plots +from api.models import * +from api.serializers import PlotSerializer +from rest_framework import status class TestAPIView(TestCase): + def setUp(self): + # Set up initial data for testing + self.owner = Owners.objects.create(first_name="John", last_name="Doe", username="johndoe") + self.experiment = Experiments.objects.create( + experiment_name="test_experiment", + owner=self.owner + ) + self.reader = Readers.objects.get(reader_name="ioda_obs_space") + self.observation = Observations.objects.create(observation_name="amsua_n19") + self.variable = Variables.objects.create(variable_name="brightnessTemperature", channel=1) + self.group = Groups.objects.create(group_name="gsi_hofx_vs_jedi_hofx") + self.plot = Plots.objects.create( + plot_type='scatter', + begin_cycle_time=timezone.now(), + experiment=self.experiment, + reader=self.reader, + observation=self.observation, + variable=self.variable, + group=self.group + ) + def test_initial_load(self): response = self.client.get("/api/initial-load/") - self.assertEqual(200, response.status_code) - self.assertTrue("owners" in response.json()) - - def test_plot_insufficient_params(self): - response = self.client.get("/api/get-plots-by-field/?owner_id=1") - self.assertEqual("owner_id=1", response.request['QUERY_STRING']) - self.assertEqual(400, response.status_code) - - def test_plot_invalid_username(self): - response = self.client.get( - "/api/get-plots-by-field/?owner_id=null&experiment_id=12&observation_id=1" - "&variable_name=brightnessTemperature&channel=4&group_id=1") - self.assertEqual("owner_id=null&experiment_id=12&observation_id=1" - "&variable_name=brightnessTemperature&channel=4&group_id=1", - response.request['QUERY_STRING']) - self.assertEqual(400, response.status_code) - - def test_plot_username_not_found(self): - response = self.client.get( - "/api/get-plots-by-field/?owner_id=-1&experiment_id=12&observation_id=1" - "&variable_name=brightnessTemperature&channel=4&group_id=1") - self.assertEqual("owner_id=-1&experiment_id=12&observation_id=1" - "&variable_name=brightnessTemperature&channel=4&group_id=1", - response.request['QUERY_STRING']) - self.assertEqual(400, response.status_code) - - def test_plot_value_error(self): - response = self.client.get( - "/api/get-plots-by-field/?owner_id=1&experiment_id=xyz&observation_id=1" - "&variable_name=brightnessTemperature&channel=4&group_id=1") - self.assertEqual("owner_id=1&experiment_id=xyz&observation_id=1" - "&variable_name=brightnessTemperature&channel=4&group_id=1", - response.request['QUERY_STRING']) - self.assertEqual(400, response.status_code) - - def test_plot_input_cascade(self): - # Tests if the experiment_id is handled before the observation_id - response = self.client.get( - "/api/get-plots-by-field/?owner_id=1&experiment_id=null&observation_id=1" - "&variable_name=null&channel=null&group_id=null") - self.assertEqual("owner_id=1&experiment_id=null&observation_id=1" - "&variable_name=null&channel=null&group_id=null", - response.request['QUERY_STRING']) - # If diagnostics were queried out of order by observation_id, - # the queryset will be empty because experiment_id=null - self.assertNotEqual(0, len(response.data)) - - def test_plot_channel_error(self): - # Tests if channel was not provided and variable requires it - response = self.client.get( - "/api/get-plots-by-field/?owner_id=1&experiment_id=12&observation_id=1" - "&variable_name=brightnessTemperature&channel=null&group_id=null") - self.assertEqual("owner_id=1&experiment_id=12&observation_id=1" - "&variable_name=brightnessTemperature&channel=null&group_id=null", - response.request['QUERY_STRING']) - self.assertEqual(404, response.status_code) - - def test_plot_channel_is_optional(self): - # Tests if channel was not provided but variable takes optional channel value - response = self.client.get( - "/api/get-plots-by-field/?owner_id=1&experiment_id=12&observation_id=1" - "&variable_name=windEastward&channel=null&group_id=null") - self.assertEqual("owner_id=1&experiment_id=12&observation_id=1" - "&variable_name=windEastward&channel=null&group_id=null", - response.request['QUERY_STRING']) - self.assertEqual(200, response.status_code) - - def test_update_user_option_valid_params(self): - response = self.client.get("/api/update-user-option/?owner_id=1") - self.assertEqual("owner_id=1", response.request['QUERY_STRING']) - self.assertEqual(200, response.status_code) - self.assertTrue("experiments" in response.json()) - self.assertTrue("observations" in response.json()) - self.assertTrue("variables" in response.json()) - self.assertTrue("groups" in response.json()) - - def test_update_user_option_object_not_found(self): - response = self.client.get("/api/update-user-option/?owner_id=-1") - self.assertEqual("owner_id=-1", response.request['QUERY_STRING']) - self.assertEqual(404, response.status_code) - - def test_update_user_option_value_error(self): - response = self.client.get("/api/update-user-option/?owner_id=owner") - self.assertEqual("owner_id=owner", response.request['QUERY_STRING']) - self.assertEqual(400, response.status_code) - - def test_update_user_option_insufficient_params(self): - response = self.client.get("/api/update-user-option/") - self.assertEqual("", response.request['QUERY_STRING']) - self.assertEqual(400, response.status_code) - self.assertEqual("Missing request parameter detected: 'owner_id'", response.json()['error']) - - def test_update_experiment_option_valid_params(self): - response = self.client.get("/api/update-experiment-option/?experiment_id=1") - self.assertEqual("experiment_id=1", response.request['QUERY_STRING']) - self.assertEqual(200, response.status_code) - self.assertTrue("observations" in response.json()) - self.assertTrue("variables" in response.json()) - self.assertTrue("groups" in response.json()) - - def test_update_experiment_option_object_not_found(self): - response = self.client.get("/api/update-experiment-option/?experiment_id=-1") - self.assertEqual("experiment_id=-1", response.request['QUERY_STRING']) - self.assertEqual(404, response.status_code) - - def test_update_experiment_option_value_error(self): - response = self.client.get("/api/update-experiment-option/?experiment_id=!") - self.assertEqual("experiment_id=!", response.request['QUERY_STRING']) - self.assertEqual(400, response.status_code) - - def test_update_experiment_option_insufficient_params(self): - response = self.client.get("/api/update-experiment-option/?key1=value1") - self.assertEqual("key1=value1", response.request['QUERY_STRING']) - self.assertEqual(400, response.status_code) - - def test_update_observation_option_valid_params(self): - response = self.client.get("/api/update-observation-option/" - "?experiment_id=12&observation_id=1") - self.assertEqual("experiment_id=12&observation_id=1", response.request['QUERY_STRING']) - self.assertEqual(200, response.status_code) - self.assertTrue("groups" in response.json()) - self.assertTrue("variables" in response.json()) - self.assertTrue("variablesMap" in response.json()) - - def test_update_observation_option_object_not_found(self): - response = self.client.get("/api/update-observation-option/" - "?experiment_id=1&observation_id=-1") - self.assertEqual("experiment_id=1&observation_id=-1", response.request['QUERY_STRING']) - self.assertEqual(404, response.status_code) - - def test_update_observation_option_value_error(self): - response = self.client.get("/api/update-observation-option/?observation_id=~") - self.assertEqual("observation_id=~", response.request['QUERY_STRING']) - self.assertEqual(400, response.status_code) - - def test_update_observation_option_insufficient_params(self): - response = self.client.get("/api/update-observation-option/") - self.assertEqual("", response.request['QUERY_STRING']) - self.assertEqual(400, response.status_code) - - def test_update_variable_option_valid_params(self): - response = self.client.get( - "/api/update-variable-option/?experiment_id=12&observation_id=1&" - "variable_name=brightnessTemperature&channel=4") - self.assertEqual("experiment_id=12&observation_id=1" - "&variable_name=brightnessTemperature&channel=4", - response.request['QUERY_STRING']) - self.assertEqual(200, response.status_code) - self.assertTrue("groups" in response.json()) - self.assertTrue("channel" in response.json()) - - def test_update_variable_option_object_not_found(self): - response = self.client.get( - "/api/update-variable-option/?experiment_id=12&observation_id=1&" - "variable_name=variable&channel=null") - self.assertEqual("experiment_id=12&observation_id=1&" - "variable_name=variable&channel=null", - response.request['QUERY_STRING']) - self.assertEqual(404, response.status_code) - - def test_update_variable_option_insufficient_params(self): - response = self.client.get("/api/update-variable-option/") - self.assertEqual("", response.request['QUERY_STRING']) - self.assertEqual(400, response.status_code) + self.assertEqual(status.HTTP_200_OK, response.status_code) + self.assertIn("owners", response.data) + + def test_get_plots_by_field_valid(self): + """Test the get_plots_by_field view returns plots for valid inputs.""" + response = self.client.get('/api/get-plots-by-field/', { + 'owner_id': self.owner.owner_id, + 'experiment_id': self.experiment.experiment_id, + 'observation_id': self.observation.observation_id, + 'variable_name': self.variable.variable_name, + 'channel': self.variable.channel, + 'group_id': self.group.group_id + }) + self.assertEqual(status.HTTP_200_OK, response.status_code) + expected_plots = PlotSerializer( + Plots.objects.filter(experiment=self.experiment), many=True).data + self.assertEqual(expected_plots, response.data) + + def test_get_plots_by_field_invalid_owner(self): + """Test get_plots_by_field with invalid owner_id.""" + response = self.client.get('/api/get-plots-by-field/', { + 'owner_id': 'null', + 'experiment_id': self.experiment.experiment_id, + 'observation_id': self.observation.observation_id, + 'variable_name': self.variable.variable_name, + 'channel': self.variable.channel, + 'group_id': self.group.group_id + }) + self.assertEqual(status.HTTP_400_BAD_REQUEST, response.status_code) + self.assertIn("error", response.data) + + def test_get_plots_by_field_missing_param(self): + """Test get_plots_by_field with a missing parameter.""" + response = self.client.get('/api/get-plots-by-field/', { + 'experiment_id': self.experiment.experiment_id, + 'observation_id': self.observation.observation_id, + 'variable_name': self.variable.variable_name, + 'channel': self.variable.channel, + 'group_id': self.group.group_id + }) + self.assertEqual(status.HTTP_400_BAD_REQUEST, response.status_code) + self.assertIn("error", response.data) + + def test_update_user_option(self): + """Test the update_user_option view returns correct data.""" + response = self.client.get('/api/update-user-option/', {'owner_id': self.owner.owner_id}) + self.assertEqual(status.HTTP_200_OK, response.status_code) + self.assertIn('experiments', response.data) + + def test_update_user_option_invalid_owner(self): + """Test update_user_option with an invalid owner_id.""" + response = self.client.get('/api/update-user-option/', {'owner_id': 999}) + self.assertEqual(status.HTTP_404_NOT_FOUND, response.status_code) + self.assertIn("error", response.data) + + def test_update_experiment_option(self): + """Test the update_experiment_option view returns correct data.""" + response = self.client.get('/api/update-experiment-option/', + {'experiment_id': self.experiment.experiment_id}) + self.assertEqual(status.HTTP_200_OK, response.status_code) + self.assertIn('observations', response.data) + + def test_update_observation_option(self): + """Test the update_observation_option view returns correct data.""" + response = self.client.get('/api/update-observation-option/', { + 'experiment_id': self.experiment.experiment_id, + 'observation_id': self.observation.observation_id}) + self.assertEqual(status.HTTP_200_OK, response.status_code) + self.assertIn('variables', response.data) + self.assertIn('variablesMap', response.data) + + def test_update_variable_option(self): + """Test the update_variable_option view returns correct data.""" + response = self.client.get('/api/update-variable-option/', { + 'experiment_id': self.experiment.experiment_id, + 'observation_id': self.observation.observation_id, + 'variable_name': self.variable.variable_name, + 'channel': self.variable.channel + }) + self.assertEqual(status.HTTP_200_OK, response.status_code) + self.assertIn('groups', response.data) + self.assertIn('channel', response.data) diff --git a/src/evagram/website/backend/api/views.py b/src/evagram/website/backend/api/views.py index 1494fc0..df28f3d 100644 --- a/src/evagram/website/backend/api/views.py +++ b/src/evagram/website/backend/api/views.py @@ -101,10 +101,7 @@ def update_user_option(request): owner_id = request.GET["owner_id"] Owners.objects.get(pk=owner_id) data = { - "experiments": [], - "observations": [], - "variables": [], - "groups": [] + "experiments": [] } data["experiments"] = get_experiments_by_owner(owner_id) return Response(data) @@ -126,9 +123,7 @@ def update_experiment_option(request): experiment_id = request.GET["experiment_id"] Experiments.objects.get(pk=experiment_id) data = { - "observations": [], - "variables": [], - "groups": [] + "observations": [] } data["observations"] = get_observations_by_experiment(experiment_id) return Response(data) @@ -152,7 +147,6 @@ def update_observation_option(request): Observations.objects.get(pk=observation_id) data = { "variables": [], - "groups": [], "variablesMap": {} } data["variables"] = get_variables_by_observation(experiment_id, observation_id) diff --git a/src/evagram/website/backend/input_app/test_input_tool.py b/src/evagram/website/backend/input_app/test_input_tool.py index 2a18960..17312fc 100644 --- a/src/evagram/website/backend/input_app/test_input_tool.py +++ b/src/evagram/website/backend/input_app/test_input_tool.py @@ -27,16 +27,22 @@ def test_ExperimentPathNotFound(self): def test_RollbackOnException(self): with self.assertRaises(Exception): - input_data(owner="postgres", experiment="bad_experiment", eva_directory="tests/invalid_reader") + input_data(owner="postgres", + experiment="bad_experiment", + eva_directory="tests/invalid_reader") owner = Owners.objects.get(username="postgres") experiments = Experiments.objects.filter(experiment_name="bad_experiment", owner=owner) self.assertEqual(0, len(experiments)) - + def test_InvalidCycleTime(self): with self.assertRaises(ValueError): - input_data(owner="postgres", experiment="invalid_cycle_time", eva_directory="tests/invalid_cycle_time") - + input_data(owner="postgres", + experiment="invalid_cycle_time", + eva_directory="tests/invalid_cycle_time") + def test_InvalidPlotType(self): with self.assertRaises(Exception): - input_data(owner="postgres", experiment="invalid_plot_type", eva_directory="tests/invalid_plot_type") + input_data(owner="postgres", + experiment="invalid_plot_type", + eva_directory="tests/invalid_plot_type")