Files
amare/tests/Browser/VisualRegressionTest.php
Manoel Freitas 2e43fdeb04 chore: usar America/Sao_Paulo como timezone da aplicação (#42)
A cidade de atuação é São Paulo, garantida por teste em quatro lugares e
exigida por openspec/specs/site-settings/spec.md. O identificador de
timezone, porém, era America/Fortaleza. O identificador passa a
acompanhar o negócio.

A mudança não altera comportamento. America/Sao_Paulo e
America/Fortaleza são UTC-3 o ano inteiro desde que o horário de verão
brasileiro foi extinto — verificado para janeiro, março e dezembro de
2026, idênticos ao segundo. Nada renderizado muda, o relógio congelado
dos testes visuais usa offset absoluto (-03:00) e os baselines seguem
válidos.

O motivo de mexer é outro: a divergência entre o timezone e a cidade
custou tempo real. Uma sessão anterior a interpretou como drift e
"corrigiu" a SPEC no sentido errado, mudando o documento normativo para
Fortaleza em vez de olhar o que o negócio é. Com os dois valores dizendo
São Paulo, não há mais o que interpretar.

Escopo: config/app.php, .env.example, os dois pontos do ci.yml,
SPEC.md (§0, §13.5, §15.4), README.md, docs/deployment/dokploy.md,
CLAUDE.md, openspec/config.yaml, openspec/specs/visual-regression/spec.md
e o withTimezone do VisualRegressionTest.

Intocados de propósito: as asserções que garantem que Fortaleza não
aparece como cidade de operação, em PublicPagesTest, SiteSettingsTest,
ContentSeederProductionGatingTest e openspec/specs/site-settings. Essas
tratam de cidade, não de fuso, e continuam corretas.

Co-Authored-By: Claude noreply@anthropic.com
AI-Assisted: yes
AI-Tool: claude-code

Co-authored-by: manoel.neto <manoel.neto@creditas.com>
2026-08-10 11:37:03 -03:00

60 lines
1.7 KiB
PHP

<?php
declare(strict_types=1);
use App\Models\SiteSetting;
use Database\Seeders\VisualContentSeeder;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Facades\Artisan;
uses(RefreshDatabase::class);
beforeEach(function (): void {
putenv('APP_FROZEN_NOW='.VisualContentSeeder::FROZEN_NOW);
$_ENV['APP_FROZEN_NOW'] = VisualContentSeeder::FROZEN_NOW;
$_SERVER['APP_FROZEN_NOW'] = VisualContentSeeder::FROZEN_NOW;
$this->refreshApplication();
Artisan::call('db:seed', ['--class' => VisualContentSeeder::class, '--force' => true]);
SiteSetting::instance();
});
afterEach(function (): void {
putenv('APP_FROZEN_NOW');
unset($_ENV['APP_FROZEN_NOW'], $_SERVER['APP_FROZEN_NOW']);
});
$screens = [
'home' => '/',
'services' => '/servicos',
'portfolio' => '/portfolio',
'portfolio-detail' => '/portfolio/casamento-ana-lucas',
'about' => '/sobre',
'contact' => '/contato',
'privacy' => '/privacidade',
'not-found' => '/__missing-visual-page',
];
$viewports = [
'desktop' => [1440, 1000],
'mobile' => [390, 844],
];
foreach ($screens as $screen => $path) {
foreach ($viewports as $viewport => [$width, $height]) {
it("matches {$screen} {$viewport} visual baseline", function () use ($path, $width, $height): void {
$this->assertStableScreenshotMatches(
$this->visit($path, [
'reducedMotion' => 'reduce',
])
->withLocale('pt-BR')
->withTimezone('America/Sao_Paulo')
->resize($width, $height),
resetScroll: $path === '/',
);
});
}
}