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.client.enduser;
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  import static org.junit.jupiter.api.Assertions.assertTrue;
25  
26  import java.io.IOException;
27  import java.security.AccessControlException;
28  import java.util.Map;
29  import java.util.concurrent.ExecutionException;
30  import javax.ws.rs.BadRequestException;
31  import org.apache.commons.lang3.StringUtils;
32  import org.apache.syncope.client.enduser.pages.Dashboard;
33  import org.apache.syncope.client.enduser.pages.Login;
34  import org.apache.syncope.common.lib.SyncopeClientCompositeException;
35  import org.apache.syncope.common.lib.SyncopeClientException;
36  import org.apache.syncope.common.lib.types.ClientExceptionType;
37  import org.apache.wicket.feedback.FeedbackMessage;
38  import org.apache.wicket.util.tester.FormTester;
39  import org.junit.jupiter.api.Test;
40  
41  public class SyncopeEnduserApplicationTest extends AbstractTest {
42  
43      @Test
44      public void securityHeaders() throws IOException {
45          Map<String, String> securityHeaders = PROPS.getSecurityHeaders();
46          assertEquals(4, securityHeaders.size());
47  
48          // 1. anonymous
49          TESTER.startPage(Login.class);
50          TESTER.assertRenderedPage(Login.class);
51          securityHeaders.forEach((key, value) -> assertEquals(value, TESTER.getLastResponse().getHeader(key)));
52  
53          // 2. authenticated
54          FormTester formTester = TESTER.newFormTester("login");
55          formTester.setValue("username", "username");
56          formTester.setValue("password", "password");
57          formTester.submit("submit");
58  
59          TESTER.assertRenderedPage(Dashboard.class);
60          securityHeaders.forEach((key, value) -> assertEquals(value, TESTER.getLastResponse().getHeader(key)));
61      }
62  
63      @Test
64      public void errors() {
65          SyncopeEnduserSession session = SyncopeEnduserSession.get();
66  
67          assertNull(session.getFeedbackMessages().first());
68  
69          session.onException(new AccessControlException("JWT Expired"));
70          FeedbackMessage message = session.getFeedbackMessages().first();
71          assertNotNull(message);
72          assertTrue(message.isError());
73          assertEquals(SyncopeEnduserSession.Error.SESSION_EXPIRED.fallback(), message.getMessage());
74          session.getFeedbackMessages().clear();
75  
76          session.onException(new AccessControlException("Auth Exception"));
77          message = session.getFeedbackMessages().first();
78          assertNotNull(message);
79          assertTrue(message.isError());
80          assertEquals(SyncopeEnduserSession.Error.AUTHORIZATION.fallback(), message.getMessage());
81          session.getFeedbackMessages().clear();
82  
83          session.onException(new BadRequestException());
84          message = session.getFeedbackMessages().first();
85          assertNotNull(message);
86          assertTrue(message.isError());
87          assertEquals(SyncopeEnduserSession.Error.REST.fallback(), message.getMessage());
88          session.getFeedbackMessages().clear();
89  
90          SyncopeClientException sce = SyncopeClientException.build(ClientExceptionType.InvalidUser);
91          sce.getElements().add("Error 1");
92          session.onException(sce);
93          message = session.getFeedbackMessages().first();
94          assertNotNull(message);
95          assertTrue(message.isError());
96          assertEquals(ClientExceptionType.InvalidUser.name() + ": Error 1", message.getMessage());
97          session.getFeedbackMessages().clear();
98  
99          sce = SyncopeClientException.build(ClientExceptionType.InvalidUser);
100         sce.getElements().add("Error 1");
101         sce.getElements().add("Error 2");
102         session.onException(sce);
103         message = session.getFeedbackMessages().first();
104         assertNotNull(message);
105         assertTrue(message.isError());
106         assertEquals(ClientExceptionType.InvalidUser.name() + ": Error 1, Error 2", message.getMessage());
107         session.getFeedbackMessages().clear();
108 
109         SyncopeClientCompositeException scce = SyncopeClientException.buildComposite();
110         scce.addException(SyncopeClientException.build(ClientExceptionType.InvalidUser));
111         scce.addException(SyncopeClientException.build(ClientExceptionType.InvalidExternalResource));
112         session.onException(new ExecutionException(scce));
113         message = session.getFeedbackMessages().first();
114         assertNotNull(message);
115         assertTrue(message.isError());
116         assertTrue(StringUtils.contains((CharSequence) message.getMessage(),
117                 ClientExceptionType.InvalidExternalResource.name()));
118         assertTrue(StringUtils.contains((CharSequence) message.getMessage(), ClientExceptionType.InvalidUser.name()));
119         session.getFeedbackMessages().clear();
120     }
121 }