package ee.telekom.workflow.core.archive;
import java.util.Collections;
import java.util.Date;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import ee.telekom.workflow.TestApplicationContexts;
import ee.telekom.workflow.core.common.WorkflowEngineConfiguration;
import ee.telekom.workflow.core.node.NodeService;
import ee.telekom.workflow.core.workflowinstance.WorkflowInstance;
import ee.telekom.workflow.core.workflowinstance.WorkflowInstanceService;
import ee.telekom.workflow.core.workitem.WorkItem;
import ee.telekom.workflow.core.workitem.WorkItemDao;
import ee.telekom.workflow.executor.GraphEngineFactory;
import ee.telekom.workflow.executor.WorkflowExecutor;
import ee.telekom.workflow.graph.Graph;
import ee.telekom.workflow.graph.GraphFactory;
import ee.telekom.workflow.graph.GraphRepository;
import ee.telekom.workflow.graph.WorkItemStatus;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = TestApplicationContexts.DEFAULT)
@DirtiesContext
public class ArchiveIT extends TestApplicationContexts{
@Autowired
private WorkflowInstanceService woinService;
@Autowired
private WorkItemDao woitDao;
@Autowired
private ArchiveDao archiveDao;
@Autowired
private GraphEngineFactory engineFactory;
@Autowired
private WorkflowExecutor executor;
@Autowired
private NodeService nodeService;
@Autowired
private WorkflowEngineConfiguration config;
@Test
public void test_1(){
WorkflowInstance woin = woinService.create( "a", 1, null, "label1", "label2" );
long woinRefNum = woin.getRefNum();
WorkItem woit = createWoit( woinRefNum );
woitDao.create( Collections.singletonList( woit ) );
archiveDao.archive( woinRefNum );
Assert.assertNull( woinService.find( woinRefNum ) );
Assert.assertTrue( woitDao.findByWoinRefNum( woinRefNum ).isEmpty() );
assertWoin( woin );
assertWoit( woit );
}
@Test
public void test_2(){
Graph graph = GraphFactory.INSTANCE.timer_one();
GraphRepository repo = engineFactory.getSingletonInstance().getRepository();
repo.addGraph( graph );
String name = graph.getName();
Integer version = graph.getVersion();
long woinRefNum = woinService.create( name, version, Collections.singletonMap( "super", (Object)"man" ), "LABEL1", "LABEL2" ).getRefNum();
executor.startWorkflow( woinRefNum );
WorkflowInstance woin = woinService.find( woinRefNum );
WorkItem woit = woitDao.findByWoinRefNum( woinRefNum ).get( 0 );
archiveDao.archive( woinRefNum );
Assert.assertNull( woinService.find( woinRefNum ) );
Assert.assertTrue( woitDao.findByWoinRefNum( woinRefNum ).isEmpty() );
assertWoin( woin );
assertWoit( woit );
}
private void assertWoin( WorkflowInstance expected ){
WorkflowInstance actual = archiveDao.findWoinByRefNum( expected.getRefNum() );
Assert.assertEquals( expected.getRefNum(), actual.getRefNum() );
Assert.assertEquals( expected.getWorkflowName(), actual.getWorkflowName() );
Assert.assertEquals( expected.getWorkflowVersion(), actual.getWorkflowVersion() );
Assert.assertEquals( expected.getAttributes(), actual.getAttributes() );
Assert.assertEquals( expected.getState(), actual.getState() );
Assert.assertEquals( expected.getHistory(), actual.getHistory() );
Assert.assertEquals( expected.getLabel1(), actual.getLabel1() );
Assert.assertEquals( expected.getLabel2(), actual.getLabel2() );
Assert.assertEquals( expected.getStatus(), actual.getStatus() );
Assert.assertEquals( expected.getClusterName(), actual.getClusterName() );
Assert.assertEquals( expected.getNodeName(), actual.getNodeName() );
Assert.assertEquals( expected.isLocked(), actual.isLocked() );
}
protected void assertWoit( WorkItem expected ){
WorkItem actual = archiveDao.findWoitByRefNum( expected.getRefNum() );
Assert.assertEquals( expected.getRefNum(), actual.getRefNum() );
Assert.assertEquals( expected.getWoinRefNum(), actual.getWoinRefNum() );
Assert.assertEquals( expected.getTokenId(), actual.getTokenId() );
Assert.assertEquals( expected.getStatus(), actual.getStatus() );
Assert.assertEquals( expected.getSignal(), actual.getSignal() );
Assert.assertEquals( expected.getDueDate(), actual.getDueDate() );
Assert.assertEquals( expected.getBean(), actual.getBean() );
Assert.assertEquals( expected.getMethod(), actual.getMethod() );
Assert.assertEquals( expected.getRole(), actual.getRole() );
Assert.assertEquals( expected.getUserName(), actual.getUserName() );
Assert.assertEquals( expected.getArguments(), actual.getArguments() );
Assert.assertEquals( expected.getResult(), actual.getResult() );
}
private WorkItem createWoit( long woinRefNum ){
WorkItem woit = new WorkItem();
woit.setWoinRefNum( woinRefNum );
woit.setTokenId( 1 );
woit.setStatus( WorkItemStatus.NEW );
woit.setSignal( "signal" );
woit.setDueDate( new Date() );
woit.setBean( "bean" );
woit.setMethod( "method" );
woit.setRole( "role" );
woit.setUserName( "userName" );
woit.setArguments( "test-argumetns" );
woit.setResult( "test-result" );
return woit;
}
@Before
public void prepareTest(){
nodeService.findOrCreateByName( config.getNodeName() );
}
}