Skip to content

Commit ef60eda

Browse files
author
Dmitry Zinkevich
committed
[RestTemplate] Create unit test for delete() method
- Refactor RestTemplateClientTest
1 parent 8495018 commit ef60eda

File tree

4 files changed

+98
-149
lines changed

4 files changed

+98
-149
lines changed

spring-security-rest-full/src/main/java/org/baeldung/persistence/model/Owner.java

Lines changed: 0 additions & 25 deletions
This file was deleted.

spring-security-rest-full/src/main/java/org/baeldung/persistence/model/Repository.java

Lines changed: 0 additions & 35 deletions
This file was deleted.

spring-security-rest-full/src/main/java/org/baeldung/web/controller/FooController.java

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
package org.baeldung.web.controller;
22

3-
import java.util.List;
4-
5-
import javax.servlet.http.HttpServletResponse;
6-
3+
import com.google.common.base.Preconditions;
74
import org.baeldung.persistence.model.Foo;
85
import org.baeldung.persistence.service.IFooService;
96
import org.baeldung.web.exception.MyResourceNotFoundException;
@@ -15,17 +12,13 @@
1512
import org.springframework.context.ApplicationEventPublisher;
1613
import org.springframework.data.domain.Page;
1714
import org.springframework.http.HttpStatus;
15+
import org.springframework.http.MediaType;
1816
import org.springframework.stereotype.Controller;
19-
import org.springframework.web.bind.annotation.PathVariable;
20-
import org.springframework.web.bind.annotation.RequestBody;
21-
import org.springframework.web.bind.annotation.RequestMapping;
22-
import org.springframework.web.bind.annotation.RequestMethod;
23-
import org.springframework.web.bind.annotation.RequestParam;
24-
import org.springframework.web.bind.annotation.ResponseBody;
25-
import org.springframework.web.bind.annotation.ResponseStatus;
17+
import org.springframework.web.bind.annotation.*;
2618
import org.springframework.web.util.UriComponentsBuilder;
2719

28-
import com.google.common.base.Preconditions;
20+
import javax.servlet.http.HttpServletResponse;
21+
import java.util.List;
2922

3023
@Controller
3124
@RequestMapping(value = "/foos")
@@ -110,4 +103,11 @@ public void delete(@PathVariable("id") final Long id) {
110103
service.deleteById(id);
111104
}
112105

106+
@RequestMapping(method = RequestMethod.HEAD)
107+
@ResponseStatus(HttpStatus.OK)
108+
public void head(HttpServletResponse resp) {
109+
resp.setContentType(MediaType.APPLICATION_JSON_VALUE);
110+
resp.setHeader("bar", "baz");
111+
}
112+
113113
}

spring-security-rest-full/src/test/java/org/baeldung/client/RestTemplateLiveTest.java

Lines changed: 86 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -10,144 +10,119 @@
1010
import org.apache.http.impl.client.CloseableHttpClient;
1111
import org.apache.http.impl.client.HttpClientBuilder;
1212
import org.baeldung.persistence.model.Foo;
13-
import org.baeldung.persistence.model.Repository;
13+
import org.baeldung.persistence.service.IFooService;
1414
import org.baeldung.spring.PersistenceConfig;
1515
import org.junit.Before;
1616
import org.junit.Test;
1717
import org.junit.runner.RunWith;
18+
import org.springframework.beans.factory.annotation.Autowired;
1819
import org.springframework.http.*;
1920
import org.springframework.http.client.ClientHttpRequestFactory;
2021
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
2122
import org.springframework.http.converter.HttpMessageConverter;
2223
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
2324
import org.springframework.test.context.ContextConfiguration;
2425
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
26+
import org.springframework.web.client.HttpClientErrorException;
2527
import org.springframework.web.client.RequestCallback;
2628
import org.springframework.web.client.RestTemplate;
2729

2830
import java.io.IOException;
29-
import java.util.*;
31+
import java.util.ArrayList;
32+
import java.util.Arrays;
33+
import java.util.List;
34+
import java.util.Set;
3035

3136
import static org.apache.commons.codec.binary.Base64.encodeBase64;
3237
import static org.hamcrest.CoreMatchers.is;
3338
import static org.hamcrest.CoreMatchers.not;
3439
import static org.hamcrest.MatcherAssert.assertThat;
35-
import static org.hamcrest.Matchers.contains;
3640
import static org.hamcrest.Matchers.notNullValue;
3741
import static org.junit.Assert.assertTrue;
42+
import static org.junit.Assert.fail;
43+
3844
@RunWith(SpringJUnit4ClassRunner.class)
39-
@ContextConfiguration(classes = { PersistenceConfig.class })
45+
@ContextConfiguration(classes = {PersistenceConfig.class})
4046
public class RestTemplateLiveTest {
4147

4248
RestTemplate restTemplate;
4349
private List<HttpMessageConverter<?>> messageConverters;
44-
private final String userReposUrl = "https://api.github.com/users/eugenp/repos";
45-
private final String repoUrl = "https://api.github.com/repos/eugenp/tutorials";
46-
private final String fooService = "http://localhost:8080/spring-security-rest-full/foos";
50+
private static final String fooResourceUrl = "http://localhost:8080/spring-security-rest-full/foos";
51+
52+
@Autowired
53+
private IFooService fooService;
4754

4855
@Before
4956
public void beforeTest() {
50-
restTemplate = new RestTemplate();
57+
restTemplate = new RestTemplate(getClientHttpRequestFactory());
5158

5259
messageConverters = new ArrayList<>();
5360
MappingJackson2HttpMessageConverter jsonMessageConverter = new MappingJackson2HttpMessageConverter();
5461
jsonMessageConverter.setObjectMapper(new ObjectMapper());
5562
messageConverters.add(jsonMessageConverter);
63+
64+
ensureOneEntityExists();
5665
}
5766

5867
@Test
5968
public void givenValidEndpoint_whenSendGetForRequestEntity_thenStatusOk() throws IOException {
60-
ResponseEntity<String> response = restTemplate.getForEntity(userReposUrl, String.class);
69+
ResponseEntity<String> response = restTemplate.getForEntity(fooResourceUrl + "/1", String.class);
6170
assertThat(response.getStatusCode(), is(HttpStatus.OK));
6271
}
6372

6473
@Test
65-
public void givenRepoEndpoint_whenSendGetForRestEntity_thenReceiveCorrectRepoJson() throws IOException {
66-
ResponseEntity<String> response = restTemplate.getForEntity(repoUrl, String.class);
74+
public void givenRepoEndpoint_whenSendGetForRestEntity_thenReceiveCorrectJson() throws IOException {
75+
ResponseEntity<String> response = restTemplate.getForEntity(fooResourceUrl + "/1", String.class);
6776

6877
ObjectMapper mapper = new ObjectMapper();
6978
JsonNode root = mapper.readTree(response.getBody());
7079

7180
JsonNode name = root.path("name");
72-
assertThat(name.asText(), is("tutorials"));
81+
assertThat(name.asText(), is("bar"));
7382

74-
JsonNode owner = root.path("owner").path("login");
75-
assertThat(owner.asText(), is("eugenp"));
83+
JsonNode owner = root.path("id");
84+
assertThat(owner.asText(), is("1"));
7685
}
7786

7887
@Test
7988
public void givenRepoEndpoint_whenSendGetForObject_thenReturnsRepoObject() {
8089
restTemplate.setMessageConverters(messageConverters);
81-
String repoUrl = "https://api.github.com/repos/eugenp/tutorials";
82-
Repository repository = restTemplate.getForObject(repoUrl, Repository.class);
83-
84-
assertThat(repository.getName(), is("tutorials"));
85-
assertThat(repository.getOwner().getLogin(), is("eugenp"));
90+
Foo foo = restTemplate.getForObject(fooResourceUrl + "/1", Foo.class);
91+
assertThat(foo.getName(), is("bar"));
92+
assertThat(foo.getId(), is(1L));
8693
}
8794

8895
@Test
8996
public void givenFooService_whenPostForObject_thenCreatedObjectIsReturned() {
90-
String fooService = "http://localhost:8080/spring-security-rest-full/foos";
91-
92-
ClientHttpRequestFactory requestFactory = getClientHttpRequestFactory();
93-
RestTemplate restTemplate = new RestTemplate(requestFactory);
94-
9597
HttpEntity<Foo> request = new HttpEntity<>(new Foo("bar"));
96-
Foo foo = restTemplate.postForObject(fooService, request, Foo.class);
98+
Foo foo = restTemplate.postForObject(fooResourceUrl, request, Foo.class);
9799
assertThat(foo, notNullValue());
98100
assertThat(foo.getName(), is("bar"));
99101
}
100102

101103
@Test
102104
public void givenFooService_whenPostFor2Objects_thenNewObjectIsCreatedEachTime() {
103-
String fooService = "http://localhost:8080/spring-security-rest-full/foos";
104-
105105
ClientHttpRequestFactory requestFactory = getClientHttpRequestFactory();
106106
RestTemplate restTemplate = new RestTemplate(requestFactory);
107107

108108
HttpEntity<Foo> request = new HttpEntity<>(new Foo("bar"));
109-
Foo firstInstance = restTemplate.postForObject(fooService, request, Foo.class);
110-
Foo secondInstance = restTemplate.postForObject(fooService, request, Foo.class);
109+
Foo firstInstance = restTemplate.postForObject(fooResourceUrl, request, Foo.class);
110+
Foo secondInstance = restTemplate.postForObject(fooResourceUrl, request, Foo.class);
111111
assertThat(firstInstance, notNullValue());
112112
assertThat(secondInstance, notNullValue());
113113
assertThat(firstInstance.getId(), not(secondInstance.getId()));
114114
}
115115

116-
private ClientHttpRequestFactory getClientHttpRequestFactory() {
117-
int timeout = 5;
118-
RequestConfig config = RequestConfig.custom()
119-
.setConnectTimeout(timeout * 1000)
120-
.setConnectionRequestTimeout(timeout * 1000)
121-
.setSocketTimeout(timeout * 1000).build();
122-
123-
BasicCredentialsProvider credentialsProvider = new BasicCredentialsProvider();
124-
credentialsProvider.setCredentials(new AuthScope("localhost", 8080, AuthScope.ANY_REALM),
125-
new UsernamePasswordCredentials("user1", "user1Pass"));
126-
127-
CloseableHttpClient client = HttpClientBuilder.create()
128-
.setDefaultRequestConfig(config)
129-
.setDefaultCredentialsProvider(credentialsProvider).build();
130-
131-
return new HttpComponentsClientHttpRequestFactory(client);
132-
}
133-
134116
@Test
135117
public void givenResource_whenCallHeadForHeaders_thenReceiveAllHeadersForThatResource() {
136-
String repoUrl = "https://api.github.com/repos/eugenp/{repoName}";
137-
RestTemplate template = new RestTemplate();
138-
139-
Map<String, Object> uriVariables = new HashMap<>();
140-
uriVariables.put("repoName", "tutorials");
141-
142-
HttpHeaders httpHeaders = template.headForHeaders(repoUrl, uriVariables);
118+
HttpHeaders httpHeaders = restTemplate.headForHeaders(fooResourceUrl);
143119
assertTrue(httpHeaders.getContentType().includes(MediaType.APPLICATION_JSON));
144-
assertThat(httpHeaders.get("X-RateLimit-Limit"), contains("60"));
120+
assertTrue(httpHeaders.get("foo").contains("bar"));
145121
}
146122

147123
@Test
148124
public void givenResource_whenCallOptionsForAllow_thenReceiveValueOfAllowHeader() {
149-
RestTemplate template = new RestTemplate(getClientHttpRequestFactory());
150-
Set<HttpMethod> optionsForAllow = template.optionsForAllow(fooService);
125+
Set<HttpMethod> optionsForAllow = restTemplate.optionsForAllow(fooResourceUrl);
151126
HttpMethod[] supportedMethods = {HttpMethod.GET, HttpMethod.POST, HttpMethod.PUT, HttpMethod.DELETE};
152127
assertTrue(optionsForAllow.containsAll(Arrays.asList(supportedMethods)));
153128
}
@@ -159,25 +134,11 @@ public void givenRestService_whenPostResource_thenResourceIsCreated() {
159134
HttpHeaders headers = prepareBasicAuthHeaders();
160135
HttpEntity<Foo> request = new HttpEntity<>(new Foo("bar"), headers);
161136

162-
ResponseEntity<Foo> response = restTemplate.exchange(fooService, HttpMethod.POST, request, Foo.class);
137+
ResponseEntity<Foo> response = restTemplate.exchange(fooResourceUrl, HttpMethod.POST, request, Foo.class);
163138
assertThat(response.getStatusCode(), is(HttpStatus.CREATED));
164139
Foo foo = response.getBody();
165140
assertThat(foo, notNullValue());
166141
assertThat(foo.getName(), is("bar"));
167-
assertThat(foo.getId(), is(1L));
168-
}
169-
170-
private HttpHeaders prepareBasicAuthHeaders() {
171-
HttpHeaders headers = new HttpHeaders();
172-
String encodedLogPass = getBase64EncodedLogPass();
173-
headers.add(HttpHeaders.AUTHORIZATION, "Basic " + encodedLogPass);
174-
return headers;
175-
}
176-
177-
private String getBase64EncodedLogPass() {
178-
String logPass = "user1:user1Pass";
179-
byte[] authHeaderBytes = encodeBase64(logPass.getBytes(Charsets.US_ASCII));
180-
return new String(authHeaderBytes, Charsets.US_ASCII);
181142
}
182143

183144
@Test
@@ -187,23 +148,71 @@ public void givenResource_whenPutExistingEntity_thenItIsUpdated() {
187148
HttpEntity<Foo> request = new HttpEntity<>(new Foo("bar"), headers);
188149

189150
//Create entity
190-
ResponseEntity<Foo> response = restTemplate.exchange(fooService, HttpMethod.POST, request, Foo.class);
151+
ResponseEntity<Foo> response = restTemplate.exchange(fooResourceUrl, HttpMethod.POST, request, Foo.class);
191152
assertThat(response.getStatusCode(), is(HttpStatus.CREATED));
192-
assertThat(response.getBody().getId(), is(1L));
193153

194154
//Update entity
195155
Foo updatedInstance = new Foo("newName");
196-
updatedInstance.setId(1);
197-
String resourceUrl = fooService + "/1";
156+
updatedInstance.setId(response.getBody().getId());
157+
String resourceUrl = fooResourceUrl + '/' + response.getBody().getId();
198158
restTemplate.execute(resourceUrl, HttpMethod.PUT, requestCallback(updatedInstance), clientHttpResponse -> null);
199159

200160
//Check that entity was updated
201161
response = restTemplate.exchange(resourceUrl, HttpMethod.GET, new HttpEntity<>(headers), Foo.class);
202162
Foo foo = response.getBody();
203-
assertThat(foo.getId(), is(1L));
204163
assertThat(foo.getName(), is(updatedInstance.getName()));
205164
}
206165

166+
@Test
167+
public void givenRestService_whenCallDelete_thenEntityIsRemoved() {
168+
String entityUrl = fooResourceUrl + "/1";
169+
restTemplate.delete(entityUrl);
170+
try {
171+
restTemplate.getForEntity(entityUrl, Foo.class);
172+
fail();
173+
} catch (HttpClientErrorException ex) {
174+
assertThat(ex.getStatusCode(), is(HttpStatus.NOT_FOUND));
175+
}
176+
}
177+
178+
private void ensureOneEntityExists() {
179+
Foo instance = new Foo("bar");
180+
if (fooService.findOne(1L) == null) {
181+
fooService.create(instance);
182+
}
183+
}
184+
185+
private ClientHttpRequestFactory getClientHttpRequestFactory() {
186+
int timeout = 5;
187+
RequestConfig config = RequestConfig.custom()
188+
.setConnectTimeout(timeout * 1000)
189+
.setConnectionRequestTimeout(timeout * 1000)
190+
.setSocketTimeout(timeout * 1000).build();
191+
192+
BasicCredentialsProvider credentialsProvider = new BasicCredentialsProvider();
193+
credentialsProvider.setCredentials(new AuthScope("localhost", 8080, AuthScope.ANY_REALM),
194+
new UsernamePasswordCredentials("user1", "user1Pass"));
195+
196+
CloseableHttpClient client = HttpClientBuilder.create()
197+
.setDefaultRequestConfig(config)
198+
.setDefaultCredentialsProvider(credentialsProvider).build();
199+
200+
return new HttpComponentsClientHttpRequestFactory(client);
201+
}
202+
203+
private HttpHeaders prepareBasicAuthHeaders() {
204+
HttpHeaders headers = new HttpHeaders();
205+
String encodedLogPass = getBase64EncodedLogPass();
206+
headers.add(HttpHeaders.AUTHORIZATION, "Basic " + encodedLogPass);
207+
return headers;
208+
}
209+
210+
private String getBase64EncodedLogPass() {
211+
String logPass = "user1:user1Pass";
212+
byte[] authHeaderBytes = encodeBase64(logPass.getBytes(Charsets.US_ASCII));
213+
return new String(authHeaderBytes, Charsets.US_ASCII);
214+
}
215+
207216
private RequestCallback requestCallback(Foo updatedInstace) {
208217
return clientHttpRequest -> {
209218
ObjectMapper mapper = new ObjectMapper();

0 commit comments

Comments
 (0)