Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Metadata Editor / fix error when saving with GeoNetwork 4.2.5+ #945

Merged
merged 7 commits into from
Jul 24, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 2 additions & 4 deletions .github/workflows/artifacts.yml
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ jobs:

steps:
- name: Checkout
uses: actions/checkout@v3
uses: actions/checkout@v4
with:
ref: ${{ needs.checks.outputs.ref }} # use the PR head ref if applicable; otherwise keep default behaviour
persist-credentials: false
Expand All @@ -57,9 +57,7 @@ jobs:
cache: 'npm'

- name: Derive appropriate SHAs for base and head for `nx affected` commands
uses: nrwl/nx-set-shas@v2
with:
main-branch-name: 'main'
uses: nrwl/nx-set-shas@v3

- name: Install dependencies
run: npm ci
Expand Down
52 changes: 29 additions & 23 deletions .github/workflows/checks.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ jobs:

steps:
- name: Checkout
uses: actions/checkout@v3
uses: actions/checkout@v4
with:
persist-credentials: false
fetch-depth: 0
Expand All @@ -38,9 +38,7 @@ jobs:
node-version: ${{ env.NODE_VERSION }}
cache: 'npm'
- name: Derive appropriate SHAs for base and head for `nx affected` commands
uses: nrwl/nx-set-shas@v2
with:
main-branch-name: 'main'
uses: nrwl/nx-set-shas@v3
- run: npm ci
- run: npx nx format:check
- run: npx nx affected -t lint --parallel=3
Expand Down Expand Up @@ -79,7 +77,7 @@ jobs:

steps:
- name: Checkout
uses: actions/checkout@v3
uses: actions/checkout@v4
with:
persist-credentials: false
fetch-depth: 0
Expand All @@ -89,9 +87,7 @@ jobs:
node-version: ${{ env.NODE_VERSION }}
cache: 'npm'
- name: Derive appropriate SHAs for base and head for `nx affected` commands
uses: nrwl/nx-set-shas@v2
with:
main-branch-name: 'main'
uses: nrwl/nx-set-shas@v3
- run: npm ci
- run: npx nx affected -t build --parallel=3

Expand All @@ -102,7 +98,7 @@ jobs:

steps:
- name: Checkout branch
uses: actions/checkout@v3
uses: actions/checkout@v4
with:
persist-credentials: false
fetch-depth: 0
Expand Down Expand Up @@ -142,38 +138,48 @@ jobs:
comment_tag: build-options
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

cypress-run:
name: End-to-end tests
e2e-run:
name: End-to-end tests, GeoNetwork v${{ matrix.gn_version }}
runs-on: ubuntu-latest
outputs:
screenshotsUrl: ${{ steps.upload-screenshots.outputs.artifact-url }}
strategy:
fail-fast: false
matrix:
gn_version: [4.2.2, 4.2.8, 4.4.0]
steps:
- uses: actions/checkout@v4
with:
persist-credentials: false
fetch-depth: 0

- name: Use Node.js ${{ env.NODE_VERSION }}
uses: actions/setup-node@v3
with:
node-version: ${{ env.NODE_VERSION }}
cache: 'npm'

- name: Derive appropriate SHAs for base and head for `nx affected` commands
uses: nrwl/nx-set-shas@v3

- name: Create pipeline docker image
run: cd tools && docker build . -f pipelines/Dockerfile -t geonetwork/geonetwork-ui-tools-pipelines:latest
working-directory: tools
run: docker build . -f pipelines/Dockerfile -t geonetwork/geonetwork-ui-tools-pipelines:latest

- name: Build the backend
run: sudo docker-compose -f support-services/docker-compose.yml up -d init
- name: Start up backend support services
env:
GEONETWORK_VERSION: ${{ matrix.gn_version }}
working-directory: support-services
run: docker compose up --quiet-pull init

- name: Install dependencies
run: |
npm ci
- run: npm ci

- name: Run tests
run: npx nx run-many --target=e2e
- name: Run e2e tests
run: npx nx affected --target=e2e

- uses: actions/upload-artifact@v4
if: always()
id: upload-screenshots
with:
name: cypress-screenshots
name: cypress-screenshots-gn-${{ matrix.gn_version }}
path: |
apps/datahub-e2e/cypress/screenshots/**/*
apps/metadata-editor-e2e/cypress/screenshots/**/*
Expand All @@ -193,7 +199,7 @@ jobs:

steps:
- name: Checkout branch
uses: actions/checkout@v3
uses: actions/checkout@v4
with:
persist-credentials: false
fetch-depth: 0
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/snyk-security.yml
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ jobs:
security-events: write # for github/codeql-action/upload-sarif to upload SARIF results
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4

- name: Run Snyk to check for vulnerabilities
uses: snyk/actions/node@master
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/webcomponents.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ jobs:

steps:
- name: Checkout
uses: actions/checkout@v3
uses: actions/checkout@v4
with:
ref: ${{ needs.checks.outputs.ref }}
persist-credentials: false
Expand Down
3 changes: 2 additions & 1 deletion apps/datahub-e2e/project.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@
"cypressConfig": "apps/datahub-e2e/cypress.config.js",
"devServerTarget": "datahub:serve:development",
"testingType": "e2e",
"browser": "chrome"
"browser": "chrome",
"port": "cypress-auto"
},
"configurations": {
"production": {
Expand Down
3 changes: 2 additions & 1 deletion apps/metadata-editor-e2e/project.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@
"cypressConfig": "apps/metadata-editor-e2e/cypress.config.js",
"devServerTarget": "metadata-editor:serve:development",
"testingType": "e2e",
"browser": "chrome"
"browser": "chrome",
"port": "cypress-auto"
},
"configurations": {
"production": {
Expand Down
60 changes: 60 additions & 0 deletions apps/metadata-editor-e2e/src/e2e/edit.cy.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
describe('editor form', () => {
beforeEach(() => {
cy.login('admin', 'admin', false)

// Alpine convention record
cy.visit('/edit/8698bf0b-fceb-4f0f-989b-111e7c4af0a4')

cy.clearRecordDrafts()

// aliases
cy.get('gn-ui-form-field[ng-reflect-model=abstract] textarea').as(
'abstractField'
)
cy.get('@abstractField').invoke('val').as('abstractFieldInitialValue')
cy.get('[data-cy=save-status]')
.invoke('attr', 'data-cy-value')
.as('saveStatus')
})

it('form shows correctly', () => {
cy.get('gn-ui-record-form').should('be.visible')
cy.get('gn-ui-record-form gn-ui-form-field').should('have.length.gt', 0)
cy.get('@abstractField')
.invoke('val')
.should('contain', 'Perimeter der Alpenkonvention in der Schweiz.')
cy.get('@saveStatus').should('eq', 'record_up_to_date')
cy.screenshot({ capture: 'fullPage' })
})

it('draft record is kept', () => {
cy.get('@abstractField').clear()
cy.get('@abstractField').type('modified abstract')
// eslint-disable-next-line cypress/no-unnecessary-waiting
cy.wait(1000) // waiting for draft saving to kick in
cy.reload()
cy.get('@abstractField').invoke('val').should('eq', 'modified abstract')
cy.get('@saveStatus').should('eq', 'draft_changes_pending')

cy.clearRecordDrafts()

cy.get('@saveStatus').should('eq', 'record_up_to_date')
cy.get('@abstractField')
.invoke('val')
.should('contain', 'Perimeter der Alpenkonvention in der Schweiz.')
})

it('saving record works', () => {
cy.get('@abstractField').clear()
cy.get('@abstractField').type('modified abstract before saving')
cy.get('md-editor-publish-button').click()
cy.get('@saveStatus').should('eq', 'record_up_to_date')

// restore abstract
cy.get('@abstractField').clear()
cy.get('@abstractField').then(function (field) {
cy.wrap(field).type(this.abstractFieldInitialValue)
})
cy.get('md-editor-publish-button').click()
})
})
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@
</gn-ui-button>
<div
class="grow flex flex-row items-center justify-center gap-1 text-[14px]"
data-cy="save-status"
[attr.data-cy-value]="saveStatus$ | async"
[ngSwitch]="saveStatus$ | async"
>
<ng-container *ngSwitchCase="'draft_only'">
Expand Down
6 changes: 1 addition & 5 deletions libs/data-access/gn4/src/openapi/api/records.api.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7201,11 +7201,7 @@ export class RecordsApiService {
}

// to determine the Content-Type header
const consumes: string[] = [
'application/xml',
'application/json',
'application/x-www-form-urlencoded',
]
const consumes: string[] = ['application/xml']
const httpContentTypeSelected: string | undefined =
this.configuration.selectHeaderContentType(consumes)
if (httpContentTypeSelected !== undefined) {
Expand Down
8 changes: 0 additions & 8 deletions libs/data-access/gn4/src/spec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -1832,14 +1832,6 @@ paths:
schema:
type: string
description: XML fragment.
application/json:
schema:
type: string
description: XML fragment.
application/x-www-form-urlencoded:
schema:
type: string
description: XML fragment.
responses:
default:
description: default response
Expand Down
1 change: 1 addition & 0 deletions support-services/.env
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
GEONETWORK_VERSION=4.2.2
ELASTICSEARCH_VERSION=7.17.15
25 changes: 18 additions & 7 deletions support-services/docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ services:
- ./docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d

elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:7.15.1
image: docker.elastic.co/elasticsearch/elasticsearch:${ELASTICSEARCH_VERSION}
ulimits:
memlock:
soft: -1
Expand Down Expand Up @@ -80,15 +80,26 @@ services:
GEONETWORK_DB_NAME: geonetwork
GEONETWORK_DB_USERNAME: geonetwork
GEONETWORK_DB_PASSWORD: geonetwork
DATA_DIR: /catalogue-data
VIRTUAL_HOST: localhost

JAVA_OPTS: >
-Dorg.eclipse.jetty.annotations.AnnotationParser.LEVEL=OFF
-Djava.security.egd=file:/dev/./urandom -Djava.awt.headless=true
-Xms512M -Xss512M -Xmx2G -XX:+UseConcMarkSweepGC
-Dgeonetwork.resources.dir=/var/lib/jetty/webapps/geonetwork/WEB-INF/data/data/resources
-Dgeonetwork.data.dir=/var/lib/jetty/webapps/geonetwork/WEB-INF/data/data
-Dgeonetwork.codeList.dir=/var/lib/jetty/webapps/geonetwork/WEB-INF/data/config/codelist
-Dgeonetwork.schema.dir=/var/lib/jetty/webapps/geonetwork/WEB-INF/data/config/schema_plugins
-Xdebug -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:5005
-Dgeonetwork.resources.dir=/catalogue-data/data/resources
-Dgeonetwork.data.dir=/catalogue-data/data
-Dgeonetwork.codeList.dir=/catalogue-data/config/codelist
-Dgeonetwork.schema.dir=/catalogue-data/config/schema_plugins
-Dgeonetwork.config.dir=/catalogue-data/config
-Dgeonetwork.indexConfig.dir=/catalogue-data/config/index
-Des.host=elasticsearch
-Des.protocol=http
-Des.port=9200
-Des.url=http://elasticsearch:9200
-Des.username=
-Des.password=
depends_on:
database:
condition: service_healthy
Expand All @@ -104,7 +115,7 @@ services:
timeout: 10s
retries: 10
volumes:
- geonetwork_data:/var/lib/jetty/webapps/geonetwork/WEB-INF/data/
- geonetwork_data:/catalogue-data/
ports:
- '8080:8080'
- '5005:5005'
Expand All @@ -123,7 +134,7 @@ services:
init:
image: alpine/curl
# only run init if volumes were cleared
command: sh -c "if [ ! -f /done ]; then run-parts /docker-entrypoint.d --exit-on-error; else echo 'Nothing to do.'; exit 0; fi"
command: sh -c -e "if [ ! -f /done ]; then run-parts /docker-entrypoint.d --exit-on-error; else echo 'Nothing to do.'; exit 0; fi"
environment:
GEONETWORK_VERSION: ${GEONETWORK_VERSION}
depends_on:
Expand Down
1 change: 1 addition & 0 deletions support-services/docker-entrypoint.d/04-upload-thesauri.sh
Original file line number Diff line number Diff line change
Expand Up @@ -15,5 +15,6 @@ do
-H 'Accept: application/json, text/plain, */*' \
-H "Cookie: JSESSIONID=$jsessionid; XSRF-TOKEN=$xsrf_token" \
-H "X-XSRF-TOKEN: $xsrf_token"
echo ""
done

13 changes: 13 additions & 0 deletions tools/e2e/commands.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ declare namespace Cypress {
login(username?: string, password?: string, redirect?: boolean): void
signOut(): void
clearFavorites(): void
clearRecordDrafts(): void

// interaction with gn-ui-dropdown-selector
openDropdown(): Chainable<JQuery<HTMLElement>>
Expand Down Expand Up @@ -139,6 +140,18 @@ Cypress.Commands.add(
}
)

Cypress.Commands.add('clearRecordDrafts', () => {
cy.window().then((window) => {
const items = { ...window.localStorage }
const draftKeys = Object.keys(items).filter((key) =>
key.startsWith('geonetwork-ui-draft-')
)
draftKeys.forEach((key) => window.localStorage.removeItem(key))
cy.log(`Cleared ${draftKeys.length} draft(s).`)
})
cy.reload()
})

// -- This is a parent command --
// Cypress.Commands.add('login', (email, password) => { ... })
//
Expand Down
5 changes: 5 additions & 0 deletions tools/pipelines/register-es-pipelines.js
Original file line number Diff line number Diff line change
Expand Up @@ -69,9 +69,14 @@ if(ctx.resourceTitleObject != null && ctx.resourceTitleObject.default != null &&
if(ctx.resourceAbstractObject != null && ctx.resourceAbstractObject.default != null && ctx.resourceAbstractObject.default != '') {
ok++
}
// this checks for single-language Organizations (GN 4.2.2)
if(ctx.contact != null && ctx.contact.length > 0 && ctx.contact[0].organisation != null && ctx.contact[0].organisation != '') {
ok++
}
// this checks for multilingual Organizations (GN 4.2.3+)
if(ctx.contact != null && ctx.contact.length > 0 && ctx.contact[0].organisationObject != null && ctx.contact[0].organisationObject.default != '') {
ok++
}
if(ctx.contact != null && ctx.contact.length > 0 && ctx.contact[0].email != null && ctx.contact[0].email != '') {
ok++
}
Expand Down
Loading