001/*
002 * Copyright 2006-2012 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
017package org.kuali.test;
018
019import org.junit.Assert;
020import org.junit.Before;
021import org.junit.Test;
022import org.kuali.rice.kew.api.exception.WorkflowException;
023import org.kuali.rice.krad.UserSession;
024import org.kuali.rice.krad.maintenance.MaintenanceDocument;
025import org.kuali.rice.krad.service.KRADServiceLocatorWeb;
026import org.kuali.rice.krad.util.GlobalVariables;
027import org.kuali.rice.krad.util.KRADConstants;
028import org.kuali.test.KRADTestCase;
029
030import static org.junit.Assert.assertEquals;
031
032public abstract class BaseMaintenanceDocumentTest extends KRADTestCase {
033    private MaintenanceDocument document;
034    private String documentTypeName;
035    private String initiatorPrincipalName;
036
037    @Override
038    public void setUp() throws Exception {
039        super.setUp();
040        GlobalVariables.setUserSession(new UserSession(getInitiatorPrincipalName()));
041        MaintenanceDocument maintenanceDocument =
042                (MaintenanceDocument) KRADServiceLocatorWeb.getDocumentService().getNewDocument(getDocumentTypeName());
043        maintenanceDocument.getDocumentHeader().setDocumentDescription("test maintenance document");
044        setDocument(maintenanceDocument);
045    }
046
047    @Before
048    public void setUpBeforeTest() {
049        GlobalVariables.getMessageMap().clearErrorMessages();
050    }
051
052    /**
053     * Override this method to provide different value
054     *
055     * @return the document type name to use
056     */
057    protected String getDocumentTypeName() {
058        return documentTypeName;
059    }
060
061    /**
062     * Override this method to provide different initiator
063     *
064     * @return the principal name to use as the initiator for the specified document type
065     */
066    protected String getInitiatorPrincipalName() {
067        return initiatorPrincipalName;
068    }
069
070    protected void setupNewAccountMaintDoc(MaintenanceDocument document) {
071
072        Object am = getNewMaintainableObject();
073
074        document.getOldMaintainableObject().setDataObject(null);
075        document.getOldMaintainableObject().setDataObjectClass(am.getClass());
076        document.getNewMaintainableObject().setDataObject(am);
077        document.getNewMaintainableObject().setDataObjectClass(am.getClass());
078
079        document.getNewMaintainableObject().setMaintenanceAction(KRADConstants.MAINTENANCE_NEW_ACTION);
080    }
081
082    /**
083     *
084     * @return an object to set as the new maintainable object
085     */
086    protected abstract Object getNewMaintainableObject();
087
088    /**
089     *
090     * @return an object to set as the old maintainable object
091     */
092    protected abstract Object getOldMaintainableObject();
093
094    /**
095     * populate maintenance document with objects for editing
096     *
097     * @param document - the maintenance document being tested
098     */
099    protected void setupEditAccountMaintDoc(MaintenanceDocument document) {
100
101        Object newAm = getNewMaintainableObject();
102        Object oldAm = getOldMaintainableObject();
103
104        document.getOldMaintainableObject().setDataObject(oldAm);
105        document.getOldMaintainableObject().setDataObjectClass(oldAm.getClass());
106        document.getNewMaintainableObject().setDataObject(newAm);
107        document.getNewMaintainableObject().setDataObjectClass(newAm.getClass());
108
109        document.getNewMaintainableObject().setMaintenanceAction(KRADConstants.MAINTENANCE_EDIT_ACTION);
110    }
111
112    @Test
113    /**
114     * test creating a new maintenance document
115     */
116    public void test_NewDoc() {
117
118        setupNewAccountMaintDoc(getDocument());
119
120        Assert.assertEquals("Document should indicate New.", true, getDocument().isNew());
121        Assert.assertEquals("Document should not indicate Edit.", false, getDocument().isEdit());
122        Assert.assertEquals("Old BO should not be present.", false, getDocument().isOldDataObjectInDocument());
123    }
124
125    @Test
126    /**
127     * test editing
128     */
129    public void test_EditDoc() {
130
131        setupEditAccountMaintDoc(getDocument());
132
133        Assert.assertEquals("Document should not indicate New.", false, getDocument().isNew());
134        Assert.assertEquals("Document should indicate Edit.", true, getDocument().isEdit());
135        Assert.assertEquals("Old BO should be present.", true, getDocument().isOldDataObjectInDocument());
136
137    }
138
139    @Test
140    /**
141     * test copying
142     */
143    public void test_CopyDoc() {
144
145        setupEditAccountMaintDoc(getDocument());
146        getDocument().getNewMaintainableObject().setMaintenanceAction(KRADConstants.MAINTENANCE_COPY_ACTION);
147
148        Assert.assertEquals("Document should indicate New.", true, getDocument().isNew());
149        Assert.assertEquals("Document should not indicate Edit.", false, getDocument().isEdit());
150        Assert.assertEquals("Old BO should be present.", true, getDocument().isOldDataObjectInDocument());
151
152    }
153
154    @Test
155    /**
156     * test saving
157     */
158    public void test_SaveNewDoc() throws WorkflowException {
159        setupNewAccountMaintDoc(getDocument());
160        KRADServiceLocatorWeb.getDocumentService().saveDocument(getDocument());
161        Assert.assertTrue(getDocument().getDocumentHeader().getWorkflowDocument().isSaved());
162    }
163
164    public MaintenanceDocument getDocument() {
165        return document;
166    }
167
168    public void setDocument(MaintenanceDocument document) {
169        this.document = document;
170    }
171}