Skip to content

Clean up code and improve test suite #822

Clean up code and improve test suite

Clean up code and improve test suite #822

Workflow file for this run

name: Test Suite
on:
push:
branches: [ "master", "develop", "stable", "release/**" ]
pull_request:
branches: [ "master", "develop", "stable", "release/**" ]
jobs:
coverage-tests:
runs-on: ubuntu-latest
name: Run tests with coverage
steps:
- uses: shivammathur/setup-php@v2
with:
php-version: "8.1"
coverage: xdebug
extensions:
fileinfo
- uses: actions/checkout@v4
- name: Cache Composer packages
id: composer-cache
uses: actions/cache@v4
with:
path: vendor
key: ${{ runner.os }}-php-${{ hashFiles('**/composer.lock') }}
restore-keys: |
${{ runner.os }}-php-
- name: Install dependencies
run: composer install --no-interaction --no-progress --no-suggest --prefer-dist
- name: Execute tests (Unit and Feature tests) via Pest
run: vendor/bin/pest --coverage --coverage-clover ./coverage.xml
- name: Upload coverage reports to Codecov
uses: codecov/codecov-action@v4
with:
token: ${{ secrets.CODECOV_TOKEN }}
run-tests:
needs: coverage-tests
if: contains(github.event.pull_request.labels.*.name, 'halt-matrix-tests') != true
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
php: [8.1, 8.2, 8.3]
runs-on: ${{ matrix.os }}
name: Run tests - ${{ matrix.os }} ${{ matrix.php }}
steps:
- uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php }}
extensions: fileinfo
- uses: actions/checkout@v4
- name: Validate composer.json and composer.lock
run: composer validate --strict
- name: Cache Composer packages
id: composer-cache
uses: actions/cache@v4
with:
path: vendor
key: ${{ runner.os }}-php-${{ hashFiles('**/composer.lock') }}
restore-keys: |
${{ runner.os }}-php-
- name: Install dependencies
run: composer install --no-interaction --no-progress --no-suggest --prefer-dist
- name: Execute tests (Unit and Feature tests) via Pest
run: vendor/bin/pest
build-executable:
runs-on: ubuntu-latest
name: Build standalone executable
steps:
- uses: actions/checkout@v4
- name: Cache Composer packages
id: composer-cache
uses: actions/cache@v4
with:
path: vendor
key: ${{ runner.os }}-php-${{ hashFiles('**/composer.lock') }}
restore-keys: |
${{ runner.os }}-php-
- name: Install dependencies
run: composer install --no-interaction --no-progress --no-suggest --prefer-dist
- name: Get build version
id: build-version
run: |
echo "sha_short=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT
echo "Version: ${{ steps.build-version.outputs.sha_short }}"
- name: Build executable
run: php hyde standalone:build --build-version-suffix="${{ steps.build-version.outputs.sha_short }}"
- name: Verify executable
run: php builds/hyde
- name: Verify executable version
run: php builds/hyde --version
- name: Upload executable
uses: actions/upload-artifact@v4
with:
name: hyde
path: builds/hyde
test-executable:
needs: build-executable
if: contains(github.event.pull_request.labels.*.name, 'halt-matrix-tests') != true
strategy:
fail-fast: false
matrix:
os: [ ubuntu-latest, macos-latest, windows-latest ]
php: [ 8.1, 8.2, 8.3 ]
runs-on: ${{ matrix.os }}
name: Test executable - ${{ matrix.os }} ${{ matrix.php }}
steps:
- uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php }}
extensions: fileinfo
- uses: actions/checkout@v4
with:
path: ./source
- uses: actions/download-artifact@v4
with:
name: hyde
path: .
- name: Install standalone executable (Linux and macOS)
if: ${{ matrix.os != 'windows-latest' }}
run: |
sudo mv hyde /usr/local/bin/hyde
chmod +x /usr/local/bin/hyde
- name: Install standalone executable (Windows)
if: ${{ matrix.os == 'windows-latest' }}
run: |
move hyde C:\Windows\System32\hyde.phar
echo '@php "%~dp0hyde.phar" %*' > hyde.cmd
move hyde.cmd C:\Windows\System32\hyde.cmd
- name: Verify executable is installed
run: hyde
- name: Test can run standalone
run: |
php ./source/tests/System/bin/Assert.php "str_contains(shell_exec('hyde --version --no-ansi'), 'HydePHP')"
php ./source/tests/System/bin/Assert.php "str_contains(shell_exec('hyde --version'), 'Experimental Standalone')"
php ./source/tests/System/bin/Assert.php "str_contains(shell_exec('hyde --no-ansi'), 'USAGE: <command> [options] [arguments]')"
php ./source/tests/System/bin/Assert.php "str_contains_all(shell_exec('hyde --no-ansi'), ['new', 'Create a new Hyde project.'])"
php ./source/tests/System/bin/Assert.php "! str_contains(shell_exec('hyde --no-ansi'), 'Build the standalone executable')"
- name: Test can run in anonymous project
run: |
cd ./source/tests/Fixtures/anonymous-project
php generate.php
php ../../System/bin/Assert.php "str_contains(shell_exec('hyde --version'), 'Experimental Standalone')"
php ../../System/bin/Assert.php "str_contains_all(shell_exec('hyde route:list'), ['_pages/demo.html', '_pages/index.blade.php', '_pages/about.md', '_posts/hello-world.md', '_docs/index.md'])"
- name: Test can build anonymous project
run: |
cd ./source/tests/Fixtures/anonymous-project
php ../../System/bin/Assert.php "str_contains(shell_exec('hyde build'), 'Your static site has been built!')"
php ../../System/bin/Assert.php "file_exists_and_is_not_empty('_site/posts/hello-world.html')"
php ../../System/bin/Assert.php "file_exists_and_is_not_empty('_site/docs/search.html')"
php ../../System/bin/Assert.php "file_exists_and_is_not_empty('_site/docs/search.json')"
php ../../System/bin/Assert.php "file_exists_and_is_not_empty('_site/docs/index.html')"
php ../../System/bin/Assert.php "file_exists_and_is_not_empty('_site/media/app.css')"
# php ../../System/bin/Assert.php "file_exists_and_is_not_empty('_site/sitemap.xml')" # Requires a site URL in v1.6
php ../../System/bin/Assert.php "file_exists_and_is_not_empty('_site/index.html')"
php ../../System/bin/Assert.php "file_exists_and_is_not_empty('_site/about.html')"
php ../../System/bin/Assert.php "file_exists_and_is_not_empty('_site/demo.html')"
php ../../System/bin/Assert.php "file_exists_and_is_not_empty('_site/feed.xml')"
- name: Test standalone proxies full project file
run: |
cd ./source/tests/Fixtures/full-project
php ../../System/bin/Assert.php "! str_contains(shell_exec('hyde --version'), 'Experimental Standalone')"
php ../../System/bin/Assert.php "str_contains(shell_exec('hyde'), 'File proxied by standalone')"
test-realtime-compiler:
needs: build-executable
runs-on: ubuntu-latest
name: Test realtime compiler through executable
steps:
- uses: shivammathur/setup-php@v2
with:
php-version: 8.1
extensions: fileinfo
- uses: actions/download-artifact@v4
with:
name: hyde
path: .
- name: Install standalone executable
run: sudo mv hyde /usr/local/bin/hyde && chmod +x /usr/local/bin/hyde
- name: Set up project
run: mkdir _pages && echo "Hello World" > _pages/index.md
- name: Start server
run: hyde serve &
- name: Verify server is running
run: curl -sS localhost:8080 | grep -q "Hello World"
- name: Test dashboard can be accessed
run: curl -sS localhost:8080/dashboard | grep -q "HydePHP - Dashboard"
test-live-executable-proxying:
needs: build-executable
strategy:
fail-fast: false
matrix:
branch: [ master, develop ]
runs-on: ubuntu-latest
name: Test live executable proxying (hyde@${{ matrix.branch }})
steps:
- uses: shivammathur/setup-php@v2
with:
php-version: 8.1
extensions: fileinfo
- uses: actions/download-artifact@v4
with:
name: hyde
path: .
- name: Install standalone executable
run: sudo mv hyde /usr/local/bin/hyde && chmod +x /usr/local/bin/hyde
- name: Checkout Assert.php
uses: actions/checkout@v4
with:
sparse-checkout: |
tests/System/bin/Assert.php
sparse-checkout-cone-mode: false
- name: Set up assertion helper
run: sudo mv tests/System/bin/Assert.php /usr/local/bin/assert && sudo chmod +x /usr/local/bin/assert
- name: Download executable proxy
run: curl -sS https://raw.githubusercontent.com/hydephp/hyde/${{ matrix.branch }}/hyde > hyde && chmod +x hyde
- name: Set up mock support files
run: |
# Create fake composer vendor autoload file
mkdir vendor && echo '<?php set_error_handler(function($errno,$errstr,$errfile,$errline){throw new \ErrorException($errstr,0,$errno,$errfile,$errline);});return[];' > vendor/autoload.php
# Create fake app bootstrap file
mkdir app && echo "<?php namespace{echo 'Hello World'.PHP_EOL;return new class{public function make(){return new class{public function handle(){return 0;}public function terminate(){return 0;}};}};}namespace Symfony\Component\Console\Input{class ArgvInput{}}namespace Symfony\Component\Console\Output{class ConsoleOutput{}}" > app/bootstrap.php
- name: Test can run Hyde
run: hyde |& tee output.txt
- name: Test returned output
run: assert "str_contains(file_get_contents('output.txt'), 'Hello World')"
- name: Test output contains no errors
run: |
assert "! str_contains(file_get_contents('output.txt'), 'Error')"
assert "! str_contains(file_get_contents('output.txt'), 'Warning')"
assert "! str_contains(file_get_contents('output.txt'), 'Notice')"
standalone-integration-tests:
needs: build-executable
runs-on: ubuntu-latest
name: High-level integration tests
steps:
- uses: shivammathur/setup-php@v2
with:
php-version: 8.1
extensions: fileinfo
- uses: actions/download-artifact@v4
with:
name: hyde
path: .
- name: Install standalone executable
run: sudo mv hyde /usr/local/bin/hyde && chmod +x /usr/local/bin/hyde
- name: Checkout Assert.php
uses: actions/checkout@v4
with:
sparse-checkout: |
tests/System/bin/Assert.php
sparse-checkout-cone-mode: false
- name: Set up assertion helper
run: sudo mv tests/System/bin/Assert.php /usr/local/bin/assert && sudo chmod +x /usr/local/bin/assert
- name: Test assertion helper
run: assert "str_contains('Hello World', 'Hello')"
- name: Test can run Hyde
run: assert "command_outputs('', 'Experimental Standalone')"
- name: Test can publish homepage
run: |
assert "command_outputs('publish:homepage posts', 'Published page [posts]')"
assert "file_exists_and_is_not_empty('_pages/index.blade.php')"
assert "file_contains('_pages/index.blade.php', 'Latest Posts')"
- name: Test can scaffold pages
run: |
assert "command_outputs('make:page &qt;My documentation page&qt; --type=docs', 'Creating a new Docs page with title: My documentation page')"
assert "file_exists_and_is_not_empty('_docs/my-documentation-page.md')"
assert "file_contains('_docs/my-documentation-page.md', '# My documentation page')"
- name: Test can scaffold posts
run: |
assert "command_outputs('make:post -n', 'Creating a new post!', 'Post created! File is saved to _posts/my-new-post.md')"
assert "file_exists_and_is_not_empty('_posts/my-new-post.md')"
assert "file_contains('_posts/my-new-post.md', &qt;title: 'My New Post'&qt;, '## Write something awesome.')"
- name: Test can build site
run: |
assert "command_outputs('build', 'Your static site has been built!')"
assert "file_exists_and_is_not_empty('_site/index.html')"
assert "file_exists_and_is_not_empty('_site/posts/my-new-post.html')"
assert "file_exists_and_is_not_empty('_site/docs/my-documentation-page.html')"
- name: Site uses Yaml configuration
run: |
echo "{{ config('hyde.name', 'null') }}" > _pages/site-name.blade.php
hyde rebuild _pages/site-name.blade.php
assert "file_contains('_site/site-name.html', 'HydePHP')"
echo "name: Hello World" > hyde.yml
hyde rebuild _pages/site-name.blade.php
assert "file_contains('_site/site-name.html', 'Hello World')"