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 java.util.UUID;
26  import org.apache.syncope.client.console.panels.TogglePanel;
27  import org.apache.syncope.client.console.topology.Topology;
28  import org.apache.syncope.client.ui.commons.Constants;
29  import org.apache.syncope.client.ui.commons.markup.html.form.NonI18nPalette;
30  import org.apache.syncope.common.lib.types.ResourceOperation;
31  import org.apache.wicket.Component;
32  import org.apache.wicket.ajax.markup.html.AjaxLink;
33  import org.apache.wicket.ajax.markup.html.form.AjaxSubmitLink;
34  import org.apache.wicket.markup.html.WebMarkupContainer;
35  import org.apache.wicket.markup.html.basic.Label;
36  import org.apache.wicket.util.tester.FormTester;
37  import org.junit.jupiter.api.BeforeEach;
38  import org.junit.jupiter.api.Test;
39  
40  public class TopologyITCase extends AbstractConsoleITCase {
41  
42      @BeforeEach
43      public void login() {
44          doLogin(ADMIN_UNAME, ADMIN_PWD);
45          TESTER.clickLink("body:idmPages:0:idmPageLI:idmPage", false);
46          TESTER.assertRenderedPage(Topology.class);
47      }
48  
49      @Test
50      public void showTopology() {
51          TESTER.assertComponent("body:syncope", WebMarkupContainer.class);
52          TESTER.assertComponent("body:resources:1", WebMarkupContainer.class);
53          TESTER.assertComponent("body:resources:2:resources:0", WebMarkupContainer.class);
54      }
55  
56      @Test
57      public void showTopologyToggleMenu() {
58          TESTER.executeAjaxEvent("body:resources:2:resources:0:res", Constants.ON_CLICK);
59          TESTER.assertComponent(
60                  "body:toggle:container:content:togglePanelContainer:container:actions:delete",
61                  AjaxLink.class);
62          TESTER.assertComponent(
63                  "body:toggle:container:content:togglePanelContainer:container:actions:edit",
64                  AjaxLink.class);
65          TESTER.assertComponent(
66                  "body:toggle:container:content:togglePanelContainer:container:actions:propagation",
67                  AjaxLink.class);
68          TESTER.assertComponent(
69                  "body:toggle:container:content:togglePanelContainer:container:actions:pull",
70                  AjaxLink.class);
71          TESTER.assertComponent(
72                  "body:toggle:container:content:togglePanelContainer:container:actions:push",
73                  AjaxLink.class);
74          TESTER.executeAjaxEvent("body:syncope", Constants.ON_CLICK);
75          TESTER.executeAjaxEvent("body:conns:0:conns:3:conn", Constants.ON_CLICK);
76          TESTER.assertComponent(
77                  "body:toggle:container:content:togglePanelContainer:container:actions:create",
78                  AjaxLink.class);
79          TESTER.assertComponent(
80                  "body:toggle:container:content:togglePanelContainer:container:actions:delete",
81                  AjaxLink.class);
82          TESTER.assertComponent(
83                  "body:toggle:container:content:togglePanelContainer:container:actions:edit",
84                  AjaxLink.class);
85      }
86  
87      @Test
88      public void resourceBatchAction() {
89          Component component = findComponentByProp("key", "body:resources", "ws-target-resource-1");
90          assertNotNull(component);
91          TESTER.executeAjaxEvent(component.getPageRelativePath() + ":res", Constants.ON_CLICK);
92          TESTER.clickLink(
93                  "body:toggle:container:content:togglePanelContainer:container:actions:reconciliation");
94  
95          TESTER.assertComponent("body:toggle:outerObjectsRepeater:1:outer", Modal.class);
96  
97          FormTester formTester = TESTER.newFormTester("body:toggle:outerObjectsRepeater:1:outer:form");
98          formTester.setValue("content:anyTypes:dropDownChoiceField", "0");
99          TESTER.executeAjaxEvent(
100                 "body:toggle:outerObjectsRepeater:1:outer:form:content:anyTypes:dropDownChoiceField",
101                 Constants.ON_CHANGE);
102         formTester.setValue("content:anyTypes:dropDownChoiceField", "0");
103 
104         component = findComponentByProp("key",
105                 "body:toggle:outerObjectsRepeater:1:outer:form:content:status:"
106                 + "firstLevelContainer:first:container:content:searchContainer:resultTable:tablePanel:groupForm:"
107                 + "checkgroup:dataTable", "b3cbc78d-32e6-4bd4-92e0-bbe07566a2ee");
108 
109         assertNotNull(component);
110 
111         TESTER.executeAjaxEvent(
112                 "body:toggle:outerObjectsRepeater:1:outer:dialog:footer:buttons:0:button", Constants.ON_CLICK);
113     }
114 
115     @Test
116     public void editProvisioning() {
117         Component component = findComponentByProp("key", "body:resources", "ws-target-resource-1");
118         assertNotNull(component);
119         TESTER.executeAjaxEvent(component.getPageRelativePath() + ":res", Constants.ON_CLICK);
120         TESTER.clickLink(
121                 "body:toggle:container:content:togglePanelContainer:container:actions:provision");
122 
123         TESTER.executeAjaxEvent(
124                 "body:toggle:outerObjectsRepeater:3:outer:form:content:provision:container:"
125                 + "content:group:beans:0:fields:0", Constants.ON_CLICK);
126 
127         TESTER.clickLink(
128                 "body:toggle:outerObjectsRepeater:3:outer:form:content:toggle:container:content:"
129                 + "togglePanelContainer:container:actions:actions:actionRepeater:0:action:action");
130 
131         FormTester formTester = TESTER.newFormTester(
132                 "body:toggle:outerObjectsRepeater:3:outer:form:content:provision:container:content:wizard:form");
133         formTester.submit("buttons:next");
134 
135         formTester = TESTER.newFormTester(
136                 "body:toggle:outerObjectsRepeater:3:outer:form:content:provision:container:content:wizard:form");
137         formTester.submit("buttons:next");
138 
139         TESTER.assertComponent("body:toggle:outerObjectsRepeater:3:outer:form:content:provision:"
140                 + "container:content:wizard:form:view:mapping:mappingContainer:mappings:1", WebMarkupContainer.class);
141 
142         TESTER.executeAjaxEvent(
143                 "body:toggle:outerObjectsRepeater:3:outer:form:content:provision:container:"
144                 + "content:wizard:form:view:mapping:mappingContainer:mappings:1:itemTransformers:icon",
145                 Constants.ON_CLICK);
146 
147         TESTER.clickLink(
148                 "body:toggle:outerObjectsRepeater:3:outer:form:content:provision:container:content:"
149                 + "wizard:form:view:mapping:mappingContainer:mappings:0:itemTransformers:alertsLink");
150 
151         TESTER.assertComponent(
152                 "body:toggle:outerObjectsRepeater:3:outer:form:content:provision:container:"
153                 + "content:wizard:outerObjectsRepeater:0:outer:container:content:togglePanelContainer:"
154                 + "form:classes:paletteField", NonI18nPalette.class);
155     }
156 
157     @Test
158     public void createNewResurceAndProvisionRules() {
159         String res = UUID.randomUUID().toString();
160 
161         TESTER.executeAjaxEvent(
162                 "body:conns:0:conns:1:conn", Constants.ON_CLICK);
163         TESTER.executeAjaxEvent(
164                 "body:toggle:container:content:togglePanelContainer:container:actions:create", Constants.ON_CLICK);
165 
166         FormTester formTester = TESTER.newFormTester(
167                 "body:toggle:outerObjectsRepeater:0:outer:form:content:form");
168 
169         formTester.setValue("view:container:key:textField", res);
170         formTester.submit("buttons:next");
171 
172         formTester = TESTER.newFormTester("body:toggle:outerObjectsRepeater:0:outer:form:content:form");
173         formTester.submit("buttons:next");
174 
175         // click on finish to create the external resource 
176         TESTER.cleanupFeedbackMessages();
177         // ajax event required to retrieve AjaxRequestTarget (used into finish custom event)
178         TESTER.executeAjaxEvent(
179                 "body:toggle:outerObjectsRepeater:0:outer:form:content:form:buttons:finish", Constants.ON_CLICK);
180         assertSuccessMessage();
181 
182         TESTER.cleanupFeedbackMessages();
183         TESTER.clickLink("body:idmPages:0:idmPageLI:idmPage", false);
184 
185         Component component = findComponentByProp("key", "body:resources", res);
186         assertNotNull(component);
187         TESTER.executeAjaxEvent(component.getPageRelativePath() + ":res", Constants.ON_CLICK);
188         TESTER.clickLink(
189                 "body:toggle:container:content:togglePanelContainer:container:actions:provision");
190 
191         // -- create new provision rules for the current resource
192         TESTER.clickLink(
193                 "body:toggle:outerObjectsRepeater:3:outer:form:content:provision:container:content:add");
194 
195         formTester = TESTER.newFormTester(
196                 "body:toggle:outerObjectsRepeater:3:outer:form:content:objectTypeToggle:container:"
197                 + "content:togglePanelContainer:objectTypeForm");
198         formTester.select("type:dropDownChoiceField", 1);
199         formTester.submit("changeit");
200         TESTER.assertNoErrorMessage();
201         TESTER.assertNoInfoMessage();
202 
203         // choose object class
204         formTester = TESTER.newFormTester(
205                 "body:toggle:outerObjectsRepeater:3:outer:form:content:provision:container:content:wizard:form");
206         formTester.submit("buttons:next");
207         TESTER.assertNoErrorMessage();
208         TESTER.assertNoInfoMessage();
209 
210         // aux classes
211         formTester = TESTER.newFormTester(
212                 "body:toggle:outerObjectsRepeater:3:outer:form:content:provision:container:content:wizard:form");
213         formTester.submit("buttons:next");
214         TESTER.assertNoErrorMessage();
215         TESTER.assertNoInfoMessage();
216 
217         // set a new mapping rule
218         TESTER.executeAjaxEvent(
219                 "body:toggle:outerObjectsRepeater:3:outer:form:content:provision:container:"
220                 + "content:wizard:form:view:mapping:mappingContainer:addMappingBtn", Constants.ON_CLICK);
221 
222         formTester = TESTER.newFormTester(
223                 "body:toggle:outerObjectsRepeater:3:outer:form:content:provision:container:content:wizard:form");
224 
225         formTester.setValue("view:mapping:mappingContainer:mappings:0:connObjectKey:checkboxField", "true");
226         TESTER.executeAjaxEvent(
227                 "body:toggle:outerObjectsRepeater:3:outer:form:content:provision:container:content:wizard:form"
228                 + ":view:mapping:mappingContainer:mappings:0:connObjectKey:checkboxField", Constants.ON_CHANGE);
229 
230         formTester.setValue("view:mapping:mappingContainer:mappings:0:intAttrName:textField", "key");
231         formTester.setValue("view:mapping:mappingContainer:mappings:0:extAttrName:textField", "ID");
232         formTester.setValue("view:mapping:mappingContainer:mappings:0:connObjectKey:checkboxField", "true");
233 
234         formTester.submit("buttons:next");
235         TESTER.assertNoErrorMessage();
236         TESTER.assertNoInfoMessage();
237 
238         // finish
239         TESTER.cleanupFeedbackMessages();
240         // ajax event required to retrieve AjaxRequestTarget (used into finish custom event)
241         TESTER.executeAjaxEvent(
242                 "body:toggle:outerObjectsRepeater:3:outer:form:content:provision:container:"
243                 + "content:wizard:form:buttons:finish", Constants.ON_CLICK);
244         assertSuccessMessage();
245 
246         TESTER.assertComponent(
247                 "body:toggle:outerObjectsRepeater:3:outer:dialog:footer:inputs:0:submit", AjaxSubmitLink.class);
248 
249         // save
250         TESTER.cleanupFeedbackMessages();
251         TESTER.executeAjaxEvent(
252                 "body:toggle:outerObjectsRepeater:3:outer:dialog:footer:inputs:0:submit", Constants.ON_CLICK);
253         TESTER.assertNoErrorMessage();
254         assertSuccessMessage();
255 
256         TESTER.executeAjaxEvent(
257                 "body:toggle:outerObjectsRepeater:3:outer:form:content:provision:container:"
258                 + "content:group:beans:0:fields:0", Constants.ON_CLICK);
259 
260         TESTER.clickLink(
261                 "body:toggle:outerObjectsRepeater:3:outer:form:content:toggle:container:content:"
262                 + "togglePanelContainer:container:actions:actions:actionRepeater:0:action:action");
263 
264         formTester = TESTER.newFormTester(
265                 "body:toggle:outerObjectsRepeater:3:outer:form:content:provision:container:content:wizard:form");
266         formTester.submit("buttons:next");
267 
268         formTester = TESTER.newFormTester(
269                 "body:toggle:outerObjectsRepeater:3:outer:form:content:provision:container:content:wizard:form");
270         formTester.submit("buttons:next");
271 
272         TESTER.assertComponent("body:toggle:outerObjectsRepeater:3:outer:form:content:provision:"
273                 + "container:content:wizard:form:view:mapping:mappingContainer:mappings:0", WebMarkupContainer.class);
274 
275         TESTER.executeAjaxEvent(
276                 "body:toggle:outerObjectsRepeater:3:outer:form:content:provision:container:"
277                 + "content:wizard:form:buttons:cancel", Constants.ON_CLICK);
278 
279         TESTER.clickLink("body:toggle:outerObjectsRepeater:3:outer:dialog:footer:buttons:0:button");
280 
281         TESTER.cleanupFeedbackMessages();
282         TESTER.getRequest().addParameter("confirm", "true");
283         TESTER.clickLink("body:toggle:container:content:togglePanelContainer:container:actions:delete");
284 
285         assertSuccessMessage();
286         TESTER.cleanupFeedbackMessages();
287 
288         TESTER.clickLink("body:idmPages:0:idmPageLI:idmPage", false);
289         component = findComponentByProp("key", "body:resources", res);
290         assertNull(component);
291     }
292 
293     @Test
294     public void executePullTask() {
295         Component component = findComponentByProp("key", "body:resources", "resource-testdb");
296         assertNotNull(component);
297         TESTER.executeAjaxEvent(component.getPageRelativePath() + ":res", Constants.ON_CLICK);
298         TESTER.clickLink("body:toggle:container:content:togglePanelContainer:container:actions:pull");
299 
300         component = findComponentByProp("name",
301                 "body:toggle:outerObjectsRepeater:2:outer:form:content:tasks:"
302                 + "firstLevelContainer:first:container:content:searchContainer:resultTable:tablePanel:groupForm:"
303                 + "checkgroup:dataTable", "TestDB Task");
304 
305         TESTER.executeAjaxEvent(component.getPageRelativePath(), Constants.ON_CLICK);
306         TESTER.clickLink(
307                 "body:toggle:outerObjectsRepeater:2:outer:form:content:tasks:firstLevelContainer:first:"
308                 + "outerObjectsRepeater:1:outer:container:content:togglePanelContainer:container:"
309                 + "actions:actions:actionRepeater:4:action:action");
310 
311         TESTER.clickLink(
312                 "body:toggle:outerObjectsRepeater:2:outer:form:content:tasks:firstLevelContainer:first:"
313                 + "container:content:startAt:container:content:togglePanelContainer:startAtForm:startAt");
314         assertSuccessMessage();
315 
316         component = findComponentByProp("name",
317                 "body:toggle:outerObjectsRepeater:2:outer:form:content:tasks:"
318                 + "firstLevelContainer:first:container:content:searchContainer:resultTable:tablePanel:groupForm:"
319                 + "checkgroup:dataTable", "TestDB Task");
320 
321         TESTER.executeAjaxEvent(component.getPageRelativePath(), Constants.ON_CLICK);
322         TESTER.clickLink(
323                 "body:toggle:outerObjectsRepeater:2:outer:form:content:tasks:firstLevelContainer:first:"
324                 + "outerObjectsRepeater:1:outer:container:content:togglePanelContainer:container:"
325                 + "actions:actions:actionRepeater:0:action:action");
326 
327         TESTER.assertLabel(
328                 "body:toggle:outerObjectsRepeater:2:outer:form:content:tasks:secondLevelContainer:title",
329                 "Executions of task 'TestDB Task'");
330 
331         int iteration = 0;
332         do {
333             try {
334                 component = findComponentByProp("status",
335                         "body:toggle:outerObjectsRepeater:2:outer:form:content:tasks:secondLevelContainer:"
336                         + "second:executions:firstLevelContainer:first:container:content:searchContainer:resultTable:"
337                         + "tablePanel:groupForm:checkgroup:dataTable", "SUCCESS");
338                 assertNotNull(component);
339                 iteration = 10;
340             } catch (AssertionError e) {
341                 try {
342                     // requires a short delay
343                     Thread.sleep(1000);
344                 } catch (Exception ignore) {
345                 }
346 
347                 TESTER.executeAjaxEvent("body:toggle:outerObjectsRepeater:2:outer:form:content:tasks:"
348                         + "secondLevelContainer:second:executions:firstLevelContainer:first:container:content:"
349                         + "searchContainer:tablehandling:actionRepeater:0:action:action", Constants.ON_CLICK);
350 
351                 iteration++;
352             }
353         } while (iteration < 10);
354 
355         component = findComponentByProp("status",
356                 "body:toggle:outerObjectsRepeater:2:outer:form:content:tasks:secondLevelContainer:"
357                 + "second:executions:firstLevelContainer:first:container:content:searchContainer:resultTable:"
358                 + "tablePanel:groupForm:checkgroup:dataTable", "SUCCESS");
359         assertNotNull(component);
360 
361         TESTER.executeAjaxEvent(component.getPageRelativePath(), Constants.ON_CLICK);
362         TESTER.clickLink(
363                 "body:toggle:outerObjectsRepeater:2:outer:form:content:tasks:secondLevelContainer:second:"
364                 + "executions:firstLevelContainer:first:outerObjectsRepeater:1:outer:container:content:"
365                 + "togglePanelContainer:container:actions:actions:actionRepeater:0:action:action");
366 
367         TESTER.assertComponent("body:toggle:outerObjectsRepeater:2:outer:form:content:tasks:"
368                 + "secondLevelContainer:second:executions:secondLevelContainer:title", Label.class);
369     }
370 
371     @Test
372     public void readPropagationTaskExecutions() {
373         Component component = findComponentByProp("key", "body:resources", "resource-testdb");
374         assertNotNull(component);
375         TESTER.executeAjaxEvent(component.getPageRelativePath() + ":res", Constants.ON_CLICK);
376         TESTER.clickLink(
377                 "body:toggle:container:content:togglePanelContainer:container:actions:propagation");
378 
379         TESTER.assertComponent(
380                 "body:toggle:outerObjectsRepeater:1:outer:form:content:tasks:firstLevelContainer:"
381                 + "first:container:content:searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable",
382                 WebMarkupContainer.class);
383 
384         component = findComponentByProp("operation",
385                 "body:toggle:outerObjectsRepeater:1:outer:form:content:tasks:"
386                 + "firstLevelContainer:first:container:content:searchContainer:resultTable:tablePanel:groupForm:"
387                 + "checkgroup:dataTable", ResourceOperation.CREATE);
388 
389         assertNotNull(component);
390         TESTER.executeAjaxEvent(component.getPageRelativePath(), Constants.ON_CLICK);
391         TESTER.clickLink(
392                 "body:toggle:outerObjectsRepeater:1:outer:form:content:tasks:firstLevelContainer:first:"
393                 + "outerObjectsRepeater:1:outer:container:content:togglePanelContainer:container:"
394                 + "actions:actions:actionRepeater:2:action:action");
395 
396         TESTER.clickLink("body:idmPages:0:idmPageLI:idmPage", false);
397 
398         component = findComponentByProp("key", "body:resources", "resource-testdb");
399         assertNotNull(component);
400         TESTER.executeAjaxEvent(component.getPageRelativePath() + ":res", Constants.ON_CLICK);
401         TESTER.clickLink(
402                 "body:toggle:container:content:togglePanelContainer:container:actions:propagation");
403 
404         component = findComponentByPropNotNull("start",
405                 "body:toggle:outerObjectsRepeater:1:outer:form:content:tasks:"
406                 + "firstLevelContainer:first:container:content:searchContainer:resultTable:tablePanel:groupForm:"
407                 + "checkgroup:dataTable");
408 
409         assertNotNull(component);
410         TESTER.executeAjaxEvent(component.getPageRelativePath(), Constants.ON_CLICK);
411         TESTER.clickLink(
412                 "body:toggle:outerObjectsRepeater:1:outer:form:content:tasks:firstLevelContainer:first:"
413                 + "outerObjectsRepeater:1:outer:container:content:togglePanelContainer:container:"
414                 + "actions:actions:actionRepeater:0:action:action");
415 
416         TESTER.assertLabel(
417                 "body:toggle:outerObjectsRepeater:1:outer:form:content:tasks:secondLevelContainer:title",
418                 "CREATE __ACCOUNT__");
419 
420         component = findComponentByProp("status",
421                 "body:toggle:outerObjectsRepeater:1:outer:form:content:tasks:"
422                 + "secondLevelContainer:second:executions:firstLevelContainer:first:container:content:searchContainer:"
423                 + "resultTable:tablePanel:groupForm:checkgroup:dataTable", "FAILURE");
424 
425         assertNotNull(component);
426         TESTER.executeAjaxEvent(component.getPageRelativePath(), Constants.ON_CLICK);
427         TESTER.clickLink(
428                 "body:toggle:outerObjectsRepeater:1:outer:form:content:tasks:secondLevelContainer:"
429                 + "second:executions:firstLevelContainer:first:outerObjectsRepeater:1:outer:container:content:"
430                 + "togglePanelContainer:container:actions:actions:actionRepeater:0:action:action");
431 
432         TESTER.assertComponent("body:toggle:outerObjectsRepeater:1:outer:form:content:tasks:"
433                 + "secondLevelContainer:second:executions:secondLevelContainer:title", Label.class);
434     }
435 
436     @Test
437     public void editPushTask() {
438         Component component = findComponentByProp("key", "body:resources", "resource-ldap");
439         assertNotNull(component);
440         TESTER.executeAjaxEvent(component.getPageRelativePath() + ":res", Constants.ON_CLICK);
441         TESTER.clickLink("body:toggle:container:content:togglePanelContainer:container:actions:push");
442 
443         TESTER.executeAjaxEvent(
444                 "body:toggle:outerObjectsRepeater:2:outer:form:content:tasks:firstLevelContainer:"
445                 + "first:container:content:searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable:"
446                 + "body:rows:1", Constants.ON_CLICK);
447         TESTER.clickLink(
448                 "body:toggle:outerObjectsRepeater:2:outer:form:content:tasks:firstLevelContainer:first:"
449                 + "outerObjectsRepeater:1:outer:container:content:togglePanelContainer:container:"
450                 + "actions:actions:actionRepeater:1:action:action");
451 
452         FormTester formTester = TESTER.newFormTester(
453                 "body:toggle:outerObjectsRepeater:2:outer:form:content:"
454                 + "tasks:firstLevelContainer:first:container:content:wizard:form");
455         formTester.setValue("view:description:textField", "test");
456         formTester.submit("buttons:next");
457 
458         TESTER.assertModelValue("body:toggle:outerObjectsRepeater:2:outer:form:content:tasks:"
459                 + "firstLevelContainer:first:container:content:wizard:form:view:filters:0:filters:tabs:0:body:"
460                 + "content:searchFormContainer:search:multiValueContainer:innerForm:content:view:0:panel:container:"
461                 + "value:textField", "_NO_ONE_");
462 
463         formTester = TESTER.newFormTester(
464                 "body:toggle:outerObjectsRepeater:2:outer:form:content:"
465                 + "tasks:firstLevelContainer:first:container:content:wizard:form");
466         formTester.submit("buttons:finish");
467 
468         assertSuccessMessage();
469         TESTER.cleanupFeedbackMessages();
470     }
471 
472     @Test
473     public void addGroupTemplate() {
474         Component component = findComponentByProp("key", "body:resources", "resource-testdb");
475         assertNotNull(component);
476         TESTER.executeAjaxEvent(component.getPageRelativePath() + ":res", Constants.ON_CLICK);
477         TESTER.clickLink("body:toggle:container:content:togglePanelContainer:container:actions:pull");
478 
479         TESTER.executeAjaxEvent(
480                 "body:toggle:outerObjectsRepeater:2:outer:form:content:tasks:firstLevelContainer:"
481                 + "first:container:content:searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable:"
482                 + "body:rows:1", Constants.ON_CLICK);
483         TESTER.clickLink(
484                 "body:toggle:outerObjectsRepeater:2:outer:form:content:tasks:firstLevelContainer:first:"
485                 + "outerObjectsRepeater:1:outer:container:content:togglePanelContainer:container:"
486                 + "actions:actions:actionRepeater:3:action:action");
487 
488         TESTER.assertComponent(
489                 "body:toggle:outerObjectsRepeater:2:outer:form:content:tasks:firstLevelContainer:"
490                 + "first:container:content:toggleTemplates", TogglePanel.class);
491 
492         FormTester formTester = TESTER.newFormTester(
493                 "body:toggle:outerObjectsRepeater:2:outer:form:content:tasks:firstLevelContainer:first:container:"
494                 + "content:toggleTemplates:container:content:togglePanelContainer:templatesForm");
495 
496         formTester.setValue("type:dropDownChoiceField", "1");
497         formTester.submit("changeit");
498 
499         TESTER.assertComponent("body:toggle:outerObjectsRepeater:2:outer", Modal.class);
500 
501         formTester = TESTER.newFormTester("body:toggle:outerObjectsRepeater:2:outer:form:content:tasks:"
502                 + "firstLevelContainer:first:container:content:wizard:form");
503         formTester.setValue("view:name:textField", "'k' + name");
504         formTester.submit("buttons:finish");
505 
506         assertSuccessMessage();
507         TESTER.cleanupFeedbackMessages();
508 
509         TESTER.executeAjaxEvent(
510                 "body:toggle:outerObjectsRepeater:2:outer:form:content:tasks:firstLevelContainer:"
511                 + "first:container:content:searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable:"
512                 + "body:rows:2", Constants.ON_CLICK);
513         TESTER.clickLink(
514                 "body:toggle:outerObjectsRepeater:2:outer:form:content:tasks:firstLevelContainer:first:"
515                 + "outerObjectsRepeater:1:outer:container:content:togglePanelContainer:container:"
516                 + "actions:actions:actionRepeater:4:action:action");
517 
518         TESTER.assertComponent(
519                 "body:toggle:outerObjectsRepeater:2:outer:form:content:tasks:firstLevelContainer:"
520                 + "first:container:content:toggleTemplates", TogglePanel.class);
521 
522         TESTER.assertComponent(
523                 "body:toggle:outerObjectsRepeater:2:outer:form:content:tasks:firstLevelContainer:"
524                 + "first:container:content:toggleTemplates", TogglePanel.class);
525 
526         formTester = TESTER.newFormTester(
527                 "body:toggle:outerObjectsRepeater:2:outer:form:content:tasks:firstLevelContainer:first:container:"
528                 + "content:toggleTemplates:container:content:togglePanelContainer:templatesForm");
529 
530         formTester.setValue("type:dropDownChoiceField", "1");
531         formTester.submit("changeit");
532 
533         TESTER.assertComponent("body:toggle:outerObjectsRepeater:2:outer", Modal.class);
534 
535         TESTER.assertModelValue("body:toggle:outerObjectsRepeater:2:outer:form:content:tasks:"
536                 + "firstLevelContainer:first:container:content:wizard:form:view:name:textField",
537                 "'k' + name");
538 
539         formTester = TESTER.newFormTester("body:toggle:outerObjectsRepeater:2:outer:form:content:tasks:"
540                 + "firstLevelContainer:first:container:content:wizard:form");
541         formTester.setValue("view:name:textField", "");
542         formTester.submit("buttons:finish");
543 
544         assertSuccessMessage();
545         TESTER.cleanupFeedbackMessages();
546     }
547 
548     @Test
549     public void reloadConnectors() {
550         TESTER.executeAjaxEvent("body:syncope", Constants.ON_CLICK);
551         TESTER.assertComponent(
552                 "body:toggle:container:content:togglePanelContainer:container:actions:reload",
553                 AjaxLink.class);
554 
555         TESTER.cleanupFeedbackMessages();
556         TESTER.getRequest().addParameter("confirm", "true");
557         TESTER.clickLink("body:toggle:container:content:togglePanelContainer:container:actions:reload");
558 
559         assertSuccessMessage();
560         TESTER.cleanupFeedbackMessages();
561     }
562 }