From 8ce7e41f66afea6436e3505ba4ee5594c04deb36 Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Tue, 9 Feb 2021 18:22:20 +0100 Subject: [PATCH] draft individual module test environments --- .github/workflows/main.yml | 58 +++++- tests/Autoloader.php | 94 +++++++++ tests/Bootstrap.php | 395 +++++++++++++++++++++++++++++++++++++ tests/phpunit_default.xml | 56 ++++++ 4 files changed, 601 insertions(+), 2 deletions(-) create mode 100644 tests/Autoloader.php create mode 100644 tests/Bootstrap.php create mode 100644 tests/phpunit_default.xml diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 1146340..295f795 100755 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -41,6 +41,34 @@ jobs: code-tests: runs-on: ubuntu-latest if: "!contains(github.event.head_commit.message, 'NO_CI')" + services: + mysql: + image: mysql:5.7 + env: + MYSQL_ALLOW_EMPTY_PASSWORD: false + MYSQL_ROOT_PASSWORD: root + MYSQL_DATABASE: oms + ports: + - 3306:3306 + options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3 + postgres: + image: postgres:10.8 + env: + POSTGRES_USER: postgres + POSTGRES_PASSWORD: root + POSTGRES_DB: oms + ports: + - 5432:5432 + options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 3 + redis: + image: redis + ports: + - 6379:6379 + options: --entrypoint redis-server + memcached: + image: memcached + ports: + - 11211:11211 strategy: fail-fast: false max-parallel: 3 @@ -58,12 +86,34 @@ jobs: ref: develop repository: Orange-Management/Build path: Build + - name: Checkout Resource Repository + uses: actions/checkout@master + with: + fetch-depth: 1 + ref: develop + repository: Orange-Management/Resources + path: Resources + - name: Checkout phpOMS Repository + uses: actions/checkout@master + with: + fetch-depth: 1 + ref: develop + repository: Orange-Management/phpOMS + path: phpOMS + - name: Checkout Orange-Management Repository + uses: actions/checkout@master + with: + fetch-depth: 1 + ref: develop + repository: Orange-Management/Orange-Management + path: Orange-Management - name: Setup PHP, with composer and extensions uses: shivammathur/setup-php@master with: php-version: ${{ matrix.php-versions }} extensions: mbstring, gd, zip, dom, mysql, pgsql, sqlite, imap, bcmath, redis, memcached ini-values: opcache.jit_buffer_size=256M, opcache.jit=1235, pcre.jit=1 + coverage: pcov - name: Get Composer Cache Directory id: composer-cache run: echo "::set-output name=dir::$(composer config cache-files-dir)" @@ -75,8 +125,12 @@ jobs: restore-keys: ${{ runner.os }}-composer- - name: Setup Composer run: composer install - - name: phpcs - run: vendor/bin/phpcs ./ --standard="Build/Config/phpcs.xml" -s --report=full + - name: phpunit + run: vendor/bin/phpunit --coverage-clover tests/coverage.xml --configuration tests/phpunit_default.xml + - name: codecov + env: + CODECOV_TOKEN: "${{ secrets.CODECOV_TOKEN }}" + run: "bash <(curl -s https://codecov.io/bash) -f tests/coverage.xml" custom: runs-on: ubuntu-latest if: "!contains(github.event.head_commit.message, 'NO_CI')" diff --git a/tests/Autoloader.php b/tests/Autoloader.php new file mode 100644 index 0000000..6d67213 --- /dev/null +++ b/tests/Autoloader.php @@ -0,0 +1,94 @@ + [ + 'core' => [ + 'masters' => [ + 'admin' => [ + 'db' => 'mysql', /* db type */ + 'host' => '127.0.0.1', /* db host address */ + 'port' => '3306', /* db host port */ + 'login' => 'root', /* db login name */ + 'password' => 'root', /* db login password */ + 'database' => 'oms', /* db name */ + 'weight' => 1000, /* db table prefix */ + ], + 'insert' => [ + 'db' => 'mysql', /* db type */ + 'host' => '127.0.0.1', /* db host address */ + 'port' => '3306', /* db host port */ + 'login' => 'root', /* db login name */ + 'password' => 'root', /* db login password */ + 'database' => 'oms', /* db name */ + 'weight' => 1000, /* db table prefix */ + ], + 'select' => [ + 'db' => 'mysql', /* db type */ + 'host' => '127.0.0.1', /* db host address */ + 'port' => '3306', /* db host port */ + 'login' => 'root', /* db login name */ + 'password' => 'root', /* db login password */ + 'database' => 'oms', /* db name */ + 'weight' => 1000, /* db table prefix */ + ], + 'update' => [ + 'db' => 'mysql', /* db type */ + 'host' => '127.0.0.1', /* db host address */ + 'port' => '3306', /* db host port */ + 'login' => 'root', /* db login name */ + 'password' => 'root', /* db login password */ + 'database' => 'oms', /* db name */ + 'weight' => 1000, /* db table prefix */ + ], + 'delete' => [ + 'db' => 'mysql', /* db type */ + 'host' => '127.0.0.1', /* db host address */ + 'port' => '3306', /* db host port */ + 'login' => 'root', /* db login name */ + 'password' => 'root', /* db login password */ + 'database' => 'oms', /* db name */ + 'weight' => 1000, /* db table prefix */ + ], + 'schema' => [ + 'db' => 'mysql', /* db type */ + 'host' => '127.0.0.1', /* db host address */ + 'port' => '3306', /* db host port */ + 'login' => 'root', /* db login name */ + 'password' => 'root', /* db login password */ + 'database' => 'oms', /* db name */ + 'weight' => 1000, /* db table prefix */ + ], + ], + 'postgresql' => [ + 'admin' => [ + 'db' => 'pgsql', /* db type */ + 'host' => '127.0.0.1', /* db host address */ + 'port' => '5432', /* db host port */ + 'login' => 'postgres', /* db login name */ + 'password' => 'root', /* db login password */ + 'database' => 'oms', /* db name */ + 'weight' => 1000, /* db table prefix */ + ], + 'insert' => [ + 'db' => 'pgsql', /* db type */ + 'host' => '127.0.0.1', /* db host address */ + 'port' => '5432', /* db host port */ + 'login' => 'postgres', /* db login name */ + 'password' => 'root', /* db login password */ + 'database' => 'oms', /* db name */ + 'weight' => 1000, /* db table prefix */ + ], + 'select' => [ + 'db' => 'pgsql', /* db type */ + 'host' => '127.0.0.1', /* db host address */ + 'port' => '5432', /* db host port */ + 'login' => 'postgres', /* db login name */ + 'password' => 'root', /* db login password */ + 'database' => 'oms', /* db name */ + 'weight' => 1000, /* db table prefix */ + ], + 'update' => [ + 'db' => 'pgsql', /* db type */ + 'host' => '127.0.0.1', /* db host address */ + 'port' => '5432', /* db host port */ + 'login' => 'postgres', /* db login name */ + 'password' => 'root', /* db login password */ + 'database' => 'oms', /* db name */ + 'weight' => 1000, /* db table prefix */ + ], + 'delete' => [ + 'db' => 'pgsql', /* db type */ + 'host' => '127.0.0.1', /* db host address */ + 'port' => '5432', /* db host port */ + 'login' => 'postgres', /* db login name */ + 'password' => 'root', /* db login password */ + 'database' => 'oms', /* db name */ + 'weight' => 1000, /* db table prefix */ + ], + 'schema' => [ + 'db' => 'pgsql', /* db type */ + 'host' => '127.0.0.1', /* db host address */ + 'port' => '5432', /* db host port */ + 'login' => 'postgres', /* db login name */ + 'password' => 'root', /* db login password */ + 'database' => 'oms', /* db name */ + 'weight' => 1000, /* db table prefix */ + ], + ], + 'sqlite' => [ + 'admin' => [ + 'db' => 'sqlite', /* db type */ + 'database' => __DIR__ . '/test.sqlite', /* db name */ + 'weight' => 1000, /* db table prefix */ + ], + 'insert' => [ + 'db' => 'sqlite', /* db type */ + 'database' => __DIR__ . '/test.sqlite', /* db name */ + 'weight' => 1000, /* db table prefix */ + ], + 'select' => [ + 'db' => 'sqlite', /* db type */ + 'database' => __DIR__ . '/test.sqlite', /* db name */ + 'weight' => 1000, /* db table prefix */ + ], + 'update' => [ + 'db' => 'sqlite', /* db type */ + 'database' => __DIR__ . '/test.sqlite', /* db name */ + 'weight' => 1000, /* db table prefix */ + ], + 'delete' => [ + 'db' => 'sqlite', /* db type */ + 'database' => __DIR__ . '/test.sqlite', /* db name */ + 'weight' => 1000, /* db table prefix */ + ], + 'schema' => [ + 'db' => 'sqlite', /* db type */ + 'database' => __DIR__ . '/test.sqlite', /* db name */ + 'weight' => 1000, /* db table prefix */ + ], + ], + 'mssql' => [ + 'admin' => [ + 'db' => 'mssql', /* db type */ + 'host' => '127.0.0.1', /* db host address */ + 'port' => '1433', /* db host port */ + 'login' => 'sa', /* db login name */ + 'password' => 'R00troot', /* db login password */ + 'database' => 'oms', /* db name */ + 'weight' => 1000, /* db table prefix */ + ], + 'insert' => [ + 'db' => 'mssql', /* db type */ + 'host' => '127.0.0.1', /* db host address */ + 'port' => '1433', /* db host port */ + 'login' => 'sa', /* db login name */ + 'password' => 'R00troot', /* db login password */ + 'database' => 'oms', /* db name */ + 'weight' => 1000, /* db table prefix */ + ], + 'select' => [ + 'db' => 'mssql', /* db type */ + 'host' => '127.0.0.1', /* db host address */ + 'port' => '1433', /* db host port */ + 'login' => 'sa', /* db login name */ + 'password' => 'R00troot', /* db login password */ + 'database' => 'oms', /* db name */ + 'weight' => 1000, /* db table prefix */ + ], + 'update' => [ + 'db' => 'mssql', /* db type */ + 'host' => '127.0.0.1', /* db host address */ + 'port' => '1433', /* db host port */ + 'login' => 'sa', /* db login name */ + 'password' => 'R00troot', /* db login password */ + 'database' => 'oms', /* db name */ + 'weight' => 1000, /* db table prefix */ + ], + 'delete' => [ + 'db' => 'mssql', /* db type */ + 'host' => '127.0.0.1', /* db host address */ + 'port' => '1433', /* db host port */ + 'login' => 'sa', /* db login name */ + 'password' => 'R00troot', /* db login password */ + 'database' => 'oms', /* db name */ + 'weight' => 1000, /* db table prefix */ + ], + 'schema' => [ + 'db' => 'mssql', /* db type */ + 'host' => '127.0.0.1', /* db host address */ + 'port' => '1433', /* db host port */ + 'login' => 'sa', /* db login name */ + 'password' => 'R00troot', /* db login password */ + 'database' => 'oms', /* db name */ + 'weight' => 1000, /* db table prefix */ + ], + ], + ], + ], + 'cache' => [ + 'redis' => [ + 'db' => 1, + 'host' => '127.0.0.1', + 'port' => 6379, + ], + 'memcached' => [ + 'host' => '127.0.0.1', + 'port' => 11211, + ], + ], + 'mail' => [ + 'imap' => [ + 'host' => '127.0.0.1', + 'port' => 143, + 'ssl' => false, + 'user' => 'test', + 'password' => '123456', + ], + 'pop3' => [ + 'host' => '127.0.0.1', + 'port' => 25, + 'ssl' => false, + 'user' => 'test', + 'password' => '123456', + ], + ], + 'log' => [ + 'file' => [ + 'path' => __DIR__ . '/Logs', + ], + ], + 'page' => [ + 'root' => '/', + 'https' => false, + ], + 'socket' => [ + 'master' => [ + 'host' => '127.0.0.1', + 'limit' => 300, + 'port' => 4310, + ], + ], + 'language' => [ + 'en', + ], + 'apis' => [ + ], +]; + +// Reset database +if (\defined('RESET') && RESET === '1') { + if (\extension_loaded('pdo_mysql')) { + try { + $db = new \PDO('mysql:host=' . + $CONFIG['db']['core']['masters']['admin']['host'], + $CONFIG['db']['core']['masters']['admin']['login'], + $CONFIG['db']['core']['masters']['admin']['password'] + ); + $db->exec('DROP DATABASE IF EXISTS ' . $CONFIG['db']['core']['masters']['admin']['database']); + $db->exec('CREATE DATABASE IF NOT EXISTS ' . $CONFIG['db']['core']['masters']['admin']['database']); + $db = null; + } catch (\Throwable $t) { + echo "\nCouldn't connect to MYSQL DB\n"; + } + } + + if (\extension_loaded('pdo_pgsql')) { + try { + $db = new \PDO('pgsql:host=' . + $CONFIG['db']['core']['postgresql']['admin']['host'], + $CONFIG['db']['core']['postgresql']['admin']['login'], + $CONFIG['db']['core']['postgresql']['admin']['password'] + ); + $db->exec('DROP DATABASE IF EXISTS ' . $CONFIG['db']['core']['postgresql']['admin']['database']); + $db->exec('CREATE DATABASE ' . $CONFIG['db']['core']['postgresql']['admin']['database']); + $db = null; + } catch (\Throwable $t) { + echo "\nCouldn't connect to POSTGRESQL DB\n"; + } + } + + if (\extension_loaded('pdo_sqlsrv')) { + try { + $db = new \PDO('sqlsrv:Server=' . + $CONFIG['db']['core']['mssql']['admin']['host'], + $CONFIG['db']['core']['mssql']['admin']['login'], + $CONFIG['db']['core']['mssql']['admin']['password'] + ); + $db->exec('DROP DATABASE IF EXISTS ' . $CONFIG['db']['core']['mssql']['admin']['database']); + $db->exec('CREATE DATABASE ' . $CONFIG['db']['core']['mssql']['admin']['database']); + $db = null; + } catch (\Throwable $t) { + echo "\nCouldn't connect to MSSQL DB\n"; + } + } +} + +$httpSession = new HttpSession(); +$GLOBALS['session'] = $httpSession; + +$GLOBALS['dbpool'] = new DatabasePool(); +$GLOBALS['dbpool']->create('admin', $CONFIG['db']['core']['masters']['admin']); +$GLOBALS['dbpool']->create('select', $CONFIG['db']['core']['masters']['select']); +$GLOBALS['dbpool']->create('update', $CONFIG['db']['core']['masters']['update']); +$GLOBALS['dbpool']->create('delete', $CONFIG['db']['core']['masters']['delete']); +$GLOBALS['dbpool']->create('insert', $CONFIG['db']['core']['masters']['insert']); +$GLOBALS['dbpool']->create('schema', $CONFIG['db']['core']['masters']['schema']); + +DataMapperAbstract::setConnection($GLOBALS['dbpool']->get()); + +$GLOBALS['frameworkpath'] = '/phpOMS/'; + +function phpServe() : void +{ + // OS detection + $isWindows = \stristr(\php_uname('s'), 'Windows') !== false; + + // Command that starts the built-in web server + if ($isWindows) { + $command = \sprintf( + 'wmic process call create "php -S %s:%d -t %s" | find "ProcessId"', + WEB_SERVER_HOST, + WEB_SERVER_PORT, + __DIR__ . '/../' . WEB_SERVER_DOCROOT + ); + + $killCommand = 'taskkill /f /pid '; + } else { + $command = \sprintf( + 'php -S %s:%d -t %s >/dev/null 2>&1 & echo $!', + WEB_SERVER_HOST, + WEB_SERVER_PORT, + WEB_SERVER_DOCROOT + ); + + $killCommand = 'kill '; + } + + // Execute the command and store the process ID + $output = []; + echo \sprintf('Starting server...') . \PHP_EOL; + echo \sprintf(' Current directory: %s', \getcwd()) . \PHP_EOL; + echo \sprintf(' %s', $command); + \exec($command, $output); + + // Get PID + if ($isWindows) { + $pid = \explode('=', $output[0]); + $pid = \str_replace(' ', '', $pid[1]); + $pid = \str_replace(';', '', $pid); + } else { + $pid = (int) $output[0]; + } + + // Log + echo \sprintf( + ' %s - Web server started on %s:%d with PID %d', + \date('r'), + WEB_SERVER_HOST, + WEB_SERVER_PORT, + $pid + ) . \PHP_EOL; + + // Kill the web server when the process ends + \register_shutdown_function(function() use ($killCommand, $pid) : void { + echo \PHP_EOL . \sprintf('Stopping server...') . \PHP_EOL; + echo \sprintf(' %s - Killing process with ID %d', \date('r'), $pid) . \PHP_EOL; + \exec($killCommand . $pid); + }); +} + +phpServe(); diff --git a/tests/phpunit_default.xml b/tests/phpunit_default.xml new file mode 100644 index 0000000..0419dd8 --- /dev/null +++ b/tests/phpunit_default.xml @@ -0,0 +1,56 @@ + + + + + *vendor* + vendor + ../vendor + ../phpOMS + ../phpOMS* + ../phpOMS/* + ../tests* + ../*/tests* + ../**/tests* + */tests* + ../* + ../* + ../* + ../* + ../* + ../**/test* + ../**/Theme* + ../**/Admin/Routes* + ../**/Admin/Install* + ../Media/Files* + + + + + + + + + ../Orange-Management/Install/tests* + + + ../tests* + + + + + volume + maybe + + + + + + + + + + + + + +