001 /**
002 * Copyright 2005-2011 The Kuali Foundation
003 *
004 * Licensed under the Educational Community License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.opensource.org/licenses/ecl2.php
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016 package org.kuali.rice.krad.service;
017
018 import org.junit.Test;
019 import org.kuali.rice.coreservice.api.parameter.Parameter;
020 import org.kuali.rice.coreservice.framework.CoreFrameworkServiceLocator;
021 import org.kuali.rice.coreservice.impl.parameter.ParameterBo;
022 import org.kuali.rice.coreservice.impl.parameter.ParameterId;
023 import org.kuali.rice.coreservice.impl.parameter.ParameterTypeBo;
024 import org.kuali.rice.core.framework.persistence.jpa.metadata.MetadataManager;
025 import org.kuali.rice.krad.test.document.bo.Account;
026 import org.kuali.rice.krad.test.document.bo.AccountExtension;
027 import org.kuali.rice.location.impl.country.CountryBo;
028 import org.kuali.rice.location.impl.state.StateBo;
029 import org.kuali.rice.location.impl.state.StateId;
030 import org.kuali.rice.test.BaselineTestCase;
031 import org.kuali.rice.test.data.PerTestUnitTestData;
032 import org.kuali.rice.test.data.UnitTestData;
033 import org.kuali.rice.test.data.UnitTestFile;
034 import org.kuali.rice.test.data.UnitTestSql;
035 import org.kuali.test.KRADTestCase;
036
037 import java.util.HashMap;
038 import java.util.Map;
039
040 import static org.junit.Assert.*;
041
042 /**
043 * Unit tests for MetadataManager methods
044 *
045 * @author Kuali Rice Team (rice.collab@kuali.org)
046 *
047 */
048 @PerTestUnitTestData(
049 value = @UnitTestData(
050 order = {UnitTestData.Type.SQL_STATEMENTS, UnitTestData.Type.SQL_FILES},
051 sqlStatements = {
052 @UnitTestSql("delete from trv_acct where acct_fo_id between 101 and 301")
053 ,@UnitTestSql("delete from trv_acct_fo where acct_fo_id between 101 and 301")
054 },
055 sqlFiles = {
056 @UnitTestFile(filename = "classpath:testAccountManagers.sql", delimiter = ";")
057 , @UnitTestFile(filename = "classpath:testAccounts.sql", delimiter = ";")
058 }
059 ),
060 tearDown = @UnitTestData(
061 sqlStatements = {
062 @UnitTestSql("delete from trv_acct where acct_fo_id between 101 and 301")
063 ,@UnitTestSql("delete from trv_acct_fo where acct_fo_id between 101 and 301")
064 }
065 )
066 )
067 @BaselineTestCase.BaselineMode(BaselineTestCase.Mode.NONE)
068 public class MetadataManagerTest extends KRADTestCase {
069 /**
070 * Tests that MetadataManager can convert a primary key Map to a key object correctly
071 */
072 @Test
073 public void testPKMapToObject() {
074 Map<String, Object> pkMap = new HashMap<String, Object>();
075 Object pkValue = MetadataManager.convertPrimaryKeyMapToObject(CountryBo.class, pkMap);
076 assertNull("An empty map should return a null key", pkValue);
077
078 pkMap.put("code", "AN");
079 pkValue = MetadataManager.convertPrimaryKeyMapToObject(CountryBo.class, pkMap);
080 assertEquals("Single pkValue should be of class String", String.class, pkValue.getClass());
081 assertEquals("Single pkValue should be \"AN\"", "AN", pkValue);
082
083 pkMap.put("name", "ANDORRA");
084 boolean exceptionThrown = false;
085 try {
086 pkValue = MetadataManager.convertPrimaryKeyMapToObject(CountryBo.class, pkMap);
087 } catch (IllegalArgumentException iae) {
088 exceptionThrown = true;
089 }
090 assertTrue("Multiple keys did not lead to exception", exceptionThrown);
091
092 pkMap.clear();
093
094 pkMap.put("countryCode", "US");
095 pkMap.put("code", "WV");
096 pkValue = MetadataManager.convertPrimaryKeyMapToObject(StateBo.class, pkMap);
097 org.junit.Assert.assertEquals("Composite pkValue for State should have class of StateId", StateId.class, pkValue.getClass());
098 StateId stateId = (StateId)pkValue;
099 assertEquals("Country code was not correctly set", "US", stateId.getCountryCode());
100 assertEquals("State code was not correctly set", "WV", stateId.getCode());
101
102 pkMap.put("name", "WEST VIRGINIA");
103 exceptionThrown = false;
104 try {
105 pkValue = MetadataManager.convertPrimaryKeyMapToObject(StateBo.class, pkMap);
106 } catch (Exception e) {
107 exceptionThrown = true;
108 }
109 assertTrue("Non primary key field caused exception", exceptionThrown);
110 }
111
112 /**
113 * Tests that MetadataManager.getEntityPrimaryKeyObject correctly pulls primary keys
114 * from a BO
115 */
116 @Test
117 public void testPKObjectForEntity() {
118 ParameterTypeBo parameterType = KRADServiceLocator.getBusinessObjectService().findBySinglePrimaryKey(ParameterTypeBo.class, "CONFG");
119 assertNotNull("ParameterType should not be null", parameterType);
120
121 Object pkValue = MetadataManager.getEntityPrimaryKeyObject(parameterType);
122 assertEquals("Single pkValue should be of class String", String.class, pkValue.getClass());
123 assertEquals("Single pkValue should be \"CONFG\"", "CONFG", pkValue);
124
125 Parameter parameter = CoreFrameworkServiceLocator.getParameterService().getParameter("KR-NS", "Lookup", "MULTIPLE_VALUE_RESULTS_PER_PAGE");
126 assertNotNull("State should not be null", parameter);
127
128 pkValue = MetadataManager.getEntityPrimaryKeyObject(ParameterBo.from(parameter));
129 org.junit.Assert.assertEquals("Composite pkValue for Parameter should have class of ParameterId", ParameterId.class, pkValue.getClass());
130 ParameterId parameterId = (ParameterId)pkValue;
131 assertEquals("namespace code was not correctly set", "KR-NS", parameterId.getNamespaceCode());
132 assertEquals("parameter detail type code was not correctly set", "Lookup", parameterId.getComponentCode());
133 assertEquals("parameter name was not correctly set", "MULTIPLE_VALUE_RESULTS_PER_PAGE", parameterId.getName());
134 assertEquals("parameterApplicationNamespaceCode was not correctly set", "KUALI", parameterId.getApplicationId());
135 }
136
137 /**
138 * Tests that MetadataManager.getPersistableBusinessObjectPrimaryKeyObjectWithValuesForExtension works
139 */
140 @Test
141 public void testPKObjectForExtension() {
142 final Account account = KRADServiceLocator.getBusinessObjectService().findBySinglePrimaryKey(Account.class, "b101");
143 assertNotNull("Account should not be null", account);
144 final AccountExtension accountExtension = (AccountExtension)account.getExtension();
145
146 final Object pkValue = MetadataManager.getPersistableBusinessObjectPrimaryKeyObjectWithValuesForExtension(account, accountExtension);
147 assertEquals("Single pkValue should be of class String", String.class, pkValue.getClass());
148 assertEquals("Single pkValue should be \"b101\"", "b101", pkValue);
149 }
150 }