diff --git a/server/Sentinelhub/unit_test/test_box_functions.py b/server/Sentinelhub/unit_test/test_box_functions.py new file mode 100644 index 0000000000000000000000000000000000000000..7c6d93376d5b2b25415f228ad05f1bcfb14cd7e7 --- /dev/null +++ b/server/Sentinelhub/unit_test/test_box_functions.py @@ -0,0 +1,89 @@ +import unittest +from unittest.mock import patch, mock_open +import json +from sentinelhub import BBox, CRS + +from server.Sentinelhub import box_funcitons + +# Sample data for mocking the box.json content +mock_box_json = { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [10.0, 60.0], + [10.0, 61.0], + [11.0, 61.0], + [11.0, 60.0] + ] + ], + [ + [ + [12.0, 62.0], + [12.0, 63.0], + [13.0, 63.0], + [13.0, 62.0] + ] + ] + ] +} + +class TestBoxFunctions(unittest.TestCase): + + @patch('server.Sentinelhub.box_funcitons.open', new_callable=mock_open, read_data=json.dumps(mock_box_json)) + @patch('server.Sentinelhub.box_funcitons.os.path.realpath', return_value='/path/to/fake/dir') + def test_get_all_box(self, mock_realpath, mock_open): + boxes = box_funcitons.get_all_box() + expected_boxes = [ + [[10.0, 60.0], [10.0, 61.0], [11.0, 61.0], [11.0, 60.0]], + [[12.0, 62.0], [12.0, 63.0], [13.0, 63.0], [13.0, 62.0]] + ] + self.assertEqual(boxes, expected_boxes) + + def test_create_BBox(self): + box = [[10.0, 60.0], [10.0, 61.0], [11.0, 61.0], [11.0, 60.0]] + bbox = box_funcitons.create_BBox(box) + expected_bbox = BBox((10.0, 60.0, 11.0, 61.0), CRS.WGS84) + self.assertEqual(bbox, expected_bbox) + + @patch('server.Sentinelhub.box_funcitons.get_all_box') + def test_get_all_bbox(self, mock_get_all_box): + mock_get_all_box.return_value = [ + [[10.0, 60.0], [10.0, 61.0], [11.0, 61.0], [11.0, 60.0]], + [[12.0, 62.0], [12.0, 63.0], [13.0, 63.0], [13.0, 62.0]] + ] + bboxes = box_funcitons.get_all_bbox() + expected_bboxes = [ + BBox((10.0, 60.0, 11.0, 61.0), CRS.WGS84), + BBox((12.0, 62.0, 13.0, 63.0), CRS.WGS84) + ] + self.assertEqual(bboxes, expected_bboxes) + + def test_get_distance(self): + box = [[10.0, 60.0], [10.0, 61.0], [11.0, 61.0], [11.0, 60.0]] + point = (10.5, 60.5) + distance = box_funcitons.get_distance(box, point) + self.assertEqual(distance, 0.0) + + point_outside = (15.0, 65.0) + distance_outside = box_funcitons.get_distance(box, point_outside) + self.assertAlmostEqual(distance_outside, 5.656, places=2) + + @patch('server.Sentinelhub.box_funcitons.get_all_box') + def test_get_closest_bbox_and_id(self, mock_get_all_box): + mock_get_all_box.return_value = [ + [[10.0, 60.0], [10.0, 61.0], [11.0, 61.0], [11.0, 60.0]], + [[12.0, 62.0], [12.0, 63.0], [13.0, 63.0], [13.0, 62.0]] + ] + bbox, idx = box_funcitons.get_closest_bbox_and_id(10.5, 60.5) + expected_bbox = BBox((10.0, 60.0, 11.0, 61.0), CRS.WGS84) + self.assertEqual(bbox, expected_bbox) + self.assertEqual(idx, 0) + + bbox, idx = box_funcitons.get_closest_bbox_and_id(12.5, 62.5) + expected_bbox = BBox((12.0, 62.0, 13.0, 63.0), CRS.WGS84) + self.assertEqual(bbox, expected_bbox) + self.assertEqual(idx, 1) + +if __name__ == '__main__': + unittest.main() \ No newline at end of file diff --git a/server/Sentinelhub/unit_test/test_getAreaInfo.py b/server/Sentinelhub/unit_test/test_getAreaInfo.py new file mode 100644 index 0000000000000000000000000000000000000000..c0d2741f66ef8c72461bc1ac9b0fa1c4cb77475c --- /dev/null +++ b/server/Sentinelhub/unit_test/test_getAreaInfo.py @@ -0,0 +1,83 @@ +import unittest +import pandas as pd +import datetime as dt + +from server.Sentinelhub import getAreaInfo + + +class MyTestCase(unittest.TestCase): + def test_stats_to_df(self): + stats_data = { + "data": [ + { + "interval": {"from": "2023-01-01T00:00:00Z", "to": "2023-01-02T00:00:00Z"}, + "outputs": { + "default": { + "bands": { + "B0": { + "stats": { + "sampleCount": 100, + "noDataCount": 0, + "min": 0.0, + "max": 1.0, + "mean": 0.5, + "stDev": 0.1, + "percentiles": {"10.0": 0.1, "90.0": 0.9} + } + } + } + } + } + } + ] + } + + expected_df = pd.DataFrame({ + "interval_from": [dt.date(2023, 1, 1)], + "interval_to": [dt.date(2023, 1, 2)], + "default_B0_sampleCount": [100], + "default_B0_noDataCount": [0], + "default_B0_min": [0.0], + "default_B0_max": [1.0], + "default_B0_mean": [0.5], + "default_B0_stDev": [0.1], + "default_B0_percentiles_10.0": [0.1], + "default_B0_percentiles_90.0": [0.9] + }) + + + + result_df = getAreaInfo.stats_to_df(stats_data) + pd.testing.assert_frame_equal(result_df, expected_df) + + def test_classify_ice(self): + data = pd.DataFrame({ + 'default_B0_stDev': [36, 10, 5, 8], + 'default_B0_noDataCount': [500, 500, 500, 500] + }) + expected_conditions = ['High probability of Cloud', 'No ice', 'Ice', 'No ice'] + result = getAreaInfo.classify_ice(data) + self.assertEqual(result['ice_condition'].tolist(), expected_conditions) + + def test_get_last_date(self): + data = pd.DataFrame({ + 'interval_to': ['2023-01-01', '2023-02-01', '2023-03-01'] + }) + expected_last_date = '2023-03-01' + self.assertEqual(getAreaInfo.get_last_date(data), expected_last_date) + + expected_last_date_none = ( + dt.datetime.now().year - 1 if dt.datetime.now().month < 8 else dt.datetime.now().year, 8, 1) + self.assertEqual(getAreaInfo.get_last_date(None), dt.datetime(*expected_last_date_none).strftime("%Y-%m-%d")) + + def test_get_ice_run_dates(self): + data = pd.DataFrame({ + 'interval_to': ['2023-01-01', '2023-02-01', '2023-03-01', '2023-04-01'], + 'interval_from': ['2023-01-02', '2023-02-02', '2023-03-02', '2023-04-02'], + 'ice_condition': ['Ice', 'No ice', 'Ice', 'High probability of Cloud'] + }) + expected_dates = ['2023-01-17', '2023-02-15', '2023-03-17'] + self.assertEqual(getAreaInfo.get_ice_run_dates(data), expected_dates) + +if __name__ == '__main__': + unittest.main()