57 lines
2.3 KiB
PHP
57 lines
2.3 KiB
PHP
<?php
|
|
|
|
namespace Tests\Unit;
|
|
|
|
use App\Console\Commands\PopulateDimTempo;
|
|
use App\Services\Sgc\CalendarDimension;
|
|
use PHPUnit\Framework\TestCase;
|
|
use Symfony\Component\Console\Tester\CommandTester;
|
|
|
|
final class CalendarDimensionTest extends TestCase
|
|
{
|
|
private function tester(): CommandTester
|
|
{
|
|
$command = new PopulateDimTempo;
|
|
$command->setLaravel(new \Illuminate\Foundation\Application(dirname(__DIR__, 2)));
|
|
return new CommandTester($command);
|
|
}
|
|
public function test_ten_complete_years_have_unique_dates_and_correct_boundaries(): void
|
|
{
|
|
$days = iterator_to_array(CalendarDimension::days(2026, 10));
|
|
self::assertCount(3652, $days);
|
|
self::assertSame('2026-01-01', $days[0]['data_completa']);
|
|
self::assertSame('2035-12-31', $days[array_key_last($days)]['data_completa']);
|
|
self::assertCount(3652, array_unique(array_column($days, 'data_id')));
|
|
$leap = array_values(array_filter($days, fn($d)=>$d['data_completa']==='2028-02-29'))[0];
|
|
self::assertSame(2, $leap['dia_semana']);
|
|
self::assertSame('Fevereiro', $leap['nome_mes']);
|
|
self::assertSame(1, $leap['trimestre']);
|
|
self::assertFalse($leap['eh_feriado']);
|
|
}
|
|
|
|
public function test_weekend_and_semester_fields_are_calendar_based(): void
|
|
{
|
|
$days = array_column(iterator_to_array(CalendarDimension::days(2026, 1)), null, 'data_completa');
|
|
self::assertFalse($days['2026-01-03']['eh_dia_util']);
|
|
self::assertFalse($days['2026-01-04']['eh_dia_util']);
|
|
self::assertTrue($days['2026-01-05']['eh_dia_util']);
|
|
self::assertSame(2, $days['2026-07-01']['semestre']);
|
|
self::assertSame(3, $days['2026-07-01']['trimestre']);
|
|
}
|
|
|
|
public function test_dry_run_never_needs_an_application_or_database(): void
|
|
{
|
|
$tester = $this->tester();
|
|
self::assertSame(0, $tester->execute(['--start-year'=>'2026', '--years'=>'10', '--dry-run'=>true]));
|
|
self::assertStringContainsString('3652', $tester->getDisplay());
|
|
}
|
|
|
|
public function test_invalid_range_is_refused_before_database_access(): void
|
|
{
|
|
$tester = $this->tester();
|
|
self::assertSame(2, $tester->execute(['--start-year'=>'2026', '--years'=>'-1']));
|
|
$this->expectException(\InvalidArgumentException::class);
|
|
iterator_to_array(CalendarDimension::days(9999, 2));
|
|
}
|
|
}
|