@eeacms/volto-n2k 0.1.14 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.coverage.babel.config.js +1 -1
- package/.i18n.babel.config.js +1 -0
- package/.project.eslintrc.js +46 -0
- package/CHANGELOG.md +16 -2
- package/README.md +1 -72
- package/RELEASE.md +74 -0
- package/babel.config.js +17 -0
- package/cypress.config.js +26 -0
- package/jest-addon.config.js +4 -4
- package/locales/volto.pot +69 -0
- package/package.json +21 -14
- package/src/components/index.js +3 -3
- package/src/components/manage/Blocks/ExploreSites/View.jsx +10 -5
- package/src/components/manage/Blocks/Landing/Edit.jsx +1 -0
- package/src/components/manage/Blocks/Landing/View.jsx +5 -17
- package/src/components/manage/Blocks/NavigationAnchors/View.jsx +1 -1
- package/src/components/theme/AppExtras/MultilingualRedirector/MultilingualRedirector.jsx +3 -3
- package/src/components/theme/Header/Header.jsx +56 -25
- package/src/components/theme/LanguageSelector/LanguageSelector.jsx +61 -13
- package/src/components/theme/Navigation/Navigation.jsx +34 -20
- package/src/components/theme/Sitemap/Sitemap.jsx +2 -2
- package/src/index.js +31 -29
- package/src/less/styles.less +10 -12
- package/src/static/global-line.svg +1 -0
- package/Jenkinsfile +0 -242
- package/cypress/fixtures/example.json +0 -5
- package/cypress/integration/block-basics.js +0 -32
- package/cypress/plugins/index.js +0 -26
- package/cypress/support/commands.js +0 -315
- package/cypress/support/index.js +0 -53
- package/cypress.json +0 -17
package/Jenkinsfile
DELETED
|
@@ -1,242 +0,0 @@
|
|
|
1
|
-
pipeline {
|
|
2
|
-
agent any
|
|
3
|
-
|
|
4
|
-
environment {
|
|
5
|
-
GIT_NAME = "volto-n2k"
|
|
6
|
-
NAMESPACE = "@eeacms"
|
|
7
|
-
SONARQUBE_TAGS = "volto.eea.europa.eu,biodiversity.europa.eu"
|
|
8
|
-
DEPENDENCIES = "volto-slate @eeacms/volto-datablocks"
|
|
9
|
-
VOLTO = "16.0.0-alpha.14"
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
stages {
|
|
13
|
-
|
|
14
|
-
stage('Release') {
|
|
15
|
-
when {
|
|
16
|
-
allOf {
|
|
17
|
-
environment name: 'CHANGE_ID', value: ''
|
|
18
|
-
branch 'master'
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
steps {
|
|
22
|
-
node(label: 'docker') {
|
|
23
|
-
withCredentials([string(credentialsId: 'eea-jenkins-token', variable: 'GITHUB_TOKEN'),string(credentialsId: 'eea-jenkins-npm-token', variable: 'NPM_TOKEN')]) {
|
|
24
|
-
sh '''docker pull eeacms/gitflow'''
|
|
25
|
-
sh '''docker run -i --rm --name="$BUILD_TAG-gitflow-master" -e GIT_BRANCH="$BRANCH_NAME" -e GIT_NAME="$GIT_NAME" -e GIT_TOKEN="$GITHUB_TOKEN" -e NPM_TOKEN="$NPM_TOKEN" -e LANGUAGE=javascript eeacms/gitflow'''
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
stage('Code') {
|
|
32
|
-
when {
|
|
33
|
-
allOf {
|
|
34
|
-
environment name: 'CHANGE_ID', value: ''
|
|
35
|
-
not { changelog '.*^Automated release [0-9\\.]+$' }
|
|
36
|
-
not { branch 'master' }
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
steps {
|
|
40
|
-
parallel(
|
|
41
|
-
|
|
42
|
-
"ES lint": {
|
|
43
|
-
node(label: 'docker') {
|
|
44
|
-
sh '''docker run -i --rm --name="$BUILD_TAG-eslint" -e NAMESPACE="$NAMESPACE" -e GIT_NAME=$GIT_NAME -e GIT_BRANCH="$BRANCH_NAME" -e GIT_CHANGE_ID="$CHANGE_ID" plone/volto-addon-ci eslint'''
|
|
45
|
-
}
|
|
46
|
-
},
|
|
47
|
-
|
|
48
|
-
"Style lint": {
|
|
49
|
-
node(label: 'docker') {
|
|
50
|
-
sh '''docker run -i --rm --name="$BUILD_TAG-stylelint" -e NAMESPACE="$NAMESPACE" -e GIT_NAME=$GIT_NAME -e GIT_BRANCH="$BRANCH_NAME" -e GIT_CHANGE_ID="$CHANGE_ID" plone/volto-addon-ci stylelint'''
|
|
51
|
-
}
|
|
52
|
-
},
|
|
53
|
-
|
|
54
|
-
"Prettier": {
|
|
55
|
-
node(label: 'docker') {
|
|
56
|
-
sh '''docker run -i --rm --name="$BUILD_TAG-prettier" -e NAMESPACE="$NAMESPACE" -e GIT_NAME=$GIT_NAME -e GIT_BRANCH="$BRANCH_NAME" -e GIT_CHANGE_ID="$CHANGE_ID" plone/volto-addon-ci prettier'''
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
)
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
stage('Tests') {
|
|
64
|
-
when {
|
|
65
|
-
allOf {
|
|
66
|
-
environment name: 'CHANGE_ID', value: ''
|
|
67
|
-
anyOf {
|
|
68
|
-
not { changelog '.*^Automated release [0-9\\.]+$' }
|
|
69
|
-
branch 'master'
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
steps {
|
|
74
|
-
parallel(
|
|
75
|
-
|
|
76
|
-
"Volto": {
|
|
77
|
-
node(label: 'docker') {
|
|
78
|
-
script {
|
|
79
|
-
try {
|
|
80
|
-
sh '''docker pull plone/volto-addon-ci'''
|
|
81
|
-
sh '''docker run -i --name="$BUILD_TAG-volto" -e NAMESPACE="$NAMESPACE" -e GIT_NAME=$GIT_NAME -e GIT_BRANCH="$BRANCH_NAME" -e GIT_CHANGE_ID="$CHANGE_ID" plone/volto-addon-ci'''
|
|
82
|
-
sh '''rm -rf xunit-reports'''
|
|
83
|
-
sh '''mkdir -p xunit-reports'''
|
|
84
|
-
sh '''docker cp $BUILD_TAG-volto:/opt/frontend/my-volto-project/coverage xunit-reports/'''
|
|
85
|
-
sh '''docker cp $BUILD_TAG-volto:/opt/frontend/my-volto-project/junit.xml xunit-reports/'''
|
|
86
|
-
sh '''docker cp $BUILD_TAG-volto:/opt/frontend/my-volto-project/unit_tests_log.txt xunit-reports/'''
|
|
87
|
-
stash name: "xunit-reports", includes: "xunit-reports/**"
|
|
88
|
-
archiveArtifacts artifacts: "xunit-reports/unit_tests_log.txt", fingerprint: true
|
|
89
|
-
publishHTML (target : [
|
|
90
|
-
allowMissing: false,
|
|
91
|
-
alwaysLinkToLastBuild: true,
|
|
92
|
-
keepAll: true,
|
|
93
|
-
reportDir: 'xunit-reports/coverage/lcov-report',
|
|
94
|
-
reportFiles: 'index.html',
|
|
95
|
-
reportName: 'UTCoverage',
|
|
96
|
-
reportTitles: 'Unit Tests Code Coverage'
|
|
97
|
-
])
|
|
98
|
-
} finally {
|
|
99
|
-
catchError(buildResult: 'SUCCESS', stageResult: 'SUCCESS') {
|
|
100
|
-
junit testResults: 'xunit-reports/junit.xml', allowEmptyResults: true
|
|
101
|
-
}
|
|
102
|
-
sh script: '''docker rm -v $BUILD_TAG-volto''', returnStatus: true
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
)
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
stage('Integration tests') {
|
|
112
|
-
when {
|
|
113
|
-
allOf {
|
|
114
|
-
environment name: 'CHANGE_ID', value: ''
|
|
115
|
-
anyOf {
|
|
116
|
-
not { changelog '.*^Automated release [0-9\\.]+$' }
|
|
117
|
-
branch 'master'
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
steps {
|
|
122
|
-
parallel(
|
|
123
|
-
|
|
124
|
-
"Cypress": {
|
|
125
|
-
node(label: 'docker') {
|
|
126
|
-
script {
|
|
127
|
-
try {
|
|
128
|
-
sh '''docker pull eeacms/plone-backend; docker run -d --rm --name="$BUILD_TAG-plone" -e SITE="Plone" -e PROFILES="eea.kitkat:testing" eeacms/plone-backend'''
|
|
129
|
-
sh '''docker pull plone/volto-addon-ci; docker run -i --name="$BUILD_TAG-cypress" --link $BUILD_TAG-plone:plone -e NAMESPACE="$NAMESPACE" -e GIT_NAME=$GIT_NAME -e GIT_BRANCH="$BRANCH_NAME" -e GIT_CHANGE_ID="$CHANGE_ID" -e DEPENDENCIES="$DEPENDENCIES" -e NODE_ENV=development -e VOLTO="$VOLTO" plone/volto-addon-ci cypress'''
|
|
130
|
-
} finally {
|
|
131
|
-
try {
|
|
132
|
-
sh '''rm -rf cypress-reports cypress-results cypress-coverage'''
|
|
133
|
-
sh '''mkdir -p cypress-reports cypress-results cypress-coverage'''
|
|
134
|
-
sh '''docker cp $BUILD_TAG-cypress:/opt/frontend/my-volto-project/src/addons/$GIT_NAME/cypress/videos cypress-reports/'''
|
|
135
|
-
sh '''docker cp $BUILD_TAG-cypress:/opt/frontend/my-volto-project/src/addons/$GIT_NAME/cypress/reports cypress-results/'''
|
|
136
|
-
coverage = sh script: '''docker cp $BUILD_TAG-cypress:/opt/frontend/my-volto-project/src/addons/$GIT_NAME/coverage cypress-coverage/''', returnStatus: true
|
|
137
|
-
if ( coverage == 0 ) {
|
|
138
|
-
publishHTML (target : [allowMissing: false,
|
|
139
|
-
alwaysLinkToLastBuild: true,
|
|
140
|
-
keepAll: true,
|
|
141
|
-
reportDir: 'cypress-coverage/coverage/lcov-report',
|
|
142
|
-
reportFiles: 'index.html',
|
|
143
|
-
reportName: 'CypressCoverage',
|
|
144
|
-
reportTitles: 'Integration Tests Code Coverage'])
|
|
145
|
-
}
|
|
146
|
-
sh '''touch empty_file; for ok_test in $(grep -E 'file=.*failures="0"' $(grep 'testsuites .*failures="0"' $(find cypress-results -name *.xml) empty_file | awk -F: '{print $1}') empty_file | sed 's/.* file="\\(.*\\)" time.*/\\1/' | sed 's#^cypress/integration/##g' | sed 's#^../../../node_modules/@eeacms/##g'); do rm -f cypress-reports/videos/$ok_test.mp4; rm -f cypress-reports/$ok_test.mp4; done'''
|
|
147
|
-
archiveArtifacts artifacts: 'cypress-reports/**/*.mp4', fingerprint: true, allowEmptyArchive: true
|
|
148
|
-
stash name: "cypress-coverage", includes: "cypress-coverage/**", allowEmpty: true
|
|
149
|
-
}
|
|
150
|
-
finally {
|
|
151
|
-
catchError(buildResult: 'SUCCESS', stageResult: 'SUCCESS') {
|
|
152
|
-
junit testResults: 'cypress-results/**/*.xml', allowEmptyResults: true
|
|
153
|
-
}
|
|
154
|
-
sh script: "docker stop $BUILD_TAG-plone", returnStatus: true
|
|
155
|
-
sh script: "docker rm -v $BUILD_TAG-plone", returnStatus: true
|
|
156
|
-
sh script: "docker rm -v $BUILD_TAG-cypress", returnStatus: true
|
|
157
|
-
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
)
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
stage('Report to SonarQube') {
|
|
169
|
-
when {
|
|
170
|
-
allOf {
|
|
171
|
-
environment name: 'CHANGE_ID', value: ''
|
|
172
|
-
anyOf {
|
|
173
|
-
branch 'master'
|
|
174
|
-
allOf {
|
|
175
|
-
branch 'develop'
|
|
176
|
-
not { changelog '.*^Automated release [0-9\\.]+$' }
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
steps {
|
|
182
|
-
node(label: 'swarm') {
|
|
183
|
-
script{
|
|
184
|
-
checkout scm
|
|
185
|
-
unstash "xunit-reports"
|
|
186
|
-
unstash "cypress-coverage"
|
|
187
|
-
def scannerHome = tool 'SonarQubeScanner';
|
|
188
|
-
def nodeJS = tool 'NodeJS';
|
|
189
|
-
withSonarQubeEnv('Sonarqube') {
|
|
190
|
-
sh '''sed -i "s#/opt/frontend/my-volto-project/src/addons/${GIT_NAME}/##g" xunit-reports/coverage/lcov.info'''
|
|
191
|
-
sh "export PATH=${scannerHome}/bin:${nodeJS}/bin:$PATH; sonar-scanner -Dsonar.javascript.lcov.reportPaths=./xunit-reports/coverage/lcov.info,./cypress-coverage/coverage/lcov.info -Dsonar.sources=./src -Dsonar.projectKey=$GIT_NAME-$BRANCH_NAME -Dsonar.projectVersion=$BRANCH_NAME-$BUILD_NUMBER"
|
|
192
|
-
sh '''try=2; while [ \$try -gt 0 ]; do curl -s -XPOST -u "${SONAR_AUTH_TOKEN}:" "${SONAR_HOST_URL}api/project_tags/set?project=${GIT_NAME}-${BRANCH_NAME}&tags=${SONARQUBE_TAGS},${BRANCH_NAME}" > set_tags_result; if [ \$(grep -ic error set_tags_result ) -eq 0 ]; then try=0; else cat set_tags_result; echo "... Will retry"; sleep 60; try=\$(( \$try - 1 )); fi; done'''
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
stage('Pull Request') {
|
|
200
|
-
when {
|
|
201
|
-
not {
|
|
202
|
-
environment name: 'CHANGE_ID', value: ''
|
|
203
|
-
}
|
|
204
|
-
environment name: 'CHANGE_TARGET', value: 'master'
|
|
205
|
-
}
|
|
206
|
-
steps {
|
|
207
|
-
node(label: 'docker') {
|
|
208
|
-
script {
|
|
209
|
-
if ( env.CHANGE_BRANCH != "develop" ) {
|
|
210
|
-
error "Pipeline aborted due to PR not made from develop branch"
|
|
211
|
-
}
|
|
212
|
-
withCredentials([string(credentialsId: 'eea-jenkins-token', variable: 'GITHUB_TOKEN')]) {
|
|
213
|
-
sh '''docker pull eeacms/gitflow'''
|
|
214
|
-
sh '''docker run -i --rm --name="$BUILD_TAG-gitflow-pr" -e GIT_CHANGE_TARGET="$CHANGE_TARGET" -e GIT_CHANGE_BRANCH="$CHANGE_BRANCH" -e GIT_CHANGE_AUTHOR="$CHANGE_AUTHOR" -e GIT_CHANGE_TITLE="$CHANGE_TITLE" -e GIT_TOKEN="$GITHUB_TOKEN" -e GIT_BRANCH="$BRANCH_NAME" -e GIT_CHANGE_ID="$CHANGE_ID" -e GIT_ORG="$GIT_ORG" -e GIT_NAME="$GIT_NAME" -e LANGUAGE=javascript eeacms/gitflow'''
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
post {
|
|
224
|
-
always {
|
|
225
|
-
cleanWs(cleanWhenAborted: true, cleanWhenFailure: true, cleanWhenNotBuilt: true, cleanWhenSuccess: true, cleanWhenUnstable: true, deleteDirs: true)
|
|
226
|
-
}
|
|
227
|
-
changed {
|
|
228
|
-
script {
|
|
229
|
-
def details = """<h1>${env.JOB_NAME} - Build #${env.BUILD_NUMBER} - ${currentBuild.currentResult}</h1>
|
|
230
|
-
<p>Check console output at <a href="${env.BUILD_URL}/display/redirect">${env.JOB_BASE_NAME} - #${env.BUILD_NUMBER}</a></p>
|
|
231
|
-
"""
|
|
232
|
-
emailext(
|
|
233
|
-
subject: '$DEFAULT_SUBJECT',
|
|
234
|
-
body: details,
|
|
235
|
-
attachLog: true,
|
|
236
|
-
compressLog: true,
|
|
237
|
-
recipientProviders: [[$class: 'DevelopersRecipientProvider'], [$class: 'CulpritsRecipientProvider']]
|
|
238
|
-
)
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
}
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import { setupBeforeEach, tearDownAfterEach } from '../support';
|
|
2
|
-
|
|
3
|
-
describe('Blocks Tests', () => {
|
|
4
|
-
beforeEach(setupBeforeEach);
|
|
5
|
-
afterEach(tearDownAfterEach);
|
|
6
|
-
|
|
7
|
-
it('Add Block: Empty', () => {
|
|
8
|
-
// Change page title
|
|
9
|
-
cy.get('.documentFirstHeading > .public-DraftStyleDefault-block')
|
|
10
|
-
.clear()
|
|
11
|
-
.type('My Add-on Page')
|
|
12
|
-
.get('.documentFirstHeading span[data-text]')
|
|
13
|
-
.contains('My Add-on Page');
|
|
14
|
-
|
|
15
|
-
cy.get('.documentFirstHeading > .public-DraftStyleDefault-block').type(
|
|
16
|
-
'{enter}',
|
|
17
|
-
);
|
|
18
|
-
|
|
19
|
-
// Add block
|
|
20
|
-
cy.get('.ui.basic.icon.button.block-add-button').first().click();
|
|
21
|
-
cy.get('.blocks-chooser .title').contains('Media').click();
|
|
22
|
-
cy.get('.content.active.media .button.image').contains('Image').click();
|
|
23
|
-
|
|
24
|
-
// Save
|
|
25
|
-
cy.get('#toolbar-save').click();
|
|
26
|
-
cy.url().should('eq', Cypress.config().baseUrl + '/cypress/my-page');
|
|
27
|
-
|
|
28
|
-
// then the page view should contain our changes
|
|
29
|
-
cy.contains('My Add-on Page');
|
|
30
|
-
cy.get('.block.image');
|
|
31
|
-
});
|
|
32
|
-
});
|
package/cypress/plugins/index.js
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
/// <reference types="cypress" />
|
|
2
|
-
// ***********************************************************
|
|
3
|
-
// This example plugins/index.js can be used to load plugins
|
|
4
|
-
//
|
|
5
|
-
// You can change the location of this file or turn off loading
|
|
6
|
-
// the plugins file with the 'pluginsFile' configuration option.
|
|
7
|
-
//
|
|
8
|
-
// You can read more here:
|
|
9
|
-
// https://on.cypress.io/plugins-guide
|
|
10
|
-
// ***********************************************************
|
|
11
|
-
|
|
12
|
-
// This function is called when a project is opened or re-opened (e.g. due to
|
|
13
|
-
// the project's config changing)
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* @type {Cypress.PluginConfig}
|
|
17
|
-
*/
|
|
18
|
-
module.exports = (on, config) => {
|
|
19
|
-
// `on` is used to hook into various events Cypress emits
|
|
20
|
-
// `config` is the resolved Cypress config
|
|
21
|
-
/* coverage-start
|
|
22
|
-
require('@cypress/code-coverage/task')(on, config)
|
|
23
|
-
on('file:preprocessor', require('@cypress/code-coverage/use-babelrc'))
|
|
24
|
-
return config
|
|
25
|
-
coverage-end */
|
|
26
|
-
};
|
|
@@ -1,315 +0,0 @@
|
|
|
1
|
-
/* eslint no-console: ["error", { allow: ["log"] }] */
|
|
2
|
-
|
|
3
|
-
// --- AUTOLOGIN -------------------------------------------------------------
|
|
4
|
-
Cypress.Commands.add('autologin', () => {
|
|
5
|
-
let api_url, user, password;
|
|
6
|
-
api_url = Cypress.env('API_PATH') || 'http://localhost:8080/Plone';
|
|
7
|
-
user = 'admin';
|
|
8
|
-
password = 'admin';
|
|
9
|
-
|
|
10
|
-
return cy
|
|
11
|
-
.request({
|
|
12
|
-
method: 'POST',
|
|
13
|
-
url: `${api_url}/@login`,
|
|
14
|
-
headers: { Accept: 'application/json' },
|
|
15
|
-
body: { login: user, password: password },
|
|
16
|
-
})
|
|
17
|
-
.then((response) => cy.setCookie('auth_token', response.body.token));
|
|
18
|
-
});
|
|
19
|
-
|
|
20
|
-
// --- CREATE CONTENT --------------------------------------------------------
|
|
21
|
-
Cypress.Commands.add(
|
|
22
|
-
'createContent',
|
|
23
|
-
({
|
|
24
|
-
contentType,
|
|
25
|
-
contentId,
|
|
26
|
-
contentTitle,
|
|
27
|
-
path = '',
|
|
28
|
-
allow_discussion = false,
|
|
29
|
-
}) => {
|
|
30
|
-
let api_url, auth;
|
|
31
|
-
api_url = Cypress.env('API_PATH') || 'http://localhost:8080/Plone';
|
|
32
|
-
auth = {
|
|
33
|
-
user: 'admin',
|
|
34
|
-
pass: 'admin',
|
|
35
|
-
};
|
|
36
|
-
if (contentType === 'File') {
|
|
37
|
-
return cy.request({
|
|
38
|
-
method: 'POST',
|
|
39
|
-
url: `${api_url}/${path}`,
|
|
40
|
-
headers: {
|
|
41
|
-
Accept: 'application/json',
|
|
42
|
-
},
|
|
43
|
-
auth: auth,
|
|
44
|
-
body: {
|
|
45
|
-
'@type': contentType,
|
|
46
|
-
id: contentId,
|
|
47
|
-
title: contentTitle,
|
|
48
|
-
file: {
|
|
49
|
-
data: 'dGVzdGZpbGUK',
|
|
50
|
-
encoding: 'base64',
|
|
51
|
-
filename: 'lorem.txt',
|
|
52
|
-
'content-type': 'text/plain',
|
|
53
|
-
},
|
|
54
|
-
allow_discussion: allow_discussion,
|
|
55
|
-
},
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
if (contentType === 'Image') {
|
|
59
|
-
return cy.request({
|
|
60
|
-
method: 'POST',
|
|
61
|
-
url: `${api_url}/${path}`,
|
|
62
|
-
headers: {
|
|
63
|
-
Accept: 'application/json',
|
|
64
|
-
},
|
|
65
|
-
auth: auth,
|
|
66
|
-
body: {
|
|
67
|
-
'@type': contentType,
|
|
68
|
-
id: contentId,
|
|
69
|
-
title: contentTitle,
|
|
70
|
-
image: {
|
|
71
|
-
data:
|
|
72
|
-
'iVBORw0KGgoAAAANSUhEUgAAANcAAAA4CAMAAABZsZ3QAAAAM1BMVEX29fK42OU+oMvn7u9drtIPisHI4OhstdWZyt4fkcXX5+sAg74umMhNp86p0eJ7vNiKw9v/UV4wAAAAAXRSTlMAQObYZgAABBxJREFUeF7tmuty4yAMhZG4X2zn/Z92J5tsBJwWXG/i3XR6frW2Y/SBLIRAfaQUDNt8E5tLUt9BycfcKfq3R6Mlfyimtx4rzp+K3dtibXkor99zsEqLYZltblTecciogoh+TXfY1Ve4dn07rCDGG9dHSEEOg/GmXl0U1XDxTKxNK5De7BxsyyBr6gGm2/vPxKJ8F6f7BXKfRMp1xIWK9A+5ks25alSb353dWnDJN1k35EL5f8dVGifTf/4tjUuuFq7u4srmXC60yAmldLXIWbg65RKU87lcGxJCFqUPv0IacW0PmSivOZFLE908inPToMmii/roG+MRV/O8FU88i8tFsxV3a06MFUw0Qu7RmAtdV5/HVVaOVMTWNOWSwMljLhzhcB6XIS7OK5V6AvRDNN7t5VJWQs1J40UmalbK56usBG/CuCHSYuc+rkUGeMCViNRARPrzW52N3oQLe6WifNliSuuGaH3czbVNudI9s7ZLUCLHVwWlyES522o1t14uvmbblmVTKqFjaZYJFSTPP4dLL1kU1z7p0lzdbRulmEWLxoQX+z9ce7A8GqEEucllLxePuZwdJl1Lezu0hoswvTPt61DrFcRuujV/2cmlxaGBC7Aw6cpovGANwRiSdOAWJ5AGy4gLL64dl0QhUEAuEUNws+XxV+OKGPdw/hESGYF9XEGaFC7sNLMSXWJjHsnanYi87VK428N2uxpOjOFANcagLM5l+7mSycM8KknZpKLcGi6jmzWGr/vLurZ/0g4u9AZuAoeb5r1ceQhyiTPY1E4wUR6u/F3H2ojSpXMMriBPT9cezTto8Cx+MsglHL4fv1Rxrb1LVw9yvyQpJ3AhFnLZfuRLH2QsOG3FGGD20X/th/u5bFAt16Bt308KjF+MNOXgl/SquIEySX3GhaZvc67KZbDxcCDORz2N8yCWPaY5lyQZO7lQ29fnZbt3Xu6qoge4+DjXl/MocySPOp9rlvdyznahRyHEYd77v3LhugOXDv4J65QXfl803BDAdaWBEDhfVx7nKofjoVCgxnUAqw/UAUDPn788BDvQuG4TDtdtUPvzjSlXAB8DvaDOhhrmhwbywylXAm8CvaouikJTL93gs3y7Yy4VYbIxOHrcMizPqWOjqO9l3Uz52kibQy4xxOgqhJvD+w5rvokOcAlGvNCfeqCv1ste1stzLm0f71Iq3ZfTrPfuE5nhPtF+LvQE2lffQC7pYtQy3tdzdrKvd5TLVVzDetScS3nEKmmwDyt1Cev1kX3YfbvzNK4fzrlw+cB6vm+uiUgf2zdXI62241LawCb7Pi5FXFPF8KpzDoF/Sw2lg+GrHNbno1mhPu+VCF/vfMnw06PnUl6j48dVHD3jHNHPua+fc3o/5yp/zsGi0vYtzi3Pz5mHd4T6BWMIlewacd63AAAAAElFTkSuQmCC',
|
|
73
|
-
encoding: 'base64',
|
|
74
|
-
filename: 'image.png',
|
|
75
|
-
'content-type': 'image/png',
|
|
76
|
-
},
|
|
77
|
-
},
|
|
78
|
-
});
|
|
79
|
-
}
|
|
80
|
-
if (['Document', 'Folder', 'CMSFolder'].includes(contentType)) {
|
|
81
|
-
return cy
|
|
82
|
-
.request({
|
|
83
|
-
method: 'POST',
|
|
84
|
-
url: `${api_url}/${path}`,
|
|
85
|
-
headers: {
|
|
86
|
-
Accept: 'application/json',
|
|
87
|
-
},
|
|
88
|
-
auth: auth,
|
|
89
|
-
body: {
|
|
90
|
-
'@type': contentType,
|
|
91
|
-
id: contentId,
|
|
92
|
-
title: contentTitle,
|
|
93
|
-
blocks: {
|
|
94
|
-
'd3f1c443-583f-4e8e-a682-3bf25752a300': { '@type': 'title' },
|
|
95
|
-
'7624cf59-05d0-4055-8f55-5fd6597d84b0': { '@type': 'text' },
|
|
96
|
-
},
|
|
97
|
-
blocks_layout: {
|
|
98
|
-
items: [
|
|
99
|
-
'd3f1c443-583f-4e8e-a682-3bf25752a300',
|
|
100
|
-
'7624cf59-05d0-4055-8f55-5fd6597d84b0',
|
|
101
|
-
],
|
|
102
|
-
},
|
|
103
|
-
allow_discussion: allow_discussion,
|
|
104
|
-
},
|
|
105
|
-
})
|
|
106
|
-
.then(() => console.log(`${contentType} created`));
|
|
107
|
-
} else {
|
|
108
|
-
return cy
|
|
109
|
-
.request({
|
|
110
|
-
method: 'POST',
|
|
111
|
-
url: `${api_url}/${path}`,
|
|
112
|
-
headers: {
|
|
113
|
-
Accept: 'application/json',
|
|
114
|
-
},
|
|
115
|
-
auth: auth,
|
|
116
|
-
body: {
|
|
117
|
-
'@type': contentType,
|
|
118
|
-
id: contentId,
|
|
119
|
-
title: contentTitle,
|
|
120
|
-
allow_discussion: allow_discussion,
|
|
121
|
-
},
|
|
122
|
-
})
|
|
123
|
-
.then(() => console.log(`${contentType} created`));
|
|
124
|
-
}
|
|
125
|
-
},
|
|
126
|
-
);
|
|
127
|
-
|
|
128
|
-
// --- REMOVE CONTENT --------------------------------------------------------
|
|
129
|
-
Cypress.Commands.add('removeContent', (path) => {
|
|
130
|
-
let api_url, auth;
|
|
131
|
-
api_url = Cypress.env('API_PATH') || 'http://localhost:8080/Plone';
|
|
132
|
-
auth = {
|
|
133
|
-
user: 'admin',
|
|
134
|
-
pass: 'admin',
|
|
135
|
-
};
|
|
136
|
-
return cy
|
|
137
|
-
.request({
|
|
138
|
-
method: 'DELETE',
|
|
139
|
-
url: `${api_url}/${path}`,
|
|
140
|
-
headers: {
|
|
141
|
-
Accept: 'application/json',
|
|
142
|
-
},
|
|
143
|
-
auth: auth,
|
|
144
|
-
body: {},
|
|
145
|
-
})
|
|
146
|
-
.then(() => console.log(`${path} removed`));
|
|
147
|
-
});
|
|
148
|
-
|
|
149
|
-
// --- SET WORKFLOW ----------------------------------------------------------
|
|
150
|
-
Cypress.Commands.add(
|
|
151
|
-
'setWorkflow',
|
|
152
|
-
({
|
|
153
|
-
path = '/',
|
|
154
|
-
actor = 'admin',
|
|
155
|
-
review_state = 'publish',
|
|
156
|
-
time = '1995-07-31T18:30:00',
|
|
157
|
-
title = '',
|
|
158
|
-
comment = '',
|
|
159
|
-
effective = '2018-01-21T08:00:00',
|
|
160
|
-
expires = '2019-01-21T08:00:00',
|
|
161
|
-
include_children = true,
|
|
162
|
-
}) => {
|
|
163
|
-
let api_url, auth;
|
|
164
|
-
api_url = Cypress.env('API_PATH') || 'http://localhost:8080/Plone';
|
|
165
|
-
auth = {
|
|
166
|
-
user: 'admin',
|
|
167
|
-
pass: 'admin',
|
|
168
|
-
};
|
|
169
|
-
return cy.request({
|
|
170
|
-
method: 'POST',
|
|
171
|
-
url: `${api_url}/${path}/@workflow/${review_state}`,
|
|
172
|
-
headers: {
|
|
173
|
-
Accept: 'application/json',
|
|
174
|
-
},
|
|
175
|
-
auth: auth,
|
|
176
|
-
body: {
|
|
177
|
-
actor: actor,
|
|
178
|
-
review_state: review_state,
|
|
179
|
-
time: time,
|
|
180
|
-
title: title,
|
|
181
|
-
comment: comment,
|
|
182
|
-
effective: effective,
|
|
183
|
-
expires: expires,
|
|
184
|
-
include_children: include_children,
|
|
185
|
-
},
|
|
186
|
-
});
|
|
187
|
-
},
|
|
188
|
-
);
|
|
189
|
-
|
|
190
|
-
// --- waitForResourceToLoad ----------------------------------------------------------
|
|
191
|
-
Cypress.Commands.add('waitForResourceToLoad', (fileName, type) => {
|
|
192
|
-
const resourceCheckInterval = 40;
|
|
193
|
-
|
|
194
|
-
return new Cypress.Promise((resolve) => {
|
|
195
|
-
const checkIfResourceHasBeenLoaded = () => {
|
|
196
|
-
const resource = cy
|
|
197
|
-
.state('window')
|
|
198
|
-
.performance.getEntriesByType('resource')
|
|
199
|
-
.filter((entry) => !type || entry.initiatorType === type)
|
|
200
|
-
.find((entry) => entry.name.includes(fileName));
|
|
201
|
-
|
|
202
|
-
if (resource) {
|
|
203
|
-
resolve();
|
|
204
|
-
|
|
205
|
-
return;
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
setTimeout(checkIfResourceHasBeenLoaded, resourceCheckInterval);
|
|
209
|
-
};
|
|
210
|
-
|
|
211
|
-
checkIfResourceHasBeenLoaded();
|
|
212
|
-
});
|
|
213
|
-
});
|
|
214
|
-
|
|
215
|
-
// Low level command reused by `setSelection` and low level command `setCursor`
|
|
216
|
-
Cypress.Commands.add('selection', { prevSubject: true }, (subject, fn) => {
|
|
217
|
-
cy.wrap(subject).trigger('mousedown').then(fn).trigger('mouseup');
|
|
218
|
-
|
|
219
|
-
cy.document().trigger('selectionchange');
|
|
220
|
-
return cy.wrap(subject);
|
|
221
|
-
});
|
|
222
|
-
|
|
223
|
-
Cypress.Commands.add(
|
|
224
|
-
'setSelection',
|
|
225
|
-
{ prevSubject: true },
|
|
226
|
-
(subject, query, endQuery) => {
|
|
227
|
-
return cy.wrap(subject).selection(($el) => {
|
|
228
|
-
if (typeof query === 'string') {
|
|
229
|
-
const anchorNode = getTextNode($el[0], query);
|
|
230
|
-
const focusNode = endQuery ? getTextNode($el[0], endQuery) : anchorNode;
|
|
231
|
-
const anchorOffset = anchorNode.wholeText.indexOf(query);
|
|
232
|
-
const focusOffset = endQuery
|
|
233
|
-
? focusNode.wholeText.indexOf(endQuery) + endQuery.length
|
|
234
|
-
: anchorOffset + query.length;
|
|
235
|
-
setBaseAndExtent(anchorNode, anchorOffset, focusNode, focusOffset);
|
|
236
|
-
} else if (typeof query === 'object') {
|
|
237
|
-
const el = $el[0];
|
|
238
|
-
const anchorNode = getTextNode(el.querySelector(query.anchorQuery));
|
|
239
|
-
const anchorOffset = query.anchorOffset || 0;
|
|
240
|
-
const focusNode = query.focusQuery
|
|
241
|
-
? getTextNode(el.querySelector(query.focusQuery))
|
|
242
|
-
: anchorNode;
|
|
243
|
-
const focusOffset = query.focusOffset || 0;
|
|
244
|
-
setBaseAndExtent(anchorNode, anchorOffset, focusNode, focusOffset);
|
|
245
|
-
}
|
|
246
|
-
});
|
|
247
|
-
},
|
|
248
|
-
);
|
|
249
|
-
|
|
250
|
-
// Low level command reused by `setCursorBefore` and `setCursorAfter`, equal to `setCursorAfter`
|
|
251
|
-
Cypress.Commands.add(
|
|
252
|
-
'setCursor',
|
|
253
|
-
{ prevSubject: true },
|
|
254
|
-
(subject, query, atStart) => {
|
|
255
|
-
return cy.wrap(subject).selection(($el) => {
|
|
256
|
-
const node = getTextNode($el[0], query);
|
|
257
|
-
const offset =
|
|
258
|
-
node.wholeText.indexOf(query) + (atStart ? 0 : query.length);
|
|
259
|
-
const document = node.ownerDocument;
|
|
260
|
-
document.getSelection().removeAllRanges();
|
|
261
|
-
document.getSelection().collapse(node, offset);
|
|
262
|
-
});
|
|
263
|
-
// Depending on what you're testing, you may need to chain a `.click()` here to ensure
|
|
264
|
-
// further commands are picked up by whatever you're testing (this was required for Slate, for example).
|
|
265
|
-
},
|
|
266
|
-
);
|
|
267
|
-
|
|
268
|
-
Cypress.Commands.add(
|
|
269
|
-
'setCursorBefore',
|
|
270
|
-
{ prevSubject: true },
|
|
271
|
-
(subject, query) => {
|
|
272
|
-
cy.wrap(subject).setCursor(query, true);
|
|
273
|
-
},
|
|
274
|
-
);
|
|
275
|
-
|
|
276
|
-
Cypress.Commands.add(
|
|
277
|
-
'setCursorAfter',
|
|
278
|
-
{ prevSubject: true },
|
|
279
|
-
(subject, query) => {
|
|
280
|
-
cy.wrap(subject).setCursor(query);
|
|
281
|
-
},
|
|
282
|
-
);
|
|
283
|
-
|
|
284
|
-
// Helper functions
|
|
285
|
-
function getTextNode(el, match) {
|
|
286
|
-
const walk = document.createTreeWalker(el, NodeFilter.SHOW_TEXT, null, false);
|
|
287
|
-
if (!match) {
|
|
288
|
-
return walk.nextNode();
|
|
289
|
-
}
|
|
290
|
-
|
|
291
|
-
let node;
|
|
292
|
-
while ((node = walk.nextNode())) {
|
|
293
|
-
if (node.wholeText.includes(match)) {
|
|
294
|
-
return node;
|
|
295
|
-
}
|
|
296
|
-
}
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
function setBaseAndExtent(...args) {
|
|
300
|
-
const document = args[0].ownerDocument;
|
|
301
|
-
document.getSelection().removeAllRanges();
|
|
302
|
-
document.getSelection().setBaseAndExtent(...args);
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
Cypress.Commands.add('navigate', (route = '') => {
|
|
306
|
-
return cy.window().its('appHistory').invoke('push', route);
|
|
307
|
-
});
|
|
308
|
-
|
|
309
|
-
Cypress.Commands.add('store', () => {
|
|
310
|
-
return cy.window().its('store').invoke('getStore', '');
|
|
311
|
-
});
|
|
312
|
-
|
|
313
|
-
Cypress.Commands.add('settings', (key, value) => {
|
|
314
|
-
return cy.window().its('settings');
|
|
315
|
-
});
|
package/cypress/support/index.js
DELETED
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
// ***********************************************************
|
|
2
|
-
// This example support/index.js is processed and
|
|
3
|
-
// loaded automatically before your test files.
|
|
4
|
-
//
|
|
5
|
-
// This is a great place to put global configuration and
|
|
6
|
-
// behavior that modifies Cypress.
|
|
7
|
-
//
|
|
8
|
-
// You can change the location of this file or turn off
|
|
9
|
-
// automatically serving support files with the
|
|
10
|
-
// 'supportFile' configuration option.
|
|
11
|
-
//
|
|
12
|
-
// You can read more here:
|
|
13
|
-
// https://on.cypress.io/configuration
|
|
14
|
-
// ***********************************************************
|
|
15
|
-
|
|
16
|
-
// Import commands.js using ES2015 syntax:
|
|
17
|
-
import './commands';
|
|
18
|
-
|
|
19
|
-
// Alternatively you can use CommonJS syntax:
|
|
20
|
-
// require('./commands')
|
|
21
|
-
|
|
22
|
-
/* coverage-start
|
|
23
|
-
//Generate code-coverage
|
|
24
|
-
import '@cypress/code-coverage/support';
|
|
25
|
-
coverage-end */
|
|
26
|
-
|
|
27
|
-
export const setupBeforeEach = () => {
|
|
28
|
-
cy.autologin();
|
|
29
|
-
cy.createContent({
|
|
30
|
-
contentType: 'Document',
|
|
31
|
-
contentId: 'cypress',
|
|
32
|
-
contentTitle: 'Cypress',
|
|
33
|
-
});
|
|
34
|
-
cy.createContent({
|
|
35
|
-
contentType: 'Document',
|
|
36
|
-
contentId: 'my-page',
|
|
37
|
-
contentTitle: 'My Page',
|
|
38
|
-
path: 'cypress',
|
|
39
|
-
});
|
|
40
|
-
cy.visit('/cypress/my-page');
|
|
41
|
-
cy.waitForResourceToLoad('@navigation');
|
|
42
|
-
cy.waitForResourceToLoad('@breadcrumbs');
|
|
43
|
-
cy.waitForResourceToLoad('@actions');
|
|
44
|
-
cy.waitForResourceToLoad('@types');
|
|
45
|
-
cy.waitForResourceToLoad('my-page');
|
|
46
|
-
cy.navigate('/cypress/my-page/edit');
|
|
47
|
-
cy.get(`.block.title [data-contents]`);
|
|
48
|
-
};
|
|
49
|
-
|
|
50
|
-
export const tearDownAfterEach = () => {
|
|
51
|
-
cy.autologin();
|
|
52
|
-
cy.removeContent('cypress');
|
|
53
|
-
};
|