diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1d4fc20..f8fc562 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -22,7 +22,7 @@ jobs: - name: Setup PHP uses: shivammathur/setup-php@v2 with: - php-version: '8.2' + php-version: '8.3' coverage: none tools: cs2pr, phpcs env: @@ -39,7 +39,7 @@ jobs: - name: Setup PHP uses: shivammathur/setup-php@v2 with: - php-version: '8.2' + php-version: '8.3' coverage: none tools: cs2pr, php-cs-fixer env: @@ -56,7 +56,7 @@ jobs: - name: Setup PHP uses: shivammathur/setup-php@v2 with: - php-version: '8.2' + php-version: '8.3' coverage: none tools: composer-normalize env: @@ -73,7 +73,7 @@ jobs: - name: Setup PHP uses: shivammathur/setup-php@v2 with: - php-version: '8.2' + php-version: '8.3' coverage: none tools: composer:v2, phpstan env: @@ -97,7 +97,7 @@ jobs: runs-on: "ubuntu-latest" strategy: matrix: - php-versions: ['7.3', '7.4', '8.0', '8.1', '8.2'] + php-versions: ['7.3', '7.4', '8.0', '8.1', '8.2', '8.3'] steps: - name: Checkout uses: actions/checkout@v3 diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index 425b10b..77841f4 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -11,7 +11,7 @@ on: jobs: tests-coverage: - name: Tests on PHP 8.2 (code coverage) + name: Tests on PHP 8.3 (code coverage) runs-on: "ubuntu-latest" steps: - name: Checkout @@ -19,7 +19,7 @@ jobs: - name: Setup PHP uses: shivammathur/setup-php@v2 with: - php-version: '8.2' + php-version: '8.3' coverage: xdebug tools: composer:v2 env: @@ -79,7 +79,7 @@ jobs: - name: Setup PHP uses: shivammathur/setup-php@v2 with: - php-version: '8.1' + php-version: '8.3' coverage: none tools: composer:v2 - name: Get composer cache directory diff --git a/.phive/phars.xml b/.phive/phars.xml index 62583a2..03b4b5e 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 079c764..692ed1c 100644 --- a/.php-cs-fixer.dist.php +++ b/.php-cs-fixer.dist.php @@ -22,7 +22,7 @@ 'whitespace_after_comma_in_array' => true, 'no_empty_statement' => true, 'no_extra_blank_lines' => true, - 'function_typehint_space' => true, + 'type_declaration_spaces' => true, 'trailing_comma_in_multiline' => ['after_heredoc' => true, 'elements' => ['arrays', 'arguments']], 'no_blank_lines_after_phpdoc' => true, 'object_operator_without_whitespace' => true, diff --git a/README.md b/README.md index 1dd4dbd..9036063 100644 --- a/README.md +++ b/README.md @@ -221,37 +221,54 @@ $list = $satScraper->listByUuids($uuids, DownloadType::recibidos()); echo json_encode($list); ``` -## Aviso de que existen más de 500 comprobantes en un mismo segundo +## Avisos de descargas de Metadata El servicio ofrecido por el SAT tiene límites, entre ellos, no se pueden obtener más de 500 registros -en un rango de fechas. Esta librería trata de reducir el rango hasta el mínimo de una consulta en un segundo -para obtener todos los datos, sin embargo, si se presenta este caso, entonces se puede invocar a un manejador -que le puede ayudar a registrar este escenario. +en un rango de fechas. Esta librería trata de reducir el rango hasta el mínimo de fabricar una consulta por +un solo segundo para obtener todos los datos, sin embargo, si se presenta este caso, entonces se puede usar +el manejador `MetadataMessageHandler` para registrar este escenario. + +El manejador `MetadataMessageHandler` es una interfaz que puede recibir diferentes mensajes: + +- `resolved(DateTimeImmutable $since, DateTimeImmutable $until, int $count): void`: + Ocurre cuando se resolvió una consulta entre dos momentos en un mismo día, siempre serán menos de 500 registros. +- `date(DateTimeImmutable $since, DateTimeImmutable $until, int $count): void`: + Ocurre cuando se resolvió una consulta de un día determinado. + Hay un momento inicial y otro final porque las horas podrían ser diferentes a `00:00:00` y `23:59:59`. +- `divide(DateTimeImmutable $since, DateTimeImmutable $until): void`: + Ocurre cuando se encontraron 500 registros en un periodo. + Se dividirá la consulta para intentar descargar el contenido completo. +- `maximum(DateTimeImmutable $moment): void`: + Ocurre cuando se encontraron 500 registros en un solo segundo. Si al crear el objeto `SatScraper` no se establece un manejador o se establece como `null` entonces se usará -una instancia de `NullMaximumRecordsHandler` que, como su nombre lo indica, no realiza ninguna acción. +una instancia de `NullMetadataMessageHandler` que, como su nombre lo indica, no realiza ninguna acción. + +En el siguiente código se muestra un ejemplo que muestra un mensaje al encontrar el problema de 500 registros. ```php format('c'), PHP_EOL; } }; -// create scraper using the handler -/** - * @var SessionManager $sessionManager - * @var SatHttpGateway $httpGateway - */ +// se crea el scraper usando el controlador de mensajes $satScraper = new SatScraper($sessionManager, $httpGateway, $handler); $query = new QueryByFilters(new DateTimeImmutable('2019-03-01'), new DateTimeImmutable('2019-03-31')); @@ -259,6 +276,9 @@ $list = $satScraper->listByPeriod($query); echo json_encode($list); ``` +La interfaz `MaximumRecordsHandler` y el objeto `NullMaximumRecordsHandler` han sido deprecados desde la versión `3.3.0`. +Ambos símbolos serán eliminados a partir de la versión `4.0.0`. + ## Descargar CFDIS a una carpeta Ejecutar el método `saveTo` devuelve un arreglo con los UUID que fueron efectivamente descargados. diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 6fd8561..84ae4e2 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -6,6 +6,29 @@ Usamos [Versionado Semántico 2.0.0](SEMVER.md) por lo que puedes usar esta libr ## Cambios aún no liberados en una versión +## Versión 3.3.0 2023-12-03 + +Se agregó la interfaz `MetadataMessageHandler` que permite recibir notificaciones de la descarga de *Metadata*. +Dentro de las notificaciones se incluye la que ocurre cuando se encontraron 500 registros en un solo segundo. + +Se deprecó la interfaz `MaximumRecordsHandler`, es sustituida por `MetadataMessageHandler`. + +Se deprecó el método `SatScraper::getMaximumRecordsHandler()` a favor de `SatScraper::getMetadataMessageHandler()`. + +Para no introducir un cambio que rompa la compatibilidad, el constructor de `SatScraper` sigue soportando la +creación del objeto con el argumento `MaximumRecordsHandler $maximumRecordsHandler`. +En su lugar, debería enviar un objeto que implemente la interfaz `MetadataMessageHandler`. + +Se introduce el objeto `NullMetadataMessageHandler` que implementa la interfaz `MetadataMessageHandler`, +pero no realiza ninguna acción en sus métodos. + +Otros cambios al entorno de desarrollo: + +- Se actualizan las dependencias de desarrollo. +- Se agrega PHP 8.3 a la matrix de pruebas. +- Los trabajos se ejecutan con PHP 8.3. +- Para `php-cs-fixer` se sustituye `function_typehint_space` con `type_declaration_spaces`. + ## Versión 3.2.5 2023-07-03 Algunos métodos intentaban atrapar una excepción `RuntimeException` proveniente de `Crawler`, sin embargo, diff --git a/src/Contracts/MaximumRecordsHandler.php b/src/Contracts/MaximumRecordsHandler.php index 3d3b2e6..c4d998b 100644 --- a/src/Contracts/MaximumRecordsHandler.php +++ b/src/Contracts/MaximumRecordsHandler.php @@ -6,6 +6,10 @@ use DateTimeImmutable; +/** + * @see MetadataMessageHandler + * @deprecated 3.3.0 + */ interface MaximumRecordsHandler { public function handle(DateTimeImmutable $moment): void; diff --git a/src/Contracts/MetadataMessageHandler.php b/src/Contracts/MetadataMessageHandler.php new file mode 100644 index 0000000..288e8e4 --- /dev/null +++ b/src/Contracts/MetadataMessageHandler.php @@ -0,0 +1,32 @@ +maximumRecordsHandler = $maximumRecordsHandler; + } + + /** @noinspection PhpMissingParentCallCommonInspection */ + public function maximum(DateTimeImmutable $moment): void + { + $this->maximumRecordsHandler->handle($moment); + } +} diff --git a/src/Internal/MetadataDownloader.php b/src/Internal/MetadataDownloader.php index 7b1b3e9..0b22eff 100644 --- a/src/Internal/MetadataDownloader.php +++ b/src/Internal/MetadataDownloader.php @@ -6,7 +6,7 @@ use DateTimeImmutable; use Generator; -use PhpCfdi\CfdiSatScraper\Contracts\MaximumRecordsHandler; +use PhpCfdi\CfdiSatScraper\Contracts\MetadataMessageHandler; use PhpCfdi\CfdiSatScraper\Contracts\QueryInterface; use PhpCfdi\CfdiSatScraper\Exceptions\LogicException; use PhpCfdi\CfdiSatScraper\Exceptions\SatHttpGatewayException; @@ -33,14 +33,14 @@ class MetadataDownloader /** @var QueryResolver */ private $queryResolver; - /** @var MaximumRecordsHandler */ - private $maximumRecordsHandler; + /** @var MetadataMessageHandler */ + private $messageHandler; /** @internal */ - public function __construct(QueryResolver $queryResolver, MaximumRecordsHandler $maximumRecordsHandler) + public function __construct(QueryResolver $queryResolver, MetadataMessageHandler $messageHandler) { $this->queryResolver = $queryResolver; - $this->maximumRecordsHandler = $maximumRecordsHandler; + $this->messageHandler = $messageHandler; } public function getQueryResolver(): QueryResolver @@ -48,9 +48,9 @@ public function getQueryResolver(): QueryResolver return $this->queryResolver; } - public function getMaximumRecordsHandler(): MaximumRecordsHandler + public function getMessageHandler(): MetadataMessageHandler { - return $this->maximumRecordsHandler; + return $this->messageHandler; } /** @@ -109,7 +109,9 @@ public function downloadByDateTime(QueryByFilters $query): MetadataList { $result = new MetadataList([]); foreach ($this->splitQueryByFiltersByDays($query) as $current) { - $result = $result->merge($this->downloadQuery($current)); + $list = $this->downloadQuery($current); + $this->messageHandler->date($current->getStartDate(), $current->getEndDate(), $list->count()); + $result = $result->merge($list); } return $result; } @@ -134,14 +136,16 @@ public function downloadQuery(QueryByFilters $query): MetadataList $result = $list->count(); if ($result >= 500 && $secondEnd === $secondInitial) { - $this->raiseOnLimit($this->buildDateWithDayAndSeconds($day, $secondInitial)); + $this->messageHandler->maximum($currentQuery->getStartDate()); } if ($result >= 500 && $secondEnd > $secondInitial) { - $secondEnd = (int)floor($secondInitial + (($secondEnd - $secondInitial) / 2)); + $this->messageHandler->divide($currentQuery->getStartDate(), $currentQuery->getEndDate()); + $secondEnd = (int) floor($secondInitial + (($secondEnd - $secondInitial) / 2)); continue; } + $this->messageHandler->resolved($currentQuery->getStartDate(), $currentQuery->getEndDate(), $list->count()); $finalList = $finalList->merge($list); if ($secondEnd >= $upperBound) { break; @@ -179,11 +183,6 @@ public function buildDateWithDayAndSeconds(DateTimeImmutable $day, int $seconds) return $day->modify(sprintf('midnight + %d seconds', $seconds)); } - public function raiseOnLimit(DateTimeImmutable $date): void - { - $this->maximumRecordsHandler->handle($date); - } - public function createInputsFromQuery(QueryInterface $query): InputsInterface { if ($query instanceof QueryByFilters) { diff --git a/src/Internal/MetadataMessageHandlerWrapper.php b/src/Internal/MetadataMessageHandlerWrapper.php new file mode 100644 index 0000000..6563622 --- /dev/null +++ b/src/Internal/MetadataMessageHandlerWrapper.php @@ -0,0 +1,31 @@ +messageHandler = $messageHandler; + } + + public function handle(DateTimeImmutable $moment): void + { + $this->messageHandler->maximum($moment); + } +} diff --git a/src/Internal/NullMaximumRecordsHandler.php b/src/Internal/NullMaximumRecordsHandler.php index d189b66..99d949f 100644 --- a/src/Internal/NullMaximumRecordsHandler.php +++ b/src/Internal/NullMaximumRecordsHandler.php @@ -10,6 +10,7 @@ /** * Null implementation of MaximumRecordsHandler. * + * @deprecated * @internal */ final class NullMaximumRecordsHandler implements MaximumRecordsHandler diff --git a/src/NullMetadataMessageHandler.php b/src/NullMetadataMessageHandler.php new file mode 100644 index 0000000..1b1700d --- /dev/null +++ b/src/NullMetadataMessageHandler.php @@ -0,0 +1,26 @@ +sessionManager = $sessionManager; $this->satHttpGateway = $satHttpGateway ?? $this->createDefaultSatHttpGateway(); - $this->maximumRecordsHandler = $maximumRecordsHandler ?? new NullMaximumRecordsHandler(); + $this->maximumRecordsHandler = $maximumRecordsHandler; + $this->metadataMessageHandler = $metadataMessageHandler; } /** @@ -47,7 +78,7 @@ public function __construct( */ protected function createMetadataDownloader(): MetadataDownloader { - return new MetadataDownloader($this->createQueryResolver(), $this->maximumRecordsHandler); + return new MetadataDownloader($this->createQueryResolver(), $this->metadataMessageHandler); } /** @@ -120,8 +151,21 @@ public function getSatHttpGateway(): SatHttpGateway return $this->satHttpGateway; } + /** + * @deprecated 3.3.0 + * @see SatScraper::getMetadataMessageHandler() + */ public function getMaximumRecordsHandler(): MaximumRecordsHandler { + trigger_error( + sprintf('Method %1$s::getMaximumRecordsHandler is deprecated, use %1$s::getMetadataMessageHandler', self::class), + E_USER_DEPRECATED, + ); return $this->maximumRecordsHandler; } + + public function getMetadataMessageHandler(): MetadataMessageHandler + { + return $this->metadataMessageHandler; + } } diff --git a/tests/Unit/Internal/MaximumRecordsTracker.php b/tests/Unit/Internal/MaximumRecordsTracker.php deleted file mode 100644 index 2ab4474..0000000 --- a/tests/Unit/Internal/MaximumRecordsTracker.php +++ /dev/null @@ -1,29 +0,0 @@ -moments[] = $moment->format('Y-m-d H:i:s'); - } - - /** @return string[] */ - public function getMoments(): array - { - return $this->moments; - } -} diff --git a/tests/Unit/Internal/MetadataDownloaderTest.php b/tests/Unit/Internal/MetadataDownloaderTest.php index 70be584..699189a 100644 --- a/tests/Unit/Internal/MetadataDownloaderTest.php +++ b/tests/Unit/Internal/MetadataDownloaderTest.php @@ -5,7 +5,7 @@ namespace PhpCfdi\CfdiSatScraper\Tests\Unit\Internal; use DateTimeImmutable; -use PhpCfdi\CfdiSatScraper\Contracts\MaximumRecordsHandler; +use PhpCfdi\CfdiSatScraper\Contracts\MetadataMessageHandler; use PhpCfdi\CfdiSatScraper\Filters\DownloadType; use PhpCfdi\CfdiSatScraper\Filters\Options\ComplementsOption; use PhpCfdi\CfdiSatScraper\Filters\Options\StatesVoucherOption; @@ -15,37 +15,22 @@ use PhpCfdi\CfdiSatScraper\QueryByFilters as Query; use PhpCfdi\CfdiSatScraper\Tests\Fakes\FakeQueryResolver; use PhpCfdi\CfdiSatScraper\Tests\TestCase; -use PHPUnit\Framework\MockObject\MockObject; final class MetadataDownloaderTest extends TestCase { public function testConstructor(): void { $resolver = $this->createMock(QueryResolver::class); - $handler = $this->createMock(MaximumRecordsHandler::class); + $handler = $this->createMock(MetadataMessageHandler::class); $downloader = new MetadataDownloader($resolver, $handler); $this->assertSame($resolver, $downloader->getQueryResolver()); - $this->assertSame($handler, $downloader->getMaximumRecordsHandler()); - } - - public function testRaiseOnLimitWithHandler(): void - { - $expectedDate = new DateTimeImmutable(); - - $resolver = $this->createMock(QueryResolver::class); - /** @var MaximumRecordsHandler&MockObject $handler */ - $handler = $this->createMock(MaximumRecordsHandler::class); - $handler->expects($this->once())->method('handle')->with($expectedDate); - - $downloader = new MetadataDownloader($resolver, $handler); - - $downloader->raiseOnLimit($expectedDate); + $this->assertSame($handler, $downloader->getMessageHandler()); } public function testBuildDateWithDayAndSeconds(): void { $resolver = $this->createMock(QueryResolver::class); - $handler = $this->createMock(MaximumRecordsHandler::class); + $handler = $this->createMock(MetadataMessageHandler::class); $downloader = new MetadataDownloader($resolver, $handler); $date = new DateTimeImmutable('2019-01-13 14:15:16'); @@ -60,7 +45,7 @@ public function testResolveQueryUsesQueryResolver(): void $end = new DateTimeImmutable('2012-11-16 23:59:59'); $query = new QueryByFilters($start, $end); $resolver = new FakeQueryResolver(); - $downloader = new MetadataDownloader($resolver, $this->createMock(MaximumRecordsHandler::class)); + $downloader = new MetadataDownloader($resolver, $this->createMock(MetadataMessageHandler::class)); $downloader->resolveQuery($query); $expected = [ ['start' => '2012-11-16 00:00:00', 'end' => '2012-11-16 23:59:59', 'count' => 0], @@ -75,7 +60,7 @@ public function testNewQueryWithSeconds(): void $baseQuery = new QueryByFilters($baseStart, $baseEnd); $resolver = $this->createMock(QueryResolver::class); - $handler = $this->createMock(MaximumRecordsHandler::class); + $handler = $this->createMock(MetadataMessageHandler::class); $downloader = new MetadataDownloader($resolver, $handler); $query = $downloader->newQueryWithSeconds($baseQuery, 1, 2); @@ -101,7 +86,7 @@ public function testDownloadQueryCreatesCorrectIntervals(): void $resolver->appendMoment(new DateTimeImmutable('2019-01-13 00:00:40'), $fakes->doMetadataList(250)); $resolver->appendMoment(new DateTimeImmutable('2019-01-13 00:00:55'), $fakes->doMetadataList(250)); - $handler = new MaximumRecordsTracker(); + $handler = new MetadataMessageTracker(); $downloader = new MetadataDownloader($resolver, $handler); // prepare expected output @@ -119,7 +104,55 @@ public function testDownloadQueryCreatesCorrectIntervals(): void // fire and check $downloader->downloadQuery($baseQuery); $this->assertSame($expectedInfo, $resolver->resolveCalls); - $this->assertCount(0, $handler->getMoments(), 'downloadQuery should never raise with given example'); + $this->assertCount(0, $handler->getMaximum(), 'downloadQuery should never raise with given example'); + } + + public function testDownloadByDateTimeCreatesCorrectIntervals(): void + { + // observe that dates does not start at 00:00:00 or end at 23:59:59 + $baseStart = new DateTimeImmutable('2019-01-12 00:00:01'); + $baseEnd = new DateTimeImmutable('2019-01-14 23:59:58'); + $baseQuery = new QueryByFilters($baseStart, $baseEnd); + + $fakes = $this->fakes(); + $resolver = new FakeQueryResolver(); + $resolver->appendMoment(new DateTimeImmutable('2019-01-12 00:00:00'), $fakes->doMetadataList(1)); // excluded + $resolver->appendMoment(new DateTimeImmutable('2019-01-12 00:00:01'), $fakes->doMetadataList(450)); // included + $resolver->appendMoment(new DateTimeImmutable('2019-01-12 12:13:14'), $fakes->doMetadataList(450)); + $resolver->appendMoment(new DateTimeImmutable('2019-01-13 00:00:00'), $fakes->doMetadataList(250)); + $resolver->appendMoment(new DateTimeImmutable('2019-01-13 12:00:00'), $fakes->doMetadataList(250)); + $resolver->appendMoment(new DateTimeImmutable('2019-01-13 18:00:00'), $fakes->doMetadataList(250)); + $resolver->appendMoment(new DateTimeImmutable('2019-01-14 23:59:58'), $fakes->doMetadataList(450)); // included + $resolver->appendMoment(new DateTimeImmutable('2019-01-14 23:59:59'), $fakes->doMetadataList(1)); // excluded + + $handler = new MetadataMessageTracker(); + $downloader = new MetadataDownloader($resolver, $handler); + + // fire and check + $downloader->downloadByDateTime($baseQuery); + + $this->assertSame([ + '2019-01-12 00:00:01 - 2019-01-12 23:59:59: 900', // start time is not 00:00:00 + '2019-01-13 00:00:00 - 2019-01-13 23:59:59: 750', // full day + '2019-01-14 00:00:00 - 2019-01-14 23:59:58: 450', // end time is not 23:59:59 + ], $handler->getResolvedDates()); + + $this->assertSame([ + '2019-01-12 00:00:01 - 2019-01-12 12:00:00: 450', + '2019-01-12 12:00:01 - 2019-01-12 23:59:59: 450', + '2019-01-13 00:00:00 - 2019-01-13 11:59:59: 250', + '2019-01-13 12:00:00 - 2019-01-13 17:59:59: 250', + '2019-01-13 18:00:00 - 2019-01-13 23:59:59: 250', + '2019-01-14 00:00:00 - 2019-01-14 23:59:58: 450', + ], $handler->getResolved()); + + $this->assertSame([ + '2019-01-12 00:00:01 - 2019-01-12 23:59:59', + '2019-01-13 00:00:00 - 2019-01-13 23:59:59', + '2019-01-13 12:00:00 - 2019-01-13 23:59:59', + ], $handler->getDivisions()); + + $this->assertSame([], $handler->getMaximum()); } public function testDownloadQueryWithLimitReached(): void @@ -134,7 +167,7 @@ public function testDownloadQueryWithLimitReached(): void $resolver->appendMoment(new DateTimeImmutable('2019-01-13 00:00:00'), $fakes->doMetadataList(500)); $resolver->appendMoment(new DateTimeImmutable('2019-01-13 00:00:04'), $fakes->doMetadataList(500)); - $handler = new MaximumRecordsTracker(); + $handler = new MetadataMessageTracker(); $downloader = new MetadataDownloader($resolver, $handler); // prepare expected output @@ -156,13 +189,13 @@ public function testDownloadQueryWithLimitReached(): void $this->assertSame([ '2019-01-13 00:00:00', '2019-01-13 00:00:04', - ], $handler->getMoments()); + ], $handler->getMaximum()); } public function testDownloadByDateTime(): void { $resolver = new FakeQueryResolver(); - $handler = $this->createMock(MaximumRecordsHandler::class); + $handler = $this->createMock(MetadataMessageHandler::class); $downloader = new MetadataDownloader($resolver, $handler); $start = new DateTimeImmutable('2019-01-13 14:15:16'); @@ -180,7 +213,7 @@ public function testDownloadByDateTime(): void public function testDownloadByDate(): void { $resolver = new FakeQueryResolver(); - $handler = $this->createMock(MaximumRecordsHandler::class); + $handler = $this->createMock(MetadataMessageHandler::class); $downloader = new MetadataDownloader($resolver, $handler); $start = new DateTimeImmutable('2019-01-13 14:15:16'); @@ -199,7 +232,7 @@ public function testDownloadByUuids(): void { $fakes = $this->fakes(); $resolver = new FakeQueryResolver(); - $handler = $this->createMock(MaximumRecordsHandler::class); + $handler = $this->createMock(MetadataMessageHandler::class); $downloader = new MetadataDownloader($resolver, $handler); $downloader->downloadByUuids([ @@ -216,7 +249,7 @@ public function testSplitByDays(): void $lowerBound = new DateTimeImmutable('2019-01-13 14:15:16'); $upperBound = new DateTimeImmutable('2019-01-15 18:19:20'); $query = new QueryByFilters($lowerBound, $upperBound); - $handler = $this->createMock(MaximumRecordsHandler::class); + $handler = $this->createMock(MetadataMessageHandler::class); $metadata = new MetadataDownloader($this->createMock(QueryResolver::class), $handler); $split = []; @@ -249,7 +282,7 @@ public function testSplitByDaysPreserveOtherFilters(): void $query->setDownloadType($downloadType); $query->setComplement($complement); $query->setStateVoucher($stateVoucher); - $handler = $this->createMock(MaximumRecordsHandler::class); + $handler = $this->createMock(MetadataMessageHandler::class); $metadata = new MetadataDownloader($this->createMock(QueryResolver::class), $handler); foreach ($metadata->splitQueryByFiltersByDays($query) as $current) { diff --git a/tests/Unit/Internal/MetadataMessageTracker.php b/tests/Unit/Internal/MetadataMessageTracker.php new file mode 100644 index 0000000..4bc0bab --- /dev/null +++ b/tests/Unit/Internal/MetadataMessageTracker.php @@ -0,0 +1,83 @@ +resolved; + } + + /** @return string[] */ + public function getResolvedDates(): array + { + return $this->resolvedDates; + } + + /** @return string[] */ + public function getDivisions(): array + { + return $this->divisions; + } + + /** @return string[] */ + public function getMaximum(): array + { + return $this->maximum; + } + + public function resolved(DateTimeImmutable $since, DateTimeImmutable $until, int $count): void + { + $this->resolved[] = sprintf( + '%s - %s: %s', + $since->format('Y-m-d H:i:s'), + $until->format('Y-m-d H:i:s'), + $count, + ); + } + + public function date(DateTimeImmutable $since, DateTimeImmutable $until, int $count): void + { + $this->resolvedDates[] = sprintf( + '%s - %s: %s', + $since->format('Y-m-d H:i:s'), + $until->format('Y-m-d H:i:s'), + $count, + ); + } + + public function divide(DateTimeImmutable $since, DateTimeImmutable $until): void + { + $this->divisions[] = sprintf('%s - %s', $since->format('Y-m-d H:i:s'), $until->format('Y-m-d H:i:s')); + } + + public function maximum(DateTimeImmutable $moment): void + { + $this->maximum[] = $moment->format('Y-m-d H:i:s'); + } +} diff --git a/tests/Unit/SatScraperDownloadMethodsTest.php b/tests/Unit/SatScraperDownloadMethodsTest.php index e876e89..489b1de 100644 --- a/tests/Unit/SatScraperDownloadMethodsTest.php +++ b/tests/Unit/SatScraperDownloadMethodsTest.php @@ -8,7 +8,7 @@ namespace PhpCfdi\CfdiSatScraper\Tests\Unit; -use PhpCfdi\CfdiSatScraper\Contracts\MaximumRecordsHandler; +use PhpCfdi\CfdiSatScraper\Contracts\MetadataMessageHandler; use PhpCfdi\CfdiSatScraper\Filters\DownloadType; use PhpCfdi\CfdiSatScraper\Internal\MetadataDownloader; use PhpCfdi\CfdiSatScraper\MetadataList; @@ -26,11 +26,11 @@ final class SatScraperDownloadMethodsTest extends TestCase { public function testCreationOfMetadataDownloaderHasSatScraperProperties(): void { - $handler = $this->createMock(MaximumRecordsHandler::class); + $messageHandler = $this->createMock(MetadataMessageHandler::class); $satHttpGateway = $this->createMock(SatHttpGateway::class); $captcha = $this->createMock(CaptchaResolverInterface::class); $sessionManager = new CiecSessionManager(new CiecSessionData('rfc', 'ciec', $captcha)); - $scraper = new class ($sessionManager, $satHttpGateway, $handler) extends SatScraper { + $scraper = new class ($sessionManager, $satHttpGateway, $messageHandler) extends SatScraper { public function exposeCreateMetadataDownloader(): MetadataDownloader { return $this->createMetadataDownloader(); @@ -38,7 +38,7 @@ public function exposeCreateMetadataDownloader(): MetadataDownloader }; $downloader = $scraper->exposeCreateMetadataDownloader(); - $this->assertSame($handler, $downloader->getMaximumRecordsHandler()); + $this->assertSame($messageHandler, $downloader->getMessageHandler()); } /** @see SatScraper::listByUuids */ diff --git a/tests/Unit/SatScraperFactoryMethodsTest.php b/tests/Unit/SatScraperFactoryMethodsTest.php index 0bbac0c..1b80e27 100644 --- a/tests/Unit/SatScraperFactoryMethodsTest.php +++ b/tests/Unit/SatScraperFactoryMethodsTest.php @@ -4,7 +4,7 @@ namespace PhpCfdi\CfdiSatScraper\Tests\Unit; -use PhpCfdi\CfdiSatScraper\Contracts\MaximumRecordsHandler; +use PhpCfdi\CfdiSatScraper\Contracts\MetadataMessageHandler; use PhpCfdi\CfdiSatScraper\Internal\MetadataDownloader; use PhpCfdi\CfdiSatScraper\Internal\QueryResolver; use PhpCfdi\CfdiSatScraper\MetadataList; @@ -19,10 +19,10 @@ final class SatScraperFactoryMethodsTest extends TestCase { public function testMetadataDownloaderHasPropertiesFromScraper(): void { - $maximumRecordsHandler = $this->createMock(MaximumRecordsHandler::class); + $messageHandler = $this->createMock(MetadataMessageHandler::class); $sessionManager = $this->createMock(SessionManager::class); $httpGateway = $this->createMock(SatHttpGateway::class); - $scraper = new class ($sessionManager, $httpGateway, $maximumRecordsHandler) extends SatScraper { + $scraper = new class ($sessionManager, $httpGateway, $messageHandler) extends SatScraper { public function createMetadataDownloader(): MetadataDownloader { return parent::createMetadataDownloader(); @@ -35,7 +35,7 @@ public function createQueryResolver(): QueryResolver }; $downloader = $scraper->createMetadataDownloader(); $this->assertEquals($scraper->createQueryResolver(), $downloader->getQueryResolver()); - $this->assertSame($scraper->getMaximumRecordsHandler(), $downloader->getMaximumRecordsHandler()); + $this->assertSame($scraper->getMetadataMessageHandler(), $downloader->getMessageHandler()); } public function testResourceDownloaderWithArguments(): void diff --git a/tests/Unit/SatScraperPropertiesTest.php b/tests/Unit/SatScraperPropertiesTest.php index 9a015e3..243d5b4 100644 --- a/tests/Unit/SatScraperPropertiesTest.php +++ b/tests/Unit/SatScraperPropertiesTest.php @@ -4,8 +4,8 @@ namespace PhpCfdi\CfdiSatScraper\Tests\Unit; -use PhpCfdi\CfdiSatScraper\Contracts\MaximumRecordsHandler; -use PhpCfdi\CfdiSatScraper\Internal\NullMaximumRecordsHandler; +use PhpCfdi\CfdiSatScraper\Contracts\MetadataMessageHandler; +use PhpCfdi\CfdiSatScraper\NullMetadataMessageHandler; use PhpCfdi\CfdiSatScraper\SatHttpGateway; use PhpCfdi\CfdiSatScraper\SatScraper; use PhpCfdi\CfdiSatScraper\Sessions\SessionManager; @@ -16,12 +16,12 @@ final class SatScraperPropertiesTest extends TestCase private function createSatScraper( ?SessionManager $sessionManager = null, ?SatHttpGateway $satHttpGateway = null, - ?MaximumRecordsHandler $maximumRecordsHandler = null + ?MetadataMessageHandler $messageHandler = null ): SatScraper { return new SatScraper( $sessionManager ?? $this->createMock(SessionManager::class), $satHttpGateway, - $maximumRecordsHandler, + $messageHandler, ); } @@ -50,16 +50,16 @@ public function testSatHttpGatewayDefault(): void $this->assertInstanceOf(SatHttpGateway::class, $scraper->getSatHttpGateway()); } - public function testMaximumRecordsHandler(): void + public function testMetadataMessageHandler(): void { - $handler = $this->createMock(MaximumRecordsHandler::class); + $handler = $this->createMock(MetadataMessageHandler::class); $scraper = $this->createSatScraper(null, null, $handler); - $this->assertSame($handler, $scraper->getMaximumRecordsHandler(), 'Given handler should be the same'); + $this->assertSame($handler, $scraper->getMetadataMessageHandler(), 'Given handler should be the same'); } - public function testMaximumRecordsHandlerDefault(): void + public function testMetadataMessageHandlerDefault(): void { $scraper = $this->createSatScraper(); - $this->assertInstanceOf(NullMaximumRecordsHandler::class, $scraper->getMaximumRecordsHandler()); + $this->assertInstanceOf(NullMetadataMessageHandler::class, $scraper->getMetadataMessageHandler()); } }