diff --git a/requirements.txt b/requirements.txt index 69511ee1..d5d45a4a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -20,12 +20,12 @@ flask[async]==3.1.0 # flask-cors flask-cors==5.0.0 # via -r requirements.in -geode-background==8.8.10 +geode-background==8.9.3 # via # geode-explicit # geode-implicit # geode-simplex -geode-common==33.4.0 +geode-common==33.5.0 # via # -r requirements.in # geode-background @@ -35,23 +35,23 @@ geode-common==33.4.0 # geode-numerics # geode-simplex # geode-viewables -geode-conversion==6.1.4 +geode-conversion==6.1.5 # via # geode-explicit # geode-implicit # geode-simplex -geode-explicit==6.1.26 +geode-explicit==6.1.28 # via # -r requirements.in # geode-implicit -geode-implicit==3.5.0 +geode-implicit==3.5.2 # via -r requirements.in -geode-numerics==5.2.4 +geode-numerics==5.2.5 # via # -r requirements.in # geode-implicit # geode-simplex -geode-simplex==9.0.8 +geode-simplex==9.0.10 # via # -r requirements.in # geode-implicit @@ -69,7 +69,7 @@ markupsafe==3.0.2 # via # jinja2 # werkzeug -opengeode-core==15.9.8 +opengeode-core==15.10.1 # via # -r requirements.in # geode-background @@ -90,17 +90,17 @@ opengeode-geosciences==8.2.2 # geode-implicit # geode-viewables # opengeode-geosciencesio -opengeode-geosciencesio==5.3.4 +opengeode-geosciencesio==5.3.6 # via # -r requirements.in # geode-implicit -opengeode-inspector==6.3.4 +opengeode-inspector==6.3.7 # via # -r requirements.in # geode-explicit # geode-implicit # geode-simplex -opengeode-io==7.0.9 +opengeode-io==7.1.0 # via # -r requirements.in # geode-implicit diff --git a/src/opengeodeweb_back/geode_functions.py b/src/opengeodeweb_back/geode_functions.py index 65cd4944..957847b8 100644 --- a/src/opengeodeweb_back/geode_functions.py +++ b/src/opengeodeweb_back/geode_functions.py @@ -79,6 +79,10 @@ def get_object_type(geode_object: str): return geode_object_value(geode_object)["object_type"] +def get_elements(geode_object: str): + return geode_object_value(geode_object)["elements"] + + def is_3D(geode_object: str): return geode_object_value(geode_object)["is_3D"] diff --git a/src/opengeodeweb_back/geode_objects.py b/src/opengeodeweb_back/geode_objects.py index e0d697ac..6912c2f5 100644 --- a/src/opengeodeweb_back/geode_objects.py +++ b/src/opengeodeweb_back/geode_objects.py @@ -10,6 +10,14 @@ # Local application imports +mesh = "mesh" +model = "model" + +points = "points" +edges = "edges" +polygons = "polygons" +polyhedrons = "polyhedrons" + def geode_objects_dict(): return { @@ -28,7 +36,7 @@ def geode_objects_dict(): "convert": og_gs.convert_brep_coordinate_reference_system, "create": og.create_brep_coordinate_system, }, - "object_type": "model", + "object_type": model, "is_3D": True, "is_viewable": True, "save_viewable": g_v.save_viewable_brep, @@ -50,7 +58,7 @@ def geode_objects_dict(): "convert": og_gs.convert_section_coordinate_reference_system, "create": og.create_section_coordinate_system, }, - "object_type": "model", + "object_type": model, "is_3D": False, "is_viewable": True, "save_viewable": g_v.save_viewable_cross_section, @@ -71,7 +79,8 @@ def geode_objects_dict(): "convert": og_gs.convert_edged_curve_coordinate_reference_system2D, "create": og.create_edged_curve_coordinate_system2D, }, - "object_type": "mesh", + "object_type": mesh, + "elements": [points, edges], "is_3D": False, "is_viewable": True, "save_viewable": g_v.save_viewable_edged_curve2D, @@ -92,7 +101,8 @@ def geode_objects_dict(): "convert": og_gs.convert_edged_curve_coordinate_reference_system3D, "create": og.create_edged_curve_coordinate_system3D, }, - "object_type": "mesh", + "object_type": mesh, + "elements": [points, edges], "is_3D": True, "is_viewable": True, "save_viewable": g_v.save_viewable_edged_curve3D, @@ -108,7 +118,7 @@ def geode_objects_dict(): "is_saveable": og.is_graph_saveable, "save": og.save_graph, "builder": og.GraphBuilder.create, - "object_type": "mesh", + "object_type": mesh, "is_3D": False, "is_viewable": False, }, @@ -127,7 +137,8 @@ def geode_objects_dict(): "convert": og_gs.convert_solid_mesh_coordinate_reference_system3D, "create": og.create_solid_mesh_coordinate_system3D, }, - "object_type": "mesh", + "object_type": mesh, + "elements": [points, polyhedrons], "is_3D": True, "is_viewable": True, "save_viewable": g_v.save_viewable_hybrid_solid3D, @@ -149,7 +160,7 @@ def geode_objects_dict(): "convert": og_gs.convert_section_coordinate_reference_system, "create": og.create_section_coordinate_system, }, - "object_type": "model", + "object_type": model, "is_3D": False, "is_viewable": True, "save_viewable": g_v.save_viewable_implicit_cross_section, @@ -171,7 +182,7 @@ def geode_objects_dict(): "convert": og_gs.convert_brep_coordinate_reference_system, "create": og.create_brep_coordinate_system, }, - "object_type": "model", + "object_type": model, "is_3D": True, "is_viewable": True, "save_viewable": g_v.save_viewable_implicit_structural_model, @@ -186,7 +197,8 @@ def geode_objects_dict(): "load": og.load_light_regular_grid2D, "is_saveable": og.is_light_regular_grid_saveable2D, "save": og.save_light_regular_grid2D, - "object_type": "mesh", + "object_type": mesh, + "elements": [points, polygons], "is_3D": False, "is_viewable": True, "save_viewable": g_v.save_viewable_light_regular_grid2D, @@ -200,7 +212,8 @@ def geode_objects_dict(): "load": og.load_light_regular_grid3D, "is_saveable": og.is_light_regular_grid_saveable3D, "save": og.save_light_regular_grid3D, - "object_type": "mesh", + "object_type": mesh, + "elements": [points, polyhedrons], "is_3D": True, "is_viewable": True, "save_viewable": g_v.save_viewable_light_regular_grid3D, @@ -220,7 +233,8 @@ def geode_objects_dict(): "convert": og_gs.convert_point_set_coordinate_reference_system2D, "create": og.create_point_set_coordinate_system2D, }, - "object_type": "mesh", + "object_type": mesh, + "elements": [points], "is_3D": False, "is_viewable": True, "save_viewable": g_v.save_viewable_point_set2D, @@ -241,7 +255,8 @@ def geode_objects_dict(): "convert": og_gs.convert_point_set_coordinate_reference_system3D, "create": og.create_point_set_coordinate_system3D, }, - "object_type": "mesh", + "object_type": mesh, + "elements": [points], "is_3D": True, "is_viewable": True, "save_viewable": g_v.save_viewable_point_set3D, @@ -262,7 +277,8 @@ def geode_objects_dict(): "convert": og_gs.convert_surface_mesh_coordinate_reference_system2D, "create": og.create_surface_mesh_coordinate_system2D, }, - "object_type": "mesh", + "object_type": mesh, + "elements": [points, polygons], "is_3D": False, "is_viewable": True, "save_viewable": g_v.save_viewable_polygonal_surface2D, @@ -283,7 +299,8 @@ def geode_objects_dict(): "convert": og_gs.convert_surface_mesh_coordinate_reference_system3D, "create": og.create_surface_mesh_coordinate_system3D, }, - "object_type": "mesh", + "object_type": mesh, + "elements": [points, polygons], "is_3D": True, "is_viewable": True, "save_viewable": g_v.save_viewable_polygonal_surface3D, @@ -304,7 +321,8 @@ def geode_objects_dict(): "convert": og_gs.convert_solid_mesh_coordinate_reference_system3D, "create": og.create_solid_mesh_coordinate_system3D, }, - "object_type": "mesh", + "object_type": mesh, + "elements": [points, polyhedrons], "is_3D": True, "is_viewable": True, "save_viewable": g_v.save_viewable_polyhedral_solid3D, @@ -319,7 +337,7 @@ def geode_objects_dict(): "load": og.load_raster_image2D, "is_saveable": og.is_raster_image_saveable2D, "save": og.save_raster_image2D, - "object_type": "mesh", + "object_type": mesh, "is_3D": False, "is_viewable": True, "save_viewable": g_v.save_viewable_raster_image2D, @@ -333,7 +351,7 @@ def geode_objects_dict(): "load": og.load_raster_image3D, "is_saveable": og.is_raster_image_saveable3D, "save": og.save_raster_image3D, - "object_type": "mesh", + "object_type": mesh, "is_3D": False, "is_viewable": True, "save_viewable": g_v.save_viewable_raster_image3D, @@ -353,7 +371,8 @@ def geode_objects_dict(): "convert": og_gs.convert_surface_mesh_coordinate_reference_system2D, "create": og.create_surface_mesh_coordinate_system2D, }, - "object_type": "mesh", + "object_type": mesh, + "elements": [points, polygons], "is_3D": False, "is_viewable": True, "save_viewable": g_v.save_viewable_regular_grid2D, @@ -373,7 +392,8 @@ def geode_objects_dict(): "convert": og_gs.convert_solid_mesh_coordinate_reference_system3D, "create": og.create_surface_mesh_coordinate_system3D, }, - "object_type": "mesh", + "object_type": mesh, + "elements": [points, polyhedrons], "is_3D": True, "is_viewable": True, "save_viewable": g_v.save_viewable_regular_grid3D, @@ -393,7 +413,7 @@ def geode_objects_dict(): "convert": og_gs.convert_section_coordinate_reference_system, "create": og.create_section_coordinate_system, }, - "object_type": "model", + "object_type": model, "is_3D": False, "is_viewable": True, "save_viewable": g_v.save_viewable_section, @@ -415,7 +435,7 @@ def geode_objects_dict(): "convert": og_gs.convert_brep_coordinate_reference_system, "create": og.create_brep_coordinate_system, }, - "object_type": "model", + "object_type": model, "is_3D": True, "is_viewable": True, "save_viewable": g_v.save_viewable_structural_model, @@ -436,7 +456,8 @@ def geode_objects_dict(): "convert": og_gs.convert_solid_mesh_coordinate_reference_system3D, "create": og.create_solid_mesh_coordinate_system3D, }, - "object_type": "mesh", + "object_type": mesh, + "elements": [points, polyhedrons], "is_3D": True, "is_viewable": True, "save_viewable": g_v.save_viewable_tetrahedral_solid3D, @@ -457,7 +478,8 @@ def geode_objects_dict(): "convert": og_gs.convert_surface_mesh_coordinate_reference_system2D, "create": og.create_surface_mesh_coordinate_system2D, }, - "object_type": "mesh", + "object_type": mesh, + "elements": [points, polygons], "is_3D": False, "is_viewable": True, "save_viewable": g_v.save_viewable_triangulated_surface2D, @@ -478,7 +500,8 @@ def geode_objects_dict(): "convert": og_gs.convert_surface_mesh_coordinate_reference_system3D, "create": og.create_surface_mesh_coordinate_system3D, }, - "object_type": "mesh", + "object_type": mesh, + "elements": [points, polygons], "is_3D": True, "is_viewable": True, "save_viewable": g_v.save_viewable_triangulated_surface3D, @@ -494,7 +517,7 @@ def geode_objects_dict(): "is_saveable": og.is_vertex_set_saveable, "save": og.save_vertex_set, "builder": og.VertexSetBuilder.create, - "object_type": "mesh", + "object_type": mesh, "is_3D": False, "is_viewable": False, }, diff --git a/tests/conftest.py b/tests/conftest.py index efe7e6c2..847e503a 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,5 +1,6 @@ # Standard library imports import time +import shutil # Third party imports import pytest @@ -8,6 +9,12 @@ from app import app +@pytest.fixture(scope="session", autouse=True) +def copy_data(): + shutil.rmtree("./data", ignore_errors=True) + shutil.copytree("./tests/data", "./data", dirs_exist_ok=True) + + @pytest.fixture def client(): app.config["TESTING"] = True diff --git a/tests/data/test.tif b/tests/data/test.tif new file mode 100644 index 00000000..77501e31 Binary files /dev/null and b/tests/data/test.tif differ diff --git a/tests/data/test.tiff b/tests/data/test.tiff new file mode 100644 index 00000000..77501e31 Binary files /dev/null and b/tests/data/test.tiff differ diff --git a/tests/test_routes.py b/tests/test_routes.py index fca42a52..0e33ccf8 100644 --- a/tests/test_routes.py +++ b/tests/test_routes.py @@ -1,13 +1,11 @@ # Standard library imports -import base64 import os # Third party imports from werkzeug.datastructures import FileStorage -from flask import app # Local application imports -from src.opengeodeweb_back import test_utils +from src.opengeodeweb_back import geode_functions, geode_objects, test_utils def test_allowed_files(client): @@ -169,110 +167,111 @@ def get_full_data(): def test_vertex_attribute_names(client): - response = client.put( - f"/upload_file", - data={"file": FileStorage(open("./tests/vertex_attribute.vtp", "rb"))}, - ) - assert response.status_code == 201 - - response = client.post( - "/save_viewable_file", - json={ - "input_geode_object": "PolygonalSurface3D", - "filename": "vertex_attribute.vtp", - }, - ) - assert response.status_code == 200 - native_file_name = response.json["native_file_name"] - route = f"/vertex_attribute_names" + for geode_object, value in geode_objects.geode_objects_dict().items(): + if value["object_type"] == "mesh": + input_extensions = geode_functions.geode_object_input_extensions( + geode_object + ) + if "elements" in value: + elements = geode_functions.get_elements(geode_object) + if "points" in elements: + for input_extension in input_extensions: + is_loadable = geode_functions.is_loadable( + geode_object, + os.path.join("./data", f"test.{input_extension}"), + ) + if is_loadable: + + def get_full_data(): + return { + "input_geode_object": geode_object, + "filename": f"test.{input_extension}", + } + + response = client.post(route, json=get_full_data()) + assert response.status_code == 200 + vertex_attribute_names = response.json[ + "vertex_attribute_names" + ] + assert type(vertex_attribute_names) is list + for vertex_attribute_name in vertex_attribute_names: + assert type(vertex_attribute_name) is str - def get_full_data(): - return { - "input_geode_object": "PolygonalSurface3D", - "filename": native_file_name, - } - - # Normal test with filename 'vertex_attribute.vtp' - response = client.post(route, json=get_full_data()) - assert response.status_code == 200 - vertex_attribute_names = response.json["vertex_attribute_names"] - assert type(vertex_attribute_names) is list - for vertex_attribute_name in vertex_attribute_names: - assert type(vertex_attribute_name) is str - + # Test all params test_utils.test_route_wrong_params(client, route, get_full_data) def test_polygon_attribute_names(client): - response = client.put( - f"/upload_file", - data={"file": FileStorage(open("./tests/polygon_attribute.vtp", "rb"))}, - ) - assert response.status_code == 201 - - response = client.post( - "/save_viewable_file", - json={ - "input_geode_object": "PolygonalSurface3D", - "filename": "polygon_attribute.vtp", - }, - ) - assert response.status_code == 200 - native_file_name = response.json["native_file_name"] - route = f"/polygon_attribute_names" - - def get_full_data(): - return { - "input_geode_object": "PolygonalSurface3D", - "filename": native_file_name, - } - - # Normal test with filename 'vertex_attribute.vtp' - response = client.post(route, json=get_full_data()) - assert response.status_code == 200 - polygon_attribute_names = response.json["polygon_attribute_names"] - assert type(polygon_attribute_names) is list - for polygon_attribute_name in polygon_attribute_names: - assert type(polygon_attribute_name) is str + for geode_object, value in geode_objects.geode_objects_dict().items(): + if value["object_type"] == "mesh": + input_extensions = geode_functions.geode_object_input_extensions( + geode_object + ) + if "elements" in value: + elements = geode_functions.get_elements(geode_object) + if "polygons" in elements: + for input_extension in input_extensions: + is_loadable = geode_functions.is_loadable( + geode_object, + os.path.join("./data", f"test.{input_extension}"), + ) + if is_loadable: + + def get_full_data(): + return { + "input_geode_object": geode_object, + "filename": f"test.{input_extension}", + } + + response = client.post(route, json=get_full_data()) + assert response.status_code == 200 + polygon_attribute_names = response.json[ + "polygon_attribute_names" + ] + assert type(polygon_attribute_names) is list + for polygon_attribute_name in polygon_attribute_names: + assert type(polygon_attribute_name) is str # Test all params test_utils.test_route_wrong_params(client, route, get_full_data) def test_polyhedron_attribute_names(client): - response = client.put( - f"/upload_file", - data={"file": FileStorage(open("./tests/polyhedron_attribute.vtu", "rb"))}, - ) - assert response.status_code == 201 - - response = client.post( - "/save_viewable_file", - json={ - "input_geode_object": "HybridSolid3D", - "filename": "polyhedron_attribute.vtu", - }, - ) - assert response.status_code == 200 - native_file_name = response.json["native_file_name"] - route = f"/polyhedron_attribute_names" + for geode_object, value in geode_objects.geode_objects_dict().items(): + if value["object_type"] == "mesh": + input_extensions = geode_functions.geode_object_input_extensions( + geode_object + ) + if "elements" in value: + elements = geode_functions.get_elements(geode_object) + if "polyhedrons" in elements: + for input_extension in input_extensions: + is_loadable = geode_functions.is_loadable( + geode_object, + os.path.join("./data", f"test.{input_extension}"), + ) + if is_loadable: + + def get_full_data(): + return { + "input_geode_object": geode_object, + "filename": f"test.{input_extension}", + } + + response = client.post(route, json=get_full_data()) + assert response.status_code == 200 + polyhedron_attribute_names = response.json[ + "polyhedron_attribute_names" + ] + assert type(polyhedron_attribute_names) is list + for polyhedron_attribute_name in polyhedron_attribute_names: + assert type(polyhedron_attribute_name) is str - def get_full_data(): - return { - "input_geode_object": "HybridSolid3D", - "filename": native_file_name, - } - - # Normal test with filename 'vertex_attribute.vtp' - response = client.post(route, json=get_full_data()) - assert response.status_code == 200 - polygon_attribute_names = response.json["polyhedron_attribute_names"] - assert type(polygon_attribute_names) is list - for polygon_attribute_name in polygon_attribute_names: - assert type(polygon_attribute_name) is str + # Test all params + test_utils.test_route_wrong_params(client, route, get_full_data) # Test all params test_utils.test_route_wrong_params(client, route, get_full_data)