running test Searching for pytest-cov Best match: pytest-cov 2.6.0 Processing pytest_cov-2.6.0-py3.5.egg Using /mnt/h/edu/semester_4/grass/openEO/graas_openeo_core_wrapper/.eggs/pytest_cov-2.6.0-py3.5.egg Searching for pytest Best match: pytest 3.8.1 Processing pytest-3.8.1-py3.5.egg Using /mnt/h/edu/semester_4/grass/openEO/graas_openeo_core_wrapper/.eggs/pytest-3.8.1-py3.5.egg Searching for coverage>=4.4 Best match: coverage 5.0a2 Processing coverage-5.0a2-py3.5-linux-x86_64.egg Using /mnt/h/edu/semester_4/grass/openEO/graas_openeo_core_wrapper/.eggs/coverage-5.0a2-py3.5-linux-x86_64.egg Searching for py>=1.5.0 Best match: py 1.6.0 Processing py-1.6.0-py3.5.egg Using /mnt/h/edu/semester_4/grass/openEO/graas_openeo_core_wrapper/.eggs/py-1.6.0-py3.5.egg Searching for pluggy>=0.7 Best match: pluggy 0.7.1 Processing pluggy-0.7.1-py3.5.egg Using /mnt/h/edu/semester_4/grass/openEO/graas_openeo_core_wrapper/.eggs/pluggy-0.7.1-py3.5.egg Searching for pathlib2>=2.2.0 Best match: pathlib2 2.3.2 Processing pathlib2-2.3.2-py3.5.egg Using /mnt/h/edu/semester_4/grass/openEO/graas_openeo_core_wrapper/.eggs/pathlib2-2.3.2-py3.5.egg Searching for more-itertools>=4.0.0 Best match: more-itertools 4.3.0 Processing more_itertools-4.3.0-py3.5.egg Using /mnt/h/edu/semester_4/grass/openEO/graas_openeo_core_wrapper/.eggs/more_itertools-4.3.0-py3.5.egg Searching for attrs>=17.4.0 Best match: attrs 18.2.0 Processing attrs-18.2.0-py3.5.egg Using /mnt/h/edu/semester_4/grass/openEO/graas_openeo_core_wrapper/.eggs/attrs-18.2.0-py3.5.egg Searching for atomicwrites>=1.0 Best match: atomicwrites 1.2.1 Processing atomicwrites-1.2.1-py3.5.egg Using /mnt/h/edu/semester_4/grass/openEO/graas_openeo_core_wrapper/.eggs/atomicwrites-1.2.1-py3.5.egg running egg_info writing top-level names to src/openeo_grass_gis_driver.egg-info/top_level.txt writing entry points to src/openeo_grass_gis_driver.egg-info/entry_points.txt writing src/openeo_grass_gis_driver.egg-info/PKG-INFO writing dependency_links to src/openeo_grass_gis_driver.egg-info/dependency_links.txt writing manifest file 'src/openeo_grass_gis_driver.egg-info/SOURCES.txt' running build_ext ============================= test session starts ============================== platform linux -- Python 3.5.2, pytest-3.8.1, py-1.6.0, pluggy-0.7.1 -- /mnt/h/edu/semester_4/grass/openEO/venv/bin/python3.5 cachedir: .pytest_cache rootdir: /mnt/h/edu/semester_4/grass/openEO/graas_openeo_core_wrapper, inifile: setup.cfg plugins: cov-2.6.0 collecting ... collected 39 items tests/test_actinia_interface.py::ActiniaInterfaceTestCase::test_async_persistent_processing PASSED [ 2%] tests/test_actinia_interface.py::ActiniaInterfaceTestCase::test_health_check PASSED [ 5%] tests/test_actinia_interface.py::ActiniaInterfaceTestCase::test_layer_exists_1 PASSED [ 7%] tests/test_actinia_interface.py::ActiniaInterfaceTestCase::test_layer_exists_2 PASSED [ 10%] tests/test_actinia_interface.py::ActiniaInterfaceTestCase::test_layer_exists_2_error PASSED [ 12%] tests/test_actinia_interface.py::ActiniaInterfaceTestCase::test_list_mapsets PASSED [ 15%] tests/test_actinia_interface.py::ActiniaInterfaceTestCase::test_list_raster PASSED [ 17%] tests/test_actinia_interface.py::ActiniaInterfaceTestCase::test_list_strds PASSED [ 20%] tests/test_actinia_interface.py::ActiniaInterfaceTestCase::test_list_vector PASSED [ 23%] tests/test_actinia_interface.py::ActiniaInterfaceTestCase::test_mapset_info PASSED [ 25%] tests/test_actinia_interface.py::ActiniaInterfaceTestCase::test_strds_info PASSED [ 28%] tests/test_capabilities.py::CapabilitiesTestCase::test_capabilities PASSED [ 30%] tests/test_capabilities.py::CapabilitiesTestCase::test_ouput_formats PASSED [ 33%] tests/test_capabilities.py::CapabilitiesTestCase::test_service_types PASSED [ 35%] tests/test_data.py::DataTestCase::test_data PASSED [ 38%] tests/test_data.py::DataTestCase::test_raster_data_id_1 PASSED [ 41%] tests/test_data.py::DataTestCase::test_raster_data_id_2 PASSED [ 43%] tests/test_data.py::DataTestCase::test_vector_data_id_2 PASSED [ 46%] tests/test_jobs.py::JobsTestCase::test_1_post_use_case_1_job_ephemeral FAILED [ 48%] tests/test_jobs.py::JobsTestCase::test_1_post_use_case_1_job_ephemeral_export FAILED [ 51%] tests/test_jobs.py::JobsTestCase::test_1_put_use_case_1_job_persistent FAILED [ 53%] tests/test_jobs.py::JobsTestCase::test_2_post_use_case_2_job FAILED [ 56%] tests/test_jobs.py::JobsTestCase::test_2_post_use_case_2_job_export FAILED [ 58%] tests/test_jobs.py::JobsTestCase::test_3_post_data_range_filter_job FAILED [ 61%] tests/test_jobs.py::JobsTestCase::test_3_post_use_case_3_job FAILED [ 64%] tests/test_jobs.py::JobsTestCase::test_4_error_no_strds FAILED [ 66%] tests/test_jobs.py::JobsTestCase::test_4_post_use_case_1_job_delete FAILED [ 69%] tests/test_process_definitions.py::ProcessDefinitionTestCase::test_daterange PASSED [ 71%] tests/test_process_definitions.py::ProcessDefinitionTestCase::test_filter_bbox PASSED [ 74%] tests/test_process_definitions.py::ProcessDefinitionTestCase::test_get_data_1 PASSED [ 76%] tests/test_process_definitions.py::ProcessDefinitionTestCase::test_get_data_2 PASSED [ 79%] tests/test_processes.py::ProcessesTestCase::test_process_id_1 FAILED [ 82%] tests/test_processes.py::ProcessesTestCase::test_process_id_2 FAILED [ 84%] tests/test_processes.py::ProcessesTestCase::test_process_id_3 FAILED [ 87%] tests/test_processes.py::ProcessesTestCase::test_process_id_4 FAILED [ 89%] tests/test_processes.py::ProcessesTestCase::test_process_id_5 PASSED [ 92%] tests/test_processes.py::ProcessesTestCase::test_processes FAILED [ 94%] tests/test_udf.py::UdfTestCase::test_udf PASSED [ 97%] tests/test_udf.py::UdfTestCase::test_udf_lang PASSED [100%] =================================== FAILURES =================================== ______________ JobsTestCase.test_1_post_use_case_1_job_ephemeral _______________ self = def test_1_post_use_case_1_job_ephemeral(self): """Run the test in the ephemeral database """ response = self.app.post('/jobs', data=json.dumps(use_case_1_graph), content_type="application/json") data = json.loads(response.data.decode()) pprint.pprint(data) > self.wait_until_finished(response) tests/test_jobs.py:303: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_jobs.py:396: in wait_until_finished self.assertEqual(response.status_code, 200, "HTML status code is wrong %i" % response.status_code) E AssertionError: 400 != 200 : HTML status code is wrong 400 ----------------------------- Captured stdout call ----------------------------- {'error': "Unsupported process id, available processes: {'NDVI': , 'raster_exporter': , 'filter_daterange': , 'get_data': , 'zonal_statistics': , 'filter_bbox': , 'reduce_time': , 'udf_reduce_time': }'} ___________ JobsTestCase.test_1_post_use_case_1_job_ephemeral_export ___________ self = def test_1_post_use_case_1_job_ephemeral_export(self): """Run the test in the ephemeral database with export support """ response = self.app.post('/jobs', data=json.dumps(use_case_1_graph_export), content_type="application/json") data = json.loads(response.data.decode()) pprint.pprint(data) > self.wait_until_finished(response) tests/test_jobs.py:323: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = response = , http_status = 200, status = 'finished' def wait_until_finished(self, response, http_status=200, status="finished"): """Poll the status of a resource and assert its finished HTTP status The response will be checked if the resource was accepted. Hence it must always be HTTP 200 status. The status URL from the response is then polled until status: finished, error or terminated. The result of the poll can be checked against its HTTP status and its GRaaS status message. Args: response: The accept response http_status (int): The HTTP status that should be checked status (str): The return status of the response Returns: response """ # Check if the resource was accepted self.assertEqual(response.status_code, 200, "HTML status code is wrong %i" % response.status_code) self.assertEqual(response.mimetype, "application/json", "Wrong mimetype %s" % response.mimetype) resp_data = json.loads(response.data.decode()) while True: print("waiting for finished job") > response = self.app.get('/jobs/%s' % resp_data["job_id"]) E TypeError: list indices must be integers or slices, not str tests/test_jobs.py:403: TypeError ----------------------------- Captured stdout call ----------------------------- [{'description': 'Processes can only be defined for a single location!'}, 400] waiting for finished job ______________ JobsTestCase.test_1_put_use_case_1_job_persistent _______________ self = def test_1_put_use_case_1_job_persistent(self): """Run the test in the persistent database """ response = self.app.put('/jobs', data=json.dumps(use_case_1_graph), content_type="application/json") data = json.loads(response.data.decode()) pprint.pprint(data) > self.wait_until_finished(response) tests/test_jobs.py:313: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/test_jobs.py:396: in wait_until_finished self.assertEqual(response.status_code, 200, "HTML status code is wrong %i" % response.status_code) E AssertionError: 400 != 200 : HTML status code is wrong 400 ----------------------------- Captured stdout call ----------------------------- {'error': "Unsupported process id, available processes: {'NDVI': , 'raster_exporter': , 'filter_daterange': , 'get_data': , 'zonal_statistics': , 'filter_bbox': , 'reduce_time': , 'udf_reduce_time': }'} ___________________ JobsTestCase.test_2_post_use_case_2_job ____________________ self = def test_2_post_use_case_2_job(self): response = self.app.post('/jobs', data=json.dumps(use_case_2_graph), content_type="application/json") data = json.loads(response.data.decode()) pprint.pprint(data) > self.wait_until_finished(response) tests/test_jobs.py:331: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = response = , http_status = 200, status = 'finished' def wait_until_finished(self, response, http_status=200, status="finished"): """Poll the status of a resource and assert its finished HTTP status The response will be checked if the resource was accepted. Hence it must always be HTTP 200 status. The status URL from the response is then polled until status: finished, error or terminated. The result of the poll can be checked against its HTTP status and its GRaaS status message. Args: response: The accept response http_status (int): The HTTP status that should be checked status (str): The return status of the response Returns: response """ # Check if the resource was accepted self.assertEqual(response.status_code, 200, "HTML status code is wrong %i" % response.status_code) self.assertEqual(response.mimetype, "application/json", "Wrong mimetype %s" % response.mimetype) resp_data = json.loads(response.data.decode()) while True: print("waiting for finished job") > response = self.app.get('/jobs/%s' % resp_data["job_id"]) E TypeError: list indices must be integers or slices, not str tests/test_jobs.py:403: TypeError ----------------------------- Captured stdout call ----------------------------- [{'description': 'Processes can only be defined for a single location!'}, 400] waiting for finished job ________________ JobsTestCase.test_2_post_use_case_2_job_export ________________ self = def test_2_post_use_case_2_job_export(self): response = self.app.post('/jobs', data=json.dumps(use_case_2_graph_export), content_type="application/json") data = json.loads(response.data.decode()) pprint.pprint(data) > self.wait_until_finished(response) tests/test_jobs.py:339: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = response = , http_status = 200, status = 'finished' def wait_until_finished(self, response, http_status=200, status="finished"): """Poll the status of a resource and assert its finished HTTP status The response will be checked if the resource was accepted. Hence it must always be HTTP 200 status. The status URL from the response is then polled until status: finished, error or terminated. The result of the poll can be checked against its HTTP status and its GRaaS status message. Args: response: The accept response http_status (int): The HTTP status that should be checked status (str): The return status of the response Returns: response """ # Check if the resource was accepted self.assertEqual(response.status_code, 200, "HTML status code is wrong %i" % response.status_code) self.assertEqual(response.mimetype, "application/json", "Wrong mimetype %s" % response.mimetype) resp_data = json.loads(response.data.decode()) while True: print("waiting for finished job") > response = self.app.get('/jobs/%s' % resp_data["job_id"]) E TypeError: list indices must be integers or slices, not str tests/test_jobs.py:403: TypeError ----------------------------- Captured stdout call ----------------------------- [{'description': 'Processes can only be defined for a single location!'}, 400] waiting for finished job ________________ JobsTestCase.test_3_post_data_range_filter_job ________________ self = def test_3_post_data_range_filter_job(self): response = self.app.post('/jobs', data=json.dumps(date_range_filter), content_type="application/json") data = json.loads(response.data.decode()) pprint.pprint(data) > self.wait_until_finished(response) tests/test_jobs.py:355: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = response = , http_status = 200, status = 'finished' def wait_until_finished(self, response, http_status=200, status="finished"): """Poll the status of a resource and assert its finished HTTP status The response will be checked if the resource was accepted. Hence it must always be HTTP 200 status. The status URL from the response is then polled until status: finished, error or terminated. The result of the poll can be checked against its HTTP status and its GRaaS status message. Args: response: The accept response http_status (int): The HTTP status that should be checked status (str): The return status of the response Returns: response """ # Check if the resource was accepted self.assertEqual(response.status_code, 200, "HTML status code is wrong %i" % response.status_code) self.assertEqual(response.mimetype, "application/json", "Wrong mimetype %s" % response.mimetype) resp_data = json.loads(response.data.decode()) while True: print("waiting for finished job") > response = self.app.get('/jobs/%s' % resp_data["job_id"]) E TypeError: list indices must be integers or slices, not str tests/test_jobs.py:403: TypeError ----------------------------- Captured stdout call ----------------------------- [{'description': 'Processes can only be defined for a single location!'}, 400] waiting for finished job ___________________ JobsTestCase.test_3_post_use_case_3_job ____________________ self = def test_3_post_use_case_3_job(self): response = self.app.post('/jobs', data=json.dumps(use_case_3_graph), content_type="application/json") data = json.loads(response.data.decode()) pprint.pprint(data) > self.wait_until_finished(response) tests/test_jobs.py:347: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = response = , http_status = 200, status = 'finished' def wait_until_finished(self, response, http_status=200, status="finished"): """Poll the status of a resource and assert its finished HTTP status The response will be checked if the resource was accepted. Hence it must always be HTTP 200 status. The status URL from the response is then polled until status: finished, error or terminated. The result of the poll can be checked against its HTTP status and its GRaaS status message. Args: response: The accept response http_status (int): The HTTP status that should be checked status (str): The return status of the response Returns: response """ # Check if the resource was accepted self.assertEqual(response.status_code, 200, "HTML status code is wrong %i" % response.status_code) self.assertEqual(response.mimetype, "application/json", "Wrong mimetype %s" % response.mimetype) resp_data = json.loads(response.data.decode()) while True: print("waiting for finished job") > response = self.app.get('/jobs/%s' % resp_data["job_id"]) E TypeError: list indices must be integers or slices, not str tests/test_jobs.py:403: TypeError ----------------------------- Captured stdout call ----------------------------- [{'description': 'Processes can only be defined for a single location!'}, 400] waiting for finished job ______________________ JobsTestCase.test_4_error_no_strds ______________________ self = def test_4_error_no_strds(self): response = self.app.post('/jobs', data=json.dumps(date_range_filter_error_no_strds), content_type="application/json") data = json.loads(response.data.decode()) pprint.pprint(data) > self.wait_until_finished(response=response, status="error", http_status=400) tests/test_jobs.py:377: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = response = , http_status = 400, status = 'error' def wait_until_finished(self, response, http_status=200, status="finished"): """Poll the status of a resource and assert its finished HTTP status The response will be checked if the resource was accepted. Hence it must always be HTTP 200 status. The status URL from the response is then polled until status: finished, error or terminated. The result of the poll can be checked against its HTTP status and its GRaaS status message. Args: response: The accept response http_status (int): The HTTP status that should be checked status (str): The return status of the response Returns: response """ # Check if the resource was accepted self.assertEqual(response.status_code, 200, "HTML status code is wrong %i" % response.status_code) self.assertEqual(response.mimetype, "application/json", "Wrong mimetype %s" % response.mimetype) resp_data = json.loads(response.data.decode()) while True: print("waiting for finished job") > response = self.app.get('/jobs/%s' % resp_data["job_id"]) E TypeError: list indices must be integers or slices, not str tests/test_jobs.py:403: TypeError ----------------------------- Captured stdout call ----------------------------- [{'description': 'Processes can only be defined for a single location!'}, 400] waiting for finished job ________________ JobsTestCase.test_4_post_use_case_1_job_delete ________________ self = def test_4_post_use_case_1_job_delete(self): response = self.app.post('/jobs', data=json.dumps(date_range_filter_long_run), content_type="application/json") data = json.loads(response.data.decode()) pprint.pprint(data) self.assertEqual(response.status_code, 200) > response = self.app.delete('/jobs/%s' % data["job_id"]) E TypeError: list indices must be integers or slices, not str tests/test_jobs.py:364: TypeError ----------------------------- Captured stdout call ----------------------------- [{'description': 'Processes can only be defined for a single location!'}, 400] _____________________ ProcessesTestCase.test_process_id_1 ______________________ self = def test_process_id_1(self): response = self.app.get('/processes/filter_bbox') data = json.loads(response.data.decode()) print(data) > self.assertEqual(data["process_id"], "filter_bbox") E KeyError: 'process_id' tests/test_processes.py:38: KeyError ----------------------------- Captured stdout call ----------------------------- {'summary': 'Filter raster based data by bounding box', 'name': 'filter_bbox', 'example': {'imagery': {'process_id': 'get_data', 'data_id': 'ECAD.PERMANENT.strds.temperature_1950_2017_yearly'}, 'spatial_extent': {'right': 55, 'width_res': 1, 'top': 60, 'height_res': 1, 'left': 50, 'bottom': 55}, 'process_id': 'filter_bbox'}, 'parameters': {'imagery': {'description': 'Any openEO process object that returns raster datasets or space-time raster dataset', 'schema': {'format': 'eodata', 'type': 'object'}}, 'spatial_extent': {'description': 'Filter by spatial extent', 'schema': {'properties': {'right': {'type': 'number'}, 'width_res': {'type': 'number'}, 'top': {'type': 'number'}, 'height_res': {'type': 'number'}, 'left': {'type': 'number'}, 'bottom': {'type': 'number'}}, 'required': ['left', 'right', 'top', 'bottom', 'width_res', 'height_res'], 'type': 'object'}}}, 'description': 'Drops observations from raster data or raster time series data that are located outside of a given bounding box.', 'returns': {'description': 'Processed EO data.', 'schema': {'format': 'eodata', 'type': 'object'}}} _____________________ ProcessesTestCase.test_process_id_2 ______________________ self = def test_process_id_2(self): response = self.app.get('/processes/filter_daterange') data = json.loads(response.data.decode()) print(data) > self.assertEqual(data["process_id"], "filter_daterange") E KeyError: 'process_id' tests/test_processes.py:45: KeyError ----------------------------- Captured stdout call ----------------------------- {'summary': 'Drops observations from a collection', 'name': 'filter_daterange', 'examples': [{'imagery': {'process_id': 'get_data', 'data_id': 'ECAD.PERMANENT.strds.temperature_1950_2017_yearly'}, 'from': '2018-01-01 00:30:00', 'to': '2018-01-01 00:30:00', 'process_id': 'filter_daterange'}], 'parameters': {'imagery': {'description': 'Any openEO process object that returns space-time raster datasets', 'schema': {'format': 'eodata', 'type': 'object'}}, 'from': {'description': 'The start date of the filter in YYYY-MM-DD HH:mm:SS format', 'schema': {'examples': ['2018-01-01 00:30:00'], 'type': 'string'}}, 'to': {'description': 'The end date of the filter in YYYY-MM-DD HH:mm:SS format', 'schema': {'examples': ['2018-01-02 00:30:00'], 'type': 'string'}}}, 'description': 'Drops observations from a collection that have been captured between start and end date.', 'returns': {'description': 'Processed EO data.', 'schema': {'format': 'eodata', 'type': 'object'}}} _____________________ ProcessesTestCase.test_process_id_3 ______________________ self = def test_process_id_3(self): response = self.app.get('/processes/NDVI') data = json.loads(response.data.decode()) print(data) > self.assertEqual(data["process_id"], "NDVI") E KeyError: 'process_id' tests/test_processes.py:52: KeyError ----------------------------- Captured stdout call ----------------------------- {'summary': 'Compute the NDVI based on the red and nir bands of the input datasets.', 'name': 'NDVI', 'examples': [{'red': {'process_id': 'get_data', 'data_id': 'nc_spm_08.landsat.strds.lsat5_red'}, 'process_id': 'NDVI', 'nir': {'process_id': 'get_data', 'data_id': 'nc_spm_08.landsat.strds.lsat5_nir'}}], 'parameters': {'red': {'description': 'Any openEO process object that returns a single space-time raster datasets that contains the RED band for NDVI computation.', 'schema': {'examples': ['nc_spm_08.landsat.strds.lsat5_red'], 'type': 'string'}}, 'nir': {'description': 'Any openEO process object that returns a single space-time raster datasets that contains the NIR band for NDVI computation.', 'schema': {'examples': ['nc_spm_08.landsat.strds.lsat5_nir'], 'type': 'string'}}}, 'description': 'Compute the NDVI based on the red and nir bands of the input datasets.', 'returns': {'description': 'Processed EO data.', 'schema': {'format': 'eodata', 'type': 'object'}}} _____________________ ProcessesTestCase.test_process_id_4 ______________________ self = def test_process_id_4(self): response = self.app.get('/processes/min_time') data = json.loads(response.data.decode()) print(data) > self.assertEqual(data["process_id"], "min_time") E KeyError: 'process_id' tests/test_processes.py:59: KeyError ----------------------------- Captured stdout call ----------------------------- {'description': 'This process does not exist!'} _______________________ ProcessesTestCase.test_processes _______________________ self = def test_processes(self): response = self.app.get('/processes') data = json.loads(response.data.decode()) print(data) > self.assertEqual(len(data), 7) E AssertionError: 8 != 7 tests/test_processes.py:20: AssertionError ----------------------------- Captured stdout call ----------------------------- ['NDVI', 'raster_exporter', 'filter_daterange', 'get_data', 'zonal_statistics', 'filter_bbox', 'reduce_time', 'udf_reduce_time'] ----------- coverage: platform linux, python 3.5.2-final-0 ----------- Name Stmts Miss Branch BrPart Cover Missing ------------------------------------------------------------------------------------------------------------------------ src/openeo_grass_gis_driver/__init__.py 11 2 0 0 82% 8-9 src/openeo_grass_gis_driver/actinia_processing/__init__.py 7 0 0 0 100% src/openeo_grass_gis_driver/actinia_processing/actinia_interface.py 112 29 26 5 70% 43, 64-68, 78, 117-124, 127-136, 139-148, 189, 233-235, 246-248, 42->43, 75->78, 101->104, 111->114, 188->189 src/openeo_grass_gis_driver/actinia_processing/base.py 52 29 28 1 38% 175-212, 226, 225->226 src/openeo_grass_gis_driver/actinia_processing/config.py 14 0 0 0 100% src/openeo_grass_gis_driver/actinia_processing/filter_bbox_process.py 36 2 6 2 90% 122, 130, 121->122, 124->130 src/openeo_grass_gis_driver/actinia_processing/filter_daterange_process.py 40 2 10 4 88% 123-124, 85->87, 122->123, 132->134, 134->137 src/openeo_grass_gis_driver/actinia_processing/get_data_process.py 39 2 12 3 90% 113, 130, 90->93, 107->113, 129->130 src/openeo_grass_gis_driver/actinia_processing/ndvi_process.py 45 31 12 0 25% 77-105, 114-151 src/openeo_grass_gis_driver/actinia_processing/raster_exporter.py 31 13 4 1 54% 64-81, 98-102, 96->98 src/openeo_grass_gis_driver/actinia_processing/reduce_time_process.py 29 15 4 0 42% 75-86, 97-111 src/openeo_grass_gis_driver/actinia_processing/udf_reduce_time.py 31 14 6 1 49% 40-56, 73-85, 71->73 src/openeo_grass_gis_driver/actinia_processing/zonal_statistics.py 46 28 6 1 37% 77-147, 164-174, 162->164 src/openeo_grass_gis_driver/app.py 10 0 0 0 100% src/openeo_grass_gis_driver/capabilities.py 19 0 0 0 100% src/openeo_grass_gis_driver/data.py 43 7 18 5 80% 45, 54, 58-62, 67, 80, 44->45, 53->54, 57->58, 66->67, 79->80 src/openeo_grass_gis_driver/data_product_id.py 38 7 10 5 75% 141, 149, 155, 157, 170-174, 140->141, 148->149, 154->155, 156->157, 169->170 src/openeo_grass_gis_driver/definitions.py 83 0 0 0 100% src/openeo_grass_gis_driver/endpoints.py 27 0 0 0 100% src/openeo_grass_gis_driver/graph_db.py 10 0 0 0 100% src/openeo_grass_gis_driver/jobs.py 61 27 12 1 48% 92-128, 151-170, 147->151 src/openeo_grass_gis_driver/jobs_job_id.py 47 30 8 0 31% 92-93, 97-124, 128-160 src/openeo_grass_gis_driver/main.py 7 7 0 0 0% 2-9 src/openeo_grass_gis_driver/processes.py 14 0 0 0 100% src/openeo_grass_gis_driver/processes_process_id.py 16 0 2 0 100% src/openeo_grass_gis_driver/test_base.py 15 0 0 0 100% src/openeo_grass_gis_driver/udf.py 14 0 0 0 100% src/openeo_grass_gis_driver/udf_lang_udf_type.py 25 2 4 2 86% 69, 73, 68->69, 72->73 ------------------------------------------------------------------------------------------------------------------------ TOTAL 922 247 168 31 68% ==================== 14 failed, 25 passed in 23.61 seconds =====================