diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 45f5bbf..50dee97 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -13,8 +13,25 @@ on: jobs: + composer-normalize: + name: Composer normalization + runs-on: "ubuntu-latest" + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: '8.4' + coverage: none + tools: composer-normalize + env: + fail-fast: true + - name: Composer normalize + run: composer-normalize --dry-run + phpcs: - name: Code Style (phpcs) + name: Coding standards (phpcs) runs-on: "ubuntu-latest" steps: - name: Checkout @@ -22,7 +39,7 @@ jobs: - name: Setup PHP uses: shivammathur/setup-php@v2 with: - php-version: '8.3' + php-version: '8.4' coverage: none tools: cs2pr, phpcs env: @@ -31,7 +48,7 @@ jobs: run: phpcs -q --report=checkstyle | cs2pr php-cs-fixer: - name: Code style (php-cs-fixer) + name: Coding standards (php-cs-fixer) runs-on: "ubuntu-latest" steps: - name: Checkout @@ -39,7 +56,7 @@ jobs: - name: Setup PHP uses: shivammathur/setup-php@v2 with: - php-version: '8.3' + php-version: '8.4' coverage: none tools: cs2pr, php-cs-fixer env: @@ -56,7 +73,7 @@ jobs: - name: Setup PHP uses: shivammathur/setup-php@v2 with: - php-version: '8.3' + php-version: '8.4' coverage: none tools: composer:v2, phpstan env: @@ -80,7 +97,7 @@ jobs: runs-on: "ubuntu-latest" strategy: matrix: - php-version: ['8.2', '8.3'] + php-version: ['8.2', '8.3', '8.4'] steps: - name: Checkout uses: actions/checkout@v4 @@ -88,7 +105,7 @@ jobs: uses: shivammathur/setup-php@v2 with: php-version: ${{ matrix.php-version }} - coverage: xdebug + coverage: none tools: composer:v2 env: fail-fast: true @@ -104,4 +121,4 @@ jobs: - name: Install project dependencies run: composer upgrade --no-interaction --no-progress --prefer-dist - name: Tests (phpunit) - run: vendor/bin/phpunit --testsuite=complete --testdox --coverage-xml=build/coverage --coverage-clover=build/coverage/clover.xml --log-junit=build/coverage/junit.xml + run: vendor/bin/phpunit --testsuite=complete --testdox diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml new file mode 100644 index 0000000..48f17e1 --- /dev/null +++ b/.github/workflows/docker.yml @@ -0,0 +1,42 @@ +name: docker +on: + release: + branches: [ "main" ] + types: [ "published" ] + tags: [ "v*" ] + +# Actions +# docker/setup-buildx-action@v3 https://github.com/marketplace/actions/docker-setup-buildx +# docker/login-action@v3 https://github.com/marketplace/actions/docker-login +# docker/metadata-action@v5 https://github.com/marketplace/actions/docker-metadata-action +# docker/build-push-action@v6 https://github.com/marketplace/actions/build-and-push-docker-images + +jobs: + docker: + name: Docker image + runs-on: "ubuntu-latest" + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Set application version + run: sed -i "s#@box_git_version@#${{ github.ref_name }}#" bin/* + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + - name: Login to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Extract metadata for Docker + id: meta + uses: docker/metadata-action@v5 + with: + images: "${{ github.repository }}" + tags: "type=semver,pattern={{version}}" + - name: Build and push + uses: docker/build-push-action@v6 + with: + context: . + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} diff --git a/.github/workflows/sonarcloud.yml b/.github/workflows/sonarcloud.yml deleted file mode 100644 index 0bbedc7..0000000 --- a/.github/workflows/sonarcloud.yml +++ /dev/null @@ -1,109 +0,0 @@ -name: sonarcloud -on: - workflow_dispatch: - push: - branches: [ "main" ] - -# Actions -# shivammathur/setup-php@v2 https://github.com/marketplace/actions/setup-php-action -# sonarsource/sonarcloud-github-action@master https://github.com/marketplace/actions/sonarcloud-scan - -jobs: - - tests-coverage: - name: Create code coverage - runs-on: "ubuntu-latest" - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Setup PHP - uses: shivammathur/setup-php@v2 - with: - php-version: '8.3' - coverage: xdebug - tools: composer:v2 - env: - fail-fast: true - - name: Get composer cache directory - id: composer-cache - run: echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT - - name: Cache dependencies - uses: actions/cache@v4 - with: - path: ${{ steps.composer-cache.outputs.dir }} - key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} - restore-keys: ${{ runner.os }}-composer- - - name: Install project dependencies - run: composer upgrade --no-interaction --no-progress --prefer-dist - - name: Create code coverage - run: vendor/bin/phpunit --testdox --coverage-xml=build/coverage --coverage-clover=build/coverage/clover.xml --log-junit=build/coverage/junit.xml - - name: Store code coverage - uses: actions/upload-artifact@v4 - with: - name: code-coverage - path: build/coverage - - sonarcloud-secrets: - name: SonarCloud check secrets are present - runs-on: ubuntu-latest - outputs: - github: ${{ steps.check-secrets.outputs.github }} - sonar: ${{ steps.check-secrets.outputs.sonar }} - steps: - - name: Check secrets are present - id: check-secrets - run: | - if [ -n "${{ secrets.GITHUB_TOKEN }}" ]; then - echo "github=yes" >> $GITHUB_OUTPUT - else - echo "github=no" >> $GITHUB_OUTPUT - echo "::warning ::GITHUB_TOKEN non set" - fi - if [ -n "${{ secrets.SONAR_TOKEN }}" ]; then - echo "sonar=yes" >> $GITHUB_OUTPUT - else - echo "sonar=no" >> $GITHUB_OUTPUT - echo "::warning ::SONAR_TOKEN non set" - fi - - sonarcloud: - name: SonarCloud Scan and Report - needs: [ "tests-coverage", "sonarcloud-secrets" ] - if: ${{ needs.sonarcloud-secrets.outputs.github == 'yes' && needs.sonarcloud-secrets.outputs.sonar == 'yes' }} - runs-on: "ubuntu-latest" - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Unshallow clone to provide blame information - run: git fetch --unshallow - - name: Setup PHP - uses: shivammathur/setup-php@v2 - with: - php-version: '8.3' - coverage: none - tools: composer:v2 - - name: Get composer cache directory - id: composer-cache - run: echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT - - name: Cache dependencies - uses: actions/cache@v4 - with: - path: ${{ steps.composer-cache.outputs.dir }} - key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} - restore-keys: ${{ runner.os }}-composer- - - name: Install project dependencies - run: composer upgrade --no-interaction --no-progress --prefer-dist - - name: Obtain code coverage - uses: actions/download-artifact@v4 - with: - name: code-coverage - path: build/coverage - - name: Prepare SonarCloud Code Coverage Files - run: | - sed 's#'$GITHUB_WORKSPACE'#/github/workspace#g' build/coverage/junit.xml > build/sonar-junit.xml - sed 's#'$GITHUB_WORKSPACE'#/github/workspace#g' build/coverage/clover.xml > build/sonar-coverage.xml - - name: SonarCloud Scan - uses: sonarsource/sonarcloud-github-action@master - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} diff --git a/.github/workflows/sonarqube-cloud.yml b/.github/workflows/sonarqube-cloud.yml new file mode 100644 index 0000000..5592b98 --- /dev/null +++ b/.github/workflows/sonarqube-cloud.yml @@ -0,0 +1,53 @@ +name: "SonarQube Cloud" +on: + workflow_dispatch: + push: + branches: [ "main" ] + +# Actions +# shivammathur/setup-php@v2 https://github.com/marketplace/actions/setup-php-action +# SonarSource/sonarqube-scan-action@v6 https://github.com/marketplace/actions/official-sonarqube-scan + +jobs: + + sonarqube-cloud: + name: SonarCloud Scan and Report + runs-on: "ubuntu-latest" + steps: + - name: Check SONAR_TOKEN secret + run: | + if [ -z "${{ secrets.SONAR_TOKEN }}" ]; then + echo "::warning ::SONAR_TOKEN non set" + exit 1 + fi + - name: Checkout + uses: actions/checkout@v4 + - name: Unshallow clone to provide blame information + run: git fetch --unshallow + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: '8.4' + coverage: xdebug + tools: composer:v2 + - name: Get composer cache directory + id: composer-cache + run: echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT + - name: Cache dependencies + uses: actions/cache@v4 + with: + path: ${{ steps.composer-cache.outputs.dir }} + key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} + restore-keys: ${{ runner.os }}-composer- + - name: Install project dependencies + run: composer upgrade --no-interaction --no-progress --prefer-dist + - name: Create code coverage + run: vendor/bin/phpunit --testdox --testsuite=complete --coverage-xml=build/coverage --coverage-clover=build/coverage/clover.xml --log-junit=build/coverage/junit.xml + - name: Prepare SonarCloud Code Coverage Files + run: | + sed 's#'$GITHUB_WORKSPACE'#/github/workspace#g' build/coverage/junit.xml > build/sonar-junit.xml + sed 's#'$GITHUB_WORKSPACE'#/github/workspace#g' build/coverage/clover.xml > build/sonar-coverage.xml + - name: SonarCloud Scan + uses: SonarSource/sonarqube-scan-action@v6 + env: + SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} diff --git a/.github/workflows/system.yml b/.github/workflows/system.yml index 1e98597..e89ef6f 100644 --- a/.github/workflows/system.yml +++ b/.github/workflows/system.yml @@ -19,7 +19,7 @@ jobs: runs-on: "ubuntu-latest" strategy: matrix: - php-version: ['8.2', '8.3'] + php-version: ['8.2', '8.3', '8.4'] steps: - name: Checkout uses: actions/checkout@v4 diff --git a/.phive/phars.xml b/.phive/phars.xml index c776c4e..9293a13 100644 --- a/.phive/phars.xml +++ b/.phive/phars.xml @@ -1,8 +1,8 @@ - - - - - + + + + + diff --git a/.php-cs-fixer.dist.php b/.php-cs-fixer.dist.php index ceed8fa..712e3dc 100644 --- a/.php-cs-fixer.dist.php +++ b/.php-cs-fixer.dist.php @@ -15,15 +15,16 @@ ->setRules([ '@PSR12' => true, '@PSR12:risky' => true, - '@PHP82Migration' => true, - '@PHP80Migration:risky' => true, + '@PHP8x2Migration' => true, + '@PHP8x2Migration:risky' => true, // symfony + 'array_indentation' => true, 'class_attributes_separation' => true, 'whitespace_after_comma_in_array' => true, 'no_empty_statement' => true, 'no_extra_blank_lines' => true, 'type_declaration_spaces' => true, - 'trailing_comma_in_multiline' => ['after_heredoc' => true, 'elements' => ['arrays']], + 'trailing_comma_in_multiline' => ['after_heredoc' => true, 'elements' => ['array_destructuring', 'arrays', 'match', 'arguments', 'parameters']], 'no_blank_lines_after_phpdoc' => true, 'object_operator_without_whitespace' => true, 'binary_operator_spaces' => true, @@ -37,6 +38,7 @@ 'concat_space' => ['spacing' => 'one'], 'linebreak_after_opening_tag' => true, 'fully_qualified_strict_types' => true, + 'global_namespace_import' => ['import_classes' => true], // symfony:risky 'no_alias_functions' => true, 'self_accessor' => true, @@ -48,6 +50,6 @@ PhpCsFixer\Finder::create() ->in(__DIR__) ->append([__FILE__]) - ->exclude(['tools', 'vendor', 'build']) + ->exclude(['tools', 'vendor', 'build']), ) ; diff --git a/Dockerfile b/Dockerfile index dcdc2b6..d21be3e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM php:8.3-cli-alpine +FROM php:8.4-cli-alpine COPY . /opt/sat-pys-scraper COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer @@ -6,7 +6,8 @@ COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer # install dependencies for php modules RUN set -e \ && apk add git libzip-dev \ - && docker-php-ext-install zip + && docker-php-ext-install zip \ + && apk del libzip-dev # set up php RUN set -e \ diff --git a/LICENSE b/LICENSE index 8e5765a..18c632e 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2023 - 2024 PhpCfdi https://www.phpcfdi.com/ +Copyright (c) 2023 - 2025 PhpCfdi https://www.phpcfdi.com/ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index ce2a67c..c7b95d3 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,7 @@ [![Code Coverage][badge-coverage]][coverage] [![Violations][badge-violations]][violations] [![Total Downloads][badge-downloads]][downloads] +[![Docker Downloads][badge-docker]][docker] > Herramienta para obtener y generar un listado de las clasificaciones del catálogo de productos y servicios del SAT @@ -38,23 +39,23 @@ propósitos, como por ejemplo, almacenar en una base de datos. composer require phpcfdi/sat-pys-scraper ``` -## Instalación usando Docker +## Ejecución usando Docker -Este proyecto provee un archivo `Dockerfile` para construir una imagen con todas sus dependencias. -Se puede usar esta imagen para correr de forma local, para más información consulte -el archivo [`README.Docker.md`](Docker.README.md). +Este proyecto está integrado a Docker Hub [`phpcfdi/sat-pys-scraper`][docker] por lo que puedes ejecutarlo +desde la línea de comandos: ```shell -# clonado del proyecto -git clone https://github.com/phpcfdi/sat-pys-scraper.git - -# construcción de la imagen de Docker -docker build -t sat-pys-scraper sat-pys-scraper/ +# obtener la imagen de docker +docker pull phpcfdi/sat-pys-scraper # ejecución de la herramienta -docker run -it --rm sat-pys-scraper --help +docker docker run -it --rm --user="$(id -u):$(id -g)" sat-pys-scraper --help ``` +Este proyecto provee un archivo `Dockerfile` para construir una imagen con todas sus dependencias. + +Para más información y ejemplos consulte el archivo [`README.Docker.md`](Docker.README.md). + ### Ayuda de `sat-pys-scraper` (script) ```text @@ -169,12 +170,12 @@ Esta librería se mantendrá compatible con al menos la versión con También utilizamos [Versionado Semántico 2.0.0](docs/SEMVER.md) por lo que puedes usar esta librería sin temor a romper tu aplicación. -| Versión | PHP | Nota | -|---------|----------|-----------------------------------| -| 1.0.0 | 8.2, 8.3 | 2023-12-13 Fuera de mantenimiento | -| 2.0.0 | 8.2, 8.3 | 2024-03-07 Fuera de mantenimiento | -| 3.0.0 | 8.2, 8.3 | 2024-03-07 Fuera de mantenimiento | -| 4.0.0 | 8.2, 8.3 | 2024-10-17 | +| Versión | PHP | Nota | +|---------|---------------|-----------------------------------| +| 1.0.0 | 8.2, 8.3 | 2023-12-13 Fuera de mantenimiento | +| 2.0.0 | 8.2, 8.3 | 2024-03-07 Fuera de mantenimiento | +| 3.0.0 | 8.2, 8.3 | 2024-03-07 Fuera de mantenimiento | +| 4.0.0 | 8.2, 8.3, 8.4 | 2024-10-17 | ## Contribuciones @@ -200,6 +201,7 @@ and licensed for use under the MIT License (MIT). Please see [LICENSE][] for mor [coverage]: https://sonarcloud.io/component_measures?id=phpcfdi_sat-pys-scraper&metric=Coverage [violations]: https://sonarcloud.io/project/issues?id=phpcfdi_sat-pys-scraper&resolved=false [downloads]: https://packagist.org/packages/phpcfdi/sat-pys-scraper +[docker]: https://hub.docker.com/r/phpcfdi/sat-pys-scraper [badge-source]: https://img.shields.io/badge/source-phpcfdi/sat--pys--scraper-blue?logo=github [badge-php-version]: https://img.shields.io/packagist/dependency-v/phpcfdi/sat-pys-scraper/php?logo=php @@ -208,6 +210,7 @@ and licensed for use under the MIT License (MIT). Please see [LICENSE][] for mor [badge-build]: https://img.shields.io/github/actions/workflow/status/phpcfdi/sat-pys-scraper/build.yml?branch=main&logo=github-actions [badge-reliability]: https://sonarcloud.io/api/project_badges/measure?project=phpcfdi_sat-pys-scraper&metric=reliability_rating [badge-maintainability]: https://sonarcloud.io/api/project_badges/measure?project=phpcfdi_sat-pys-scraper&metric=sqale_rating -[badge-coverage]: https://img.shields.io/sonar/coverage/phpcfdi_sat-pys-scraper/main?logo=sonarcloud&server=https%3A%2F%2Fsonarcloud.io -[badge-violations]: https://img.shields.io/sonar/violations/phpcfdi_sat-pys-scraper/main?format=long&logo=sonarcloud&server=https%3A%2F%2Fsonarcloud.io +[badge-coverage]: https://img.shields.io/sonar/coverage/phpcfdi_sat-pys-scraper/main?logo=sonarqubecloud&server=https%3A%2F%2Fsonarcloud.io +[badge-violations]: https://img.shields.io/sonar/violations/phpcfdi_sat-pys-scraper/main?format=long&logo=sonarqubecloud&server=https%3A%2F%2Fsonarcloud.io [badge-downloads]: https://img.shields.io/packagist/dt/phpcfdi/sat-pys-scraper?logo=packagist +[badge-docker]: https://img.shields.io/docker/pulls/phpcfdi/sat-pys-scraper?logo=docker diff --git a/composer.json b/composer.json index ec47d3e..c85f0da 100644 --- a/composer.json +++ b/composer.json @@ -63,7 +63,7 @@ "dev:fix-style": [ "@php tools/composer-normalize normalize", "@php tools/php-cs-fixer fix --verbose", - "@php tools/phpcbf --colors -sp" + "@php tools/phpcbf --colors -sp || true" ], "dev:test": [ "@dev:check-style", diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 24d573d..053d9fc 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -11,6 +11,32 @@ versión, aunque sí su incorporación en la rama principal de trabajo. Generalm ## Listado de cambios +### Versión 4.0.1 2024-11-13 + +Esta actualización confirma la compatibilidad (que ya existía) con PHP 8.4. + +Estos cambios aplican al proyecto liberado: + +- Cambios menores sugeridos por PHPStan (forzar escalares en lugar de usar anotaciones). +- Se agrega la imagen en Docker Hub `phpcfdi/sat-pys-scraper`. +- Se corrigen las insignias de SonarQube Cloud. +- Se actualiza el año de licencia a 2025. + +Cambios en el entorno de desarrollo: + +- Se corrige la integración con SonarQube Cloud. +- En el archivo de construcción de la imagen de Docker: + - Se construye usando PHP 8.4. + - Se eliminan las librerías de compilación. +- En los flujos de trabajo: + - Se agrega PHP 8.4 a la matriz de pruebas. + - Se agrega PHP 8.4 a la matriz de pruebas de sistema. + - Se ejecutan los trabajos en PHP 8.4. + - Se agrega `composer-normalize` a los trabajos. +- Se mejora la configuración de PHPUnit para mostrar todos los problemas encontrados. +- Se actualiza el estándar de código. +- Se actualizan las herramientas de desarrollo. + ### Versión 4.0.0 2024-10-17 Esta es una actualización de refactorización que obliga a crear una versión mayor. diff --git a/phpcs.xml.dist b/phpcs.xml.dist index 2792d14..601d073 100644 --- a/phpcs.xml.dist +++ b/phpcs.xml.dist @@ -1,4 +1,4 @@ - + The EngineWorks (PSR-12 based) coding standard. @@ -19,7 +19,6 @@ - diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 1941425..8a22a4f 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -1,14 +1,13 @@ - - tests @@ -23,7 +22,7 @@ - src + src diff --git a/src/Scraper.php b/src/Scraper.php index 6f645fb..7aa0d95 100644 --- a/src/Scraper.php +++ b/src/Scraper.php @@ -115,6 +115,7 @@ private function sendPost(array $data): Crawler /** @return array */ private function extractSelectValues(Crawler $crawler, string $selectId): array { + /** @phpstan-var array{string, string} $options */ $options = $crawler->filter("#$selectId option")->extract(['value', '_text']); $values = array_combine( array_column($options, 0), @@ -123,11 +124,14 @@ private function extractSelectValues(Crawler $crawler, string $selectId): array return array_filter($values, fn (int|string $key): bool => (bool) $key, ARRAY_FILTER_USE_KEY); } - /** @return array */ + /** @return array */ private function extractState(Crawler $crawler): array { $form = $crawler->filter('#form1')->form(); - return $form->getPhpValues(); + return array_filter( + $form->getPhpValues(), + static fn (mixed $value): bool => null === $value || is_scalar($value), + ); } private function wrapGuzzleException(GuzzleException $exception): Exceptions\HttpException @@ -135,13 +139,13 @@ private function wrapGuzzleException(GuzzleException $exception): Exceptions\Htt if ($exception instanceof ServerException) { return new Exceptions\HttpServerException( message: $exception->getMessage(), - previous: $exception + previous: $exception, ); } return new Exceptions\HttpException( message: $exception->getMessage(), - previous: $exception + previous: $exception, ); } } diff --git a/tests/Fakes/PysSimulator.php b/tests/Fakes/PysSimulator.php index ac01b48..6a626b8 100644 --- a/tests/Fakes/PysSimulator.php +++ b/tests/Fakes/PysSimulator.php @@ -32,7 +32,10 @@ public function __invoke(RequestInterface $request, array $options): PromiseInte } if ('POST' === $request->getMethod()) { parse_str($request->getBody()->__toString(), $values); - /** @phpstan-var array $values */ + $values = array_filter( + $values, + static fn (mixed $value): bool => is_scalar($value), + ); $type = intval($values['cmbTipo'] ?? 0); $segment = intval($values['cmbSegmento'] ?? 0); $family = intval($values['cmbFamilia'] ?? 0); diff --git a/tests/Unit/App/SatPysScraperTest.php b/tests/Unit/App/SatPysScraperTest.php index 7cb4fd7..de6aa67 100644 --- a/tests/Unit/App/SatPysScraperTest.php +++ b/tests/Unit/App/SatPysScraperTest.php @@ -63,7 +63,7 @@ public function testRunWithError(): void $this->assertStringContainsString( 'ERROR: Did not specify --xml or --json arguments', $stdError, - 'Expected error was not raised' + 'Expected error was not raised', ); } diff --git a/tests/Unit/TestCase.php b/tests/Unit/TestCase.php index 61c274c..e487623 100644 --- a/tests/Unit/TestCase.php +++ b/tests/Unit/TestCase.php @@ -7,6 +7,7 @@ use GuzzleHttp\Client; use GuzzleHttp\Handler\MockHandler; use GuzzleHttp\HandlerStack; +use GuzzleHttp\Psr7\Response; use LogicException; use PhpCfdi\SatPysScraper\Scraper; use PhpCfdi\SatPysScraper\ScraperInterface; @@ -71,7 +72,7 @@ public function createFakeScraper(): ScraperInterface return new Scraper($client); } - /** @param array $queue */ + /** @param list $queue */ public function createPreparedScraperQueue(array $queue): ScraperInterface { $mockHandler = new MockHandler($queue);