Skip to content

Commit

Permalink
feat(systemtags): add cypress tests and fix a few logic issues
Browse files Browse the repository at this point in the history
Signed-off-by: skjnldsv <skjnldsv@protonmail.com>
  • Loading branch information
skjnldsv committed Oct 26, 2024
1 parent 9f95575 commit 00c7239
Show file tree
Hide file tree
Showing 11 changed files with 414 additions and 18 deletions.
7 changes: 3 additions & 4 deletions apps/dav/lib/SystemTag/SystemTagPlugin.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@
use Sabre\DAV\Exception\BadRequest;
use Sabre\DAV\Exception\Conflict;
use Sabre\DAV\Exception\Forbidden;
use Sabre\DAV\Exception\PreconditionFailed;
use Sabre\DAV\Exception\UnsupportedMediaType;
use Sabre\DAV\PropFind;
use Sabre\DAV\PropPatch;
Expand Down Expand Up @@ -218,8 +217,8 @@ public function handleGetProperties(
$propFind->setPath(str_replace('systemtags-assigned/', 'systemtags/', $propFind->getPath()));
}

$propFind->handle(FilesPlugin::GETETAG_PROPERTYNAME, function () use ($node): string|null {
return $node->getSystemTag()->getETag();
$propFind->handle(FilesPlugin::GETETAG_PROPERTYNAME, function () use ($node): string {
return '"' . ($node->getSystemTag()->getETag() ?? '') . '"';
});

$propFind->handle(self::ID_PROPERTYNAME, function () use ($node) {
Expand Down Expand Up @@ -379,7 +378,7 @@ public function handleUpdateProperties($path, PropPatch $propPatch) {

if (isset($props[self::OBJECTIDS_PROPERTYNAME])) {
$propValue = $props[self::OBJECTIDS_PROPERTYNAME];
if (!($propValue instanceof SystemTagsObjectList) || count($propValue?->getObjects() ?: []) === 0) {
if (!($propValue instanceof SystemTagsObjectList) || count($propValue->getObjects()) === 0) {
throw new BadRequest('Invalid object-ids property');
}

Expand Down
1 change: 1 addition & 0 deletions apps/files/src/components/FileEntry/FileEntryCheckbox.vue
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
<NcCheckboxRadioSwitch v-else
:aria-label="ariaLabel"
:checked="isSelected"
data-cy-files-list-row-checkbox
@update:checked="onSelectionChange" />
</td>
</template>
Expand Down
2 changes: 1 addition & 1 deletion apps/files/src/components/FilesListTableHeader.vue
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
<tr class="files-list__row-head">
<th class="files-list__column files-list__row-checkbox"
@keyup.esc.exact="resetSelection">
<NcCheckboxRadioSwitch v-bind="selectAllBind" @update:checked="onToggleAll" />
<NcCheckboxRadioSwitch v-bind="selectAllBind" data-cy-files-list-selection-checkbox @update:checked="onToggleAll" />
</th>

<!-- Columns display -->
Expand Down
3 changes: 2 additions & 1 deletion apps/files/src/components/FilesListTableHeaderActions.vue
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
- SPDX-License-Identifier: AGPL-3.0-or-later
-->
<template>
<div class="files-list__column files-list__row-actions-batch">
<div class="files-list__column files-list__row-actions-batch" data-cy-files-list-selection-actions>
<NcActions ref="actionsMenu"
container="#app-content-vue"
:disabled="!!loading || areSomeNodesLoading"
Expand All @@ -15,6 +15,7 @@
:key="action.id"
:aria-label="action.displayName(nodes, currentView) + ' ' + t('files', '(selected)') /** TRANSLATORS: Selected like 'selected files and folders' */"
:class="'files-list__row-actions-batch-' + action.id"
:data-cy-files-list-selection-action="action.id"
@click="onActionClick(action)">
<template #icon>
<NcLoadingIcon v-if="loading === action.id" :size="18" />
Expand Down
28 changes: 21 additions & 7 deletions apps/systemtags/src/components/SystemTagPicker.vue
Original file line number Diff line number Diff line change
Expand Up @@ -23,22 +23,28 @@
<!-- Search or create input -->
<form class="systemtags-picker__create" @submit.stop.prevent="onNewTag">
<NcTextField :value.sync="input"
:label="t('systemtags', 'Search or create tag')">
:label="t('systemtags', 'Search or create tag')"
data-cy-systemtags-picker-input>
<TagIcon :size="20" />
</NcTextField>
<NcButton :disabled="status === Status.CREATING_TAG" native-type="submit">
<NcButton :disabled="status === Status.CREATING_TAG"
native-type="submit"
data-cy-systemtags-picker-input-submit>
{{ t('systemtags', 'Create tag') }}
</NcButton>
</form>

<!-- Tags list -->
<div v-if="filteredTags.length > 0" class="systemtags-picker__tags">
<div v-if="filteredTags.length > 0"
class="systemtags-picker__tags"
data-cy-systemtags-picker-tags>
<NcCheckboxRadioSwitch v-for="tag in filteredTags"
:key="tag.id"
:label="tag.displayName"
:checked="isChecked(tag)"
:indeterminate="isIndeterminate(tag)"
:disabled="!tag.canAssign"
:data-cy-systemtags-picker-tag="tag.id"
@update:checked="onCheckUpdate(tag, $event)">
{{ formatTagName(tag) }}
</NcCheckboxRadioSwitch>
Expand All @@ -61,10 +67,15 @@
</template>

<template #actions>
<NcButton :disabled="status !== Status.BASE" type="tertiary" @click="onCancel">
<NcButton :disabled="status !== Status.BASE"
type="tertiary"
data-cy-systemtags-picker-button-cancel
@click="onCancel">
{{ t('systemtags', 'Cancel') }}
</NcButton>
<NcButton :disabled="!hasChanges || status !== Status.BASE" @click="onSubmit">
<NcButton :disabled="!hasChanges || status !== Status.BASE"
data-cy-systemtags-picker-button-submit
@click="onSubmit">
{{ t('systemtags', 'Apply changes') }}
</NcButton>
</template>
Expand Down Expand Up @@ -270,11 +281,11 @@ export default defineComponent({
},

formatTagName(tag: TagWithId): string {
if (tag.userVisible) {
if (!tag.userVisible) {
return t('systemtags', '{displayName} (hidden)', { displayName: tag.displayName })
}

if (tag.userAssignable) {
if (!tag.userAssignable) {
return t('systemtags', '{displayName} (restricted)', { displayName: tag.displayName })
}

Expand Down Expand Up @@ -317,6 +328,9 @@ export default defineComponent({
const tag = await fetchTag(id)
this.tags.push(tag)
this.input = ''

// Check the newly created tag
this.onCheckUpdate(tag, true)
} catch (error) {
showError((error as Error)?.message || t('systemtags', 'Failed to create tag'))
} finally {
Expand Down
4 changes: 4 additions & 0 deletions apps/systemtags/src/event-bus.d.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
/**
* SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
import type { Node } from '@nextcloud/files'

declare module '@nextcloud/event-bus' {
Expand Down
2 changes: 1 addition & 1 deletion apps/systemtags/src/files_actions/bulkSystemTagsAction.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ export const action = new FileAction({

// If the app is disabled, the action is not available anyway
enabled(nodes) {
if (nodes.length > 0) {
if (nodes.length === 0) {
return false
}

Expand Down
27 changes: 25 additions & 2 deletions cypress/e2e/files/FilesUtils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,15 @@ export const getActionButtonForFile = (filename: string) => getActionsForFile(fi

export const triggerActionForFileId = (fileid: number, actionId: string) => {
getActionButtonForFileId(fileid).click()
cy.get(`[data-cy-files-list-row-action="${CSS.escape(actionId)}"] > button`).should('exist').click()
// Getting the last button to avoid the one from popup fading out
cy.get(`[data-cy-files-list-row-action="${CSS.escape(actionId)}"] > button`).last()
.should('exist').click()
}
export const triggerActionForFile = (filename: string, actionId: string) => {
getActionButtonForFile(filename).click()
cy.get(`[data-cy-files-list-row-action="${CSS.escape(actionId)}"] > button`).should('exist').click()
// Getting the last button to avoid the one from popup fading out
cy.get(`[data-cy-files-list-row-action="${CSS.escape(actionId)}"] > button`).last()
.should('exist').click()
}

export const triggerInlineActionForFileId = (fileid: number, actionId: string) => {
Expand All @@ -28,6 +32,25 @@ export const triggerInlineActionForFile = (filename: string, actionId: string) =
getActionsForFile(filename).get(`button[data-cy-files-list-row-action="${CSS.escape(actionId)}"]`).should('exist').click()
}

export const selectAllFiles = () => {
cy.get('[data-cy-files-list-selection-checkbox]').findByRole('checkbox').click({ force: true })
}
export const selectRowForFile = (filename: string) => {
getRowForFile(filename)
.find('[data-cy-files-list-row-checkbox]')
.findByRole('checkbox')
.click({ force: true })
.should('be.checked')
cy.get('[data-cy-files-list-selection-checkbox]').findByRole('checkbox').should('satisfy', (elements) => {
return elements.length === 1 && (elements[0].checked === true || elements[0].indeterminate === true)
})

}

export const triggerSelectionAction = (actionId: string) => {
cy.get(`button[data-cy-files-list-selection-action="${CSS.escape(actionId)}"]`).should('exist').click()
}

export const moveFile = (fileName: string, dirPath: string) => {
getRowForFile(fileName).should('be.visible')
triggerActionForFile(fileName, 'move-copy')
Expand Down
Loading

0 comments on commit 00c7239

Please sign in to comment.