View Javadoc
1   /****
2    * Copyright 2022 Internet2
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *   http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   ***/
16  
17  package edu.internet2.middleware.grouper.ws.scim;
18  
19  import com.fasterxml.jackson.databind.JsonNode;
20  import com.fasterxml.jackson.databind.ObjectMapper;
21  import org.apache.http.HttpResponse;
22  import org.apache.http.HttpStatus;
23  import org.apache.http.client.methods.HttpGet;
24  import org.apache.http.client.methods.HttpUriRequest;
25  import org.apache.http.entity.ContentType;
26  import org.apache.http.impl.client.HttpClientBuilder;
27  import org.apache.http.util.EntityUtils;
28  import org.junit.Test;
29  
30  import java.io.IOException;
31  import java.util.Arrays;
32  
33  import static org.hamcrest.CoreMatchers.equalTo;
34  import static org.hamcrest.MatcherAssert.assertThat;
35  import static org.junit.Assert.assertEquals;
36  
37  public class TierResourceTypesProviderIntegrationTest {
38  
39    private static final String RESOURCE_TYPES_ENDPOINT = "http://localhost:8080/grouper-ws/scim/v2/ResourceTypes";
40  
41    private void addScimHeaders(HttpUriRequest request) {
42      request.setHeader("Content-Type", "application/scim+json");
43      request.setHeader("Accept", "application/scim+json");
44      request.setHeader("Authorization", "Basic R3JvdXBlclN5c3RlbTpwYXNz");
45    }
46  
47    @Test
48    public void getResourceTypesConfig() throws IOException {
49  
50      HttpUriRequest request = new HttpGet(RESOURCE_TYPES_ENDPOINT);
51      addScimHeaders(request);
52  
53      HttpResponse httpResponse = HttpClientBuilder.create().build().execute(request);
54  
55      assertThat(httpResponse.getStatusLine().getStatusCode(), equalTo(HttpStatus.SC_OK));
56      assertThat(ContentType.getOrDefault(httpResponse.getEntity()).getMimeType(), equalTo("application/scim+json"));
57  
58      String jsonString = EntityUtils.toString(httpResponse.getEntity());
59      ObjectMapper objectMapper = new ObjectMapper();
60  
61      for (JsonNode node: objectMapper.readTree(jsonString)) {
62        assertThat(node.get("meta").get("resourceType").asText(), equalTo("ResourceType"));
63        assertEquals(objectMapper.readerForListOf(String.class).readValue(node.get("schemas")),
64                Arrays.asList("urn:ietf:params:scim:schemas:core:2.0:ResourceType"));
65  
66        switch (node.get("schema").asText()) {
67          case "urn:ietf:params:scim:schemas:core:2.0:Group":
68            assertThat(node.get("endpoint").asText(), equalTo("/Groups"));
69            assertThat(node.get("meta").get("location").asText(), equalTo("http://localhost:8080/grouper-ws/scim/v2/ResourceTypes/Group"));
70            assertThat(node.get("name").asText(), equalTo("Group"));
71            assertThat(node.get("description").asText(), equalTo("Top level SCIM Group"));
72            assertThat(node.get("schemaExtensions").get(0).get("schema").asText(), equalTo("urn:tier:params:scim:schemas:extension:TierMetaExtension"));
73            assertThat(node.get("schemaExtensions").get(0).get("required").asBoolean(), equalTo(Boolean.FALSE));
74            assertThat(node.get("schemaExtensions").get(1).get("schema").asText(), equalTo("urn:grouper:params:scim:schemas:extension:TierGroupExtension"));
75            assertThat(node.get("schemaExtensions").get(1).get("required").asBoolean(), equalTo(Boolean.FALSE));
76  
77            assertThat(node.get("id").asText(), equalTo("Group"));
78            break;
79          case "urn:ietf:params:scim:schemas:core:2.0:User":
80            assertThat(node.get("endpoint").asText(), equalTo("/Users"));
81            assertThat(node.get("meta").get("location").asText(), equalTo("http://localhost:8080/grouper-ws/scim/v2/ResourceTypes/User"));
82            assertThat(node.get("name").asText(), equalTo("User Account"));
83            assertThat(node.get("description").asText(), equalTo("Top level SCIM User"));
84            assertThat(node.get("schemaExtensions").get(0).get("schema").asText(), equalTo("urn:tier:params:scim:schemas:extension:TierMetaExtension"));
85            assertThat(node.get("schemaExtensions").get(0).get("required").asBoolean(), equalTo(Boolean.FALSE));
86            assertThat(node.get("id").asText(), equalTo("User"));
87            break;
88          case "urn:tier:params:scim:schemas:Membership":
89            assertThat(node.get("endpoint").asText(), equalTo("/Memberships"));
90            assertThat(node.get("meta").get("location").asText(), equalTo("http://localhost:8080/grouper-ws/scim/v2/ResourceTypes/Membership"));
91            assertThat(node.get("name").asText(), equalTo("Membership"));
92            assertThat(node.get("description").asText(), equalTo("Resource for representing Membership schema data"));
93            assertThat(node.get("id").asText(), equalTo("Membership"));
94            break;
95          default:
96            throw new RuntimeException("Unexpected resource type: " + node.get("id"));
97        }
98      }
99    }
100 
101   @Test
102   public void getUserResourceByName() throws IOException {
103     HttpUriRequest request = new HttpGet(RESOURCE_TYPES_ENDPOINT + "/User");
104     addScimHeaders(request);
105 
106     HttpResponse httpResponse = HttpClientBuilder.create().build().execute(request);
107 
108     assertThat(httpResponse.getStatusLine().getStatusCode(), equalTo(HttpStatus.SC_OK));
109     assertThat(ContentType.getOrDefault(httpResponse.getEntity()).getMimeType(), equalTo("application/scim+json"));
110 
111     String jsonString = EntityUtils.toString(httpResponse.getEntity());
112     ObjectMapper objectMapper = new ObjectMapper();
113     JsonNode json = objectMapper.readTree(jsonString);
114     assertThat(json.get("meta").get("resourceType").asText(), equalTo("ResourceType"));
115     assertEquals(objectMapper.readerForListOf(String.class).readValue(json.get("schemas")),
116             Arrays.asList("urn:ietf:params:scim:schemas:core:2.0:ResourceType"));
117     assertThat(json.get("endpoint").asText(), equalTo("/Users"));
118     assertThat(json.get("meta").get("location").asText(), equalTo("http://localhost:8080/grouper-ws/scim/v2/ResourceTypes/User"));
119     assertThat(json.get("name").asText(), equalTo("User Account"));
120     assertThat(json.get("description").asText(), equalTo("Top level SCIM User"));
121     assertThat(json.get("schemaExtensions").get(0).get("schema").asText(), equalTo("urn:tier:params:scim:schemas:extension:TierMetaExtension"));
122     assertThat(json.get("schemaExtensions").get(0).get("required").asBoolean(), equalTo(Boolean.FALSE));
123     assertThat(json.get("id").asText(), equalTo("User"));
124   }
125 
126   @Test
127   public void getGroupResourceByName() throws IOException {
128     HttpUriRequest request = new HttpGet(RESOURCE_TYPES_ENDPOINT + "/Group");
129     addScimHeaders(request);
130 
131     HttpResponse httpResponse = HttpClientBuilder.create().build().execute(request);
132 
133     assertThat(httpResponse.getStatusLine().getStatusCode(), equalTo(HttpStatus.SC_OK));
134     assertThat(ContentType.getOrDefault(httpResponse.getEntity()).getMimeType(), equalTo("application/scim+json"));
135 
136     String jsonString = EntityUtils.toString(httpResponse.getEntity());
137     ObjectMapper objectMapper = new ObjectMapper();
138     JsonNode json = objectMapper.readTree(jsonString);
139     assertThat(json.get("meta").get("resourceType").asText(), equalTo("ResourceType"));
140     assertEquals(objectMapper.readerForListOf(String.class).readValue(json.get("schemas")),
141             Arrays.asList("urn:ietf:params:scim:schemas:core:2.0:ResourceType"));
142     assertThat(json.get("endpoint").asText(), equalTo("/Groups"));
143     assertThat(json.get("meta").get("location").asText(), equalTo("http://localhost:8080/grouper-ws/scim/v2/ResourceTypes/Group"));
144     assertThat(json.get("name").asText(), equalTo("Group"));
145     assertThat(json.get("description").asText(), equalTo("Top level SCIM Group"));
146     assertThat(json.get("schemaExtensions").get(0).get("schema").asText(), equalTo("urn:tier:params:scim:schemas:extension:TierMetaExtension"));
147     assertThat(json.get("schemaExtensions").get(0).get("required").asBoolean(), equalTo(Boolean.FALSE));
148     assertThat(json.get("schemaExtensions").get(1).get("schema").asText(), equalTo("urn:grouper:params:scim:schemas:extension:TierGroupExtension"));
149     assertThat(json.get("schemaExtensions").get(1).get("required").asBoolean(), equalTo(Boolean.FALSE));
150 
151     assertThat(json.get("id").asText(), equalTo("Group"));
152   }
153 
154   @Test
155   public void getMembershipResourceByName() throws IOException {
156     HttpUriRequest request = new HttpGet(RESOURCE_TYPES_ENDPOINT + "/Membership");
157     addScimHeaders(request);
158 
159     HttpResponse httpResponse = HttpClientBuilder.create().build().execute(request);
160 
161     assertThat(httpResponse.getStatusLine().getStatusCode(), equalTo(HttpStatus.SC_OK));
162     assertThat(ContentType.getOrDefault(httpResponse.getEntity()).getMimeType(), equalTo("application/scim+json"));
163 
164     String jsonString = EntityUtils.toString(httpResponse.getEntity());
165     ObjectMapper objectMapper = new ObjectMapper();
166     JsonNode json = objectMapper.readTree(jsonString);
167     assertThat(json.get("meta").get("resourceType").asText(), equalTo("ResourceType"));
168     assertEquals(objectMapper.readerForListOf(String.class).readValue(json.get("schemas")),
169             Arrays.asList("urn:ietf:params:scim:schemas:core:2.0:ResourceType"));
170     assertThat(json.get("endpoint").asText(), equalTo("/Memberships"));
171     assertThat(json.get("meta").get("location").asText(), equalTo("http://localhost:8080/grouper-ws/scim/v2/ResourceTypes/Membership"));
172     assertThat(json.get("name").asText(), equalTo("Membership"));
173     assertThat(json.get("description").asText(), equalTo("Resource for representing Membership schema data"));
174     assertThat(json.get("id").asText(), equalTo("Membership"));
175   }
176 
177 }