/* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * Copyright (c) 2013, MPL CodeInside http://codeinside.ru */ package ru.codeinside.adm.test; import com.google.common.collect.ImmutableSet; import org.activiti.engine.IdentityService; import org.activiti.engine.ProcessEngine; import org.jboss.arquillian.container.test.api.Deployment; import org.jboss.arquillian.junit.Arquillian; import org.jboss.shrinkwrap.api.ShrinkWrap; import org.jboss.shrinkwrap.api.asset.EmptyAsset; import org.jboss.shrinkwrap.api.spec.JavaArchive; import org.junit.Assert; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import ru.codeinside.adm.AdminService; import ru.codeinside.adm.AdminServiceProvider; import ru.codeinside.adm.UserItem; import ru.codeinside.adm.database.Employee; import ru.codeinside.adm.database.Organization; import ru.codeinside.adm.database.Role; import ru.codeinside.adm.fixtures.FxDefinition; import ru.codeinside.gses.manager.ManagerService; import ru.codeinside.gses.migrations.BaseBean; import ru.codeinside.gses.service.impl.DeclarantServiceImpl; import ru.codeinside.gses.webui.Configurator; import ru.codeinside.gses.webui.osgi.TRefRegistryImpl; import ru.codeinside.log.Logger; import javax.inject.Inject; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.transaction.UserTransaction; import java.sql.Connection; import java.util.Arrays; import java.util.Set; import java.util.TreeSet; @RunWith(Arquillian.class) public class AdminServiceTest extends Assert { @Deployment public static JavaArchive createDeployment() { return ShrinkWrap .create(JavaArchive.class) .addPackage(Employee.class.getPackage()) .addPackage(FxDefinition.class.getPackage()) .addPackage(AdminServiceProvider.class.getPackage()) .addClass(ManagerService.class) .addClass(DeclarantServiceImpl.class) .addClass(ActivitiContext.class) .addClass(Configurator.class) .addClass(GlassfihSecurity.class) .addClass(BaseBean.class) .addPackage(Logger.class.getPackage()) .addPackage(TRefRegistryImpl.class.getPackage()) .addClass(DummyActivitiJobProvider.class) .add(new PersistanceAsset(), "META-INF/persistence.xml") .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml"); } @Inject UserTransaction tx; @Inject public ProcessEngine processEngine; @PersistenceContext(unitName = "myPU") EntityManager em; @Test public void defaultOrg() throws Exception { assertEquals(1, AdminServiceProvider.get().findAllOrganizations().size()); } @Test public void processFixtures() throws Exception { final AdminService srv = AdminServiceProvider.get(); tx.begin(); try { assertFalse(srv.loadProcessFixtures(processEngine, getClass().getClassLoader().getResourceAsStream("process-fixtures.json"))); FxMarker.enabled = true; assertTrue(srv.loadProcessFixtures(processEngine, getClass().getClassLoader().getResourceAsStream("process-fixtures.json"))); } finally { FxMarker.enabled = false; tx.rollback(); } } @Test public void membeships() throws Exception { tx.begin(); try { AdminService at = AdminServiceProvider.get(); Organization org = at.createOrganization("xxx", null, null); at.setOrgGroupNames(org.getId(), ImmutableSet.of("g0")); org = at.findOrganizationById(org.getId()); assertEquals(1, org.getGroups().size()); } finally { tx.rollback(); } } @Test public void memberships2() throws Exception { final int USERS = 6; final int GROUPS = 1; final AdminService adm = AdminServiceProvider.get(); tx.begin(); try { final IdentityService ids = processEngine.getIdentityService(); assertEquals(USERS, ids.createUserQuery().count()); assertEquals(GROUPS, ids.createGroupQuery().count()); // Создаём организацию и добавляем ей группы final Organization org = adm.createOrganization("org1", null, null); assertTrue(adm.setOrgGroupNames(org.getId(), ImmutableSet.of("g1", "g2"))); assertEquals(ImmutableSet.of("g1", "g2"), adm.getOrgGroupNames(org.getId())); assertEquals(USERS, ids.createUserQuery().count()); assertEquals(GROUPS, ids.createGroupQuery().count()); // Создаём пользователя adm.createEmployee("login", "pass", "fio", "11122233344", ImmutableSet.<Role>of(), null, org.getId()); assertEquals(USERS + 1, ids.createUserQuery().count()); assertEquals(GROUPS + 2, ids.createGroupQuery().count()); assertEquals(1, ids.createGroupQuery().groupId("g1").count()); assertEquals(1, ids.createGroupQuery().groupId("g2").count()); assertEquals(1, ids.createGroupQuery().groupId("g1").groupMember("login").count()); assertEquals(1, ids.createGroupQuery().groupId("g2").groupMember("login").count()); UserItem u = adm.getUserItem("login"); assertEquals("fio", u.getFio()); assertEquals("11122233344", u.getSnils()); assertEquals(ImmutableSet.of(), u.getGroups()); String elements[] = {"test"}; Set set = new TreeSet(Arrays.asList(elements)); assertEquals(set, u.getAllSocialGroups()); // Добавляем персональные группы u.setGroups(ImmutableSet.of("ug1", "ug2")); adm.setUserItem("login", u); u = adm.getUserItem("login"); assertEquals(ImmutableSet.of("ug1", "ug2"), u.getGroups()); assertEquals(USERS + 1, ids.createUserQuery().count()); assertEquals(GROUPS + 4, ids.createGroupQuery().count()); assertEquals(1, ids.createGroupQuery().groupId("ug1").count()); assertEquals(1, ids.createGroupQuery().groupId("ug2").count()); assertEquals(1, ids.createGroupQuery().groupId("g1").groupMember("login").count()); assertEquals(1, ids.createGroupQuery().groupId("g2").groupMember("login").count()); assertEquals(1, ids.createGroupQuery().groupId("ug1").groupMember("login").count()); assertEquals(1, ids.createGroupQuery().groupId("ug2").groupMember("login").count()); // Отнимаем персональные группы u.setGroups(ImmutableSet.<String>of()); adm.setUserItem("login", u); u = adm.getUserItem("login"); assertEquals(ImmutableSet.of(), u.getGroups()); assertEquals(USERS + 1, ids.createUserQuery().count()); assertEquals(GROUPS + 4, ids.createGroupQuery().count()); assertEquals(1, ids.createGroupQuery().groupId("ug1").count()); assertEquals(1, ids.createGroupQuery().groupId("ug2").count()); assertEquals(1, ids.createGroupQuery().groupId("g1").groupMember("login").count()); assertEquals(1, ids.createGroupQuery().groupId("g2").groupMember("login").count()); assertEquals(0, ids.createGroupQuery().groupId("ug1").groupMember("login").count()); assertEquals(0, ids.createGroupQuery().groupId("ug2").groupMember("login").count()); // Отнимаем группы у организации assertTrue(adm.setOrgGroupNames(org.getId(), ImmutableSet.<String>of())); assertEquals(ImmutableSet.of(), adm.getOrgGroupNames(org.getId())); assertEquals(USERS + 1, ids.createUserQuery().count()); assertEquals(GROUPS + 4, ids.createGroupQuery().count()); assertEquals(1, ids.createGroupQuery().groupId("g1").count()); assertEquals(1, ids.createGroupQuery().groupId("g2").count()); assertEquals(0, ids.createGroupQuery().groupId("g1").groupMember("login").count()); assertEquals(0, ids.createGroupQuery().groupId("g2").groupMember("login").count()); // Добавляем персональную группу u.setGroups(ImmutableSet.of("ug1")); adm.setUserItem("login", u); u = adm.getUserItem("login"); assertEquals(ImmutableSet.of("ug1"), u.getGroups()); assertEquals(USERS + 1, ids.createUserQuery().count()); assertEquals(GROUPS + 4, ids.createGroupQuery().count()); assertEquals(1, ids.createGroupQuery().groupId("g1").count()); assertEquals(1, ids.createGroupQuery().groupId("g2").count()); assertEquals(1, ids.createGroupQuery().groupId("ug1").groupMember("login").count()); assertEquals(0, ids.createGroupQuery().groupId("ug2").groupMember("login").count()); assertEquals(0, ids.createGroupQuery().groupId("g1").groupMember("login").count()); assertEquals(0, ids.createGroupQuery().groupId("g2").groupMember("login").count()); // Отнимаем персональную группу u.setGroups(ImmutableSet.<String>of()); adm.setUserItem("login", u); u = adm.getUserItem("login"); assertEquals(ImmutableSet.of(), u.getGroups()); assertEquals(USERS + 1, ids.createUserQuery().count()); assertEquals(GROUPS + 4, ids.createGroupQuery().count()); assertEquals(1, ids.createGroupQuery().groupId("g1").count()); assertEquals(1, ids.createGroupQuery().groupId("g2").count()); assertEquals(0, ids.createGroupQuery().groupId("ug1").groupMember("login").count()); assertEquals(0, ids.createGroupQuery().groupId("ug2").groupMember("login").count()); assertEquals(0, ids.createGroupQuery().groupId("g1").groupMember("login").count()); assertEquals(0, ids.createGroupQuery().groupId("g2").groupMember("login").count()); } finally { tx.rollback(); } } @Test @Ignore("не выходит каменный цветок") public void z() throws Exception { tx.begin(); Connection connection = em.unwrap(Connection.class); String database = connection.getMetaData().getDatabaseProductName(); System.err.println("Database is " + database); if (!database.equals("H2")) { for (Object o : em.createNativeQuery("select tablename from pg_tables where schemaname = 'public'").getResultList()) { String table = (String) o; if (!"pg_ts_dict".equals(table) && !"pg_ts_parser".equals(table)) { em.createNativeQuery("drop table if exists \"" + table + "\" cascade").executeUpdate(); } } for (Object o : em.createNativeQuery("select relname from pg_class where relkind = 'S'").getResultList()) { String sequence = (String) o; em.createNativeQuery("drop sequence " + sequence).executeUpdate(); } } tx.commit(); } @Inject GlassfihSecurity security; static boolean adminCreated; /** * Arquillian не предоставляет стандартрного механизма для указания пользователя, делаем сами. */ @Before public void loginAsAdmin() throws Exception { if (!adminCreated) { adminCreated = true; security.create("administrator", ImmutableSet.of("Administrator")); } security.login("administrator", "1"); } }