mirror of
https://github.com/opencloud-eu/opencloud.git
synced 2026-01-05 19:59:37 -06:00
Merge pull request #5461 from owncloud/update-web-v7.0.0-rc.8
[full-ci] Update web assets to v7.0.0-rc.8
This commit is contained in:
@@ -1,3 +1,3 @@
|
||||
# The test runner source for UI tests
|
||||
WEB_COMMITID=48032d756dd416636fcd9b6ffa9fd5700c594337
|
||||
WEB_COMMITID=afb624740a4887c496970a503b777e6fb24c895c
|
||||
WEB_BRANCH=master
|
||||
|
||||
75
.drone.star
75
.drone.star
@@ -142,10 +142,6 @@ config = {
|
||||
"skip": False,
|
||||
"earlyFail": True,
|
||||
},
|
||||
"settingsUITests": {
|
||||
"skip": False,
|
||||
"earlyFail": True,
|
||||
},
|
||||
"rocketchat": {
|
||||
"channel": "ocis-internal",
|
||||
"from_secret": "private_rocketchat",
|
||||
@@ -364,9 +360,6 @@ def testPipelines(ctx):
|
||||
if "skip" not in config["e2eTests"] or not config["e2eTests"]["skip"]:
|
||||
pipelines += e2eTests(ctx)
|
||||
|
||||
if "skip" not in config["settingsUITests"] or not config["settingsUITests"]["skip"]:
|
||||
pipelines.append(settingsUITests(ctx))
|
||||
|
||||
return pipelines
|
||||
|
||||
def testOcisModule(ctx, module):
|
||||
@@ -1151,74 +1144,6 @@ def publishTracingResult(ctx, suite):
|
||||
},
|
||||
}]
|
||||
|
||||
def settingsUITests(ctx, storage = "ocis", accounts_hash_difficulty = 4):
|
||||
early_fail = config["settingsUITests"]["earlyFail"] if "earlyFail" in config["settingsUITests"] else False
|
||||
|
||||
return {
|
||||
"kind": "pipeline",
|
||||
"type": "docker",
|
||||
"name": "settingsUITests",
|
||||
"platform": {
|
||||
"os": "linux",
|
||||
"arch": "amd64",
|
||||
},
|
||||
"steps": skipIfUnchanged(ctx, "acceptance-tests") +
|
||||
restoreBuildArtifactCache(ctx, "ocis-binary-amd64", "ocis/bin") +
|
||||
ocisServer(storage, accounts_hash_difficulty) +
|
||||
waitForSeleniumService() +
|
||||
waitForMiddlewareService() +
|
||||
restoreWebCache() +
|
||||
restoreWebPnpmCache() +
|
||||
[
|
||||
{
|
||||
"name": "WebUIAcceptanceTests",
|
||||
"image": OC_CI_NODEJS % DEFAULT_NODEJS_VERSION,
|
||||
"environment": {
|
||||
"SERVER_HOST": "https://ocis-server:9200",
|
||||
"BACKEND_HOST": "https://ocis-server:9200",
|
||||
"RUN_ON_OCIS": "true",
|
||||
"OCIS_REVA_DATA_ROOT": "%s" % dirs["ocisRevaDataRoot"],
|
||||
"WEB_UI_CONFIG": "%s/%s" % (dirs["base"], dirs["ocisConfig"]),
|
||||
"TEST_TAGS": "not @skipOnOCIS and not @skip",
|
||||
"LOCAL_UPLOAD_DIR": "/uploads",
|
||||
"NODE_TLS_REJECT_UNAUTHORIZED": 0,
|
||||
"WEB_PATH": dirs["web"],
|
||||
"FEATURE_PATH": "%s/services/settings/ui/tests/acceptance/features" % dirs["base"],
|
||||
"MIDDLEWARE_HOST": "http://middleware:3000",
|
||||
},
|
||||
"commands": [
|
||||
# TODO: settings/package.json has all the acceptance test dependencies
|
||||
# they shouldn't be needed since we could also use them from web:/tests/acceptance/package.json
|
||||
"cd %s/services/settings" % dirs["base"],
|
||||
"pnpm config set store-dir ./.pnpm-store",
|
||||
"retry -t 3 'pnpm install'",
|
||||
"make test-acceptance-webui",
|
||||
],
|
||||
"volumes": [{
|
||||
"name": "uploads",
|
||||
"path": "/uploads",
|
||||
}],
|
||||
},
|
||||
] + failEarly(ctx, early_fail),
|
||||
"services": [
|
||||
{
|
||||
"name": "redis",
|
||||
"image": REDIS,
|
||||
},
|
||||
] + selenium() + middlewareService(),
|
||||
"volumes": [{
|
||||
"name": "uploads",
|
||||
"temp": {},
|
||||
}],
|
||||
"depends_on": getPipelineNames([buildOcisBinaryForTesting(ctx)] + buildWebCache(ctx)),
|
||||
"trigger": {
|
||||
"ref": [
|
||||
"refs/heads/master",
|
||||
"refs/pull/**",
|
||||
],
|
||||
},
|
||||
}
|
||||
|
||||
def failEarly(ctx, early_fail):
|
||||
"""failEarly sends posts a comment about the failed pipeline to the github pr and then kills all pipelines of the current build
|
||||
|
||||
|
||||
@@ -1,46 +0,0 @@
|
||||
Feature: Set user specific settings
|
||||
As a user
|
||||
I want to set user specific settings
|
||||
So that I can customize my OCIS experience to my liking
|
||||
|
||||
Background:
|
||||
Given these users have been created with default attributes and without skeleton files in the server:
|
||||
| username |
|
||||
| user1 |
|
||||
| user2 |
|
||||
And user "user1" has created folder "simple-folder" in the server
|
||||
|
||||
Scenario: Check the default settings
|
||||
Given user "user1" has logged in using the webUI
|
||||
And the user browses to the settings page
|
||||
Then the setting "Language" should have value "English"
|
||||
When the user browses to the files page
|
||||
Then the files menu should be listed in language "English"
|
||||
|
||||
Scenario: changing the language (reactive and with page reload)
|
||||
Given user "user1" has logged in using the webUI
|
||||
And the user browses to the settings page
|
||||
When the user changes the language to "Deutsch"
|
||||
Then the setting "Language" should have value "Deutsch"
|
||||
When the user browses to the files page
|
||||
Then the files menu should be listed in language "Deutsch"
|
||||
And the account menu should be listed in language "Deutsch"
|
||||
And the files header should be displayed in language "Deutsch"
|
||||
When the user reloads the current page of the webUI
|
||||
Then the files menu should be listed in language "Deutsch"
|
||||
And the account menu should be listed in language "Deutsch"
|
||||
And the files header should be displayed in language "Deutsch"
|
||||
When the user browses to the settings page
|
||||
And the user changes the language to "English"
|
||||
And the user browses to the files page
|
||||
Then the files menu should be listed in language "English"
|
||||
|
||||
Scenario: changing the language only affects one user
|
||||
Given user "user2" has logged in using the webUI
|
||||
And the user browses to the settings page
|
||||
When the user changes the language to "Español"
|
||||
Then the setting "Language" should have value "Español"
|
||||
When the user browses to the files page
|
||||
Then the files menu should be listed in language "Español"
|
||||
When the user re-logs in as "user1" using the webUI
|
||||
Then the files menu should be listed in language "English"
|
||||
@@ -1,112 +0,0 @@
|
||||
const filesMenu = {
|
||||
English: [
|
||||
'Personal',
|
||||
'Shares',
|
||||
'Spaces',
|
||||
'Deleted files'
|
||||
],
|
||||
Deutsch: [
|
||||
'Persönlich',
|
||||
'Geteilt',
|
||||
'Spaces',
|
||||
'Gelöschte Dateien'
|
||||
],
|
||||
Español: [
|
||||
'Personal',
|
||||
'Shares',
|
||||
'Spaces',
|
||||
'Archivos borrados'
|
||||
],
|
||||
Français: [
|
||||
'Personal',
|
||||
'Shares',
|
||||
'Spaces',
|
||||
'Fichiers supprimés'
|
||||
]
|
||||
}
|
||||
|
||||
const accountMenu = {
|
||||
English: [
|
||||
'U\nuser1\nuser1@example.org',
|
||||
'Settings',
|
||||
'Log out',
|
||||
'Personal storage\n0 B used'
|
||||
],
|
||||
Deutsch: [
|
||||
'U\nuser1\nuser1@example.org',
|
||||
'Einstellungen',
|
||||
'Abmelden',
|
||||
'Persönlicher Speicherplatz\n0 B verwendet'
|
||||
],
|
||||
Español: [
|
||||
'U\nuser1\nuser1@example.org',
|
||||
'Configuración',
|
||||
'Salir',
|
||||
'Personal storage\n0 B used'
|
||||
],
|
||||
Français: [
|
||||
'U\nuser1\nuser1@example.org',
|
||||
'Settings',
|
||||
'Se déconnecter',
|
||||
'Personal storage\n0 B used'
|
||||
]
|
||||
}
|
||||
|
||||
const filesListHeaderMenu = {
|
||||
English: [
|
||||
'Name',
|
||||
'Shares',
|
||||
'Size',
|
||||
'Tags',
|
||||
'Modified',
|
||||
'Actions'
|
||||
],
|
||||
Deutsch: [
|
||||
'Name',
|
||||
'Geteilt',
|
||||
'Größe',
|
||||
'Schlagwörter',
|
||||
'Bearbeitet',
|
||||
'Aktionen'
|
||||
],
|
||||
Español: [
|
||||
'Nombre',
|
||||
'Shares',
|
||||
'Tamaño',
|
||||
'Tags',
|
||||
'Modificado',
|
||||
'Acciones'
|
||||
],
|
||||
Français: [
|
||||
'Nom',
|
||||
'Shares',
|
||||
'Taille',
|
||||
'Étiquettes',
|
||||
'Modifié',
|
||||
'Actions'
|
||||
]
|
||||
}
|
||||
|
||||
exports.getFilesMenuForLanguage = function (language) {
|
||||
const menuList = filesMenu[language]
|
||||
if (menuList === undefined) {
|
||||
throw new Error(`Menu for language ${language} is not available`)
|
||||
}
|
||||
return menuList
|
||||
}
|
||||
|
||||
exports.getUserMenuForLanguage = function (language) {
|
||||
const menuList = accountMenu[language]
|
||||
if (menuList === undefined) {
|
||||
throw new Error(`Menu for language ${language} is not available`)
|
||||
}
|
||||
return menuList
|
||||
}
|
||||
|
||||
exports.getFilesHeaderMenuForLanguage = function (language) {
|
||||
const menuList = filesListHeaderMenu[language]
|
||||
if (menuList === undefined) {
|
||||
throw new Error(`Menu for language ${language} is not available`)
|
||||
}
|
||||
return menuList
|
||||
}
|
||||
@@ -1,82 +0,0 @@
|
||||
module.exports = {
|
||||
commands: {
|
||||
getMenuList: async function () {
|
||||
const menu = []
|
||||
await this.isVisible('@openNavigationBtn', (res) => {
|
||||
if (res.value) {
|
||||
this.click('@openNavigationBtn')
|
||||
}
|
||||
})
|
||||
await this.waitForElementVisible('@fileSidebarNavItem')
|
||||
await this.api
|
||||
.elements('@fileSidebarNavItem', result => {
|
||||
result.value.map(item => {
|
||||
this.api.elementIdText(item.ELEMENT, res => {
|
||||
menu.push(res.value)
|
||||
})
|
||||
return undefined
|
||||
})
|
||||
})
|
||||
return menu
|
||||
},
|
||||
getUserMenu: async function () {
|
||||
const menu = []
|
||||
await this
|
||||
.waitForElementVisible('@userMenuBtn')
|
||||
.click('@userMenuBtn')
|
||||
.waitForElementVisible('@userMenuContainer')
|
||||
await this.api
|
||||
.elements('@userMenuItem', result => {
|
||||
result.value.map(item => {
|
||||
this.api.elementIdText(item.ELEMENT, res => {
|
||||
menu.push(res.value)
|
||||
})
|
||||
return undefined
|
||||
})
|
||||
})
|
||||
await this
|
||||
.click('@userMenuBtn')
|
||||
.waitForElementNotPresent('@userMenuContainer')
|
||||
return menu
|
||||
},
|
||||
getFileHeaderItems: async function () {
|
||||
const menu = []
|
||||
await this.waitForElementVisible('@fileTableHeaderItems')
|
||||
await this.api
|
||||
.elements('@fileTableHeaderItems', result => {
|
||||
result.value.map(item => {
|
||||
this.api.elementIdText(item.ELEMENT, res => {
|
||||
menu.push(res.value)
|
||||
})
|
||||
return undefined
|
||||
})
|
||||
})
|
||||
return menu
|
||||
}
|
||||
},
|
||||
|
||||
elements: {
|
||||
pageHeader: {
|
||||
selector: '.oc-page-title'
|
||||
},
|
||||
fileSidebarNavItem: {
|
||||
selector: '.oc-sidebar-nav-item'
|
||||
},
|
||||
openNavigationBtn: {
|
||||
selector: '.oc-app-navigation-toggle'
|
||||
},
|
||||
userMenuBtn: {
|
||||
selector: '#_userMenuButton'
|
||||
},
|
||||
userMenuItem: {
|
||||
selector: '#account-info-container li'
|
||||
},
|
||||
userMenuContainer: {
|
||||
selector: '#account-info-container'
|
||||
},
|
||||
fileTableHeaderItems: {
|
||||
selector: '//*[@id="files-space-table"]//th[not(.//div)]',
|
||||
locateStrategy: 'xpath'
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,82 +0,0 @@
|
||||
const { client } = require('nightwatch-api')
|
||||
|
||||
module.exports = {
|
||||
url: function () {
|
||||
return this.api.launchUrl + '/settings'
|
||||
},
|
||||
|
||||
commands: {
|
||||
navigateAndWaitTillLoaded: async function () {
|
||||
const url = this.url()
|
||||
await await this.navigate(url)
|
||||
while (true) {
|
||||
let found = false
|
||||
await this.waitForElementVisible('@pageHeader', 2000, 500, false)
|
||||
await this.api
|
||||
.elements('@pageHeader', result => {
|
||||
if (result.value.length) {
|
||||
found = true
|
||||
}
|
||||
})
|
||||
if (found) {
|
||||
break
|
||||
}
|
||||
await client.refresh()
|
||||
}
|
||||
return this.waitForElementVisible('@pageHeader')
|
||||
},
|
||||
|
||||
getSettingsValue: async function (key) {
|
||||
let output
|
||||
let elemfound = true
|
||||
|
||||
switch (key) {
|
||||
case 'Language':
|
||||
// Language value is set to empty at beginning
|
||||
// In that case just return false
|
||||
await this.api.element('@languageValue', result => {
|
||||
if (result.status < 0) {
|
||||
elemfound = false
|
||||
}
|
||||
})
|
||||
if (!elemfound) {
|
||||
output = false
|
||||
break
|
||||
}
|
||||
await this.waitForElementVisible('@languageValue')
|
||||
.getText('@languageValue', (result) => {
|
||||
output = result.value
|
||||
})
|
||||
break
|
||||
default:
|
||||
throw new Error('failed to find the setting')
|
||||
}
|
||||
return output
|
||||
},
|
||||
changeSettings: async function (key, value) {
|
||||
switch (key) {
|
||||
case 'Language':
|
||||
await this
|
||||
.waitForElementVisible('@languageInput')
|
||||
.setValue('@languageInput', value + '\n')
|
||||
break
|
||||
default:
|
||||
throw new Error('failed to find the setting')
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
elements: {
|
||||
pageHeader: {
|
||||
selector: '.oc-page-title'
|
||||
},
|
||||
languageValue: {
|
||||
selector: "//label[.='Language']/..//span[@class='vs__selected']",
|
||||
locateStrategy: 'xpath'
|
||||
},
|
||||
languageInput: {
|
||||
selector: "//label[.='Language']/..//input",
|
||||
locateStrategy: 'xpath'
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,40 +0,0 @@
|
||||
const assert = require('assert')
|
||||
const { client } = require('nightwatch-api')
|
||||
const { Given, When, Then } = require('@cucumber/cucumber')
|
||||
const languageHelper = require('../helpers/language')
|
||||
|
||||
Given('the user browses to the settings page', function () {
|
||||
return client.page.settingsPage().navigateAndWaitTillLoaded()
|
||||
})
|
||||
|
||||
Then('the setting {string} should have value {string}', async function (setting, result) {
|
||||
const actual = await client.page.settingsPage().getSettingsValue(setting)
|
||||
assert.strictEqual(actual, result, 'The setting value doesnt matches to ' + result)
|
||||
})
|
||||
|
||||
Then('the setting {string} should not have any value', async function (setting) {
|
||||
const actual = await client.page.settingsPage().getSettingsValue(setting)
|
||||
assert.strictEqual(actual, false, 'The setting value was expected not to be present but was')
|
||||
})
|
||||
|
||||
When('the user changes the language to {string}', async function (value) {
|
||||
await client.page.settingsPage().changeSettings('Language', value)
|
||||
})
|
||||
|
||||
Then('the files menu should be listed in language {string}', async function (language) {
|
||||
const menu = await client.page.filesPageSettingsContext().getMenuList()
|
||||
const expected = languageHelper.getFilesMenuForLanguage(language)
|
||||
assert.deepStrictEqual(menu, expected, 'the menu list were not same')
|
||||
})
|
||||
|
||||
Then('the account menu should be listed in language {string}', async function (language) {
|
||||
const menu = await client.page.filesPageSettingsContext().getUserMenu()
|
||||
const expected = languageHelper.getUserMenuForLanguage(language)
|
||||
assert.deepStrictEqual(menu, expected, 'the menu list were not same')
|
||||
})
|
||||
|
||||
Then('the files header should be displayed in language {string}', async function (language) {
|
||||
const items = await client.page.filesPageSettingsContext().getFileHeaderItems()
|
||||
const expected = languageHelper.getFilesHeaderMenuForLanguage(language)
|
||||
assert.deepStrictEqual(items, expected, 'the menu list were not same')
|
||||
})
|
||||
@@ -1,52 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
if [ -z "$WEB_PATH" ]
|
||||
then
|
||||
echo "WEB_PATH env variable is not set, cannot find files for tests infrastructure"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -z "$WEB_UI_CONFIG" ]
|
||||
then
|
||||
echo "WEB_UI_CONFIG env variable is not set, cannot find web config file"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -z "$1" ]
|
||||
then
|
||||
echo "Features path not given, exiting test run"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
trap clean_up SIGHUP SIGINT SIGTERM
|
||||
|
||||
if [ -z "$TEST_INFRA_DIRECTORY" ]
|
||||
then
|
||||
cleanup=true
|
||||
testFolder=$(mktemp -d -p .)
|
||||
printf "creating folder $testFolder for Test infrastructure setup\n\n"
|
||||
export TEST_INFRA_DIRECTORY=$(realpath $testFolder)
|
||||
fi
|
||||
|
||||
clean_up() {
|
||||
if $cleanup
|
||||
then
|
||||
if [ -d "$testFolder" ]; then
|
||||
printf "\n\n\n\nDeleting folder $testFolder Test infrastructure setup..."
|
||||
rm -rf "$testFolder"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
trap clean_up SIGHUP SIGINT SIGTERM EXIT
|
||||
|
||||
cp -r $(ls -d "$WEB_PATH"/tests/acceptance/* | grep -v 'node_modules') "$testFolder"
|
||||
|
||||
export SERVER_HOST=${SERVER_HOST:-https://localhost:9200}
|
||||
export BACKEND_HOST=${BACKEND_HOST:-https://localhost:9200}
|
||||
export TEST_TAGS=${TEST_TAGS:-"not @skip"}
|
||||
|
||||
pnpm run acceptance-tests "$1"
|
||||
|
||||
status=$?
|
||||
exit $status
|
||||
@@ -1,6 +1,6 @@
|
||||
SHELL := bash
|
||||
NAME := web
|
||||
WEB_ASSETS_VERSION = v7.0.0-rc.7
|
||||
WEB_ASSETS_VERSION = v7.0.0-rc.8
|
||||
|
||||
include ../../.make/recursion.mk
|
||||
|
||||
|
||||
@@ -27,11 +27,5 @@
|
||||
"pdf-viewer",
|
||||
"search",
|
||||
"admin-settings"
|
||||
],
|
||||
"external_apps": [
|
||||
{
|
||||
"id": "settings",
|
||||
"path": "https://ocis-server:9200/settings.js"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user