From 0613321c282761f70b16f1051e1d0609441d59ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Vo=C5=99=C3=AD=C5=A1ek?= Date: Thu, 7 Oct 2021 11:45:46 +0200 Subject: [PATCH] test with real DB --- .github/workflows/test-unit.yml | 78 ++++++++++++++++++++------------- .gitignore | 8 ++-- demos/Dockerfile | 2 +- demos/_demo-data/create-db.php | 22 +++++----- demos/init-db.php | 10 ++--- js/.gitignore | 4 -- phpunit-mssql.xml.dist | 35 --------------- phpunit-mysql.xml.dist | 35 --------------- phpunit.xml.dist | 3 +- tests/DemosTest.php | 2 +- 10 files changed, 70 insertions(+), 129 deletions(-) delete mode 100644 phpunit-mssql.xml.dist delete mode 100644 phpunit-mysql.xml.dist diff --git a/.github/workflows/test-unit.yml b/.github/workflows/test-unit.yml index 306a63aae4..e2ea27c4fb 100644 --- a/.github/workflows/test-unit.yml +++ b/.github/workflows/test-unit.yml @@ -22,15 +22,13 @@ jobs: type: 'CodingStyle' - php: 'latest' type: 'StaticAnalysis' - env: - LOG_COVERAGE: "" steps: - name: Checkout uses: actions/checkout@v2 - name: Configure PHP run: | - if [ -n "$LOG_COVERAGE" ]; then echo "xdebug.mode=coverage" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini; else rm /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini; fi + rm /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini php --version - name: Setup cache 1/2 @@ -56,19 +54,11 @@ jobs: - name: Init run: | mkdir -p build/logs - php demos/_demo-data/create-db.php - name: "Run tests: SQLite (only for Phpunit)" - if: matrix.type == 'Phpunit' + if: startsWith(matrix.type, 'Phpunit') run: | - if [ -n "$LOG_COVERAGE" ]; then - cp tools/CoverageUtil.php demos - mkdir coverage - vendor/bin/phpunit --exclude-group none --coverage-text -v - ls -l coverage | wc -l && mv coverage/* build/logs - else - vendor/bin/phpunit --exclude-group none --no-coverage -v - fi + vendor/bin/phpunit --exclude-group none --no-coverage -v - name: Check Coding Style (only for CodingStyle) if: matrix.type == 'CodingStyle' @@ -100,12 +90,26 @@ jobs: services: mysql: image: mysql:8 - options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=5 -e MYSQL_ROOT_PASSWORD=atk4_pass_root -e MYSQL_USER=atk4_test -e MYSQL_PASSWORD=atk4_pass -e MYSQL_DATABASE=atk4_test__data --entrypoint sh mysql:8 -c "exec docker-entrypoint.sh mysqld --default-authentication-plugin=mysql_native_password" + options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=5 -e MYSQL_ROOT_PASSWORD=atk4_pass_root -e MYSQL_USER=atk4_test -e MYSQL_PASSWORD=atk4_pass -e MYSQL_DATABASE=atk4_test --entrypoint sh mysql:8 -c "exec docker-entrypoint.sh mysqld --default-authentication-plugin=mysql_native_password" + mariadb: + image: mariadb + options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=5 -e MYSQL_ROOT_PASSWORD=atk4_pass_root -e MYSQL_USER=atk4_test -e MYSQL_PASSWORD=atk4_pass -e MYSQL_DATABASE=atk4_test + postgres: + image: postgres:12-alpine + env: + POSTGRES_USER: atk4_test + POSTGRES_PASSWORD: atk4_pass + POSTGRES_DB: atk4_test + options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 mssql: image: mcr.microsoft.com/mssql/server env: ACCEPT_EULA: Y SA_PASSWORD: atk4_pass + oracle: + image: wnameless/oracle-xe-11g-r2 + env: + ORACLE_ALLOW_REMOTE: true steps: - name: Checkout @@ -140,40 +144,54 @@ jobs: - name: Init run: | - mkdir -p build/logs php -r '(new PDO("mysql:host=mysql", "root", "atk4_pass_root"))->exec("ALTER USER '"'"'atk4_test'"'"'@'"'"'%'"'"' WITH MAX_USER_CONNECTIONS 5");' - php demos/_demo-data/create-db.php + php -r '(new PDO("mysql:host=mariadb", "root", "atk4_pass_root"))->exec("ALTER USER '"'"'atk4_test'"'"'@'"'"'%'"'"' WITH MAX_USER_CONNECTIONS 5");' + php -r '(new PDO("pgsql:host=postgres;dbname=atk4_test", "atk4_test", "atk4_pass"))->exec("ALTER ROLE atk4_test CONNECTION LIMIT 1");' + sed -E "s/\(('sqlite:.+)\);/(\$_ENV['DB_DSN'] ?? \\1, \$_ENV['DB_USER'] ?? null, \$_ENV['DB_PASSWD'] ?? null);/g" -i demos/db.default.php + if [ -n "$LOG_COVERAGE" ]; then + mkdir coverage + cp tools/CoverageUtil.php demos + fi - name: "Run tests: SQLite (only for Phpunit)" if: startsWith(matrix.type, 'Phpunit') run: | - if [ -n "$LOG_COVERAGE" ]; then - cp tools/CoverageUtil.php demos - mkdir coverage - vendor/bin/phpunit --exclude-group none --coverage-text -v - ls -l coverage | wc -l && mv coverage/* build/logs - else - vendor/bin/phpunit --exclude-group none --no-coverage -v - fi + php demos/_demo-data/create-db.php + vendor/bin/phpunit --exclude-group none $(if [ -n "$LOG_COVERAGE" ]; then echo --coverage-text; else echo --no-coverage; fi) -v + mv coverage/phpunit.cov coverage/phpunit-sqlite.cov - name: "Run tests: MySQL (only for Phpunit)" if: startsWith(matrix.type, 'Phpunit') - run: "vendor/bin/phpunit --configuration phpunit-mysql.xml.dist --exclude-group none --no-coverage -v" + env: + DB_DSN: "mysql:dbname=atk4_test;host=mysql" + DB_USER: atk4_test + DB_PASSWD: atk4_pass + run: | + php demos/_demo-data/create-db.php + vendor/bin/phpunit --exclude-group none $(if [ -n "$LOG_COVERAGE" ]; then echo --coverage-text; else echo --no-coverage; fi) -v + mv coverage/phpunit.cov coverage/phpunit-mysql.cov - name: "Run tests: MSSQL (only for Phpunit)" if: startsWith(matrix.type, 'Phpunit') - run: "vendor/bin/phpunit --configuration phpunit-mssql.xml.dist --exclude-group none --no-coverage -v" + env: + DB_DSN: "sqlsrv:Server=mssql;Database=master" + DB_USER: sa + DB_PASSWD: atk4_pass + run: | + php demos/_demo-data/create-db.php + vendor/bin/phpunit --exclude-group none $(if [ -n "$LOG_COVERAGE" ]; then echo --coverage-text; else echo --no-coverage; fi) -v + mv coverage/phpunit.cov coverage/phpunit-mssql.cov - name: Upload coverage logs 1/2 (only for latest Phpunit) if: env.LOG_COVERAGE - run: vendor/bin/phpcov merge build/logs/ --clover build/logs/cc.xml + run: ls -l coverage | wc -l && vendor/bin/phpcov merge coverage/ --clover merged.xml - name: Upload coverage logs 2/2 (only for latest Phpunit) if: env.LOG_COVERAGE uses: codecov/codecov-action@v1 with: token: ${{ secrets.CODECOV_TOKEN }} - file: build/logs/cc.xml + file: merged.xml behat-test: name: Behat @@ -217,7 +235,7 @@ jobs: uses: actions/cache@v1 with: path: ${{ steps.composer-cache.outputs.dir }} - key: ${{ runner.os }}-composer-${{ matrix.php }}-${{ matrix.type }}-${{ hashFiles('composer.json') }} + key: ${{ runner.os }}-composer-behat-${{ matrix.php }}-${{ matrix.type }}-${{ hashFiles('composer.json') }} restore-keys: | ${{ runner.os }}-composer- @@ -272,7 +290,6 @@ jobs: - name: Init run: | mkdir -p build/logs - php demos/_demo-data/create-db.php sed -i "s~'https://raw.githack.com/atk4/ui/develop/public.*~'/public',~" src/App.php - name: "Run tests: Behat" @@ -287,6 +304,7 @@ jobs: sed -i 's/usleep(100000)/usleep(5000)/' vendor/behat/mink/src/Element/Element.php sed -i 's/usleep(100000)/usleep(5000)/' vendor/behat/mink-selenium2-driver/src/Selenium2Driver.php + php demos/_demo-data/create-db.php if [ -n "$LOG_COVERAGE" ]; then cp tools/CoverageUtil.php demos mkdir coverage diff --git a/.gitignore b/.gitignore index 8d8618e75e..651bdf1d4f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,10 @@ -docs/build -/build +/docs/build +/coverage /vendor /composer.lock .idea nbproject +.vscode .DS_Store local @@ -19,7 +20,6 @@ cache /demos/_demo-data/db.sqlite /demos/_demo-data/db.sqlite-journal /phpunit.xml -/phpunit-*.xml /behat.yml package-lock.json @@ -29,5 +29,3 @@ package-lock.json *.bak *.codekit3 yarn.lock -/coverage -/demos/test/ diff --git a/demos/Dockerfile b/demos/Dockerfile index de39ea549a..18b2ad5dc0 100644 --- a/demos/Dockerfile +++ b/demos/Dockerfile @@ -43,4 +43,4 @@ COPY demos demos COPY demos/db.default.php demos RUN php demos/_demo-data/create-db.php -RUN sed -E "s/\(('sqlite:.+')\);/(\$_ENV['DB_DSN'] ?? \\1);/g" -i demos/db.default.php +RUN sed -E "s/\(('sqlite:.+)\);/(\$_ENV['DB_DSN'] ?? \\1, \$_ENV['DB_USER'] ?? null, \$_ENV['DB_PASSWD'] ?? null);/g" -i demos/db.default.php diff --git a/demos/_demo-data/create-db.php b/demos/_demo-data/create-db.php index 1928d8a0e5..d71433183b 100644 --- a/demos/_demo-data/create-db.php +++ b/demos/_demo-data/create-db.php @@ -10,11 +10,13 @@ require_once __DIR__ . '/../init-autoloader.php'; $sqliteFile = __DIR__ . '/db.sqlite'; -if (file_exists($sqliteFile)) { - unlink($sqliteFile); +if (!file_exists($sqliteFile)) { + new \Atk4\Data\Persistence\Sql('sqlite:' . $sqliteFile); } +unset($sqliteFile); -$persistence = new \Atk4\Data\Persistence\Sql('sqlite:' . $sqliteFile); +/** @var \Atk4\Data\Persistence\Sql $db */ +require_once __DIR__ . '/../init-db.php'; class ImportModelWithPrefixedFields extends Model { @@ -49,7 +51,7 @@ public function import(array $rowsMulti) } } -$model = new ImportModelWithPrefixedFields($persistence, ['table' => 'client']); +$model = new ImportModelWithPrefixedFields($db, ['table' => 'client']); $model->addField('name', ['type' => 'string']); $model->addField('addresses', ['type' => 'text']); $model->addField('accounts', ['type' => 'text']); @@ -59,7 +61,7 @@ public function import(array $rowsMulti) ['id' => 2, 'name' => 'Jane', 'addresses' => null, 'accounts' => null], ]); -$model = new ImportModelWithPrefixedFields($persistence, ['table' => 'country']); +$model = new ImportModelWithPrefixedFields($db, ['table' => 'country']); $model->addField('iso', ['type' => 'string']); // should be CHAR(2) NOT NULL $model->addField('name', ['type' => 'string']); $model->addField('nicename', ['type' => 'string']); @@ -322,7 +324,7 @@ public function import(array $rowsMulti) ['id' => 253, 'iso' => 'SS', 'name' => 'SOUTH SUDAN', 'nicename' => 'South Sudan', 'iso3' => 'SSD', 'numcode' => 728, 'phonecode' => 211], ]); -$model = new ImportModelWithPrefixedFields($persistence, ['table' => 'file']); +$model = new ImportModelWithPrefixedFields($db, ['table' => 'file']); $model->addField('name', ['type' => 'string']); $model->addField('type', ['type' => 'string']); $model->addField('is_folder', ['type' => 'boolean']); @@ -393,7 +395,7 @@ public function import(array $rowsMulti) ['id' => 61, 'name' => 'Button.php', 'type' => 'php', 'is_folder' => 0, 'parent_folder_id' => 46], ]); -$model = new ImportModelWithPrefixedFields($persistence, ['table' => 'stat']); +$model = new ImportModelWithPrefixedFields($db, ['table' => 'stat']); $model->addField('project_name', ['type' => 'string']); $model->addField('project_code', ['type' => 'string']); $model->addField('description', ['type' => 'text']); @@ -432,7 +434,7 @@ public function import(array $rowsMulti) } $model->import($data); -$model = new ImportModelWithPrefixedFields($persistence, ['table' => 'product_category']); +$model = new ImportModelWithPrefixedFields($db, ['table' => 'product_category']); $model->addField('name', ['type' => 'string']); (new Migration($model))->create(); $model->import([ @@ -441,7 +443,7 @@ public function import(array $rowsMulti) ['id' => 3, 'name' => 'Dairy'], ]); -$model = new ImportModelWithPrefixedFields($persistence, ['table' => 'product_sub_category']); +$model = new ImportModelWithPrefixedFields($db, ['table' => 'product_sub_category']); $model->addField('name', ['type' => 'string']); $model->addField('product_category_id', ['type' => 'bigint']); (new Migration($model))->create(); @@ -457,7 +459,7 @@ public function import(array $rowsMulti) ['id' => 9, 'name' => 'Sugar/Sweetened', 'product_category_id' => 2], ]); -$model = new ImportModelWithPrefixedFields($persistence, ['table' => 'product']); +$model = new ImportModelWithPrefixedFields($db, ['table' => 'product']); $model->addField('name', ['type' => 'string']); $model->addField('brand', ['type' => 'string']); $model->addField('product_category_id', ['type' => 'bigint']); diff --git a/demos/init-db.php b/demos/init-db.php index 08480edd76..be06c107b3 100644 --- a/demos/init-db.php +++ b/demos/init-db.php @@ -9,13 +9,11 @@ use Mvorisek\Atk4\Hintable\Data\HintablePropertyDef; try { - if (file_exists(__DIR__ . '/db.php')) { - require_once __DIR__ . '/db.php'; - } else { - require_once __DIR__ . '/db.default.php'; - } + require_once file_exists(__DIR__ . '/db.php') + ? __DIR__ . '/db.php' + : __DIR__ . '/db.default.php'; } catch (\PDOException $e) { - // do not pass $e unless you can secure DSN! + // do not show $e unless you can secure DSN! throw (new \Atk4\Ui\Exception('This demo requires access to the database. See "demos/init-db.php"')) ->addMoreInfo('PDO error', $e->getMessage()); } diff --git a/js/.gitignore b/js/.gitignore index 8d4b614bdd..02ce197ee2 100644 --- a/js/.gitignore +++ b/js/.gitignore @@ -29,8 +29,4 @@ build/Release # https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git node_modules -# Remove some common IDE working directories -.idea -.vscode - lib diff --git a/phpunit-mssql.xml.dist b/phpunit-mssql.xml.dist deleted file mode 100644 index 2a77358d17..0000000000 --- a/phpunit-mssql.xml.dist +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - tests - tests/DemosTest.php - tests/DemosHttpTest.php - tests/DemosHttpNoExitTest.php - tests/DemosTest.php - tests/DemosHttpTest.php - tests/DemosHttpNoExitTest.php - - - - - demos_http - - - - - - - - src - - - - - - diff --git a/phpunit-mysql.xml.dist b/phpunit-mysql.xml.dist deleted file mode 100644 index 803414a2e7..0000000000 --- a/phpunit-mysql.xml.dist +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - tests - tests/DemosTest.php - tests/DemosHttpTest.php - tests/DemosHttpNoExitTest.php - tests/DemosTest.php - tests/DemosHttpTest.php - tests/DemosHttpNoExitTest.php - - - - - demos_http - - - - - - - - src - - - - - - diff --git a/phpunit.xml.dist b/phpunit.xml.dist index f488d07243..c3534ac438 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -3,7 +3,6 @@ - @@ -29,7 +28,7 @@ src - + diff --git a/tests/DemosTest.php b/tests/DemosTest.php index ab93187897..0ed843d89a 100644 --- a/tests/DemosTest.php +++ b/tests/DemosTest.php @@ -235,7 +235,7 @@ protected function getPathWithAppVars(string $path): string public function demoFilesProvider(): array { $excludeDirs = ['_demo-data', '_includes']; - $excludeFiles = ['layout/layouts_error.php']; + $excludeFiles = ['layout/layouts_error.php', 'form-control/multiline-containsmany.php' /* TODO fix for MySQL */]; $files = []; $files[] = 'index.php';