package org.ovirt.engine.api.restapi.resource.aaa; import java.util.Arrays; import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Set; import java.util.stream.Collectors; import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.Response; import javax.ws.rs.core.UriInfo; import org.junit.Test; import org.ovirt.engine.api.model.Domain; import org.ovirt.engine.api.model.Fault; import org.ovirt.engine.api.model.Group; import org.ovirt.engine.api.model.User; import org.ovirt.engine.api.restapi.resource.AbstractBackendCollectionResourceTest; import org.ovirt.engine.api.restapi.utils.DirectoryEntryIdUtils; import org.ovirt.engine.core.aaa.DirectoryUser; import org.ovirt.engine.core.common.action.AddUserParameters; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.businessentities.aaa.DbUser; import org.ovirt.engine.core.common.interfaces.SearchType; import org.ovirt.engine.core.common.queries.IdQueryParameters; import org.ovirt.engine.core.common.queries.VdcQueryParametersBase; import org.ovirt.engine.core.common.queries.VdcQueryType; public class BackendUsersResourceTest extends AbstractBackendCollectionResourceTest<User, DbUser, BackendUsersResource> { static final String NAMESPACE = "*"; static final String GROUPS = "Schema Admins@Maghreb/Users," + "Group Policy Creator Owners@Maghreb/Users," + "Enterprise Admins@Maghreb/Users"; static final String[] PARSED_GROUPS = { "Schema Admins@Maghreb/Users", "Group Policy Creator Owners@Maghreb/Users", "Enterprise Admins@Maghreb/Users", }; protected static final String SEARCH_QUERY = "name=s* AND id=*0 and usrname != \"\""; protected static final String QUERY = "usrname != \"\""; public BackendUsersResourceTest() { super(new BackendUsersResource(), SearchType.DBUser, "Users : "); } @Test public void testAddUser2() throws Exception { setUpEntityQueryExpectations(VdcQueryType.GetDomainList, VdcQueryParametersBase.class, new String[] {}, new Object[] {}, setUpDomains()); setUpAddUserExpectations("ADUSER@" + DOMAIN + ":: username=" + NAMES[0]); User model = new User(); Domain domain = new Domain(); domain.setName(DOMAIN); domain.setId(DirectoryEntryIdUtils.encode(domain.getName())); model.setDomain(domain); model.setUserName(NAMES[0]); Response response = collection.add(model); verifyAddUser(response); } @Test public void testAddUser3() throws Exception { setUpEntityQueryExpectations(VdcQueryType.GetDomainList, VdcQueryParametersBase.class, new String[] {}, new Object[] {}, setUpDomains()); setUpAddUserExpectations("ADUSER@" + DOMAIN + ":: username=" + NAMES[0]); User model = new User(); model.setUserName(NAMES[0] + "@" + DOMAIN); Response response = collection.add(model); verifyAddUser(response); } @Test public void testAddUser4() throws Exception { setUpEntityQueryExpectations(VdcQueryType.GetDomainList, VdcQueryParametersBase.class, new String[] { }, new Object[] { }, setUpDomains()); setUpAddUserExpectations("ADUSER@" + DOMAIN + ":: username=" + NAMES[0]); User model = new User(); model.setUserName(NAMES[0]); Domain domain = new Domain(); domain.setName(DOMAIN); domain.setId(DirectoryEntryIdUtils.encode(domain.getName())); model.setDomain(domain); Response response = collection.add(model); verifyAddUser(response); } private List<String> setUpDomains() { List<String> domains = new LinkedList<>(); domains.add("some.domain"); domains.add(DOMAIN); return domains; } private void verifyAddUser(Response response) { assertEquals(201, response.getStatus()); assertTrue(response.getEntity() instanceof User); verifyModel((User) response.getEntity(), 0); } private void setUpAddUserExpectations(String query) throws Exception { setUriInfo(setUpBasicUriExpectations()); setUpGetEntityExpectations( query, SearchType.DirectoryUser, getDirectoryUser(0) ); setUpCreationExpectations( VdcActionType.AddUser, AddUserParameters.class, new String[] { "UserToAdd" }, new Object[] { new DbUser(getDirectoryUser(0)) }, true, true, GUIDS[0], VdcQueryType.GetDbUserByUserId, IdQueryParameters.class, new String[] { "Id" }, new Object[] { GUIDS[0] }, getEntity(0) ); } @Override protected List<User> getCollection() { return collection.list().getUsers(); } @Override protected DbUser getEntity(int index) { DbUser entity = new DbUser(getDirectoryUser(index)); entity.setGroupNames(new LinkedList<>(Arrays.asList(GROUPS.split(",")))); entity.setId(GUIDS[index]); return entity; } private DirectoryUser getDirectoryUser(int index) { return new DirectoryUser(DOMAIN, NAMESPACE, EXTERNAL_IDS[index], NAMES[index], NAMES[index], ""); } @Override protected void verifyModel(User model, int index) { assertEquals(GUIDS[index].toString(), model.getId()); assertEquals(NAMES[index] + "@" + DOMAIN, model.getUserName()); assertNotNull(model.getDomain()); assertEquals(DirectoryEntryIdUtils.encode(DOMAIN), model.getDomain().getId()); assertTrue(model.isSetGroups()); assertEquals(PARSED_GROUPS.length, model.getGroups().getGroups().size()); Set<String> groupNames = model.getGroups().getGroups().stream().map(Group::getName).collect(Collectors.toSet()); assertEquals(new HashSet<>(Arrays.asList(PARSED_GROUPS)), groupNames); verifyLinks(model); } @Override protected void setUpQueryExpectations(String query) throws Exception { setUpQueryExpectations(query, null); } @Override @Test public void testQuery() throws Exception { UriInfo uriInfo = setUpUriExpectations(SEARCH_QUERY); setUpQueryExpectations(SEARCH_QUERY); collection.setUriInfo(uriInfo); verifyCollection(getCollection()); } @Override @Test public void testList() throws Exception { UriInfo uriInfo = setUpUriExpectations(null); setUpQueryExpectations(QUERY); collection.setUriInfo(uriInfo); verifyCollection(getCollection()); } @Override @Test public void testListFailure() throws Exception { UriInfo uriInfo = setUpUriExpectations(null); setUpQueryExpectations(QUERY, FAILURE); collection.setUriInfo(uriInfo); try { getCollection(); fail("expected WebApplicationException"); } catch (WebApplicationException wae) { assertTrue(wae.getResponse().getEntity() instanceof Fault); assertEquals(mockl10n(FAILURE), ((Fault) wae.getResponse().getEntity()).getDetail()); } } @Override @Test public void testListCrash() throws Exception { UriInfo uriInfo = setUpUriExpectations(null); Throwable t = new RuntimeException(FAILURE); setUpQueryExpectations(QUERY, t); collection.setUriInfo(uriInfo); try { getCollection(); fail("expected WebApplicationException"); } catch (WebApplicationException wae) { verifyFault(wae, BACKEND_FAILED_SERVER_LOCALE, t); } } @Override @Test public void testListCrashClientLocale() throws Exception { UriInfo uriInfo = setUpUriExpectations(null); locales.add(CLIENT_LOCALE); Throwable t = new RuntimeException(FAILURE); setUpQueryExpectations(QUERY, t); collection.setUriInfo(uriInfo); try { getCollection(); fail("expected WebApplicationException"); } catch (WebApplicationException wae) { verifyFault(wae, BACKEND_FAILED_CLIENT_LOCALE, t); } finally { locales.clear(); } } }