Skip to content

Commit

Permalink
Merge pull request #945 from geonetwork/me-fix-save-gn-425
Browse files Browse the repository at this point in the history
Metadata Editor / fix error when saving with GeoNetwork 4.2.5+
  • Loading branch information
jahow authored Jul 24, 2024
2 parents 613f731 + 583c63f commit e6ae55a
Show file tree
Hide file tree
Showing 15 changed files with 138 additions and 51 deletions.
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

0 comments on commit e6ae55a

Please sign in to comment.