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.assertEquals;
22  import static org.junit.jupiter.api.Assertions.assertNotNull;
23  import static org.junit.jupiter.api.Assertions.assertNull;
24  
25  import java.util.Calendar;
26  import org.apache.syncope.client.console.wicket.markup.html.form.IndicatingOnConfirmAjaxLink;
27  import org.apache.syncope.client.ui.commons.Constants;
28  import org.apache.wicket.Component;
29  import org.apache.wicket.markup.html.basic.Label;
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 UsersITCase extends AbstractConsoleITCase {
36  
37      private static final String TAB_PANEL = "body:content:body:container:content:tabbedPanel:panel:searchResult:";
38  
39      private static final String CONTAINER = TAB_PANEL + "container:content:";
40  
41      @BeforeEach
42      public void login() {
43          doLogin(ADMIN_UNAME, ADMIN_PWD);
44      }
45  
46      @Test
47      public void filteredSearch() {
48          TESTER.clickLink("body:realmsLI:realms", false);
49          TESTER.clickLink("body:content:body:container:content:tabbedPanel:tabs-container:tabs:1:link");
50  
51          TESTER.clickLink(
52                  "body:content:body:container:content:tabbedPanel:panel:accordionPanel:tabs:0:title");
53  
54          TESTER.executeAjaxEvent(
55                  "body:content:body:container:content:tabbedPanel:panel:accordionPanel:tabs:0:body:"
56                  + "content:searchFormContainer:search:multiValueContainer:innerForm:content:view:0:panelPlus:add",
57                  Constants.ON_CLICK);
58  
59          TESTER.assertComponent(
60                  "body:content:body:container:content:tabbedPanel:panel:accordionPanel:tabs:0:body:content:"
61                  + "searchFormContainer:search:multiValueContainer:innerForm:content:view:0:panel:container:value:"
62                  + "textField", TextField.class);
63          TESTER.assertComponent(
64                  "body:content:body:container:content:tabbedPanel:panel:accordionPanel:tabs:0:body:content:"
65                  + "searchFormContainer:search:multiValueContainer:innerForm:content:view:1:panel:container:value:"
66                  + "textField", TextField.class);
67      }
68  
69      @Test
70      public void forceChangePassword() {
71          TESTER.clickLink("body:realmsLI:realms", false);
72          TESTER.clickLink("body:content:body:container:content:tabbedPanel:tabs-container:tabs:1:link");
73  
74          Component component = findComponentByProp("username", CONTAINER
75                  + ":searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable", "verdi");
76          assertNotNull(component);
77  
78          TESTER.executeAjaxEvent(component.getPageRelativePath(), Constants.ON_CLICK);
79          TESTER.clickLink(TAB_PANEL
80                  + "outerObjectsRepeater:1:outer:container:content:togglePanelContainer:container:"
81                  + "actions:actions:actionRepeater:1:action:action");
82  
83          assertSuccessMessage();
84      }
85  
86      @Test
87      public void clickToCloneUser() {
88          TESTER.clickLink("body:realmsLI:realms", false);
89          TESTER.clickLink("body:content:body:container:content:tabbedPanel:tabs-container:tabs:1:link");
90  
91          Component component = findComponentByProp("username", CONTAINER
92                  + ":searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable", "rossini");
93          assertNotNull(component);
94  
95          TESTER.executeAjaxEvent(component.getPageRelativePath(), Constants.ON_CLICK);
96          TESTER.clickLink(TAB_PANEL + "outerObjectsRepeater:1:outer:container:content:togglePanelContainer:container:"
97                  + "actions:actions:actionRepeater:10:action:action");
98  
99          TESTER.assertComponent(TAB_PANEL
100                 + "outerObjectsRepeater:0:outer:form:content:form:view:username:textField",
101                 TextField.class);
102 
103         FormTester formTester = TESTER.newFormTester(TAB_PANEL
104                 + "outerObjectsRepeater:0:outer:form:content:form");
105         assertNotNull(formTester);
106 
107         formTester.submit("buttons:cancel");
108     }
109 
110     @Test
111     public void editRelationships() {
112         TESTER.clickLink("body:realmsLI:realms", false);
113         TESTER.clickLink("body:content:body:container:content:tabbedPanel:tabs-container:tabs:1:link");
114 
115         Component component = findComponentByProp("username", CONTAINER
116                 + ":searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable", "puccini");
117         assertNotNull(component);
118 
119         TESTER.executeAjaxEvent(component.getPageRelativePath(), Constants.ON_CLICK);
120         TESTER.clickLink(TAB_PANEL
121                 + "outerObjectsRepeater:1:outer:container:content:togglePanelContainer:container:"
122                 + "actions:actions:actionRepeater:0:action:action");
123 
124         TESTER.assertComponent(TAB_PANEL
125                 + "outerObjectsRepeater:0:outer:form:content:form:view:username:textField",
126                 TextField.class);
127 
128         FormTester formTester = TESTER.newFormTester(TAB_PANEL
129                 + "outerObjectsRepeater:0:outer:form:content:form");
130         assertNotNull(formTester);
131 
132         formTester.submit("buttons:next");
133 
134         formTester = TESTER.newFormTester(TAB_PANEL + "outerObjectsRepeater:0:outer:form:content:form");
135         assertNotNull(formTester);
136         formTester.submit("buttons:next");
137 
138         formTester = TESTER.newFormTester(TAB_PANEL + "outerObjectsRepeater:0:outer:form:content:form");
139         assertNotNull(formTester);
140         formTester.submit("buttons:next");
141 
142         formTester = TESTER.newFormTester(TAB_PANEL + "outerObjectsRepeater:0:outer:form:content:form");
143         assertNotNull(formTester);
144         formTester.submit("buttons:next");
145 
146         formTester = TESTER.newFormTester(TAB_PANEL + "outerObjectsRepeater:0:outer:form:content:form");
147         assertNotNull(formTester);
148         formTester.submit("buttons:next");
149 
150         formTester = TESTER.newFormTester(TAB_PANEL + "outerObjectsRepeater:0:outer:form:content:form");
151         assertNotNull(formTester);
152         formTester.submit("buttons:next");
153 
154         formTester = TESTER.newFormTester(TAB_PANEL + "outerObjectsRepeater:0:outer:form:content:form");
155         assertNotNull(formTester);
156         formTester.submit("buttons:next");
157 
158         TESTER.executeAjaxEvent(TAB_PANEL
159                 + "outerObjectsRepeater:0:outer:form:content:form:view:relationships:actions:"
160                 + "actionRepeater:0:action:action", Constants.ON_CLICK);
161 
162         formTester = TESTER.newFormTester(TAB_PANEL + "outerObjectsRepeater:0:outer:form:content:form");
163         assertNotNull(formTester);
164 
165         formTester.setValue("view:relationships:specification:type:dropDownChoiceField", "1");
166         TESTER.executeAjaxEvent(TAB_PANEL
167                 + "outerObjectsRepeater:0:outer:form:content:form:view:relationships:"
168                 + "specification:type:dropDownChoiceField", Constants.ON_CHANGE);
169         // The ON_CHANGE above should enable this component, but it doesn't; doing it by hand
170         Component otherType = findComponentById(
171                 TAB_PANEL + "outerObjectsRepeater:0:outer:form:content:form:view:relationships:specification",
172                 "otherType");
173         assertNotNull(otherType);
174         otherType.setEnabled(true);
175 
176         formTester.setValue("view:relationships:specification:otherType:dropDownChoiceField", "PRINTER");
177         TESTER.executeAjaxEvent(TAB_PANEL
178                 + "outerObjectsRepeater:0:outer:form:content:form:view:relationships:"
179                 + "specification:otherType:dropDownChoiceField", Constants.ON_CHANGE);
180 
181         component = findComponentByProp("name", TAB_PANEL + "outerObjectsRepeater:"
182                 + "0:outer:form:content:form:view:relationships:specification:searchPanelContainer:searchPanel:"
183                 + "searchResultPanel:container:content:searchContainer:resultTable:tablePanel:groupForm:checkgroup:"
184                 + "dataTable:body:rows:1:cells:2:cell", "Canon MF 8030cn");
185         assertNotNull(component);
186 
187         formTester.submit("buttons:cancel");
188     }
189 
190     @Test
191     public void editUser() {
192         TESTER.clickLink("body:realmsLI:realms", false);
193         TESTER.clickLink("body:content:body:container:content:tabbedPanel:tabs-container:tabs:1:link");
194 
195         Component component = findComponentByProp("username", CONTAINER
196                 + ":searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable", "puccini");
197         assertNotNull(component);
198 
199         TESTER.executeAjaxEvent(component.getPageRelativePath(), Constants.ON_CLICK);
200         TESTER.clickLink(TAB_PANEL
201                 + "outerObjectsRepeater:1:outer:container:content:togglePanelContainer:container:"
202                 + "actions:actions:actionRepeater:0:action:action");
203 
204         TESTER.assertComponent(TAB_PANEL
205                 + "outerObjectsRepeater:0:outer:form:content:form:view:username:textField",
206                 TextField.class);
207 
208         FormTester formTester = TESTER.newFormTester(TAB_PANEL
209                 + "outerObjectsRepeater:0:outer:form:content:form");
210         assertNotNull(formTester);
211 
212         formTester.submit("buttons:next");
213 
214         formTester = TESTER.newFormTester(TAB_PANEL + "outerObjectsRepeater:0:outer:form:content:form");
215         assertNotNull(formTester);
216         formTester.submit("buttons:next");
217 
218         formTester = TESTER.newFormTester(TAB_PANEL + "outerObjectsRepeater:0:outer:form:content:form");
219         assertNotNull(formTester);
220         formTester.submit("buttons:next");
221 
222         formTester = TESTER.newFormTester(TAB_PANEL + "outerObjectsRepeater:0:outer:form:content:form");
223         assertNotNull(formTester);
224         formTester.submit("buttons:next");
225 
226         formTester = TESTER.newFormTester(TAB_PANEL + "outerObjectsRepeater:0:outer:form:content:form");
227         assertNotNull(formTester);
228         formTester.submit("buttons:next");
229 
230         formTester = TESTER.newFormTester(TAB_PANEL + "outerObjectsRepeater:0:outer:form:content:form");
231         assertNotNull(formTester);
232         formTester.submit("buttons:next");
233 
234         formTester = TESTER.newFormTester(TAB_PANEL + "outerObjectsRepeater:0:outer:form:content:form");
235         assertNotNull(formTester);
236         formTester.submit("buttons:next");
237 
238         formTester = TESTER.newFormTester(TAB_PANEL + "outerObjectsRepeater:0:outer:form:content:form");
239         assertNotNull(formTester);
240         formTester.submit("buttons:finish");
241 
242         assertSuccessMessage();
243 
244         TESTER.assertComponent(TAB_PANEL
245                 + "outerObjectsRepeater:0:outer:form:content:customResultBody:resources:firstLevelContainer:first:"
246                 + "container:content:group:beans:0:fields:1:field", Label.class);
247 
248         TESTER.clickLink(TAB_PANEL
249                 + "outerObjectsRepeater:0:outer:form:content:action:actionRepeater:0:action:action");
250 
251         component = findComponentByProp("username", CONTAINER
252                 + ":searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable", "puccini");
253         assertNotNull(component);
254     }
255 
256     @Test
257     public void editUserMembership() {
258         TESTER.clickLink("body:realmsLI:realms", false);
259         TESTER.executeAjaxEvent("body:content:realmChoicePanel:container"
260                 + ":realmsFragment:realms:btn", Constants.ON_CLICK);
261         TESTER.executeAjaxEvent("body:content:realmChoicePanel:container"
262                 + ":realmsFragment:realms:dropdown-menu:buttons:2:button",
263                 Constants.ON_CLICK);
264 
265         TESTER.clickLink("body:content:body:container:content:tabbedPanel:tabs-container:tabs:1:link");
266 
267         Component component = findComponentByProp("username", CONTAINER
268                 + ":searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable", "puccini");
269         assertNull(component);
270 
271         component = findComponentByProp("username", CONTAINER
272                 + ":searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable", "rossini");
273         assertNotNull(component);
274 
275         TESTER.executeAjaxEvent(component.getPageRelativePath(), Constants.ON_CLICK);
276         TESTER.clickLink(TAB_PANEL
277                 + "outerObjectsRepeater:1:outer:container:content:togglePanelContainer:container:"
278                 + "actions:actions:actionRepeater:0:action:action");
279 
280         FormTester formTester = TESTER.newFormTester(TAB_PANEL
281                 + "outerObjectsRepeater:0:outer:form:content:form");
282         assertNotNull(formTester);
283         formTester.submit("buttons:next");
284 
285         formTester = TESTER.newFormTester(TAB_PANEL + "outerObjectsRepeater:0:outer:form:content:form");
286         assertNotNull(formTester);
287         formTester.submit("buttons:next");
288 
289         formTester = TESTER.newFormTester(TAB_PANEL + "outerObjectsRepeater:0:outer:form:content:form");
290         assertNotNull(formTester);
291 
292         formTester.setValue("view:groupsContainer:groups:paletteField:recorder", "additional,root,otherchild");
293         TESTER.executeAjaxEvent(
294                 TAB_PANEL + "outerObjectsRepeater:0:outer:form:content:form:buttons:next", Constants.ON_CLICK);
295 
296         formTester = TESTER.newFormTester(TAB_PANEL + "outerObjectsRepeater:0:outer:form:content:form");
297         assertNotNull(formTester);
298 
299         TESTER.executeAjaxEvent(
300                 "body:content:body:container:content:tabbedPanel:panel:searchResult:outerObjectsRepeater:0:"
301                 + "outer:form:content:form:view:membershipsPlainSchemas:0:membershipPlainSchemas:tabs:0:title",
302                 Constants.ON_CLICK);
303 
304         formTester.setValue("view:membershipsPlainSchemas:0:membershipPlainSchemas:tabs:0:body:content:"
305                 + "schemas:0:panel:spinner", "1");
306         formTester.submit("buttons:next");
307 
308         formTester = TESTER.newFormTester(TAB_PANEL + "outerObjectsRepeater:0:outer:form:content:form");
309         assertNotNull(formTester);
310         formTester.submit("buttons:finish");
311 
312         assertSuccessMessage();
313         TESTER.cleanupFeedbackMessages();
314 
315         TESTER.assertComponent(TAB_PANEL
316                 + "outerObjectsRepeater:0:outer:form:content:customResultBody:resources:firstLevelContainer:first:"
317                 + "container:content:group:beans:0:fields:1:field", Label.class);
318 
319         TESTER.clickLink(TAB_PANEL
320                 + "outerObjectsRepeater:0:outer:form:content:action:actionRepeater:0:action:action");
321 
322         component = findComponentByProp("username", CONTAINER
323                 + ":searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable", "rossini");
324         assertNotNull(component);
325 
326         // reset ....
327         TESTER.executeAjaxEvent(component.getPageRelativePath(), Constants.ON_CLICK);
328         TESTER.clickLink(TAB_PANEL
329                 + "outerObjectsRepeater:1:outer:container:content:togglePanelContainer:container:"
330                 + "actions:actions:actionRepeater:0:action:action");
331 
332         formTester = TESTER.newFormTester(TAB_PANEL + "outerObjectsRepeater:0:outer:form:content:form");
333         assertNotNull(formTester);
334         formTester.submit("buttons:next");
335 
336         formTester = TESTER.newFormTester(TAB_PANEL + "outerObjectsRepeater:0:outer:form:content:form");
337         assertNotNull(formTester);
338         formTester.submit("buttons:next");
339 
340         formTester = TESTER.newFormTester(TAB_PANEL + "outerObjectsRepeater:0:outer:form:content:form");
341         assertNotNull(formTester);
342         formTester.setValue("view:groupsContainer:groups:paletteField:recorder", "root,otherchild");
343         TESTER.executeAjaxEvent(
344                 TAB_PANEL + "outerObjectsRepeater:0:outer:form:content:form:buttons:finish", Constants.ON_CLICK);
345 
346         assertSuccessMessage();
347         TESTER.cleanupFeedbackMessages();
348     }
349 
350     @Test
351     public void editUserMemberships() {
352         TESTER.clickLink("body:realmsLI:realms", false);
353         TESTER.executeAjaxEvent("body:content:realmChoicePanel:container"
354                 + ":realmsFragment:realms:btn", Constants.ON_CLICK);
355         TESTER.executeAjaxEvent("body:content:realmChoicePanel:container"
356                 + ":realmsFragment:realms:dropdown-menu:buttons:2:button",
357                 Constants.ON_CLICK);
358 
359         TESTER.clickLink("body:content:body:container:content:tabbedPanel:tabs-container:tabs:1:link");
360 
361         Component component = findComponentByProp("username", CONTAINER
362                 + ":searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable", "rossini");
363         assertNotNull(component);
364 
365         // click on "edit"
366         TESTER.executeAjaxEvent(component.getPageRelativePath(), Constants.ON_CLICK);
367         TESTER.clickLink(TAB_PANEL
368                 + "outerObjectsRepeater:1:outer:container:content:togglePanelContainer:container:"
369                 + "actions:actions:actionRepeater:0:action:action");
370 
371         FormTester formTester = TESTER.newFormTester(TAB_PANEL
372                 + "outerObjectsRepeater:0:outer:form:content:form");
373         assertNotNull(formTester);
374         formTester.submit("buttons:next");
375 
376         formTester = TESTER.newFormTester(TAB_PANEL + "outerObjectsRepeater:0:outer:form:content:form");
377         assertNotNull(formTester);
378         formTester.submit("buttons:next");
379 
380         formTester = TESTER.newFormTester(TAB_PANEL + "outerObjectsRepeater:0:outer:form:content:form");
381         assertNotNull(formTester);
382 
383         // add "additional" group in order to show membership attributes
384         formTester.setValue("view:groupsContainer:groups:paletteField:recorder", "additional,root,otherchild");
385         TESTER.executeAjaxEvent(TAB_PANEL
386                 + "outerObjectsRepeater:0:outer:form:content:form:buttons:next",
387                 Constants.ON_CLICK);
388 
389         formTester = TESTER.newFormTester(TAB_PANEL + "outerObjectsRepeater:0:outer:form:content:form");
390         assertNotNull(formTester);
391 
392         // open membership attributes accordion
393         TESTER.executeAjaxEvent(TAB_PANEL + "outerObjectsRepeater:0:"
394                 + "outer:form:content:form:view:membershipsPlainSchemas:0:membershipPlainSchemas:tabs:0:title",
395                 Constants.ON_CLICK);
396 
397         // edit multivalue text field, set 2 elements in total
398         TESTER.assertComponent(TAB_PANEL + "outerObjectsRepeater:0:"
399                 + "outer:form:content:form:view:membershipsPlainSchemas:0:membershipPlainSchemas:tabs:0:"
400                 + "body:content:schemas:5:panel:multiValueContainer:innerForm:content:view:0:panel:field",
401                 TextField.class);
402         formTester.setValue("view:membershipsPlainSchemas:0:membershipPlainSchemas:tabs:0:body:content:"
403                 + "schemas:5:panel:multiValueContainer:innerForm:content:view:0:panel:field", "2019-03-05");
404 
405         TESTER.clickLink(TESTER.getComponentFromLastRenderedPage(TAB_PANEL
406                 + "outerObjectsRepeater:0:"
407                 + "outer:form:content:form:view:membershipsPlainSchemas:0:membershipPlainSchemas:tabs:0:"
408                 + "body:content:schemas:5:panel:multiValueContainer:innerForm:content:view:0:panelPlus:add"));
409 
410         TESTER.assertComponent(TAB_PANEL + "outerObjectsRepeater:0:"
411                 + "outer:form:content:form:view:membershipsPlainSchemas:0:membershipPlainSchemas:tabs:0:"
412                 + "body:content:schemas:5:panel:multiValueContainer:innerForm:content:view:1:panel:field",
413                 TextField.class);
414         formTester.setValue("view:membershipsPlainSchemas:0:membershipPlainSchemas:tabs:0:body:content:"
415                 + "schemas:5:panel:multiValueContainer:innerForm:content:view:1:panel:field", "2019-03-06");
416 
417         TESTER.clickLink(TESTER.getComponentFromLastRenderedPage(TAB_PANEL
418                 + "outerObjectsRepeater:0:"
419                 + "outer:form:content:form:view:membershipsPlainSchemas:0:membershipPlainSchemas:tabs:0:"
420                 + "body:content:schemas:5:panel:multiValueContainer:innerForm:content:view:1:panelPlus:add"));
421 
422         formTester.submit("buttons:next");
423 
424         formTester = TESTER.newFormTester(TAB_PANEL + "outerObjectsRepeater:0:outer:form:content:form");
425         assertNotNull(formTester);
426         formTester.submit("buttons:finish");
427 
428         assertSuccessMessage();
429         TESTER.cleanupFeedbackMessages();
430 
431         TESTER.assertComponent(TAB_PANEL
432                 + "outerObjectsRepeater:0:outer:form:content:customResultBody:resources:firstLevelContainer:first:"
433                 + "container:content:group:beans:0:fields:1:field", Label.class);
434 
435         TESTER.clickLink(TAB_PANEL
436                 + "outerObjectsRepeater:0:outer:form:content:action:actionRepeater:0:action:action");
437 
438         // reopen form and go to Plain Attributes page...
439         component = findComponentByProp("username", CONTAINER
440                 + ":searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable", "rossini");
441         assertNotNull(component);
442 
443         TESTER.executeAjaxEvent(component.getPageRelativePath(), Constants.ON_CLICK);
444         TESTER.clickLink(TAB_PANEL
445                 + "outerObjectsRepeater:1:outer:container:content:togglePanelContainer:container:"
446                 + "actions:actions:actionRepeater:0:action:action");
447 
448         formTester = TESTER.newFormTester(TAB_PANEL + "outerObjectsRepeater:0:outer:form:content:form");
449         assertNotNull(formTester);
450         formTester.submit("buttons:next");
451 
452         formTester = TESTER.newFormTester(TAB_PANEL + "outerObjectsRepeater:0:outer:form:content:form");
453         assertNotNull(formTester);
454         formTester.submit("buttons:next");
455 
456         formTester = TESTER.newFormTester(TAB_PANEL + "outerObjectsRepeater:0:outer:form:content:form");
457         assertNotNull(formTester);
458 
459         // add "additional" group in order to show membership attributes
460         formTester.setValue("view:groupsContainer:groups:paletteField:recorder", "additional,root,otherchild");
461         TESTER.executeAjaxEvent(TAB_PANEL
462                 + "outerObjectsRepeater:0:outer:form:content:form:buttons:next",
463                 Constants.ON_CLICK);
464 
465         formTester = TESTER.newFormTester(TAB_PANEL + "outerObjectsRepeater:0:outer:form:content:form");
466         assertNotNull(formTester);
467 
468         // open membership attributes accordion
469         TESTER.executeAjaxEvent(TAB_PANEL + "outerObjectsRepeater:0:"
470                 + "outer:form:content:form:view:membershipsPlainSchemas:0:membershipPlainSchemas:tabs:0:title",
471                 Constants.ON_CLICK);
472 
473         // ... check multivalue field values has been saved
474         TESTER.assertComponent(TAB_PANEL + "outerObjectsRepeater:0:"
475                 + "outer:form:content:form:view:membershipsPlainSchemas:0:membershipPlainSchemas:tabs:0:"
476                 + "body:content:schemas:5:panel:multiValueContainer:innerForm:content:view:0:panel:field",
477                 TextField.class);
478 
479         TESTER.assertComponent(TAB_PANEL + "outerObjectsRepeater:0:"
480                 + "outer:form:content:form:view:membershipsPlainSchemas:0:membershipPlainSchemas:tabs:0:"
481                 + "body:content:schemas:5:panel:multiValueContainer:innerForm:content:view:1:panel:field",
482                 TextField.class);
483 
484         Calendar cal = Calendar.getInstance();
485         cal.set(2019, Calendar.MARCH, 5, 0, 0, 0);
486         cal.set(Calendar.MILLISECOND, 0);
487         Calendar cal2 = Calendar.getInstance();
488         cal2.set(2019, Calendar.MARCH, 6, 0, 0, 0);
489         cal2.set(Calendar.MILLISECOND, 0);
490         TESTER.assertModelValue(TAB_PANEL + "outerObjectsRepeater:0:"
491                 + "outer:form:content:form:view:membershipsPlainSchemas:0:membershipPlainSchemas:tabs:0:body:content:"
492                 + "schemas:5:panel:multiValueContainer:innerForm:content:view:0:panel:field", cal.getTime());
493         TESTER.assertModelValue(TAB_PANEL + "outerObjectsRepeater:0:"
494                 + "outer:form:content:form:view:membershipsPlainSchemas:0:membershipPlainSchemas:tabs:0:body:content:"
495                 + "schemas:5:panel:multiValueContainer:innerForm:content:view:1:panel:field", cal2.getTime());
496 
497         // ... remove all values from multivalue field
498         TESTER.executeAjaxEvent(TAB_PANEL + "outerObjectsRepeater:0:"
499                 + "outer:form:content:form:view:membershipsPlainSchemas:0:membershipPlainSchemas:tabs:0:body:"
500                 + "content:schemas:5:panel:multiValueContainer:innerForm:content:view:1:drop",
501                 Constants.ON_CLICK);
502         TESTER.executeAjaxEvent(TAB_PANEL + "outerObjectsRepeater:0:"
503                 + "outer:form:content:form:view:membershipsPlainSchemas:0:membershipPlainSchemas:tabs:0:body:"
504                 + "content:schemas:5:panel:multiValueContainer:innerForm:content:view:0:drop",
505                 Constants.ON_CLICK);
506 
507         formTester = TESTER.newFormTester(TAB_PANEL + "outerObjectsRepeater:0:outer:form:content:form");
508         assertNotNull(formTester);
509         formTester.submit("buttons:finish");
510 
511         assertSuccessMessage();
512         TESTER.cleanupFeedbackMessages();
513 
514         TESTER.assertComponent(TAB_PANEL
515                 + "outerObjectsRepeater:0:outer:form:content:customResultBody:resources:firstLevelContainer:first:"
516                 + "container:content:group:beans:0:fields:1:field", Label.class);
517 
518         TESTER.clickLink(TAB_PANEL
519                 + "outerObjectsRepeater:0:outer:form:content:action:actionRepeater:0:action:action");
520 
521         // reopen form and go to Plain Attributes page...
522         component = findComponentByProp("username", CONTAINER
523                 + ":searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable", "rossini");
524         assertNotNull(component);
525 
526         TESTER.executeAjaxEvent(component.getPageRelativePath(), Constants.ON_CLICK);
527         TESTER.clickLink(TAB_PANEL
528                 + "outerObjectsRepeater:1:outer:container:content:togglePanelContainer:container:"
529                 + "actions:actions:actionRepeater:0:action:action");
530 
531         formTester = TESTER.newFormTester(TAB_PANEL + "outerObjectsRepeater:0:outer:form:content:form");
532         assertNotNull(formTester);
533         formTester.submit("buttons:next");
534 
535         formTester = TESTER.newFormTester(TAB_PANEL + "outerObjectsRepeater:0:outer:form:content:form");
536         assertNotNull(formTester);
537         formTester.submit("buttons:next");
538 
539         formTester = TESTER.newFormTester(TAB_PANEL + "outerObjectsRepeater:0:outer:form:content:form");
540         assertNotNull(formTester);
541 
542         // add "additional" group in order to show membership attributes
543         formTester.setValue("view:groupsContainer:groups:paletteField:recorder", "additional,root,otherchild");
544         TESTER.executeAjaxEvent(TAB_PANEL
545                 + "outerObjectsRepeater:0:outer:form:content:form:buttons:next",
546                 Constants.ON_CLICK);
547 
548         formTester = TESTER.newFormTester(TAB_PANEL + "outerObjectsRepeater:0:outer:form:content:form");
549         assertNotNull(formTester);
550 
551         // open membership attributes accordion
552         TESTER.executeAjaxEvent(TAB_PANEL + "outerObjectsRepeater:0:"
553                 + "outer:form:content:form:view:membershipsPlainSchemas:0:membershipPlainSchemas:tabs:0:title",
554                 Constants.ON_CLICK);
555 
556         // ... check multivalue field is now empty
557         TESTER.assertModelValue(TAB_PANEL + "outerObjectsRepeater:0:"
558                 + "outer:form:content:form:view:membershipsPlainSchemas:0:membershipPlainSchemas:tabs:0:body:content:"
559                 + "schemas:5:panel:multiValueContainer:innerForm:content:view:0:panel:field", null);
560         component = findComponentByProp("syncope-path", TAB_PANEL + "outerObjectsRepeater:0:"
561                 + "outer:form:content:form:view:membershipsPlainSchemas:0:membershipPlainSchemas:tabs:0:body:"
562                 + "content:schemas:5:panel:multiValueContainer:innerForm",
563                 TAB_PANEL + "outerObjectsRepeater:0:"
564                 + "outer:form:content:form:view:membershipsPlainSchemas:0:membershipPlainSchemas:tabs:0:body:"
565                 + "content:schemas:5:panel:multiValueContainer:innerForm:content:view:1:panel:field");
566         assertNull(component);
567 
568         // close the wizard
569         formTester.submit("buttons:cancel");
570     }
571 
572     @Test
573     public void checkDeleteUsrLink() {
574         TESTER.clickLink("body:realmsLI:realms", false);
575         TESTER.clickLink("body:content:body:container:content:tabbedPanel:tabs-container:tabs:1:link");
576 
577         Component component = findComponentByProp("username", CONTAINER
578                 + ":searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable", "rossini");
579         assertNotNull(component);
580 
581         TESTER.executeAjaxEvent(component.getPageRelativePath(), Constants.ON_CLICK);
582         TESTER.assertComponent(TAB_PANEL
583                 + "outerObjectsRepeater:1:outer:container:content:togglePanelContainer:container:"
584                 + "actions:actions:actionRepeater:11:action:action", IndicatingOnConfirmAjaxLink.class);
585     }
586 
587     @Test
588     public void editDateTimeField() {
589         TESTER.clickLink("body:realmsLI:realms", false);
590         TESTER.clickLink("body:content:body:container:content:tabbedPanel:tabs-container:tabs:1:link");
591 
592         Component component = findComponentByProp("username", CONTAINER
593                 + ":searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable", "puccini");
594         assertNotNull(component);
595 
596         TESTER.executeAjaxEvent(component.getPageRelativePath(), Constants.ON_CLICK);
597         TESTER.clickLink(TAB_PANEL
598                 + "outerObjectsRepeater:1:outer:container:content:togglePanelContainer:container:"
599                 + "actions:actions:actionRepeater:0:action:action");
600 
601         TESTER.assertComponent(TAB_PANEL
602                 + "outerObjectsRepeater:0:outer:form:content:form:view:username:textField",
603                 TextField.class);
604 
605         FormTester formTester = TESTER.newFormTester(TAB_PANEL
606                 + "outerObjectsRepeater:0:outer:form:content:form");
607         assertNotNull(formTester);
608         formTester.submit("buttons:next");
609 
610         formTester = TESTER.newFormTester(TAB_PANEL + "outerObjectsRepeater:0:outer:form:content:form");
611         assertNotNull(formTester);
612         formTester.submit("buttons:next");
613 
614         formTester = TESTER.newFormTester(TAB_PANEL + "outerObjectsRepeater:0:outer:form:content:form");
615         assertNotNull(formTester);
616         formTester.submit("buttons:next");
617 
618         formTester = TESTER.newFormTester(TAB_PANEL + "outerObjectsRepeater:0:outer:form:content:form");
619         assertNotNull(formTester);
620         formTester.setValue("view:plainSchemas:tabs:0:body:content:schemas:1:panel:field:datepicker", "1/19/17");
621         formTester.setValue("view:plainSchemas:tabs:0:body:content:schemas:1:panel:field:timepicker", "12:00 AM");
622 
623         formTester.setValue("view:plainSchemas:tabs:0:body:"
624                 + "content:schemas:8:panel:multiValueContainer:innerForm:content:view:0:panel:field", "2017-01-19");
625 
626         formTester.submit("buttons:finish");
627 
628         assertSuccessMessage();
629         TESTER.cleanupFeedbackMessages();
630 
631         TESTER.assertComponent(TAB_PANEL
632                 + "outerObjectsRepeater:0:outer:form:content:customResultBody:resources:firstLevelContainer:first:"
633                 + "container:content:group:beans:0:fields:1:field", Label.class);
634 
635         TESTER.clickLink(TAB_PANEL
636                 + "outerObjectsRepeater:0:outer:form:content:action:actionRepeater:0:action:action");
637 
638         component = findComponentByProp("username", CONTAINER
639                 + ":searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable", "puccini");
640         assertNotNull(component);
641 
642         TESTER.executeAjaxEvent(component.getPageRelativePath(), Constants.ON_CLICK);
643         TESTER.clickLink(TAB_PANEL
644                 + "outerObjectsRepeater:1:outer:container:content:togglePanelContainer:container:"
645                 + "actions:actions:actionRepeater:0:action:action");
646 
647         TESTER.assertComponent(TAB_PANEL
648                 + "outerObjectsRepeater:0:outer:form:content:form:view:username:textField",
649                 TextField.class);
650 
651         formTester = TESTER.newFormTester(TAB_PANEL + "outerObjectsRepeater:0:outer:form:content:form");
652         assertNotNull(formTester);
653         formTester.submit("buttons:next");
654 
655         formTester = TESTER.newFormTester(TAB_PANEL + "outerObjectsRepeater:0:outer:form:content:form");
656         assertNotNull(formTester);
657         formTester.submit("buttons:next");
658 
659         formTester = TESTER.newFormTester(TAB_PANEL + "outerObjectsRepeater:0:outer:form:content:form");
660         assertNotNull(formTester);
661         formTester.submit("buttons:next");
662 
663         Calendar cal = Calendar.getInstance();
664         cal.set(2017, Calendar.JANUARY, 19, 0, 0, 0);
665         cal.set(Calendar.MILLISECOND, 0);
666 
667         assertEquals(TESTER.getComponentFromLastRenderedPage("body:content:body:"
668                 + "container:content:tabbedPanel:panel:searchResult:"
669                 + "outerObjectsRepeater:0:outer:form:content:form:view:plainSchemas:"
670                 + "tabs:0:body:content:schemas:1:panel:field:timepicker").getDefaultModelObjectAsString(), "12:00 AM");
671 
672         TESTER.assertModelValue("body:content:body:container:content:"
673                 + "tabbedPanel:panel:searchResult:outerObjectsRepeater:0:outer:form:content:"
674                 + "form:view:plainSchemas:tabs:0:body:content:schemas:8:panel:"
675                 + "multiValueContainer:innerForm:content:view:0:panel:field", cal.getTime());
676     }
677 
678     @Test
679     public void changePassword() {
680         TESTER.cleanupFeedbackMessages();
681 
682         TESTER.clickLink("body:realmsLI:realms", false);
683         TESTER.clickLink("body:content:body:container:content:tabbedPanel:tabs-container:tabs:1:link");
684 
685         Component component = findComponentByProp("username", CONTAINER
686                 + ":searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable", "vivaldi");
687         assertNotNull(component);
688 
689         TESTER.executeAjaxEvent(component.getPageRelativePath(), Constants.ON_CLICK);
690         TESTER.clickLink(TAB_PANEL
691                 + "outerObjectsRepeater:1:outer:container:content:togglePanelContainer:container:"
692                 + "actions:actions:actionRepeater:2:action:action");
693 
694         TESTER.assertLabel(TAB_PANEL + "outerObjectsRepeater:3:outer:form:content:status:resources:"
695                 + "firstLevelContainer:first:container:content:group:beans:0:fields:0:field", "syncope");
696 
697         FormTester formTester = TESTER.newFormTester(TAB_PANEL + "outerObjectsRepeater:3:outer:form");
698         formTester.setValue("content:passwordPanel:passwordInnerForm:password:passwordField", "Password345");
699         formTester.setValue("content:passwordPanel:passwordInnerForm:confirmPassword:passwordField", "Password345");
700         formTester.select("content:status:resources:firstLevelContainer:first:container:content:group", 0);
701 
702         TESTER.executeAjaxEvent(
703                 TAB_PANEL + "outerObjectsRepeater:3:outer:dialog:footer:inputs:0:submit", Constants.ON_CLICK);
704 
705         assertSuccessMessage();
706         TESTER.cleanupFeedbackMessages();
707 
708         TESTER.clickLink("body:realmsLI:realms", false);
709         TESTER.clickLink("body:content:body:container:content:tabbedPanel:tabs-container:tabs:1:link");
710 
711         component = findComponentByProp("username", CONTAINER
712                 + ":searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable", "vivaldi");
713         assertNotNull(component);
714 
715         TESTER.executeAjaxEvent(component.getPageRelativePath(), Constants.ON_CLICK);
716         TESTER.clickLink(TAB_PANEL
717                 + "outerObjectsRepeater:1:outer:container:content:togglePanelContainer:container:"
718                 + "actions:actions:actionRepeater:2:action:action");
719 
720         TESTER.assertLabel(TAB_PANEL + "outerObjectsRepeater:3:outer:form:content:status:resources:"
721                 + "firstLevelContainer:first:container:content:group:beans:0:fields:0:field", "syncope");
722 
723         formTester = TESTER.newFormTester(TAB_PANEL + "outerObjectsRepeater:3:outer:form");
724         formTester.setValue("content:passwordPanel:passwordInnerForm:password:passwordField", "Password123");
725         formTester.setValue("content:passwordPanel:passwordInnerForm:confirmPassword:passwordField", "Password123");
726         formTester.select("content:status:resources:firstLevelContainer:first:container:content:group", 0);
727 
728         TESTER.executeAjaxEvent(
729                 TAB_PANEL + "outerObjectsRepeater:3:outer:dialog:footer:inputs:0:submit", Constants.ON_CLICK);
730 
731         assertSuccessMessage();
732         TESTER.cleanupFeedbackMessages();
733     }
734 }