Skip to content

Commit b9db46a

Browse files
committed
test: convert groups.feature test to playwright
1 parent 17aa42e commit b9db46a

9 files changed

Lines changed: 463 additions & 5 deletions

File tree

Lines changed: 196 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,196 @@
1+
import { test } from '@playwright/test'
2+
import { config } from '../../../e2e/config.js'
3+
import { ActorsEnvironment, UsersEnvironment } from '../../../e2e/support/environment/index.js'
4+
import { setAccessAndRefreshToken } from '../../helpers/setAccessAndRefreshToken.js'
5+
import * as api from '../../steps/api/api.js'
6+
import * as ui from '../../steps/ui/index'
7+
import { editor } from '../../../e2e/support/objects/app-files/utils/index.js'
8+
9+
test.describe('groups management', () => {
10+
let actorsEnvironment
11+
const usersEnvironment = new UsersEnvironment()
12+
13+
test.beforeEach(async ({ browser }) => {
14+
actorsEnvironment = new ActorsEnvironment({
15+
context: {
16+
acceptDownloads: config.acceptDownloads,
17+
reportDir: config.reportDir,
18+
tracingReportDir: config.tracingReportDir,
19+
reportHar: config.reportHar,
20+
reportTracing: config.reportTracing,
21+
reportVideo: config.reportVideo,
22+
failOnUncaughtConsoleError: config.failOnUncaughtConsoleError
23+
},
24+
browser: browser
25+
})
26+
27+
await setAccessAndRefreshToken(usersEnvironment)
28+
})
29+
30+
test.afterEach(async () => {})
31+
32+
test('keycloak group sync with oCIS', async () => {
33+
// Given "Admin" creates following user using API
34+
// | id |
35+
// | Alice |
36+
// | Brian |
37+
await api.userHasBeenCreated({ usersEnvironment, stepUser: 'Admin', userToBeCreated: 'Alice' })
38+
await api.userHasBeenCreated({ usersEnvironment, stepUser: 'Admin', userToBeCreated: 'Brian' })
39+
40+
// And "Alice" creates the following files into personal space using API
41+
// | pathToFile | content |
42+
// | shareToSales.txt | Keycloak group share |
43+
// | shareToSecurity.txt | Keycloak group share |
44+
await api.userHasCreatedFile({
45+
usersEnvironment,
46+
stepUser: 'Alice',
47+
filename: 'shareToSales.txt',
48+
content: 'Keycloak group share'
49+
})
50+
await api.userHasCreatedFile({
51+
usersEnvironment,
52+
stepUser: 'Alice',
53+
filename: 'shareToSecurity.txt',
54+
content: 'Keycloak group share'
55+
})
56+
// When "Admin" logs in
57+
await ui.logInUser({ usersEnvironment, actorsEnvironment, stepUser: 'Admin' })
58+
59+
// And "Admin" opens the "admin-settings" app
60+
await ui.openApplication({ actorsEnvironment, stepUser: 'Admin', name: 'admin-settings' })
61+
62+
// And "Admin" navigates to the groups management page
63+
await ui.navigateToGroupsManagementPage({ actorsEnvironment, stepUser: 'Admin' })
64+
65+
// When "Admin" creates the following groups
66+
// | id |
67+
// | security |
68+
// | sales |
69+
await ui.userCreatesGroup({ actorsEnvironment, stepUser: 'Admin', group: 'security' })
70+
await ui.userCreatesGroup({ actorsEnvironment, stepUser: 'Admin', group: 'sales' })
71+
72+
// Then "Admin" should see the following group
73+
// | group |
74+
// | security |
75+
// | keycloak sales |
76+
// | keycloak finance |
77+
await ui.userShouldSeeGroups({
78+
actorsEnvironment,
79+
stepUser: 'Admin',
80+
groups: ['security', 'keycloak sales', 'keycloak finance']
81+
})
82+
83+
// When "Admin" navigates to the users management page
84+
await ui.userNavigatesToUserManagementPage({ actorsEnvironment, stepUser: 'Admin' })
85+
// And "Admin" adds the user "Brian" to the groups "security,keycloak sales" using the sidebar panel
86+
await ui.userAddsUserToGroup({
87+
actorsEnvironment,
88+
stepUser: 'Admin',
89+
action: 'adds',
90+
groups: ['security', 'keycloak sales'],
91+
user: 'Brian'
92+
})
93+
94+
// And "Admin" logs out
95+
await ui.logOutUser({ actorsEnvironment, stepUser: 'Admin' })
96+
// And "Alice" logs in
97+
await ui.logInUser({ usersEnvironment, actorsEnvironment, stepUser: 'Alice' })
98+
99+
// And "Alice" shares the following resource using the sidebar panel
100+
// | resource | recipient | type | role | resourceType |
101+
// | shareToSales.txt | keycloak sales | group | Can edit without versions | file |
102+
// | shareToSecurity.txt | security | group | Can edit without versions | file |
103+
await ui.shareResource({
104+
actorsEnvironment,
105+
usersEnvironment,
106+
stepUser: 'Alice',
107+
actionType: 'SIDEBAR_PANEL',
108+
resource: 'shareToSales.txt',
109+
recipient: 'keycloak sales',
110+
type: 'group',
111+
role: 'Can edit without versions',
112+
resourceType: 'file'
113+
})
114+
115+
await ui.shareResource({
116+
actorsEnvironment,
117+
usersEnvironment,
118+
stepUser: 'Alice',
119+
actionType: 'SIDEBAR_PANEL',
120+
resource: 'shareToSales.txt',
121+
recipient: 'security',
122+
type: 'group',
123+
role: 'Can edit without versions',
124+
resourceType: 'file'
125+
})
126+
127+
// And "Alice" logs out
128+
await ui.logOutUser({ actorsEnvironment, stepUser: 'Alice' })
129+
130+
// And "Brian" logs in
131+
await ui.logInUser({ usersEnvironment, actorsEnvironment, stepUser: 'Brian' })
132+
// And "Brian" navigates to the shared with me page
133+
await ui.navigateToSharedWithMePage({ actorsEnvironment, stepUser: 'Brian' })
134+
135+
// # user should have access to unsynced shares
136+
// When "Brian" opens the following file in texteditor
137+
// | resource |
138+
// | shareToSales.txt |
139+
await ui.userOpensTheFollowingFileIn({
140+
actorsEnvironment,
141+
stepUser: 'Brian',
142+
resource: 'shareToSales.txt',
143+
actionType: 'texteditor'
144+
})
145+
// And "Brian" closes the file viewer
146+
const { page } = actorsEnvironment.getActor({ key: 'Brian' })
147+
await editor.close(page)
148+
// And "Brian" edits the following resources
149+
// | resource | content |
150+
// | shareToSecurity.txt | new content |
151+
await ui.userEditsResource({
152+
actorsEnvironment,
153+
stepUser: 'Brian',
154+
resource: 'shareToSecurity.txt',
155+
content: 'new content'
156+
})
157+
// And "Brian" logs out
158+
await ui.logOutUser({ actorsEnvironment, stepUser: 'Brian' })
159+
160+
// When "Admin" logs in
161+
await ui.logInUser({ usersEnvironment, actorsEnvironment, stepUser: 'Admin' })
162+
163+
// And "Admin" opens the "admin-settings" app
164+
await ui.openApplication({ actorsEnvironment, stepUser: 'Admin', name: 'admin-settings' })
165+
166+
// And "Admin" navigates to the groups management page
167+
await ui.navigateToGroupsManagementPage({ actorsEnvironment, stepUser: 'Admin' })
168+
169+
// # Renaming a Keycloak group results in the creation of a new group on the oCIS server (see https://github.com/owncloud/ocis/issues/10445).
170+
// # After renaming a group, it may take up to 5 minutes for the changes to sync, so avoid using the renamed group in the subsequent steps.
171+
// And "Admin" changes displayName to "a renamed group" for group "keycloak finance" using the sidebar panel
172+
await ui.userRenamesGroup({
173+
actorsEnvironment,
174+
stepUser: 'Admin',
175+
attribute: 'displayName',
176+
value: 'a renamed group',
177+
user: 'keycloak finance'
178+
})
179+
180+
// When "Admin" deletes the following group using the context menu
181+
// | group |
182+
// | sales |
183+
await ui.userDeletesGroup({
184+
actorsEnvironment,
185+
stepUser: 'Admin',
186+
actionType: 'contex menu',
187+
group: 'sales'
188+
})
189+
// Then "Admin" should not see the following group
190+
// | group |
191+
// | sales |
192+
await ui.userShouldSeeGroups({ actorsEnvironment, stepUser: 'Admin', groups: ['sales'] })
193+
// And "Admin" logs out
194+
await ui.logOutUser({ actorsEnvironment, stepUser: 'Admin' })
195+
})
196+
})

tests/e2e-playwright/steps/ui/adminSettings.ts

Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,3 +41,147 @@ export async function resetLogo({
4141
const generalObject = new objects.applicationAdminSettings.General({ page })
4242
await generalObject.resetLogo()
4343
}
44+
45+
export async function userNavigatesToUserManagementPage({
46+
actorsEnvironment,
47+
stepUser
48+
}: {
49+
actorsEnvironment: ActorsEnvironment
50+
stepUser: string
51+
}): Promise<void> {
52+
const { page } = actorsEnvironment.getActor({ key: stepUser })
53+
const pageObject = new objects.applicationAdminSettings.page.Users({ page })
54+
await pageObject.navigate()
55+
}
56+
57+
export async function userDeletesGroup({
58+
actorsEnvironment,
59+
stepUser,
60+
actionType,
61+
group
62+
}: {
63+
actorsEnvironment: ActorsEnvironment
64+
stepUser: string
65+
actionType: string
66+
group: string
67+
}): Promise<void> {
68+
const { page } = actorsEnvironment.getActor({ key: stepUser })
69+
const groupsObject = new objects.applicationAdminSettings.Groups({ page })
70+
const groupIds = []
71+
72+
switch (actionType) {
73+
case 'batch actions':
74+
groupIds.push(groupsObject.getUUID({ key: group }))
75+
await groupsObject.selectGroup({ key: group })
76+
await groupsObject.deleteGroupUsingBatchAction({ groupIds })
77+
break
78+
case 'context menu':
79+
await groupsObject.deleteGroupUsingContextMenu({ key: group })
80+
break
81+
default:
82+
throw new Error(`'${actionType}' not implemented`)
83+
}
84+
}
85+
86+
export async function userRenamesGroup({
87+
actorsEnvironment,
88+
stepUser,
89+
attribute,
90+
value,
91+
user
92+
}: {
93+
actorsEnvironment: ActorsEnvironment
94+
stepUser: string
95+
attribute: string
96+
value: string
97+
user: string
98+
}): Promise<void> {
99+
const { page } = actorsEnvironment.getActor({ key: stepUser })
100+
const groupsObject = new objects.applicationAdminSettings.Groups({ page })
101+
102+
await groupsObject.changeGroup({
103+
key: user,
104+
attribute: attribute,
105+
value: value,
106+
action: 'context-menu'
107+
})
108+
}
109+
110+
export async function userAddsUserToGroup({
111+
actorsEnvironment,
112+
stepUser,
113+
action,
114+
groups,
115+
user
116+
}: {
117+
actorsEnvironment: ActorsEnvironment
118+
stepUser: string
119+
action: string
120+
groups: string[]
121+
user: string
122+
}): Promise<void> {
123+
const { page } = actorsEnvironment.getActor({ key: stepUser })
124+
const usersObject = new objects.applicationAdminSettings.Users({ page })
125+
switch (action) {
126+
case 'adds':
127+
await usersObject.addToGroups({
128+
key: user,
129+
groups,
130+
action: 'context-menu'
131+
})
132+
break
133+
case 'removes':
134+
await usersObject.removeFromGroups({
135+
key: user,
136+
groups,
137+
action: 'context-menu'
138+
})
139+
break
140+
default:
141+
throw new Error(`'${action}' not implemented`)
142+
}
143+
}
144+
145+
export async function navigateToGroupsManagementPage({
146+
actorsEnvironment,
147+
stepUser
148+
}: {
149+
actorsEnvironment: ActorsEnvironment
150+
stepUser: string
151+
}): Promise<void> {
152+
const { page } = actorsEnvironment.getActor({ key: stepUser })
153+
const groupsObject = new objects.applicationAdminSettings.page.Groups({ page })
154+
await groupsObject.navigate()
155+
}
156+
157+
export async function userCreatesGroup({
158+
actorsEnvironment,
159+
stepUser,
160+
group
161+
}: {
162+
actorsEnvironment: ActorsEnvironment
163+
stepUser: string
164+
group: string
165+
}): Promise<void> {
166+
const { page } = actorsEnvironment.getActor({ key: stepUser })
167+
const groupsObject = new objects.applicationAdminSettings.Groups({ page })
168+
await groupsObject.createGroup({ key: group })
169+
}
170+
171+
export async function userShouldSeeGroups({
172+
actorsEnvironment,
173+
stepUser,
174+
groups
175+
}: {
176+
actorsEnvironment: ActorsEnvironment
177+
stepUser: string
178+
groups: string[]
179+
}): Promise<void> {
180+
const { page } = actorsEnvironment.getActor({ key: stepUser })
181+
const groupsObject = new objects.applicationAdminSettings.Groups({ page })
182+
const groupList = await groupsObject.getDisplayedGroups()
183+
184+
groups.forEach((group) => {
185+
expect(groupList).toContain(group)
186+
})
187+
}

tests/e2e-playwright/steps/ui/resources.ts

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -276,3 +276,50 @@ export async function getFilesList({
276276
const resourceObject = new objects.applicationFiles.Resource({ page })
277277
return await resourceObject.getAllFiles()
278278
}
279+
280+
export async function userOpensTheFollowingFileIn({
281+
actorsEnvironment,
282+
stepUser,
283+
resource,
284+
actionType
285+
}: {
286+
actorsEnvironment: ActorsEnvironment
287+
stepUser: string
288+
resource: string
289+
actionType: string
290+
}): Promise<void> {
291+
const { page } = actorsEnvironment.getActor({ key: stepUser })
292+
const resourceObject = new objects.applicationFiles.Resource({ page })
293+
await resourceObject.openFileInViewer({
294+
name: resource,
295+
actionType: actionType as
296+
| 'mediaviewer'
297+
| 'pdfviewer'
298+
| 'texteditor'
299+
| 'Collabora'
300+
| 'OnlyOffice'
301+
})
302+
}
303+
304+
export async function userEditsResource({
305+
actorsEnvironment,
306+
stepUser,
307+
resource,
308+
content,
309+
type
310+
}: {
311+
actorsEnvironment: ActorsEnvironment
312+
stepUser: string
313+
resource: string
314+
content: string
315+
type?: string
316+
}): Promise<void> {
317+
const { page } = actorsEnvironment.getActor({ key: stepUser })
318+
const resourceObject = new objects.applicationFiles.Resource({ page })
319+
320+
await resourceObject.editResource({
321+
name: resource,
322+
type: type,
323+
content: content
324+
})
325+
}

0 commit comments

Comments
 (0)