diff --git a/adagucserverEC/CRequest.cpp b/adagucserverEC/CRequest.cpp index eeda9d97..573397ae 100644 --- a/adagucserverEC/CRequest.cpp +++ b/adagucserverEC/CRequest.cpp @@ -42,6 +42,10 @@ #include #include "Definitions.h" #include "utils/LayerUtils.h" +#include "utils/XMLGenUtils.h" +#include "utils/LayerMetadataStore.h" +#include +#include "utils/LayerMetadataToJson.h" const char *CRequest::className = "CRequest"; int CRequest::CGI = 0; @@ -2144,6 +2148,7 @@ int CRequest::process_all_layers() { CT::string dumpString = CDF::dump(dataSources[j]->getDataObject(0)->cdfObject); printf("%s", dumpString.c_str()); reader.close(); + return 0; } if (srvParam->requestType == REQUEST_WMS_GETREFERENCETIMES) { @@ -3199,6 +3204,16 @@ int CRequest::process_querystring() { CDBError("ADAGUC Server: GetMetaData is restricted"); return 1; } + + if (srvParam->Format.equals("application/json")) { + // GetMetadata for specific dataset and layer + json result; + getLayerMetadataAsJson(srvParam, result); + printf("%s%c%c\n", "Content-Type:application/json", 13, 10); + printf("%s", result.dump().c_str()); + return 0; + } + if (dFound_WMSLAYER == 0) { CDBError("ADAGUC Server: Parameter LAYER missing"); dErrorOccured = 1; diff --git a/adagucserverEC/CXMLGen.cpp b/adagucserverEC/CXMLGen.cpp index 87c47860..ebd21a80 100644 --- a/adagucserverEC/CXMLGen.cpp +++ b/adagucserverEC/CXMLGen.cpp @@ -100,8 +100,8 @@ int CXMLGen::getWMS_1_0_0_Capabilities(CT::string *XMLDoc, std::vectorlayerMetadata.dimList) { if (dim.hidden) continue; - XMLDoc->printconcat("\n", dim.name.c_str(), dim.units.c_str()); - XMLDoc->printconcat("", dim.name.c_str(), dim.defaultValue.c_str(), 1); + XMLDoc->printconcat("\n", dim.serviceName.c_str(), dim.units.c_str()); + XMLDoc->printconcat("", dim.serviceName.c_str(), dim.defaultValue.c_str(), 1); XMLDoc->concat(dim.values.c_str()); XMLDoc->concat("\n"); } @@ -237,8 +237,8 @@ int CXMLGen::getWMS_1_1_1_Capabilities(CT::string *XMLDoc, std::vectorlayerMetadata.dimList) { if (dim.hidden) continue; - XMLDoc->printconcat("\n", dim.name.c_str(), dim.units.c_str()); - XMLDoc->printconcat("", dim.name.c_str(), dim.defaultValue.c_str(), 1); + XMLDoc->printconcat("\n", dim.serviceName.c_str(), dim.units.c_str()); + XMLDoc->printconcat("", dim.serviceName.c_str(), dim.defaultValue.c_str(), 1); XMLDoc->concat(dim.values.c_str()); XMLDoc->concat("\n"); } @@ -649,11 +649,12 @@ int CXMLGen::getWMS_1_3_0_Capabilities(CT::string *XMLDoc, std::vectorlayerMetadata.dimList) { if (dim.hidden) continue; - if (dim.name.indexOf("time") != -1) { - XMLDoc->printconcat("", dim.name.c_str(), dim.units.c_str(), + if (dim.serviceName.indexOf("time") != -1) { + XMLDoc->printconcat("", dim.serviceName.c_str(), dim.units.c_str(), dim.defaultValue.c_str(), 1); } else { - XMLDoc->printconcat("", dim.name.c_str(), dim.units.c_str(), dim.defaultValue.c_str(), 1); + XMLDoc->printconcat("", dim.serviceName.c_str(), dim.units.c_str(), + dim.defaultValue.c_str(), 1); } XMLDoc->concat(dim.values.c_str()); XMLDoc->concat("\n"); diff --git a/adagucserverEC/LayerTypeLiveUpdate/LayerTypeLiveUpdate.cpp b/adagucserverEC/LayerTypeLiveUpdate/LayerTypeLiveUpdate.cpp index afcd3879..9143f334 100644 --- a/adagucserverEC/LayerTypeLiveUpdate/LayerTypeLiveUpdate.cpp +++ b/adagucserverEC/LayerTypeLiveUpdate/LayerTypeLiveUpdate.cpp @@ -54,7 +54,8 @@ int layerTypeLiveUpdateConfigureWMSLayerForGetCapabilities(MetadataLayer *metada CT::string startTime = timeInstance.dateToISOString(timeInstance.offsetToDate(startTimeOffset)); CT::string stopTime = timeInstance.dateToISOString(timeInstance.offsetToDate(stopTimeOffset)); CT::string resTime = "PT1S"; - LayerMetadataDim dim = {.name = "time", .units = "ISO8601", .values = startTime + "/" + stopTime + "/" + resTime, .defaultValue = stopTime, .hasMultipleValues = true, .hidden = false}; + LayerMetadataDim dim = { + .serviceName = "time", .cdfName = "time", .units = "ISO8601", .values = startTime + "/" + stopTime + "/" + resTime, .defaultValue = stopTime, .hasMultipleValues = true, .hidden = false}; metadataLayer->layerMetadata.dimList.push_back(dim); return 0; diff --git a/adagucserverEC/Types/LayerMetadataType.h b/adagucserverEC/Types/LayerMetadataType.h index 19c76cdc..903028a2 100644 --- a/adagucserverEC/Types/LayerMetadataType.h +++ b/adagucserverEC/Types/LayerMetadataType.h @@ -6,7 +6,8 @@ #include struct LayerMetadataDim { - CT::string name; + CT::string serviceName; + CT::string cdfName; CT::string units; CT::string values; CT::string defaultValue; @@ -15,7 +16,7 @@ struct LayerMetadataDim { }; struct LayerMetadataProjection { - LayerMetadataProjection(const CT::string& name, const double bbox[]) { + LayerMetadataProjection(const CT::string &name, const double bbox[]) { this->name = name; for (size_t j = 0; j < 4; j++) { this->dfBBOX[j] = bbox[j]; diff --git a/adagucserverEC/utils/LayerMetadataStore.cpp b/adagucserverEC/utils/LayerMetadataStore.cpp index 4ce5c1c6..f707e2f0 100644 --- a/adagucserverEC/utils/LayerMetadataStore.cpp +++ b/adagucserverEC/utils/LayerMetadataStore.cpp @@ -12,10 +12,11 @@ int getDimensionListAsJson(MetadataLayer *metadataLayer, json &dimListJson) { item["defaultValue"] = dimension.defaultValue.c_str(); item["hasMultipleValues"] = dimension.hasMultipleValues; item["hidden"] = dimension.hidden; - item["name"] = dimension.name.c_str(); + item["serviceName"] = dimension.serviceName.c_str(); + item["cdfName"] = dimension.cdfName.c_str(); item["units"] = dimension.units.c_str(); item["values"] = dimension.values.c_str(); - dimListJson[dimension.name.c_str()] = item; + dimListJson[dimension.serviceName.c_str()] = item; } } catch (json::exception &e) { CDBWarning("Unable to build json structure"); @@ -26,7 +27,7 @@ int getDimensionListAsJson(MetadataLayer *metadataLayer, json &dimListJson) { int getLayerBaseMetadataAsJson(MetadataLayer *metadataLayer, json &layerMetadataItem) { try { - layerMetadataItem["name"] = metadataLayer->layerMetadata.name; + layerMetadataItem["layername"] = metadataLayer->layerMetadata.name; layerMetadataItem["title"] = metadataLayer->layerMetadata.title; layerMetadataItem["group"] = metadataLayer->layerMetadata.group; layerMetadataItem["abstract"] = metadataLayer->layerMetadata.abstract; @@ -181,7 +182,7 @@ int loadLayerMetadataStructFromMetadataDb(MetadataLayer *metadataLayer) { } json a; auto i = a.parse(layerMetadataAsJson.c_str()); - metadataLayer->layerMetadata.name = i["name"].get().c_str(); + metadataLayer->layerMetadata.name = i["layername"].get().c_str(); metadataLayer->layerMetadata.title = i["title"].get().c_str(); metadataLayer->layerMetadata.group = i["group"].get().c_str(); metadataLayer->layerMetadata.abstract = i["abstract"].get().c_str(); @@ -366,7 +367,8 @@ int loadLayerDimensionListFromMetadataDb(MetadataLayer *metadataLayer) { auto dimensionProperties = d.value(); LayerMetadataDim dimension = { - .name = dimensionProperties["name"].get().c_str(), + .serviceName = dimensionProperties["serviceName"].get().c_str(), + .cdfName = dimensionProperties["cdfName"].get().c_str(), .units = dimensionProperties["units"].get().c_str(), .values = dimensionProperties["values"].get().c_str(), .defaultValue = dimensionProperties["defaultValue"].get().c_str(), diff --git a/adagucserverEC/utils/XMLGenUtils.cpp b/adagucserverEC/utils/XMLGenUtils.cpp index 75ba168e..5b29ce9c 100644 --- a/adagucserverEC/utils/XMLGenUtils.cpp +++ b/adagucserverEC/utils/XMLGenUtils.cpp @@ -127,11 +127,11 @@ int populateMetadataLayerStruct(MetadataLayer *metadataLayer, bool readFromDB) { std::map projectionMap; // Make a unique list of projections - for (const auto& p : metadataLayer->layerMetadata.projectionList) { + for (const auto &p : metadataLayer->layerMetadata.projectionList) { projectionMap.emplace(p.name.c_str(), p); } metadataLayer->layerMetadata.projectionList.clear(); - for (const auto& p : projectionMap) { + for (const auto &p : projectionMap) { metadataLayer->layerMetadata.projectionList.push_back(p.second); } @@ -169,7 +169,8 @@ int getDimsForLayer(MetadataLayer *metadataLayer) { CT::string fileDate = CDirReader::getFileDate(metadataLayer->layer->FilePath[0]->value.c_str()); LayerMetadataDim dim; - dim.name.copy("time"); + dim.serviceName.copy("time"); + dim.cdfName.copy("time"); dim.units.copy("ISO8601"); dim.values.copy(fileDate.c_str()); dim.defaultValue.copy(fileDate.c_str()); @@ -188,7 +189,8 @@ int getDimsForLayer(MetadataLayer *metadataLayer) { // Create a new dim to store in the layer LayerMetadataDim dim; dim.hidden = false; - dim.name.copy(metadataLayer->dataSource->cfgLayer->Dimension[i]->value.c_str()); + dim.serviceName.copy(metadataLayer->dataSource->cfgLayer->Dimension[i]->value.c_str()); + dim.cdfName.copy(metadataLayer->dataSource->cfgLayer->Dimension[i]->attr.name.c_str()); // Get the tablename CT::string tableName; @@ -404,14 +406,15 @@ int getDimsForLayer(MetadataLayer *metadataLayer) { // if(srvParam->requestType==REQUEST_WMS_GETCAPABILITIES) { - dim.name.copy(metadataLayer->dataSource->cfgLayer->Dimension[i]->value.c_str()); + dim.serviceName.copy(metadataLayer->dataSource->cfgLayer->Dimension[i]->value.c_str()); + dim.cdfName.copy(metadataLayer->dataSource->cfgLayer->Dimension[i]->attr.name.c_str()); // Try to get units from the variable dim.units.copy("NA"); if (metadataLayer->dataSource->cfgLayer->Dimension[i]->attr.units.empty()) { CT::string units; try { - metadataLayer->dataSource->getDataObject(0)->cdfObject->getVariable(dim.name.c_str())->getAttribute("units")->getDataAsString(&units); + metadataLayer->dataSource->getDataObject(0)->cdfObject->getVariable(dim.cdfName.c_str())->getAttribute("units")->getDataAsString(&units); dim.units.copy(&units); } catch (int e) { } @@ -518,7 +521,8 @@ int getDimsForLayer(MetadataLayer *metadataLayer) { if (metadataLayer->dataSource->cfgLayer->Dimension[i]->attr.units.empty() == false) { dimUnits.copy(metadataLayer->dataSource->cfgLayer->Dimension[i]->attr.units.c_str()); } - dim.name.copy(metadataLayer->dataSource->cfgLayer->Dimension[i]->value.c_str()); + dim.serviceName.copy(metadataLayer->dataSource->cfgLayer->Dimension[i]->value.c_str()); + dim.cdfName.copy(metadataLayer->dataSource->cfgLayer->Dimension[i]->attr.name.c_str()); dim.units.copy(dimUnits.c_str()); dim.hasMultipleValues = 0; // metadataLayer->dataSource->cfgLayer->Dimension[i]->attr.defaultV.c_str() @@ -689,7 +693,7 @@ int getStylesForLayer(MetadataLayer *metadataLayer) { bool compareStringCase(const std::string &s1, const std::string &s2) { return strcmp(s1.c_str(), s2.c_str()) < 0; } bool compareProjection(const LayerMetadataProjection &p1, const LayerMetadataProjection &p2) { return strcmp(p1.name.c_str(), p2.name.c_str()) < 0; } -bool compareDim(const LayerMetadataDim &p2, const LayerMetadataDim &p1) { return strcmp(p1.name.c_str(), p2.name.c_str()) < 0; } +bool compareDim(const LayerMetadataDim &p2, const LayerMetadataDim &p1) { return strcmp(p1.serviceName.c_str(), p2.serviceName.c_str()) < 0; } int getTitleForLayer(MetadataLayer *metadataLayer) { #ifdef CXMLGEN_DEBUG diff --git a/python/lib/adaguc/runAdaguc.py b/python/lib/adaguc/runAdaguc.py index d38fa00a..ba249c8b 100644 --- a/python/lib/adaguc/runAdaguc.py +++ b/python/lib/adaguc/runAdaguc.py @@ -2,7 +2,6 @@ import os from PIL import Image from io import BytesIO -import brotli import shutil import random import string @@ -314,7 +313,7 @@ async def response_to_cache(redis_pool, key, headers: str, data): entrytime + f"{len(cacheable_headers_json):06d}".encode("utf-8") + cacheable_headers_json - + brotli.compress(data.getvalue()), + + data.getvalue(), ex=ttl, ) await redis_client.aclose() @@ -335,5 +334,5 @@ async def get_cached_response(redis_pool, key): headers = json.loads(cached[16 : 16 + headers_len].decode("utf-8")) headers.append(f"age: {age}") - data = brotli.decompress(cached[16 + headers_len :]) + data = cached[16 + headers_len :] return age, headers, BytesIO(data) diff --git a/python/python_fastapi_server/routers/caching_middleware.py b/python/python_fastapi_server/routers/caching_middleware.py index 0c18de12..867bfe6f 100644 --- a/python/python_fastapi_server/routers/caching_middleware.py +++ b/python/python_fastapi_server/routers/caching_middleware.py @@ -10,7 +10,6 @@ import redis.asyncio as redis # This can also be used to connect to a Redis cluster import json -import brotli ADAGUC_REDIS = os.environ.get("ADAGUC_REDIS") @@ -32,7 +31,7 @@ async def get_cached_response(redis_pool, request): headers_len = int(cached[10:16].decode("utf-8")) headers = json.loads(cached[16 : 16 + headers_len].decode("utf-8")) - data = brotli.decompress(cached[16 + headers_len :]) + data = cached[16 + headers_len :] return age, headers, data @@ -51,15 +50,14 @@ async def response_to_cache(redis_pool, request, headers, data, ex: int): entrytime = f"{calendar.timegm(datetime.utcnow().utctimetuple()):10d}".encode( "utf-8" ) - compressed_data = brotli.compress(data) - if len(compressed_data) < MAX_SIZE_FOR_CACHING: + if len(data) < MAX_SIZE_FOR_CACHING: redis_client = redis.Redis(connection_pool=redis_pool) await redis_client.set( key, entrytime + f"{len(headers_json):06d}".encode("utf-8") + headers_json - + brotli.compress(data), + + data, ex=ex, ) await redis_client.aclose() diff --git a/tests/AdagucTests/TestMetadataRequest.py b/tests/AdagucTests/TestMetadataRequest.py new file mode 100644 index 00000000..8d08c180 --- /dev/null +++ b/tests/AdagucTests/TestMetadataRequest.py @@ -0,0 +1,56 @@ +# pylint: disable=invalid-name,missing-function-docstring +""" +This class contains tests to test the adaguc-server binary executable file. This is similar to black box testing, it tests the behaviour of the server software. It configures the server and checks if the response is OK. +""" +import json +import os +import os.path +import unittest +import sys +from adaguc.AdagucTestTools import AdagucTestTools + +ADAGUC_PATH = os.environ["ADAGUC_PATH"] + + +class TestMetadataRequest(unittest.TestCase): + """ + TestMetadataRequest class to thest Web Map Service behaviour of adaguc-server. + """ + + testresultspath = "testresults/TestMetadataRequest/" + expectedoutputsspath = "expectedoutputs/TestMetadataRequest/" + env = {"ADAGUC_CONFIG": ADAGUC_PATH + "/data/config/adaguc.autoresource.xml"} + + AdagucTestTools().mkdir_p(testresultspath) + + def test_timeseries_adaguc_tests_arcus_uwcw_air_temperature_hagl(self): + AdagucTestTools().cleanTempDir() + if os.getenv("ADAGUC_DB").endswith(".db"): + print("SKIP: Only PSQL") + return + config = ( + ADAGUC_PATH + + "/data/config/adaguc.tests.dataset.xml," + + ADAGUC_PATH + + "/data/config/datasets/adaguc.tests.arcus_uwcw.xml" + ) + # pylint: disable=unused-variable + status, data, headers = AdagucTestTools().runADAGUCServer( + args=["--updatedb", "--config", config], env=self.env, isCGI=False + ) + self.assertEqual(status, 0) + + filename = "test_GetMetadataRequest_arcus_uwcw.json" + + status, data, headers = AdagucTestTools().runADAGUCServer( + "dataset=adaguc.tests.arcus_uwcw&service=WMS&request=GetMetadata&format=application/json", + {"ADAGUC_CONFIG": ADAGUC_PATH + "/data/config/adaguc.tests.dataset.xml"}, + ) + AdagucTestTools().writetofile(self.testresultspath + filename, data.getvalue()) + self.assertEqual(status, 0) + self.assertEqual( + data.getvalue(), + AdagucTestTools().readfromfile(self.expectedoutputsspath + filename), + ) + + diff --git a/tests/expectedoutputs/TestMetadataRequest/test_GetMetadataRequest_arcus_uwcw.json b/tests/expectedoutputs/TestMetadataRequest/test_GetMetadataRequest_arcus_uwcw.json new file mode 100644 index 00000000..7c64ba39 --- /dev/null +++ b/tests/expectedoutputs/TestMetadataRequest/test_GetMetadataRequest_arcus_uwcw.json @@ -0,0 +1 @@ +{"adaguc.tests.arcus_uwcw":{"air_temperature_hagl":{"dims":{"height_above_ground_level_in_m":{"cdfName":"temp_at_hagl","defaultValue":"2","hasMultipleValues":1,"hidden":true,"serviceName":"height_above_ground_level_in_m","units":"m","values":"2"},"member":{"cdfName":"member","defaultValue":"1","hasMultipleValues":1,"hidden":false,"serviceName":"member","units":"-","values":"1,2,3,4,5"},"reference_time":{"cdfName":"forecast_reference_time","defaultValue":"2024-05-23T00:00:00Z","hasMultipleValues":1,"hidden":false,"serviceName":"reference_time","units":"ISO8601","values":"2024-05-23T00:00:00Z"},"time":{"cdfName":"time","defaultValue":"2024-05-23T01:00:00Z","hasMultipleValues":0,"hidden":false,"serviceName":"time","units":"ISO8601","values":"2024-05-23T01:00:00Z/2024-05-25T12:00:00Z/PT1H"}},"layer":{"abstract":"","gridspec":{"bbox":[-0.014499999999999957,48.99100000000001,11.2955,56.011],"cellsizex":2.262,"cellsizey":-1.404,"height":5,"projstring":"+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs","width":5},"group":"","isqueryable":1,"latlonbox":[-0.014499999999999957,48.99100000000001,11.2955,56.011],"layername":"air_temperature_hagl","nativeepsg":"PROJ4:%2Bproj%3Dlonglat%20%2Bellps%3DWGS84%20%2Bdatum%3DWGS84%20%2Bno_defs","title":"UWCW_HA43ENS(NL) Air temperature at 2 m","variables":[{"label":"Air temperature at height above ground level","units":"C","variableName":"air-temperature-hagl"}]}},"baselayer":{"dims":null,"layer":{"abstract":"","gridspec":{"bbox":[-180.0,83.64513,180.0000000000001,-90.0],"cellsizex":180.00000000000006,"cellsizey":86.822565,"height":2,"projstring":"","width":2},"group":"baselayers","isqueryable":1,"latlonbox":[-180.0,-90.0,180.0000000000001,83.64513],"layername":"baselayer","nativeepsg":"","title":"baselayer","variables":[{"label":"Feature index","units":"","variableName":"features"}]}},"overlay":{"dims":null,"layer":{"abstract":"","gridspec":{"bbox":[-180.0,83.64513,180.0000000000001,-90.0],"cellsizex":180.00000000000006,"cellsizey":86.822565,"height":2,"projstring":"","width":2},"group":"baselayers","isqueryable":1,"latlonbox":[-180.0,-90.0,180.0000000000001,83.64513],"layername":"overlay","nativeepsg":"","title":"overlay","variables":[{"label":"Feature index","units":"","variableName":"features"}]}},"wind_speed_hagl_kts":{"dims":{"height_above_ground_level_in_m":{"cdfName":"wind_at_hagl","defaultValue":"10","hasMultipleValues":1,"hidden":true,"serviceName":"height_above_ground_level_in_m","units":"m","values":"10"},"member":{"cdfName":"member","defaultValue":"1","hasMultipleValues":1,"hidden":false,"serviceName":"member","units":"-","values":"1,2,3,4,5"},"reference_time":{"cdfName":"forecast_reference_time","defaultValue":"2024-06-05T03:00:00Z","hasMultipleValues":1,"hidden":false,"serviceName":"reference_time","units":"ISO8601","values":"2024-06-05T03:00:00Z"},"time":{"cdfName":"time","defaultValue":"2024-06-05T04:00:00Z","hasMultipleValues":0,"hidden":false,"serviceName":"time","units":"ISO8601","values":"2024-06-05T04:00:00Z/2024-06-07T15:00:00Z/PT1H"}},"layer":{"abstract":"","gridspec":{"bbox":[237556.04779691307,6429395.966709785,1008078.3936105771,7241407.977298031],"cellsizex":154104.4691627328,"cellsizey":-162402.4021176491,"height":5,"projstring":"+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs","width":5},"group":"","isqueryable":1,"latlonbox":[2.1340022857099457,49.902432406618686,9.055722285710363,54.37452297558314],"layername":"wind_speed_hagl_kts","nativeepsg":"PROJ4:%2Bproj%3Dmerc%20%2Ba%3D6378137%20%2Bb%3D6378137%20%2Blat_ts%3D0%2E0%20%2Blon_0%3D0%2E0%20%2Bx_0%3D0%2E0%20%2By_0%3D0%20%2Bk%3D1%2E0%20%2Bunits%3Dm%20%2Bnadgrids%3D@null%20%2Bwktext%20%20%2Bno_defs","title":"UWCW_HA43ENS(NL) Wind speed at height above ground level in Knots","variables":[{"label":"Wind speed at height above ground level","units":"kts","variableName":"wind-speed-hagl"}]}},"wind_speed_hagl_ms":{"dims":{"height_above_ground_level_in_m":{"cdfName":"wind_at_hagl","defaultValue":"10","hasMultipleValues":1,"hidden":true,"serviceName":"height_above_ground_level_in_m","units":"m","values":"10"},"member":{"cdfName":"member","defaultValue":"1","hasMultipleValues":1,"hidden":false,"serviceName":"member","units":"-","values":"1,2,3,4,5"},"reference_time":{"cdfName":"forecast_reference_time","defaultValue":"2024-06-05T03:00:00Z","hasMultipleValues":1,"hidden":false,"serviceName":"reference_time","units":"ISO8601","values":"2024-06-05T03:00:00Z"},"time":{"cdfName":"time","defaultValue":"2024-06-05T04:00:00Z","hasMultipleValues":0,"hidden":false,"serviceName":"time","units":"ISO8601","values":"2024-06-05T04:00:00Z/2024-06-07T15:00:00Z/PT1H"}},"layer":{"abstract":"","gridspec":{"bbox":[237556.04779691307,6429395.966709785,1008078.3936105771,7241407.977298031],"cellsizex":154104.4691627328,"cellsizey":-162402.4021176491,"height":5,"projstring":"+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs","width":5},"group":"","isqueryable":1,"latlonbox":[2.1340022857099457,49.902432406618686,9.055722285710363,54.37452297558314],"layername":"wind_speed_hagl_ms","nativeepsg":"PROJ4:%2Bproj%3Dmerc%20%2Ba%3D6378137%20%2Bb%3D6378137%20%2Blat_ts%3D0%2E0%20%2Blon_0%3D0%2E0%20%2Bx_0%3D0%2E0%20%2By_0%3D0%20%2Bk%3D1%2E0%20%2Bunits%3Dm%20%2Bnadgrids%3D@null%20%2Bwktext%20%20%2Bno_defs","title":"UWCW_HA43ENS(NL) Wind speed at height above ground level in ms","variables":[{"label":"Wind speed at height above ground level","units":"kts","variableName":"wind-speed-hagl"}]}},"wind_speed_hagl_ms_member_3":{"dims":{"height_above_ground_level_in_m":{"cdfName":"wind_at_hagl","defaultValue":"10","hasMultipleValues":1,"hidden":true,"serviceName":"height_above_ground_level_in_m","units":"m","values":"10"},"member":{"cdfName":"member","defaultValue":"3","hasMultipleValues":1,"hidden":true,"serviceName":"member","units":"-","values":"3"},"reference_time":{"cdfName":"forecast_reference_time","defaultValue":"2024-06-05T03:00:00Z","hasMultipleValues":1,"hidden":false,"serviceName":"reference_time","units":"ISO8601","values":"2024-06-05T03:00:00Z"},"time":{"cdfName":"time","defaultValue":"2024-06-05T04:00:00Z","hasMultipleValues":0,"hidden":false,"serviceName":"time","units":"ISO8601","values":"2024-06-05T04:00:00Z/2024-06-07T15:00:00Z/PT1H"}},"layer":{"abstract":"","gridspec":{"bbox":[237556.04779691307,6429395.966709785,1008078.3936105771,7241407.977298031],"cellsizex":154104.4691627328,"cellsizey":-162402.4021176491,"height":5,"projstring":"+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs","width":5},"group":"","isqueryable":1,"latlonbox":[2.1340022857099457,49.902432406618686,9.055722285710363,54.37452297558314],"layername":"wind_speed_hagl_ms_member_3","nativeepsg":"PROJ4:%2Bproj%3Dmerc%20%2Ba%3D6378137%20%2Bb%3D6378137%20%2Blat_ts%3D0%2E0%20%2Blon_0%3D0%2E0%20%2Bx_0%3D0%2E0%20%2By_0%3D0%20%2Bk%3D1%2E0%20%2Bunits%3Dm%20%2Bnadgrids%3D@null%20%2Bwktext%20%20%2Bno_defs","title":"UWCW_HA43ENS(NL) Wind speed at height above ground level in ms for member 3","variables":[{"label":"Wind speed at height above ground level","units":"kts","variableName":"wind-speed-hagl"}]}},"wind_speed_hagl_ms_wrong_dim_order":{"dims":{"height_above_ground_level_in_m":{"cdfName":"wind_at_hagl","defaultValue":"10","hasMultipleValues":1,"hidden":true,"serviceName":"height_above_ground_level_in_m","units":"m","values":"10"},"member":{"cdfName":"member","defaultValue":"1","hasMultipleValues":1,"hidden":false,"serviceName":"member","units":"-","values":"1,2,3,4,5"},"reference_time":{"cdfName":"forecast_reference_time","defaultValue":"2024-06-05T03:00:00Z","hasMultipleValues":1,"hidden":false,"serviceName":"reference_time","units":"ISO8601","values":"2024-06-05T03:00:00Z"},"time":{"cdfName":"time","defaultValue":"2024-06-05T04:00:00Z","hasMultipleValues":0,"hidden":false,"serviceName":"time","units":"ISO8601","values":"2024-06-05T04:00:00Z/2024-06-07T15:00:00Z/PT1H"}},"layer":{"abstract":"","gridspec":{"bbox":[237556.04779691307,6429395.966709785,1008078.3936105771,7241407.977298031],"cellsizex":154104.4691627328,"cellsizey":-162402.4021176491,"height":5,"projstring":"+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs","width":5},"group":"","isqueryable":1,"latlonbox":[2.1340022857099457,49.902432406618686,9.055722285710363,54.37452297558314],"layername":"wind_speed_hagl_ms_wrong_dim_order","nativeepsg":"PROJ4:%2Bproj%3Dmerc%20%2Ba%3D6378137%20%2Bb%3D6378137%20%2Blat_ts%3D0%2E0%20%2Blon_0%3D0%2E0%20%2Bx_0%3D0%2E0%20%2By_0%3D0%20%2Bk%3D1%2E0%20%2Bunits%3Dm%20%2Bnadgrids%3D@null%20%2Bwktext%20%20%2Bno_defs","title":"UWCW_HA43ENS(NL) Wind speed at height above ground level in ms","variables":[{"label":"Wind speed at height above ground level","units":"kts","variableName":"wind-speed-hagl"}]}}}} \ No newline at end of file diff --git a/tests/functional_test.py b/tests/functional_test.py index d7a969d0..7915958f 100644 --- a/tests/functional_test.py +++ b/tests/functional_test.py @@ -5,6 +5,7 @@ """ import unittest import sys +from AdagucTests.TestMetadataRequest import TestMetadataRequest from AdagucTests.TestWMSTimeSeries import TestWMSTimeSeries from AdagucTests.TestWMS import TestWMS from AdagucTests.TestWCS import TestWCS @@ -22,8 +23,11 @@ from AdagucTests.TestDataPostProcessor import TestDataPostProcessor from AdagucTests.TestWMSTimeHeightProfiles import TestWMSTimeHeightProfiles + + suites = [] TestLoader = unittest.TestLoader +suites.append(TestLoader().loadTestsFromTestCase(TestMetadataRequest)) suites.append(TestLoader().loadTestsFromTestCase(TestWMSTimeSeries)) suites.append(TestLoader().loadTestsFromTestCase(TestWMS)) suites.append(TestLoader().loadTestsFromTestCase(TestWCS))