View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  package org.apache.syncope.fit.console;
20  
21  import static org.junit.jupiter.api.Assertions.assertNotNull;
22  import static org.junit.jupiter.api.Assertions.assertNull;
23  
24  import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
25  import org.apache.syncope.client.console.pages.Policies;
26  import org.apache.syncope.client.console.pages.Realms;
27  import org.apache.syncope.client.ui.commons.Constants;
28  import org.apache.wicket.Component;
29  import org.apache.wicket.markup.html.WebMarkupContainer;
30  import org.apache.wicket.markup.html.form.TextField;
31  import org.apache.wicket.util.tester.FormTester;
32  import org.junit.jupiter.api.BeforeEach;
33  import org.junit.jupiter.api.Test;
34  
35  public class PoliciesITCase extends AbstractConsoleITCase {
36  
37      @BeforeEach
38      public void login() {
39          doLogin(ADMIN_UNAME, ADMIN_PWD);
40          TESTER.clickLink("body:configurationLI:configurationUL:policiesLI:policies", false);
41          TESTER.assertRenderedPage(Policies.class);
42      }
43  
44      private static void createAccountPolicy(final String name) {
45          TESTER.clickLink("body:content:tabbedPanel:tabs-container:tabs:1:link");
46          TESTER.clickLink("body:content:tabbedPanel:panel:container:content:add");
47          TESTER.assertComponent("body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer", Modal.class);
48  
49          Component modal = TESTER.getComponentFromLastRenderedPage(
50                  "body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer");
51  
52          FormTester formTester = TESTER.newFormTester(
53                  "body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer:form");
54          formTester.setValue("content:fields:0:field:textField", name);
55          formTester.setValue("content:fields:1:field:spinner", "1");
56          formTester.setValue("content:fields:2:field:checkboxField", true);
57          formTester.setValue("content:fields:3:field:paletteField:recorder", "ws-target-resource-nopropagation4");
58  
59          TESTER.clickLink(
60                  "body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer:dialog:footer:inputs:0:submit");
61  
62          assertSuccessMessage();
63          TESTER.cleanupFeedbackMessages();
64  
65          closeCallBack(modal);
66  
67          TESTER.assertComponent("body:content:tabbedPanel:panel:container:content:"
68                  + "searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable", WebMarkupContainer.class);
69  
70          Component component = findComponentByProp("name",
71                  "body:content:tabbedPanel:panel:container:content:"
72                  + "searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable", name);
73  
74          assertNotNull(component);
75          TESTER.executeAjaxEvent(component.getPageRelativePath(), Constants.ON_CLICK);
76          TESTER.clickLink(
77                  "body:content:tabbedPanel:panel:outerObjectsRepeater:1:outer:container:content:"
78                  + "togglePanelContainer:container:actions:actions:actionRepeater:0:action:action");
79  
80          TESTER.assertComponent("body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer",
81                  Modal.class);
82  
83          TESTER.assertModelValue("body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer:form"
84                  + ":content:fields:0:field:textField", name);
85          TESTER.assertModelValue("body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer:form"
86                  + ":content:fields:1:field:spinner", 1);
87          TESTER.assertModelValue("body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer:form"
88                  + ":content:fields:2:field:checkboxField", true);
89          TESTER.assertModelValue("body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer:form"
90                  + ":content:fields:3:field:paletteField:recorder", "ws-target-resource-nopropagation4");
91  
92          TESTER.executeAjaxEvent(
93                  "body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer:dialog:footer:buttons:0:button",
94                  Constants.ON_CLICK);
95  
96          component = findComponentByProp("name", "body:content:tabbedPanel:panel:container:content:"
97                  + "searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable", name);
98          assertNotNull(component);
99      }
100 
101     private static void createPasswordPolicy(final String name) {
102         TESTER.clickLink("body:content:tabbedPanel:tabs-container:tabs:4:link");
103         TESTER.clickLink("body:content:tabbedPanel:panel:container:content:add");
104         TESTER.assertComponent("body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer", Modal.class);
105 
106         Component modal = TESTER.getComponentFromLastRenderedPage(
107                 "body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer");
108 
109         FormTester formTester = TESTER.newFormTester(
110                 "body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer:form");
111         formTester.setValue("content:fields:0:field:textField", name);
112         formTester.setValue("content:fields:1:field:spinner", "1");
113         formTester.setValue("content:fields:2:field:checkboxField", true);
114 
115         TESTER.clickLink(
116                 "body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer:dialog:footer:inputs:0:submit");
117 
118         assertSuccessMessage();
119         TESTER.cleanupFeedbackMessages();
120 
121         closeCallBack(modal);
122 
123         Component component = findComponentByProp("name",
124                 "body:content:tabbedPanel:panel:container:content:"
125                 + "searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable", name);
126 
127         assertNotNull(component);
128         TESTER.executeAjaxEvent(component.getPageRelativePath(), Constants.ON_CLICK);
129         TESTER.clickLink(
130                 "body:content:tabbedPanel:panel:outerObjectsRepeater:1:outer:container:content:"
131                 + "togglePanelContainer:container:actions:actions:actionRepeater:0:action:action");
132 
133         TESTER.assertComponent("body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer",
134                 Modal.class);
135 
136         TESTER.assertModelValue("body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer:form"
137                 + ":content:fields:0:field:textField", name);
138         TESTER.assertModelValue("body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer:form"
139                 + ":content:fields:1:field:spinner", 1);
140         TESTER.assertModelValue("body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer:form"
141                 + ":content:fields:2:field:checkboxField", true);
142 
143         TESTER.executeAjaxEvent(
144                 "body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer:dialog:footer:buttons:0:button",
145                 Constants.ON_CLICK);
146 
147         assertNotNull(findComponentByProp("name", "body:content:tabbedPanel:panel:container:content:"
148                 + "searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable", name));
149     }
150 
151     private static void createPullPolicy(final String name) {
152         TESTER.clickLink("body:content:tabbedPanel:tabs-container:tabs:6:link");
153         TESTER.clickLink("body:content:tabbedPanel:panel:container:content:add");
154         TESTER.assertComponent("body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer", Modal.class);
155 
156         Component modal = TESTER.getComponentFromLastRenderedPage(
157                 "body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer");
158 
159         FormTester formTester = TESTER.newFormTester(
160                 "body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer:form");
161         formTester.setValue("content:fields:0:field:textField", name);
162 
163         TESTER.executeAjaxEvent(
164                 "body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer:dialog:footer:inputs:0:submit",
165                 Constants.ON_CLICK);
166 
167         assertSuccessMessage();
168         TESTER.cleanupFeedbackMessages();
169 
170         closeCallBack(modal);
171 
172         Component component = findComponentByProp("name",
173                 "body:content:tabbedPanel:panel:container:content:"
174                 + "searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable", name);
175 
176         assertNotNull(component);
177         TESTER.executeAjaxEvent(component.getPageRelativePath(), Constants.ON_CLICK);
178         TESTER.clickLink(
179                 "body:content:tabbedPanel:panel:outerObjectsRepeater:1:outer:container:content:"
180                 + "togglePanelContainer:container:actions:actions:actionRepeater:0:action:action");
181 
182         TESTER.assertComponent("body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer",
183                 Modal.class);
184 
185         TESTER.assertModelValue("body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer:form"
186                 + ":content:fields:0:field:textField", name);
187 
188         TESTER.executeAjaxEvent(
189                 "body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer:dialog:footer:buttons:0:button",
190                 Constants.ON_CLICK);
191 
192         assertNotNull(findComponentByProp("name", "body:content:tabbedPanel:panel:container:content:"
193                 + "searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable", name));
194     }
195 
196     private static void deleteAccountPolicy(final String name) {
197         TESTER.clickLink("body:content:tabbedPanel:tabs-container:tabs:1:link");
198         Component component = findComponentByProp("name",
199                 "body:content:tabbedPanel:panel:container:content:"
200                 + "searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable", name);
201 
202         assertNotNull(component);
203         TESTER.executeAjaxEvent(component.getPageRelativePath(), Constants.ON_CLICK);
204         TESTER.getRequest().addParameter("confirm", "true");
205         TESTER.clickLink(TESTER.getComponentFromLastRenderedPage(
206                 "body:content:tabbedPanel:panel:outerObjectsRepeater:1:outer:container:content:"
207                 + "togglePanelContainer:container:actions:actions:actionRepeater:4:action:action"));
208 
209         TESTER.executeAjaxEvent(TESTER.getComponentFromLastRenderedPage(
210                 "body:content:tabbedPanel:panel:outerObjectsRepeater:1:outer:container:content:"
211                 + "togglePanelContainer:container:actions:actions:actionRepeater:4:action:action"),
212                 Constants.ON_CLICK);
213 
214         assertSuccessMessage();
215         TESTER.cleanupFeedbackMessages();
216 
217         assertNull(findComponentByProp("name", "body:content:tabbedPanel:panel:container:content:"
218                 + "searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable", name));
219     }
220 
221     private static void deletePasswordPolicy(final String name) {
222         TESTER.clickLink("body:content:tabbedPanel:tabs-container:tabs:4:link");
223         Component component = findComponentByProp("name",
224                 "body:content:tabbedPanel:panel:container:content:"
225                 + "searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable", name);
226 
227         assertNotNull(component);
228         TESTER.executeAjaxEvent(component.getPageRelativePath(), Constants.ON_CLICK);
229         TESTER.getRequest().addParameter("confirm", "true");
230         TESTER.clickLink(TESTER.getComponentFromLastRenderedPage(
231                 "body:content:tabbedPanel:panel:outerObjectsRepeater:1:outer:container:content:"
232                 + "togglePanelContainer:container:actions:actions:actionRepeater:4:action:action"));
233 
234         TESTER.executeAjaxEvent(TESTER.getComponentFromLastRenderedPage(
235                 "body:content:tabbedPanel:panel:outerObjectsRepeater:1:outer:container:content:"
236                 + "togglePanelContainer:container:actions:actions:actionRepeater:4:action:action"),
237                 Constants.ON_CLICK);
238 
239         assertSuccessMessage();
240         TESTER.cleanupFeedbackMessages();
241 
242         assertNull(findComponentByProp("name", "body:content:tabbedPanel:panel:container:content:"
243                 + "searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable", name));
244     }
245 
246     private static void deletePullPolicy(final String name) {
247         TESTER.clickLink("body:content:tabbedPanel:tabs-container:tabs:6:link");
248         Component component = findComponentByProp("name",
249                 "body:content:tabbedPanel:panel:container:content:"
250                 + "searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable", name);
251 
252         assertNotNull(component);
253         TESTER.executeAjaxEvent(component.getPageRelativePath(), Constants.ON_CLICK);
254         TESTER.getRequest().addParameter("confirm", "true");
255         TESTER.clickLink(TESTER.getComponentFromLastRenderedPage(
256                 "body:content:tabbedPanel:panel:outerObjectsRepeater:1:outer:container:content:"
257                 + "togglePanelContainer:container:actions:actions:actionRepeater:4:action:action"));
258 
259         TESTER.executeAjaxEvent(TESTER.getComponentFromLastRenderedPage(
260                 "body:content:tabbedPanel:panel:outerObjectsRepeater:1:outer:container:content:"
261                 + "togglePanelContainer:container:actions:actions:actionRepeater:4:action:action"),
262                 Constants.ON_CLICK);
263 
264         assertSuccessMessage();
265         TESTER.cleanupFeedbackMessages();
266 
267         assertNull(findComponentByProp("name", "body:content:tabbedPanel:panel:container:content:"
268                 + "searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable", name));
269     }
270 
271     @Test
272     public void read() {
273         TESTER.clickLink("body:content:tabbedPanel:tabs-container:tabs:1:link");
274         assertNotNull(findComponentByProp("name", "body:content:tabbedPanel:panel:container:content:"
275                 + "searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable", "an account policy"));
276     }
277 
278     @Test
279     public void createDeleteAccountPolicy() {
280         String name = "My Test Account Policy";
281         createAccountPolicy(name);
282         deleteAccountPolicy(name);
283     }
284 
285     @Test
286     public void cloneDeleteAccountPolicy() {
287         String name = "My Test Account Policy to be cloned";
288         createAccountPolicy(name);
289 
290         Component component = findComponentByProp("name",
291                 "body:content:tabbedPanel:panel:container:content:"
292                 + "searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable", name);
293 
294         assertNotNull(component);
295         TESTER.executeAjaxEvent(component.getPageRelativePath(), Constants.ON_CLICK);
296         TESTER.clickLink(
297                 "body:content:tabbedPanel:panel:outerObjectsRepeater:1:outer:container:content:"
298                 + "togglePanelContainer:container:actions:actions:actionRepeater:1:action:action");
299 
300         TESTER.assertComponent("body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer",
301                 Modal.class);
302 
303         Component modal = TESTER.getComponentFromLastRenderedPage(
304                 "body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer");
305 
306         FormTester formTester = TESTER.newFormTester(
307                 "body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer:form");
308         formTester.setValue("content:fields:0:field:textField", name + '2');
309 
310         TESTER.clickLink(
311                 "body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer:dialog:footer:inputs:0:submit");
312 
313         assertSuccessMessage();
314         TESTER.cleanupFeedbackMessages();
315 
316         closeCallBack(modal);
317 
318         assertNotNull(findComponentByProp("name", "body:content:tabbedPanel:panel:container:content:"
319                 + "searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable", name));
320 
321         deleteAccountPolicy(name);
322 
323         assertNotNull(findComponentByProp("name", "body:content:tabbedPanel:panel:container:content:"
324                 + "searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable", name + '2'));
325 
326         deleteAccountPolicy(name + '2');
327     }
328 
329     @Test
330     public void createDeletePasswordPolicy() {
331         String name = "My Test Password Policy";
332         createPasswordPolicy(name);
333         deletePasswordPolicy(name);
334     }
335 
336     @Test
337     public void cloneDeletePasswordPolicy() {
338         String name = "My Test Password Policy to be cloned";
339         createPasswordPolicy(name);
340 
341         Component component = findComponentByProp("name",
342                 "body:content:tabbedPanel:panel:container:content:"
343                 + "searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable", name);
344 
345         assertNotNull(component);
346         TESTER.executeAjaxEvent(component.getPageRelativePath(), Constants.ON_CLICK);
347         TESTER.clickLink(
348                 "body:content:tabbedPanel:panel:outerObjectsRepeater:1:outer:container:content:"
349                 + "togglePanelContainer:container:actions:actions:actionRepeater:1:action:action");
350 
351         TESTER.assertComponent("body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer",
352                 Modal.class);
353 
354         Component modal = TESTER.getComponentFromLastRenderedPage(
355                 "body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer");
356 
357         FormTester formTester = TESTER.newFormTester(
358                 "body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer:form");
359         formTester.setValue("content:fields:0:field:textField", name + '2');
360 
361         TESTER.clickLink(
362                 "body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer:dialog:footer:inputs:0:submit");
363 
364         assertSuccessMessage();
365         TESTER.cleanupFeedbackMessages();
366 
367         closeCallBack(modal);
368 
369         assertNotNull(findComponentByProp("name", "body:content:tabbedPanel:panel:container:content:"
370                 + "searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable", name));
371 
372         deletePasswordPolicy(name);
373 
374         assertNotNull(findComponentByProp("name", "body:content:tabbedPanel:panel:container:content:"
375                 + "searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable", name + '2'));
376 
377         deletePasswordPolicy(name + '2');
378     }
379 
380     @Test
381     public void createDeletePullPolicy() {
382         String name = "My Test Pull Policy";
383         createPullPolicy(name);
384         deletePullPolicy(name);
385     }
386 
387     @Test
388     public void cloneDeletePullPolicy() {
389         String name = "My Test Pull Policy to be cloned";
390         createPullPolicy(name);
391 
392         Component component = findComponentByProp("name",
393                 "body:content:tabbedPanel:panel:container:content:"
394                 + "searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable", name);
395 
396         assertNotNull(component);
397         TESTER.executeAjaxEvent(component.getPageRelativePath(), Constants.ON_CLICK);
398         TESTER.clickLink(
399                 "body:content:tabbedPanel:panel:outerObjectsRepeater:1:outer:container:content:"
400                 + "togglePanelContainer:container:actions:actions:actionRepeater:1:action:action");
401 
402         TESTER.assertComponent("body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer",
403                 Modal.class);
404 
405         Component modal = TESTER.getComponentFromLastRenderedPage(
406                 "body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer");
407 
408         FormTester formTester = TESTER.newFormTester(
409                 "body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer:form");
410         formTester.setValue("content:fields:0:field:textField", name + '2');
411 
412         TESTER.clickLink(
413                 "body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer:dialog:footer:inputs:0:submit");
414 
415         assertSuccessMessage();
416         TESTER.cleanupFeedbackMessages();
417 
418         closeCallBack(modal);
419 
420         assertNotNull(findComponentByProp("name", "body:content:tabbedPanel:panel:container:content:"
421                 + "searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable", name));
422 
423         deletePullPolicy(name);
424 
425         assertNotNull(findComponentByProp("name", "body:content:tabbedPanel:panel:container:content:"
426                 + "searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable", name + '2'));
427 
428         deletePullPolicy(name + '2');
429     }
430 
431     @Test
432     public void createUpdateDeleteAccountPolicy() {
433         String name = "Account Policy To Be Updated";
434         createAccountPolicy(name);
435 
436         Component component = findComponentByProp("name",
437                 "body:content:tabbedPanel:panel:container:content:"
438                 + "searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable", name);
439 
440         assertNotNull(component);
441         TESTER.executeAjaxEvent(component.getPageRelativePath(), Constants.ON_CLICK);
442         TESTER.clickLink(
443                 "body:content:tabbedPanel:panel:outerObjectsRepeater:1:outer:container:content:"
444                 + "togglePanelContainer:container:actions:actions:actionRepeater:0:action:action");
445 
446         TESTER.assertComponent("body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer",
447                 Modal.class);
448 
449         Component modal = TESTER.getComponentFromLastRenderedPage(
450                 "body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer");
451 
452         FormTester formTester = TESTER.newFormTester(
453                 "body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer:form");
454         formTester.setValue("content:fields:1:field:spinner", "2");
455 
456         TESTER.clickLink(
457                 "body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer:dialog:footer:inputs:0:submit");
458 
459         assertSuccessMessage();
460         TESTER.cleanupFeedbackMessages();
461 
462         closeCallBack(modal);
463 
464         component = findComponentByProp("name", "body:content:tabbedPanel:panel:container:content:"
465                 + "searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable", name);
466 
467         assertNotNull(component);
468         TESTER.executeAjaxEvent(component.getPageRelativePath(), Constants.ON_CLICK);
469         TESTER.clickLink(
470                 "body:content:tabbedPanel:panel:outerObjectsRepeater:1:outer:container:content:"
471                 + "togglePanelContainer:container:actions:actions:actionRepeater:0:action:action");
472 
473         TESTER.assertComponent("body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer",
474                 Modal.class);
475 
476         TESTER.assertModelValue("body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer:form"
477                 + ":content:fields:1:field:spinner", 2);
478 
479         TESTER.executeAjaxEvent(
480                 "body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer:dialog:footer:buttons:0:button",
481                 Constants.ON_CLICK);
482 
483         deleteAccountPolicy(name);
484     }
485 
486     private static void composeDefaultAccountPolicy(final String policyDescription) {
487         Component component = findComponentByProp("name",
488                 "body:content:tabbedPanel:panel:container:content:"
489                 + "searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable", policyDescription);
490 
491         assertNotNull(component);
492         TESTER.executeAjaxEvent(component.getPageRelativePath(), Constants.ON_CLICK);
493         TESTER.clickLink(
494                 "body:content:tabbedPanel:panel:outerObjectsRepeater:1:outer:container:content:"
495                 + "togglePanelContainer:container:actions:actions:actionRepeater:2:action:action");
496 
497         TESTER.assertComponent("body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer", Modal.class);
498 
499         Component modal = TESTER.getComponentFromLastRenderedPage(
500                 "body:content:tabbedPanel:panel:outerObjectsRepeater:4:outer");
501 
502         TESTER.clickLink(
503                 "body:content:tabbedPanel:panel:outerObjectsRepeater:4:outer:form:content:container:content:add");
504 
505         FormTester formTester = TESTER.newFormTester(
506                 "body:content:tabbedPanel:panel:outerObjectsRepeater:4:"
507                 + "outer:form:content:container:content:wizard:form");
508         formTester.setValue("view:rule:dropDownChoiceField", "0");
509         formTester.submit("buttons:next");
510 
511         formTester = TESTER.newFormTester(
512                 "body:content:tabbedPanel:panel:outerObjectsRepeater:4:"
513                 + "outer:form:content:container:content:wizard:form");
514         formTester.submit("buttons:finish");
515 
516         assertSuccessMessage();
517         TESTER.cleanupFeedbackMessages();
518 
519         TESTER.clickLink(
520                 "body:content:tabbedPanel:panel:outerObjectsRepeater:4:outer:form:content:container:content:utility");
521 
522         closeCallBack(modal);
523     }
524 
525     @Test
526     public void createComposeDeleteAccountPolicy() {
527         String name = "Account Policy To Be Composed";
528         createAccountPolicy(name);
529         composeDefaultAccountPolicy(name);
530         deleteAccountPolicy(name);
531     }
532 
533     @Test
534     public void createUpdateDeletePasswordPolicy() {
535         String name = "Password Policy To Be Updated";
536         createPasswordPolicy(name);
537 
538         Component component = findComponentByProp("name",
539                 "body:content:tabbedPanel:panel:container:content:"
540                 + "searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable", name);
541 
542         assertNotNull(component);
543         TESTER.executeAjaxEvent(component.getPageRelativePath(), Constants.ON_CLICK);
544         TESTER.clickLink(
545                 "body:content:tabbedPanel:panel:outerObjectsRepeater:1:outer:container:content:"
546                 + "togglePanelContainer:container:actions:actions:actionRepeater:0:action:action");
547 
548         TESTER.assertComponent("body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer",
549                 Modal.class);
550 
551         Component modal = TESTER.getComponentFromLastRenderedPage(
552                 "body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer");
553 
554         FormTester formTester = TESTER.newFormTester(
555                 "body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer:form");
556         formTester.setValue("content:fields:1:field:spinner", "2");
557 
558         TESTER.clickLink(
559                 "body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer:dialog:footer:inputs:0:submit");
560 
561         assertSuccessMessage();
562         TESTER.cleanupFeedbackMessages();
563 
564         closeCallBack(modal);
565 
566         component = findComponentByProp("name", "body:content:tabbedPanel:panel:container:content:"
567                 + "searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable", name);
568 
569         assertNotNull(component);
570         TESTER.executeAjaxEvent(component.getPageRelativePath(), Constants.ON_CLICK);
571         TESTER.clickLink(
572                 "body:content:tabbedPanel:panel:outerObjectsRepeater:1:outer:container:content:"
573                 + "togglePanelContainer:container:actions:actions:actionRepeater:0:action:action");
574 
575         TESTER.assertComponent("body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer",
576                 Modal.class);
577 
578         TESTER.assertModelValue("body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer:form"
579                 + ":content:fields:1:field:spinner", 2);
580 
581         TESTER.executeAjaxEvent(
582                 "body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer:dialog:footer:buttons:0:button",
583                 Constants.ON_CLICK);
584 
585         deletePasswordPolicy(name);
586     }
587 
588     @Test
589     public void createComposeDeletePasswordPolicy() {
590         String name = "Password Policy To Be Composed";
591         createPasswordPolicy(name);
592 
593         Component component = findComponentByProp("name",
594                 "body:content:tabbedPanel:panel:container:content:"
595                 + "searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable", name);
596 
597         assertNotNull(component);
598         TESTER.executeAjaxEvent(component.getPageRelativePath(), Constants.ON_CLICK);
599         TESTER.clickLink(
600                 "body:content:tabbedPanel:panel:outerObjectsRepeater:1:outer:container:content:"
601                 + "togglePanelContainer:container:actions:actions:actionRepeater:2:action:action");
602 
603         TESTER.assertComponent("body:content:tabbedPanel:panel:outerObjectsRepeater:4:outer",
604                 Modal.class);
605 
606         Component modal = TESTER.getComponentFromLastRenderedPage(
607                 "body:content:tabbedPanel:panel:outerObjectsRepeater:4:outer");
608 
609         TESTER.clickLink(
610                 "body:content:tabbedPanel:panel:outerObjectsRepeater:4:outer:form:content:container:content:add");
611 
612         FormTester formTester = TESTER.newFormTester(
613                 "body:content:tabbedPanel:panel:outerObjectsRepeater:4:"
614                 + "outer:form:content:container:content:wizard:form");
615         formTester.setValue("view:rule:dropDownChoiceField", "0");
616         formTester.submit("buttons:next");
617 
618         formTester = TESTER.newFormTester("body:content:tabbedPanel:panel:outerObjectsRepeater:4:"
619                 + "outer:form:content:container:content:wizard:form");
620         formTester.submit("buttons:finish");
621 
622         assertSuccessMessage();
623         TESTER.cleanupFeedbackMessages();
624 
625         TESTER.clickLink(
626                 "body:content:tabbedPanel:panel:outerObjectsRepeater:4:outer:form:content:container:content:utility");
627 
628         closeCallBack(modal);
629 
630         deletePasswordPolicy(name);
631     }
632 
633     @Test
634     public void createUpdateDeletePullPolicy() {
635         String name = "Pull Policy To Be Updated";
636         createPullPolicy(name);
637 
638         Component component = findComponentByProp("name",
639                 "body:content:tabbedPanel:panel:container:content:"
640                 + "searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable", name);
641 
642         Component modal = TESTER.getComponentFromLastRenderedPage(
643                 "body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer");
644 
645         assertNotNull(component);
646         TESTER.executeAjaxEvent(component.getPageRelativePath(), Constants.ON_CLICK);
647         TESTER.clickLink(
648                 "body:content:tabbedPanel:panel:outerObjectsRepeater:1:outer:container:content:"
649                 + "togglePanelContainer:container:actions:actions:actionRepeater:0:action:action");
650 
651         TESTER.assertComponent("body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer",
652                 Modal.class);
653 
654         FormTester formTester = TESTER.newFormTester(
655                 "body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer:form");
656         formTester.setValue("content:fields:0:field:textField", name + '2');
657 
658         TESTER.clickLink(
659                 "body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer:dialog:footer:inputs:0:submit");
660 
661         assertSuccessMessage();
662         TESTER.cleanupFeedbackMessages();
663 
664         closeCallBack(modal);
665 
666         component = findComponentByProp("name", "body:content:tabbedPanel:panel:container:content:"
667                 + "searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable", name + '2');
668 
669         assertNotNull(component);
670         TESTER.executeAjaxEvent(component.getPageRelativePath(), Constants.ON_CLICK);
671         TESTER.clickLink(
672                 "body:content:tabbedPanel:panel:outerObjectsRepeater:1:outer:container:content:"
673                 + "togglePanelContainer:container:actions:actions:actionRepeater:0:action:action");
674 
675         TESTER.assertComponent("body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer",
676                 Modal.class);
677 
678         TESTER.assertModelValue("body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer:form"
679                 + ":content:fields:0:field:textField", name + '2');
680 
681         TESTER.executeAjaxEvent(
682                 "body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer:dialog:footer:buttons:0:button",
683                 Constants.ON_CLICK);
684 
685         deletePullPolicy(name + '2');
686     }
687 
688     @Test
689     public void createComposeDeletePullPolicy() {
690         String name = "Pull Policy To Be Composed";
691         createPullPolicy(name);
692 
693         Component component = findComponentByProp("name",
694                 "body:content:tabbedPanel:panel:container:content:"
695                 + "searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable", name);
696         assertNotNull(component);
697 
698         TESTER.executeAjaxEvent(component.getPageRelativePath(), Constants.ON_CLICK);
699         TESTER.clickLink(
700                 "body:content:tabbedPanel:panel:outerObjectsRepeater:1:outer:container:content:"
701                 + "togglePanelContainer:container:actions:actions:actionRepeater:2:action:action");
702 
703         TESTER.assertComponent("body:content:tabbedPanel:panel:outerObjectsRepeater:5:outer",
704                 Modal.class);
705 
706         Component modal = TESTER.getComponentFromLastRenderedPage(
707                 "body:content:tabbedPanel:panel:outerObjectsRepeater:5:outer");
708 
709         FormTester formTester = TESTER.newFormTester(
710                 "body:content:tabbedPanel:panel:outerObjectsRepeater:5:outer:form");
711 
712         TESTER.executeAjaxEvent(
713                 "body:content:tabbedPanel:panel:outerObjectsRepeater:5:outer:form:content:"
714                 + "correlationRules:multiValueContainer:innerForm:content:panelPlus:add", Constants.ON_CLICK);
715 
716         component = findComponentById(
717                 "body:content:tabbedPanel:panel:outerObjectsRepeater:5:outer:form:content:"
718                 + "correlationRules:multiValueContainer:innerForm:content:view:0:panel:rule",
719                 "dropDownChoiceField");
720         assertNotNull(component);
721 
722         formTester.setValue(component, "0");
723         TESTER.executeAjaxEvent(component, Constants.ON_CHANGE);
724         formTester.setValue(component, "0");
725 
726         TESTER.clickLink(
727                 "body:content:tabbedPanel:panel:outerObjectsRepeater:5:outer:dialog:footer:inputs:0:submit");
728 
729         assertSuccessMessage();
730         TESTER.cleanupFeedbackMessages();
731 
732         closeCallBack(modal);
733 
734         deletePullPolicy(name);
735     }
736 
737     @Test
738     public void issueSYNCOPE1030() {
739         String name = "SYNCOPE-1030";
740         // Create account policy
741         createAccountPolicy(name);
742         composeDefaultAccountPolicy(name);
743 
744         // goto realms
745         TESTER.clickLink("body:realmsLI:realms", false);
746         TESTER.assertRenderedPage(Realms.class);
747 
748         // edit root realm
749         TESTER.clickLink(
750                 "body:content:body:container:content:tabbedPanel:panel:actions:actions:actionRepeater:1:action:action");
751         TESTER.assertComponent("body:content:body:outerObjectsRepeater:0:outer", Modal.class);
752 
753         // set new account policy
754         TESTER.assertLabel("body:content:body:outerObjectsRepeater:0:outer:form:content:form:view:details:container:"
755                 + "policies:1:field-label", "Account Policy");
756 
757         FormTester formTester = TESTER.newFormTester(
758                 "body:content:body:outerObjectsRepeater:0:outer:form:content:form");
759         formTester.select("view:details:container:policies:1:dropDownChoiceField", 0);
760         formTester.submit("buttons:finish");
761 
762         assertSuccessMessage();
763         TESTER.cleanupFeedbackMessages();
764 
765         TESTER.executeAjaxEvent(
766                 "body:content:body:outerObjectsRepeater:0:outer:form:content:action:actionRepeater:0:action:action",
767                 Constants.ON_CLICK);
768 
769         // create user with a valid account name
770         TESTER.clickLink("body:content:body:container:content:tabbedPanel:tabs-container:tabs:1:link");
771 
772         Component component = findComponentByProp("username",
773                 "body:content:body:container:content:tabbedPanel:panel:searchResult:container:content:"
774                 + ":searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable", "rossini");
775         assertNotNull(component);
776 
777         TESTER.executeAjaxEvent(component.getPageRelativePath(), Constants.ON_CLICK);
778         TESTER.clickLink("body:content:body:container:content:tabbedPanel:panel:searchResult:outerObjectsRepeater:"
779                 + "1:outer:container:content:togglePanelContainer:container:actions:actions:actionRepeater:10:"
780                 + "action:action");
781 
782         TESTER.assertComponent(
783                 "body:content:body:container:content:tabbedPanel:panel:searchResult:"
784                 + "outerObjectsRepeater:0:outer:form:content:form:view:username:textField",
785                 TextField.class);
786 
787         formTester = TESTER.newFormTester(
788                 "body:content:body:container:content:tabbedPanel:panel:searchResult:"
789                 + "outerObjectsRepeater:0:outer:form:content:form");
790         assertNotNull(formTester);
791         formTester.submit("buttons:next");
792 
793         formTester = TESTER.newFormTester(
794                 "body:content:body:container:content:tabbedPanel:panel:searchResult:"
795                 + "outerObjectsRepeater:0:outer:form:content:form");
796         assertNotNull(formTester);
797         formTester.submit("buttons:next");
798 
799         formTester = TESTER.newFormTester(
800                 "body:content:body:container:content:tabbedPanel:panel:searchResult:"
801                 + "outerObjectsRepeater:0:outer:form:content:form");
802         assertNotNull(formTester);
803         formTester.submit("buttons:next");
804 
805         formTester = TESTER.newFormTester(
806                 "body:content:body:container:content:tabbedPanel:panel:searchResult:"
807                 + "outerObjectsRepeater:0:outer:form:content:form");
808         assertNotNull(formTester);
809 
810         formTester.setValue("view:plainSchemas:tabs:0:body:content:schemas:6:panel:textField", "rossini 1030");
811         formTester.setValue("view:plainSchemas:tabs:0:body:content:schemas:14:panel:textField", "ross1030@apace.org");
812         formTester.submit("buttons:finish");
813 
814         assertSuccessMessage();
815         TESTER.cleanupFeedbackMessages();
816 
817         TESTER.clickLink("body:content:body:container:content:tabbedPanel:panel:searchResult:"
818                 + "outerObjectsRepeater:0:outer:form:content:action:actionRepeater:0:action:action");
819 
820         component = findComponentByProp("username",
821                 "body:content:body:container:content:tabbedPanel:panel:searchResult:container:content:"
822                 + ":searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable", "rossini_clone");
823         assertNotNull(component);
824 
825         // delete the new user
826         TESTER.executeAjaxEvent(component.getPageRelativePath(), Constants.ON_CLICK);
827 
828         TESTER.getRequest().addParameter("confirm", "true");
829         TESTER.clickLink(TESTER.getComponentFromLastRenderedPage(
830                 "body:content:body:container:content:tabbedPanel:panel:searchResult:outerObjectsRepeater:"
831                 + "1:outer:container:content:togglePanelContainer:container:actions:actions:actionRepeater:8:"
832                 + "action:action"));
833 
834         TESTER.executeAjaxEvent(TESTER.getComponentFromLastRenderedPage(
835                 "body:content:body:container:content:tabbedPanel:panel:searchResult:outerObjectsRepeater:"
836                 + "1:outer:container:content:togglePanelContainer:container:actions:actions:actionRepeater:11:"
837                 + "action:action"), Constants.ON_CLICK);
838 
839         assertSuccessMessage();
840         TESTER.cleanupFeedbackMessages();
841 
842         component = findComponentByProp("username",
843                 "body:content:body:container:content:tabbedPanel:panel:searchResult:container:content:"
844                 + "searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable", "rossini_clone");
845         assertNull(component);
846 
847         // delete default policy
848         TESTER.clickLink("body:configurationLI:configurationUL:policiesLI:policies", false);
849         TESTER.assertRenderedPage(Policies.class);
850         deleteAccountPolicy(name);
851     }
852 }