login()->loginNami()->withoutExceptionHandling(); $invoice = Invoice::factory()->create(); $this->patchJson( route('invoice.update', ['invoice' => $invoice]), InvoiceRequestFactory::new() ->to(ReceiverRequestFactory::new()->name('Familie Blabla')->address('Musterstr 44')->zip('22222')->location('Solingen')) ->status(InvoiceStatus::PAID) ->via(BillKind::POST) ->state([ 'greeting' => 'Hallo Familie', ]) ->create() )->assertOk(); $this->assertDatabaseCount('invoices', 1); $this->assertDatabaseHas('invoices', [ 'greeting' => 'Hallo Familie', 'via' => BillKind::POST->value, 'status' => InvoiceStatus::PAID->value, 'id' => $invoice->id, ]); $invoice = Invoice::firstWhere('greeting', 'Hallo Familie'); $this->assertEquals([ 'name' => 'Familie Blabla', 'address' => 'Musterstr 44', 'zip' => '22222', 'location' => 'Solingen', ], $invoice->to); } public function testItAddsAPosition(): void { $this->login()->loginNami()->withoutExceptionHandling(); $invoice = Invoice::factory()->create(); $this->patchJson( route('invoice.update', ['invoice' => $invoice]), InvoiceRequestFactory::new() ->position(InvoicePositionRequestFactory::new()) ->position(InvoicePositionRequestFactory::new()) ->create() )->assertOk(); $this->assertDatabaseCount('invoice_positions', 2); } public function testItUpdatesAPosition(): void { $this->login()->loginNami()->withoutExceptionHandling(); $invoice = Invoice::factory()->has(InvoicePosition::factory()->withMember(), 'positions')->create(); $this->patchJson( route('invoice.update', ['invoice' => $invoice]), InvoiceRequestFactory::new() ->position(InvoicePositionRequestFactory::new()->description('la')->id($invoice->positions->first()->id)) ->create() )->assertOk(); $this->assertDatabaseCount('invoice_positions', 1); $this->assertDatabaseHas('invoice_positions', [ 'description' => 'la', 'id' => $invoice->positions->first()->id, ]); } public function testItDeletesAPosition(): void { $this->login()->loginNami()->withoutExceptionHandling(); $invoice = Invoice::factory()->has(InvoicePosition::factory()->withMember(), 'positions')->create(); $this->patchJson( route('invoice.update', ['invoice' => $invoice]), InvoiceRequestFactory::new() ->create() )->assertOk(); $this->assertDatabaseCount('invoice_positions', 0); } public function validationDataProvider(): Generator { yield [ ['to.address' => ''], ['to.address' => 'Adresse ist erforderlich.'] ]; yield [ ['to.name' => ''], ['to.name' => 'Name ist erforderlich.'] ]; yield [ ['to.location' => ''], ['to.location' => 'Ort ist erforderlich.'] ]; yield [ ['status' => ''], ['status' => 'Status ist erforderlich.'] ]; yield [ ['status' => 'lala'], ['status' => 'Der gewählte Wert für Status ist ungültig.'] ]; yield [ ['to.zip' => ''], ['to.zip' => 'PLZ ist erforderlich.'] ]; yield [ ['via' => ''], ['via' => 'Rechnungsweg ist erforderlich.'] ]; yield [ ['via' => 'lala'], ['via' => 'Der gewählte Wert für Rechnungsweg ist ungültig.'] ]; } /** * @param array $input * @param array $errors * @dataProvider validationDataProvider */ public function testItValidatesInput(array $input, array $errors): void { $this->login()->loginNami(); $response = $this->postJson( route('invoice.store'), InvoiceRequestFactory::new() ->to(ReceiverRequestFactory::new()) ->position(InvoicePositionRequestFactory::new()->member(Member::factory()->defaults()->create())) ->via(BillKind::POST) ->state($input) ->create() ); $response->assertJsonValidationErrors($errors); } }