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  
24  import org.apache.syncope.client.ui.commons.Constants;
25  import org.apache.syncope.client.ui.commons.status.Status;
26  import org.apache.syncope.client.ui.commons.status.StatusBean;
27  import org.apache.wicket.Component;
28  import org.apache.wicket.markup.html.WebMarkupContainer;
29  import org.apache.wicket.markup.html.basic.Label;
30  import org.apache.wicket.util.tester.FormTester;
31  import org.junit.jupiter.api.BeforeEach;
32  import org.junit.jupiter.api.Test;
33  
34  public class BatchesITCase extends AbstractConsoleITCase {
35  
36      private static final String TAB_PANEL = "body:content:body:container:content:tabbedPanel:panel:searchResult:";
37  
38      private static final String CONTAINER = TAB_PANEL + "container:content:";
39  
40      @BeforeEach
41      public void login() {
42          doLogin(ADMIN_UNAME, ADMIN_PWD);
43      }
44  
45      @Test
46      public void users() {
47          TESTER.clickLink("body:realmsLI:realms", false);
48          TESTER.clickLink("body:content:body:container:content:tabbedPanel:tabs-container:tabs:1:link");
49  
50          Component component = findComponentByProp("username", CONTAINER
51                  + "searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable", "rossini");
52          assertNotNull(component);
53  
54          FormTester formTester = TESTER.newFormTester(CONTAINER
55                  + "searchContainer:resultTable:tablePanel:groupForm");
56          assertNotNull(formTester);
57  
58          formTester.select("checkgroup", 2);
59  
60          TESTER.executeAjaxEvent(CONTAINER + "searchContainer:resultTable:tablePanel:batchLink",
61                  Constants.ON_CLICK);
62  
63          TESTER.assertComponent(CONTAINER
64                  + "searchContainer:resultTable:batchModal:form:content:content:container", WebMarkupContainer.class);
65  
66          assertNotNull(findComponentByProp("username", CONTAINER
67                  + "searchContainer:resultTable:batchModal:form:content:content:container", "rossini"));
68      }
69  
70      @Test
71      public void userResource() {
72          TESTER.clickLink("body:realmsLI:realms", false);
73          TESTER.clickLink("body:content:body:container:content:tabbedPanel:tabs-container:tabs:1:link");
74  
75          Component component = findComponentByProp("username", CONTAINER
76                  + ":searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable", "rossini");
77          assertNotNull(component);
78  
79          TESTER.executeAjaxEvent(component.getPageRelativePath(), Constants.ON_CLICK);
80          // manage resource
81          TESTER.clickLink(
82                  "body:content:body:container:content:tabbedPanel:panel:searchResult:outerObjectsRepeater:1"
83                  + ":outer:container:content:togglePanelContainer:container:actions:actions:actionRepeater:4:"
84                  + "action:action");
85  
86          TESTER.assertComponent(TAB_PANEL + "outerObjectsRepeater:2:outer:form:content:status:"
87                  + "firstLevelContainer:first:container:content:searchContainer:resultTable:tablePanel:groupForm:"
88                  + "checkgroup:dataTable", WebMarkupContainer.class);
89  
90          component = findComponentByProp("resource",
91                  TAB_PANEL + "outerObjectsRepeater:2:outer:form:content:status:"
92                  + "firstLevelContainer:first:container:content:searchContainer:resultTable:tablePanel:groupForm:"
93                  + "checkgroup:dataTable", "resource-csv");
94          assertNotNull(component);
95  
96          FormTester formTester = TESTER.newFormTester(
97                  TAB_PANEL + "outerObjectsRepeater:2:outer:form:content:status:firstLevelContainer:"
98                  + "first:container:content:searchContainer:resultTable:tablePanel:groupForm");
99          assertNotNull(formTester);
100 
101         formTester.select("checkgroup", 0);
102 
103         TESTER.executeAjaxEvent(TAB_PANEL + "outerObjectsRepeater:2:outer:form:content:status:"
104                 + "firstLevelContainer:first:container:content:searchContainer:resultTable:tablePanel:batchLink",
105                 Constants.ON_CLICK);
106 
107         TESTER.assertComponent(TAB_PANEL + "outerObjectsRepeater:2:outer:form:content:status:"
108                 + "secondLevelContainer:second:container", WebMarkupContainer.class);
109 
110         assertNotNull(findComponentByProp("resource", TAB_PANEL + "outerObjectsRepeater:2:outer:"
111                 + "form:content:status:secondLevelContainer:second:container", "resource-csv"));
112     }
113 
114     @Test
115     public void userStatus() {
116         userStatusBatch(1, "resource-testdb2");
117     }
118 
119     @Test
120     public void userStatusOnSyncopeOnly() {
121         userStatusBatch(0, Constants.SYNCOPE);
122     }
123 
124     private static void userStatusBatch(final int index, final String resource) {
125         // suspend 
126         TESTER.clickLink("body:realmsLI:realms", false);
127         TESTER.clickLink("body:content:body:container:content:tabbedPanel:tabs-container:tabs:1:link");
128 
129         Component component = findComponentByProp("username", CONTAINER
130                 + ":searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable", "rossini");
131         assertNotNull(component);
132 
133         TESTER.executeAjaxEvent(component.getPageRelativePath(), Constants.ON_CLICK);
134         // enable
135         TESTER.clickLink(
136                 "body:content:body:container:content:tabbedPanel:panel:searchResult:outerObjectsRepeater:1"
137                 + ":outer:container:content:togglePanelContainer:container:actions:actions:actionRepeater:3:"
138                 + "action:action");
139 
140         TESTER.assertComponent(TAB_PANEL + "outerObjectsRepeater:2:outer:form:content:status:"
141                 + "firstLevelContainer:first:container:content:searchContainer:resultTable:tablePanel:groupForm:"
142                 + "checkgroup:dataTable", WebMarkupContainer.class);
143 
144         component = findComponentByProp("resource",
145                 TAB_PANEL + "outerObjectsRepeater:2:outer:form:content:status:firstLevelContainer:first:container:"
146                 + "content:searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable", resource);
147 
148         component = TESTER.getComponentFromLastRenderedPage(component.getPageRelativePath()
149                 + ":cells:1:cell:check");
150         assertEquals(Status.ACTIVE, StatusBean.class.cast(component.getDefaultModelObject()).getStatus());
151         assertEquals(resource, StatusBean.class.cast(component.getDefaultModelObject()).getResource());
152 
153         FormTester formTester = TESTER.newFormTester(
154                 TAB_PANEL + "outerObjectsRepeater:2:outer:form:content:status:firstLevelContainer:"
155                 + "first:container:content:searchContainer:resultTable:tablePanel:groupForm");
156         assertNotNull(formTester);
157 
158         formTester.select("checkgroup", index);
159 
160         TESTER.executeAjaxEvent(TAB_PANEL + "outerObjectsRepeater:2:outer:form:content:status:"
161                 + "firstLevelContainer:first:container:content:searchContainer:resultTable:tablePanel:batchLink",
162                 Constants.ON_CLICK);
163 
164         TESTER.assertComponent(TAB_PANEL + "outerObjectsRepeater:2:outer:form:content:status:"
165                 + "secondLevelContainer:second:container", WebMarkupContainer.class);
166 
167         // suspend link
168         TESTER.executeAjaxEvent(TAB_PANEL
169                 + "outerObjectsRepeater:2:outer:form:content:status:secondLevelContainer:"
170                 + "second:container:actions:actionRepeater:0:action:action",
171                 Constants.ON_CLICK);
172 
173         assertSuccessMessage();
174         TESTER.cleanupFeedbackMessages();
175 
176         TESTER.assertLabel(TAB_PANEL + "outerObjectsRepeater:2:outer:form:content:status:"
177                 + "secondLevelContainer:second:container:selectedObjects:body:rows:1:cells:4:cell", "SUCCESS");
178 
179         TESTER.executeAjaxEvent(TAB_PANEL
180                 + "outerObjectsRepeater:2:outer:form:content:status:secondLevelContainer:back",
181                 Constants.ON_CLICK);
182 
183         component = findComponentByProp("resource",
184                 TAB_PANEL + "outerObjectsRepeater:2:outer:form:content:status:firstLevelContainer:first:container:"
185                 + "content:searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable", resource);
186 
187         component = TESTER.getComponentFromLastRenderedPage(component.getPageRelativePath()
188                 + ":cells:1:cell:check");
189         assertEquals(Status.SUSPENDED, StatusBean.class.cast(component.getDefaultModelObject()).getStatus());
190         assertEquals(resource, StatusBean.class.cast(component.getDefaultModelObject()).getResource());
191 
192         // re-activate
193         TESTER.clickLink("body:realmsLI:realms", false);
194         TESTER.clickLink("body:content:body:container:content:tabbedPanel:tabs-container:tabs:1:link");
195 
196         component = findComponentByProp("username", CONTAINER
197                 + ":searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable", "rossini");
198         assertNotNull(component);
199 
200         TESTER.executeAjaxEvent(component.getPageRelativePath(), Constants.ON_CLICK);
201         // enable
202         TESTER.clickLink(
203                 "body:content:body:container:content:tabbedPanel:panel:searchResult:outerObjectsRepeater:1"
204                 + ":outer:container:content:togglePanelContainer:container:actions:actions:actionRepeater:3:"
205                 + "action:action");
206 
207         TESTER.assertComponent(TAB_PANEL + "outerObjectsRepeater:2:outer:form:content:status:"
208                 + "firstLevelContainer:first:container:content:searchContainer:resultTable:tablePanel:groupForm:"
209                 + "checkgroup:dataTable", WebMarkupContainer.class);
210 
211         formTester = TESTER.newFormTester(
212                 TAB_PANEL + "outerObjectsRepeater:2:outer:form:content:status:firstLevelContainer:"
213                 + "first:container:content:searchContainer:resultTable:tablePanel:groupForm");
214         assertNotNull(formTester);
215 
216         formTester.select("checkgroup", index);
217 
218         TESTER.executeAjaxEvent(TAB_PANEL + "outerObjectsRepeater:2:outer:form:content:status:"
219                 + "firstLevelContainer:first:container:content:searchContainer:resultTable:tablePanel:batchLink",
220                 Constants.ON_CLICK);
221 
222         TESTER.assertComponent(TAB_PANEL + "outerObjectsRepeater:2:outer:form:content:status:"
223                 + "secondLevelContainer:second:container", WebMarkupContainer.class);
224 
225         // suspend link
226         TESTER.executeAjaxEvent(TAB_PANEL
227                 + "outerObjectsRepeater:2:outer:form:content:status:secondLevelContainer:"
228                 + "second:container:actions:actionRepeater:1:action:action",
229                 Constants.ON_CLICK);
230 
231         assertSuccessMessage();
232         TESTER.cleanupFeedbackMessages();
233 
234         TESTER.assertLabel(TAB_PANEL + "outerObjectsRepeater:2:outer:form:content:status:"
235                 + "secondLevelContainer:second:container:selectedObjects:body:rows:1:cells:4:cell", "SUCCESS");
236 
237         TESTER.executeAjaxEvent(TAB_PANEL
238                 + "outerObjectsRepeater:2:outer:form:content:status:secondLevelContainer:back",
239                 Constants.ON_CLICK);
240 
241         component = findComponentByProp("resource",
242                 TAB_PANEL + "outerObjectsRepeater:2:outer:form:content:status:firstLevelContainer:first:container:"
243                 + "content:searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable", resource);
244 
245         component = TESTER.getComponentFromLastRenderedPage(component.getPageRelativePath()
246                 + ":cells:1:cell:check");
247         assertEquals(Status.ACTIVE, StatusBean.class.cast(component.getDefaultModelObject()).getStatus());
248         assertEquals(resource, StatusBean.class.cast(component.getDefaultModelObject()).getResource());
249 
250         TESTER.executeAjaxEvent(TAB_PANEL
251                 + "outerObjectsRepeater:2:outer:dialog:footer:buttons:0:button",
252                 Constants.ON_CLICK);
253     }
254 
255     @Test
256     public void groupResource() {
257         TESTER.clickLink("body:realmsLI:realms", false);
258         TESTER.clickLink("body:content:body:container:content:tabbedPanel:tabs-container:tabs:2:link");
259 
260         Component component = findComponentByProp("name", CONTAINER
261                 + ":searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable", "director");
262         assertNotNull(component);
263 
264         TESTER.executeAjaxEvent(component.getPageRelativePath(), Constants.ON_CLICK);
265         // manage resource
266         TESTER.clickLink(
267                 "body:content:body:container:content:tabbedPanel:panel:searchResult:outerObjectsRepeater:1"
268                 + ":outer:container:content:togglePanelContainer:container:actions:actions:actionRepeater:5:"
269                 + "action:action");
270 
271         TESTER.assertComponent(TAB_PANEL + "outerObjectsRepeater:2:outer:form:content:status:"
272                 + "firstLevelContainer:first:container:content:searchContainer:resultTable:tablePanel:groupForm:"
273                 + "checkgroup:dataTable", WebMarkupContainer.class);
274 
275         TESTER.clickLink(TAB_PANEL
276                 + "outerObjectsRepeater:2:outer:form:content:status:firstLevelContainer:first:"
277                 + "container:content:searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable:topToolbars:"
278                 + "toolbars:1:headers:2:header:orderByLink", true);
279 
280         component = findComponentByProp("resource",
281                 TAB_PANEL + "outerObjectsRepeater:2:outer:form:content:status:"
282                 + "firstLevelContainer:first:container:content:searchContainer:resultTable:tablePanel:groupForm:"
283                 + "checkgroup:dataTable", "resource-ldap");
284         assertNotNull(component);
285 
286         FormTester formTester = TESTER.newFormTester(
287                 TAB_PANEL + "outerObjectsRepeater:2:outer:form:content:status:firstLevelContainer:"
288                 + "first:container:content:searchContainer:resultTable:tablePanel:groupForm");
289         assertNotNull(formTester);
290 
291         formTester.select("checkgroup", 0);
292 
293         TESTER.executeAjaxEvent(TAB_PANEL + "outerObjectsRepeater:2:outer:form:content:status:"
294                 + "firstLevelContainer:first:container:content:searchContainer:resultTable:tablePanel:batchLink",
295                 Constants.ON_CLICK);
296 
297         TESTER.assertComponent(TAB_PANEL + "outerObjectsRepeater:2:outer:form:content:status:"
298                 + "secondLevelContainer:second:container", WebMarkupContainer.class);
299 
300         assertNotNull(findComponentByProp("resource", TAB_PANEL + "outerObjectsRepeater:2:outer:"
301                 + "form:content:status:secondLevelContainer:second:container:selectedObjects", "resource-ldap"));
302     }
303 
304     @Test
305     public void printerResource() {
306         TESTER.clickLink("body:realmsLI:realms", false);
307         TESTER.clickLink("body:content:body:container:content:tabbedPanel:tabs-container:tabs:3:link");
308 
309         Component component = findComponentByProp("key", CONTAINER
310                 + ":searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable",
311                 "8559d14d-58c2-46eb-a2d4-a7d35161e8f8");
312         assertNotNull(component);
313 
314         TESTER.executeAjaxEvent(component.getPageRelativePath(), Constants.ON_CLICK);
315         // manage resource
316         TESTER.clickLink(
317                 "body:content:body:container:content:tabbedPanel:panel:searchResult:outerObjectsRepeater:1"
318                 + ":outer:container:content:togglePanelContainer:container:actions:actions:actionRepeater:1:"
319                 + "action:action");
320 
321         TESTER.assertComponent(TAB_PANEL + "outerObjectsRepeater:2:outer:form:content:status:"
322                 + "firstLevelContainer:first:container:content:searchContainer:resultTable:tablePanel:groupForm:"
323                 + "checkgroup:dataTable", WebMarkupContainer.class);
324 
325         TESTER.clickLink(TAB_PANEL
326                 + "outerObjectsRepeater:2:outer:form:content:status:firstLevelContainer:first:"
327                 + "container:content:searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable:topToolbars:"
328                 + "toolbars:1:headers:2:header:orderByLink", true);
329 
330         component = findComponentByProp("resource",
331                 TAB_PANEL + "outerObjectsRepeater:2:outer:form:content:status:"
332                 + "firstLevelContainer:first:container:content:searchContainer:resultTable:tablePanel:groupForm:"
333                 + "checkgroup:dataTable", "resource-db-scripted");
334         assertNotNull(component);
335 
336         FormTester formTester = TESTER.newFormTester(
337                 TAB_PANEL + "outerObjectsRepeater:2:outer:form:content:status:firstLevelContainer:"
338                 + "first:container:content:searchContainer:resultTable:tablePanel:groupForm");
339         assertNotNull(formTester);
340 
341         formTester.select("checkgroup", 0);
342 
343         TESTER.executeAjaxEvent(TAB_PANEL + "outerObjectsRepeater:2:outer:form:content:status:"
344                 + "firstLevelContainer:first:container:content:searchContainer:resultTable:tablePanel:batchLink",
345                 Constants.ON_CLICK);
346 
347         TESTER.assertComponent(TAB_PANEL + "outerObjectsRepeater:2:outer:form:content:status:"
348                 + "secondLevelContainer:second:container", WebMarkupContainer.class);
349 
350         assertNotNull(findComponentByProp("resource", TAB_PANEL + "outerObjectsRepeater:2:outer:"
351                 + "form:content:status:secondLevelContainer:second:container:selectedObjects", "resource-db-scripted"));
352     }
353 
354     @Test
355     public void executePropagationTask() {
356         TESTER.clickLink("body:idmPages:0:idmPageLI:idmPage", false);
357 
358         Component component = findComponentByProp("key", "body:resources", "resource-testdb");
359         assertNotNull(component);
360         TESTER.executeAjaxEvent(component.getPageRelativePath() + ":res", Constants.ON_CLICK);
361         TESTER.clickLink(
362                 "body:toggle:container:content:togglePanelContainer:container:actions:propagation");
363 
364         FormTester formTester = TESTER.newFormTester(
365                 "body:toggle:outerObjectsRepeater:1:outer:form:content:tasks:firstLevelContainer:first:container:"
366                 + "content:searchContainer:resultTable:tablePanel:groupForm");
367         assertNotNull(formTester);
368 
369         formTester.select("checkgroup", 0);
370 
371         TESTER.executeAjaxEvent("body:toggle:outerObjectsRepeater:1:outer:form:content:tasks:"
372                 + "firstLevelContainer:first:container:content:searchContainer:resultTable:tablePanel:batchLink",
373                 Constants.ON_CLICK);
374 
375         TESTER.assertComponent(
376                 "body:toggle:outerObjectsRepeater:1:outer:form:content:tasks:secondLevelContainer:"
377                 + "second:container:selectedObjects:body:rows:1:cells:1:cell", Label.class);
378     }
379 }