/* * The contents of this file are subject to the OpenMRS Public License * Version 2.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) OpenHMIS. All Rights Reserved. */ package org.openmrs.module.openhmis.cashier.api; import java.util.List; import java.util.Properties; import org.hibernate.cfg.Environment; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.openmrs.api.context.Context; import org.openmrs.module.openhmis.cashier.api.model.GroupSequence; import org.openmrs.module.openhmis.cashier.api.model.SequentialReceiptNumberGeneratorModel; import org.openmrs.module.openhmis.commons.api.entity.IObjectDataServiceTest; public class ISequentialReceiptNumberGeneratorServiceTest extends IObjectDataServiceTest<ISequentialReceiptNumberGeneratorService, SequentialReceiptNumberGeneratorModel> { public static final String SEQUENTIAL_RECEIPT_NUMBER_GENERATOR_DATASET = TestConstants.BASE_DATASET_DIR + "SequentialReceiptNumberGenerator.xml"; @Override public Properties getRuntimeProperties() { Properties properties = super.getRuntimeProperties(); // This is needed for proper locking in the in-memory database properties.setProperty(Environment.URL, "jdbc:h2:mem:openmrs;DB_CLOSE_DELAY=30;MVCC=TRUE"); return properties; } @Before public void before() throws Exception { super.before(); executeDataSet(SEQUENTIAL_RECEIPT_NUMBER_GENERATOR_DATASET); } @Override public SequentialReceiptNumberGeneratorModel createEntity(boolean valid) { SequentialReceiptNumberGeneratorModel model = new SequentialReceiptNumberGeneratorModel(); model.setGroupingType(SequentialReceiptNumberGenerator.GroupingType.NONE); model.setSequenceType(SequentialReceiptNumberGenerator.SequenceType.COUNTER); model.setSeparator("-"); model.setSequencePadding(4); model.setIncludeCheckDigit(true); if (valid) { model.setCashierPrefix(SequentialReceiptNumberGeneratorModel.DEFAULT_CASHIER_PREFIX); model.setCashPointPrefix(SequentialReceiptNumberGeneratorModel.DEFAULT_CASH_POINT_PREFIX); } else { model.setCashierPrefix(null); model.setCashPointPrefix(null); } return model; } protected GroupSequence createSequence(String group, int value) { GroupSequence result = new GroupSequence(); result.setGroup(group); result.setValue(value); return result; } @Override protected int getTestEntityCount() { return 1; } @Override protected void updateEntityFields(SequentialReceiptNumberGeneratorModel entity) { entity.setCashierPrefix("UP"); entity.setCashPointPrefix("UCP"); entity.setGroupingType(SequentialReceiptNumberGenerator.GroupingType.CASH_POINT); entity.setSequenceType(SequentialReceiptNumberGenerator.SequenceType.DATE_TIME_COUNTER); entity.setSeparator("_"); entity.setSequencePadding(8); entity.setIncludeCheckDigit(!entity.isIncludeCheckDigit()); } @Override protected void assertEntity(SequentialReceiptNumberGeneratorModel expected, SequentialReceiptNumberGeneratorModel actual) { Assert.assertEquals(expected.getCashierPrefix(), actual.getCashierPrefix()); Assert.assertEquals(expected.getCashPointPrefix(), actual.getCashPointPrefix()); Assert.assertEquals(expected.getGroupingType(), actual.getGroupingType()); Assert.assertEquals(expected.getSeparator(), actual.getSeparator()); Assert.assertEquals(expected.getSequencePadding(), actual.getSequencePadding()); Assert.assertEquals(expected.getSequenceType(), actual.getSequenceType()); Assert.assertEquals(expected.isIncludeCheckDigit(), actual.isIncludeCheckDigit()); } /** * @verifies Increment and return the sequence value for existing groups * @see ISequentialReceiptNumberGeneratorService#reserveNextSequence(String) */ @Test public void reserveNextSequence_shouldIncrementAndReturnTheSequenceValueForExistingGroups() throws Exception { GroupSequence sequence = createSequence("test", 1); service.saveSequence(sequence); sequence = createSequence("test2", 53); service.saveSequence(sequence); sequence = createSequence("test3", 10); service.saveSequence(sequence); Context.flushSession(); int result = service.reserveNextSequence("test"); Assert.assertEquals(2, result); sequence = service.getSequence("test"); Assert.assertNotNull(sequence); Assert.assertEquals(2, sequence.getValue()); Context.flushSession(); result = service.reserveNextSequence("test"); Assert.assertEquals(3, result); sequence = service.getSequence("test"); Assert.assertNotNull(sequence); Assert.assertEquals(3, sequence.getValue()); Context.flushSession(); result = service.reserveNextSequence("test2"); Assert.assertEquals(54, result); sequence = service.getSequence("test2"); Assert.assertNotNull(sequence); Assert.assertEquals(54, sequence.getValue()); Context.flushSession(); result = service.reserveNextSequence("test3"); Assert.assertEquals(11, result); sequence = service.getSequence("test3"); Assert.assertNotNull(sequence); Assert.assertEquals(11, sequence.getValue()); } /** * @verifies Create a new sequence with a value of one if the group does not exist * @see ISequentialReceiptNumberGeneratorService#reserveNextSequence(String) */ @Test public void reserveNextSequence_shouldCreateANewSequenceWithAValueOfOneIfTheGroupDoesNotExist() throws Exception { GroupSequence sequence = service.getSequence("test"); Assert.assertNull(sequence); int result = service.reserveNextSequence("test"); Assert.assertEquals(1, result); Context.flushSession(); sequence = service.getSequence("test"); Assert.assertNotNull(sequence); Assert.assertEquals(1, sequence.getValue()); } /** * @verifies Throw IllegalArgumentException if the group is null * @see ISequentialReceiptNumberGeneratorService#reserveNextSequence(String) */ @Test(expected = IllegalArgumentException.class) public void reserveNextSequence_shouldThrowIllegalArgumentExceptionIfTheGroupIsNull() throws Exception { service.reserveNextSequence(null); } /** * @verifies return all sequences * @see ISequentialReceiptNumberGeneratorService#getSequences() */ @Test public void getSequences_shouldReturnAllSequences() throws Exception { List<GroupSequence> sequences = service.getSequences(); Assert.assertNotNull(sequences); Assert.assertEquals(4, sequences.size()); } /** * @verifies return an empty list if no sequences have been defined * @see ISequentialReceiptNumberGeneratorService#getSequences() */ @Test public void getSequences_shouldReturnAnEmptyListIfNoSequencesHaveBeenDefined() throws Exception { List<GroupSequence> sequences = service.getSequences(); for (GroupSequence sequence : sequences) { service.purgeSequence(sequence); } Context.flushSession(); sequences = service.getSequences(); Assert.assertNotNull(sequences); Assert.assertEquals(0, sequences.size()); } /** * @verifies Throw a NullPointerException if sequence is null * @see ISequentialReceiptNumberGeneratorService#saveSequence(org.openmrs.module.openhmis.cashier.api.model.GroupSequence) */ @Test(expected = NullPointerException.class) public void saveSequence_shouldThrowANullPointerExceptionIfSequenceIsNull() throws Exception { service.saveSequence(null); } /** * @verifies return the saved sequence * @see ISequentialReceiptNumberGeneratorService#saveSequence(org.openmrs.module.openhmis.cashier.api.model.GroupSequence) */ @Test public void saveSequence_shouldReturnTheSavedSequence() throws Exception { GroupSequence sequence = new GroupSequence(); sequence.setGroup("New Group"); sequence.setValue(50); sequence = service.saveSequence(sequence); Assert.assertNotNull(sequence); Assert.assertNotNull(sequence.getId()); Assert.assertEquals("New Group", sequence.getGroup()); Assert.assertEquals(50, sequence.getValue()); } /** * @verifies update the sequence successfully * @see ISequentialReceiptNumberGeneratorService#saveSequence(org.openmrs.module.openhmis.cashier.api.model.GroupSequence) */ @Test public void saveSequence_shouldUpdateTheSequenceSuccessfully() throws Exception { GroupSequence sequence = service.getSequence("Test Seq 1"); int oldValue = sequence.getValue(); sequence.setValue(oldValue + 10); service.saveSequence(sequence); Context.flushSession(); sequence = service.getSequence(sequence.getGroup()); Assert.assertNotNull(sequence); Assert.assertEquals(oldValue + 10, sequence.getValue()); } /** * @verifies create the sequence successfully * @see ISequentialReceiptNumberGeneratorService#saveSequence(org.openmrs.module.openhmis.cashier.api.model.GroupSequence) */ @Test public void saveSequence_shouldCreateTheSequenceSuccessfully() throws Exception { GroupSequence sequence = new GroupSequence(); sequence.setGroup("New Group"); sequence.setValue(50); Assert.assertNull(sequence.getId()); sequence = service.saveSequence(sequence); Assert.assertNotNull(sequence); Assert.assertNotNull(sequence.getId()); } /** * @verifies Throw a NullPointerException if the sequence is null * @see ISequentialReceiptNumberGeneratorService#purgeSequence(org.openmrs.module.openhmis.cashier.api.model.GroupSequence) */ @Test(expected = NullPointerException.class) public void purgeSequence_shouldThrowANullPointerExceptionIfTheSequenceIsNull() throws Exception { service.purgeSequence(null); } /** * @verifies delete the sequence from the database * @see ISequentialReceiptNumberGeneratorService#purgeSequence(org.openmrs.module.openhmis.cashier.api.model.GroupSequence) */ @Test public void purgeSequence_shouldDeleteTheSequenceFromTheDatabase() throws Exception { GroupSequence sequence = service.getSequence("Test Seq 1"); service.purgeSequence(sequence); Context.flushSession(); sequence = service.getSequence("Test Seq 1"); Assert.assertNull(sequence); } /** * @verifies not throw an exception if the sequence is not in the database * @see ISequentialReceiptNumberGeneratorService#purgeSequence(org.openmrs.module.openhmis.cashier.api.model.GroupSequence) */ @Test public void purgeSequence_shouldNotThrowAnExceptionIfTheSequenceIsNotInTheDatabase() throws Exception { GroupSequence sequence = service.getSequence("Test Seq 1"); service.purgeSequence(sequence); Context.flushSession(); service.purgeSequence(sequence); } /** * @verifies Throw an IllegalArgumentException if group is null * @see ISequentialReceiptNumberGeneratorService#getSequence(String) */ @Test(expected = IllegalArgumentException.class) public void getSequence_shouldThrowAnIllegalArgumentExceptionIfGroupIsNull() throws Exception { service.getSequence(null); } /** * @verifies return the sequence if group is empty * @see ISequentialReceiptNumberGeneratorService#getSequence(String) */ @Test public void getSequence_shouldReturnTheSequenceIfGroupIsEmpty() throws Exception { GroupSequence sequence = service.getSequence(""); Assert.assertNotNull(sequence); Assert.assertEquals("", sequence.getGroup()); Assert.assertEquals(18, sequence.getValue()); } /** * @verifies return the specified sequence * @see ISequentialReceiptNumberGeneratorService#getSequence(String) */ @Test public void getSequence_shouldReturnTheSpecifiedSequence() throws Exception { GroupSequence sequence = service.getSequence("Test Seq 1"); Assert.assertNotNull(sequence); Assert.assertEquals("Test Seq 1", sequence.getGroup()); Assert.assertEquals(10, sequence.getValue()); } /** * @verifies return null if the sequence cannot be found * @see ISequentialReceiptNumberGeneratorService#getSequence(String) */ @Test public void getSequence_shouldReturnNullIfTheSequenceCannotBeFound() throws Exception { GroupSequence sequence = service.getSequence("Not A Valid Sequence"); Assert.assertNull(sequence); } /** * @verifies return the first model. * @see ISequentialReceiptNumberGeneratorService#getOnly() */ @Test public void getOnly_shouldReturnTheFirstModel() throws Exception { SequentialReceiptNumberGeneratorModel model = service.getOnly(); Assert.assertNotNull(model); Assert.assertEquals((Integer)0, model.getId()); } /** * @verifies return a new model if none has been defined. * @see ISequentialReceiptNumberGeneratorService#getOnly() */ @Test public void getOnly_shouldReturnANewModelIfNoneHasBeenDefined() throws Exception { SequentialReceiptNumberGeneratorModel model = service.getOnly(); service.purge(model); model = service.getOnly(); Assert.assertNotNull(model); Assert.assertNull(model.getId()); } }