View Javadoc

1   package com.atlassian.johnson.filters;
2   
3   import com.atlassian.johnson.Johnson;
4   import com.atlassian.johnson.JohnsonEventContainer;
5   import com.atlassian.johnson.event.Event;
6   import com.atlassian.johnson.event.EventType;
7   import com.atlassian.johnson.test.SimpleSetupConfig;
8   import org.junit.AfterClass;
9   import org.junit.Before;
10  import org.junit.BeforeClass;
11  import org.junit.Test;
12  import org.junit.runner.RunWith;
13  import org.mockito.Mock;
14  import org.mockito.runners.MockitoJUnitRunner;
15  
16  import javax.servlet.FilterChain;
17  import javax.servlet.FilterConfig;
18  import javax.servlet.ServletContext;
19  import javax.servlet.ServletException;
20  import javax.servlet.http.HttpServletRequest;
21  import javax.servlet.http.HttpServletResponse;
22  import java.io.IOException;
23  import java.util.Arrays;
24  
25  import static org.junit.Assert.assertEquals;
26  import static org.mockito.Mockito.eq;
27  import static org.mockito.Mockito.reset;
28  import static org.mockito.Mockito.same;
29  import static org.mockito.Mockito.verify;
30  import static org.mockito.Mockito.when;
31  
32  @RunWith(MockitoJUnitRunner.class)
33  public class JohnsonFilterTest {
34  
35      private static final String ALREADY_FILTERED = JohnsonFilter.class.getName() + "_already_filtered";
36  
37      private static JohnsonEventContainer container;
38  
39      @Mock
40      private FilterChain filterChain;
41      @Mock
42      private FilterConfig filterConfig;
43      private JohnsonFilter filter;
44      @Mock
45      private HttpServletRequest request;
46      @Mock
47      private HttpServletResponse response;
48      @Mock
49      private ServletContext servletContext;
50  
51      @AfterClass
52      public static void clearConfig() {
53          Johnson.terminate();
54      }
55  
56      @BeforeClass
57      public static void setConfig() {
58          Johnson.initialize("test-johnson-config.xml");
59  
60          container = Johnson.getEventContainer();
61      }
62  
63      @Before
64      public void setup() {
65          SimpleSetupConfig.IS_SETUP = false;
66  
67          when(filterConfig.getServletContext()).thenReturn(servletContext);
68          when(request.getContextPath()).thenReturn("");
69  
70          //Ensure each test starts with an empty container
71          for (Event event : container.getEvents()) {
72              container.removeEvent(event);
73          }
74  
75          filter = new JohnsonFilter();
76          filter.init(filterConfig);
77      }
78  
79      @Test
80      public void testErrorNotIgnorableURI() throws Exception {
81          container.addEvent(new Event(EventType.get("database"), "foo"));
82  
83          when(request.getRequestURI()).thenReturn("somepage.jsp");
84          when(request.getServletPath()).thenReturn("somepage.jsp");
85          when(request.getQueryString()).thenReturn("");
86  
87          filter.doFilter(request, response, filterChain);
88  
89          verify(response).sendRedirect(eq("/the/error/path.jsp?next=somepage.jsp"));
90      }
91  
92      @Test
93      public void testErrorsIgnorableUri() throws Exception {
94          container.addEvent(new Event(EventType.get("database"), "foo"));
95  
96          when(request.getServletPath()).thenReturn("/the/error/path.jsp");
97  
98          filter.doFilter(request, response, filterChain);
99  
100         verify(filterChain).doFilter(same(request), same(response));
101     }
102 
103     @Test
104     public void testNoErrorsAndNotSetup() throws Exception {
105         when(request.getServletPath()).thenReturn("somepage.jsp");
106 
107         filter.doFilter(request, response, filterChain);
108 
109         verify(response).sendRedirect(eq("/the/setup/path.jsp"));
110     }
111 
112     @Test
113     public void testNoErrorsSetup() throws Exception {
114         SimpleSetupConfig.IS_SETUP = true;
115 
116         when(request.getServletPath()).thenReturn("somepage.jsp");
117 
118         filter.doFilter(request, response, filterChain);
119 
120         verify(filterChain).doFilter(same(request), same(response));
121     }
122 
123     @Test
124     public void testNoErrorsSetupButSetupURI() throws Exception {
125         SimpleSetupConfig.IS_SETUP = true;
126 
127         when(request.getServletPath()).thenReturn("/setuppage.jsp");
128 
129         filter.doFilter(request, response, filterChain);
130 
131         verify(filterChain).doFilter(same(request), same(response));
132     }
133 
134     @Test
135     public void testNoErrorsNotSetupButSetupURI() throws Exception {
136         when(request.getServletPath()).thenReturn("/setup.jsp");
137 
138         filter.doFilter(request, response, filterChain);
139 
140         verify(filterChain).doFilter(same(request), same(response));
141     }
142 
143     @Test
144     public void testNoErrorsNotSetupIgnorableURI() throws Exception {
145         when(request.getServletPath()).thenReturn("/ignore/path/1.jsp");
146 
147         filter.doFilter(request, response, filterChain);
148 
149         verify(filterChain).doFilter(same(request), same(response));
150     }
151 
152     @Test
153     public void testNoErrorsNotSetupNotIgnorableURI() throws Exception {
154         when(request.getServletPath()).thenReturn("/somepage.jsp");
155 
156         filter.doFilter(request, response, filterChain);
157 
158         verify(response).sendRedirect(eq("/the/setup/path.jsp"));
159     }
160 
161     @Test
162     public void testNotAppliedTwice() throws ServletException, IOException {
163         when(request.getServletPath()).thenReturn("/somepage.jsp");
164 
165         filter.doFilter(request, response, filterChain);
166 
167         verify(response).sendRedirect(eq("/the/setup/path.jsp"));
168 
169         reset(filterChain, request);
170         when(request.getAttribute(eq(ALREADY_FILTERED))).thenReturn(Boolean.TRUE);
171 
172         filter.doFilter(request, response, filterChain);
173 
174         verify(filterChain).doFilter(same(request), same(response));
175     }
176 
177     @Test
178     public void testEmptyServletPaths() throws ServletException, IOException {
179         when(request.getServletPath()).thenReturn("");
180         when(request.getContextPath()).thenReturn("");
181         when(request.getRequestURI()).thenReturn("/requestpage.jsp");
182         when(request.getPathInfo()).thenReturn(null);
183 
184         filter.doFilter(request, response, filterChain);
185 
186         verify(response).sendRedirect(eq("/the/setup/path.jsp"));
187     }
188 
189     @Test
190     public void testGetStringForEvents() {
191         EventType type = new EventType("mytype", "mydesc");
192         Event[] eventsArr = new Event[]{new Event(type, "Error 1"), new Event(type, "Error 2")};
193         String stringForEvents = filter.getStringForEvents(Arrays.asList(eventsArr));
194         assertEquals("Error 1\nError 2", stringForEvents);
195     }
196 
197     @Test
198     public void testDestinationPathWithQueryParams() throws Exception {
199         container.addEvent(new Event(EventType.get("database"), "foo"));
200 
201         when(request.getRequestURI()).thenReturn("/the/page/we/want");
202         when(request.getQueryString()).thenReturn("query=somequery&query2=somequery2");
203 
204         filter.doFilter(request, response, filterChain);
205 
206         verify(response).sendRedirect(eq("/the/error/path.jsp?next=%2Fthe%2Fpage%2Fwe%2Fwant%3Fquery%3Dsomequery%26query2%3Dsomequery2"));
207     }
208 }