From 43258c27327f8a94891ec2a7758761fd38075a44 Mon Sep 17 00:00:00 2001 From: Olivia Guyot Date: Tue, 13 Aug 2024 10:41:55 +0200 Subject: [PATCH 1/4] fix(map): avoir error when computing record extent with geom --- .../src/lib/utils/map-utils.service.spec.ts | 44 ++++++++++++------- .../map/src/lib/utils/map-utils.service.ts | 11 +++-- 2 files changed, 35 insertions(+), 20 deletions(-) diff --git a/libs/feature/map/src/lib/utils/map-utils.service.spec.ts b/libs/feature/map/src/lib/utils/map-utils.service.spec.ts index 47b0a76fca..e41f21007b 100644 --- a/libs/feature/map/src/lib/utils/map-utils.service.spec.ts +++ b/libs/feature/map/src/lib/utils/map-utils.service.spec.ts @@ -9,7 +9,6 @@ import Map from 'ol/Map' import ImageWMS from 'ol/source/ImageWMS' import TileWMS from 'ol/source/TileWMS' import XYZ from 'ol/source/XYZ' -import { firstValueFrom } from 'rxjs' import { dragPanCondition, MapUtilsService, @@ -22,15 +21,11 @@ import { MouseWheelZoom, PinchRotate, } from 'ol/interaction' -import { - CatalogRecord, - DatasetServiceDistribution, -} from '@geonetwork-ui/common/domain/model/record' +import { CatalogRecord } from '@geonetwork-ui/common/domain/model/record' import MapBrowserEvent from 'ol/MapBrowserEvent' -import type { MapContextLayerWmtsModel } from '../map-context/map-context.model' import * as olProjProj4 from 'ol/proj/proj4' import * as olProj from 'ol/proj' -import { get } from 'ol/proj' +import { fromLonLat, get } from 'ol/proj' jest.mock('@camptocamp/ogc-client', () => ({ WmsEndpoint: class { @@ -249,6 +244,9 @@ describe('MapUtilsService', () => { .spyOn(olProj, 'transformExtent') .mockImplementation((extent) => extent) }) + afterEach(() => { + jest.restoreAllMocks() + }) describe('extent available in capabilities', () => { beforeEach(() => { @@ -327,7 +325,7 @@ describe('MapUtilsService', () => { }) }) - describe('getRecordExtent', () => { + describe('#getRecordExtent', () => { it('should return null if spatialExtents is not present or is an empty array', () => { const record1: Partial = {} const record2: Partial = { spatialExtents: [] } @@ -336,27 +334,39 @@ describe('MapUtilsService', () => { expect(service.getRecordExtent(record2)).toBeNull() }) - // FIXME: working locally but not on CI - /* it('should return the projected extent of included extents', () => { + it('should return the projected extent of included extents', () => { const record: Partial = { spatialExtents: [ { - bbox: [6.43, 47.663, 7.263, 48.033], + bbox: [1, 5, 3, 7], + }, + { + bbox: [2, 3, 5, 6], }, { - bbox: [7.56, 47.24, 7.86, 47.41], + bbox: [6, 3, 8, 5], }, { - bbox: [8.2, 47.95, 8.72, 48.26], + geometry: { + coordinates: [ + [ + [4, 4], + [7, 4], + [7, 8], + [4, 8], + [4, 4], + ], + ], + type: 'Polygon', + }, }, ], } - expect(service.getRecordExtent(record)).toEqual([ - 715784.3258007491, 5981336.544186428, 970705.9597173458, - 6150219.0853063855, + ...fromLonLat([1, 3]), + ...fromLonLat([8, 8]), ]) - }) */ + }) }) describe('#prioritizePageScroll', () => { diff --git a/libs/feature/map/src/lib/utils/map-utils.service.ts b/libs/feature/map/src/lib/utils/map-utils.service.ts index 34f1d3582e..52a0f36c88 100644 --- a/libs/feature/map/src/lib/utils/map-utils.service.ts +++ b/libs/feature/map/src/lib/utils/map-utils.service.ts @@ -32,7 +32,7 @@ import { ProxyService } from '@geonetwork-ui/util/shared' import { WmsEndpoint, WmtsEndpoint } from '@camptocamp/ogc-client' import { LONLAT_CRS_CODES } from '../constant/projections' import { fromEPSGCode, register } from 'ol/proj/proj4' -import proj4 from 'proj4/dist/proj4' +import proj4 from 'proj4' import { defaults as defaultControls } from 'ol/control/defaults' const FEATURE_PROJECTION = 'EPSG:3857' @@ -220,10 +220,15 @@ export class MapUtilsService { if (!('spatialExtents' in record) || record.spatialExtents.length === 0) { return null } - // extend all the spatial extents bbox into an including bbox + // extend all the spatial extents into an including bbox const totalExtent = record.spatialExtents.reduce( (prev, curr) => { - return extend(prev, curr.bbox) + if ('bbox' in curr) return extend(prev, curr.bbox) + else if ('geometry' in curr) { + const geom = GEOJSON.readGeometry(curr.geometry) + return extend(prev, geom.getExtent()) + } + return prev }, [Infinity, Infinity, -Infinity, -Infinity] ) From 42c124e8fb030ab045cf979df26e1dd4b3a23a24 Mon Sep 17 00:00:00 2001 From: Olivia Guyot Date: Tue, 13 Aug 2024 12:05:08 +0200 Subject: [PATCH 2/4] ci: show indexation errors on docker compose up --- .../docker-entrypoint.d/04-upload-thesauri.sh | 15 ++++++++------- .../docker-entrypoint.d/10-index-records.sh | 5 +++-- .../11-show-indexation-errors.sh | 19 +++++++++++++++++++ 3 files changed, 30 insertions(+), 9 deletions(-) create mode 100755 support-services/docker-entrypoint.d/11-show-indexation-errors.sh diff --git a/support-services/docker-entrypoint.d/04-upload-thesauri.sh b/support-services/docker-entrypoint.d/04-upload-thesauri.sh index a288bbb530..a0f7a544fc 100755 --- a/support-services/docker-entrypoint.d/04-upload-thesauri.sh +++ b/support-services/docker-entrypoint.d/04-upload-thesauri.sh @@ -18,12 +18,13 @@ do echo "" done -curl "http://$host/geonetwork/srv/fre/thesaurus?_content_type=json" \ - -H 'Accept: application/json, text/plain, */*' \ - -H 'Content-Type: multipart/form-data' \ - -H 'Accept: application/json, text/plain, */*' \ - -H "Cookie: JSESSIONID=$jsessionid; XSRF-TOKEN=$xsrf_token" \ - -H "X-XSRF-TOKEN: $xsrf_token" +# this shows the registered thesauri in GN +#curl "http://$host/geonetwork/srv/fre/thesaurus?_content_type=json" \ +# -H 'Accept: application/json, text/plain, */*' \ +# -H 'Content-Type: multipart/form-data' \ +# -H 'Accept: application/json, text/plain, */*' \ +# -H "Cookie: JSESSIONID=$jsessionid; XSRF-TOKEN=$xsrf_token" \ +# -H "X-XSRF-TOKEN: $xsrf_token" +#echo "" -echo "" echo "Thesauri uploaded to GeoNetwork." diff --git a/support-services/docker-entrypoint.d/10-index-records.sh b/support-services/docker-entrypoint.d/10-index-records.sh index 7940f67ca4..67951560b0 100755 --- a/support-services/docker-entrypoint.d/10-index-records.sh +++ b/support-services/docker-entrypoint.d/10-index-records.sh @@ -21,7 +21,8 @@ if [ "$result" != '"CREATED"' ]; then exit 1 fi -# then wait for indexing to finish +# then wait for indexing to start +# NOTE: this is confusing but GeoNetwork returns indexing=false when indexing has actually started indexing=true until [ "$indexing" = 'false' ]; do @@ -31,9 +32,9 @@ do -H "Cookie: JSESSIONID=$jsessionid; XSRF-TOKEN=$xsrf_token" \ -H "X-XSRF-TOKEN: $xsrf_token" ) - echo "Currently indexing: $indexing" sleep 1 done +echo "Indexing has successfully started." # finally check that the index has records in it # and that the records count is stable (i.e. indexing is finished) diff --git a/support-services/docker-entrypoint.d/11-show-indexation-errors.sh b/support-services/docker-entrypoint.d/11-show-indexation-errors.sh new file mode 100755 index 0000000000..15b3dcd9db --- /dev/null +++ b/support-services/docker-entrypoint.d/11-show-indexation-errors.sh @@ -0,0 +1,19 @@ +#!/bin/sh + +host=geonetwork:8080 +jsessionid=$(cat /jsessionid) +xsrf_token=$(cat /xsrf_token) + +echo "Querying indexation warnings and errors..." + +response=$( + curl -s "http://$host/geonetwork/srv/api/search/records/_search" \ + -H 'Accept: application/json, text/plain, */*' \ + -H 'Content-Type: application/json;charset=UTF-8' \ + -H "Cookie: JSESSIONID=$jsessionid; XSRF-TOKEN=$xsrf_token" \ + -H "X-XSRF-TOKEN: $xsrf_token" \ + --data-raw '{"size":0,"aggregations":{"errorMsg":{"terms":{"field":"indexingErrorMsg","size":1000}}}}' +) +echo "There are $(echo $response | grep -oE '"key":"[^"]+"' | wc -l) indexation errors:" +echo $response | grep -oE '"key":"[^"]+"' | sed 's/"key":"\([^"]\+\).*"/ > \1/g' +echo "" From c8c4ee7032dbf0edb635dbf33eb7870403ad00e9 Mon Sep 17 00:00:00 2001 From: Olivia Guyot Date: Tue, 13 Aug 2024 13:57:29 +0200 Subject: [PATCH 3/4] ci: add delay when loading thesauri in GN This will avoid the thesauri to somehow be wiped (??) during GN init, thus making subsequent E2E fail --- .../docker-entrypoint.d/04-upload-thesauri.sh | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/support-services/docker-entrypoint.d/04-upload-thesauri.sh b/support-services/docker-entrypoint.d/04-upload-thesauri.sh index a0f7a544fc..e3917736a0 100755 --- a/support-services/docker-entrypoint.d/04-upload-thesauri.sh +++ b/support-services/docker-entrypoint.d/04-upload-thesauri.sh @@ -6,6 +6,9 @@ xsrf_token=$(cat /xsrf_token) echo "Uploading thesauri to GeoNetwork..." +# we're waiting a bit here for GN to be ready to accept thesauri (i.e. the default ones are set up) +sleep 4 + for f in /docker-entrypoint.d/thesauri/*.rdf do curl -s "http://$host/geonetwork/srv/api/registries/vocabularies" \ @@ -19,12 +22,12 @@ do done # this shows the registered thesauri in GN -#curl "http://$host/geonetwork/srv/fre/thesaurus?_content_type=json" \ -# -H 'Accept: application/json, text/plain, */*' \ -# -H 'Content-Type: multipart/form-data' \ -# -H 'Accept: application/json, text/plain, */*' \ -# -H "Cookie: JSESSIONID=$jsessionid; XSRF-TOKEN=$xsrf_token" \ -# -H "X-XSRF-TOKEN: $xsrf_token" -#echo "" +curl -s --no-progress-meter "http://$host/geonetwork/srv/fre/thesaurus?_content_type=json" \ + -H 'Accept: application/json, text/plain, */*' \ + -H 'Content-Type: multipart/form-data' \ + -H 'Accept: application/json, text/plain, */*' \ + -H "Cookie: JSESSIONID=$jsessionid; XSRF-TOKEN=$xsrf_token" \ + -H "X-XSRF-TOKEN: $xsrf_token" +echo "" echo "Thesauri uploaded to GeoNetwork." From 4314f0c738af3a41624da1b17e9136d70cac64df Mon Sep 17 00:00:00 2001 From: Olivia Guyot Date: Tue, 13 Aug 2024 14:51:51 +0200 Subject: [PATCH 4/4] ci: wait for the datahub tests to pass before doing the editor tests --- apps/metadata-editor-e2e/project.json | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/apps/metadata-editor-e2e/project.json b/apps/metadata-editor-e2e/project.json index 306cdf0d07..f30e4187ed 100644 --- a/apps/metadata-editor-e2e/project.json +++ b/apps/metadata-editor-e2e/project.json @@ -13,6 +13,12 @@ "browser": "chrome", "port": "cypress-auto" }, + "dependsOn": [ + { + "projects": ["datahub-e2e"], + "target": "e2e" + } + ], "configurations": { "production": { "devServerTarget": "metadata-editor:serve:production"