View Javadoc

1   package com.atlassian.johnson.filters;
2   
3   import com.atlassian.johnson.DefaultJohnsonEventContainer;
4   import com.atlassian.johnson.Johnson;
5   import com.atlassian.johnson.JohnsonEventContainer;
6   import com.atlassian.johnson.event.Event;
7   import com.atlassian.johnson.event.EventType;
8   import com.atlassian.johnson.test.SimpleSetupConfig;
9   import org.easymock.EasyMockSupport;
10  import org.junit.AfterClass;
11  import org.junit.Before;
12  import org.junit.BeforeClass;
13  import org.junit.Test;
14  
15  import javax.servlet.FilterChain;
16  import javax.servlet.FilterConfig;
17  import javax.servlet.ServletContext;
18  import javax.servlet.ServletException;
19  import javax.servlet.http.HttpServletRequest;
20  import javax.servlet.http.HttpServletResponse;
21  import java.io.IOException;
22  import java.util.Arrays;
23  
24  import static org.easymock.EasyMock.*;
25  import static org.junit.Assert.assertEquals;
26  
27  public class JohnsonFilterTest extends EasyMockSupport
28  {
29      public static final String ALREADY_FILTERED = JohnsonFilter.class.getName() + "_already_filtered";
30  
31      private JohnsonEventContainer container;
32      private JohnsonFilter filter;
33      private FilterChain filterChain;
34      private HttpServletRequest request;
35      private HttpServletResponse response;
36  
37      @AfterClass
38      public static void clearConfig()
39      {
40          Johnson.terminate();
41      }
42  
43      @BeforeClass
44      public static void setConfig()
45      {
46          Johnson.initialize("test-johnson-config.xml");
47      }
48  
49      @Before
50      public void setUp() throws Exception
51      {
52          SimpleSetupConfig.IS_SETUP = false;
53  
54          filter = new JohnsonFilter();
55          container = new DefaultJohnsonEventContainer();
56          request = getRequest();
57          response = getResponse();
58          filterChain = getFilterChain();
59      }
60  
61      @Test
62      public void testErrorNotIgnorableURI() throws Exception
63      {
64          container.addEvent(new Event(EventType.get("database"), "foo")); // add an event
65          expect(request.getServletPath()).andReturn("somepage.jsp").times(2);
66          response.sendRedirect(eq("/the/error/path.jsp")); // verify redirect
67          
68          replayAll();
69          filter.doFilter(request, response, filterChain);
70          verifyAll();
71      }
72  
73      @Test
74      public void testErrorsIgnorableUri() throws Exception
75      {
76          container.addEvent(new Event(EventType.get("export"), "foo")); // add an event
77          expect(request.getServletPath()).andReturn("/the/error/path.jsp");
78          filterChain.doFilter(same(request), same(response)); // verify that doFilter is called
79          
80          replayAll();
81          filter.doFilter(request, response, filterChain);
82          verifyAll();
83      }
84  
85      @Test
86      public void testNoErrorsAndNotSetup() throws Exception
87      {
88          expect(request.getServletPath()).andReturn("somepage.jsp").times(2);
89          response.sendRedirect(eq("/the/setup/path.jsp")); // verify redirect
90  
91          replayAll();
92          filter.doFilter(request, response, filterChain);
93          verifyAll();
94      }
95  
96      @Test
97      public void testNoErrorsSetup() throws Exception
98      {
99          SimpleSetupConfig.IS_SETUP = true;
100 
101         expect(request.getServletPath()).andReturn("somepage.jsp");
102         filterChain.doFilter(same(request), same(response));
103         
104         replayAll();
105         filter.doFilter(request, response, filterChain);
106         verifyAll();
107     }
108 
109     @Test
110     public void testNoErrorsSetupButSetupURI() throws Exception
111     {
112         SimpleSetupConfig.IS_SETUP = true;
113 
114         expect(request.getServletPath()).andReturn("/setuppage.jsp");
115         filterChain.doFilter(same(request), same(response));
116 
117         replayAll();
118         filter.doFilter(request, response, filterChain);
119         verifyAll();
120     }
121 
122     @Test
123     public void testNoErrorsNotSetupButSetupURI() throws Exception
124     {
125         expect(request.getServletPath()).andReturn("/setup.jsp"); // setup URI as containing 'setup'
126         filterChain.doFilter(same(request), same(response));
127 
128         replayAll();
129         filter.doFilter(request, response, filterChain);
130         verifyAll();
131     }
132 
133     @Test
134     public void testNoErrorsNotSetupIgnorableURI() throws Exception
135     {
136         expect(request.getServletPath()).andReturn("/ignore/path/1.jsp"); // setup URI as ignorable
137         filterChain.doFilter(same(request), same(response));
138 
139         replayAll();
140         filter.doFilter(request, response, filterChain);
141         verifyAll();
142     }
143 
144     @Test
145     public void testNoErrorsNotSetupNotIgnorableURI() throws Exception
146     {
147         expect(request.getServletPath()).andReturn("/somepage.jsp").times(2); // setup URI as not ignorable
148         response.sendRedirect(eq("/the/setup/path.jsp")); // verify redirect
149 
150         replayAll();
151         filter.doFilter(request, response, filterChain);
152         verifyAll();
153     }
154 
155     @Test
156     public void testNotAppliedTwice() throws ServletException, IOException
157     {
158         expect(request.getServletPath()).andReturn("/somepage.jsp").times(2);
159         response.sendRedirect(eq("/the/setup/path.jsp")); // verify redirect
160 
161         replayAll();
162         filter.doFilter(request, response, filterChain);
163         verifyAll();
164 
165         reset(request);
166         expect(request.getAttribute(eq(ALREADY_FILTERED))).andReturn(Boolean.TRUE);
167 
168         reset(filterChain);
169         filterChain.doFilter(same(request), same(response));
170 
171         replay(filterChain, request);
172         filter.doFilter(request, response, filterChain);
173         verify(filterChain, request);
174     }
175 
176     @Test
177     public void testEmptyServletPaths() throws ServletException, IOException
178     {
179         expect(request.getServletPath()).andStubReturn("");
180         expect(request.getContextPath()).andStubReturn("");
181         expect(request.getRequestURI()).andStubReturn("/requestpage.jsp");
182         expect(request.getPathInfo()).andStubReturn(null);
183         response.sendRedirect(eq("/the/setup/path.jsp")); // verify redirect
184 
185         replayAll();
186         filter.doFilter(request, response, filterChain);
187         verifyAll();
188     }
189 
190     @Test
191     public void testGetStringForEvents()
192     {
193         JohnsonFilter filter = new JohnsonFilter();
194         EventType type = new EventType("mytype", "mydesc");
195         Event[] eventsArr = new Event[]{new Event(type, "Error 1"), new Event(type, "Error 2")};
196         String stringForEvents = filter.getStringForEvents(Arrays.asList(eventsArr));
197         assertEquals("Error 1\nError 2", stringForEvents);
198     }
199 
200     private FilterChain getFilterChain() throws ServletException
201     {
202         container = new DefaultJohnsonEventContainer();
203 
204         ServletContext servletContext = createNiceMock(ServletContext.class);
205         expect(servletContext.getAttribute(same(Johnson.EVENT_CONTAINER_ATTRIBUTE))).andStubReturn(container);
206 
207         FilterChain filterChain = createNiceMock(FilterChain.class);
208 
209         FilterConfig filterConfig = createNiceMock(FilterConfig.class);
210         expect(filterConfig.getServletContext()).andStubReturn(servletContext);
211 
212         filter.init(filterConfig);
213         return filterChain;
214     }
215 
216     private HttpServletResponse getResponse()
217     {
218         return createStrictMock(HttpServletResponse.class);
219     }
220 
221     private HttpServletRequest getRequest()
222     {
223         HttpServletRequest request = createStrictMock(HttpServletRequest.class);
224         expect(request.getContextPath()).andStubReturn("");
225         expect(request.getAttribute(eq(ALREADY_FILTERED))).andReturn(null);
226         request.setAttribute(eq(ALREADY_FILTERED), eq(Boolean.TRUE));
227 
228         return request;
229     }
230 }