182 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
			
		
		
	
	
			182 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
<?php
 | 
						|
 | 
						|
namespace Tests\Feature\Invoice;
 | 
						|
 | 
						|
use App\Invoice\BillDocument;
 | 
						|
use App\Invoice\DocumentFactory;
 | 
						|
use App\Invoice\InvoiceSettings;
 | 
						|
use App\Invoice\Queries\InvoiceMemberQuery;
 | 
						|
use App\Invoice\Queries\SingleMemberQuery;
 | 
						|
use App\Invoice\RememberDocument;
 | 
						|
use App\Member\Member;
 | 
						|
use App\Payment\Payment;
 | 
						|
use Illuminate\Foundation\Testing\DatabaseTransactions;
 | 
						|
use Tests\RequestFactories\Child;
 | 
						|
use Tests\TestCase;
 | 
						|
use Zoomyboy\Tex\Tex;
 | 
						|
 | 
						|
class DocumentFactoryTest extends TestCase
 | 
						|
{
 | 
						|
    use DatabaseTransactions;
 | 
						|
 | 
						|
    public function testItDisplaysMemberInformation(): void
 | 
						|
    {
 | 
						|
        $member = Member::factory()
 | 
						|
            ->defaults()
 | 
						|
            ->state([
 | 
						|
                'firstname' => '::firstname::',
 | 
						|
                'lastname' => '::lastname::',
 | 
						|
                'address' => '::street::',
 | 
						|
                'zip' => '::zip::',
 | 
						|
                'location' => '::location::',
 | 
						|
            ])
 | 
						|
            ->has(Payment::factory()->notPaid()->nr('1995')->subscription('::subName::', [
 | 
						|
                new Child('a', 1000),
 | 
						|
                new Child('a', 500),
 | 
						|
            ]))
 | 
						|
            ->create();
 | 
						|
 | 
						|
        $invoice = app(DocumentFactory::class)->singleInvoice(BillDocument::class, $this->query($member));
 | 
						|
 | 
						|
        $invoice->assertHasAllContent([
 | 
						|
            'Rechnung',
 | 
						|
            '15.00',
 | 
						|
            '::subName:: 1995 für ::firstname:: ::lastname::',
 | 
						|
            'Mitgliedsbeitrag für ::lastname::',
 | 
						|
            'Familie ::lastname::\\\\::street::\\\\::zip:: ::location::',
 | 
						|
        ]);
 | 
						|
    }
 | 
						|
 | 
						|
    public function testItDisplaysSplitPayments(): void
 | 
						|
    {
 | 
						|
        $member = Member::factory()
 | 
						|
            ->defaults()
 | 
						|
            ->state([
 | 
						|
                'firstname' => '::firstname::',
 | 
						|
                'lastname' => '::lastname::',
 | 
						|
            ])
 | 
						|
            ->has(Payment::factory()->notPaid()->nr('1995')->subscription('::subName::', [
 | 
						|
                new Child('a', 1000),
 | 
						|
                new Child('b', 500),
 | 
						|
            ], ['split' => true]))
 | 
						|
            ->create();
 | 
						|
 | 
						|
        $invoice = app(DocumentFactory::class)->singleInvoice(BillDocument::class, $this->query($member));
 | 
						|
 | 
						|
        $invoice->assertHasAllContent([
 | 
						|
            'Rechnung',
 | 
						|
            '10.00',
 | 
						|
            '5.00',
 | 
						|
            '::subName:: (a) 1995 für ::firstname:: ::lastname::',
 | 
						|
            '::subName:: (b) 1995 für ::firstname:: ::lastname::',
 | 
						|
            'Mitgliedsbeitrag für ::lastname::',
 | 
						|
        ]);
 | 
						|
    }
 | 
						|
 | 
						|
    public function testBillSetsFilename(): void
 | 
						|
    {
 | 
						|
        $member = Member::factory()
 | 
						|
            ->defaults()
 | 
						|
            ->state(['lastname' => '::lastname::'])
 | 
						|
            ->has(Payment::factory()->notPaid()->nr('1995'))
 | 
						|
            ->create();
 | 
						|
 | 
						|
        $invoice = app(DocumentFactory::class)->singleInvoice(BillDocument::class, $this->query($member));
 | 
						|
 | 
						|
        $this->assertEquals('rechnung-fur-lastname.pdf', $invoice->compiledFilename());
 | 
						|
    }
 | 
						|
 | 
						|
    public function testRememberSetsFilename(): void
 | 
						|
    {
 | 
						|
        $member = Member::factory()
 | 
						|
            ->defaults()
 | 
						|
            ->state(['lastname' => '::lastname::'])
 | 
						|
            ->has(Payment::factory()->notPaid()->state(['last_remembered_at' => now()->subMonths(6)]))
 | 
						|
            ->create();
 | 
						|
 | 
						|
        $invoice = app(DocumentFactory::class)->singleInvoice(RememberDocument::class, $this->query($member));
 | 
						|
 | 
						|
        $this->assertEquals('zahlungserinnerung-fur-lastname.pdf', $invoice->compiledFilename());
 | 
						|
    }
 | 
						|
 | 
						|
    public function testItCreatesOneFileForFamilyMembers(): void
 | 
						|
    {
 | 
						|
        $firstMember = Member::factory()
 | 
						|
            ->defaults()
 | 
						|
            ->state(['firstname' => 'Max1', 'lastname' => '::lastname::', 'address' => '::address::', 'zip' => '12345', 'location' => '::location::'])
 | 
						|
            ->has(Payment::factory()->notPaid()->nr('nr1'))
 | 
						|
            ->create();
 | 
						|
        Member::factory()
 | 
						|
            ->defaults()
 | 
						|
            ->state(['firstname' => 'Max2', 'lastname' => '::lastname::', 'address' => '::address::', 'zip' => '12345', 'location' => '::location::'])
 | 
						|
            ->has(Payment::factory()->notPaid()->nr('nr2'))
 | 
						|
            ->create();
 | 
						|
 | 
						|
        $invoice = app(DocumentFactory::class)->singleInvoice(BillDocument::class, $this->query($firstMember));
 | 
						|
 | 
						|
        $invoice->assertHasAllContent(['Max1', 'Max2', 'nr1', 'nr2']);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @testWith ["App\\Invoice\\BillDocument"]
 | 
						|
     *           ["App\\Invoice\\RememberDocument"]
 | 
						|
     */
 | 
						|
    public function testItDisplaysSettings(string $type): void
 | 
						|
    {
 | 
						|
        InvoiceSettings::fake([
 | 
						|
            'from_long' => 'langer Stammesname',
 | 
						|
            'from' => 'Stammeskurz',
 | 
						|
            'mobile' => '+49 176 55555',
 | 
						|
            'email' => 'max@muster.de',
 | 
						|
            'website' => 'https://example.com',
 | 
						|
            'address' => 'Musterstr 4',
 | 
						|
            'place' => 'Münster',
 | 
						|
            'zip' => '12345',
 | 
						|
            'iban' => 'DE444',
 | 
						|
            'bic' => 'SOLSSSSS',
 | 
						|
        ]);
 | 
						|
        $member = Member::factory()
 | 
						|
            ->defaults()
 | 
						|
            ->has(Payment::factory()->notPaid()->nr('nr2'))
 | 
						|
            ->create();
 | 
						|
 | 
						|
        $invoice = app(DocumentFactory::class)->singleInvoice($type, $this->query($member));
 | 
						|
 | 
						|
        $invoice->assertHasAllContent([
 | 
						|
            'langer Stammesname',
 | 
						|
            'Stammeskurz',
 | 
						|
            '+49 176 55555',
 | 
						|
            'max@muster.de',
 | 
						|
            'https://example.com',
 | 
						|
            'Musterstr 4',
 | 
						|
            'Münster',
 | 
						|
            '12345',
 | 
						|
            'DE444',
 | 
						|
            'SOLSSSSS',
 | 
						|
        ]);
 | 
						|
    }
 | 
						|
 | 
						|
    public function testItGeneratesAPdf(): void
 | 
						|
    {
 | 
						|
        Tex::fake();
 | 
						|
        $member = Member::factory()
 | 
						|
            ->defaults()
 | 
						|
            ->has(Payment::factory()->notPaid())
 | 
						|
            ->create(['lastname' => 'lastname']);
 | 
						|
        $this->withoutExceptionHandling();
 | 
						|
        $this->login()->init()->loginNami();
 | 
						|
 | 
						|
        $response = $this->call('GET', "/member/{$member->id}/pdf", [
 | 
						|
            'type' => BillDocument::class,
 | 
						|
        ]);
 | 
						|
 | 
						|
        $this->assertEquals('application/pdf', $response->headers->get('content-type'));
 | 
						|
        $this->assertEquals('inline; filename="rechnung-fur-lastname.pdf"', $response->headers->get('content-disposition'));
 | 
						|
    }
 | 
						|
 | 
						|
    private function query(Member $member): InvoiceMemberQuery
 | 
						|
    {
 | 
						|
        return new SingleMemberQuery($member);
 | 
						|
    }
 | 
						|
}
 |