blob: fb12e76803fe798afa358ce882d1d84cd67f6dc9 [file] [log] [blame]
/*******************************************************************************
* Copyright 2017 General Electric Company
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* SPDX-License-Identifier: Apache-2.0
*******************************************************************************/
package com.ge.predix.controller.test;
import com.ge.predix.acs.rest.BaseSubject;
import com.ge.predix.acs.rest.Zone;
import com.ge.predix.acs.testutils.MockAcsRequestContext;
import com.ge.predix.acs.testutils.MockMvcContext;
import com.ge.predix.acs.testutils.MockSecurityContext;
import com.ge.predix.acs.testutils.TestActiveProfilesResolver;
import com.ge.predix.acs.zone.management.ZoneService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.http.MediaType;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.testng.AbstractTestNGSpringContextTests;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.web.context.WebApplicationContext;
import org.testng.SkipException;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import java.net.URLEncoder;
import java.util.Arrays;
import java.util.List;
import static com.ge.predix.acs.testutils.XFiles.AGENT_MULDER;
import static com.ge.predix.acs.testutils.XFiles.FBI;
import static com.ge.predix.acs.testutils.XFiles.SITE_BASEMENT;
import static com.ge.predix.acs.testutils.XFiles.SITE_QUANTICO;
import static com.ge.predix.acs.testutils.XFiles.SPECIAL_AGENTS_GROUP;
import static com.ge.predix.acs.testutils.XFiles.SPECIAL_AGENTS_GROUP_ATTRIBUTE;
import static com.ge.predix.acs.testutils.XFiles.TOP_SECRET_CLASSIFICATION;
import static com.ge.predix.acs.testutils.XFiles.TOP_SECRET_GROUP;
import static com.ge.predix.acs.testutils.XFiles.createSubjectHierarchy;
import static org.hamcrest.Matchers.is;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@WebAppConfiguration
@ContextConfiguration("classpath:controller-tests-context.xml")
@ActiveProfiles(resolver = TestActiveProfilesResolver.class)
public class HierarchicalSubjectsIT extends AbstractTestNGSpringContextTests {
private static final Zone TEST_ZONE =
SubjectPrivilegeManagementControllerIT.TEST_UTILS.createTestZone("SubjectMgmtControllerIT");
@Autowired
private ZoneService zoneService;
@Autowired
private WebApplicationContext wac;
@Autowired
private ConfigurableEnvironment configurableEnvironment;
@BeforeClass
public void beforeClass() throws Exception {
if (!Arrays.asList(this.configurableEnvironment.getActiveProfiles()).contains("titan")) {
throw new SkipException("This test only applies when using the \"titan\" profile");
}
this.zoneService.upsertZone(TEST_ZONE);
MockSecurityContext.mockSecurityContext(TEST_ZONE);
MockAcsRequestContext.mockAcsRequestContext();
}
@Test
public void testPostAndGetHierarchicalSubjects() throws Exception {
List<BaseSubject> subjects = createSubjectHierarchy();
// Append a list of resources
MockMvcContext postContext =
SubjectPrivilegeManagementControllerIT.TEST_UTILS.createWACWithCustomPOSTRequestBuilder(
this.wac,
TEST_ZONE.getSubdomain(),
SubjectPrivilegeManagementControllerIT.SUBJECT_BASE_URL);
postContext.getMockMvc().perform(postContext.getBuilder().contentType(MediaType.APPLICATION_JSON)
.content(SubjectPrivilegeManagementControllerIT.OBJECT_MAPPER
.writeValueAsString(subjects)))
.andExpect(status().isNoContent());
// Get the child subject without query string specifier.
MockMvcContext getContext0 =
SubjectPrivilegeManagementControllerIT.TEST_UTILS.createWACWithCustomGETRequestBuilder(
this.wac,
TEST_ZONE.getSubdomain(),
SubjectPrivilegeManagementControllerIT.SUBJECT_BASE_URL + "/"
+ URLEncoder.encode(AGENT_MULDER, "UTF-8"));
getContext0.getMockMvc().perform(getContext0.getBuilder()).andExpect(status().isOk())
.andExpect(jsonPath("subjectIdentifier", is(AGENT_MULDER)))
.andExpect(jsonPath("attributes[0].name", is(SITE_BASEMENT.getName())))
.andExpect(jsonPath("attributes[0].value", is(SITE_BASEMENT.getValue())))
.andExpect(jsonPath("attributes[0].issuer", is(SITE_BASEMENT.getIssuer())))
.andExpect(jsonPath("attributes[1]").doesNotExist());
// Get the child subject without inherited attributes.
MockMvcContext getContext1 =
SubjectPrivilegeManagementControllerIT.TEST_UTILS.createWACWithCustomGETRequestBuilder(
this.wac,
TEST_ZONE.getSubdomain(),
SubjectPrivilegeManagementControllerIT.SUBJECT_BASE_URL + "/"
+ URLEncoder.encode(AGENT_MULDER, "UTF-8") + "?includeInheritedAttributes=false");
getContext1.getMockMvc().perform(getContext1.getBuilder()).andExpect(status().isOk())
.andExpect(jsonPath("subjectIdentifier", is(AGENT_MULDER)))
.andExpect(jsonPath("attributes[0].name", is(SITE_BASEMENT.getName())))
.andExpect(jsonPath("attributes[0].value", is(SITE_BASEMENT.getValue())))
.andExpect(jsonPath("attributes[0].issuer", is(SITE_BASEMENT.getIssuer())))
.andExpect(jsonPath("attributes[1]").doesNotExist());
// Get the child subject with inherited attributes.
MockMvcContext getContext2 =
SubjectPrivilegeManagementControllerIT.TEST_UTILS.createWACWithCustomGETRequestBuilder(
this.wac,
TEST_ZONE.getSubdomain(),
SubjectPrivilegeManagementControllerIT.SUBJECT_BASE_URL + "/"
+ URLEncoder.encode(AGENT_MULDER, "UTF-8") + "?includeInheritedAttributes=true");
getContext2.getMockMvc().perform(getContext2.getBuilder()).andExpect(status().isOk())
.andExpect(jsonPath("subjectIdentifier", is(AGENT_MULDER)))
.andExpect(jsonPath("attributes[0].name", is(TOP_SECRET_CLASSIFICATION.getName())))
.andExpect(jsonPath("attributes[0].value", is(TOP_SECRET_CLASSIFICATION.getValue())))
.andExpect(jsonPath("attributes[0].issuer", is(TOP_SECRET_CLASSIFICATION.getIssuer())))
.andExpect(jsonPath("attributes[1].name", is(SITE_QUANTICO.getName())))
.andExpect(jsonPath("attributes[1].value", is(SITE_QUANTICO.getValue())))
.andExpect(jsonPath("attributes[1].issuer", is(SITE_QUANTICO.getIssuer())))
.andExpect(jsonPath("attributes[2].name", is(SPECIAL_AGENTS_GROUP_ATTRIBUTE.getName())))
.andExpect(jsonPath("attributes[2].value", is(SPECIAL_AGENTS_GROUP_ATTRIBUTE.getValue())))
.andExpect(jsonPath("attributes[2].issuer", is(SPECIAL_AGENTS_GROUP_ATTRIBUTE.getIssuer())))
.andExpect(jsonPath("attributes[3].name", is(SITE_BASEMENT.getName())))
.andExpect(jsonPath("attributes[3].value", is(SITE_BASEMENT.getValue())))
.andExpect(jsonPath("attributes[3].issuer", is(SITE_BASEMENT.getIssuer())));
// Clean up after ourselves.
deleteSubject(AGENT_MULDER);
deleteSubject(TOP_SECRET_GROUP);
deleteSubject(SPECIAL_AGENTS_GROUP);
deleteSubject(FBI);
}
private void deleteSubject(final String subjectIdentifier) throws Exception {
String subjectToDeleteURI = SubjectPrivilegeManagementControllerIT.SUBJECT_BASE_URL + "/"
+ URLEncoder.encode(subjectIdentifier, "UTF-8");
MockMvcContext deleteContext =
SubjectPrivilegeManagementControllerIT.TEST_UTILS.createWACWithCustomDELETERequestBuilder(
this.wac,
TEST_ZONE.getSubdomain(), subjectToDeleteURI);
deleteContext.getMockMvc().perform(deleteContext.getBuilder()).andExpect(status().isNoContent());
}
}