blob: 125b8f0f3215034ec5a80c3ba5b4c40814634849 [file] [log] [blame]
package org.apache.archiva.redback.rest.services.v2;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.
*/
import io.restassured.response.Response;
import io.restassured.response.ResponseBodyExtractionOptions;
import org.apache.archiva.redback.rest.api.model.User;
import org.apache.archiva.redback.rest.api.model.v2.BaseUserInfo;
import org.apache.archiva.redback.rest.api.model.v2.PagedResult;
import org.apache.archiva.redback.rest.api.model.v2.Permission;
import org.apache.archiva.redback.rest.api.model.v2.RoleInfo;
import org.apache.archiva.redback.rest.api.model.v2.RoleTemplate;
import org.apache.archiva.redback.rest.api.model.v2.UserInfo;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.MethodOrderer;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestInstance;
import org.junit.jupiter.api.TestMethodOrder;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import static io.restassured.RestAssured.given;
import static io.restassured.http.ContentType.JSON;
import static org.apache.archiva.redback.rest.api.Constants.DEFAULT_PAGE_LIMIT;
import static org.hamcrest.Matchers.anyOf;
import static org.hamcrest.Matchers.equalTo;
import static org.junit.jupiter.api.Assertions.*;
/**
* @author Martin Stockhammer <martin_s@apache.org>
*/
@ExtendWith( SpringExtension.class )
@ContextConfiguration(
locations = {"classpath:/ldap-spring-test.xml"} )
@TestInstance( TestInstance.Lifecycle.PER_CLASS )
@Tag( "rest-native" )
@TestMethodOrder( MethodOrderer.Random.class )
@DisplayName( "Native REST tests for V2 RoleService" )
public class NativeRoleServiceTest extends AbstractNativeRestServices
{
@Override
protected String getServicePath( )
{
return "/roles";
}
@BeforeAll
void setup( ) throws Exception
{
super.setupNative( );
}
@AfterAll
void destroy( ) throws Exception
{
super.shutdownNative( );
}
private String getUserServicePath( )
{
return new StringBuilder( )
.append( getContextRoot( ) )
.append( getServiceBasePath( ) )
.append( "/users" ).toString( );
}
@Test
void createTemplatedRole( )
{
String token = getAdminToken( );
try
{
Response response = given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( )
.put( "templates/archiva-repository-manager/repository01" )
.then( ).statusCode( 201 ).extract( ).response( );
assertNotNull( response );
RoleInfo roleInfo = response.getBody( ).jsonPath( ).getObject( "", RoleInfo.class );
assertNotNull( response.getHeader( "Location" ) );
assertTrue( response.getHeader( "Location" ).endsWith( "/roles/" + roleInfo.getId( ) ) );
given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( )
.put( "templates/archiva-repository-manager/repository01" )
.then( ).statusCode( 200 );
given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( )
.head( "templates/archiva-repository-manager/repository01" )
.then( ).statusCode( 200 );
// Repository observer is child template of repository-manager and will be created too
given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( )
.head( "templates/archiva-repository-observer/repository01" )
.then( ).statusCode( 200 );
}
finally
{
given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( )
.delete( "templates/archiva-repository-manager/repository01" )
.then( ).statusCode( 200 );
given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( )
.delete( "templates/archiva-repository-observer/repository01" )
.then( ).statusCode( 200 );
}
}
@Test
void createTemplatedRoleWithNonexistentTemplate( )
{
String token = getAdminToken( );
given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( )
.put( "templates/abcdefg/repository01" )
.then( ).statusCode( 404 );
}
@Test
void deleteTemplatedRole( )
{
String token = getAdminToken( );
given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( )
.put( "templates/archiva-repository-manager/repository05" )
.then( ).statusCode( 201 ).extract( ).response( );
given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( )
.delete( "templates/archiva-repository-manager/repository01" )
.then( ).statusCode( 404 );
given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( )
.delete( "templates/archiva-repository-manager/repository05" )
.then( ).statusCode( 200 );
given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( )
.delete( "templates/archiva-repository-manager/repository05" )
.then( ).statusCode( 404 );
given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( )
.delete( "templates/archiva-repository-observer/repository05" )
.then( ).statusCode( 200 );
}
@Test
void checkTemplatedRole( )
{
String token = getAdminToken( );
given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( )
.put( "templates/archiva-repository-observer/repository06" )
.then( ).statusCode( 201 );
try
{
given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( )
.head( "templates/archiva-repository-observer/repository06" )
.then( ).statusCode( 200 );
given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( )
.head( "archiva-repository-observer.repository06" )
.then( ).statusCode( 200 );
}
finally
{
given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( )
.delete( "templates/archiva-repository-observer/repository06" )
.then( ).statusCode( 200 );
}
}
@Nested
@DisplayName( "Test Role queries" )
@ContextConfiguration(
locations = {"classpath:/ldap-spring-test.xml"} )
@TestInstance( TestInstance.Lifecycle.PER_CLASS )
class TestRoleRetrieval
{
int roleInstances = 3;
String token;
@BeforeAll
void initRoles( )
{
this.token = getAdminToken( );
for ( int i = 0; i < roleInstances; i++ )
{
String suffix = String.format( "%03d", i );
given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( )
.put( "templates/archiva-repository-manager/repo" + suffix )
.then( ).statusCode( 201 ).extract( ).response( );
given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( )
.put( "templates/archiva-repository-observer/repo" + suffix )
.then( ).statusCode( anyOf( equalTo( 200 ), equalTo( 201 ) ) ).extract( ).response( );
}
}
@Test
void getMultipleRolesWithoutParams( )
{
Response response = given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( ).get( ).then( ).statusCode( 200 ).extract( ).response( );
assertNotNull( response );
List<RoleInfo> roleData = response.body( ).jsonPath( ).getList( "data", RoleInfo.class );
assertNotNull( roleData );
assertEquals( roleInstances * 2 + 9, roleData.size( ) );
assertEquals( Integer.valueOf( 0 ), response.body( ).jsonPath( ).get( "pagination.offset" ) );
assertEquals( Integer.valueOf( DEFAULT_PAGE_LIMIT ), response.body( ).jsonPath( ).get( "pagination.limit" ) );
assertEquals( Integer.valueOf( roleInstances * 2 + 9 ), response.body( ).jsonPath( ).get( "pagination.total_count" ) );
}
@Test
void getMultipleRolesWithPaging( )
{
HashMap<String, String> params = new HashMap<>( );
params.put( "limit", Integer.toString( 10 ) );
params.put( "offset", Integer.toString( 1 ) );
Response response = given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( ).params( params ).get( ).then( ).statusCode( 200 ).extract( ).response( );
List<RoleInfo> userData = response.body( ).jsonPath( ).getList( "data", RoleInfo.class );
assertNotNull( userData );
response.getBody( ).jsonPath( ).prettyPrint( );
assertEquals( 10, userData.size( ) );
assertEquals( Integer.valueOf( 1 ), response.body( ).jsonPath( ).get( "pagination.offset" ) );
assertEquals( Integer.valueOf( 10 ), response.body( ).jsonPath( ).get( "pagination.limit" ) );
assertEquals( Integer.valueOf( roleInstances * 2 + 9 ), response.body( ).jsonPath( ).get( "pagination.total_count" ) );
}
@Test
void getMultipleUsersWithPagingOrderByIdAndResource( )
{
HashMap<String, Object> params = new HashMap<>( );
params.put( "limit", Integer.toString( 8 ) );
params.put( "offset", Integer.toString( 5 ) );
params.put( "orderBy", Arrays.asList( "id", "resource" ) );
Response response = given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( ).params( params ).get( ).then( ).statusCode( 200 ).extract( ).response( );
List<RoleInfo> userData = response.body( ).jsonPath( ).getList( "data", RoleInfo.class );
assertNotNull( userData );
// admin user has toto@toto.org as email so is after aragorn
assertEquals( "repo002", userData.get( 0 ).getResource( ) );
assertEquals( "repo000", userData.get( 1 ).getResource( ) );
assertEquals( "archiva-repository-observer.repo000", userData.get( 1 ).getId( ) );
assertEquals( "archiva-system-administrator", userData.get( 4 ).getId( ) );
assertEquals( 8, userData.size( ) );
assertEquals( Integer.valueOf( 5 ), response.body( ).jsonPath( ).get( "pagination.offset" ) );
assertEquals( Integer.valueOf( 8 ), response.body( ).jsonPath( ).get( "pagination.limit" ) );
assertEquals( Integer.valueOf( roleInstances * 2 + 9 ), response.body( ).jsonPath( ).get( "pagination.total_count" ) );
}
@Test
void getMultipleUsersWithPagingOrderByIdAndResourceReverse( )
{
HashMap<String, Object> params = new HashMap<>( );
params.put( "limit", Integer.toString( 7 ) );
params.put( "offset", Integer.toString( 1 ) );
params.put( "orderBy", Arrays.asList( "id", "resource" ) );
params.put( "order", "desc" );
Response response = given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( ).params( params ).get( ).then( ).statusCode( 200 ).extract( ).response( );
response.getBody( ).jsonPath( ).prettyPrint( );
List<RoleInfo> userData = response.body( ).jsonPath( ).getList( "data", RoleInfo.class );
assertNotNull( userData );
// admin user has toto@toto.org as email so is after aragorn
assertEquals( "system-administrator", userData.get( 0 ).getId( ) );
assertEquals( "registered-user", userData.get( 1 ).getId( ) );
assertEquals( "guest", userData.get( 2 ).getId( ) );
assertEquals( "archiva-repository-observer.repo002", userData.get( 5 ).getId( ) );
assertEquals( 7, userData.size( ) );
assertEquals( Integer.valueOf( 1 ), response.body( ).jsonPath( ).get( "pagination.offset" ) );
assertEquals( Integer.valueOf( 7 ), response.body( ).jsonPath( ).get( "pagination.limit" ) );
assertEquals( Integer.valueOf( roleInstances * 2 + 9 ), response.body( ).jsonPath( ).get( "pagination.total_count" ) );
}
@Test
void getMultipleRolesWithPagingAndQuery( )
{
HashMap<String, String> params = new HashMap<>( );
params.put( "limit", Integer.toString( 10 ) );
params.put( "offset", Integer.toString( 0 ) );
params.put( "order", "asc" );
params.put( "q", "system" );
Response response = given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( ).params( params ).get( ).then( ).statusCode( 200 ).extract( ).response( );
List<RoleInfo> userData = response.body( ).jsonPath( ).getList( "data", RoleInfo.class );
assertNotNull( userData );
assertEquals( 2, userData.size( ) );
assertEquals( Integer.valueOf( 0 ), response.body( ).jsonPath( ).get( "pagination.offset" ) );
assertEquals( Integer.valueOf( 10 ), response.body( ).jsonPath( ).get( "pagination.limit" ) );
assertEquals( Integer.valueOf( 2 ), response.body( ).jsonPath( ).get( "pagination.total_count" ) );
}
@AfterAll
void cleanupRoles( )
{
for ( int i = 0; i < roleInstances; i++ )
{
String suffix = String.format( "%03d", i );
given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( ).delete( "templates/archiva-repository-manager/repo" + suffix ).then( ).statusCode( 200 );
given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( ).delete( "templates/archiva-repository-observer/repo" + suffix ).then( ).statusCode( 200 );
}
}
}
@Test
void getRole( )
{
String token = getAdminToken( );
Response response = given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( ).get( "archiva-system-administrator" ).prettyPeek( ).then( ).statusCode( 200 ).extract( ).response( );
assertNotNull( response );
RoleInfo roleInfo = response.getBody( ).jsonPath( ).getObject( "", RoleInfo.class );
assertNotNull( roleInfo );
assertEquals( "archiva-system-administrator", roleInfo.getId( ) );
assertEquals( "Archiva System Administrator", roleInfo.getName( ) );
List<Permission> perms = roleInfo.getPermissions( );
assertNotNull( perms );
assertTrue( perms.size( ) > 0 );
assertTrue( perms.stream( ).filter( perm -> "archiva-manage-configuration".equals( perm.getName( ) ) ).findAny( ).isPresent( ) );
List<String> childs = roleInfo.getChildRoleIds( );
assertNotNull( childs );
assertTrue( childs.size( ) > 0 );
assertTrue( childs.stream( ).filter( id -> "archiva-global-repository-manager".equals( id ) ).findAny( ).isPresent( ) );
}
@Test
void getNonExistingRole( )
{
String token = getAdminToken( );
given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( ).get( "abcdefg" ).then( ).statusCode( 404 );
}
@Test
void checkRole( )
{
String token = getAdminToken( );
Response response = given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( ).head( "archiva-system-administrator" ).then( ).statusCode( 200 ).extract( ).response( );
assertEquals( 0, response.getBody( ).asByteArray( ).length );
given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( ).head( "abcdefg" ).then( ).statusCode( 404 );
}
@Test
void moveRole( )
{
String token = getAdminToken( );
try
{
given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( )
.put( "templates/archiva-repository-manager/repository07" )
.then( ).statusCode( 201 );
given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( ).head( "templates/archiva-repository-observer/repository07" ).then( ).statusCode( 200 );
Response response = given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( ).post( "templates/archiva-repository-manager/repository07/moveto/repository08" ).then( ).statusCode( 201 ).extract( ).response( );
RoleInfo role = response.getBody( ).jsonPath( ).getObject( "", RoleInfo.class );
assertNotNull( role );
assertEquals( "archiva-repository-manager.repository08", role.getId( ) );
assertEquals( "repository08", role.getResource( ) );
given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( ).head( "templates/archiva-repository-manager/repository07" ).then( ).statusCode( 404 );
// Child templates are copied and not moved
given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( ).head( "templates/archiva-repository-observer/repository07" ).then( ).statusCode( 200 );
given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( ).head( "templates/archiva-repository-observer/repository08" ).then( ).statusCode( 200 );
}
finally
{
given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( )
.delete( "templates/archiva-repository-manager/repository08" )
.then( ).statusCode( 200 );
given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( )
.delete( "templates/archiva-repository-observer/repository07" )
.then( ).statusCode( 200 );
given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( )
.delete( "templates/archiva-repository-observer/repository08" )
.then( ).statusCode( 200 );
}
}
@Test
void moveRoleToExistingDestination( )
{
String token = getAdminToken( );
try
{
given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( )
.put( "templates/archiva-repository-manager/repository09" )
.then( ).statusCode( 201 );
given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( )
.put( "templates/archiva-repository-manager/repository10" )
.then( ).statusCode( 201 );
Response response = given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( ).redirects( ).follow( false )
.post( "templates/archiva-repository-manager/repository09/moveto/repository10" ).then( ).statusCode( 303 )
.extract( ).response( );
assertTrue( response.getHeader( "Location" ).endsWith( "/roles/templates/archiva-repository-manager/repository10" ) );
given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( ).head( "templates/archiva-repository-manager/repository09" ).then( ).statusCode( 200 );
}
finally
{
given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( )
.delete( "templates/archiva-repository-manager/repository09" )
.then( ).statusCode( 200 );
given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( )
.delete( "templates/archiva-repository-observer/repository09" )
.then( ).statusCode( 200 );
given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( )
.delete( "templates/archiva-repository-manager/repository10" )
.then( ).statusCode( 200 );
given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( )
.delete( "templates/archiva-repository-observer/repository10" )
.then( ).statusCode( 200 );
}
}
@Test
void getAssignedUsers( )
{
String token = getAdminToken( );
Map<String, Object> jsonAsMap = new HashMap<>( );
jsonAsMap.put( "user_id", "aragorn" );
jsonAsMap.put( "email", "aragorn@lordoftherings.org" );
jsonAsMap.put( "full_name", "Aragorn King of Gondor " );
jsonAsMap.put( "password", "pAssw0rD" );
try
{
given( ).spec( getRequestSpec( token, getUserServicePath( ) ) ).contentType( JSON )
.body( jsonAsMap )
.when( )
.post( )
.then( ).statusCode( 201 );
given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( )
.put( "system-administrator/user/aragorn" )
.then( ).statusCode( 200 );
Response result = given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( )
.get( "system-administrator/user" )
.prettyPeek()
.then( ).statusCode( 200 ).extract( ).response( );
assertNotNull(result);
PagedResult<UserInfo> userResult = result.getBody( ).jsonPath( ).getObject( "", PagedResult.class );
assertNotNull( userResult );
assertEquals( 2, userResult.getPagination( ).getTotalCount( ) );
List<UserInfo> users = result.getBody( ).jsonPath( ).getList( "data", UserInfo.class );
assertArrayEquals( new String[] {"admin","aragorn"}, users.stream( ).map( BaseUserInfo::getUserId ).sorted().toArray(String[]::new) );
}
finally
{
given( ).spec( getRequestSpec( token, getUserServicePath( ) ) ).contentType( JSON )
.when( )
.delete( "aragorn" ).then( ).statusCode( 200 );
}
}
@Test
void assignRole( )
{
String token = getAdminToken( );
Map<String, Object> jsonAsMap = new HashMap<>( );
jsonAsMap.put( "user_id", "aragorn" );
jsonAsMap.put( "email", "aragorn@lordoftherings.org" );
jsonAsMap.put( "full_name", "Aragorn King of Gondor " );
jsonAsMap.put( "password", "pAssw0rD" );
try
{
given( ).spec( getRequestSpec( token, getUserServicePath( ) ) ).contentType( JSON )
.body( jsonAsMap )
.when( )
.post( )
.then( ).statusCode( 201 );
Response response = given( ).spec( getRequestSpec( token, getUserServicePath( ) ) ).contentType( JSON )
.when( )
.get( "aragorn/roles" )
.then( ).statusCode( 200 ).extract( ).response( );
List<RoleInfo> roles = response.getBody( ).jsonPath( ).getList( "", RoleInfo.class );
assertFalse( roles.stream( ).filter( role -> "system-administrator".equals( role.getId( ) ) ).findAny( ).isPresent( ) );
given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( )
.put( "system-administrator/user/aragorn" )
.then( ).statusCode( 200 );
response = given( ).spec( getRequestSpec( token, getUserServicePath( ) ) ).contentType( JSON )
.when( )
.get( "aragorn/roles" )
.then( ).statusCode( 200 ).extract( ).response( );
roles = response.getBody( ).jsonPath( ).getList( "", RoleInfo.class );
assertTrue( roles.stream( ).filter( role -> "system-administrator".equals( role.getId( ) ) ).findAny( ).isPresent( ) );
}
finally
{
given( ).spec( getRequestSpec( token, getUserServicePath( ) ) ).contentType( JSON )
.when( )
.delete( "aragorn" ).then( ).statusCode( 200 );
}
}
@Test
void assignNonexistentRole( )
{
String token = getAdminToken( );
Map<String, Object> jsonAsMap = new HashMap<>( );
jsonAsMap.put( "user_id", "aragorn" );
jsonAsMap.put( "email", "aragorn@lordoftherings.org" );
jsonAsMap.put( "full_name", "Aragorn King of Gondor " );
jsonAsMap.put( "password", "pAssw0rD" );
try
{
given( ).spec( getRequestSpec( token, getUserServicePath( ) ) ).contentType( JSON )
.body( jsonAsMap )
.when( )
.post( )
.then( ).statusCode( 201 );
Response response = given( ).spec( getRequestSpec( token, getUserServicePath( ) ) ).contentType( JSON )
.when( )
.get( "aragorn/roles" )
.then( ).statusCode( 200 ).extract( ).response( );
List<RoleInfo> roles = response.getBody( ).jsonPath( ).getList( "", RoleInfo.class );
assertFalse( roles.stream( ).filter( role -> "abcdefg".equals( role.getId( ) ) ).findAny( ).isPresent( ) );
given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( )
.put( "abcdefg/user/aragorn" )
.then( ).statusCode( 404 );
response = given( ).spec( getRequestSpec( token, getUserServicePath( ) ) ).contentType( JSON )
.when( )
.get( "aragorn/roles" )
.then( ).statusCode( 200 ).extract( ).response( );
roles = response.getBody( ).jsonPath( ).getList( "", RoleInfo.class );
assertFalse( roles.stream( ).filter( role -> "abcdefg".equals( role.getId( ) ) ).findAny( ).isPresent( ) );
}
finally
{
given( ).spec( getRequestSpec( token, getUserServicePath( ) ) ).contentType( JSON )
.when( )
.delete( "aragorn" ).then( ).statusCode( 200 );
}
}
@Test
void assignRoleToNonexistentUser( )
{
String token = getAdminToken( );
given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( )
.put( "system-administrator/user/aragorn" )
.then( ).statusCode( 404 );
}
@Test
void assignTemplatedRole( )
{
String token = getAdminToken( );
Map<String, Object> jsonAsMap = new HashMap<>( );
jsonAsMap.put( "user_id", "aragorn" );
jsonAsMap.put( "email", "aragorn@lordoftherings.org" );
jsonAsMap.put( "full_name", "Aragorn King of Gondor " );
jsonAsMap.put( "password", "pAssw0rD" );
try
{
given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( )
.put( "templates/archiva-repository-manager/repository11" )
.then( ).statusCode( 201 );
given( ).spec( getRequestSpec( token, getUserServicePath( ) ) ).contentType( JSON )
.body( jsonAsMap )
.when( )
.post( )
.then( ).statusCode( 201 );
Response response = given( ).spec( getRequestSpec( token, getUserServicePath( ) ) ).contentType( JSON )
.when( )
.get( "aragorn/roles" )
.then( ).statusCode( 200 ).extract( ).response( );
List<RoleInfo> roles = response.getBody( ).jsonPath( ).getList( "", RoleInfo.class );
assertFalse( roles.stream( ).filter( role -> "archiva-repository-manager.repository11".equals( role.getId( ) ) ).findAny( ).isPresent( ) );
given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( )
.put( "templates/archiva-repository-manager/repository11/user/aragorn" )
.then( ).statusCode( 200 );
response = given( ).spec( getRequestSpec( token, getUserServicePath( ) ) ).contentType( JSON )
.when( )
.get( "aragorn/roles" )
.then( ).statusCode( 200 ).extract( ).response( );
roles = response.getBody( ).jsonPath( ).getList( "", RoleInfo.class );
assertTrue( roles.stream( ).filter( role -> "archiva-repository-manager.repository11".equals( role.getId( ) ) ).findAny( ).isPresent( ) );
}
finally
{
given( ).spec( getRequestSpec( token, getUserServicePath( ) ) ).contentType( JSON )
.when( )
.delete( "aragorn" ).then( ).statusCode( 200 );
given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( )
.delete( "templates/archiva-repository-manager/repository11" ).then( ).statusCode( 200 );
given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( )
.delete( "templates/archiva-repository-observer/repository11" ).then( ).statusCode( 200 );
}
}
@Test
void unAssignRole( )
{
String token = getAdminToken( );
Map<String, Object> jsonAsMap = new HashMap<>( );
jsonAsMap.put( "user_id", "aragorn" );
jsonAsMap.put( "email", "aragorn@lordoftherings.org" );
jsonAsMap.put( "full_name", "Aragorn King of Gondor " );
jsonAsMap.put( "password", "pAssw0rD" );
try
{
given( ).spec( getRequestSpec( token, getUserServicePath( ) ) ).contentType( JSON )
.body( jsonAsMap )
.when( )
.post( )
.then( ).statusCode( 201 );
given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( )
.put( "system-administrator/user/aragorn" )
.then( ).statusCode( 200 );
Response response = given( ).spec( getRequestSpec( token, getUserServicePath( ) ) ).contentType( JSON )
.when( )
.get( "aragorn/roles" )
.then( ).statusCode( 200 ).extract( ).response( );
List<RoleInfo> roles = response.getBody( ).jsonPath( ).getList( "", RoleInfo.class );
assertTrue( roles.stream( ).filter( role -> "system-administrator".equals( role.getId( ) ) ).findAny( ).isPresent( ) );
given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( )
.delete( "system-administrator/user/aragorn" )
.then( ).statusCode( 200 );
response = given( ).spec( getRequestSpec( token, getUserServicePath( ) ) ).contentType( JSON )
.when( )
.get( "aragorn/roles" )
.then( ).statusCode( 200 ).extract( ).response( );
roles = response.getBody( ).jsonPath( ).getList( "", RoleInfo.class );
assertFalse( roles.stream( ).filter( role -> "system-administrator".equals( role.getId( ) ) ).findAny( ).isPresent( ) );
}
finally
{
given( ).spec( getRequestSpec( token, getUserServicePath( ) ) ).contentType( JSON )
.when( )
.delete( "aragorn" ).then( ).statusCode( 200 );
}
}
@Test
void unAssignTemplatedRole( )
{
String token = getAdminToken( );
Map<String, Object> jsonAsMap = new HashMap<>( );
jsonAsMap.put( "user_id", "aragorn" );
jsonAsMap.put( "email", "aragorn@lordoftherings.org" );
jsonAsMap.put( "full_name", "Aragorn King of Gondor " );
jsonAsMap.put( "password", "pAssw0rD" );
try
{
given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( )
.put( "templates/archiva-repository-manager/repository12" )
.then( ).statusCode( 201 );
given( ).spec( getRequestSpec( token, getUserServicePath( ) ) ).contentType( JSON )
.body( jsonAsMap )
.when( )
.post( )
.then( ).statusCode( 201 );
given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( )
.put( "templates/archiva-repository-manager/repository12/user/aragorn" )
.then( ).statusCode( 200 );
Response response = given( ).spec( getRequestSpec( token, getUserServicePath( ) ) ).contentType( JSON )
.when( )
.get( "aragorn/roles" )
.then( ).statusCode( 200 ).extract( ).response( );
List<RoleInfo> roles = response.getBody( ).jsonPath( ).getList( "", RoleInfo.class );
assertTrue( roles.stream( ).filter( role -> "archiva-repository-manager.repository12".equals( role.getId( ) ) ).findAny( ).isPresent( ) );
given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( )
.delete( "archiva-repository-manager.repository12/user/aragorn" )
.then( ).statusCode( 200 );
response = given( ).spec( getRequestSpec( token, getUserServicePath( ) ) ).contentType( JSON )
.when( )
.get( "aragorn/roles" )
.then( ).statusCode( 200 ).extract( ).response( );
roles = response.getBody( ).jsonPath( ).getList( "", RoleInfo.class );
assertFalse( roles.stream( ).filter( role -> "archiva-repository-manager.repository12".equals( role.getId( ) ) ).findAny( ).isPresent( ) );
}
finally
{
given( ).spec( getRequestSpec( token, getUserServicePath( ) ) ).contentType( JSON )
.when( )
.delete( "aragorn" ).then( ).statusCode( 200 );
given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( )
.delete( "templates/archiva-repository-manager/repository12" ).then( ).statusCode( 200 );
given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( )
.delete( "templates/archiva-repository-observer/repository12" ).then( ).statusCode( 200 );
}
}
@Test
void updateRole( )
{
String token = getAdminToken( );
try
{
Response response = given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( )
.put( "templates/archiva-repository-manager/repository13" )
.then( ).statusCode( 201 ).extract( ).response( );
assertNotNull( response );
RoleInfo roleInfo = response.getBody( ).jsonPath( ).getObject( "", RoleInfo.class );
Map<String, Object> jsonAsMap = new HashMap<>( );
jsonAsMap.put( "id", roleInfo.getId( ) );
jsonAsMap.put( "name", roleInfo.getName( ) );
jsonAsMap.put( "description", "This description was updated." );
response = given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( )
.body( jsonAsMap )
.patch( roleInfo.getId( ) )
.then( ).statusCode( 200 ).extract( ).response( );
assertNotNull( response );
RoleInfo updatedRole = response.getBody( ).jsonPath( ).getObject( "", RoleInfo.class );
assertEquals( roleInfo.getId( ), updatedRole.getId( ) );
assertEquals( roleInfo.getName( ), updatedRole.getName( ) );
assertEquals( "This description was updated.", updatedRole.getDescription( ) );
assertEquals( true, updatedRole.isAssignable( ) );
assertEquals( false, updatedRole.isPermanent( ) );
response = given().spec(getRequestSpec(token)).contentType( JSON )
.when()
.get("archiva-repository-manager.repository13/user")
.then()
.extract( ).response( );
List<UserInfo> userList = response.getBody( ).jsonPath( ).getList( "data", UserInfo.class );
assertEquals( 1, userList.size( ) );
}
finally
{
given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( )
.delete( "templates/archiva-repository-manager/repository13" )
.then( ).statusCode( 200 );
given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( )
.delete( "templates/archiva-repository-observer/repository13" )
.then( ).statusCode( 200 );
}
}
@Test
void updateRoleWithAssignedUsers( )
{
String token = getAdminToken( );
Map<String, Object> jsonAsMap = new HashMap<>( );
jsonAsMap.put( "user_id", "aragorn" );
jsonAsMap.put( "email", "aragorn@lordoftherings.org" );
jsonAsMap.put( "full_name", "Aragorn King of Gondor " );
jsonAsMap.put( "password", "pAssw0rD" );
String id = "";
try
{
given( ).spec( getRequestSpec( token, getUserServicePath( ) ) ).contentType( JSON )
.body( jsonAsMap )
.when( )
.post( )
.then( ).statusCode( 201 );
Response response = given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( )
.put( "templates/archiva-repository-manager/repository14" )
.then( ).statusCode( 201 ).extract( ).response( );
assertNotNull( response );
RoleInfo roleInfo = response.getBody( ).jsonPath( ).getObject( "", RoleInfo.class );
id = roleInfo.getId( );
jsonAsMap = new HashMap<>( );
jsonAsMap.put( "id", roleInfo.getId( ) );
jsonAsMap.put( "name", roleInfo.getName( ) );
jsonAsMap.put( "description", "New description" );
jsonAsMap.put( "assignable", "false" );
jsonAsMap.put( "permanent", "true" );
HashMap<Object, Object> aragornMap = new HashMap<>( );
aragornMap.put( "id", "jpa:aragorn" );
aragornMap.put( "user_id", "aragorn" );
jsonAsMap.put( "assigned_users", Arrays.asList( aragornMap ) );
response = given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( )
.body( jsonAsMap )
.patch( roleInfo.getId( ) )
.then( ).statusCode( 200 ).extract( ).response( );
assertNotNull( response );
RoleInfo updatedRole = response.getBody( ).jsonPath( ).getObject( "", RoleInfo.class );
assertEquals( roleInfo.getId( ), updatedRole.getId( ) );
assertEquals( roleInfo.getName( ), updatedRole.getName( ) );
assertEquals( "New description", updatedRole.getDescription( ) );
assertEquals( false, updatedRole.isAssignable( ) );
assertEquals( true, updatedRole.isPermanent( ) );
response = given().spec(getRequestSpec(token)).contentType( JSON )
.when()
.get("archiva-repository-manager.repository14/user")
.then()
.extract( ).response( );
List<UserInfo> userList = response.getBody( ).jsonPath( ).getList( "data", UserInfo.class );
assertEquals( 2, userList.size( ) );
assertTrue( userList.stream( ).filter( user -> "aragorn".equals( user.getUserId( ) ) ).findAny( ).isPresent( ) );
}
finally
{
// Switching back permanent flag
jsonAsMap = new HashMap<>( );
jsonAsMap.put( "id", id );
jsonAsMap.put( "permanent", "false" );
given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( )
.body( jsonAsMap )
.patch( id )
.then( ).statusCode( 200 ).extract( ).response( );
given( ).spec( getRequestSpec( token, getUserServicePath( ) ) ).contentType( JSON )
.when( )
.delete( "aragorn" ).then( ).statusCode( 200 );
given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( )
.delete( "templates/archiva-repository-manager/repository14" )
.then( ).statusCode( 200 );
given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( )
.delete( "templates/archiva-repository-observer/repository14" )
.then( ).statusCode( 200 );
}
}
@Test
void updateRoleWithBadId( )
{
String token = getAdminToken( );
try
{
Response response = given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( )
.put( "templates/archiva-repository-manager/repository15" )
.then( ).statusCode( 201 ).extract( ).response( );
assertNotNull( response );
RoleInfo roleInfo = response.getBody( ).jsonPath( ).getObject( "", RoleInfo.class );
Map<String, Object> jsonAsMap = new HashMap<>( );
jsonAsMap.put( "id", "abcdefg" );
jsonAsMap.put( "name", roleInfo.getName( ) );
jsonAsMap.put( "description", "This description was updated." );
given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( )
.body( jsonAsMap )
.patch( roleInfo.getId( ) )
.then( ).statusCode( 422 );
}
finally
{
given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( )
.delete( "templates/archiva-repository-manager/repository15" )
.then( ).statusCode( 200 );
given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( )
.delete( "templates/archiva-repository-observer/repository15" )
.then( ).statusCode( 200 );
}
}
@Test
void deleteTemplatedRolePermanentThrowsError( )
{
String token = getAdminToken( );
String id = "";
try
{
Response response = given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( )
.put( "templates/archiva-repository-manager/repository16" )
.then( ).statusCode( 201 ).extract( ).response( );
assertNotNull( response );
RoleInfo roleInfo = response.getBody( ).jsonPath( ).getObject( "", RoleInfo.class );
id = roleInfo.getId( );
Map<String, Object> jsonAsMap = new HashMap<>( );
jsonAsMap.put( "id", roleInfo.getId( ) );
jsonAsMap.put( "name", roleInfo.getName( ) );
jsonAsMap.put( "description", "This description was updated." );
jsonAsMap.put( "permanent", "true" );
response = given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( )
.body( jsonAsMap )
.patch( roleInfo.getId( ) )
.then( ).statusCode( 200 ).extract( ).response( );
assertNotNull( response );
given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( )
.delete( "templates/archiva-repository-manager/repository16" )
.then( ).statusCode( 400 );
}
finally
{
Map<String, Object> jsonAsMap = new HashMap<>( );
jsonAsMap.put( "id", id );
jsonAsMap.put( "permanent", "false" );
given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( )
.body( jsonAsMap )
.patch( id )
.then( ).statusCode( 200 ).extract( ).response( );
given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( )
.delete( "templates/archiva-repository-manager/repository16" )
.then( ).statusCode( 200 );
given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( )
.delete( "templates/archiva-repository-observer/repository16" )
.then( ).statusCode( 200 );
}
}
@Test
void updateRoleNotExist( )
{
String token = getAdminToken( );
Map<String, Object> jsonAsMap = new HashMap<>( );
jsonAsMap.put( "id", "abcdefg" );
jsonAsMap.put( "name", "abcdefg" );
jsonAsMap.put( "description", "This description was updated." );
given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( )
.body( jsonAsMap )
.patch( "abcdefg" )
.then( ).statusCode( 404 );
}
@Test
void getTemplates( )
{
String token = getAdminToken( );
Response response = given( ).spec( getRequestSpec( token ) ).contentType( JSON )
.when( )
.get( "templates" )
.then( ).statusCode( 200 ).extract( ).response( );
assertNotNull( response );
List<RoleTemplate> templates = response.getBody( ).jsonPath( ).getList( "", RoleTemplate.class );
assertEquals( 2, templates.size( ) );
assertTrue( templates.stream( ).filter( tmpl -> "archiva-repository-manager".equals( tmpl.getId( ) ) ).findAny( ).isPresent( ) );
assertTrue( templates.stream( ).filter( tmpl -> "archiva-repository-observer".equals( tmpl.getId( ) ) ).findAny( ).isPresent( ) );
}
}