customize html and pdf exports with twig templates (#1582)

This commit is contained in:
Kevin Papst
2020-03-23 01:51:02 +01:00
committed by GitHub
parent 1ca1b00d11
commit 33f76f426c
32 changed files with 895 additions and 307 deletions

View File

@@ -88,8 +88,8 @@ class ExportControllerTest extends ControllerBaseTest
$this->assertDataTableRowCount($client, 'datatable_export', 23);
// assert export type buttons are available
$expected = ['csv', 'html', 'pdf', 'xlsx'];
$node = $client->getCrawler()->filter('#export-buttons button');
$expected = ['csv', 'default.html.twig', 'default-budget.pdf.twig', 'default.pdf.twig', 'xlsx'];
$node = $client->getCrawler()->filter('#export-buttons .startExportBtn');
$this->assertEquals(count($expected), $node->count());
/** @var \DOMElement $button */
foreach ($node->getIterator() as $button) {
@@ -140,8 +140,8 @@ class ExportControllerTest extends ControllerBaseTest
$this->assertDataTableRowCount($client, 'datatable_export', 3);
// assert export type buttons are available
$expected = ['csv', 'html', 'pdf', 'xlsx'];
$node = $client->getCrawler()->filter('#export-buttons button');
$expected = ['csv', 'default.html.twig', 'default-budget.pdf.twig', 'default.pdf.twig', 'xlsx'];
$node = $client->getCrawler()->filter('#export-buttons .startExportBtn');
$this->assertEquals(count($expected), $node->count());
/** @var \DOMElement $button */
foreach ($node->getIterator() as $button) {
@@ -208,7 +208,7 @@ class ExportControllerTest extends ControllerBaseTest
// don't add daterange to make sure the current month is the default range
$client->submit($form, [
'type' => 'html',
'type' => 'default.html.twig',
'markAsExported' => 1
]);

View File

@@ -292,6 +292,14 @@ class ConfigurationTest extends TestCase
'simple_form' => true,
'number_format' => '{Y}/{cy,3}',
],
'export' => [
'documents' => [
],
'defaults' => [
0 => 'var/export/',
1 => 'templates/export/renderer/',
],
],
'languages' => [],
'calendar' => [
'week_numbers' => true,

View File

@@ -25,6 +25,7 @@ use App\Event\ActivityMetaDisplayEvent;
use App\Event\CustomerMetaDisplayEvent;
use App\Event\ProjectMetaDisplayEvent;
use App\Event\TimesheetMetaDisplayEvent;
use App\Export\ExportRendererInterface;
use App\Export\RendererInterface;
use App\Repository\Query\TimesheetQuery;
use App\Twig\DateExtensions;
@@ -74,10 +75,10 @@ abstract class AbstractRendererTest extends KernelTestCase
}
/**
* @param RendererInterface $renderer
* @param ExportRendererInterface $renderer
* @return \Symfony\Component\HttpFoundation\Response
*/
protected function render(RendererInterface $renderer)
protected function render(ExportRendererInterface $renderer)
{
$customer = new Customer();
$customer->setName('Customer Name');

View File

@@ -0,0 +1,38 @@
<?php
/*
* This file is part of the Kimai time-tracking app.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace App\Tests\Export\Renderer;
use App\Export\Renderer\HtmlRenderer;
use App\Export\Renderer\HtmlRendererFactory;
use App\Repository\ProjectRepository;
use PHPUnit\Framework\TestCase;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Twig\Environment;
/**
* @covers \App\Export\Renderer\HtmlRendererFactory
*/
class HtmlRendererFactoryTest extends TestCase
{
public function testCreate()
{
$sut = new HtmlRendererFactory(
$this->createMock(Environment::class),
$this->createMock(EventDispatcherInterface::class),
$this->createMock(ProjectRepository::class)
);
/** @var HtmlRenderer $renderer */
$renderer = $sut->create('foo', 'bar.html.twig');
self::assertInstanceOf(HtmlRenderer::class, $renderer);
self::assertEquals('foo', $renderer->getId());
}
}

View File

@@ -10,6 +10,7 @@
namespace App\Tests\Export\Renderer;
use App\Export\Renderer\HtmlRenderer;
use App\Repository\ProjectRepository;
use Symfony\Component\EventDispatcher\EventDispatcher;
use Symfony\Component\HttpFoundation\Request;
use Twig\Environment;
@@ -26,7 +27,8 @@ class HtmlRendererTest extends AbstractRendererTest
{
$sut = new HtmlRenderer(
$this->createMock(Environment::class),
new EventDispatcher()
new EventDispatcher(),
$this->createMock(ProjectRepository::class)
);
$this->assertEquals('html', $sut->getId());
@@ -44,7 +46,7 @@ class HtmlRendererTest extends AbstractRendererTest
$request->setLocale('en');
$stack->push($request);
$sut = new HtmlRenderer($twig, new EventDispatcher());
$sut = new HtmlRenderer($twig, new EventDispatcher(), $this->createMock(ProjectRepository::class));
$response = $this->render($sut);

View File

@@ -0,0 +1,41 @@
<?php
/*
* This file is part of the Kimai time-tracking app.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace App\Tests\Export\Renderer;
use App\Export\Renderer\HtmlRenderer;
use App\Export\Renderer\PDFRenderer;
use App\Export\Renderer\PdfRendererFactory;
use App\Repository\ProjectRepository;
use App\Timesheet\UserDateTimeFactory;
use App\Utils\HtmlToPdfConverter;
use PHPUnit\Framework\TestCase;
use Twig\Environment;
/**
* @covers \App\Export\Renderer\PdfRendererFactory
*/
class PdfRendererFactoryTest extends TestCase
{
public function testCreate()
{
$sut = new PdfRendererFactory(
$this->createMock(Environment::class),
$this->createMock(UserDateTimeFactory::class),
$this->createMock(HtmlToPdfConverter::class),
$this->createMock(ProjectRepository::class)
);
/** @var HtmlRenderer $renderer */
$renderer = $sut->create('foo', 'bar.pdf.twig');
self::assertInstanceOf(PDFRenderer::class, $renderer);
self::assertEquals('foo', $renderer->getId());
}
}

View File

@@ -10,6 +10,7 @@
namespace App\Tests\Export\Renderer;
use App\Export\Renderer\PDFRenderer;
use App\Repository\ProjectRepository;
use App\Tests\Mocks\Security\UserDateTimeFactoryFactory;
use App\Utils\HtmlToPdfConverter;
use App\Utils\MPdfConverter;
@@ -34,7 +35,8 @@ class PdfRendererTest extends AbstractRendererTest
$sut = new PDFRenderer(
$this->createMock(Environment::class),
$this->getDateTimeFactory(),
$this->createMock(HtmlToPdfConverter::class)
$this->createMock(HtmlToPdfConverter::class),
$this->createMock(ProjectRepository::class)
);
$this->assertEquals('pdf', $sut->getId());
@@ -54,7 +56,7 @@ class PdfRendererTest extends AbstractRendererTest
$request->setLocale('en');
$stack->push($request);
$sut = new PDFRenderer($twig, $this->getDateTimeFactory(), $converter);
$sut = new PDFRenderer($twig, $this->getDateTimeFactory(), $converter, $this->createMock(ProjectRepository::class));
$response = $this->render($sut);

View File

@@ -12,6 +12,7 @@ namespace App\Tests\Export;
use App\Export\Renderer\HtmlRenderer;
use App\Export\ServiceExport;
use App\Export\Timesheet\HtmlRenderer as HtmlExporter;
use App\Repository\ProjectRepository;
use PHPUnit\Framework\TestCase;
use Symfony\Component\EventDispatcher\EventDispatcher;
use Twig\Environment;
@@ -36,7 +37,7 @@ class ServiceExportTest extends TestCase
{
$sut = new ServiceExport();
$renderer = new HtmlRenderer($this->createMock(Environment::class), new EventDispatcher());
$renderer = new HtmlRenderer($this->createMock(Environment::class), new EventDispatcher(), $this->createMock(ProjectRepository::class));
$sut->addRenderer($renderer);
self::assertEquals(1, count($sut->getRenderer()));

View File

@@ -10,6 +10,7 @@
namespace App\Tests\Export\Timesheet;
use App\Export\Timesheet\PDFRenderer;
use App\Repository\ProjectRepository;
use App\Tests\Mocks\Security\UserDateTimeFactoryFactory;
use App\Utils\HtmlToPdfConverter;
use App\Utils\MPdfConverter;
@@ -32,9 +33,10 @@ class PdfRendererTest extends AbstractRendererTest
public function testConfiguration()
{
$sut = new PDFRenderer(
$this->getMockBuilder(Environment::class)->disableOriginalConstructor()->getMock(),
$this->createMock(Environment::class),
$this->getDateTimeFactory(),
$this->getMockBuilder(HtmlToPdfConverter::class)->getMock()
$this->createMock(HtmlToPdfConverter::class),
$this->createMock(ProjectRepository::class)
);
$this->assertEquals('pdf', $sut->getId());
@@ -52,7 +54,7 @@ class PdfRendererTest extends AbstractRendererTest
$request->setLocale('en');
$stack->push($request);
$sut = new PDFRenderer($twig, $this->getDateTimeFactory(), $converter);
$sut = new PDFRenderer($twig, $this->getDateTimeFactory(), $converter, $this->createMock(ProjectRepository::class));
$response = $this->render($sut);