View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  package org.apache.syncope.fit.console;
20  
21  import static org.junit.jupiter.api.Assertions.assertNotNull;
22  import static org.junit.jupiter.api.Assertions.assertNull;
23  
24  import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
25  import org.apache.syncope.client.console.pages.Notifications;
26  import org.apache.syncope.client.ui.commons.Constants;
27  import org.apache.wicket.Component;
28  import org.apache.wicket.markup.html.WebMarkupContainer;
29  import org.apache.wicket.util.tester.FormTester;
30  import org.junit.jupiter.api.BeforeEach;
31  import org.junit.jupiter.api.Test;
32  
33  public class NotificationsITCase extends AbstractConsoleITCase {
34  
35      @BeforeEach
36      public void login() {
37          doLogin(ADMIN_UNAME, ADMIN_PWD);
38          TESTER.clickLink("body:configurationLI:configurationUL:notificationsLI:notifications", false);
39          TESTER.assertRenderedPage(Notifications.class);
40      }
41  
42      private static void createNotification(final String sender, final String subject) {
43          TESTER.clickLink("body:content:tabbedPanel:panel:container:content:add");
44  
45          TESTER.assertComponent("body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer",
46                  Modal.class);
47  
48          FormTester formTester = TESTER.newFormTester(
49                  "body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer:form");
50  
51          formTester.select("content:form:view:template:dropDownChoiceField", 2);
52          formTester.select("content:form:view:traceLevel:dropDownChoiceField", 0);
53          formTester.setValue("content:form:view:sender:textField", sender);
54          formTester.setValue("content:form:view:subject:textField", subject);
55  
56          TESTER.cleanupFeedbackMessages();
57          formTester.submit("content:form:buttons:next");
58          TESTER.assertNoErrorMessage();
59  
60          // -------------------------------
61          // recipients
62          // -------------------------------
63          formTester = TESTER.newFormTester(
64                  "body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer:form");
65          TESTER.executeAjaxEvent(
66                  "body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer:form:content:form:"
67                  + "view:staticRecipients:multiValueContainer:innerForm:content:panelPlus:add", Constants.ON_CLICK);
68          formTester.setValue("content:form:view:staticRecipients:multiValueContainer:innerForm:content:view:0:panel:"
69                  + "textField", "recipient@syncope.org");
70          formTester.setValue("content:form:view:selfAsRecipient:checkboxField", true);
71          formTester.setValue("content:form:view:recipientAttrName:textField", "email");
72  
73          TESTER.cleanupFeedbackMessages();
74          formTester.submit("content:form:buttons:next");
75          TESTER.assertNoErrorMessage();
76  
77          // -------------------------------
78          // generate event to populate eventsPanel
79          // -------------------------------
80          formTester = TESTER.newFormTester(
81                  "body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer:form");
82          formTester.setValue("content:form:view:eventSelection:categoryContainer:category:dropDownChoiceField", "0");
83          TESTER.executeAjaxEvent("body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer:form:"
84                  + "content:form:view:eventSelection:categoryContainer:category:dropDownChoiceField",
85                  Constants.ON_CHANGE);
86          // -------------------------------
87  
88          // -------------------------------
89          // select event template
90          // -------------------------------
91          formTester.setValue("content:form:view:eventSelection:eventsContainer:eventsPanel:successGroup", "check0");
92          TESTER.executeAjaxEvent(
93                  "body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer:form:content:"
94                  + "form:view:eventSelection:eventsContainer:eventsPanel:successGroup",
95                  Constants.ON_CHANGE);
96          // -------------------------------
97  
98          formTester.setValue("content:form:view:eventSelection:categoryContainer:category:dropDownChoiceField", "0");
99          formTester.setValue("content:form:view:eventSelection:eventsContainer:eventsPanel:successGroup", "check0");
100 
101         TESTER.cleanupFeedbackMessages();
102         formTester.submit("content:form:buttons:next");
103         TESTER.assertNoErrorMessage();
104 
105         formTester = TESTER.newFormTester(
106                 "body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer:form");
107         TESTER.cleanupFeedbackMessages();
108 
109         TESTER.cleanupFeedbackMessages();
110         formTester.submit("content:form:buttons:finish");
111         assertSuccessMessage();
112         TESTER.cleanupFeedbackMessages();
113         TESTER.clickLink("body:configurationLI:configurationUL:notificationsLI:notifications", false);
114     }
115 
116     @Test
117     public void read() {
118         assertNull(findComponentByProp(KEY,
119                 "body:content:tabbedPanel:panel:container:content:searchContainer:"
120                 + "resultTable:tablePanel:groupForm:checkgroup:dataTable", 1));
121     }
122 
123     @Test
124     public void create() {
125         createNotification("create@syncope.org", "create");
126     }
127 
128     @Test
129     public void update() {
130         createNotification("update@syncope.org", "createToUpdate");
131         Component result = findComponentByProp("Subject", "body:content:tabbedPanel:panel:container:content:"
132                 + "searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable", "createToUpdate");
133 
134         // edit notification
135         TESTER.executeAjaxEvent(result.getPageRelativePath(), Constants.ON_CLICK);
136         TESTER.clickLink(
137                 "body:content:tabbedPanel:panel:outerObjectsRepeater:1:outer:container:content:"
138                 + "togglePanelContainer:container:actions:actions:actionRepeater:0:action:action");
139 
140         FormTester formTester = TESTER.newFormTester(
141                 "body:content:tabbedPanel:panel:outerObjectsRepeater:0:outer:form");
142         formTester.submit("content:form:buttons:finish");
143 
144         assertSuccessMessage();
145         TESTER.cleanupFeedbackMessages();
146     }
147 
148     @Test
149     public void execute() {
150         TESTER.clickLink("body:configurationLI:configurationUL:notificationsLI:notifications", false);
151 
152         Component result = findComponentByProp("subject",
153                 "body:content:tabbedPanel:panel:container:content:searchContainer:resultTable:tablePanel:groupForm:"
154                 + "checkgroup:dataTable", "Password Reset request");
155 
156         // notification tasks link
157         TESTER.executeAjaxEvent(result.getPageRelativePath(), Constants.ON_CLICK);
158         TESTER.clickLink(
159                 "body:content:tabbedPanel:panel:outerObjectsRepeater:1:outer:container:content:"
160                 + "togglePanelContainer:container:actions:actions:actionRepeater:1:action:action");
161 
162         TESTER.assertComponent("body:content:tabbedPanel:panel:outerObjectsRepeater:4:outer:form:"
163                 + "content:tasks:firstLevelContainer:first:container:content:searchContainer:resultTable:tablePanel:"
164                 + "groupForm:checkgroup:dataTable", WebMarkupContainer.class);
165 
166         result = findComponentByProp("subject",
167                 "body:content:tabbedPanel:panel:outerObjectsRepeater:4:outer:form:"
168                 + "content:tasks:firstLevelContainer:first:container:content:searchContainer:resultTable:tablePanel:"
169                 + "groupForm:checkgroup:dataTable", "Notification for SYNCOPE-81");
170 
171         // execute task
172         TESTER.executeAjaxEvent(result.getPageRelativePath(), Constants.ON_CLICK);
173         TESTER.clickLink(
174                 "body:content:tabbedPanel:panel:outerObjectsRepeater:4:outer:form:content:tasks:"
175                 + "firstLevelContainer:first:outerObjectsRepeater:1:outer:container:content:togglePanelContainer:"
176                 + "container:actions:actions:actionRepeater:3:action:action");
177 
178         assertSuccessMessage();
179         TESTER.cleanupFeedbackMessages();
180 
181         TESTER.clickLink("body:configurationLI:configurationUL:notificationsLI:notifications", false);
182 
183         result = findComponentByProp("subject", "body:content:tabbedPanel:panel:container:content:"
184                 + "searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable", "Password Reset request");
185 
186         // notification tasks link
187         TESTER.executeAjaxEvent(result.getPageRelativePath(), Constants.ON_CLICK);
188         TESTER.clickLink(
189                 "body:content:tabbedPanel:panel:outerObjectsRepeater:1:outer:container:content:"
190                 + "togglePanelContainer:container:actions:actions:actionRepeater:1:action:action");
191 
192         result = findComponentByProp("subject",
193                 "body:content:tabbedPanel:panel:outerObjectsRepeater:4:outer:form:"
194                 + "content:tasks:firstLevelContainer:first:container:content:searchContainer:resultTable:tablePanel:"
195                 + "groupForm:checkgroup:dataTable", "Notification for SYNCOPE-81");
196 
197         // view task
198         TESTER.executeAjaxEvent(result.getPageRelativePath(), Constants.ON_CLICK);
199         TESTER.clickLink(
200                 "body:content:tabbedPanel:panel:outerObjectsRepeater:4:outer:form:content:tasks:"
201                 + "firstLevelContainer:first:outerObjectsRepeater:1:outer:container:content:togglePanelContainer:"
202                 + "container:actions:actions:actionRepeater:0:action:action");
203 
204         TESTER.assertLabel(
205                 "body:content:tabbedPanel:panel:outerObjectsRepeater:4:outer:form:content:tasks:"
206                 + "secondLevelContainer:title", "Executions");
207 
208         TESTER.clickLink(
209                 "body:content:tabbedPanel:panel:outerObjectsRepeater:4:outer:form:content:tasks:"
210                 + "secondLevelContainer:back");
211 
212         assertNotNull(findComponentByProp("subject",
213                 "body:content:tabbedPanel:panel:outerObjectsRepeater:4:outer:form:"
214                 + "content:tasks:firstLevelContainer:first:container:content:searchContainer:resultTable:tablePanel:"
215                 + "groupForm:checkgroup:dataTable", "Notification for SYNCOPE-81"));
216     }
217 
218     @Test
219     public void delete() {
220         createNotification("delete@syncope.org", "createToDelete");
221         Component result = findComponentByProp("Subject", "body:content:tabbedPanel:panel:container:content:"
222                 + "searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable", "createToDelete");
223 
224         TESTER.executeAjaxEvent(result.getPageRelativePath(), Constants.ON_CLICK);
225         TESTER.getRequest().addParameter("confirm", "true");
226 
227         // delete task
228         TESTER.clickLink(TESTER.getComponentFromLastRenderedPage(
229                 "body:content:tabbedPanel:panel:outerObjectsRepeater:1:outer:container:content:"
230                 + "togglePanelContainer:container:actions:actions:actionRepeater:2:action:action"));
231 
232         TESTER.executeAjaxEvent(TESTER.getComponentFromLastRenderedPage(
233                 "body:content:tabbedPanel:panel:outerObjectsRepeater:1:outer:container:content:"
234                 + "togglePanelContainer:container:actions:actions:actionRepeater:2:action:action"),
235                 Constants.ON_CLICK);
236 
237         assertSuccessMessage();
238         TESTER.cleanupFeedbackMessages();
239 
240         assertNull(findComponentByProp("Subject", "body:content:tabbedPanel:panel:container:content:"
241                 + "searchContainer:resultTable:tablePanel:groupForm:checkgroup:dataTable", "createToDelete"));
242     }
243 }