From 74ca632d87314d611f68436ccd87b286c3ed9a69 Mon Sep 17 00:00:00 2001 From: Matt Fisher Date: Thu, 26 Sep 2024 08:21:33 -0600 Subject: [PATCH] Mark tests which depend on ECS/EGI as expected fail; separate integration and unit tests (#609) --- .github/workflows/integration_test.yml | 4 +- .github/workflows/unit_test.yml | 3 +- .../documentation/classes_dev_uml.svg | 226 ++++++++++-------- .../documentation/classes_user_uml.svg | 172 +++++++------ .../documentation/packages_user_uml.svg | 192 ++++++++------- icepyx/tests/__init__.py | 0 .../{ => integration}/ATL06v06_options.json | 0 icepyx/tests/{ => integration}/test_auth.py | 0 .../test_behind_NSIDC_API_login.py | 11 +- icepyx/tests/{ => unit}/test_APIformatting.py | 0 icepyx/tests/{ => unit}/test_Earthdata.py | 0 icepyx/tests/{ => unit}/test_granules.py | 0 .../tests/{ => unit}/test_is2class_query.py | 0 icepyx/tests/{ => unit}/test_is2ref.py | 0 icepyx/tests/{ => unit}/test_query.py | 0 icepyx/tests/{ => unit}/test_quest.py | 0 icepyx/tests/{ => unit}/test_quest_argo.py | 0 icepyx/tests/{ => unit}/test_read.py | 8 +- icepyx/tests/{ => unit}/test_spatial.py | 2 +- icepyx/tests/{ => unit}/test_temporal.py | 0 .../tests/{ => unit}/test_validate_inputs.py | 0 icepyx/tests/{ => unit}/test_variables.py | 0 icepyx/tests/{ => unit}/test_visualization.py | 0 23 files changed, 339 insertions(+), 279 deletions(-) delete mode 100644 icepyx/tests/__init__.py rename icepyx/tests/{ => integration}/ATL06v06_options.json (100%) rename icepyx/tests/{ => integration}/test_auth.py (100%) rename icepyx/tests/{ => integration}/test_behind_NSIDC_API_login.py (86%) rename icepyx/tests/{ => unit}/test_APIformatting.py (100%) rename icepyx/tests/{ => unit}/test_Earthdata.py (100%) rename icepyx/tests/{ => unit}/test_granules.py (100%) rename icepyx/tests/{ => unit}/test_is2class_query.py (100%) rename icepyx/tests/{ => unit}/test_is2ref.py (100%) rename icepyx/tests/{ => unit}/test_query.py (100%) rename icepyx/tests/{ => unit}/test_quest.py (100%) rename icepyx/tests/{ => unit}/test_quest_argo.py (100%) rename icepyx/tests/{ => unit}/test_read.py (91%) rename icepyx/tests/{ => unit}/test_spatial.py (99%) rename icepyx/tests/{ => unit}/test_temporal.py (100%) rename icepyx/tests/{ => unit}/test_validate_inputs.py (100%) rename icepyx/tests/{ => unit}/test_variables.py (100%) rename icepyx/tests/{ => unit}/test_visualization.py (100%) diff --git a/.github/workflows/integration_test.yml b/.github/workflows/integration_test.yml index 4bc27655e..ad76ba127 100644 --- a/.github/workflows/integration_test.yml +++ b/.github/workflows/integration_test.yml @@ -39,9 +39,7 @@ jobs: EARTHDATA_PASSWORD: "${{ secrets.EARTHDATA_PASSWORD }}" NSIDC_LOGIN: "${{ secrets.EARTHDATA_PASSWORD }}" run: | - pytest icepyx/ --verbose --cov app \ - icepyx/tests/test_behind_NSIDC_API_login.py \ - icepyx/tests/test_auth.py + pytest icepyx/tests/integration --verbose --cov app - name: "Upload coverage report" uses: "codecov/codecov-action@v4.5.0" diff --git a/.github/workflows/unit_test.yml b/.github/workflows/unit_test.yml index 989c7e298..eac541284 100644 --- a/.github/workflows/unit_test.yml +++ b/.github/workflows/unit_test.yml @@ -31,8 +31,7 @@ jobs: - name: "Run tests" run: | pytest icepyx/ --verbose --cov app \ - --ignore=icepyx/tests/test_behind_NSIDC_API_login.py \ - --ignore=icepyx/tests/test_auth.py + --ignore=icepyx/tests/integration - name: "Upload coverage report" uses: "codecov/codecov-action@v4.5.0" diff --git a/doc/source/user_guide/documentation/classes_dev_uml.svg b/doc/source/user_guide/documentation/classes_dev_uml.svg index 1c75cf0b3..5be4ca7af 100644 --- a/doc/source/user_guide/documentation/classes_dev_uml.svg +++ b/doc/source/user_guide/documentation/classes_dev_uml.svg @@ -4,11 +4,11 @@ - + classes_dev_uml - + icepyx.quest.dataset_scripts.argo.Argo @@ -61,7 +61,7 @@ () - + icepyx.quest.dataset_scripts.argo.Argo->icepyx.quest.dataset_scripts.dataset.DataSet @@ -129,7 +129,7 @@ - + icepyx.core.types.EGIParamsSubsetBbox->icepyx.core.types.EGIParamsSubsetBase @@ -145,7 +145,7 @@ - + icepyx.core.types.EGIParamsSubsetBoundingShape->icepyx.core.types.EGIParamsSubsetBase @@ -176,7 +176,7 @@ - + icepyx.core.types.EGIRequiredParamsDownload->icepyx.core.types.EGIRequiredParamsBase @@ -191,7 +191,7 @@ - + icepyx.core.types.EGIRequiredParamsSearch->icepyx.core.types.EGIRequiredParamsBase @@ -199,23 +199,47 @@ icepyx.core.auth.EarthdataAuthMixin - -EarthdataAuthMixin - -_auth : NoneType -_s3_initial_ts : NoneType, datetime -_s3login_credentials : NoneType -_session : NoneType -auth -s3login_credentials -session - -__init__(auth) -__str__(): str -earthdata_login(uid, email, s3token): None + +EarthdataAuthMixin + +_auth : NoneType +_s3_initial_ts : NoneType, datetime +_s3login_credentials : NoneType +_session : NoneType +auth +s3login_credentials +session + +__init__(auth) +__str__(): str +earthdata_login(uid, email, s3token): None + + + +icepyx.core.exceptions.ExhaustiveTypeGuardException + +ExhaustiveTypeGuardException + + + + + + +icepyx.core.exceptions.TypeGuardException + +TypeGuardException + + +__str__() + + + +icepyx.core.exceptions.ExhaustiveTypeGuardException->icepyx.core.exceptions.TypeGuardException + + - + icepyx.core.query.GenQuery GenQuery @@ -233,7 +257,7 @@ __str__() - + icepyx.core.granules.Granules Granules @@ -247,13 +271,13 @@ place_order(CMRparams: CMRParams, reqparams: EGIRequiredParamsDownload, subsetparams, verbose, subset, geom_filepath) - + icepyx.core.granules.Granules->icepyx.core.auth.EarthdataAuthMixin - - + + - + icepyx.core.query.Query Query @@ -294,50 +318,50 @@ visualize_spatial_extent() - + icepyx.core.granules.Granules->icepyx.core.query.Query _granules - + icepyx.core.icesat2data.Icesat2Data - -Icesat2Data - - -__init__() + +Icesat2Data + + +__init__() - + icepyx.core.exceptions.NsidcQueryError - -NsidcQueryError - -errmsg -msgtxt : str - -__init__(errmsg, msgtxt) -__str__() + +NsidcQueryError + +errmsg +msgtxt : str + +__init__(errmsg, msgtxt) +__str__() - + icepyx.core.exceptions.QueryError - -QueryError - - - + +QueryError + + + - + icepyx.core.exceptions.NsidcQueryError->icepyx.core.exceptions.QueryError - - + + - + icepyx.core.APIformatting.Parameters Parameters @@ -355,47 +379,47 @@ check_values(): bool - + icepyx.core.APIformatting.Parameters->icepyx.core.query.Query _CMRparams - + icepyx.core.APIformatting.Parameters->icepyx.core.query.Query _reqparams - + icepyx.core.APIformatting.Parameters->icepyx.core.query.Query _subsetparams - + icepyx.core.APIformatting.Parameters->icepyx.core.query.Query _subsetparams - + icepyx.core.query.Query->icepyx.core.auth.EarthdataAuthMixin - - + + - + icepyx.core.query.Query->icepyx.core.query.GenQuery - + icepyx.quest.quest.Quest Quest @@ -411,13 +435,13 @@ search_all() - + icepyx.quest.quest.Quest->icepyx.core.query.GenQuery - + icepyx.core.read.Read Read @@ -440,13 +464,13 @@ load() - + icepyx.core.read.Read->icepyx.core.auth.EarthdataAuthMixin - - + + - + icepyx.core.spatial.Spatial Spatial @@ -467,21 +491,21 @@ fmt_for_EGI() - + icepyx.core.spatial.Spatial->icepyx.core.query.GenQuery _spatial - + icepyx.core.spatial.Spatial->icepyx.core.query.GenQuery _spatial - + icepyx.core.temporal.Temporal Temporal @@ -495,14 +519,14 @@ __str__() - + icepyx.core.temporal.Temporal->icepyx.core.query.GenQuery _temporal - + icepyx.core.variables.Variables Variables @@ -528,62 +552,62 @@ remove(all, var_list, beam_list, keyword_list) - + icepyx.core.variables.Variables->icepyx.core.auth.EarthdataAuthMixin - - + + - + icepyx.core.variables.Variables->icepyx.core.query.Query _order_vars - + icepyx.core.variables.Variables->icepyx.core.query.Query _order_vars - + icepyx.core.variables.Variables->icepyx.core.read.Read _read_vars - + icepyx.core.variables.Variables->icepyx.core.read.Read _read_vars - + icepyx.core.visualization.Visualize - -Visualize - -bbox : list -cycles : NoneType -date_range : NoneType -product : NoneType, str -tracks : NoneType - -__init__(query_obj, product, spatial_extent, date_range, cycles, tracks) -generate_OA_parameters(): list -grid_bbox(binsize): list -make_request(base_url, payload) -parallel_request_OA(): da.array -query_icesat2_filelist(): tuple -request_OA_data(paras): da.array -viz_elevation(): tuple[hv.DynamicMap, hv.Layout] + +Visualize + +bbox : list +cycles : NoneType +date_range : NoneType +product : NoneType, str +tracks : NoneType + +__init__(query_obj, product, spatial_extent, date_range, cycles, tracks) +generate_OA_parameters(): list +grid_bbox(binsize): list +make_request(base_url, payload) +parallel_request_OA(): da.array +query_icesat2_filelist(): tuple +request_OA_data(paras): da.array +viz_elevation(): tuple[hv.DynamicMap, hv.Layout] - + icepyx.core.APIformatting._FmtedKeysDescriptor _FmtedKeysDescriptor @@ -592,7 +616,7 @@ __get__(instance: 'Parameters[Literal["CMR"]]', owner: Any): CMRParams - + icepyx.core.APIformatting._FmtedKeysDescriptor->icepyx.core.APIformatting.Parameters diff --git a/doc/source/user_guide/documentation/classes_user_uml.svg b/doc/source/user_guide/documentation/classes_user_uml.svg index b4d2a024c..b9a3c2508 100644 --- a/doc/source/user_guide/documentation/classes_user_uml.svg +++ b/doc/source/user_guide/documentation/classes_user_uml.svg @@ -4,11 +4,11 @@ - + classes_user_uml - + icepyx.core.auth.AuthenticationError @@ -72,7 +72,7 @@ - + icepyx.core.types.EGIParamsSubsetBbox->icepyx.core.types.EGIParamsSubsetBase @@ -88,7 +88,7 @@ - + icepyx.core.types.EGIParamsSubsetBoundingShape->icepyx.core.types.EGIParamsSubsetBase @@ -119,7 +119,7 @@ - + icepyx.core.types.EGIRequiredParamsDownload->icepyx.core.types.EGIRequiredParamsBase @@ -134,7 +134,7 @@ - + icepyx.core.types.EGIRequiredParamsSearch->icepyx.core.types.EGIRequiredParamsBase @@ -151,8 +151,32 @@ earthdata_login(uid, email, s3token): None - + +icepyx.core.exceptions.ExhaustiveTypeGuardException + +ExhaustiveTypeGuardException + + + + + + +icepyx.core.exceptions.TypeGuardException + +TypeGuardException + + + + + + +icepyx.core.exceptions.ExhaustiveTypeGuardException->icepyx.core.exceptions.TypeGuardException + + + + + icepyx.core.query.GenQuery GenQuery @@ -167,7 +191,7 @@ - + icepyx.core.granules.Granules Granules @@ -180,13 +204,13 @@ place_order(CMRparams: CMRParams, reqparams: EGIRequiredParamsDownload, subsetparams, verbose, subset, geom_filepath) - + icepyx.core.granules.Granules->icepyx.core.auth.EarthdataAuthMixin - + icepyx.core.query.Query Query @@ -213,49 +237,49 @@ visualize_spatial_extent() - + icepyx.core.granules.Granules->icepyx.core.query.Query _granules - + icepyx.core.icesat2data.Icesat2Data - -Icesat2Data - - - + +Icesat2Data + + + - + icepyx.core.exceptions.NsidcQueryError - -NsidcQueryError - -errmsg -msgtxt : str - - + +NsidcQueryError + +errmsg +msgtxt : str + + - + icepyx.core.exceptions.QueryError - -QueryError - - - + +QueryError + + + - + icepyx.core.exceptions.NsidcQueryError->icepyx.core.exceptions.QueryError - - + + - + icepyx.core.APIformatting.Parameters Parameters @@ -269,47 +293,47 @@ check_values(): bool - + icepyx.core.APIformatting.Parameters->icepyx.core.query.Query _CMRparams - + icepyx.core.APIformatting.Parameters->icepyx.core.query.Query _reqparams - + icepyx.core.APIformatting.Parameters->icepyx.core.query.Query _subsetparams - + icepyx.core.APIformatting.Parameters->icepyx.core.query.Query _subsetparams - + icepyx.core.query.Query->icepyx.core.auth.EarthdataAuthMixin - + icepyx.core.query.Query->icepyx.core.query.GenQuery - + icepyx.core.read.Read Read @@ -322,13 +346,13 @@ load() - + icepyx.core.read.Read->icepyx.core.auth.EarthdataAuthMixin - + icepyx.core.spatial.Spatial Spatial @@ -342,21 +366,21 @@ fmt_for_EGI() - + icepyx.core.spatial.Spatial->icepyx.core.query.GenQuery _spatial - + icepyx.core.spatial.Spatial->icepyx.core.query.GenQuery _spatial - + icepyx.core.temporal.Temporal Temporal @@ -367,14 +391,14 @@ - + icepyx.core.temporal.Temporal->icepyx.core.query.GenQuery _temporal - + icepyx.core.variables.Variables Variables @@ -390,61 +414,61 @@ remove(all, var_list, beam_list, keyword_list) - + icepyx.core.variables.Variables->icepyx.core.auth.EarthdataAuthMixin - + icepyx.core.variables.Variables->icepyx.core.query.Query _order_vars - + icepyx.core.variables.Variables->icepyx.core.query.Query _order_vars - + icepyx.core.variables.Variables->icepyx.core.read.Read _read_vars - + icepyx.core.variables.Variables->icepyx.core.read.Read _read_vars - + icepyx.core.visualization.Visualize - -Visualize - -bbox : list -cycles : NoneType -date_range : NoneType -product : NoneType, str -tracks : NoneType - -generate_OA_parameters(): list -grid_bbox(binsize): list -make_request(base_url, payload) -parallel_request_OA(): da.array -query_icesat2_filelist(): tuple -request_OA_data(paras): da.array -viz_elevation(): tuple[hv.DynamicMap, hv.Layout] + +Visualize + +bbox : list +cycles : NoneType +date_range : NoneType +product : NoneType, str +tracks : NoneType + +generate_OA_parameters(): list +grid_bbox(binsize): list +make_request(base_url, payload) +parallel_request_OA(): da.array +query_icesat2_filelist(): tuple +request_OA_data(paras): da.array +viz_elevation(): tuple[hv.DynamicMap, hv.Layout] - + icepyx.core.APIformatting._FmtedKeysDescriptor _FmtedKeysDescriptor @@ -453,7 +477,7 @@ - + icepyx.core.APIformatting._FmtedKeysDescriptor->icepyx.core.APIformatting.Parameters diff --git a/doc/source/user_guide/documentation/packages_user_uml.svg b/doc/source/user_guide/documentation/packages_user_uml.svg index 9d29c40d0..f05094a12 100644 --- a/doc/source/user_guide/documentation/packages_user_uml.svg +++ b/doc/source/user_guide/documentation/packages_user_uml.svg @@ -4,214 +4,220 @@ - + packages_user_uml - + icepyx.core - -icepyx.core + +icepyx.core icepyx.core.APIformatting - -icepyx.core.APIformatting + +icepyx.core.APIformatting + + + +icepyx.core.exceptions + +icepyx.core.exceptions + + + +icepyx.core.APIformatting->icepyx.core.exceptions + + icepyx.core.types - -icepyx.core.types + +icepyx.core.types - + icepyx.core.APIformatting->icepyx.core.types - - + + icepyx.core.auth - -icepyx.core.auth - - - -icepyx.core.exceptions - -icepyx.core.exceptions + +icepyx.core.auth - + icepyx.core.auth->icepyx.core.exceptions - - + + icepyx.core.granules - -icepyx.core.granules + +icepyx.core.granules - + icepyx.core.granules->icepyx.core.auth - - + + - + icepyx.core.granules->icepyx.core.types - - + + icepyx.core.urls - -icepyx.core.urls + +icepyx.core.urls - + icepyx.core.granules->icepyx.core.urls - - + + icepyx.core.icesat2data - -icepyx.core.icesat2data + +icepyx.core.icesat2data - + icepyx.core.icesat2data->icepyx.core.exceptions - - + + icepyx.core.is2ref - -icepyx.core.is2ref + +icepyx.core.is2ref - + icepyx.core.is2ref->icepyx.core.urls - - + + icepyx.core.query - -icepyx.core.query + +icepyx.core.query - + icepyx.core.query->icepyx.core.auth - - + + - + icepyx.core.query->icepyx.core.exceptions - - + + - + icepyx.core.query->icepyx.core.granules - - + + - + icepyx.core.query->icepyx.core.types - - + + icepyx.core.variables - -icepyx.core.variables + +icepyx.core.variables - + icepyx.core.query->icepyx.core.variables - - + + icepyx.core.visualization - -icepyx.core.visualization + +icepyx.core.visualization - + icepyx.core.query->icepyx.core.visualization - - + + icepyx.core.read - -icepyx.core.read + +icepyx.core.read - + icepyx.core.read->icepyx.core.auth - - + + - + icepyx.core.read->icepyx.core.exceptions - - + + - + icepyx.core.read->icepyx.core.variables - - + + icepyx.core.spatial - -icepyx.core.spatial + +icepyx.core.spatial icepyx.core.temporal - -icepyx.core.temporal + +icepyx.core.temporal icepyx.core.validate_inputs - -icepyx.core.validate_inputs + +icepyx.core.validate_inputs - + icepyx.core.variables->icepyx.core.auth - - + + - + icepyx.core.variables->icepyx.core.exceptions - - + + diff --git a/icepyx/tests/__init__.py b/icepyx/tests/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/icepyx/tests/ATL06v06_options.json b/icepyx/tests/integration/ATL06v06_options.json similarity index 100% rename from icepyx/tests/ATL06v06_options.json rename to icepyx/tests/integration/ATL06v06_options.json diff --git a/icepyx/tests/test_auth.py b/icepyx/tests/integration/test_auth.py similarity index 100% rename from icepyx/tests/test_auth.py rename to icepyx/tests/integration/test_auth.py diff --git a/icepyx/tests/test_behind_NSIDC_API_login.py b/icepyx/tests/integration/test_behind_NSIDC_API_login.py similarity index 86% rename from icepyx/tests/test_behind_NSIDC_API_login.py rename to icepyx/tests/integration/test_behind_NSIDC_API_login.py index f9fb49077..37924cfc4 100644 --- a/icepyx/tests/test_behind_NSIDC_API_login.py +++ b/icepyx/tests/integration/test_behind_NSIDC_API_login.py @@ -11,6 +11,15 @@ import icepyx as ipx import icepyx.core.is2ref as is2ref +# Skip the whole module. See: +# https://docs.pytest.org/en/stable/reference/reference.html#globalvar-pytestmark +pytestmark = pytest.mark.xfail( + reason=( + "The back-end API on which these tests depend, ECS/EGI/ESI, is scheduled for" + " shutdown in late 2024. At that point, these tests will begin failing." + ) +) + # Misc notes and needed tests # test avail data and subsetting success for each input type # (kml, shp, list of coords, bbox) @@ -40,7 +49,7 @@ def session(reg): def test_get_custom_options_output(session): obs = is2ref._get_custom_options(session, "ATL06", "006") - with open("./icepyx/tests/ATL06v06_options.json") as exp_json: + with open("./icepyx/tests/integration/ATL06v06_options.json") as exp_json: exp = json.load(exp_json) assert all(keys in obs for keys in exp) assert all(obs[key] == exp[key] for key in exp) diff --git a/icepyx/tests/test_APIformatting.py b/icepyx/tests/unit/test_APIformatting.py similarity index 100% rename from icepyx/tests/test_APIformatting.py rename to icepyx/tests/unit/test_APIformatting.py diff --git a/icepyx/tests/test_Earthdata.py b/icepyx/tests/unit/test_Earthdata.py similarity index 100% rename from icepyx/tests/test_Earthdata.py rename to icepyx/tests/unit/test_Earthdata.py diff --git a/icepyx/tests/test_granules.py b/icepyx/tests/unit/test_granules.py similarity index 100% rename from icepyx/tests/test_granules.py rename to icepyx/tests/unit/test_granules.py diff --git a/icepyx/tests/test_is2class_query.py b/icepyx/tests/unit/test_is2class_query.py similarity index 100% rename from icepyx/tests/test_is2class_query.py rename to icepyx/tests/unit/test_is2class_query.py diff --git a/icepyx/tests/test_is2ref.py b/icepyx/tests/unit/test_is2ref.py similarity index 100% rename from icepyx/tests/test_is2ref.py rename to icepyx/tests/unit/test_is2ref.py diff --git a/icepyx/tests/test_query.py b/icepyx/tests/unit/test_query.py similarity index 100% rename from icepyx/tests/test_query.py rename to icepyx/tests/unit/test_query.py diff --git a/icepyx/tests/test_quest.py b/icepyx/tests/unit/test_quest.py similarity index 100% rename from icepyx/tests/test_quest.py rename to icepyx/tests/unit/test_quest.py diff --git a/icepyx/tests/test_quest_argo.py b/icepyx/tests/unit/test_quest_argo.py similarity index 100% rename from icepyx/tests/test_quest_argo.py rename to icepyx/tests/unit/test_quest_argo.py diff --git a/icepyx/tests/test_read.py b/icepyx/tests/unit/test_read.py similarity index 91% rename from icepyx/tests/test_read.py rename to icepyx/tests/unit/test_read.py index 90efe13f9..994a1aab7 100644 --- a/icepyx/tests/test_read.py +++ b/icepyx/tests/unit/test_read.py @@ -29,12 +29,12 @@ def test_parse_source_no_files(): ( # check list input [ "./icepyx/core/is2ref.py", - "./icepyx/tests/test_is2class_query.py", + "./icepyx/tests/unit/test_is2class_query.py", ], sorted( [ "./icepyx/core/is2ref.py", - "./icepyx/tests/test_is2class_query.py", + "./icepyx/tests/unit/test_is2class_query.py", ] ), ), @@ -49,8 +49,8 @@ def test_parse_source_no_files(): sorted( [ "./icepyx/core/is2ref.py", - "./icepyx/tests/test_is2class_query.py", - "./icepyx/tests/test_is2ref.py", + "./icepyx/tests/unit/test_is2class_query.py", + "./icepyx/tests/unit/test_is2ref.py", ] ), ), diff --git a/icepyx/tests/test_spatial.py b/icepyx/tests/unit/test_spatial.py similarity index 99% rename from icepyx/tests/test_spatial.py rename to icepyx/tests/unit/test_spatial.py index 2243c0674..2012699bf 100644 --- a/icepyx/tests/test_spatial.py +++ b/icepyx/tests/unit/test_spatial.py @@ -378,7 +378,7 @@ def test_bad_poly_inputfile_name_throws_error(): def test_bad_poly_inputfile_type_throws_error(): with pytest.raises(TypeError): - spat.Spatial(str(Path("./icepyx/tests/test_read.py").resolve())) + spat.Spatial(str(Path("./icepyx/tests/unit/test_read.py").resolve())) ########## geodataframe ########## diff --git a/icepyx/tests/test_temporal.py b/icepyx/tests/unit/test_temporal.py similarity index 100% rename from icepyx/tests/test_temporal.py rename to icepyx/tests/unit/test_temporal.py diff --git a/icepyx/tests/test_validate_inputs.py b/icepyx/tests/unit/test_validate_inputs.py similarity index 100% rename from icepyx/tests/test_validate_inputs.py rename to icepyx/tests/unit/test_validate_inputs.py diff --git a/icepyx/tests/test_variables.py b/icepyx/tests/unit/test_variables.py similarity index 100% rename from icepyx/tests/test_variables.py rename to icepyx/tests/unit/test_variables.py diff --git a/icepyx/tests/test_visualization.py b/icepyx/tests/unit/test_visualization.py similarity index 100% rename from icepyx/tests/test_visualization.py rename to icepyx/tests/unit/test_visualization.py