makeTestData(); $this->withoutMiddleware( ThrottleRequests::class ); } public function testInvoiceDeletion() { //create new client $data = [ 'name' => 'A Nice Client', ]; $response = $this->withHeaders([ 'X-API-SECRET' => config('ninja.api_secret'), 'X-API-TOKEN' => $this->token, ])->post('/api/v1/clients', $data); $response->assertStatus(200); $arr = $response->json(); $client_hash_id = $arr['data']['id']; $client = Client::find($this->decodePrimaryKey($client_hash_id)); $this->assertEquals($client->balance, 0); $this->assertEquals($client->paid_to_date, 0); //create new invoice. $line_items = []; $item = InvoiceItemFactory::create(); $item->quantity = 1; $item->cost = 10; $line_items[] = (array)$item; $item = InvoiceItemFactory::create(); $item->quantity = 1; $item->cost = 10; $line_items[] = (array)$item; $invoice = [ 'status_id' => 1, 'number' => '', 'discount' => 0, 'is_amount_discount' => 1, 'po_number' => '3434343', 'public_notes' => 'notes', 'is_deleted' => 0, 'custom_value1' => 0, 'custom_value2' => 0, 'custom_value3' => 0, 'custom_value4' => 0, 'client_id' => $client_hash_id, 'line_items' => (array)$line_items, ]; $response = $this->withHeaders([ 'X-API-SECRET' => config('ninja.api_secret'), 'X-API-TOKEN' => $this->token, ])->post('/api/v1/invoices/', $invoice) ->assertStatus(200); $arr = $response->json(); $invoice_one_hashed_id = $arr['data']['id']; $response = $this->withHeaders([ 'X-API-SECRET' => config('ninja.api_secret'), 'X-API-TOKEN' => $this->token, ])->post('/api/v1/invoices/', $invoice) ->assertStatus(200); $arr = $response->json(); $invoice_two_hashed_id = $arr['data']['id']; //mark as paid $data = [ 'amount' => 40.0, 'client_id' => $client_hash_id, 'invoices' => [ [ 'invoice_id' => $invoice_one_hashed_id, 'amount' => 20.0, ], [ 'invoice_id' => $invoice_two_hashed_id, 'amount' => 20.0, ], ], 'date' => '2020/12/01', ]; $response = false; try { $response = $this->withHeaders([ 'X-API-SECRET' => config('ninja.api_secret'), 'X-API-TOKEN' => $this->token, ])->post('/api/v1/payments?include=invoices', $data); } catch (ValidationException $e) { $message = json_decode($e->validator->getMessageBag(), 1); } $arr = $response->json(); $response->assertStatus(200); $payment_hashed_id = $arr['data']['id']; $invoice_one = Invoice::find($this->decodePrimaryKey($invoice_one_hashed_id)); $invoice_two = Invoice::find($this->decodePrimaryKey($invoice_two_hashed_id)); $payment = Payment::find($this->decodePrimaryKey($payment_hashed_id)); //test balance $this->assertEquals($invoice_one->amount, 20); $this->assertEquals($invoice_one->balance, 0); $this->assertEquals($invoice_two->amount, 20); $this->assertEquals($invoice_two->balance, 0); $this->assertEquals($client->fresh()->paid_to_date, 40); $this->assertEquals($client->balance, 0); //hydrate associated payment $this->assertEquals($payment->amount, 40); $this->assertEquals($payment->applied, 40); //delete invoice $data = [ 'ids' => [$invoice_one_hashed_id], ]; $response = $this->withHeaders([ 'X-API-SECRET' => config('ninja.api_secret'), 'X-API-TOKEN' => $this->token, ])->post('/api/v1/invoices/bulk?action=delete', $data); $arr = $response->json(); $this->assertTrue($arr['data'][0]['is_deleted']); $this->assertEquals($client->fresh()->paid_to_date, 20); $this->assertEquals($payment->fresh()->applied, 20); $this->assertEquals($payment->fresh()->amount, 20); //test ledger balance //test client balance //test client paid to date } }