Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
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
Prev Previous commit
Next Next commit
test(settings): Test user manager can be set and unset
Signed-off-by: nfebe <[email protected]>
  • Loading branch information
nfebe committed Jun 2, 2025
commit ead8888bb7aab6c00935223318eedf0c87af03b7
121 changes: 121 additions & 0 deletions cypress/e2e/settings/users_manager.cy.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
/**
* SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/

import { User } from '@nextcloud/cypress'
import { getUserListRow, handlePasswordConfirmation, toggleEditButton, waitLoading } from './usersUtils'
import { clearState } from '../../support/commonUtils'

const admin = new User('admin', 'admin')

describe('Settings: User Manager Management', function() {
let user: User
let manager: User

beforeEach(function() {
clearState()
cy.createRandomUser().then(($user) => {
manager = $user
return cy.createRandomUser()
}).then(($user) => {
user = $user
cy.login(admin)
cy.intercept('PUT', `/ocs/v2.php/cloud/users/${user.userId}*`).as('updateUser')
})
})

it('Can assign and remove a manager through the UI', function() {
cy.visit('/settings/users')

toggleEditButton(user, true)

// Scroll to manager cell and wait for it to be visible
getUserListRow(user.userId)
.find('[data-cy-user-list-cell-manager]')
.scrollIntoView()
.should('be.visible')

// Assign a manager
getUserListRow(user.userId).find('[data-cy-user-list-cell-manager]').within(() => {
// Verify no manager is set initially
cy.get('.vs__selected').should('not.exist')

// Open the dropdown menu
cy.get('[role="combobox"]').click({ force: true })

// Wait for the dropdown to be visible and initialized
waitLoading('[data-cy-user-list-input-manager]')

// Type the manager's username to search
cy.get('input[type="search"]').type(manager.userId, { force: true })

// Wait for the search results to load
waitLoading('[data-cy-user-list-input-manager]')
})

// Now select the manager from the filtered results
// Since the dropdown is floating, we need to search globally
cy.get('.vs__dropdown-menu').find('li').contains('span', manager.userId).should('be.visible').click({ force: true })

// Handle password confirmation if needed
handlePasswordConfirmation(admin.password)

// Verify the manager is selected in the UI
cy.get('.vs__selected').should('exist').and('contain.text', manager.userId)

// Verify the PUT request was made to set the manager
cy.wait('@updateUser').then((interception) => {
// Verify the request URL and body
expect(interception.request.url).to.match(/\/cloud\/users\/.+/)
expect(interception.request.body).to.deep.equal({
key: 'manager',
value: manager.userId
})
expect(interception.response?.statusCode).to.equal(200)
})

// Wait for the save to complete
waitLoading('[data-cy-user-list-input-manager]')

// Verify the manager is set in the backend
cy.getUserData(user).then(($result) => {
expect($result.body).to.contain(`<manager>${manager.userId}</manager>`)
})

// Now remove the manager
getUserListRow(user.userId).find('[data-cy-user-list-cell-manager]').within(() => {
// Clear the manager selection
cy.get('.vs__clear').click({ force: true })

// Verify the manager is cleared in the UI
cy.get('.vs__selected').should('not.exist')

// Handle password confirmation if needed
handlePasswordConfirmation(admin.password)
})

// Verify the PUT request was made to clear the manager
cy.wait('@updateUser').then((interception) => {
// Verify the request URL and body
expect(interception.request.url).to.match(/\/cloud\/users\/.+/)
expect(interception.request.body).to.deep.equal({
key: 'manager',
value: '',
})
expect(interception.response?.statusCode).to.equal(200)
})

// Wait for the save to complete
waitLoading('[data-cy-user-list-input-manager]')

// Verify the manager is cleared in the backend
cy.getUserData(user).then(($result) => {
expect($result.body).to.not.contain(`<manager>${manager.userId}</manager>`)
expect($result.body).to.contain('<manager></manager>')
})

// Finish editing the user
toggleEditButton(user, false)
})
})
41 changes: 0 additions & 41 deletions cypress/e2e/settings/users_modify.cy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -181,47 +181,6 @@ describe('Settings: Change user properties', function() {
})
})

it('Can set manager of a user', function() {
// create the manager
let manager: User
cy.createRandomUser().then(($user) => { manager = $user })

// open the User settings as admin
cy.login(admin)
cy.visit('/settings/users')

// toggle edit button into edit mode
toggleEditButton(user, true)

getUserListRow(user.userId)
.find('[data-cy-user-list-cell-manager]')
.scrollIntoView()

getUserListRow(user.userId).find('[data-cy-user-list-cell-manager]').within(() => {
// see that the user has no manager
cy.get('.vs__selected').should('not.exist')
// Open the dropdown menu
cy.get('[role="combobox"]').click({ force: true })
// select the manager
cy.contains('li', manager.userId).click({ force: true })

// Handle password confirmation on time out
handlePasswordConfirmation(admin.password)

// see that the user has a manager set
cy.get('.vs__selected').should('exist').and('contain.text', manager.userId)
})

// see that the changes are loading
waitLoading('[data-cy-user-list-input-manager]')

// finish editing the user
toggleEditButton(user, false)

// validate the manager is set
cy.getUserData(user).then(($result) => expect($result.body).to.contain(`<manager>${manager.userId}</manager>`))
})

it('Can make user a subadmin of a group', function() {
// create a group
const groupName = 'userstestgroup'
Expand Down