1 package com.atlassian.johnson.filters;
2
3 import com.atlassian.johnson.JohnsonEventContainer;
4 import com.atlassian.johnson.event.Event;
5 import com.atlassian.johnson.event.EventLevel;
6 import com.atlassian.johnson.event.EventType;
7 import com.google.common.collect.Lists;
8 import org.junit.Test;
9 import org.junit.runner.RunWith;
10 import org.mockito.Mock;
11 import org.mockito.runners.MockitoJUnitRunner;
12
13 import javax.servlet.http.HttpServletResponse;
14 import java.io.IOException;
15 import java.io.PrintWriter;
16
17 import static org.mockito.Mockito.eq;
18 import static org.mockito.Mockito.verify;
19 import static org.mockito.Mockito.when;
20
21 @RunWith(MockitoJUnitRunner.class)
22 public class Johnson503FilterTest {
23
24 private static final EventType DEFAULT_EVENT_TYPE = new EventType("event-type", "event-type-desc");
25
26 @Mock
27 private JohnsonEventContainer eventContainer;
28 @Mock
29 private HttpServletResponse response;
30 @Mock
31 private PrintWriter writer;
32
33 @Test
34 public void testHandleErrorWithNullContainer() throws IOException {
35 when(response.getWriter()).thenReturn(writer);
36
37 new Johnson503Filter().handleError(null, null, response);
38
39 verify(response).setStatus(eq(HttpServletResponse.SC_SERVICE_UNAVAILABLE));
40 verify(response).getWriter();
41 verify(writer).flush();
42 }
43
44 @Test
45 public void testHandleErrorWithEmptyContainer() throws IOException {
46 when(response.getWriter()).thenReturn(writer);
47
48 new Johnson503Filter().handleError(eventContainer, null, response);
49
50 verify(eventContainer).hasEvents();
51 verify(response).setStatus(eq(HttpServletResponse.SC_SERVICE_UNAVAILABLE));
52 verify(response).getWriter();
53 verify(writer).flush();
54 }
55
56 @Test
57 public void testHandleErrorWithWarningOnly() throws IOException {
58 when(eventContainer.hasEvents()).thenReturn(Boolean.TRUE);
59 when(eventContainer.getEvents()).thenReturn(Lists.newArrayList(createEvent(EventLevel.WARNING)));
60 when(response.getWriter()).thenReturn(writer);
61
62 new Johnson503Filter().handleError(eventContainer, null, response);
63
64 verify(eventContainer).hasEvents();
65 verify(response).setStatus(eq(HttpServletResponse.SC_SERVICE_UNAVAILABLE));
66 verify(response).setHeader(eq("Retry-After"), eq("30"));
67 verify(writer).flush();
68 }
69
70 @Test
71 public void testHandleErrorWithErrorOnly() throws IOException {
72 when(eventContainer.hasEvents()).thenReturn(Boolean.TRUE);
73 when(eventContainer.getEvents()).thenReturn(Lists.newArrayList(createEvent(EventLevel.ERROR)));
74 when(response.getWriter()).thenReturn(writer);
75
76 new Johnson503Filter().handleError(eventContainer, null, response);
77
78 verify(eventContainer).hasEvents();
79 verify(response).setStatus(eq(HttpServletResponse.SC_SERVICE_UNAVAILABLE));
80 verify(writer).flush();
81 }
82
83 @Test
84 public void testHandleErrorWithCustomLevel() throws IOException {
85 when(eventContainer.hasEvents()).thenReturn(Boolean.TRUE);
86 when(eventContainer.getEvents()).thenReturn(Lists.newArrayList(createEvent("my-level")));
87 when(response.getWriter()).thenReturn(writer);
88
89 new Johnson503Filter().handleError(eventContainer, null, response);
90
91 verify(eventContainer).hasEvents();
92 verify(response).setStatus(eq(HttpServletResponse.SC_SERVICE_UNAVAILABLE));
93 verify(writer).flush();
94 }
95
96 @Test
97 public void testHandleErrorWithErrorAndWarningOnly() throws IOException {
98 when(eventContainer.hasEvents()).thenReturn(Boolean.TRUE);
99 when(eventContainer.getEvents()).thenReturn(Lists.newArrayList(createEvent(EventLevel.ERROR), createEvent(EventLevel.WARNING)));
100 when(response.getWriter()).thenReturn(writer);
101
102 new Johnson503Filter().handleError(eventContainer, null, response);
103
104 verify(response).setStatus(eq(HttpServletResponse.SC_SERVICE_UNAVAILABLE));
105 verify(writer).flush();
106 }
107
108 @Test
109 public void testHandleNotSetup() throws IOException {
110 when(response.getWriter()).thenReturn(writer);
111
112 new Johnson503Filter().handleNotSetup(null, response);
113
114 verify(response).setStatus(eq(HttpServletResponse.SC_SERVICE_UNAVAILABLE));
115 verify(writer).flush();
116 }
117
118 private Event createEvent(String eventLevel) {
119 return new Event(DEFAULT_EVENT_TYPE, "event-desc", createEventLevel(eventLevel));
120 }
121
122 private EventLevel createEventLevel(String eventLevel) {
123 return new EventLevel(eventLevel, "event-level-desc");
124 }
125 }