1010import org .apache .http .impl .client .CloseableHttpClient ;
1111import org .apache .http .impl .client .HttpClientBuilder ;
1212import org .baeldung .persistence .model .Foo ;
13- import org .baeldung .persistence .model . Repository ;
13+ import org .baeldung .persistence .service . IFooService ;
1414import org .baeldung .spring .PersistenceConfig ;
1515import org .junit .Before ;
1616import org .junit .Test ;
1717import org .junit .runner .RunWith ;
18+ import org .springframework .beans .factory .annotation .Autowired ;
1819import org .springframework .http .*;
1920import org .springframework .http .client .ClientHttpRequestFactory ;
2021import org .springframework .http .client .HttpComponentsClientHttpRequestFactory ;
2122import org .springframework .http .converter .HttpMessageConverter ;
2223import org .springframework .http .converter .json .MappingJackson2HttpMessageConverter ;
2324import org .springframework .test .context .ContextConfiguration ;
2425import org .springframework .test .context .junit4 .SpringJUnit4ClassRunner ;
26+ import org .springframework .web .client .HttpClientErrorException ;
2527import org .springframework .web .client .RequestCallback ;
2628import org .springframework .web .client .RestTemplate ;
2729
2830import 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
3136import static org .apache .commons .codec .binary .Base64 .encodeBase64 ;
3237import static org .hamcrest .CoreMatchers .is ;
3338import static org .hamcrest .CoreMatchers .not ;
3439import static org .hamcrest .MatcherAssert .assertThat ;
35- import static org .hamcrest .Matchers .contains ;
3640import static org .hamcrest .Matchers .notNullValue ;
3741import 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 })
4046public 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