diff --git a/workflow/engine/methods/processes/processes_Export.php b/workflow/engine/methods/processes/processes_Export.php index a7bfabcd9..5c5993eaf 100755 --- a/workflow/engine/methods/processes/processes_Export.php +++ b/workflow/engine/methods/processes/processes_Export.php @@ -30,7 +30,7 @@ try { $exporter = new ProcessMaker\Exporter\XmlExporter($_GET["pro_uid"]); $version = ProcessMaker\Util\Common::getLastVersion($outputDir . $exporter->getProjectName() . "-*.pmx") + 1; - $outputFilename = sprintf("%s-%s.%s", $exporter->getProjectName(), $version, "pmx"); + $outputFilename = sprintf("%s-%s.%s", str_replace(" ", "_", $exporter->getProjectName()), $version, "pmx"); $exporter->saveExport($outputDir . $outputFilename); } else { $oProcess = new Processes(); @@ -134,3 +134,4 @@ echo json_encode($response); // $G_PUBLISH->AddContent( 'xmlform', 'xmlform', 'login/showMessage', '', $aMessage ); // G::RenderPage( 'publish', 'raw' ); //} + diff --git a/workflow/engine/src/ProcessMaker/Importer/Importer.php b/workflow/engine/src/ProcessMaker/Importer/Importer.php index b390234fc..5bfeafde0 100644 --- a/workflow/engine/src/ProcessMaker/Importer/Importer.php +++ b/workflow/engine/src/ProcessMaker/Importer/Importer.php @@ -401,7 +401,7 @@ abstract class Importer $arrayFieldNameForException = $arrayFieldName; if (isset($_FILES[$arrayFieldName["projectFile"]])) { - $_FILES["filepmx"] = $_FILES[$arrayFieldName["projectFile"]]; + $_FILES["filePmx"] = $_FILES[$arrayFieldName["projectFile"]]; } if (isset($arrayData[$arrayFieldName["projectFile"]]) && @@ -418,7 +418,6 @@ abstract class Importer $process = new \ProcessMaker\BusinessModel\Process(); $validator = new \ProcessMaker\BusinessModel\Validator(); - $validator->throwExceptionIfDataIsNotArray($arrayData, "\$arrayData"); $validator->throwExceptionIfDataIsEmpty($arrayData, "\$arrayData"); $process->throwExceptionIfDataNotMetFieldDefinition($arrayData, $arrayFieldDefinition, $arrayFieldNameForException, true); @@ -433,7 +432,7 @@ abstract class Importer } } - if ((isset($_FILES["filepmx"]) && pathinfo($_FILES["filepmx"]["name"], PATHINFO_EXTENSION) != "pmx") || + if ((isset($_FILES["filePmx"]) && pathinfo($_FILES["filePmx"]["name"], PATHINFO_EXTENSION) != "pmx") || (isset($arrayData[$arrayFieldName["projectFile"]]) && pathinfo($arrayData[$arrayFieldName["projectFile"]], PATHINFO_EXTENSION) != "pmx") ) { throw (new \Exception("The file extension not is \"pmx\"")); @@ -456,12 +455,13 @@ abstract class Importer $option = $opt; - if (isset($_FILES["filepmx"])) { - $this->setSaveDir(PATH_DOCUMENT . "input"); - $this->setSourceFromGlobals("filepmx"); + if (isset($_FILES["filePmx"])) { + $this->setSourceFromGlobals("filePmx"); } else { - if (isset($arrayData[$arrayFieldName["projectFile"]]) && file_exists(PATH_DOCUMENT . "input" . PATH_SEP . $arrayData[$arrayFieldName["projectFile"]])) { - $this->setSourceFile(PATH_DOCUMENT . "input" . PATH_SEP . $arrayData[$arrayFieldName["projectFile"]]); + $filePmx = rtrim($this->getSaveDir(), PATH_SEP) . PATH_SEP . $arrayData[$arrayFieldName["projectFile"]]; + + if (isset($arrayData[$arrayFieldName["projectFile"]]) && file_exists($filePmx)) { + $this->setSourceFile($filePmx); } else { throw (new \Exception(str_replace(array("{0}", "{1}"), array($arrayFieldNameForException["projectFile"], $arrayData[$arrayFieldName["projectFile"]]), "The file with {0}: \"{1}\" does not exist."))); } diff --git a/workflow/engine/src/ProcessMaker/Services/Api/Project.php b/workflow/engine/src/ProcessMaker/Services/Api/Project.php index 685222964..eae11b29e 100644 --- a/workflow/engine/src/ProcessMaker/Services/Api/Project.php +++ b/workflow/engine/src/ProcessMaker/Services/Api/Project.php @@ -133,6 +133,7 @@ class Project extends Api try { $importer = new \ProcessMaker\Importer\XmlImporter(); + $importer->setSaveDir(PATH_DOCUMENT . "input"); $importer->setData("usr_uid", $this->getUserId()); $arrayData = $importer->importPostFile($request_data, $option, array("projectFile" => "project_file", "option" => "option")); diff --git a/workflow/engine/src/Tests/ProcessMaker/Exporter/XmlExporterTest.php b/workflow/engine/src/Tests/ProcessMaker/Exporter/XmlExporterTest.php index 2abb95c62..0f05168de 100644 --- a/workflow/engine/src/Tests/ProcessMaker/Exporter/XmlExporterTest.php +++ b/workflow/engine/src/Tests/ProcessMaker/Exporter/XmlExporterTest.php @@ -15,8 +15,7 @@ class XmlExporterTest extends \PHPUnit_Framework_TestCase { protected static $exporter; protected static $projectUid = ""; - protected static $projectName = ""; - protected static $fileXml = ""; + protected static $filePmx = ""; /** * Set class for test @@ -25,11 +24,9 @@ class XmlExporterTest extends \PHPUnit_Framework_TestCase */ public static function setUpBeforeClass() { - self::$projectName = \ProcessMaker\Util\Common::generateUID(); - $json = " { - \"prj_name\": \"" . self::$projectName . "\", + \"prj_name\": \"" . \ProcessMaker\Util\Common::generateUID() . "\", \"prj_author\": \"00000000000000000000000000000001\", \"diagrams\": [ { @@ -49,7 +46,7 @@ class XmlExporterTest extends \PHPUnit_Framework_TestCase $arrayResult = \ProcessMaker\Project\Adapter\BpmnWorkflow::createFromStruct(json_decode($json, true)); self::$projectUid = $arrayResult[0]["new_uid"]; - self::$fileXml = PATH_DOCUMENT . "output" . PATH_SEP . self::$projectUid . ".xml"; + self::$filePmx = PATH_DOCUMENT . "output" . PATH_SEP . self::$projectUid . ".pmx"; self::$exporter = new \ProcessMaker\Exporter\XmlExporter(self::$projectUid); } @@ -62,10 +59,9 @@ class XmlExporterTest extends \PHPUnit_Framework_TestCase public static function tearDownAfterClass() { $bpmnWf = \ProcessMaker\Project\Adapter\BpmnWorkflow::load(self::$projectUid); - $bpmnWf->remove(); - unlink(self::$fileXml); + unlink(self::$filePmx); } /** @@ -127,7 +123,7 @@ class XmlExporterTest extends \PHPUnit_Framework_TestCase $node = $value; if ($node->hasAttribute("class")) { - $this->assertTrue(in_array($node->getAttribute("class"), array("BPMN", "workflow"))); + $this->assertContains($node->getAttribute("class"), array("BPMN", "workflow")); } } } @@ -139,9 +135,9 @@ class XmlExporterTest extends \PHPUnit_Framework_TestCase */ public function testSaveExport() { - self::$exporter->saveExport(self::$fileXml); + self::$exporter->saveExport(self::$filePmx); - $this->assertTrue(file_exists(self::$fileXml)); + $this->assertTrue(file_exists(self::$filePmx)); } /** diff --git a/workflow/engine/src/Tests/ProcessMaker/Importer/XmlImporterTest.php b/workflow/engine/src/Tests/ProcessMaker/Importer/XmlImporterTest.php new file mode 100644 index 000000000..9b54a5a10 --- /dev/null +++ b/workflow/engine/src/Tests/ProcessMaker/Importer/XmlImporterTest.php @@ -0,0 +1,216 @@ +saveExport(self::$filePmx); + + $bpmnWf = \ProcessMaker\Project\Adapter\BpmnWorkflow::load(self::$projectUid); + $bpmnWf->remove(); + + self::$importer = new \ProcessMaker\Importer\XmlImporter(); + self::$importer->setSourceFile(self::$filePmx); + } + + /** + * Delete projects + * + * @coversNothing + */ + public static function tearDownAfterClass() + { + foreach (self::$arrayPrjUid as $value) { + $prjUid = $value; + + $bpmnWf = \ProcessMaker\Project\Adapter\BpmnWorkflow::load($prjUid); + $bpmnWf->remove(); + } + + unlink(self::$filePmx); + } + + /** + * Test load + * + * @covers \ProcessMaker\Importer\XmlImporter::load + */ + public function testLoad() + { + $arrayData = self::$importer->load(); + + $this->assertTrue(is_array($arrayData)); + $this->assertNotEmpty($arrayData); + + $this->assertArrayHasKey("tables", $arrayData); + $this->assertArrayHasKey("files", $arrayData); + + $this->assertEquals($arrayData["tables"]["bpmn"]["project"][0]["prj_uid"], self::$projectUid); + $this->assertEquals($arrayData["tables"]["workflow"]["process"][0]["PRO_UID"], self::$projectUid); + } + + /** + * Test getTextNode + * + * @covers \ProcessMaker\Importer\XmlImporter::getTextNode + */ + public function testGetTextNode() + { + //Is not implemented. Method getTextNode() is private + } + + /** + * Test import + * + * @covers \ProcessMaker\Importer\XmlImporter::import + */ + public function testImport() + { + $prjUid = self::$importer->import(); + self::$arrayPrjUid[] = $prjUid; + + $this->assertNotNull(\BpmnProjectPeer::retrieveByPK($prjUid)); + } + + /** + * Test importPostFile + * + * @covers \ProcessMaker\Importer\XmlImporter::importPostFile + */ + public function testImportPostFile() + { + self::$importer->setSaveDir(PATH_DOCUMENT . "input"); + + $arrayData = self::$importer->importPostFile(array("PROJECT_FILE" => self::$projectUid . ".pmx"), "KEEP"); + self::$arrayPrjUid[] = $arrayData["PRJ_UID"]; + + $this->assertNotNull(\BpmnProjectPeer::retrieveByPK($arrayData["PRJ_UID"])); + } + + /** + * Test exception when the project exists + * + * @covers \ProcessMaker\Importer\XmlImporter::import + * + * @expectedException Exception + * @expectedExceptionMessage Project already exists, you need set an action to continue. Available actions: [project.import.create_new|project.import.override|project.import.disable_and_create_new|project.import.keep_without_changing_and_create_new]. + */ + public function testImportExceptionProjectExists() + { + $prjUid = self::$importer->import(); + } + + /** + * Test exception for empty data + * + * @covers \ProcessMaker\Importer\XmlImporter::importPostFile + * + * @expectedException Exception + * @expectedExceptionMessage Invalid value for "$arrayData", it can not be empty. + */ + public function testImportPostFileExceptionEmptyData() + { + $arrayData = self::$importer->importPostFile(array()); + } + + /** + * Test exception for invalid extension + * + * @covers \ProcessMaker\Importer\XmlImporter::importPostFile + * + * @expectedException Exception + * @expectedExceptionMessage The file extension not is "pmx" + */ + public function testImportPostFileExceptionInvalidExtension() + { + $arrayData = self::$importer->importPostFile(array("PROJECT_FILE" => "file.pm")); + } + + /** + * Test exception for file does not exist + * + * @covers \ProcessMaker\Importer\XmlImporter::importPostFile + * + * @expectedException Exception + * @expectedExceptionMessage The file with PROJECT_FILE: "file.pmx" does not exist. + */ + public function testImportPostFileExceptionFileNotExists() + { + $arrayData = self::$importer->importPostFile(array("PROJECT_FILE" => "file.pmx")); + } + + /** + * Test exception for invalid option + * + * @covers \ProcessMaker\Importer\XmlImporter::importPostFile + * + * @expectedException Exception + * @expectedExceptionMessage Invalid value for "OPTION", it only accepts values: "CREATE|OVERWRITE|DISABLE|KEEP". + */ + public function testImportPostFileExceptionInvalidOption() + { + $arrayData = self::$importer->importPostFile(array("PROJECT_FILE" => "file.pmx"), "CREATED"); + } + + /** + * Test exception when the project exists + * + * @covers \ProcessMaker\Importer\XmlImporter::importPostFile + * + * @expectedException Exception + * @expectedExceptionMessage Project already exists, you need set an action to continue. Available actions: [CREATE|OVERWRITE|DISABLE|KEEP]. + */ + public function testImportPostFileExceptionProjectExists() + { + self::$importer->setSaveDir(PATH_DOCUMENT . "input"); + + $arrayData = self::$importer->importPostFile(array("PROJECT_FILE" => self::$projectUid . ".pmx")); + } +} +