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
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 }