How to use IdentityManager in tests?
vestnik Nov 20, 2009 5:26 PMI was able to create/modify new users using EntityManager both in applicacation and in tests. When I start using IdentityManager to create new users and grant roles I start getting EntityManagerFactory not found in JNDI : java:/entityManager
in tests while application deployed to jboss works fine.
I've created new project with seam-gen to reproduce this issue in smales possible example.
AuthenticatorBean:
@Stateless
@Name("authenticator")
public class AuthenticatorBean implements Authenticator
{
@Logger private Log log;
@In Identity identity;
@In Credentials credentials;
@In IdentityManager identityManager;
public boolean authenticate()
{
if (identityManager.authenticate(credentials.getUsername(),credentials.getPassword()))
{
for (String role: identityManager.getGrantedRoles(credentials.getUsername())) {
identity.addRole(role);
}
}
return false;
}
}
AutheneticatorTest:
public class AutheneticatorTest extends SeamTest {
private static final String USERNAME = "admin@test.com";
private static final String PASS = "12345678";
@BeforeMethod
public void init() throws Exception {
new ComponentTest() {
@Override
protected void testComponents() throws Exception {
createUser();
}
@Transactional
private void createUser() {
Identity.setSecurityEnabled(false);
IdentityManager.instance().createUser(USERNAME,PASS);
Identity.setSecurityEnabled(true);
}
}.run();
}
@Test
public void loginTest() throws Exception {
new FacesRequest("/login.xhtml") {
@Override
protected void processValidations() throws Exception {
validateValue("#{credentials.username}", USERNAME);
validateValue("#{credentials.password}", PASS);
validateValue("#{identity.loggedIn}", true);
assert !isValidationFailure();
}
@Override
protected void updateModelValues() throws Exception {
setValue("#{credentials.username}", USERNAME);
setValue("#{credentials.password}", PASS);
}
@Override
protected void invokeApplication() {
assert invokeMethod("#{identity.login}").equals("loggedIn");
}
}.run();
}
}
User and Role classes are taken from the chapter 15.4.2.3.1. Minimal schema example
of Seam 2.2.0.GA tutorial, components.xml modified to use this classes for identity management.
when I run tests I got the following errors:
[testng] [Parser] Running: [testng] /home/vidyuk/Development/test/test-build/AutheneticatorTest.xml [testng] [testng] WARN [org.jboss.seam.security.permission.PersistentPermissionResolver] no permission store available - please install a PermissionStore with the name 'org.jboss.seam.security.jpaPermissionStore' if persistent permissions are required. [testng] FAILED CONFIGURATION: @BeforeMethod init [testng] org.jboss.seam.security.management.IdentityManagementException: Could not create account [testng] at org.jboss.seam.security.management.JpaIdentityStore.createUser(JpaIdentityStore.java:246) [testng] at org.jboss.seam.security.management.IdentityManager.createUser(IdentityManager.java:100) [testng] at org.jboss.seam.security.management.IdentityManager.createUser(IdentityManager.java:94) [testng] at com.mydomain.test.tests.AutheneticatorTest$1.createUser(AutheneticatorTest.java:25) [testng] at com.mydomain.test.tests.AutheneticatorTest$1.testComponents(AutheneticatorTest.java:19) [testng] at org.jboss.seam.mock.AbstractSeamTest$ComponentTest.run(AbstractSeamTest.java:162) [testng] at com.mydomain.test.tests.AutheneticatorTest.init(AutheneticatorTest.java:16) [testng] Caused by: java.lang.IllegalArgumentException: EntityManagerFactory not found in JNDI : java:/entityManager [testng] at org.jboss.seam.persistence.ManagedPersistenceContext.getEntityManagerFactoryFromJndiOrValueBinding(ManagedPersistenceContext.java:245) [testng] at org.jboss.seam.persistence.ManagedPersistenceContext.initEntityManager(ManagedPersistenceContext.java:78) [testng] at org.jboss.seam.persistence.ManagedPersistenceContext.getEntityManager(ManagedPersistenceContext.java:107) [testng] at org.jboss.seam.util.Reflections.invoke(Reflections.java:22) [testng] at org.jboss.seam.util.Reflections.invokeAndWrap(Reflections.java:144) [testng] at org.jboss.seam.Component.callComponentMethod(Component.java:2249) [testng] at org.jboss.seam.Component.unwrap(Component.java:2275) [testng] at org.jboss.seam.Component.getInstance(Component.java:2041) [testng] at org.jboss.seam.Component.getInstance(Component.java:1983) [testng] at org.jboss.seam.Component.getInstance(Component.java:1977) [testng] at org.jboss.seam.Namespace.getComponentInstance(Namespace.java:55) [testng] at org.jboss.seam.Namespace.getComponentInstance(Namespace.java:50) [testng] at org.jboss.seam.el.SeamELResolver.resolveBase(SeamELResolver.java:148) [testng] at org.jboss.seam.el.SeamELResolver.getValue(SeamELResolver.java:51) [testng] at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:143) [testng] at org.jboss.el.parser.AstIdentifier.getValue(AstIdentifier.java:44) [testng] at org.jboss.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:186) [testng] at org.jboss.seam.core.Expressions$1.getValue(Expressions.java:112) [testng] at org.jboss.seam.security.management.JpaIdentityStore.lookupEntityManager(JpaIdentityStore.java:1051) [testng] at org.jboss.seam.security.management.JpaIdentityStore.lookupUser(JpaIdentityStore.java:860) [testng] at org.jboss.seam.security.management.JpaIdentityStore.userExists(JpaIdentityStore.java:635) [testng] at org.jboss.seam.security.management.JpaIdentityStore.createUser(JpaIdentityStore.java:208) [testng] ... 30 more [testng] Caused by: javax.naming.NameNotFoundException: entityManager not bound [testng] at org.jnp.server.NamingServer.getBinding(NamingServer.java:542) [testng] at org.jnp.server.NamingServer.getBinding(NamingServer.java:550) [testng] at org.jnp.server.NamingServer.getObject(NamingServer.java:556) [testng] at org.jnp.server.NamingServer.lookup(NamingServer.java:296) [testng] at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:669) [testng] at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:629) [testng] at javax.naming.InitialContext.lookup(InitialContext.java:392) [testng] at org.jboss.seam.persistence.ManagedPersistenceContext.getEntityManagerFactoryFromJndiOrValueBinding(ManagedPersistenceContext.java:241) [testng] ... 55 more [testng] ... Removed 28 stack frames [testng] SKIPPED: loginTest [testng] [testng] =============================================== [testng] Login [testng] Tests run: 1, Failures: 0, Skips: 1 [testng] Configuration Failures: 1, Skips: 0 [testng] =============================================== [testng] [testng] [testng] =============================================== [testng] Autheneticator [testng] Total tests run: 1, Failures: 0, Skips: 1 [testng] Configuration Failures: 1, Skips: 0 [testng] =============================================== [testng]
I've already spent 8 or 9 hours trying to solve this issue. How can I run actions that are call IdentityManager methods in SeamTest?