/*-
 * ============LICENSE_START=======================================================
 * OSAM
 * ================================================================================
 * Copyright (C) 2018 AT&T
 * ================================================================================
 * 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.
 * ============LICENSE_END=========================================================
 */



package org.onap.osam.roles;

import java.util.List;

import javax.servlet.http.HttpServletRequest;

import org.junit.Test;


public class RoleProviderTest {

	private RoleProvider createTestSubject() {
		return new RoleProvider();
	}

	
	@Test
	public void testExtractRoleFromSession() throws Exception {
		HttpServletRequest request = null;
		List<String> result;

		// default test
		result = RoleProvider.extractRoleFromSession(request);
	}

	
//	@Test
//	public void testGetUserRoles() throws Exception {
//		RoleProvider testSubject;
//		HttpServletRequest request = null;
//		List<Role> result;
//
//		// default test
//		testSubject = createTestSubject();
//		result = testSubject.getUserRoles(request);
//	}

	
	@Test
	public void testSplitRole() throws Exception {
		RoleProvider testSubject;
		String roleAsString = "";
		String[] result;

		// default test
		testSubject = createTestSubject();
		//TODO:fix result = testSubject.splitRole(roleAsString);
	}

}
