diff --git a/PEPPOL_ARCHITECTURE.md b/.github/PEPPOL_ARCHITECTURE.md similarity index 100% rename from PEPPOL_ARCHITECTURE.md rename to .github/PEPPOL_ARCHITECTURE.md diff --git a/PEPPOL_TESTS_SUMMARY.md b/.github/PEPPOL_TESTS_SUMMARY.md similarity index 100% rename from PEPPOL_TESTS_SUMMARY.md rename to .github/PEPPOL_TESTS_SUMMARY.md diff --git a/.github/RUNNING_TESTS.md b/.github/RUNNING_TESTS.md new file mode 100644 index 000000000..b053e2ca1 --- /dev/null +++ b/.github/RUNNING_TESTS.md @@ -0,0 +1,235 @@ +# Running Tests in InvoicePlane v2 + +This guide covers how to run tests in InvoicePlane v2, including full test suites, smoke tests, and specific test groups. + +## Prerequisites + +```bash +composer install +cp .env.testing.example .env.testing +php artisan key:generate --env=testing +``` + +## Quick Reference + +### Run All Tests +```bash +# Using Laravel Artisan (recommended) +php artisan test + +# Using PHPUnit directly +./vendor/bin/phpunit +``` + +### Run Test Suites +```bash +# Run only Unit tests +php artisan test --testsuite=Unit + +# Run only Feature tests +php artisan test --testsuite=Feature +``` + +### Run Smoke Tests +Smoke tests are fast, critical tests that verify core functionality. They use the `#[Group('smoke')]` attribute. + +```bash +# Using PHPUnit with smoke configuration +php artisan test --configuration=phpunit.smoke.xml + +# Using --group flag +php artisan test --group=smoke + +# Run smoke tests for a specific module +./vendor/bin/phpunit Modules/Clients/Tests/Feature/ --group=smoke +``` + +### Run Tests with Coverage +```bash +# Generate coverage report +php artisan test --coverage + +# Generate HTML coverage report +php artisan test --coverage-html coverage/ + +# View coverage in browser +open coverage/index.html # macOS +xdg-open coverage/index.html # Linux +``` + +## Test Groups + +InvoicePlane v2 uses PHPUnit groups to organize tests: + +- `smoke` - Fast, critical tests (runs in ~10-30 seconds) +- `crud` - Create, Read, Update, Delete operation tests +- `peppol` - Peppol e-invoicing integration tests +- `integration` - Integration tests with external services + +### Run Specific Groups +```bash +# Smoke tests only +php artisan test --group=smoke + +# CRUD tests only +php artisan test --group=crud + +# Peppol tests only +php artisan test --group=peppol + +# Multiple groups +php artisan test --group=smoke,crud +``` + +## Module-Specific Tests + +### Run Tests for a Specific Module +```bash +# All tests for a module +./vendor/bin/phpunit Modules/Clients/Tests/ + +# Only Feature tests for a module +./vendor/bin/phpunit Modules/Clients/Tests/Feature/ + +# Only Unit tests for a module +./vendor/bin/phpunit Modules/Clients/Tests/Unit/ +``` + +### Examples +```bash +# Clients module +./vendor/bin/phpunit Modules/Clients/Tests/ + +# Invoices module +./vendor/bin/phpunit Modules/Invoices/Tests/ + +# Peppol-specific tests +./vendor/bin/phpunit Modules/Invoices/Tests/Unit/Peppol/ +``` + +## Individual Test Files + +```bash +# Run a specific test file +./vendor/bin/phpunit Modules/Clients/Tests/Feature/ContactsTest.php + +# Run a specific test method +./vendor/bin/phpunit --filter it_lists_contacts Modules/Clients/Tests/Feature/ContactsTest.php +``` + +## Debugging Tests + +### Stop on First Failure +```bash +php artisan test --stop-on-failure +``` + +### Verbose Output +```bash +php artisan test --verbose +``` + +### Run with Debug Mode +```bash +./vendor/bin/phpunit --debug +``` + +### Run Specific Test Method +```bash +# Using --filter +php artisan test --filter it_creates_invoice + +# Pattern matching +php artisan test --filter ".*creates.*" +``` + +## Parallel Testing + +For faster test execution, ParaTest can be used (if installed in the project): + +```bash +# Run tests in parallel (if ParaTest is available) +./vendor/bin/paratest + +# Run with specific number of processes +./vendor/bin/paratest --processes=4 +``` + +**Note:** ParaTest should be added to `composer.json` as a dev dependency if parallel testing is needed: + +```bash +composer require --dev brianium/paratest +``` + +## Configuration Files + +InvoicePlane v2 uses two PHPUnit configuration files: + +- `phpunit.xml` - Default configuration for all tests +- `phpunit.smoke.xml` - Configuration for smoke tests only + +### phpunit.xml +- Runs all Unit and Feature test suites +- Uses SQLite in-memory database +- Includes all test directories + +### phpunit.smoke.xml +- Filters tests by `#[Group('smoke')]` attribute +- Faster execution (~10-30 seconds) +- Ideal for CI/CD pipelines and post-deployment checks + +## Continuous Integration + +### GitHub Actions Workflows + +Smoke tests run automatically after Composer dependency updates: + +```bash +# See .github/workflows/composer-update.yml +``` + +Full test suite runs manually: + +```bash +# See .github/workflows/phpunit.yml +``` + +## Best Practices + +1. **Run smoke tests frequently** - They catch critical issues quickly +2. **Use `--stop-on-failure`** - When debugging to save time +3. **Run full suite before committing** - Ensure no regressions +4. **Use coverage reports** - To identify untested code +5. **Group tests logically** - Use `#[Group()]` for better organization + +## Troubleshooting + +### Tests Failing Due to Database Issues +```bash +# Ensure .env.testing is configured +cp .env.testing.example .env.testing +php artisan key:generate --env=testing + +# Check database connection +php artisan test --env=testing +``` + +### Memory Limit Issues +```bash +# Increase PHP memory limit +php -d memory_limit=512M artisan test +``` + +### Cache Issues +```bash +# Clear all caches +php artisan cache:clear +php artisan config:clear +php artisan view:clear +``` + +## See Also + +- [CONTRIBUTING.md](CONTRIBUTING.md) - Guidelines for contributing tests +- [TEST_GENERATION_SUMMARY.md](TEST_GENERATION_SUMMARY.md) - Test generation documentation +- [PEPPOL_TESTS_SUMMARY.md](PEPPOL_TESTS_SUMMARY.md) - Peppol-specific test documentation \ No newline at end of file diff --git a/TEST_GENERATION_SUMMARY.md b/.github/TEST_GENERATION_SUMMARY.md similarity index 100% rename from TEST_GENERATION_SUMMARY.md rename to .github/TEST_GENERATION_SUMMARY.md diff --git a/.github/actions/setup-php-composer/action.yml b/.github/actions/setup-php-composer/action.yml new file mode 100644 index 000000000..a4270eb5c --- /dev/null +++ b/.github/actions/setup-php-composer/action.yml @@ -0,0 +1,57 @@ +name: 'Setup PHP with Composer Caching' +description: 'Set up PHP environment and install Composer dependencies with intelligent caching' +inputs: + php-version: + description: 'PHP version to use' + required: false + default: '8.2' + php-extensions: + description: 'PHP extensions to install (comma-separated)' + required: false + default: 'mbstring, xml, ctype, json, fileinfo, pdo, sqlite, mysql, bcmath' + composer-flags: + description: 'Flags appended to the composer install command (e.g., --no-dev --optimize-autoloader). Used only when composer-args is empty.' + required: false + default: '--no-interaction --prefer-dist --optimize-autoloader' + composer-args: + description: 'Complete argument list passed directly to composer install. When non-empty, this overrides composer-flags and is used as-is.' + required: false + default: '' + working-directory: + description: 'Working directory for composer commands' + required: false + default: '.' + +runs: + using: 'composite' + steps: + - name: Set up PHP + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ inputs.php-version }} + extensions: ${{ inputs.php-extensions }} + coverage: none + + - name: Get Composer Cache Directory + id: composer-cache + shell: bash + working-directory: ${{ inputs.working-directory }} + run: echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT + + - name: Cache Composer dependencies + uses: actions/cache@v4 + with: + path: ${{ steps.composer-cache.outputs.dir }} + key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} + restore-keys: | + ${{ runner.os }}-composer- + + - name: Install Composer dependencies + shell: bash + working-directory: ${{ inputs.working-directory }} + run: | + if [ -n "${{ inputs.composer-args }}" ]; then + composer install ${{ inputs.composer-args }} + else + composer install ${{ inputs.composer-flags }} + fi diff --git a/.github/workflows/README.md b/.github/workflows/README.md index 827699a27..3d18d9c34 100644 --- a/.github/workflows/README.md +++ b/.github/workflows/README.md @@ -2,6 +2,37 @@ This directory contains GitHub Actions workflows for automated CI/CD tasks. +## Composite Actions + +### Setup PHP with Composer (`.github/actions/setup-php-composer`) + +A reusable composite action that sets up PHP and installs Composer dependencies with intelligent caching. + +**Benefits:** +- Reduces Composer install time from 8-12 seconds to 2-4 seconds (with cache hit) +- Consistent PHP and Composer setup across all workflows +- Centralized cache management + +**Usage:** +```yaml +- name: Setup PHP with Composer + uses: ./.github/actions/setup-php-composer + with: + php-version: '8.2' # Optional, defaults to 8.2 + php-extensions: 'mbstring, xml, json' # Optional + composer-flags: '--no-dev --optimize-autoloader' # Optional +``` + +**Used by:** +- `phpunit.yml` - Test execution +- `phpstan.yml` - Static analysis +- `pint.yml` - Code formatting +- `composer-update.yml` - Dependency updates +- `yarn-update.yml` - Frontend dependency updates +- `quickstart.yml` - Smoke tests + +**Note:** `release.yml` uses manual Composer caching (not this composite action) due to its custom production build flags (`--no-dev`). + ## Available Workflows ### 1. Production Release (`release.yml`) @@ -86,14 +117,22 @@ Artifacts are also available in the Actions tab for 90 days. **What it does:** 1. **Runs security audit** - Checks for known vulnerabilities 2. **Updates dependencies** - Based on selected update type -3. **Runs tests** - Executes unit tests to verify compatibility -4. **Runs static analysis** - PHPStan checks for type errors -5. **Creates pull request** - Automated PR with update details +3. **Runs smoke tests** - Fast verification after updates (if changes detected) +4. **Creates pull request** - Automated PR with update details **Update Types:** -- `security-only` - Only security fixes (default for scheduled runs) +- `security-patch` - Security and patch updates (default for scheduled runs) - `patch-minor` - Patch and minor version updates -- `all-dependencies` - All updates including major versions +- `all-dependencies` - All updates including major versions with `composer bump` + +**Smoke Tests:** + +After dependencies are updated, the workflow automatically runs smoke tests to verify core functionality: +- Only runs if `composer.lock` has changes +- Uses `phpunit.smoke.xml` configuration +- Executes tests marked with `#[Group('smoke')]` +- Continues even if tests fail (with `continue-on-error: true`) +- Typically completes in 10-30 seconds **Required Secrets:** diff --git a/.github/workflows/composer-update.yml b/.github/workflows/composer-update.yml index c0e0e45f1..09cfe2e8c 100644 --- a/.github/workflows/composer-update.yml +++ b/.github/workflows/composer-update.yml @@ -41,26 +41,11 @@ jobs: with: fetch-depth: 0 - - name: Setup PHP - uses: shivammathur/setup-php@v2 + - name: Setup PHP with Composer + uses: ./.github/actions/setup-php-composer with: php-version: '8.2' - extensions: mbstring, xml, ctype, json, fileinfo, pdo, sqlite, mysql - coverage: none - - - name: Get Composer Cache Directory - id: composer-cache - run: echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT - - - name: Cache Composer dependencies - uses: actions/cache@v4 - 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 --prefer-dist --optimize-autoloader + php-extensions: 'mbstring, xml, ctype, json, fileinfo, pdo, sqlite, mysql' - name: Run Composer audit id: audit @@ -89,18 +74,6 @@ jobs: run: | composer bump && composer update - # - name: Run smoke tests - # run: | - # cp .env.example .env - # php artisan key:generate - # php artisan test --group=smoke - - # - name: Run static analysis - # run: vendor/bin/phpstan analyse --no-progress --error-format=github || true - - # - name: Run code formatting - # run: vendor/bin/pint --test || true - - name: Check for changes id: check-changes run: | @@ -110,6 +83,14 @@ jobs: echo "changes_detected=true" >> $GITHUB_OUTPUT fi + - name: Run smoke tests + if: steps.check-changes.outputs.changes_detected == 'true' + run: | + cp .env.testing.example .env.testing + php artisan key:generate --env=testing + php artisan test --configuration=phpunit.smoke.xml --env=testing + continue-on-error: true + - name: Get updated packages if: steps.check-changes.outputs.changes_detected == 'true' id: updated-packages diff --git a/.github/workflows/phpstan.yml b/.github/workflows/phpstan.yml index 467f3ec53..f166effef 100644 --- a/.github/workflows/phpstan.yml +++ b/.github/workflows/phpstan.yml @@ -12,15 +12,12 @@ jobs: - name: Checkout repository uses: actions/checkout@v4 - - name: Set up PHP - uses: shivammathur/setup-php@v2 + - name: Setup PHP with Composer + uses: ./.github/actions/setup-php-composer with: - php-version: 8.2 - tools: composer - extensions: json - - - name: Install dependencies - run: composer install --prefer-dist --no-interaction --no-progress + php-version: '8.2' + php-extensions: 'json' + composer-flags: '--prefer-dist --no-interaction --no-progress' - name: Run PHPStan (JSON output) id: phpstan-analysis diff --git a/.github/workflows/phpunit.yml b/.github/workflows/phpunit.yml index f969731fa..62033c4b4 100644 --- a/.github/workflows/phpunit.yml +++ b/.github/workflows/phpunit.yml @@ -25,15 +25,12 @@ jobs: steps: - uses: actions/checkout@v4 - - name: Set up PHP - uses: shivammathur/setup-php@v2 + - name: Setup PHP with Composer + uses: ./.github/actions/setup-php-composer with: php-version: '8.3' - extensions: mbstring, bcmath, pdo_mysql - coverage: none - - - name: Install Composer dependencies - run: composer install --no-progress --prefer-dist --optimize-autoloader + php-extensions: 'mbstring, bcmath, pdo_mysql' + composer-flags: '--no-progress --prefer-dist --optimize-autoloader' - name: Prepare Laravel environment run: | diff --git a/.github/workflows/pint.yml b/.github/workflows/pint.yml index 20416a06d..52ebe7b94 100644 --- a/.github/workflows/pint.yml +++ b/.github/workflows/pint.yml @@ -31,13 +31,11 @@ jobs: ref: ${{ github.head_ref }} token: ${{ secrets.GITHUB_TOKEN }} - - name: Set up PHP - uses: shivammathur/setup-php@v2 + - name: Setup PHP with Composer + uses: ./.github/actions/setup-php-composer with: - php-version: 8.2 - - - name: Install dependencies - run: composer install --prefer-dist --no-interaction --no-progress + php-version: '8.2' + composer-flags: '--prefer-dist --no-interaction --no-progress' - name: Run Laravel Pint id: pint_run diff --git a/.github/workflows/quickstart.yml b/.github/workflows/quickstart.yml index 50f5aa676..d8405e4ea 100644 --- a/.github/workflows/quickstart.yml +++ b/.github/workflows/quickstart.yml @@ -35,10 +35,11 @@ jobs: - name: Checkout repository uses: actions/checkout@v4 - - name: Set up PHP - uses: shivammathur/setup-php@v2 + - name: Setup PHP with Composer + uses: ./.github/actions/setup-php-composer with: - php-version: 8.3 + php-version: '8.3' + composer-flags: '--prefer-dist --no-interaction' - name: Set up Node.js uses: actions/setup-node@v4 @@ -46,9 +47,6 @@ jobs: node-version: '22' cache: 'yarn' - - name: Install PHP dependencies - run: composer install --prefer-dist --no-interaction - - name: Install JS dependencies run: yarn install --frozen-lockfile diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 2c184c2d4..9e831b9e3 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -87,6 +87,18 @@ jobs: extensions: gd, bcmath, dom, intl, xml, zip, mbstring, pdo_mysql coverage: none + - name: Get Composer Cache Directory + id: composer-cache + run: echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT + + - name: Cache Composer dependencies + uses: actions/cache@v4 + with: + path: ${{ steps.composer-cache.outputs.dir }} + key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} + restore-keys: | + ${{ runner.os }}-composer- + - name: Install Composer dependencies (production) run: | set -e diff --git a/.github/workflows/yarn-update.yml b/.github/workflows/yarn-update.yml index 1ecc773b0..6e590adea 100644 --- a/.github/workflows/yarn-update.yml +++ b/.github/workflows/yarn-update.yml @@ -48,15 +48,11 @@ jobs: node-version: '20' cache: 'yarn' - - name: Setup PHP - uses: shivammathur/setup-php@v2 + - name: Setup PHP with Composer + uses: ./.github/actions/setup-php-composer with: php-version: '8.2' - extensions: mbstring, xml, ctype, json, fileinfo, pdo, sqlite, mysql - coverage: none - - - name: Install Composer dependencies - run: composer install --no-interaction --prefer-dist --optimize-autoloader + php-extensions: 'mbstring, xml, ctype, json, fileinfo, pdo, sqlite, mysql' - name: Check for package-lock.json conflicts id: lockfile-check diff --git a/CHECKLIST.md b/CHECKLIST.md deleted file mode 100644 index 550a7ba08..000000000 --- a/CHECKLIST.md +++ /dev/null @@ -1,53 +0,0 @@ -# Module Implementation Checklist - -This document tracks feature implementation and test coverage for each module in InvoicePlane V2. - -### Legend -- ✅ = Done -- 🚧 = In progress -- ⬜ = Not started -- N/A = Not applicable - ---- - -| Module | Submodule | Index | Statuses | Specials | Create | Update | Delete | Translations | -|------------|------------------|:-----:|:--------:|:--------:|:------:|:------:|:------:|:------------:| -| customers | | ✅ | ✅ | ⬜ | ✅ | ⬜ | ⬜ | ⬜ | -| | user_customers | N/A | N/A | ⬜ | ⬜ | ⬜ | ⬜ | ⬜ | -| contacts | | ✅ | ⬜ | ⬜ | ✅ | ⬜ | ⬜ | ⬜ | -| core | custom_fields | ⬜ | ⬜ | ⬜ | ⬜ | ⬜ | ⬜ | ⬜ | -| | custom_values | ⬜ | ⬜ | ⬜ | ⬜ | ⬜ | ⬜ | ⬜ | -| | dashboard | ✅ | N/A | ⬜ | ⬜ | ⬜ | ⬜ | ⬜ | -| | email_templates | ✅ | N/A | ⬜ | ⬜ | ⬜ | ⬜ | ⬜ | -| | guest | ⬜ | N/A | ⬜ | ⬜ | ⬜ | ⬜ | ⬜ | -| | import | ✅ | N/A | ⬜ | ⬜ | ⬜ | ⬜ | ⬜ | -| expenses | | ✅ | ⬜ | ⬜ | ✅ | ⬜ | ⬜ | ⬜ | -| invoices | | ✅ | ✅ | ⬜ | ✅ | ⬜ | ⬜ | ⬜ | -| | invoice_groups | ✅ | N/A | ⬜ | ⬜ | ⬜ | ⬜ | ⬜ | -| | tax_rates | ✅ | N/A | ⬜ | ⬜ | ⬜ | ⬜ | ⬜ | -| payments | | ✅ | ⬜ | ⬜ | ⬜ | ⬜ | ⬜ | ⬜ | -| | payment_methods | ✅ | N/A | ⬜ | ⬜ | ⬜ | ⬜ | ⬜ | -| products | | ✅ | N/A | ⬜ | ⬜ | ⬜ | ⬜ | ⬜ | -| | families | ✅ | N/A | ⬜ | ⬜ | ⬜ | ⬜ | ⬜ | -| | units | ✅ | N/A | ⬜ | ⬜ | ⬜ | ⬜ | ⬜ | -| projects | | ✅ | N/A | ⬜ | ⬜ | ⬜ | ⬜ | ⬜ | -| | tasks | ✅ | ⬜ | ⬜ | ⬜ | ⬜ | ⬜ | ⬜ | -| quotes | | ✅ | ✅ | ⬜ | ⬜ | ⬜ | ⬜ | ⬜ | -| reports | | N/A | N/A | ⬜ | ⬜ | ⬜ | ⬜ | ⬜ | -| users | | ✅ | ⬜ | ⬜ | ⬜ | ⬜ | ⬜ | ⬜ | - ---- - -### Special Notes - -#### Invoices -- [ ] Add test for overdue scope: `DATEDIFF(NOW, invoice_date_due) > 0 AND status NOT IN (1, 4)` -- [ ] Create special `overdue()` scope -- [ ] Translate invoice group labels - -#### Quotes -- [ ] Notes column skipped on index (not ported from CodeIgniter) - ---- - -_This file is regularly updated. Contributions should reference specific rows in this table._ diff --git a/README.md b/README.md index 264ecc057..1c20ed544 100644 --- a/README.md +++ b/README.md @@ -73,12 +73,12 @@ For detailed setup instructions, see [INSTALLATION.md](.github/INSTALLATION.md). - **[Installation Guide](.github/INSTALLATION.md)** - Complete setup instructions - **[Contributing Guide](.github/CONTRIBUTING.md)** - How to contribute code -- **[Testing Guide](RUNNING_TESTS.md)** - Running and writing tests +- **[Testing Guide](.github/RUNNING_TESTS.md)** - Running and writing tests - **[Maintenance Guide](.github/MAINTENANCE.md)** - Dependency management and security updates - **[Seeding Guide](.github/SEEDING.md)** - Database seeding instructions - **[Upgrade Guide](.github/UPGRADE.md)** - Upgrading from previous versions - **[Security Policy](.github/SECURITY.md)** - Reporting security vulnerabilities -- **[Peppol Architecture](PEPPOL_ARCHITECTURE.md)** - E-invoicing system details +- **[Peppol Architecture](.github/PEPPOL_ARCHITECTURE.md)** - E-invoicing system details - **[Workflows README](.github/workflows/README.md)** - GitHub Actions automation and secrets setup --- @@ -134,7 +134,7 @@ We welcome community contributions! To learn how to contribute code, create modules, write tests, or help translate the app: - Read the [Contributing Guide](.github/CONTRIBUTING.md) -- Follow the [Module Checklist](CHECKLIST.md) to avoid duplication +- Follow the [Module Checklist](.github/CHECKLIST.md) to avoid duplication - Review the [Junie Guidelines](.junie/guidelines.md) for coding standards - Check [Copilot Instructions](.github/copilot-instructions.md) for AI assistance diff --git a/RUNNING_TESTS.md b/RUNNING_TESTS.md deleted file mode 100644 index 2e8f058a2..000000000 --- a/RUNNING_TESTS.md +++ /dev/null @@ -1,94 +0,0 @@ -# Quick Reference: Running PEPPOL Tests - -## Prerequisites -```bash -cd /home/jailuser/git -composer install -``` - -## Run All Tests -```bash -# All tests in the project -./vendor/bin/phpunit - -# All Peppol tests only -./vendor/bin/phpunit --group=peppol - -# Run with ParaTest (parallel execution) -./vendor/bin/paratest --group=peppol -``` - -## Run Specific Test Suites - -### Enum Tests -```bash -./vendor/bin/phpunit Modules/Invoices/Tests/Unit/Enums/ -``` - -### Factory Tests -```bash -./vendor/bin/phpunit Modules/Invoices/Tests/Unit/Peppol/FormatHandlers/FormatHandlerFactoryTest.php -./vendor/bin/phpunit Modules/Invoices/Tests/Unit/Peppol/Providers/ProviderFactoryTest.php -``` - -### Individual Test Files -```bash -./vendor/bin/phpunit Modules/Invoices/Tests/Unit/Enums/PeppolConnectionStatusTest.php -./vendor/bin/phpunit Modules/Invoices/Tests/Unit/Enums/PeppolErrorTypeTest.php -./vendor/bin/phpunit Modules/Invoices/Tests/Unit/Enums/PeppolTransmissionStatusTest.php -./vendor/bin/phpunit Modules/Invoices/Tests/Unit/Enums/PeppolValidationStatusTest.php -./vendor/bin/phpunit Modules/Invoices/Tests/Unit/Peppol/Enums/PeppolEndpointSchemeTest.php -``` - -## Run with Filters - -### Run specific test method -```bash -./vendor/bin/phpunit --filter it_has_all_expected_cases -./vendor/bin/phpunit --filter it_validates_correct_identifiers -``` - -### Run tests matching pattern -```bash -./vendor/bin/phpunit --filter "Test.*label" -./vendor/bin/phpunit --filter "Test.*validation" -``` - -## Coverage Reports - -### HTML Coverage Report -```bash -./vendor/bin/phpunit --group=peppol --coverage-html coverage/ -open coverage/index.html -``` - -### Text Coverage Summary -```bash -./vendor/bin/phpunit --group=peppol --coverage-text -``` - -### Coverage for Specific Directory -```bash -./vendor/bin/phpunit Modules/Invoices/Tests/Unit/Enums/ --coverage-text -``` - -## Debugging Tests - -### Stop on Failure -```bash -./vendor/bin/phpunit --stop-on-failure --group=peppol -``` - -### Verbose Output -```bash -./vendor/bin/phpunit --verbose --group=peppol -``` - -### Debug Mode -```bash -./vendor/bin/phpunit --debug --group=peppol -``` - -## Test Results - -### Successful Test Output Example \ No newline at end of file diff --git a/phpunit.smoke.xml b/phpunit.smoke.xml new file mode 100644 index 000000000..c2788bb95 --- /dev/null +++ b/phpunit.smoke.xml @@ -0,0 +1,40 @@ + + + + + Modules/*/Tests/Unit + Modules/*/Tests/Feature + + + + + smoke + + + + + app + + + + + + + + + + + + + + + +