diff --git a/.github/workflows/codecept.yml b/.github/workflows/codecept.yml new file mode 100644 index 0000000..2f21fc2 --- /dev/null +++ b/.github/workflows/codecept.yml @@ -0,0 +1,104 @@ +name: Codeception +on: + workflow_call: + inputs: + php_versions: + required: true + type: string +jobs: + # Run tests in the matrix + tests: + runs-on: ${{ matrix.operating-system }} + strategy: + matrix: + operating-system: ["ubuntu-latest"] + php-versions: ${{ fromJSON(inputs.php_versions) }} + db: ["mysql", "pgsql"] + name: PHP ${{ matrix.php-versions }} on ${{ matrix.db }} + env: + PHP_EXTENSIONS: ctype,curl,dom,iconv,imagick,intl,json,mbstring,openssl,pcre,pdo,reflection,spl,zip + services: + # Install Postgres + pgsql: + image: postgres:latest + env: + POSTGRES_USER: root + POSTGRES_PASSWORD: mysecretpassword + POSTGRES_DB: craft_test + ports: + - 5432:5432 + # Set health checks to wait until Postgres has started + options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 3 + # Install MySQL + mysql: + image: bitnami/mysql:latest + env: + MYSQL_ROOT_PASSWORD: mysecretpassword + MYSQL_DATABASE: craft_test + MYSQL_AUTHENTICATION_PLUGIN: mysql_native_password + # Set health checks to wait until mysql has started + options: --health-cmd="mysqladmin ping" --health-interval 10s --health-timeout 5s --health-retries 5 + ports: + - 3306:3306 + steps: + - name: Checkout + uses: actions/checkout@v3 + - name: Set default test command environment variable + run: | + echo "TEST_COMMAND=./vendor/bin/codecept run unit,functional --fail-fast" >> $GITHUB_ENV +# - name: Set test command for the code coverage environment +# run: | +# echo "TEST_COMMAND=./vendor/bin/codecept run unit,functional --fail-fast --coverage-xml coverage.xml;" >> $GITHUB_ENV +# if: ${{ (matrix.php-versions == '8.1' || matrix.php-versions == '8.2') && matrix.db == 'mysql' && (github.ref == 'refs/heads/main' || github.ref == 'refs/heads/develop') }} + - name: Setup cache environment + id: extcache + uses: shivammathur/cache-extensions@v1 + with: + php-version: ${{ matrix.php-versions }} + extensions: ${{ env.PHP_EXTENSIONS }} + key: extension-cache-v4 # change to clear the extension cache. + - name: Cache extensions + uses: actions/cache@v3 + with: + path: ${{ steps.extcache.outputs.dir }} + key: ${{ steps.extcache.outputs.key }} + restore-keys: ${{ steps.extcache.outputs.key }} + - name: Setup PHP + id: setup-php + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php-versions }} + extensions: ${{ env.PHP_EXTENSIONS }} + ini-values: post_max_size=256M, max_execution_time=180, memory_limit=512M + ini-file: development + tools: composer:v2 +# env: +# COMPOSER_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: Print PHP version + run: echo ${{ steps.setup-php.outputs.php-version }} + - name: Setup problem matchers for PHP + run: echo "::add-matcher::${{ runner.tool_cache }}/php.json" + - name: Copy tests .env + run: cp ./tests/.env.example.${{ matrix.db }} ./tests/.env + - name: Update .env creds + run: sed -i 's/DB_PASSWORD=/DB_PASSWORD=mysecretpassword/' tests/.env + - name: Cache Composer dependencies + id: composer-cache + run: echo "::set-output name=dir::$(composer config cache-files-dir)" + - uses: actions/cache@v3 + with: + path: ${{ steps.composer-cache.outputs.dir }} + key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} + restore-keys: ${{ runner.os }}-composer- + - name: Install Composer dependencies + run: composer install --no-interaction --no-ansi --no-progress + - name: MySQL import timezones + if: ${{ matrix.db == 'mysql' }} + run: | + mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql --host=127.0.0.1 --port=3306 --user=root --password=mysecretpassword mysql + - name: Run tests + run: ${{ env.TEST_COMMAND }} + # Only upload code coverage in specific scenarios +# - name: Upload coverage to Codecov +# if: ${{ (matrix.php-versions == '8.1' || matrix.php-versions == '8.2') && matrix.db == 'mysql' && (github.ref == 'refs/heads/main' || github.ref == 'refs/heads/develop') }}}} +# uses: codecov/codecov-action@v2 diff --git a/tests/env.example.mysql b/tests/env.example.mysql new file mode 100644 index 0000000..2be345a --- /dev/null +++ b/tests/env.example.mysql @@ -0,0 +1,15 @@ +APP_ID=CraftCMS +SECURITY_KEY=UPzGqJJMCTM4n07jkqaFNaVoof6j_Xgo + +DB_DRIVER=mysql +DB_SERVER=127.0.0.1 +DB_PORT=3306 +DB_DATABASE=craft_test +DB_USER=root +DB_PASSWORD= +DB_SCHEMA="public" + +# Set this to the `entryUrl` param in the `codeception.yml` file. +DEFAULT_SITE_URL="https://test.craftcms.test/index.php" +FROM_EMAIL_NAME="Craft CMS" +FROM_EMAIL_ADDRESS="info@craftcms.com" \ No newline at end of file diff --git a/tests/env.example.pgsql b/tests/env.example.pgsql new file mode 100644 index 0000000..aa67c08 --- /dev/null +++ b/tests/env.example.pgsql @@ -0,0 +1,15 @@ +APP_ID=CraftCMS +SECURITY_KEY=UPzGqJJMCTM4n07jkqaFNaVoof6j_Xgo + +DB_DRIVER=pgsql +DB_SERVER=127.0.0.1 +DB_PORT=5432 +DB_DATABASE=craft_test +DB_USER=root +DB_PASSWORD= +DB_SCHEMA="public" + +# Set this to the `entryUrl` param in the `codeception.yml` file. +DEFAULT_SITE_URL="https://test.craftcms.test/index.php" +FROM_EMAIL_NAME="Craft CMS" +FROM_EMAIL_ADDRESS="info@craftcms.com" \ No newline at end of file