app->register(ServiceProvider::class); Carbon::setTestNow(Carbon::parse('2026-08-24 17:53:00', 'UTC')); } protected function tearDown(): void { Carbon::setTestNow(); parent::tearDown(); } public function test_it_downloads_the_sales_report_as_a_pdf(): void { $response = app(AdminAppSalePdfService::class)->downloadSales( $this->tenant(), collect([$this->sale()]), 'America/La_Paz', ); $this->assertSame('application/pdf', $response->headers->get('content-type')); $this->assertStringContainsString( 'attachment; filename=ventas_acme_20260824_135300.pdf', (string) $response->headers->get('content-disposition'), ); $this->assertStringStartsWith('%PDF', $response->getContent()); } public function test_it_downloads_the_modification_history_as_a_pdf(): void { $sale = $this->sale(); $admin = (new User)->forceFill([ 'id' => 10, 'nombre_apellido' => 'Admin Test', 'email' => 'admin@example.test', ]); $modification = (new ValueChange)->forceFill([ 'id' => 1, 'trackable_id' => $sale->id, 'attribute' => 'status', 'old_value' => Purchase::STATUS_PENDING_PAYMENT, 'new_value' => Purchase::STATUS_PAID, 'changed_at' => now(), 'actor_type' => 'user', ]); $modification->setRelation('trackable', $sale); $modification->setRelation('user', $admin); $response = app(AdminAppSalePdfService::class)->downloadModifications( $this->tenant(), collect([$modification]), 'America/La_Paz', ); $this->assertSame('application/pdf', $response->headers->get('content-type')); $this->assertStringContainsString( 'attachment; filename=historial_modificaciones_acme_20260824_135300.pdf', (string) $response->headers->get('content-disposition'), ); $this->assertStringStartsWith('%PDF', $response->getContent()); } public function test_it_renders_pdf_dates_in_the_requested_timezone(): void { $sale = $this->sale(); $modification = (new ValueChange)->forceFill([ 'id' => 1, 'trackable_id' => $sale->id, 'attribute' => 'status', 'old_value' => Purchase::STATUS_PENDING_PAYMENT, 'new_value' => Purchase::STATUS_PAID, 'changed_at' => now(), 'actor_type' => 'system', ]); $modification->setRelation('trackable', $sale); $modification->setRelation('user', null); $salesHtml = view('pdf.adminapp.sales', [ 'tenant' => $this->tenant(), 'sales' => collect([$sale]), 'generatedAt' => now(), 'timeZone' => 'America/La_Paz', 'confirmedSalesTotal' => '25000.00', ])->render(); $modificationsHtml = view('pdf.adminapp.sale-modifications', [ 'tenant' => $this->tenant(), 'modifications' => collect([$modification]), 'generatedAt' => now(), 'timeZone' => 'America/La_Paz', ])->render(); $this->assertStringContainsString('Generado el 24/08/2026 13:53', $salesHtml); $this->assertStringContainsString('24/08/2026 13:53', $salesHtml); $this->assertStringContainsString('Generado el 24/08/2026 13:53', $modificationsHtml); $this->assertStringContainsString('13:53:00', $modificationsHtml); } private function tenant(): Tenant { return (new Tenant)->forceFill([ 'codigo' => 'acme', 'nombre' => 'Acme Eventos', ]); } private function sale(): Purchase { return (new Purchase)->forceFill([ 'id' => 15, 'created_at' => now(), 'nombre_apellido' => 'Cliente Test', 'quantity' => 2, 'status' => Purchase::STATUS_PAID, 'total' => '25000.00', 'tickets_count' => 2, ]); } }