Skip to content

Commit

Permalink
TRUNK-6189: Provider Service class should provide ability to getProvi…
Browse files Browse the repository at this point in the history
…derAttributeTypeByName (#4403)

* TRUNK-6189:Provider Service class should provide ability to getProviderAttributeTypeByName

* change protected to private
  • Loading branch information
mherman22 committed Oct 18, 2023
1 parent 04e3921 commit eadc438
Show file tree
Hide file tree
Showing 8 changed files with 159 additions and 5 deletions.
11 changes: 11 additions & 0 deletions api/src/main/java/org/openmrs/api/ProviderService.java
Expand Up @@ -233,6 +233,17 @@ public List<Provider> getProviders(String query, Integer start, Integer length,
*/
public ProviderAttributeType getProviderAttributeTypeByUuid(String uuid);

/**
* Get a provider attribute type by it's name
*
* @param name the name of the provider attribute type
* @return the provider attribute type for the given name
* <strong>Should</strong> get the provider attribute type by it's name
* @since 2.7.0
*/
@Authorized({PrivilegeConstants.GET_PROVIDER_ATTRIBUTE_TYPES})
public ProviderAttributeType getProviderAttributeTypeByName(String name);

/**
* Get a provider attribute by it's providerAttributeID
*
Expand Down
5 changes: 5 additions & 0 deletions api/src/main/java/org/openmrs/api/db/ProviderDAO.java
Expand Up @@ -95,6 +95,11 @@ public List<Provider> getProviders(String name, Map<ProviderAttributeType, Strin
*/
ProviderAttributeType getProviderAttributeTypeByUuid(String uuid);

/**
* @see ProviderService#getProviderAttributeTypeByName(String)
*/
ProviderAttributeType getProviderAttributeTypeByName(String name);

/**
* @see ProviderService#saveProviderAttributeType(ProviderAttributeType)
*/
Expand Down
Expand Up @@ -287,6 +287,22 @@ public ProviderAttributeType getProviderAttributeTypeByUuid(String uuid) {
return getByUuid(uuid, ProviderAttributeType.class);
}

/* (non-Javadoc)
* @see org.openmrs.api.db.ProviderDAO#getProviderAttributeTypeByName(java.lang.String)
*/
@Override
public ProviderAttributeType getProviderAttributeTypeByName(String name) {
Criteria criteria = getSession().createCriteria(ProviderAttributeType.class);
criteria.add(Restrictions.eq("retired", false));
criteria.add(Restrictions.eq("name", name));
List<ProviderAttributeType> list = criteria.list();

if (list.isEmpty()) {
return null;
}
return list.get(0);
}

/* (non-Javadoc)
* @see org.openmrs.api.db.ProviderDAO#saveProviderAttributeType(org.openmrs.ProviderAttributeType)
*/
Expand Down
Expand Up @@ -213,6 +213,15 @@ public ProviderAttributeType getProviderAttributeTypeByUuid(String uuid) {
return dao.getProviderAttributeTypeByUuid(uuid);
}

/**
* @see org.openmrs.api.ProviderService#getProviderAttributeTypeByName(String)
*/
@Override
@Transactional(readOnly = true)
public ProviderAttributeType getProviderAttributeTypeByName(String name) {
return dao.getProviderAttributeTypeByName(name);
}

/**
* @see org.openmrs.api.ProviderService#getProviderAttribute(java.lang.Integer)
*/
Expand Down
3 changes: 3 additions & 0 deletions api/src/main/java/org/openmrs/util/PrivilegeConstants.java
Expand Up @@ -109,6 +109,9 @@ private PrivilegeConstants() {
@AddOnStartup(description = "Able to get person attribute types")
public static final String GET_PERSON_ATTRIBUTE_TYPES = "Get Person Attribute Types";

@AddOnStartup(description = "Able to get provider attribute types")
public static final String GET_PROVIDER_ATTRIBUTE_TYPES = "Get Provider Attribute Types";

@AddOnStartup(description = "Able to get person objects")
public static final String GET_PERSONS = "Get People";

Expand Down
Expand Up @@ -11,7 +11,10 @@

import org.openmrs.ProviderAttributeType;
import org.openmrs.annotation.Handler;
import org.openmrs.api.ProviderService;
import org.openmrs.api.context.Context;
import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;

/**
* Validates attributes on the {@link ProviderAttributeType} object.
Expand All @@ -33,12 +36,36 @@ public boolean supports(Class<?> c) {
return ProviderAttributeType.class.isAssignableFrom(c);
}

/**
* @see org.springframework.validation.Validator#validate(java.lang.Object,
* org.springframework.validation.Errors)
* <strong>Should</strong> fail validation if name is null
* <strong>Should</strong> fail validation if datatypeClassname is empty
* <strong>Should</strong> fail validation if name already in use
* <strong>Should</strong> pass validation if description is null or empty or whitespace
* <strong>Should</strong> pass validation if all fields are correct
* <strong>Should</strong> pass validation if field lengths are correct
*
* <strong>NOTE</strong>: the current behaviour of the name is that;- when you create an attribute with a name "test", you cannot
* create another one with the same name not until you retire the first one. When you retire "test", you
* create a new one with the name "test" since the existing one has been retired.
*/
@Override
public void validate(Object obj, Errors errors) {
if (obj != null) {
super.validate(obj, errors);
ValidateUtil.validateFieldLengths(errors, obj.getClass(), "name", "description", "datatypeClassname",
"preferredHandlerClassname", "retireReason");
"preferredHandlerClassname", "retireReason");
ProviderAttributeType type = (ProviderAttributeType) obj;
ValidationUtils.rejectIfEmpty(errors, "name", "ProviderAttributeType.error.nameEmpty");
ValidationUtils.rejectIfEmpty(errors, "datatypeClassname", "ProviderAttributeType.error.datatypeEmpty");
ProviderService service = Context.getProviderService();
ProviderAttributeType attributeType = service.getProviderAttributeTypeByName(type.getName());
if (attributeType != null) {
if (!attributeType.getUuid().equals(type.getUuid()) && !attributeType.getRetired()) {
errors.rejectValue("name", "ProviderAttributeType.error.nameAlreadyInUse");
}
}
}
}
}
36 changes: 36 additions & 0 deletions api/src/test/java/org/openmrs/api/ProviderServiceTest.java
Expand Up @@ -154,6 +154,16 @@ public void getProviderAttributeTypeByUuid_shouldGetTheProviderAttributeTypeByIt
assertEquals("Audit Date", providerAttributeType.getName());
}

/**
* @see ProviderService#getProviderAttributeTypeByName(String)
*/
@Test
public void getProviderAttributeTypeByName_shouldGetTheProviderAttributeTypeByItsName() {
ProviderAttributeType providerAttributeType = service.getProviderAttributeTypeByName("Audit Date");
assertEquals("Audit Date", providerAttributeType.getName());
assertEquals("9516cc50-6f9f-11e0-8414-001e378eb67e", providerAttributeType.getUuid());
}

/**
* @see ProviderService#getProviderByUuid(String)
*/
Expand Down Expand Up @@ -288,6 +298,32 @@ public void saveProviderAttributeType_shouldSaveTheProviderAttributeType() {
assertNotNull(providerAttributeType.getId());
}

/**
* @see ProviderService#saveProviderAttributeType(ProviderAttributeType)
*/
@Test
public void saveProviderAttributeType_shouldNotSaveProviderAttributeTypeWithDuplicateName() {
//duplication
ProviderAttributeType duplicatedAttributeType = new ProviderAttributeType();
duplicatedAttributeType.setName("Audit Date");
duplicatedAttributeType.setDatatypeClassname(FreeTextDatatype.class.getName());

assertThrows(ValidationException.class, () -> {
service.saveProviderAttributeType(duplicatedAttributeType);
});
}

@Test
public void saveProviderAttributeType_shouldSaveProviderAttributeTypeWithSameNameAsRetiredType() {
int size = service.getAllProviderAttributeTypes().size();
ProviderAttributeType providerAttributeType = new ProviderAttributeType();
providerAttributeType.setName("A Date We Don't Care About");
providerAttributeType.setDatatypeClassname(FreeTextDatatype.class.getName());
providerAttributeType = service.saveProviderAttributeType(providerAttributeType);
assertEquals(size + 1, service.getAllProviderAttributeTypes().size());
assertNotNull(providerAttributeType.getId());
}

/**
* @see ProviderService#unretireProvider(Provider)
*/
Expand Down
Expand Up @@ -10,10 +10,13 @@
package org.openmrs.validator;

import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertTrue;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.openmrs.ProviderAttributeType;
import org.openmrs.api.context.Context;
import org.openmrs.test.jupiter.BaseContextSensitiveTest;
import org.springframework.validation.BindException;
import org.springframework.validation.Errors;
Expand All @@ -23,6 +26,20 @@
*/
public class ProviderAttributeTypeValidatorTest extends BaseContextSensitiveTest {

private static final String PROVIDER_ATTRIBUTE_DATA_XML = "org/openmrs/api/include/ProviderServiceTest-providerAttributes.xml";

/**
* Run this before each unit test in this class. This adds a bit more data to the base data that
* is done in the "@Before" method in {@link BaseContextSensitiveTest} (which is run right
* before this method).
*
* @throws Exception
*/
@BeforeEach
public void runBeforeEachTest() {
executeDataSet(PROVIDER_ATTRIBUTE_DATA_XML);
}

/**
* @see ProviderAttributeTypeValidator#validate(Object, org.springframework.validation.Errors)
*/
Expand All @@ -40,21 +57,51 @@ public void validate_shouldPassValidationIfFieldLengthsAreCorrect() {
assertFalse(errors.hasErrors());
}

/**
* @see ProviderAttributeTypeValidator#validate(Object,Errors)
*/
@Test
public void validate_shouldFailValidationIfDatatypeClassnameIsEmpty() {
ProviderAttributeType type = new ProviderAttributeType();
type.setName("name");
type.setDatatypeClassname("");
type.setDescription("description");
type.setRetireReason("retireReason");

Errors errors = new BindException(type, "type");
new ProviderAttributeTypeValidator().validate(type, errors);
assertTrue(errors.hasFieldErrors("datatypeClassname"));
}

/**
* @see ProviderAttributeTypeValidator#validate(Object,Errors)
*/
@Test
public void validate_shouldFailValidationWhenAnActiveAttributeTypeWithSameNameExists() {
assertNotNull(Context.getProviderService().getProviderAttributeTypeByName("Audit Date"));
ProviderAttributeType type = new ProviderAttributeType();
type.setName("Audit Date");
type.setDatatypeClassname("org.openmrs.customdatatype.datatype.DateDatatype");
Errors errors = new BindException(type, "providerAttributeType");
new ProviderAttributeTypeValidator().validate(type, errors);
assertTrue(errors.hasFieldErrors("name"));
}

/**
* @see ProviderAttributeTypeValidator#validate(Object,Errors)
*/
@Test
public void validate_shouldFailValidationIfFieldLengthsAreNotCorrect() {
ProviderAttributeType type = new ProviderAttributeType();
type
.setName("too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text");
.setName("too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text");
type
.setDatatypeClassname("too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text");
.setDatatypeClassname("too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text");
type.setDescription(new String(new char[655555]));
type
.setPreferredHandlerClassname("too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text");
.setPreferredHandlerClassname("too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text");
type
.setRetireReason("too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text");
.setRetireReason("too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text too long text");

Errors errors = new BindException(type, "type");
new ProviderAttributeTypeValidator().validate(type, errors);
Expand Down

0 comments on commit eadc438

Please sign in to comment.