1 /*
2 * Copyright (c) 2011-2022, jcabi.com
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met: 1) Redistributions of source code must retain the above
8 * copyright notice, this list of conditions and the following
9 * disclaimer. 2) Redistributions in binary form must reproduce the above
10 * copyright notice, this list of conditions and the following
11 * disclaimer in the documentation and/or other materials provided
12 * with the distribution. 3) Neither the name of the jcabi.com nor
13 * the names of its contributors may be used to endorse or promote
14 * products derived from this software without specific prior written
15 * permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT
19 * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
20 * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
21 * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
22 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
24 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
26 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
28 * OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30 package com.jcabi.http.response;
31
32 import com.jcabi.http.request.FakeRequest;
33 import java.net.URI;
34 import org.hamcrest.MatcherAssert;
35 import org.hamcrest.Matchers;
36 import org.junit.jupiter.api.Test;
37
38 /**
39 * Test case for {@link WebLinkingResponse}.
40 * @since 0.9
41 */
42 final class WebLinkingResponseTest {
43
44 /**
45 * The Link header.
46 */
47 private static final String LINK = "Link";
48
49 /**
50 * WebLinkingResponse can recognize Links in headers.
51 * @throws Exception If something goes wrong inside
52 */
53 @Test
54 @SuppressWarnings("PMD.AvoidInstantiatingObjectsInLoops")
55 void parsesLinksInHeaders() throws Exception {
56 final String[] headers = {
57 "</hey/foo>; title=\"Hi!\"; rel=foo",
58 "</hey/foo>; title=\"\u20ac\"; rel=\"foo\"; media=\"text/xml\"",
59 };
60 for (final String header : headers) {
61 final WebLinkingResponse response = new WebLinkingResponse(
62 new FakeRequest()
63 .withHeader(WebLinkingResponseTest.LINK, header)
64 .fetch()
65 );
66 final WebLinkingResponse.Link link = response.links().get("foo");
67 MatcherAssert.assertThat(
68 link.uri(),
69 Matchers.hasToString("/hey/foo")
70 );
71 MatcherAssert.assertThat(
72 link,
73 Matchers.hasKey("title")
74 );
75 MatcherAssert.assertThat(
76 response.links(),
77 Matchers.not(Matchers.hasKey("something else"))
78 );
79 }
80 }
81
82 /**
83 * WebLinkingResponse can follow a link.
84 * @throws Exception If something goes wrong inside
85 */
86 @Test
87 void followsLinksInHeaders() throws Exception {
88 final WebLinkingResponse response = new WebLinkingResponse(
89 new FakeRequest().withHeader(
90 WebLinkingResponseTest.LINK,
91 "</a>; rel=\"first\", <http://localhost/o>; rel=\"second\""
92 ).uri().set(new URI("http://localhost/test")).back().fetch()
93 );
94 MatcherAssert.assertThat(
95 response.follow("first").uri().get(),
96 Matchers.equalTo(new URI("http://localhost/a"))
97 );
98 MatcherAssert.assertThat(
99 response.follow("second").uri().get(),
100 Matchers.equalTo(new URI("http://localhost/o"))
101 );
102 }
103
104 }