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.bo;
017    
018    import org.junit.Assert;
019    import org.junit.Ignore;
020    import org.junit.Test;
021    import org.kuali.rice.krad.service.KRADServiceLocator;
022    import org.kuali.rice.krad.test.document.bo.Account;
023    import org.kuali.rice.krad.test.document.bo.AccountManager;
024    import org.kuali.rice.location.impl.county.CountyBo;
025    import org.kuali.rice.location.impl.county.CountyId;
026    import org.kuali.rice.location.impl.state.StateBo;
027    import org.kuali.rice.location.impl.state.StateId;
028    import org.kuali.rice.test.BaselineTestCase;
029    import org.kuali.rice.test.data.PerTestUnitTestData;
030    import org.kuali.rice.test.data.UnitTestData;
031    import org.kuali.rice.test.data.UnitTestFile;
032    import org.kuali.rice.test.data.UnitTestSql;
033    import org.kuali.test.KRADTestCase;
034    
035    /**
036     * Tests how refreshing works for Business Objects 
037     * 
038     * @author Kuali Rice Team (rice.collab@kuali.org)
039     *
040     */
041    @PerTestUnitTestData(
042            value = @UnitTestData(
043                    order = {UnitTestData.Type.SQL_STATEMENTS, UnitTestData.Type.SQL_FILES},
044                    sqlStatements = {
045                            @UnitTestSql("delete from trv_acct where acct_fo_id between 101 and 301")
046                            ,@UnitTestSql("delete from trv_acct_fo where acct_fo_id between 101 and 301")
047                    },
048                    sqlFiles = {
049                            @UnitTestFile(filename = "classpath:testAccountManagers.sql", delimiter = ";")
050                            , @UnitTestFile(filename = "classpath:testAccounts.sql", delimiter = ";")
051                    }
052            ),
053            tearDown = @UnitTestData(
054                    sqlStatements = {
055                            @UnitTestSql("delete from trv_acct where acct_fo_id between 101 and 301")
056                            ,@UnitTestSql("delete from trv_acct_fo where acct_fo_id between 101 and 301")
057                    }
058           )
059    )
060    @BaselineTestCase.BaselineMode(BaselineTestCase.Mode.NONE)
061    public class BusinessObjectRefreshTest extends KRADTestCase {
062    
063            @Test
064            public void testLazyRefreshField() {
065                    final String accountNumber = "b101";
066                    Account account = KRADServiceLocator.getBusinessObjectService().findBySinglePrimaryKey(Account.class, accountNumber);
067                    
068                    Assert.assertEquals("Retrieved account should have name b101", "b101", account.getName());
069                    Assert.assertEquals("Retrieved account should have a account manager with user name fo-101", "fo-101", account.getAccountManager().getUserName());
070                    
071                    account.setAmId(102L);
072                    account.refreshReferenceObject("accountManager");
073                    
074                    Assert.assertEquals("Account Manager should now have user name of fo-102", "fo-102", account.getAccountManager().getUserName());
075                    
076            }
077            
078            @Test
079            public void testLazyRefreshWholeObject() {
080                    final String accountNumber = "b101";
081                    Account account = KRADServiceLocator.getBusinessObjectService().findBySinglePrimaryKey(Account.class, accountNumber);
082                    
083                    Assert.assertEquals("Retrieved account should have name b101", "b101", account.getName());
084                    Assert.assertEquals("Retrieved account should have a account manager with user name fo-101", "fo-101", account.getAccountManager().getUserName());
085                    
086                    account.setAmId(102L);
087                    account.refresh();
088                    
089                    Assert.assertEquals("Account Manager should now have user name of fo-102", "fo-102", account.getAccountManager().getUserName());
090            }
091            
092            @Ignore // until BO extensions work with JPA
093            @Test
094            public void testLazyCollectionRefresh() {
095                    final Long fredManagerId = 101L;
096                    AccountManager manager = KRADServiceLocator.getBusinessObjectService().findBySinglePrimaryKey(AccountManager.class, new Long(fredManagerId));
097                    
098                    Assert.assertEquals("Retrieve manager should have a name 'fo-101'", "fo-101", manager.getUserName());
099                    Assert.assertEquals("Manager should have one account", new Integer(101), new Integer(manager.getAccounts().size()));
100                    
101                    final String accountNumber = "b102";
102                    Account account = KRADServiceLocator.getBusinessObjectService().findBySinglePrimaryKey(Account.class, accountNumber);
103    
104                    account.setAmId(101L);
105                    account = (Account) KRADServiceLocator.getBusinessObjectService().save(account);
106                    
107                    manager.refreshReferenceObject("accounts");
108                    Assert.assertEquals("Manager should have one account", new Integer(2), new Integer(manager.getAccounts().size()));
109            }
110            
111            @Test
112            public void testEagerRefreshField() {
113                    final CountyId countyId = new CountyId("COCONINO", "US", "AZ");
114                    CountyBo county = KRADServiceLocator.getBusinessObjectService().findBySinglePrimaryKey(CountyBo.class, countyId);
115                    
116                    final StateId arizonaStateId = new StateId("US", "AZ");
117                    final StateBo arizonaState = KRADServiceLocator.getBusinessObjectService().findBySinglePrimaryKey(StateBo.class, arizonaStateId);
118                    
119                    Assert.assertEquals("On retrieval from database, state code should be AZ", arizonaState.getCode(), county.getState().getCode());
120                    Assert.assertEquals("On retrieval from database, state name should be ARIZONA", arizonaState.getName(), county.getState().getName());
121                    
122                    county.setStateCode("CA");
123                    county.setCode("VENTURA");
124                    county.refresh();
125                    
126                    final StateId californiaStateId = new StateId("US", "CA");
127                    final StateBo californiaState = KRADServiceLocator.getBusinessObjectService().findBySinglePrimaryKey(StateBo.class, californiaStateId);
128                    
129                    Assert.assertEquals("Does eager fetching automatically refresh?", californiaState.getCode(), county.getState().getCode());
130                    Assert.assertEquals("On refresh, state name should be CALIFORNIA", californiaState.getName(), county.getState().getName());
131            }
132    }