|
1 | 1 | import { expect, test } from "@playwright/test"; |
2 | | -import { v4 as uuidv4 } from "uuid"; |
3 | | -import adminClient from "../utils/AdminClient.ts"; |
| 2 | +import { toClientScopes } from "../../src/client-scopes/routes/ClientScopes.tsx"; |
| 3 | +import { createTestBed } from "../support/testbed.ts"; |
4 | 4 | import { assertSaveButtonIsDisabled, clickSaveButton } from "../utils/form.ts"; |
5 | 5 | import { login } from "../utils/login.ts"; |
6 | 6 | import { assertNotificationMessage } from "../utils/masthead.ts"; |
7 | 7 | import { confirmModal } from "../utils/modal.ts"; |
8 | | -import { goToClientScopes } from "../utils/sidebar.ts"; |
9 | 8 | import { |
10 | 9 | assertRowExists, |
11 | 10 | assertTableRowsLength, |
@@ -42,193 +41,211 @@ const FilterProtocol = { |
42 | 41 | OpenID: "OpenID Connect", |
43 | 42 | }; |
44 | 43 |
|
45 | | -test.describe.serial("Client Scopes test", () => { |
46 | | - const clientScopeName = "client-scope-test"; |
47 | | - const itemId = `client-scope-test-${uuidv4()}`; |
48 | | - const clientScope = { |
49 | | - name: clientScopeName, |
50 | | - description: "", |
51 | | - protocol: "openid-connect", |
52 | | - attributes: { |
53 | | - "include.in.token.scope": "true", |
54 | | - "display.on.consent.screen": "true", |
55 | | - "gui.order": "1", |
56 | | - "consent.screen.text": "", |
57 | | - }, |
58 | | - }; |
| 44 | +test.describe("Client scope filtering", () => { |
59 | 45 | const placeHolder = "Search for client scope"; |
60 | 46 | const tableName = "Client scopes"; |
| 47 | + const clientScopeName = "client-scope-test"; |
61 | 48 |
|
62 | | - test.beforeAll(async () => { |
| 49 | + test("filters client scope by name", async ({ page }) => { |
| 50 | + const clientScopes = []; |
63 | 51 | for (let i = 0; i < 5; i++) { |
64 | | - clientScope.name = clientScopeName + i; |
65 | | - await adminClient.createClientScope(clientScope); |
| 52 | + clientScopes.push({ |
| 53 | + name: `${clientScopeName}${i}`, |
| 54 | + protocol: "openid-connect", |
| 55 | + }); |
66 | 56 | } |
| 57 | + |
| 58 | + await using testBed = await createTestBed({ |
| 59 | + clientScopes, |
| 60 | + }); |
| 61 | + |
| 62 | + await login(page, { to: toClientScopes({ realm: testBed.realm }) }); |
| 63 | + |
| 64 | + const itemName = `${clientScopeName}0`; |
| 65 | + await searchItem(page, placeHolder, itemName); |
| 66 | + await assertRowExists(page, itemName); |
| 67 | + await assertTableRowsLength(page, tableName, 1); |
67 | 68 | }); |
68 | 69 |
|
69 | | - test.afterAll(async () => { |
70 | | - for (let i = 0; i < 5; i++) { |
71 | | - if (await adminClient.existsClientScope(clientScopeName + i)) { |
72 | | - await adminClient.deleteClientScope(clientScopeName + i); |
73 | | - } |
74 | | - } |
| 70 | + test("filters items by assigned type Default", async ({ page }) => { |
| 71 | + await using testBed = await createTestBed(); |
| 72 | + |
| 73 | + await login(page, { to: toClientScopes({ realm: testBed.realm }) }); |
| 74 | + |
| 75 | + await selectClientScopeFilter(page, "Assigned type"); |
| 76 | + await selectSecondaryFilterAssignedType(page, FilterAssignedType.Default); |
| 77 | + |
| 78 | + const assignedTypes = await getTableAssignedTypeColumn(page, tableName); |
| 79 | + |
| 80 | + expect(assignedTypes).toContain(FilterAssignedType.Default); |
| 81 | + expect(assignedTypes).not.toContain(FilterAssignedType.Optional); |
| 82 | + expect(assignedTypes).not.toContain(FilterAssignedType.None); |
75 | 83 | }); |
76 | 84 |
|
77 | | - test.describe.serial("Client Scope filter list items", () => { |
78 | | - test.beforeEach(async ({ page }) => { |
79 | | - await login(page); |
80 | | - await goToClientScopes(page); |
81 | | - }); |
| 85 | + test("filters items by assigned type Optional", async ({ page }) => { |
| 86 | + await using testBed = await createTestBed(); |
82 | 87 |
|
83 | | - test("should filter item by name", async ({ page }) => { |
84 | | - const itemName = clientScopeName + "0"; |
85 | | - await searchItem(page, placeHolder, itemName); |
86 | | - await assertRowExists(page, itemName); |
87 | | - await assertTableRowsLength(page, tableName, 1); |
88 | | - }); |
| 88 | + await login(page, { to: toClientScopes({ realm: testBed.realm }) }); |
89 | 89 |
|
90 | | - test("should filter items by Assigned type Default", async ({ page }) => { |
91 | | - await selectClientScopeFilter(page, "Assigned type"); |
92 | | - await selectSecondaryFilterAssignedType(page, FilterAssignedType.Default); |
| 90 | + await selectClientScopeFilter(page, "Assigned type"); |
| 91 | + await selectSecondaryFilterAssignedType(page, FilterAssignedType.Optional); |
93 | 92 |
|
94 | | - const assignedTypes = await getTableAssignedTypeColumn(page, tableName); |
| 93 | + const assignedTypes = await getTableAssignedTypeColumn(page, tableName); |
95 | 94 |
|
96 | | - expect(assignedTypes).toContain(FilterAssignedType.Default); |
97 | | - expect(assignedTypes).not.toContain(FilterAssignedType.Optional); |
98 | | - expect(assignedTypes).not.toContain(FilterAssignedType.None); |
99 | | - }); |
| 95 | + expect(assignedTypes).not.toContain(FilterAssignedType.Default); |
| 96 | + expect(assignedTypes).not.toContain(FilterAssignedType.None); |
| 97 | + expect(assignedTypes).toContain(FilterAssignedType.Optional); |
| 98 | + }); |
100 | 99 |
|
101 | | - test("should filter items by Assigned type Optional", async ({ page }) => { |
102 | | - await selectClientScopeFilter(page, "Assigned type"); |
103 | | - await selectSecondaryFilterAssignedType( |
104 | | - page, |
105 | | - FilterAssignedType.Optional, |
106 | | - ); |
| 100 | + test("filters items by assigned type All", async ({ page }) => { |
| 101 | + await using testBed = await createTestBed(); |
107 | 102 |
|
108 | | - const assignedTypes = await getTableAssignedTypeColumn(page, tableName); |
| 103 | + await login(page, { to: toClientScopes({ realm: testBed.realm }) }); |
109 | 104 |
|
110 | | - expect(assignedTypes).not.toContain(FilterAssignedType.Default); |
111 | | - expect(assignedTypes).not.toContain(FilterAssignedType.None); |
112 | | - expect(assignedTypes).toContain(FilterAssignedType.Optional); |
113 | | - }); |
| 105 | + await selectClientScopeFilter(page, "Assigned type"); |
| 106 | + await selectSecondaryFilterAssignedType(page, FilterAssignedType.AllTypes); |
114 | 107 |
|
115 | | - test("should filter items by Assigned type All", async ({ page }) => { |
116 | | - await selectClientScopeFilter(page, "Assigned type"); |
117 | | - await selectSecondaryFilterAssignedType( |
118 | | - page, |
119 | | - FilterAssignedType.AllTypes, |
120 | | - ); |
| 108 | + const assignedTypes = await getTableAssignedTypeColumn(page, tableName); |
121 | 109 |
|
122 | | - const assignedTypes = await getTableAssignedTypeColumn(page, tableName); |
| 110 | + expect(assignedTypes).toContain(FilterAssignedType.Default); |
| 111 | + expect(assignedTypes).toContain(FilterAssignedType.Optional); |
| 112 | + // Note: Default realm may not have client scopes with "None" type |
| 113 | + }); |
123 | 114 |
|
124 | | - expect(assignedTypes).toContain(FilterAssignedType.Default); |
125 | | - expect(assignedTypes).toContain(FilterAssignedType.Optional); |
126 | | - expect(assignedTypes).toContain(FilterAssignedType.None); |
127 | | - }); |
| 115 | + test("filters items by protocol OpenID", async ({ page }) => { |
| 116 | + await using testBed = await createTestBed(); |
128 | 117 |
|
129 | | - test("should filter items by Protocol OpenID", async ({ page }) => { |
130 | | - await selectClientScopeFilter(page, "Protocol"); |
131 | | - await selectSecondaryFilterProtocol(page, FilterProtocol.OpenID); |
| 118 | + await login(page, { to: toClientScopes({ realm: testBed.realm }) }); |
132 | 119 |
|
133 | | - const protocols = await getTableProtocolColumn(page, tableName); |
| 120 | + await selectClientScopeFilter(page, "Protocol"); |
| 121 | + await selectSecondaryFilterProtocol(page, FilterProtocol.OpenID); |
134 | 122 |
|
135 | | - expect(protocols).not.toContain(FilterProtocol.SAML); |
136 | | - expect(protocols).toContain(FilterProtocol.OpenID); |
137 | | - }); |
| 123 | + const protocols = await getTableProtocolColumn(page, tableName); |
138 | 124 |
|
139 | | - test("should filter items by Protocol SAML", async ({ page }) => { |
140 | | - await selectClientScopeFilter(page, "Protocol"); |
141 | | - await selectSecondaryFilterProtocol(page, FilterProtocol.SAML); |
| 125 | + expect(protocols).not.toContain(FilterProtocol.SAML); |
| 126 | + expect(protocols).toContain(FilterProtocol.OpenID); |
| 127 | + }); |
142 | 128 |
|
143 | | - const protocols = await getTableProtocolColumn(page, tableName); |
| 129 | + test("filters items by protocol SAML", async ({ page }) => { |
| 130 | + await using testBed = await createTestBed(); |
144 | 131 |
|
145 | | - expect(protocols).toContain(FilterProtocol.SAML); |
146 | | - expect(protocols).not.toContain(FilterProtocol.OpenID); |
147 | | - }); |
| 132 | + await login(page, { to: toClientScopes({ realm: testBed.realm }) }); |
148 | 133 |
|
149 | | - test("should show items on next page are more than 11", async ({ |
150 | | - page, |
151 | | - }) => { |
152 | | - await clickNextPageButton(page); |
153 | | - const rows = await getTableData(page, tableName); |
154 | | - expect(rows.length).toBeGreaterThan(1); |
155 | | - }); |
| 134 | + await selectClientScopeFilter(page, "Protocol"); |
| 135 | + await selectSecondaryFilterProtocol(page, FilterProtocol.SAML); |
| 136 | + |
| 137 | + const protocols = await getTableProtocolColumn(page, tableName); |
| 138 | + |
| 139 | + expect(protocols).toContain(FilterProtocol.SAML); |
| 140 | + expect(protocols).not.toContain(FilterProtocol.OpenID); |
156 | 141 | }); |
157 | 142 |
|
158 | | - test.describe.serial("Client Scope modify list items", () => { |
159 | | - test.beforeEach(async ({ page }) => { |
160 | | - await login(page); |
161 | | - await goToClientScopes(page); |
162 | | - }); |
| 143 | + test("shows items on next page", async ({ page }) => { |
| 144 | + await using testBed = await createTestBed(); |
163 | 145 |
|
164 | | - test("should modify selected item type to Default", async ({ page }) => { |
165 | | - const itemName = clientScopeName + "0"; |
166 | | - await clickSelectRow(page, tableName, itemName); |
167 | | - await selectChangeType(page, FilterAssignedType.Default); |
168 | | - await assertNotificationMessage(page, "Scope mapping updated"); |
| 146 | + await login(page, { to: toClientScopes({ realm: testBed.realm }) }); |
169 | 147 |
|
170 | | - const rows = await getTableData(page, tableName); |
171 | | - const itemRow = rows.find((r) => r.includes(itemName)); |
172 | | - expect(itemRow).toContain(FilterAssignedType.Default); |
173 | | - }); |
| 148 | + await clickNextPageButton(page); |
| 149 | + const rows = await getTableData(page, tableName); |
| 150 | + expect(rows.length).toBeGreaterThan(1); |
174 | 151 | }); |
| 152 | +}); |
175 | 153 |
|
176 | | - test.describe.serial("Client Scope creation", () => { |
177 | | - test.beforeEach(async ({ page }) => { |
178 | | - await login(page); |
179 | | - await goToClientScopes(page); |
| 154 | +test.describe("Client scope operations", () => { |
| 155 | + const tableName = "Client scopes"; |
| 156 | + const clientScopeName = "client-scope-test"; |
| 157 | + |
| 158 | + test("modifies selected item type to Default", async ({ page }) => { |
| 159 | + const clientScopes = []; |
| 160 | + for (let i = 0; i < 5; i++) { |
| 161 | + clientScopes.push({ |
| 162 | + name: `${clientScopeName}${i}`, |
| 163 | + protocol: "openid-connect", |
| 164 | + }); |
| 165 | + } |
| 166 | + |
| 167 | + await using testBed = await createTestBed({ |
| 168 | + clientScopes, |
180 | 169 | }); |
181 | 170 |
|
182 | | - test("should fail creating client scope", async ({ page }) => { |
183 | | - await goToCreateItem(page); |
184 | | - await assertSaveButtonIsDisabled(page); |
| 171 | + await login(page, { to: toClientScopes({ realm: testBed.realm }) }); |
| 172 | + |
| 173 | + const itemName = `${clientScopeName}0`; |
| 174 | + await clickSelectRow(page, tableName, itemName); |
| 175 | + await selectChangeType(page, FilterAssignedType.Default); |
| 176 | + await assertNotificationMessage(page, "Scope mapping updated"); |
185 | 177 |
|
186 | | - await fillClientScopeData(page, "address"); |
187 | | - await page.getByTestId("save").click(); |
| 178 | + const rows = await getTableData(page, tableName); |
| 179 | + const itemRow = rows.find((r) => r.includes(itemName)); |
| 180 | + expect(itemRow).toContain(FilterAssignedType.Default); |
| 181 | + }); |
| 182 | +}); |
188 | 183 |
|
189 | | - await assertNotificationMessage( |
190 | | - page, |
191 | | - "Could not create client scope: 'Client Scope address already exists'", |
192 | | - ); |
| 184 | +test.describe("Client scope creation", () => { |
| 185 | + const placeHolder = "Search for client scope"; |
193 | 186 |
|
194 | | - await fillClientScopeData(page, ""); |
195 | | - await expect(page.getByTestId("save")).toBeDisabled(); |
196 | | - }); |
| 187 | + test("fails to create client scope with existing name", async ({ page }) => { |
| 188 | + await using testBed = await createTestBed(); |
197 | 189 |
|
198 | | - test("hides 'consent text' field when 'display consent' switch is disabled", async ({ |
| 190 | + await login(page, { to: toClientScopes({ realm: testBed.realm }) }); |
| 191 | + |
| 192 | + await goToCreateItem(page); |
| 193 | + await assertSaveButtonIsDisabled(page); |
| 194 | + |
| 195 | + await fillClientScopeData(page, "address"); |
| 196 | + await page.getByTestId("save").click(); |
| 197 | + |
| 198 | + await assertNotificationMessage( |
199 | 199 | page, |
200 | | - }) => { |
201 | | - await goToCreateItem(page); |
| 200 | + "Could not create client scope: 'Client Scope address already exists'", |
| 201 | + ); |
202 | 202 |
|
203 | | - await assertSwitchDisplayOnConsentScreenIsChecked(page); |
204 | | - await assertConsentInputIsVisible(page); |
| 203 | + await fillClientScopeData(page, ""); |
| 204 | + await expect(page.getByTestId("save")).toBeDisabled(); |
| 205 | + }); |
205 | 206 |
|
206 | | - await switchOffDisplayOnConsentScreen(page); |
| 207 | + test("hides consent text field when display consent switch is disabled", async ({ |
| 208 | + page, |
| 209 | + }) => { |
| 210 | + await using testBed = await createTestBed(); |
207 | 211 |
|
208 | | - await assertConsentInputIsVisible(page, true); |
209 | | - }); |
| 212 | + await login(page, { to: toClientScopes({ realm: testBed.realm }) }); |
210 | 213 |
|
211 | | - test("Client scope CRUD test", async ({ page }) => { |
212 | | - await assertRowExists(page, itemId, false); |
213 | | - await goToCreateItem(page); |
| 214 | + await goToCreateItem(page); |
214 | 215 |
|
215 | | - await fillClientScopeData(page, itemId); |
216 | | - await clickSaveButton(page); |
| 216 | + await assertSwitchDisplayOnConsentScreenIsChecked(page); |
| 217 | + await assertConsentInputIsVisible(page); |
217 | 218 |
|
218 | | - await assertNotificationMessage(page, "Client scope created"); |
| 219 | + await switchOffDisplayOnConsentScreen(page); |
219 | 220 |
|
220 | | - await goToClientScopes(page); |
| 221 | + await assertConsentInputIsVisible(page, true); |
| 222 | + }); |
221 | 223 |
|
222 | | - await searchItem(page, placeHolder, itemId); |
223 | | - await assertRowExists(page, itemId); |
224 | | - await clickRowKebabItem(page, itemId, "Delete"); |
| 224 | + test("creates and deletes a client scope", async ({ page }) => { |
| 225 | + await using testBed = await createTestBed(); |
225 | 226 |
|
226 | | - await confirmModal(page); |
227 | | - await assertNotificationMessage( |
228 | | - page, |
229 | | - "The client scope has been deleted", |
230 | | - ); |
231 | | - await assertRowExists(page, itemId, false); |
232 | | - }); |
| 227 | + await login(page, { to: toClientScopes({ realm: testBed.realm }) }); |
| 228 | + |
| 229 | + const itemId = "test-client-scope"; |
| 230 | + await assertRowExists(page, itemId, false); |
| 231 | + await goToCreateItem(page); |
| 232 | + |
| 233 | + await fillClientScopeData(page, itemId); |
| 234 | + await clickSaveButton(page); |
| 235 | + |
| 236 | + await assertNotificationMessage(page, "Client scope created"); |
| 237 | + |
| 238 | + await page |
| 239 | + .getByLabel("Breadcrumb") |
| 240 | + .getByRole("link", { name: "Client scopes" }) |
| 241 | + .click(); |
| 242 | + |
| 243 | + await searchItem(page, placeHolder, itemId); |
| 244 | + await assertRowExists(page, itemId); |
| 245 | + await clickRowKebabItem(page, itemId, "Delete"); |
| 246 | + |
| 247 | + await confirmModal(page); |
| 248 | + await assertNotificationMessage(page, "The client scope has been deleted"); |
| 249 | + await assertRowExists(page, itemId, false); |
233 | 250 | }); |
234 | 251 | }); |
0 commit comments