219 lines
		
	
	
		
			7.7 KiB
		
	
	
	
		
			PHP
		
	
	
	
			
		
		
	
	
			219 lines
		
	
	
		
			7.7 KiB
		
	
	
	
		
			PHP
		
	
	
	
<?php
 | 
						|
 | 
						|
namespace Tests\Feature\Pdf;
 | 
						|
 | 
						|
use App\Country;
 | 
						|
use App\Fee;
 | 
						|
use App\Group;
 | 
						|
use App\Letter\BillDocument;
 | 
						|
use App\Letter\DocumentFactory;
 | 
						|
use App\Letter\Letter;
 | 
						|
use App\Member\Member;
 | 
						|
use App\Nationality;
 | 
						|
use App\Payment\Subscription;
 | 
						|
use Carbon\Carbon;
 | 
						|
use Database\Factories\Member\MemberFactory;
 | 
						|
use Database\Factories\Payment\PaymentFactory;
 | 
						|
use Illuminate\Foundation\Testing\DatabaseTransactions;
 | 
						|
use Illuminate\Support\Collection;
 | 
						|
use Storage;
 | 
						|
use Tests\TestCase;
 | 
						|
 | 
						|
class GenerateTest extends TestCase
 | 
						|
{
 | 
						|
    use DatabaseTransactions;
 | 
						|
 | 
						|
    public function setUp(): void
 | 
						|
    {
 | 
						|
        parent::setUp();
 | 
						|
 | 
						|
        Carbon::setTestNow(Carbon::parse('2021-04-15 00:00:00'));
 | 
						|
 | 
						|
        Storage::fake('temp');
 | 
						|
    }
 | 
						|
 | 
						|
    public function generatorProvider(): array
 | 
						|
    {
 | 
						|
        return [
 | 
						|
            'no_pdf_when_no_bill' => [
 | 
						|
                'members' => [
 | 
						|
                    [
 | 
						|
                        'factory' => fn (MemberFactory $member) => $member,
 | 
						|
                        'payments' => [],
 | 
						|
                    ],
 | 
						|
                ],
 | 
						|
                'urlCallable' => fn (Collection $members): int => $members->first()->id,
 | 
						|
                'type' => BillDocument::class,
 | 
						|
                'filename' => null,
 | 
						|
            ],
 | 
						|
            'bill_for_single_member_when_no_bill_received_yet' => [
 | 
						|
                'members' => [
 | 
						|
                    [
 | 
						|
                        'factory' => fn (MemberFactory $member) => $member
 | 
						|
                            ->state([
 | 
						|
                                'firstname' => '::firstname::',
 | 
						|
                                'lastname' => '::lastname::',
 | 
						|
                                'address' => '::street::',
 | 
						|
                                'zip' => '::zip::',
 | 
						|
                                'location' => '::location::',
 | 
						|
                            ]),
 | 
						|
                        'payments' => [
 | 
						|
                            fn (PaymentFactory $payment) => $payment
 | 
						|
                                ->notPaid()
 | 
						|
                                ->nr('1995')
 | 
						|
                                ->subscription('::subName::', 1500),
 | 
						|
                        ],
 | 
						|
                    ],
 | 
						|
                ],
 | 
						|
                'urlCallable' => fn (Collection $members): int => $members->first()->id,
 | 
						|
                'type' => BillDocument::class,
 | 
						|
                'filename' => 'rechnung-fur-lastname.pdf',
 | 
						|
                'output' => [
 | 
						|
                    'Rechnung',
 | 
						|
                    '15.00',
 | 
						|
                    'Beitrag 1995 für ::firstname:: ::lastname:: (::subName::)',
 | 
						|
                    'Mitgliedsbeitrag für ::lastname::',
 | 
						|
                    'Familie ::lastname::\\\\::street::\\\\::zip:: ::location::',
 | 
						|
                ],
 | 
						|
            ],
 | 
						|
            'bill_has_deadline' => [
 | 
						|
                'members' => [
 | 
						|
                    [
 | 
						|
                        'factory' => fn (MemberFactory $member) => $member
 | 
						|
                            ->state([
 | 
						|
                                'firstname' => '::firstname::',
 | 
						|
                                'lastname' => '::lastname::',
 | 
						|
                            ]),
 | 
						|
                        'payments' => [
 | 
						|
                            fn (PaymentFactory $payment) => $payment
 | 
						|
                                ->nr('A')->notPaid()->subscription('::subName::', 1500),
 | 
						|
                        ],
 | 
						|
                    ],
 | 
						|
                ],
 | 
						|
                'urlCallable' => fn (Collection $members): int => $members->first()->id,
 | 
						|
                'type' => BillDocument::class,
 | 
						|
                'filename' => 'rechnung-fur-lastname.pdf',
 | 
						|
                'output' => [
 | 
						|
                    '29.04.2021',
 | 
						|
                ],
 | 
						|
            ],
 | 
						|
            'families' => [
 | 
						|
                'members' => [
 | 
						|
                    [
 | 
						|
                        'factory' => fn (MemberFactory $member) => $member
 | 
						|
                            ->state([
 | 
						|
                                'firstname' => '::firstname1::',
 | 
						|
                                'lastname' => '::lastname::',
 | 
						|
                                'address' => '::address::',
 | 
						|
                                'zip' => '12345',
 | 
						|
                                'location' => '::location::',
 | 
						|
                            ]),
 | 
						|
                        'payments' => [
 | 
						|
                            fn (PaymentFactory $payment) => $payment
 | 
						|
                                ->nr('::nr::')->notPaid()->subscription('::subName::', 1500),
 | 
						|
                        ],
 | 
						|
                    ],
 | 
						|
                    [
 | 
						|
                        'factory' => fn (MemberFactory $member) => $member
 | 
						|
                            ->state([
 | 
						|
                                'firstname' => '::firstname2::',
 | 
						|
                                'lastname' => '::lastname::',
 | 
						|
                                'address' => '::address::',
 | 
						|
                                'zip' => '12345',
 | 
						|
                                'location' => '::location::',
 | 
						|
                            ]),
 | 
						|
                        'payments' => [
 | 
						|
                            fn (PaymentFactory $payment) => $payment
 | 
						|
                                ->nr('::nr2::')->notPaid()->subscription('::subName2::', 1600),
 | 
						|
                        ],
 | 
						|
                    ],
 | 
						|
                ],
 | 
						|
                'urlCallable' => fn (Collection $members): int => $members->first()->id,
 | 
						|
                'type' => BillDocument::class,
 | 
						|
                'filename' => 'rechnung-fur-lastname.pdf',
 | 
						|
                'output' => [
 | 
						|
                    '::nr::',
 | 
						|
                    '::nr2::',
 | 
						|
                    '::subName::',
 | 
						|
                    '::subName2::',
 | 
						|
                ],
 | 
						|
            ],
 | 
						|
        ];
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @dataProvider generatorProvider
 | 
						|
     *
 | 
						|
     * @param class-string<Letter> $type
 | 
						|
     */
 | 
						|
    public function testItGeneratesTheLayout(
 | 
						|
        array $members,
 | 
						|
        callable $urlCallable,
 | 
						|
        string $type,
 | 
						|
        ?string $filename = null,
 | 
						|
        ?array $output = null
 | 
						|
    ): void {
 | 
						|
        $this->withoutExceptionHandling();
 | 
						|
        $this->login()->init();
 | 
						|
        $members = $this->setupMembers($members);
 | 
						|
 | 
						|
        $urlId = call_user_func($urlCallable, $members);
 | 
						|
        $member = Member::find($urlId);
 | 
						|
        $repo = app(DocumentFactory::class)->fromSingleRequest($type, $member);
 | 
						|
 | 
						|
        if (null === $filename) {
 | 
						|
            $this->assertNull($repo);
 | 
						|
 | 
						|
            return;
 | 
						|
        }
 | 
						|
 | 
						|
        $content = $repo->renderBody();
 | 
						|
 | 
						|
        foreach ($output as $out) {
 | 
						|
            $this->assertStringContainsString($out, $content);
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    /** @dataProvider generatorProvider */
 | 
						|
    public function testItGeneratesAPdf(
 | 
						|
        array $members,
 | 
						|
        callable $urlCallable,
 | 
						|
        string $type,
 | 
						|
        ?string $filename = null,
 | 
						|
        ?array $output = null
 | 
						|
    ): void {
 | 
						|
        $this->withoutExceptionHandling();
 | 
						|
        $this->login()->init()->loginNami();
 | 
						|
        $members = $this->setupMembers($members);
 | 
						|
 | 
						|
        $urlId = call_user_func($urlCallable, $members);
 | 
						|
        $response = $this->call('GET', "/member/{$urlId}/pdf", [
 | 
						|
            'type' => $type,
 | 
						|
        ]);
 | 
						|
 | 
						|
        if (null === $filename) {
 | 
						|
            $response->assertStatus(204);
 | 
						|
 | 
						|
            return;
 | 
						|
        }
 | 
						|
 | 
						|
        $this->assertEquals('application/pdf', $response->headers->get('content-type'));
 | 
						|
        $this->assertEquals('inline; filename="'.$filename.'"', $response->headers->get('content-disposition'));
 | 
						|
    }
 | 
						|
 | 
						|
    private function setupMembers(array $members): Collection
 | 
						|
    {
 | 
						|
        return collect($members)->map(function (array $member): Member {
 | 
						|
            $memberFactory = Member::factory()
 | 
						|
                ->for(Nationality::factory())
 | 
						|
                ->for(Subscription::factory()->for(Fee::factory()))
 | 
						|
                ->withPayments(data_get($member, 'payments', []))
 | 
						|
                ->forCountry(Country::find(5))
 | 
						|
                ->for(Group::factory());
 | 
						|
            $memberModel = call_user_func($member['factory'], $memberFactory)->create();
 | 
						|
 | 
						|
            return $memberModel->load('payments');
 | 
						|
        });
 | 
						|
    }
 | 
						|
}
 |