. */ declare(strict_types=1); namespace Fisharebest\Webtrees\Module; use Fisharebest\Webtrees\Auth; use Fisharebest\Webtrees\Contracts\UserInterface; use Fisharebest\Webtrees\Report\AbstractRenderer; use Fisharebest\Webtrees\Report\HtmlRenderer; use Fisharebest\Webtrees\Report\PdfRenderer; use Fisharebest\Webtrees\Report\ReportBaseCell; use Fisharebest\Webtrees\Report\ReportBaseElement; use Fisharebest\Webtrees\Report\ReportBaseFootnote; use Fisharebest\Webtrees\Report\ReportBaseImage; use Fisharebest\Webtrees\Report\ReportBaseLine; use Fisharebest\Webtrees\Report\ReportBaseText; use Fisharebest\Webtrees\Report\ReportBaseTextbox; use Fisharebest\Webtrees\Report\ReportExpressionLanguageProvider; use Fisharebest\Webtrees\Report\ReportHtmlCell; use Fisharebest\Webtrees\Report\ReportHtmlFootnote; use Fisharebest\Webtrees\Report\ReportHtmlImage; use Fisharebest\Webtrees\Report\ReportHtmlLine; use Fisharebest\Webtrees\Report\ReportHtmlText; use Fisharebest\Webtrees\Report\ReportHtmlTextbox; use Fisharebest\Webtrees\Report\ReportParserBase; use Fisharebest\Webtrees\Report\ReportParserGenerate; use Fisharebest\Webtrees\Report\ReportParserSetup; use Fisharebest\Webtrees\Report\ReportPdfCell; use Fisharebest\Webtrees\Report\ReportPdfFootnote; use Fisharebest\Webtrees\Report\ReportPdfImage; use Fisharebest\Webtrees\Report\ReportPdfLine; use Fisharebest\Webtrees\Report\ReportPdfText; use Fisharebest\Webtrees\Report\ReportPdfTextBox; use Fisharebest\Webtrees\Report\TcpdfWrapper; use Fisharebest\Webtrees\Services\UserService; use Fisharebest\Webtrees\TestCase; use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\Attributes\CoversTrait; use function ob_get_clean; use function ob_start; #[CoversTrait(ModuleReportTrait::class)] #[CoversClass(PedigreeReportModule::class)] #[CoversClass(AbstractRenderer::class)] #[CoversClass(HtmlRenderer::class)] #[CoversClass(PdfRenderer::class)] #[CoversClass(ReportBaseCell::class)] #[CoversClass(ReportBaseElement::class)] #[CoversClass(ReportBaseFootnote::class)] #[CoversClass(ReportBaseImage::class)] #[CoversClass(ReportBaseLine::class)] #[CoversClass(ReportBaseText::class)] #[CoversClass(ReportBaseTextbox::class)] #[CoversClass(ReportExpressionLanguageProvider::class)] #[CoversClass(ReportHtmlCell::class)] #[CoversClass(ReportHtmlFootnote::class)] #[CoversClass(ReportHtmlImage::class)] #[CoversClass(ReportHtmlLine::class)] #[CoversClass(ReportHtmlText::class)] #[CoversClass(ReportHtmlTextbox::class)] #[CoversClass(ReportParserBase::class)] #[CoversClass(ReportParserGenerate::class)] #[CoversClass(ReportParserSetup::class)] #[CoversClass(ReportPdfCell::class)] #[CoversClass(ReportPdfFootnote::class)] #[CoversClass(ReportPdfImage::class)] #[CoversClass(ReportPdfLine::class)] #[CoversClass(ReportPdfText::class)] #[CoversClass(ReportPdfTextBox::class)] #[CoversClass(TcpdfWrapper::class)] class DescendancyReportModuleTest extends TestCase { protected static bool $uses_database = true; public function testReportRunsWithoutError(): void { $user = (new UserService())->create('user', 'User', 'user@example.com', 'secret'); $user->setPreference(UserInterface::PREF_IS_ADMINISTRATOR, '1'); Auth::login($user); $tree = $this->importTree('demo.ged'); $module = new DescendancyReportModule(); $module->setName('descendancy_report'); $xml = 'resources/' . $module->xmlFilename(); $vars = [ 'pid' => ['id' => 'X1030'], 'maxgen' => ['id' => '3'], 'sources' => ['id' => 'on'], 'pageSize' => ['id' => 'A4'], ]; $report = new ReportParserSetup($xml); self::assertNotEmpty($report->reportProperties()); ob_start(); new ReportParserGenerate($xml, new HtmlRenderer(), $vars, $tree); $html = ob_get_clean(); self::assertStringStartsWith('<', $html); self::assertStringEndsWith('>', $html); ob_start(); new ReportParserGenerate($xml, new PdfRenderer(), $vars, $tree); $pdf = ob_get_clean(); self::assertStringStartsWith('%PDF', $pdf); self::assertStringEndsWith("%%EOF\n", $pdf); } }