This commit is contained in:
Paula Quispe
2019-07-22 15:04:57 -04:00
86 changed files with 8179 additions and 3237 deletions

View File

@@ -13,7 +13,6 @@ class Kernel extends ConsoleKernel
* @var array
*/
protected $commands = [
Commands\PMTranslationsPlugins::class
];
/**
@@ -34,6 +33,6 @@ class Kernel extends ConsoleKernel
*/
protected function commands()
{
$this->load(__DIR__ . '/Commands');
}
}

View File

@@ -0,0 +1,22 @@
<?php
namespace App\Logging;
use Monolog\Formatter\LineFormatter;
class CustomizeFormatter
{
/**
* Customize the given logger instance.
*
* @param \Illuminate\Log\Logger $logger
* @return void
*/
public function __invoke($logger)
{
foreach ($logger->getHandlers() as $handler) {
$handler->setFormatter(new LineFormatter(null, null, true, true));
}
}
}

View File

@@ -50,17 +50,6 @@ $app->singleton(
Handler::class
);
$app->configureMonologUsing(function ($monolog) use ($app) {
$monolog->pushHandler(
(new RotatingFileHandler(
// Set the log path
$app->storagePath() . '/logs/processmaker.log',
// Set the number of daily files you want to keep
$app->make('config')->get('app.log_max_files', 5)
))->setFormatter(new LineFormatter(null, null, true, true))
);
});
/*
|--------------------------------------------------------------------------
| Return The Application

View File

@@ -80,7 +80,6 @@ return array(
'ToolBar' => ToolBar::class,
'Tree' => PmTree::class,
'triggerLibrary' => TriggerLibrary::class,
'Upgrade' => Upgrade::class,
'workspaceTools' => WorkspaceTools::class,
'wsBase' => WsBase::class,
'wsResponse' => WsResponse::class,

View File

@@ -27,8 +27,8 @@
"minimum-stability": "dev",
"prefer-stable": true,
"require": {
"php": ">=5.6",
"laravel/framework": "5.4.*",
"php": ">=7.1",
"laravel/framework": "5.7.*",
"luracast/restler": "^3.0",
"bshaffer/oauth2-server-php": "v1.0",
"colosa/pmUI": "release/3.3.1-dev",
@@ -43,19 +43,21 @@
"phpmailer/phpmailer": "5.2.27",
"pear/archive_tar": "1.4.*",
"pear/console_getopt": "1.4.*",
"TYPO3/class-alias-loader": "^1.0",
"typo3/class-alias-loader": "^1.0",
"ralouphie/getallheaders": "^2.0",
"smarty/smarty": "2.6.30",
"pdepend/pdepend": "@stable",
"chumper/zipper": "^1.0",
"php-imap/php-imap": "^3.0",
"nikic/php-parser": "3.1.5",
"laravel/tinker": "^1.0"
},
"require-dev": {
"fzaninotto/faker": "^1.7",
"guzzlehttp/guzzle": "^6.3",
"phpunit/phpunit": "~5.7",
"lmc/steward": "^2.2",
"filp/whoops": "~2.0",
"behat/behat": "^3.3",
"behat/mink-selenium2-driver": "^1.3",
"squizlabs/php_codesniffer": "^2.2 || ^3.0.2",
@@ -101,7 +103,11 @@
},
"scripts": {
"post-install-cmd": "\"vendor/bin/phpcs\" --config-set installed_paths vendor/wimg/php-compatibility",
"post-update-cmd": "\"vendor/bin/phpcs\" --config-set installed_paths vendor/wimg/php-compatibility"
"post-update-cmd": "\"vendor/bin/phpcs\" --config-set installed_paths vendor/wimg/php-compatibility",
"post-autoload-dump": [
"Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
"@php artisan package:discover"
]
},
"extra": {
"typo3/class-alias-loader": {

3563
composer.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -9,9 +9,9 @@ return [
'url' => env('APP_URL', 'http://localhost'),
'env' => env('APP_ENV', 'production'),
'debug' => env('APP_DEBUG', false),
'log' => env('APP_LOG', 'single'),
'log_level' => env('APP_LOG_LEVEL', 'debug'),
'cache_lifetime' => env('APP_CACHE_LIFETIME', 60),
'key' => env('APP_KEY', 'base64:rU28h/tElUn/eiLY0qC24jJq1rakvAFRoRl1DWxj/kM='),
'cipher' => 'AES-256-CBC',
'timezone' => 'UTC',
'providers' => [
FilesystemServiceProvider::class,
@@ -21,10 +21,13 @@ return [
Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class,
Illuminate\Queue\QueueServiceProvider::class,
Illuminate\Translation\TranslationServiceProvider::class,
Illuminate\Encryption\EncryptionServiceProvider::class,
Laravel\Tinker\TinkerServiceProvider::class,
Illuminate\Notifications\NotificationServiceProvider::class,
],
'aliases' => [
'Crypt' => Illuminate\Support\Facades\Crypt::class
],
];

85
config/logging.php Normal file
View File

@@ -0,0 +1,85 @@
<?php
use Monolog\Handler\StreamHandler;
return [
/*
|--------------------------------------------------------------------------
| Default Log Channel
|--------------------------------------------------------------------------
|
| This option defines the default log channel that gets used when writing
| messages to the logs. The name specified in this option should match
| one of the channels defined in the "channels" configuration array.
|
*/
'default' => env('APP_LOG', env('LOG_CHANNEL', 'daily')),
/*
|--------------------------------------------------------------------------
| Log Channels
|--------------------------------------------------------------------------
|
| Here you may configure the log channels for your application. Out of
| the box, Laravel uses the Monolog PHP logging library. This gives
| you a variety of powerful log handlers / formatters to utilize.
|
| Available Drivers: "single", "daily", "slack", "syslog",
| "errorlog", "monolog",
| "custom", "stack"
|
*/
'channels' => [
'stack' => [
'driver' => 'stack',
'channels' => ['single'],
],
'single' => [
'driver' => 'single',
'path' => storage_path('logs/processmaker.log'),
'level' => 'debug',
],
'daily' => [
'driver' => 'daily',
'tap' => [
App\Logging\CustomizeFormatter::class
],
'path' => storage_path('logs/processmaker.log'),
'level' => env('APP_LOG_LEVEL', 'debug'),
'days' => $app->make('config')->get('app.log_max_files', 5),
],
'slack' => [
'driver' => 'slack',
'url' => env('LOG_SLACK_WEBHOOK_URL'),
'username' => 'Laravel Log',
'emoji' => ':boom:',
'level' => 'critical',
],
'stderr' => [
'driver' => 'monolog',
'handler' => StreamHandler::class,
'with' => [
'stream' => 'php://stderr',
],
],
'syslog' => [
'driver' => 'syslog',
'level' => 'debug',
],
'errorlog' => [
'driver' => 'errorlog',
'level' => 'debug',
],
],
];

View File

@@ -0,0 +1,21 @@
<?php
use Faker\Generator as Faker;
use ProcessMaker\Model\ProcessVariables;
$factory->define(ProcessVariables::class, function (Faker $faker) {
return [
'VAR_UID' => G::generateUniqueID(),
'PRJ_UID' => G::generateUniqueID(),
'VAR_NAME' => $faker->word,
'VAR_FIELD_TYPE' => G::generateUniqueID(),
'VAR_FIELD_SIZE' => 10,
'VAR_LABEL' => 'string',
'VAR_DBCONNECTION' => 'workflow',
'VAR_SQL' => '',
'VAR_NULL' => 0,
'VAR_DEFAULT' => '',
'VAR_ACCEPTED_VALUES' => '',
'INP_DOC_UID' => ''
];
});

View File

@@ -0,0 +1,16 @@
<?php
use Faker\Generator as Faker;
use ProcessMaker\Model\Triggers;
$factory->define(Triggers::class, function (Faker $faker) {
return [
'TRI_UID' => G::generateUniqueID(),
'TRI_TITLE' => $faker->sentence(5),
'TRI_DESCRIPTION' => $faker->text,
'PRO_UID' => G::generateUniqueID(),
'TRI_TYPE' => 'SCRIPT',
'TRI_WEBBOT' => $faker->text,
'TRI_PARAM' => '',
];
});

View File

@@ -519,13 +519,15 @@ class database extends database_base
}
/**
* execute a sql query
* Execute a sql query
*
* @param string $query
* @param bool $throwError
*
* @return array
* @throws Exception
*/
public function executeQuery($query)
public function executeQuery($query, $throwError = false)
{
$this->logQuery($query);
@@ -545,7 +547,11 @@ class database extends database_base
return $result;
} catch (Exception $exception) {
$this->logQuery($exception->getMessage());
return [];
if ($throwError) {
throw $exception;
} else {
return [];
}
}
}
@@ -1012,4 +1018,87 @@ class database extends database_base
}
return $flag;
}
/**
* Generate drop trigger SQL
*
* @param string $triggerName
*
* @return string
*/
public function getDropTrigger($triggerName)
{
return "DROP TRIGGER IF EXISTS `{$triggerName}`;";
}
/**
* Generate alter table with or without adding the indexes
*
* @param string $tableName
* @param array $columns
* @param array $indexes
*
* @return string
*/
public function generateAddColumnsSql($tableName, $columns, $indexes = [])
{
$indexesAlreadyAdded = [];
$sql = 'ALTER TABLE ' . $this->sQuoteCharacter . $tableName . $this->sQuoteCharacter . ' ';
foreach ($columns as $columnName => $parameters) {
if (isset($parameters['Type']) && isset($parameters['Null'])) {
$sql .= 'ADD COLUMN ' . $this->sQuoteCharacter . $columnName . $this->sQuoteCharacter . ' ' . $parameters['Type'];
if ($parameters['Null'] == 'YES') {
$sql .= ' NULL';
} else {
$sql .= ' NOT NULL';
}
}
if (isset($parameters['AutoIncrement']) && $parameters['AutoIncrement']) {
$sql .= ' AUTO_INCREMENT';
}
if (isset($parameters['PrimaryKey']) && $parameters['PrimaryKey']) {
$sql .= ' PRIMARY KEY';
$indexesAlreadyAdded[] = $columnName;
}
if (isset($parameters['Unique']) && $parameters['Unique']) {
$sql .= ' UNIQUE';
}
// We need to check the property AI
if (isset($parameters['AI'])) {
if ($parameters['AI'] == 1) {
$sql .= ' AUTO_INCREMENT';
} else {
if ($parameters['Default'] != '') {
$sql .= " DEFAULT '" . $parameters['Default'] . "'";
}
}
} else {
if (isset($parameters['Default'])) {
$sql .= " DEFAULT '" . $parameters['Default'] . "'";
}
}
$sql .= ', ';
}
foreach ($indexes as $indexName => $indexColumns) {
$indexType = 'INDEX';
if ($indexName === 'primaryKey' || $indexName === 'PRIMARY') {
$indexType = 'PRIMARY';
$indexName = 'KEY';
// If is primary key is not needed add a new index, the column already was added like primary key
if (count($indexColumns) == 1 && $indexesAlreadyAdded == $indexColumns) {
continue;
}
}
$sql .= 'ADD ' . $indexType . ' ' . $indexName . ' (';
foreach ($indexColumns as $column) {
$sql .= $this->sQuoteCharacter . $column . $this->sQuoteCharacter . ', ';
}
$sql = substr($sql, 0, -2);
$sql .= '), ';
}
$sql = rtrim($sql, ', ');
return $sql;
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -15,7 +15,7 @@
<directory>./tests/workflow/engine/src/</directory>
</testsuite>
<testsuite name="Unit">
<directory suffix="Test.php">./tests/Unit</directory>
<directory suffix="Test.php">./tests/unit</directory>
</testsuite>
<testsuite name="Performance">
<directory>./tests/Performance/</directory>

View File

@@ -1,43 +1,56 @@
<?php
namespace Tests\Feature;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use Illuminate\Queue\Console\WorkCommand;
use Illuminate\Support\Facades\DB;
use ProcessMaker\Model\DbSource;
use ProcessMaker\Model\Process;
use Tests\TestCase;
use Propel;
use DbConnections;
class DBQueryTest extends TestCase
{
use DatabaseTransactions;
/**
* A basic cache example.
*
* @return void
* Sets up the unit tests.
*/
protected function setUp()
{
}
/**
* Verify the execution of a common SQL statement.
* @test
*/
public function testStandardExecuteQuery()
{
$results = executeQuery("SELECT * FROM USERS WHERE USR_UID = '00000000000000000000000000000001'");
$this->assertCount(1, $results);
// Note, we check index 1 because results from executeQuery are 1 indexed, not 0 indexed.
$this->assertArraySubset([
$expected = [
'USR_UID' => '00000000000000000000000000000001',
'USR_USERNAME' => 'admin'
], $results[1]);
];
$this->assertArraySubset($expected, $results[1]);
}
/**
* Verify the existence of the admin user.
* @test
*/
public function testDBFacadeQuery()
{
$record = DB::table('USERS')->where([
'USR_UID' => '00000000000000000000000000000001'
])->first();
$record = DB::table('USERS')->where('USR_UID', '=', '00000000000000000000000000000001')->first();
$this->assertEquals('admin', $record->USR_USERNAME);
}
/**
* Verify the execution of a SQL statement common to an MySQL external database.
* @test
*/
public function testStandardExecuteQueryWithExternalMySQLDatabase()
{
// Our test external database is created in our tests/bootstrap.php file
@@ -45,12 +58,12 @@ class DBQueryTest extends TestCase
$process = factory(Process::class)->create();
// Let's create an external DB to ourselves
$externalDB = factory(DbSource::class)->create([
'DBS_SERVER' => 'localhost',
'DBS_SERVER' => config('database.connections.testexternal.host'),
'DBS_PORT' => '3306',
'DBS_USERNAME' => env('DB_USERNAME'),
'DBS_USERNAME' => config('database.connections.testexternal.username'),
// Remember, we have to do some encryption here @see DbSourceFactory.php
'DBS_PASSWORD' => \G::encrypt( env('DB_PASSWORD'), 'testexternal') . "_2NnV3ujj3w",
'DBS_DATABASE_NAME' => 'testexternal',
'DBS_PASSWORD' => \G::encrypt(env('DB_PASSWORD'), config('database.connections.testexternal.database')) . "_2NnV3ujj3w",
'DBS_DATABASE_NAME' => config('database.connections.testexternal.database'),
'PRO_UID' => $process->PRO_UID
]);
@@ -65,9 +78,13 @@ class DBQueryTest extends TestCase
$this->assertEquals('testvalue', $results[1]['value']);
}
/**
* Verify the execution of a SQL statement common to an MSSQL external database.
* @test
*/
public function testStandardExecuteQueryWithExternalMSSqlDatabase()
{
if(!env('RUN_MSSQL_TESTS')) {
if (!env('RUN_MSSQL_TESTS')) {
$this->markTestSkipped('MSSQL Related Test Skipped');
}
// Our test external database is created in our tests/bootstrap.php file
@@ -80,8 +97,8 @@ class DBQueryTest extends TestCase
'DBS_TYPE' => 'mssql',
'DBS_USERNAME' => env('MSSQL_USERNAME'),
// Remember, we have to do some encryption here @see DbSourceFactory.php
'DBS_PASSWORD' => \G::encrypt( env('MSSQL_PASSWORD'), 'testexternal') . "_2NnV3ujj3w",
'DBS_DATABASE_NAME' => 'testexternal',
'DBS_PASSWORD' => \G::encrypt(env('MSSQL_PASSWORD'), env('MSSQL_DATABASE')) . "_2NnV3ujj3w",
'DBS_DATABASE_NAME' => env('MSSQL_DATABASE'),
'PRO_UID' => $process->PRO_UID
]);
// Now set our process ID
@@ -94,4 +111,4 @@ class DBQueryTest extends TestCase
$this->assertCount(1, $results);
$this->assertEquals('testvalue', $results[1]['value']);
}
}
}

View File

@@ -1,26 +1,37 @@
<?php
namespace Tests;
use PDO;
use PHPUnit\Framework\TestCase as TestCaseFramework;
use ProcessMaker\Importer\XmlImporter;
use PHPUnit\Framework\TestCase;
/**
* Test case that could instance a workspace DB
*
*/
class WorkflowTestCase extends TestCase
class WorkflowTestCase extends TestCaseFramework
{
private $host;
private $user;
private $password;
private $database;
/**
* Create and install the database.
*/
protected function setupDB()
{
$this->host = env("DB_HOST");
$this->user = env("DB_USERNAME");
$this->password = env("DB_PASSWORD");
$this->database = env("DB_DATABASE");
//Install Database
$pdo0 = new PDO("mysql:host=".DB_HOST, DB_USER, DB_PASS);
$pdo0->query('DROP DATABASE IF EXISTS '.DB_NAME);
$pdo0->query('CREATE DATABASE '.DB_NAME);
$pdo = new PDO("mysql:host=".DB_HOST.";dbname=".DB_NAME, DB_USER,
DB_PASS);
$pdo0 = new PDO("mysql:host=".$this->host, $this->user, $this->password);
$pdo0->query('DROP DATABASE IF EXISTS '.$this->database);
$pdo0->query('CREATE DATABASE '.$this->database);
$pdo = new PDO("mysql:host=".$this->host.";dbname=".$this->database, $this->user,
$this->password);
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, 0);
$pdo->exec(file_get_contents(PATH_CORE.'data/mysql/schema.sql'));
$pdo->exec(file_get_contents(PATH_RBAC_CORE.'data/mysql/schema.sql'));
@@ -39,8 +50,8 @@ class WorkflowTestCase extends TestCase
protected function dropDB()
{
//Install Database
$pdo0 = new PDO("mysql:host=".DB_HOST, DB_USER, DB_PASS);
$pdo0->query('DROP DATABASE IF EXISTS '.DB_NAME);
$pdo0 = new PDO("mysql:host=".$this->host, $this->user, $this->password);
$pdo0->query('DROP DATABASE IF EXISTS '.$this->database);
}
/**

23
tests/bootstrap.php Normal file → Executable file
View File

@@ -39,6 +39,11 @@ define('PM_NEW_PROCESS_SAVE', 1006);
define('PATH_DATA_SITE', PATH_DATA . 'sites/' . SYS_SYS . '/');
define("PATH_DATA_MAILTEMPLATES", PATH_DATA_SITE . "mailTemplates/");
define('PATH_DATA_PUBLIC', PATH_DATA_SITE . 'public/');
define('DB_ADAPTER', 'mysql');
define('PATH_RBAC_HOME', PATH_TRUNK . '/rbac/');
define('PATH_RBAC', PATH_RBAC_HOME . 'engine/classes/');
define("PATH_CUSTOM_SKINS", PATH_DATA . "skins/");
define("PATH_TPL", PATH_CORE . "templates/");
//timezone
$_SESSION['__SYSTEM_UTC_TIME_ZONE__'] = (int) (env('MAIN_SYSTEM_UTC_TIME_ZONE', 'workflow')) == 1;
@@ -57,11 +62,22 @@ ini_set('date.timezone', TIME_ZONE); //Set Time Zone
date_default_timezone_set(TIME_ZONE);
config(['app.timezone' => TIME_ZONE]);
//configuration values
config([
"system.workspace" => SYS_SYS
]);
define("PATH_DATA_SITE", PATH_DATA . "sites/" . config("system.workspace") . "/");
define("PATH_DYNAFORM", PATH_DATA_SITE . "xmlForms/");
define("PATH_DATA_MAILTEMPLATES", PATH_DATA_SITE . "mailTemplates/");
define("PATH_DATA_PUBLIC", PATH_DATA_SITE . "public/");
G::defineConstants();
// Setup our testexternal database
config(['database.connections.testexternal' => [
'driver' => 'mysql',
'host' => env('DB_HOST', '127.0.0.1'),
'database' => env('DB_DATABASE', 'testexternal'),
'database' => 'testexternal',
'username' => env('DB_USERNAME', 'root'),
'password' => env('DB_PASSWORD', 'password'),
'unix_socket' => env('DB_SOCKET', ''),
@@ -72,11 +88,6 @@ config(['database.connections.testexternal' => [
'engine' => null
]]);
//configuration values
config([
"system.workspace" => SYS_SYS
]);
// Now, drop all test tables and repopulate with schema
Schema::connection('testexternal')->dropIfExists('test');

View File

@@ -0,0 +1,72 @@
<?php
namespace Tests\unit\app;
use Illuminate\Filesystem\Filesystem;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Log;
use Tests\TestCase;
class CustomizeFormatterTest extends TestCase
{
private static $directory;
/**
* This is executed for each test.
*/
protected function setUp()
{
self::$directory = PATH_TRUNK . '/storage/logs/';
}
/**
* This is done before the first test.
*/
public static function setUpBeforeClass()
{
$file = new Filesystem();
$file->cleanDirectory(self::$directory);
}
/**
* This is done after the last test.
*/
public static function tearDownAfterClass()
{
$file = new Filesystem();
$file->cleanDirectory(self::$directory);
}
/**
* Return all of the log levels defined in the RFC 5424 specification.
* @return array
*/
public function levelProviders()
{
return [
['emergency', 'production.EMERGENCY'],
['alert', 'production.ALERT'],
['critical', 'production.CRITICAL'],
['error', 'production.ERROR'],
['warning', 'production.WARNING'],
['notice', 'production.NOTICE'],
['info', 'production.INFO'],
['debug', 'production.DEBUG'],
];
}
/**
* This check the creation of a record with the emergency level.
* @test
* @dataProvider levelProviders
*/
public function it_should_create_log_file_levels($level, $message)
{
Log::{$level}($level);
$files = File::allFiles(self::$directory);
$this->assertCount(1, $files);
$string = File::get($files[0]);
$this->assertRegExp("/{$message}/", $string);
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@@ -532,4 +532,271 @@ class PmDynaformTest extends TestCase
]
];
}
/**
* It tests that the json file is getting the defined values when the grid has one undefined control
*
* @test
*/
public function it_should_add_the_correct_fields_with_a_single_undefined_control()
{
//Creates the PmDynaform object
$pmDynaform = new PmDynaform();
//A json that contains the text control data and columns
$jsonData = (object)(
[
"data" => (object)([
"1" => [
["value" => "textControl1", "label" => "textControl1"],
["value" => "textControl2", "label" => "textControl2"],
["value" => "", "label" => ""]
]
]),
"columns" => (object)([
0 => (object)([
"id" => "text0000000001",
"name" => "text0000000001",
]),
1 => (object)([
"id" => "textarea0000000001",
"name" => "textarea0000000001",
]),
2 => (object)([
"id" => "text0000000002",
"name" => "text0000000002",
])
])
]
);
// An array that contains the variables stored on the App Data
$appData = [
"1" => [
"text0000000001" => "",
"text0000000001_label" => "",
"textarea0000000001" => "",
"textarea0000000001_label" => ""
]
];
//Calls the setDataSchema method
$resultText = $pmDynaform->setDataSchema($jsonData, $appData);
//This assert the result is null
$this->assertNull($resultText);
//Assert the 'dataSchema' field was added
$this->assertObjectHasAttribute('dataSchema', $jsonData);
//It asserts the first control is defined
$this->assertTrue($jsonData->dataSchema['1'][0]['defined']);
//It asserts the second control is defined
$this->assertTrue($jsonData->dataSchema['1'][1]['defined']);
//It asserts the second control is undefined
$this->assertFalse($jsonData->dataSchema['1'][2]['defined']);
}
/**
* It tests that the json file is getting the defined values when the grid has more than one undefined control
*
* @test
*/
public function it_should_add_the_correct_fields_with_more_than_one_undefined_control()
{
//Creates the PmDynaform object
$pmDynaform = new PmDynaform();
//A json that contains the text control data and columns
$jsonData = (object)(
[
"data" => (object)([
"1" => [
["value" => "textControl1", "label" => "textControl1"],
["value" => "textAreaControl2", "label" => "textAreaControl2"],
["value" => "dropdowncontrol1", "label" => "dropdowncontrol1"],
["value" => "", "label" => ""],
["value" => "", "label" => ""]
]
]),
"columns" => (object)([
0 => (object)([
"id" => "text0000000001",
"name" => "text0000000001",
]),
1 => (object)([
"id" => "textarea0000000001",
"name" => "textarea0000000001",
]),
2 => (object)([
"id" => "dropdown0000000001",
"name" => "dropdown0000000001",
]),
3 => (object)([
"id" => "text0000000002",
"name" => "text0000000002",
]),
4 => (object)([
"id" => "text0000000003",
"name" => "text0000000003",
])
])
]
);
// An array that contains the variables stored on the App Data
$appData = [
"1" => [
"text0000000001" => "",
"text0000000001_label" => "",
"textarea0000000001" => "",
"textarea0000000001_label" => "",
"dropdown0000000001" => "",
"dropdown0000000001_label" => ""
]
];
//Calls the setDataSchema method
$resultText = $pmDynaform->setDataSchema($jsonData, $appData);
//This assert the result is null
$this->assertNull($resultText);
//Assert the 'dataSchema' field was added
$this->assertObjectHasAttribute('dataSchema', $jsonData);
//It asserts the first control is defined
$this->assertTrue($jsonData->dataSchema['1'][0]['defined']);
//It asserts the second control is defined
$this->assertTrue($jsonData->dataSchema['1'][1]['defined']);
//It asserts the third control is defined
$this->assertTrue($jsonData->dataSchema['1'][2]['defined']);
//It asserts the fourth control is undefined
$this->assertFalse($jsonData->dataSchema['1'][3]['defined']);
//It asserts the fifth control is undefined
$this->assertFalse($jsonData->dataSchema['1'][4]['defined']);
}
/**
* It tests that the json file is getting the defined and undefined values when the grid has more than one row
*
* @test
*/
public function it_should_add_the_correct_fields_with_more_than_one_rows()
{
//Creates the PmDynaform object
$pmDynaform = new PmDynaform();
//A json that contains the text control data and columns
$jsonData = (object)(
[
"data" => (object)([
"1" => [
["value" => "textControl1", "label" => "textControl1"],
["value" => "textAreaControl2", "label" => "textAreaControl2"],
["value" => "dropdowncontrol1", "label" => "dropdowncontrol1"],
["value" => "", "label" => ""],
["value" => "", "label" => ""]
],
"2" => [
["value" => "textControl1", "label" => "textControl1"],
["value" => "textAreaControl2", "label" => "textAreaControl2"],
["value" => "dropdowncontrol1", "label" => "dropdowncontrol1"],
["value" => "", "label" => ""],
["value" => "", "label" => ""]
],
"3" => [
["value" => "textControl1", "label" => "textControl1"],
["value" => "textAreaControl2", "label" => "textAreaControl2"],
["value" => "dropdowncontrol1", "label" => "dropdowncontrol1"],
["value" => "", "label" => ""],
["value" => "", "label" => ""]
]
]),
"columns" => (object)([
0 => (object)([
"id" => "text0000000001",
"name" => "text0000000001",
]),
1 => (object)([
"id" => "textarea0000000001",
"name" => "textarea0000000001",
]),
2 => (object)([
"id" => "dropdown0000000001",
"name" => "dropdown0000000001",
]),
3 => (object)([
"id" => "text0000000002",
"name" => "text0000000002",
]),
4 => (object)([
"id" => "text0000000003",
"name" => "text0000000003",
])
])
]
);
// An array that contains the variables stored on the App Data
$appData = [
"1" => [
"text0000000001" => "",
"text0000000001_label" => "",
"textarea0000000001" => "",
"textarea0000000001_label" => "",
"dropdown0000000001" => "",
"dropdown0000000001_label" => ""
],
"2" => [
"text0000000001" => "",
"text0000000001_label" => "",
"textarea0000000001" => "",
"textarea0000000001_label" => "",
"dropdown0000000001" => "",
"dropdown0000000001_label" => ""
],
"3" => [
"text0000000001" => "",
"text0000000001_label" => "",
"textarea0000000001" => "",
"textarea0000000001_label" => "",
"dropdown0000000001" => "",
"dropdown0000000001_label" => ""
]
];
//Calls the setDataSchema method
$resultText = $pmDynaform->setDataSchema($jsonData, $appData);
//This assert the result is null
$this->assertNull($resultText);
//Assert the 'dataSchema' field was added
$this->assertObjectHasAttribute('dataSchema', $jsonData);
foreach ($jsonData->dataSchema as $key => $value) {
//It asserts the first control is defined
$this->assertTrue($jsonData->dataSchema[$key][0]['defined']);
//It asserts the second control is defined
$this->assertTrue($jsonData->dataSchema[$key][1]['defined']);
//It asserts the third control is defined
$this->assertTrue($jsonData->dataSchema[$key][2]['defined']);
//It asserts the fourth control is undefined
$this->assertFalse($jsonData->dataSchema[$key][3]['defined']);
//It asserts the fifth control is undefined
$this->assertFalse($jsonData->dataSchema[$key][4]['defined']);
}
}
}

View File

@@ -9,13 +9,13 @@ use ProcessMaker\Model\Task;
use ProcessMaker\Model\User;
use Tests\TestCase;
class PmDynaformTest extends TestCase
class ReportTablesTest extends TestCase
{
use DatabaseTransactions;
/**
* Constructor of the class.
* Sets up the unit tests.
*/
protected function setUp()
{

View File

@@ -37,13 +37,6 @@ class GroupTest extends TestCase
*/
protected function setUp()
{
parent::setUp();
//Move section
global $RBAC;
$RBAC->initRBAC();
$RBAC->loadUserRolePermission($RBAC->sSystem, '00000000000000000000000000000001');
$this->setInstanceGroup(new Group());
}

View File

@@ -1,11 +1,15 @@
<?php
namespace ProcessMaker\BusinessModel;
namespace Tests\unit\workflow\engine\src\ProcessMaker\BusinessModel;
use ProcessMaker\BusinessModel\Language;
use System;
use Tests\TestCase;
/**
* Test the ProcessMaker\BusinessModel\Language class.
*/
class LanguageTest extends \WorkflowTestCase
class LanguageTest extends TestCase
{
/**
* @var Language
@@ -18,18 +22,35 @@ class LanguageTest extends \WorkflowTestCase
*/
protected function setUp()
{
$this->setupDB();
$this->getBaseUri();
$this->object = new Language;
$this->translationEnv = PATH_DATA."META-INF".PATH_SEP."translations.env";
$this->translationEnv = PATH_DATA . "META-INF" . PATH_SEP . "translations.env";
file_exists($this->translationEnv) ? unlink($this->translationEnv) : false;
}
/**
* Tears down the unit tests.
* Get base uri for rest applications.
* @return string
*/
protected function tearDown()
private function getBaseUri()
{
$this->dropDB();
$_SERVER = $this->getServerInformation();
$baseUri = System::getServerProtocolHost();
return $baseUri;
}
/**
* Get server information.
* @return object
*/
private function getServerInformation()
{
$pathData = PATH_DATA . "sites" . PATH_SEP . config("system.workspace") . PATH_SEP . ".server_info";
$content = file_get_contents($pathData);
$serverInfo = unserialize($content);
return $serverInfo;
}
/**
@@ -41,9 +62,11 @@ class LanguageTest extends \WorkflowTestCase
public function testGetLanguageList()
{
$list = $this->object->getLanguageList();
$this->assertCount(1, $list);
$this->assertEquals('en', $list[0]['LANG_ID']);
$this->assertEquals('English', $list[0]['LANG_NAME']);
$expected = [
'LANG_ID' => 'en',
'LANG_NAME' => 'English',
];
$this->assertContains($expected, $list);
}
/**
@@ -54,16 +77,23 @@ class LanguageTest extends \WorkflowTestCase
*/
public function testGetLanguageListInstalled()
{
$this->installLanguage('es', __DIR__.'/processmaker.es.po');
$this->installLanguage('es', __DIR__ . '/processmaker.es.po');
$list = $this->object->getLanguageList();
$this->assertCount(2, $list);
$this->assertEquals('en', $list[0]['LANG_ID']);
$this->assertEquals('English', $list[0]['LANG_NAME']);
$this->assertEquals('es-ES', $list[1]['LANG_ID']);
$this->assertEquals('Spanish (Spain)', $list[1]['LANG_NAME']);
$this->uninstallLanguage('es', __DIR__.'/processmaker.es.po');
$english = [
'LANG_ID' => 'en',
'LANG_NAME' => 'English',
];
$this->assertContains($english, $list);
$spanish = [
'LANG_ID' => 'es-ES',
'LANG_NAME' => 'Spanish (Spain)',
];
$this->assertContains($spanish, $list);
$this->uninstallLanguage('es', __DIR__ . '/processmaker.es.po');
$list2 = $this->object->getLanguageList();
$this->assertCount(1, $list2);
$this->assertContains($english, $list2);
}
/**
@@ -74,7 +104,7 @@ class LanguageTest extends \WorkflowTestCase
*/
private function installLanguage($lanId, $filename)
{
copy($filename, PATH_CORE.'content/translations/'.basename($filename));
copy($filename, PATH_CORE . 'content/translations/' . basename($filename));
$language = \LanguagePeer::retrieveByPK($lanId);
$language->setLanEnabled(1);
$language->save();
@@ -89,7 +119,7 @@ class LanguageTest extends \WorkflowTestCase
*/
private function uninstallLanguage($lanId, $filename)
{
unlink(PATH_CORE.'content/translations/'.basename($filename));
unlink(PATH_CORE . 'content/translations/' . basename($filename));
$language = \LanguagePeer::retrieveByPK($lanId);
$language->setLanEnabled(0);
$language->save();

View File

@@ -2,10 +2,13 @@
namespace ProcessMaker\BusinessModel;
use G;
use Tests\TestCase;
/**
* Skins Tests
*/
class SkinsTest extends \WorkflowTestCase
class SkinsTest extends TestCase
{
/**
* @var Skins
@@ -17,9 +20,7 @@ class SkinsTest extends \WorkflowTestCase
*/
protected function setUp()
{
$this->cleanShared();
$this->setupDB();
$this->object = new Skins;
$this->object = new Skins();
}
/**
@@ -27,8 +28,8 @@ class SkinsTest extends \WorkflowTestCase
*/
protected function tearDown()
{
$this->cleanShared();
$this->dropDB();
G::rm_dir(PATH_DATA . 'skins');
mkdir(PATH_DATA . 'skins');
}
/**
@@ -61,12 +62,7 @@ class SkinsTest extends \WorkflowTestCase
{
$this->object->createSkin('test', 'test');
$this->object->createSkin(
'test2',
'test2',
'Second skin',
'ProcessMaker Team',
'current',
'neoclassic'
'test2', 'test2', 'Second skin', 'ProcessMaker Team', 'current', 'neoclassic'
);
$skins = $this->object->getSkins();
$this->assertCount(4, $skins);

View File

@@ -1,13 +1,17 @@
<?php
namespace ProcessMaker\BusinessModel;
namespace Tests\unit\workflow\engine\src\ProcessMaker\BusinessModel;
use G;
use ProcessMaker\BusinessModel\WebEntryEvent;
use ProcessMaker\Importer\XmlImporter;
use System;
use Tests\WorkflowTestCase;
/**
* WebEntryEventTest test
*/
class WebEntryEventTest extends \WorkflowTestCase
class WebEntryEventTest extends WorkflowTestCase
{
const SKIP_VALUE = '&SKIP_VALUE%';
@@ -26,20 +30,19 @@ class WebEntryEventTest extends \WorkflowTestCase
*/
protected function setUp()
{
//to do: This is excluded because requires more changes
$this->markTestIncomplete();
$this->getBaseUri();
$this->setupDB();
$this->processUid = $this->import(__DIR__.'/WebEntryEventTest.pmx');
$this->processUid2 = $this->import(__DIR__.'/WebEntryEventTest2.pmx');
$this->object = new WebEntryEvent;
$this->setTranslation('ID_INVALID_VALUE_CAN_NOT_BE_EMPTY',
'ID_INVALID_VALUE_CAN_NOT_BE_EMPTY({0})');
$this->setTranslation('ID_UNDEFINED_VALUE_IS_REQUIRED',
'ID_UNDEFINED_VALUE_IS_REQUIRED({0})');
$this->setTranslation('ID_WEB_ENTRY_EVENT_DOES_NOT_EXIST',
'ID_WEB_ENTRY_EVENT_DOES_NOT_EXIST({0})');
$this->setTranslation('ID_INVALID_VALUE_ONLY_ACCEPTS_VALUES',
'ID_INVALID_VALUE_ONLY_ACCEPTS_VALUES({0},{1})');
$this->setTranslation('ID_DYNAFORM_IS_NOT_ASSIGNED_TO_ACTIVITY',
'ID_DYNAFORM_IS_NOT_ASSIGNED_TO_ACTIVITY({0},{1})');
$this->processUid = $this->import(__DIR__ . '/WebEntryEventTest.pmx');
$this->processUid2 = $this->import(__DIR__ . '/WebEntryEventTest2.pmx');
$this->object = new WebEntryEvent();
$this->setTranslation('ID_INVALID_VALUE_CAN_NOT_BE_EMPTY', 'ID_INVALID_VALUE_CAN_NOT_BE_EMPTY({0})');
$this->setTranslation('ID_UNDEFINED_VALUE_IS_REQUIRED', 'ID_UNDEFINED_VALUE_IS_REQUIRED({0})');
$this->setTranslation('ID_WEB_ENTRY_EVENT_DOES_NOT_EXIST', 'ID_WEB_ENTRY_EVENT_DOES_NOT_EXIST({0})');
$this->setTranslation('ID_INVALID_VALUE_ONLY_ACCEPTS_VALUES', 'ID_INVALID_VALUE_ONLY_ACCEPTS_VALUES({0},{1})');
$this->setTranslation('ID_DYNAFORM_IS_NOT_ASSIGNED_TO_ACTIVITY', 'ID_DYNAFORM_IS_NOT_ASSIGNED_TO_ACTIVITY({0},{1})');
}
/**
@@ -47,10 +50,34 @@ class WebEntryEventTest extends \WorkflowTestCase
*/
protected function tearDown()
{
$this->dropDB();
$this->clearTranslations();
}
/**
* Get base uri for rest applications.
* @return string
*/
private function getBaseUri()
{
$_SERVER = $this->getServerInformation();
$baseUri = System::getServerProtocolHost();
return $baseUri;
}
/**
* Get server information.
* @return object
*/
private function getServerInformation()
{
$pathData = PATH_DATA . "sites" . PATH_SEP . config("system.workspace") . PATH_SEP . ".server_info";
$content = file_get_contents($pathData);
$serverInfo = unserialize($content);
return $serverInfo;
}
/**
* @covers ProcessMaker\BusinessModel\WebEntryEvent::getWebEntryEvents
* @category HOR-3207:5

View File

@@ -0,0 +1,38 @@
<?php
namespace Tests\unit\workflow\engine\src\ProcessMaker\Core;
use ProcessMaker\Core\System;
use Tests\TestCase;
class SystemTest extends TestCase
{
/**
* Define the required variables
*/
protected function setUp()
{
$config = config('database.connections.testexternal');
define('DB_HOST', $config['host']);
define('DB_NAME', $config['database']);
define('DB_USER', $config['username']);
define('DB_PASS', $config['password']);
}
/**
* It tests the initLaravel method
*
* @test
*/
public function it_should_init_laravel_configurations()
{
$object = new System();
$object->initLaravel();
// Assert that the configurations were set successfully
$this->assertEquals(DB_HOST, config('database.connections.workflow.host'));
$this->assertEquals(DB_NAME, config('database.connections.workflow.database'));
$this->assertEquals(DB_USER, config('database.connections.workflow.username'));
$this->assertEquals(DB_PASS, config('database.connections.workflow.password'));
}
}

View File

@@ -220,10 +220,10 @@ class DelegationTest extends TestCase
// Create a new delegation, but for this specific user
factory(Delegation::class)->create([
'USR_UID' => $user->USR_UID,
'USR_ID' => $user->id
'USR_ID' => $user->USR_ID
]);
// Now fetch results, and assume delegation count is 1 and the user points to our user
$results = Delegation::search($user->id);
$results = Delegation::search($user->USR_ID);
$this->assertCount(1, $results['data']);
$this->assertEquals('testcaseuser', $results['data'][0]['USRCR_USR_USERNAME']);
}
@@ -644,7 +644,7 @@ class DelegationTest extends TestCase
// Create a new delegation, but for this specific user
factory(Delegation::class)->create([
'USR_UID' => $user->USR_UID,
'USR_ID' => $user->id
'USR_ID' => $user->USR_ID
]);
$user = factory(User::class)->create([
'USR_USERNAME' => 'paul',
@@ -654,7 +654,7 @@ class DelegationTest extends TestCase
// Create a new delegation, but for this specific user
factory(Delegation::class)->create([
'USR_UID' => $user->USR_UID,
'USR_ID' => $user->id
'USR_ID' => $user->USR_ID
]);
// Now fetch results, and assume delegation count is 2 and the ordering ascending return Gary
$results = Delegation::search(null, 0, 25, null, null, null, 'ASC', 'APP_CURRENT_USER');

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,51 @@
<?php
namespace Tests\unit\workflow\engine\src\ProcessMaker\Model;
use ProcessMaker\Model\Process;
use ProcessMaker\Model\ProcessVariables;
use Tests\TestCase;
class ProcessVariablesTest extends TestCase
{
/**
* It tests the process scope in the ProcessVariables model
* @test
*/
public function it_should_test_process_scope_in_process_variables_model()
{
$process = factory(Process::class, 2)->create();
factory(ProcessVariables::class)->create(
[
'PRJ_UID' => $process[0]['PRO_UID'],
'VAR_SQL' => 'SELECT * FROM USERS WHERE USR_UID="213" UNION SELECT * from PROCESS'
]
);
factory(ProcessVariables::class)->create(
[
'PRJ_UID' => $process[1]['PRO_UID'],
'VAR_SQL' => ''
]
);
factory(ProcessVariables::class)->create(
[
'PRJ_UID' => $process[0]['PRO_UID'],
'VAR_SQL' => ''
]
);
$variablesQuery = ProcessVariables::query()->select();
$variablesQuery->process($process[0]['PRO_UID']);
$result = $variablesQuery->get()->values()->toArray();
// Assert there are two process variables for the specific process
$this->assertCount(2, $result);
// Assert that the result has the correct filtered process
$this->assertEquals($process[0]['PRO_UID'], $result[0]['PRJ_UID']);
$this->assertEquals($process[0]['PRO_UID'], $result[1]['PRJ_UID']);
}
}

View File

@@ -0,0 +1,77 @@
<?php
namespace Tests\unit\workflow\engine\src\ProcessMaker\Model;
use ProcessMaker\Model\Process;
use ProcessMaker\Model\Triggers;
use Tests\TestCase;
class TriggersTest extends TestCase
{
/**
* It tests the process scope in the trigger model
* @test
*/
public function it_should_test_process_scope_in_trigger_model()
{
$process = factory(Process::class, 3)->create();
factory(Triggers::class)->create(
[
'PRO_UID' => $process[0]['PRO_UID'],
'TRI_WEBBOT' => '$text=222;
$var1= executeQuery("SELECT *
FROM USERS WHERE
USR_UID=\'$UID\' UNION SELECT * from PROCESS");
$var1= executeQuery("SELECT *
FROM USERS WHERE
USR_UID=\'$UID\' UNION SELECT * from PROCESS");
$query = "SELECT * FROM USERS UNION
SELECT * FROM TASKS";
$QUERY2 = "select * from USERS union SELECT * from GROUPS";
$s1 = "select * from USER";
$s2 = "select * from TASK";
$query3 = $s1. " UNION " . $s2;
executeQuery($query3);'
]
);
factory(Triggers::class)->create(
[
'PRO_UID' => $process[1]['PRO_UID'],
'TRI_WEBBOT' => 'die();'
]
);
factory(Triggers::class)->create(
[
'PRO_UID' => $process[2]['PRO_UID'],
'TRI_WEBBOT' => 'executeQuery("select * from USERS");'
]
);
factory(Triggers::class)->create(
[
'PRO_UID' => $process[2]['PRO_UID'],
'TRI_WEBBOT' => 'executeQuery();'
]
);
$triggerQuery = Triggers::query()->select();
$triggerQuery->process($process[2]['PRO_UID']);
$result = $triggerQuery->get()->values()->toArray();
// Assert there are two triggers for the specific process
$this->assertCount(2, $result);
// Assert that the result has the correct filtered process
$this->assertEquals($process[2]['PRO_UID'], $result[0]['PRO_UID']);
$this->assertEquals($process[2]['PRO_UID'], $result[1]['PRO_UID']);
}
}

Some files were not shown because too many files have changed in this diff Show More