/**
* The contents of this file are subject to the OpenMRS Public License
* Version 1.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://license.openmrs.org
*
* Software distributed under the License is distributed on an "AS IS"
* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
* License for the specific language governing rights and limitations
* under the License.
*
* Copyright (C) OpenMRS, LLC. All Rights Reserved.
*/
package org.openmrs.module.sync;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.assertFalse;
import java.util.Date;
import junit.framework.Assert;
import org.junit.Test;
import org.openmrs.GlobalProperty;
import org.openmrs.Person;
import org.openmrs.PersonName;
import org.openmrs.Privilege;
import org.openmrs.Role;
import org.openmrs.User;
import org.openmrs.api.UserService;
import org.openmrs.api.context.Context;
import org.openmrs.module.sync.advice.GenerateSystemIdAdvisor;
import org.openmrs.util.OpenmrsConstants;
import org.openmrs.util.OpenmrsUtil;
import org.springframework.test.annotation.NotTransactional;
/**
*
*/
public class SyncUserTest extends SyncBaseTest {
@Override
public String getInitialDataset() {
try {
return "org/openmrs/module/sync/include/" + new TestUtil().getTestDatasetFilename("syncCreateTest");
}
catch (Exception e) {
throw new RuntimeException(e);
}
}
@Test
@NotTransactional
public void shouldCreateUser() throws Exception {
runSyncTest(new SyncTestHelper() {
UserService us = Context.getUserService();
public void runOnChild() {
User u = new User();
u.setPerson(new Person());
u.setUsername("djazayeri");
u.addName(new PersonName("Darius", "Graham", "Jazayeri"));
u.getPerson().setGender("M");
u.addRole(us.getRole("Administrator"));
u.addRole(us.getRole("Provider"));
us.saveUser(u, "Test1234");
}
public void runOnParent() {
User u = us.getUserByUsername("djazayeri");
assertNotNull("User not created", u);
assertEquals("Failed to create person name", u.getPersonName().getGivenName(), "Darius");
assertEquals("Failed to assign roles", u.getRoles().size(), 2);
}
});
}
@Test
@NotTransactional
public void shouldChangePwd() throws Exception {
runSyncTest(new SyncTestHelper() {
UserService us = Context.getUserService();
String newPWD = "NewPassword123";
String userUuid = null;
public void runOnChild() {
userUuid = us.getUser(1).getUuid();
us.changePassword(us.getUser(1), newPWD);
assertEquals(userUuid, us.getUser(1).getUuid());
}
public void runOnParent() {
assertEquals(userUuid, us.getUser(1).getUuid());
Context.authenticate(us.getUser(1).getSystemId(), newPWD);
}
});
}
@Test
@NotTransactional
public void shouldEditUser() throws Exception {
runSyncTest(new SyncTestHelper() {
UserService us = Context.getUserService();
Date d = ymd.parse("1978-04-11");
int numRolesBefore;
public void runOnChild() {
User u = us.getUser(1);
u.getPerson().setBirthdate(d);
u.addName(new PersonName("Darius", "Graham", "Jazayeri"));
numRolesBefore = u.getRoles().size();
u.addRole(us.getRole("Provider"));
us.saveUser(u, null);
}
public void runOnParent() {
User u = us.getUser(1);
assertEquals("Failed to create person name", u.getNames().size(), 2);
assertEquals("Failed to assign roles", u.getRoles().size(), numRolesBefore + 1);
assertEquals("Failed to set birthdate", OpenmrsUtil.compare(u.getPerson().getBirthdate(), d), 0);
}
});
}
@Test
@NotTransactional
public void shouldCreateRoleAndPrivilege() throws Exception {
runSyncTest(new SyncTestHelper() {
public void runOnChild() {
Privilege priv = new Privilege("Kitchen Use");
priv.setDescription("Can step into the kitchen");
Context.getUserService().savePrivilege(priv);
Role role = new Role("Chef");
role.setDescription("One who cooks");
role.addPrivilege(priv);
Context.getUserService().saveRole(role);
}
public void runOnParent() {
Privilege priv = Context.getUserService().getPrivilege("Kitchen Use");
assertEquals("Privilege failed", "Can step into the kitchen", priv.getDescription());
Role role = Context.getUserService().getRole("Chef");
assertEquals("Role failed", "One who cooks", role.getDescription());
}
});
}
@Test
@NotTransactional
public void shouldAddPrivilegeToRole() throws Exception {
runSyncTest(new SyncTestHelper() {
int numAtStart = 0;
public void runOnChild() {
Privilege priv = Context.getUserService().getPrivilege("Manage Locations");
Role role = Context.getUserService().getRole("Provider");
numAtStart = role.getPrivileges().size();
role.addPrivilege(priv);
Context.getUserService().saveRole(role);
}
public void runOnParent() {
Role role = Context.getUserService().getRole("Provider");
assertEquals("Failed to create role",
numAtStart + 1,
role.getPrivileges().size());
assertTrue("Does not have newly granted privilege", role.hasPrivilege("Manage Locations"));
}
});
}
/**
* This validates that the {@link GenerateSystemIdAdvisor} is working
* and prepending the server id to the system id when a new user is created
*
* @throws Exception
*/
@Test
@NotTransactional
public void shouldPrependServerIdToNewUsersGeneratedSystemId() throws Exception {
runSyncTest(new SyncTestHelper() {
String EXPECTED_SYSTEM_ID = "parent_3-9";
UserService us = Context.getUserService();
public void runOnChild() {
User u = new User();
u.setPerson(new Person());
u.setUsername("djazayeri");
u.addName(new PersonName("Darius", "Graham", "Jazayeri"));
u.getPerson().setGender("M");
us.saveUser(u, "Test1234");
assertEquals(EXPECTED_SYSTEM_ID, u.getSystemId());
}
public void runOnParent() {
User u = us.getUserByUsername("djazayeri");
assertEquals(EXPECTED_SYSTEM_ID, u.getSystemId());
}
});
}
/**
* This validates that the {@link GenerateSystemIdAdvisor} is just
* silently not doing anything if the server id is not defined yet
*
* @throws Exception
*/
@Test
@NotTransactional
public void shouldNotGenerateSystemIdIfGPNotDefined() throws Exception {
runSyncTest(new SyncTestHelper() {
String EXPECTED_SYSTEM_ID = "3-4";
UserService us = Context.getUserService();
public void runOnChild() {
// override the xml defined server id with a blank server id
Context.getAdministrationService().saveGlobalProperty(new GlobalProperty(SyncConstants.PROPERTY_SYSTEM_ID_TEMPLATE, ""));
User u = new User();
u.setPerson(new Person());
u.setUsername("djazayeri");
u.addName(new PersonName("Darius", "Graham", "Jazayeri"));
u.getPerson().setGender("M");
us.saveUser(u, "Test1234");
assertEquals(EXPECTED_SYSTEM_ID, u.getSystemId());
}
public void runOnParent() {
User u = us.getUserByUsername("djazayeri");
assertEquals(EXPECTED_SYSTEM_ID, u.getSystemId());
}
});
}
/**
* This validates that the {@link GenerateSystemIdAdvisor} is is replacing the SYNCSERVERUUID var
*
* @throws Exception
*/
@Test
@NotTransactional
public void shouldAddServerUuidToGeneratedSystemId() throws Exception {
runSyncTest(new SyncTestHelper() {
String EXPECTED_SYSTEM_ID = "46b16ac6144e102b8d9ce44ed545d86c_3-3";
UserService us = Context.getUserService();
public void runOnChild() {
// override the xml defined server id with a blank server id
Context.getAdministrationService().saveGlobalProperty(new GlobalProperty(SyncConstants.PROPERTY_SYSTEM_ID_TEMPLATE, "{SYNCSERVERUUID}_{NEXTUSERID}{CHECKDIGIT}"));
User u = new User();
u.setPerson(new Person());
u.setUsername("djazayeri");
u.addName(new PersonName("Darius", "Graham", "Jazayeri"));
u.getPerson().setGender("M");
us.saveUser(u, "Test1234");
assertEquals(EXPECTED_SYSTEM_ID, u.getSystemId());
}
public void runOnParent() {
User u = us.getUserByUsername("djazayeri");
assertEquals(EXPECTED_SYSTEM_ID, u.getSystemId());
}
});
}
/**
* This validates that the {@link GenerateSystemIdAdvisor} is is replacing the CHECKDIGIT var
*
* @throws Exception
*/
@Test
@NotTransactional
public void shouldGenerateCheckDigitInGeneratedSystemId() throws Exception {
runSyncTest(new SyncTestHelper() {
String EXPECTED_SYSTEM_ID = "parent-2";
UserService us = Context.getUserService();
public void runOnChild() {
// override the xml defined server id with a blank server id
Context.getAdministrationService().saveGlobalProperty(new GlobalProperty(SyncConstants.PROPERTY_SYSTEM_ID_TEMPLATE, "{CHECKDIGIT}{SYNCSERVERNAME}"));
User u = new User();
u.setPerson(new Person());
u.setUsername("djazayeri");
u.addName(new PersonName("Darius", "Graham", "Jazayeri"));
u.getPerson().setGender("M");
us.saveUser(u, "Test1234");
assertEquals(EXPECTED_SYSTEM_ID, u.getSystemId());
}
public void runOnParent() {
User u = us.getUserByUsername("djazayeri");
assertEquals(EXPECTED_SYSTEM_ID, u.getSystemId());
}
});
}
/**
* This validates that the {@link GenerateSystemIdAdvisor} is is replacing the CHECKDIGIT var
*
* @throws Exception
*/
@Test
@NotTransactional
public void shouldGenerateCheckDigitWithNextUserIdInGeneratedSystemId() throws Exception {
runSyncTest(new SyncTestHelper() {
String EXPECTED_SYSTEM_ID = "3-4";
UserService us = Context.getUserService();
public void runOnChild() {
// override the xml defined server id with a blank server id
Context.getAdministrationService().saveGlobalProperty(new GlobalProperty(SyncConstants.PROPERTY_SYSTEM_ID_TEMPLATE, "{NEXTUSERID}{CHECKDIGIT}"));
User u = new User();
u.setPerson(new Person());
u.setUsername("djazayeri");
u.addName(new PersonName("Darius", "Graham", "Jazayeri"));
u.getPerson().setGender("M");
us.saveUser(u, "Test1234");
assertEquals(EXPECTED_SYSTEM_ID, u.getSystemId());
}
public void runOnParent() {
User u = us.getUserByUsername("djazayeri");
assertEquals(EXPECTED_SYSTEM_ID, u.getSystemId());
}
});
}
@Test
@NotTransactional
public void shouldSyncUserPropertyUpdate() throws Exception {
runSyncTest(new SyncTestHelper() {
UserService us = Context.getUserService();
public void runOnChild() {
User u = us.getUser(1);
u.setUserProperty(OpenmrsConstants.USER_PROPERTY_DEFAULT_LOCALE, "fr");
u.setUserProperty(OpenmrsConstants.USER_PROPERTY_CHANGE_PASSWORD, "false");
u.setUserProperty(OpenmrsConstants.USER_PROPERTY_LOGIN_ATTEMPTS, "5");
us.saveUser(u, null);
}
public void runOnParent() {
User u = us.getUser(1);
assertFalse(Boolean.valueOf(u.getUserProperties().get(OpenmrsConstants.USER_PROPERTY_CHANGE_PASSWORD)));
assertTrue("fr".equals(u.getUserProperties().get(OpenmrsConstants.USER_PROPERTY_DEFAULT_LOCALE)));
assertTrue("5".equals(u.getUserProperties().get(OpenmrsConstants.USER_PROPERTY_LOGIN_ATTEMPTS)));
}
});
}
@Test
@NotTransactional
public void shouldSyncUserPropertyRemove() throws Exception {
runSyncTest(new SyncTestHelper() {
UserService us = Context.getUserService();
public void runOnChild() {
User u = us.getUser(1);
u.setUserProperty(OpenmrsConstants.USER_PROPERTY_CHANGE_PASSWORD, "true");
us.saveUser(u, null);
u.removeUserProperty(OpenmrsConstants.USER_PROPERTY_CHANGE_PASSWORD);
us.saveUser(u, null);
}
public void runOnParent() {
User u = us.getUser(1);
assertFalse(u.getUserProperties().containsKey(OpenmrsConstants.USER_PROPERTY_CHANGE_PASSWORD));
}
});
}
@Test
@NotTransactional
public void shouldDeleteUserAccount() throws Exception {
runSyncTest(new SyncTestHelper() {
UserService us = Context.getUserService();
public void runOnChild() {
User u = us.getUserByUsername("bwayne");
Assert.assertNotNull(u);
us.purgeUser(u);
}
public void runOnParent() {
User u = us.getUserByUsername("bwayne");
Assert.assertNull(u);
}
});
}
}