0
0
Fork 0
mirror of https://github.com/nextcloud/server.git synced 2025-05-04 22:11:01 +00:00
nextcloud_server/cypress/e2e/settings/users-group-admin.cy.ts
Ferdinand Thiessen 8e8125c610
fix(settings): group admins only can add users to their groups
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2025-04-27 12:44:51 +02:00

186 lines
5.9 KiB
TypeScript

/**
* SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
/// <reference types="cypress-if" />
import { User } from '@nextcloud/cypress'
import { getUserListRow, handlePasswordConfirmation } from './usersUtils'
// eslint-disable-next-line n/no-extraneous-import
import randomString from 'crypto-random-string'
const admin = new User('admin', 'admin')
const john = new User('john', '123456')
/**
* Make a user subadmin of a group.
*
* @param user - The user to make subadmin
* @param group - The group the user should be subadmin of
*/
function makeSubAdmin(user: User, group: string): void {
cy.request({
url: `${Cypress.config('baseUrl')!.replace('/index.php', '')}/ocs/v2.php/cloud/users/${user.userId}/subadmins`,
method: 'POST',
auth: {
user: admin.userId,
password: admin.userId,
},
headers: {
'OCS-ApiRequest': 'true',
},
body: {
groupid: group,
},
})
}
describe('Settings: Create accounts as a group admin', function() {
let subadmin: User
let group: string
beforeEach(() => {
group = randomString(7)
cy.deleteUser(john)
cy.createRandomUser().then((user) => {
subadmin = user
cy.runOccCommand(`group:add '${group}'`)
cy.runOccCommand(`group:adduser '${group}' '${subadmin.userId}'`)
makeSubAdmin(subadmin, group)
})
})
it('Can create a user with prefilled single group', () => {
cy.login(subadmin)
// open the User settings
cy.visit('/settings/users')
// open the New user modal
cy.get('button#new-user-button').click()
cy.get('form[data-test="form"]').within(() => {
// see that the correct group is preselected
cy.contains('[data-test="groups"] .vs__selected', group).should('be.visible')
// see that the username is ""
cy.get('input[data-test="username"]').should('exist').and('have.value', '')
// set the username to john
cy.get('input[data-test="username"]').type(john.userId)
// see that the username is john
cy.get('input[data-test="username"]').should('have.value', john.userId)
// see that the password is ""
cy.get('input[type="password"]').should('exist').and('have.value', '')
// set the password to 123456
cy.get('input[type="password"]').type(john.password)
// see that the password is 123456
cy.get('input[type="password"]').should('have.value', john.password)
})
cy.get('form[data-test="form"]').parents('[role="dialog"]').within(() => {
// submit the new user form
cy.get('button[type="submit"]').click({ force: true })
})
// Make sure no confirmation modal is shown
handlePasswordConfirmation(admin.password)
// see that the created user is in the list
getUserListRow(john.userId)
// see that the list of users contains the user john
.contains(john.userId).should('exist')
})
it('Can create a new user when member of multiple groups', () => {
const group2 = randomString(7)
cy.runOccCommand(`group:add '${group2}'`)
cy.runOccCommand(`group:adduser '${group2}' '${subadmin.userId}'`)
makeSubAdmin(subadmin, group2)
cy.login(subadmin)
// open the User settings
cy.visit('/settings/users')
// open the New user modal
cy.get('button#new-user-button').click()
cy.get('form[data-test="form"]').within(() => {
// see that no group is pre-selected
cy.get('[data-test="groups"] .vs__selected').should('not.exist')
// see both groups are available
cy.findByRole('combobox', { name: /member of the following groups/i })
.should('be.visible')
.click()
// can select both groups
cy.document().its('body')
.findByRole('listbox', { name: 'Options' })
.should('be.visible')
.as('options')
.findAllByRole('option')
.should('have.length', 2)
.get('@options')
.findByRole('option', { name: group })
.should('be.visible')
.get('@options')
.findByRole('option', { name: group2 })
.should('be.visible')
.click()
// see group is selected
cy.contains('[data-test="groups"] .vs__selected', group2).should('be.visible')
// see that the username is ""
cy.get('input[data-test="username"]').should('exist').and('have.value', '')
// set the username to john
cy.get('input[data-test="username"]').type(john.userId)
// see that the username is john
cy.get('input[data-test="username"]').should('have.value', john.userId)
// see that the password is ""
cy.get('input[type="password"]').should('exist').and('have.value', '')
// set the password to 123456
cy.get('input[type="password"]').type(john.password)
// see that the password is 123456
cy.get('input[type="password"]').should('have.value', john.password)
})
cy.get('form[data-test="form"]').parents('[role="dialog"]').within(() => {
// submit the new user form
cy.get('button[type="submit"]').click({ force: true })
})
// Make sure no confirmation modal is shown
handlePasswordConfirmation(admin.password)
// see that the created user is in the list
getUserListRow(john.userId)
// see that the list of users contains the user john
.contains(john.userId).should('exist')
})
it('Only sees groups they are subadmin of', () => {
const group2 = randomString(7)
cy.runOccCommand(`group:add '${group2}'`)
cy.runOccCommand(`group:adduser '${group2}' '${subadmin.userId}'`)
// not a subadmin!
cy.login(subadmin)
// open the User settings
cy.visit('/settings/users')
// open the New user modal
cy.get('button#new-user-button').click()
cy.get('form[data-test="form"]').within(() => {
// see that the subadmin group is pre-selected
cy.contains('[data-test="groups"] .vs__selected', group).should('be.visible')
// see only the subadmin group is available
cy.findByRole('combobox', { name: /member of the following groups/i })
.should('be.visible')
.click()
// can select both groups
cy.document().its('body')
.findByRole('listbox', { name: 'Options' })
.should('be.visible')
.as('options')
.findAllByRole('option')
.should('have.length', 1)
})
})
})