Source of file WorkflowImportExportTest.php
Size: 9,197 Bytes - Last Modified: 2021-12-23T10:27:27+00:00
/var/www/docs.ssmods.com/process/src/tests/WorkflowImportExportTest.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266 | <?php namespace Symbiote\AdvancedWorkflow\Tests; use SilverStripe\Core\Injector\Injector; use SilverStripe\Dev\SapphireTest; use SilverStripe\Security\Member; use SilverStripe\View\ArrayData; use Symbiote\AdvancedWorkflow\Admin\WorkflowDefinitionExporter; use Symbiote\AdvancedWorkflow\Admin\WorkflowDefinitionImporter; use Symbiote\AdvancedWorkflow\DataObjects\ImportedWorkflowTemplate; use Symbiote\AdvancedWorkflow\DataObjects\WorkflowAction; use Symbiote\AdvancedWorkflow\DataObjects\WorkflowDefinition; use Symbiote\AdvancedWorkflow\DataObjects\WorkflowTransition; use Symbiote\AdvancedWorkflow\Templates\WorkflowTemplate; use SilverStripe\ORM\ValidationException; /** * Tests for workflow import/export logic. * * @author russell@silverstripe.com * @license BSD License (http://silverstripe.org/bsd-license/) * @package advancedworkflow * @subpackage tests */ class WorkflowImportExportTest extends SapphireTest { protected static $fixture_file = 'workflowtemplateimport.yml'; /** * Utility method, used in tests * @return WorkflowDefinition */ protected function createDefinition() { $definition = new WorkflowDefinition(); $definition->Title = "Dummy Workflow Definition"; $definition->write(); $stepOne = new WorkflowAction(); $stepOne->Title = "Step One"; $stepOne->WorkflowDefID = $definition->ID; $stepOne->write(); $stepTwo = new WorkflowAction(); $stepTwo->Title = "Step Two"; $stepTwo->WorkflowDefID = $definition->ID; $stepTwo->write(); $transitionOne = new WorkflowTransition(); $transitionOne->Title = 'Step One T1'; $transitionOne->ActionID = $stepOne->ID; $transitionOne->NextActionID = $stepTwo->ID; $transitionOne->write(); return $definition; } /** * Create a WorkflowDefinition with some actions. Ensure an expected length of formatted template. */ public function testFormatWithActions() { $definition = $this->createDefinition(); $exporter = Injector::inst()->createWithArgs(WorkflowDefinitionExporter::class, array($definition->ID)); $member = new Member(); $member->FirstName = 'joe'; $member->Surname = 'bloggs'; $exporter->setMember($member); $templateData = new ArrayData(array( 'ExportMetaData' => $exporter->ExportMetaData(), 'ExportActions' => $exporter->getDefinition()->Actions() )); $formatted = $exporter->format($templateData); $numActions = count(preg_split("#\R#", $formatted)); $this->assertNotEmpty($formatted); // Seems arbitrary, but if no actions, then the resulting YAML file is exactly 18 lines long $this->assertGreaterThan(18, $numActions); } /** * Create a WorkflowDefinition with NO actions. Ensure an expected length of formatted template. */ public function testFormatWithoutActions() { $definition = $this->createDefinition(); $exporter = Injector::inst()->createWithArgs(WorkflowDefinitionExporter::class, array($definition->ID)); $member = new Member(); $member->FirstName = 'joe'; $member->Surname = 'bloggs'; $exporter->setMember($member); $templateData = new ArrayData(array()); $formatted = $exporter->format($templateData); $numActions = count(preg_split("#\R#", $formatted)); // Seems arbitrary, but if no actions, then the resulting YAML file is exactly 19 lines long $this->assertEquals(19, $numActions); // Ensure outputted YAML has no blank lines, where SS's control structures would normally be $numBlanks = preg_match("#^\s*$#m", $formatted); $this->assertEquals(0, $numBlanks); } /** * Tests a badly formatted YAML import for parsing (no headers) */ public function testParseBadYAMLNoHeaderImport() { $importer = new WorkflowDefinitionImporter(); $this->expectException(\Exception::class); $this->expectExceptionMessage('Invalid YAML format.'); $source = <<<'EOD' SilverStripe\Core\Injector\Injector\Injector: ExportedWorkflow: class: Symbiote\AdvancedWorkflow\Templates\WorkflowTemplate constructor: - 'My Workflow 4 20/02/2014 03-12-55' - 'Exported from localhost on 20/02/2014 03:12:55 by joe bloggs using SilverStripe versions Framework 4.0.0-beta3' - 0.2 - 0 - 3 properties: structure: 'Step One': type: Symbiote\AdvancedWorkflow\DataObjects\WorkflowAction transitions: - Step One T1: 'Step Two' 'Step Two': type: Symbiote\AdvancedWorkflow\DataObjects\WorkflowAction Symbiote\AdvancedWorkflow\Services\WorkflowService: properties: templates: - '%$ExportedWorkflow' EOD; $importer->parseYAMLImport($source); } /** * Tests a badly formatted YAML import for parsing (missing YML colon) */ public function testParseBadYAMLMalformedImport() { $importer = new WorkflowDefinitionImporter(); $this->expectException(ValidationException::class); $this->expectExceptionMessage('Invalid YAML format. Unable to parse.'); $source = <<<'EOD' --- Name: exportedworkflow --- # Missing colon on line below SilverStripe\Core\Injector\Injector ExportedWorkflow: class: Symbiote\AdvancedWorkflow\Templates\WorkflowTemplate constructor: - 'My Workflow 4 20/02/2014 03-12-55' - 'Exported from localhost on 20/02/2014 03-12-55 by joe bloggs using SilverStripe versions Framework 4.0.0-beta3' - 0.2 - 0 - 3 properties: structure: 'Step One' type: Symbiote\AdvancedWorkflow\DataObjects\WorkflowAction transitions: - Step One T1: 'Step Two' 'Step Two': type: Symbiote\AdvancedWorkflow\DataObjects\WorkflowAction Symbiote\AdvancedWorkflow\Services\WorkflowService: properties: templates: - '%$ExportedWorkflow' EOD; $importer->parseYAMLImport($source); } /** * Tests a well-formatted YAML import for parsing */ public function testParseGoodYAMLImport() { $importer = new WorkflowDefinitionImporter(); $source = <<<'EOD' --- Name: exportedworkflow --- SilverStripe\Core\Injector\Injector: ExportedWorkflow: class: Symbiote\AdvancedWorkflow\Templates\WorkflowTemplate constructor: - 'My Workflow 4 20/02/2014 03-12-55' - 'Exported from localhost on 20/02/2014 03-12-55 by joe bloggs using SilverStripe versions Framework 4.0.0-beta3' - 0.2 - 0 - 3 properties: structure: 'Step One': type: Symbiote\AdvancedWorkflow\DataObjects\WorkflowAction transitions: - Step One T1: 'Step Two' 'Step Two': type: Symbiote\AdvancedWorkflow\DataObjects\WorkflowAction Symbiote\AdvancedWorkflow\Services\WorkflowService: properties: templates: - '%$ExportedWorkflow' EOD; $this->assertNotEmpty($importer->parseYAMLImport($source)); } /** * Given no ImportedWorkflowTemplate fixture/input data, tests an empty array is returned * by WorkflowDefinitionImporter#getImportedWorkflows() */ public function testGetImportedWorkflowsNone() { $this->clearFixtures(); $importer = new WorkflowDefinitionImporter(); $imports = $importer->getImportedWorkflows(); $this->assertEmpty($imports); } /** * Given a single ImportedWorkflowTemplate fixture/input data, tests an non-empty array is returned * by WorkflowDefinitionImporter#getImportedWorkflows() */ public function testGetImportedWorkflowsOne() { $name = 'My Workflow 21/02/2014 09-01-29'; // Pretend a ImportedWorkflowTemplate object has been created by WorkflowBulkLoader $this->objFromFixture(ImportedWorkflowTemplate::class, 'Import01'); /** @var WorkflowDefinitionImporter $importer */ $importer = singleton(WorkflowDefinitionImporter::class); $import = $importer->getImportedWorkflows($name); $this->assertNotEmpty($import); $this->assertInstanceOf(WorkflowTemplate::class, $import); $this->assertEquals($name, $import->getName()); } /** * Given many ImportedWorkflowTemplate fixture/input data, tests an non-empty array is returned * by WorkflowDefinitionImporter#getImportedWorkflows() */ public function testGetImportedWorkflowsMany() { // Pretend some ImportedWorkflowTemplate objects have been created by WorkflowBulkLoader $this->objFromFixture(ImportedWorkflowTemplate::class, 'Import02'); $this->objFromFixture(ImportedWorkflowTemplate::class, 'Import03'); $importer = singleton(WorkflowDefinitionImporter::class); $imports = $importer->getImportedWorkflows(); $this->assertNotEmpty($imports); $this->assertIsArray($imports); $this->assertGreaterThan(1, count($imports)); } } |