1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 package org.apache.struts2.rest;
23
24 import junit.framework.TestCase;
25 import org.springframework.mock.web.MockHttpServletRequest;
26 import org.springframework.mock.web.MockHttpServletResponse;
27
28 import static javax.servlet.http.HttpServletResponse.*;
29 import java.util.Date;
30
31 public class DefaultHttpHeadersTest extends TestCase {
32 private MockHttpServletResponse mockResponse;
33 private MockHttpServletRequest mockRequest;
34
35 @Override
36 public void setUp() {
37 mockResponse = new MockHttpServletResponse();
38 mockRequest = new MockHttpServletRequest();
39 }
40
41 @Override
42 public void tearDown() {
43 mockRequest = null;
44 mockRequest = null;
45 }
46
47 public void testApply() {
48 Date now = new Date();
49 DefaultHttpHeaders headers = new DefaultHttpHeaders()
50 .lastModified(now)
51 .withStatus(SC_OK)
52 .setLocationId("44")
53 .withETag("asdf");
54 mockRequest.setRequestURI("/foo/bar.xhtml");
55
56 headers.apply(mockRequest, mockResponse, new Object());
57
58 assertEquals(SC_CREATED, mockResponse.getStatus());
59 assertEquals("http://localhost:80/foo/bar/44.xhtml", mockResponse.getHeader("Location"));
60 assertEquals("asdf", mockResponse.getHeader("ETag"));
61 assertEquals(now.getTime(), mockResponse.getHeader("Last-Modified"));
62
63 }
64
65 public void testApplyNoLocationExtension() {
66 DefaultHttpHeaders headers = new DefaultHttpHeaders()
67 .setLocationId("44");
68 mockRequest.setRequestURI("/foo/bar");
69
70 headers.apply(mockRequest, mockResponse, new Object());
71 assertEquals("http://localhost:80/foo/bar/44", mockResponse.getHeader("Location"));
72 assertEquals(SC_CREATED, mockResponse.getStatus());
73 }
74
75 public void testApplyFullLocation() {
76 DefaultHttpHeaders headers = new DefaultHttpHeaders()
77 .setLocation("http://localhost/bar/44");
78 mockRequest.setRequestURI("/foo/bar");
79
80 headers.apply(mockRequest, mockResponse, new Object());
81 assertEquals("http://localhost/bar/44", mockResponse.getHeader("Location"));
82 assertEquals(SC_CREATED, mockResponse.getStatus());
83
84 }
85
86 public void testAutoETag() {
87 DefaultHttpHeaders headers = new DefaultHttpHeaders();
88 headers.apply(mockRequest, mockResponse, new Object() {
89 @Override
90 public int hashCode() {
91 return 123;
92 }
93 });
94
95 assertEquals("123", mockResponse.getHeader("ETag"));
96 }
97
98 public void testNoCache() {
99 DefaultHttpHeaders headers = new DefaultHttpHeaders()
100 .disableCaching();
101 headers.apply(mockRequest, mockResponse, new Object());
102
103 assertEquals("no-cache", mockResponse.getHeader("Cache-Control"));
104 }
105
106 public void testConditionalGetForJustETag() {
107 DefaultHttpHeaders headers = new DefaultHttpHeaders()
108 .withETag("asdf");
109 mockRequest.addHeader("If-None-Match", "asdf");
110 headers.apply(mockRequest, mockResponse, new Object());
111
112 assertEquals(SC_NOT_MODIFIED, mockResponse.getStatus());
113 assertEquals("asdf", mockResponse.getHeader("ETag"));
114 }
115
116 public void testConditionalGetForJustETagNotOK() {
117 DefaultHttpHeaders headers = new DefaultHttpHeaders()
118 .withETag("asdf")
119 .withStatus(SC_BAD_REQUEST);
120 mockRequest.addHeader("If-None-Match", "asdf");
121 headers.apply(mockRequest, mockResponse, new Object());
122
123 assertEquals(SC_BAD_REQUEST, mockResponse.getStatus());
124 assertEquals("asdf", mockResponse.getHeader("ETag"));
125 }
126
127 public void testConditionalGetForJustLastModified() {
128 Date now = new Date();
129 DefaultHttpHeaders headers = new DefaultHttpHeaders()
130 .lastModified(now);
131 mockRequest.addHeader("If-Modified-Since", String.valueOf(now.getTime()));
132 headers.apply(mockRequest, mockResponse, new Object());
133
134 assertEquals(SC_NOT_MODIFIED, mockResponse.getStatus());
135 }
136
137 public void testConditionalGetForJustLastModifiedDifferent() {
138 Date now = new Date();
139 DefaultHttpHeaders headers = new DefaultHttpHeaders()
140 .lastModified(now);
141 mockRequest.addHeader("If-Modified-Since", String.valueOf(new Date(2323L).getTime()));
142 headers.apply(mockRequest, mockResponse, new Object());
143
144 assertEquals(SC_OK, mockResponse.getStatus());
145 }
146
147 public void testConditionalGetForLastModifiedAndETag() {
148 Date now = new Date();
149 DefaultHttpHeaders headers = new DefaultHttpHeaders()
150 .lastModified(now)
151 .withETag("asdf");
152 mockRequest.addHeader("If-None-Match", "asdf");
153 mockRequest.addHeader("If-Modified-Since", String.valueOf(now.getTime()));
154 headers.apply(mockRequest, mockResponse, new Object());
155
156 assertEquals(SC_NOT_MODIFIED, mockResponse.getStatus());
157 }
158
159 public void testConditionalGetForLastModifiedAndETagButNoCache() {
160 Date now = new Date();
161 DefaultHttpHeaders headers = new DefaultHttpHeaders()
162 .lastModified(now)
163 .withETag("asdf")
164 .disableCaching();
165 mockRequest.addHeader("If-None-Match", "asdf");
166 mockRequest.addHeader("If-Modified-Since", String.valueOf(now.getTime()));
167 headers.apply(mockRequest, mockResponse, new Object());
168
169 assertEquals(SC_OK, mockResponse.getStatus());
170 }
171
172 public void testConditionalGetForLastModifiedAndETagWithBadETag() {
173 Date now = new Date();
174 DefaultHttpHeaders headers = new DefaultHttpHeaders()
175 .lastModified(now)
176 .withETag("fdsa");
177 mockRequest.addHeader("If-None-Match", "asdfds");
178 mockRequest.addHeader("If-Modified-Since", String.valueOf(now.getTime()));
179 headers.apply(mockRequest, mockResponse, new Object());
180
181 assertEquals(SC_OK, mockResponse.getStatus());
182 }
183 }