mirror of
https://github.com/invoiceninja/invoiceninja.git
synced 2025-06-01 00:54:38 -04:00
Test fixes & code improvements (#3267)
- Updated rules for storing credits - Fixed route controller - Added test for crud operations - Added new $invoice object in MockAccountData - Added & registered CreditPolicy
This commit is contained in:
parent
0f661495db
commit
67c6ac1bc2
@ -80,7 +80,7 @@ class CreditController extends BaseController
|
|||||||
if($request->entityIsDeleted($credit))
|
if($request->entityIsDeleted($credit))
|
||||||
return $request->disallowUpdate();
|
return $request->disallowUpdate();
|
||||||
|
|
||||||
$credit = $this->credit_repo->save($request->all(), $credit);
|
$credit = $this->credit_repository->save($request->all(), $credit);
|
||||||
|
|
||||||
event(new CreditWasUpdated($credit, $credit->company));
|
event(new CreditWasUpdated($credit, $credit->company));
|
||||||
|
|
||||||
@ -160,14 +160,14 @@ class CreditController extends BaseController
|
|||||||
return response()->download(public_path($credit->pdf_file_path()));
|
return response()->download(public_path($credit->pdf_file_path()));
|
||||||
break;
|
break;
|
||||||
case 'archive':
|
case 'archive':
|
||||||
$this->credit_repo->archive($credit);
|
$this->credit_repository->archive($credit);
|
||||||
|
|
||||||
if (!$bulk) {
|
if (!$bulk) {
|
||||||
return $this->listResponse($credit);
|
return $this->listResponse($credit);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'delete':
|
case 'delete':
|
||||||
$this->credit_repo->delete($credit);
|
$this->credit_repository->delete($credit);
|
||||||
|
|
||||||
if (!$bulk) {
|
if (!$bulk) {
|
||||||
return $this->listResponse($credit);
|
return $this->listResponse($credit);
|
||||||
|
@ -3,10 +3,15 @@
|
|||||||
namespace App\Http\Requests\Credit;
|
namespace App\Http\Requests\Credit;
|
||||||
|
|
||||||
use App\Models\Credit;
|
use App\Models\Credit;
|
||||||
|
use App\Utils\Traits\CleanLineItems;
|
||||||
|
use App\Utils\Traits\MakesHash;
|
||||||
use Illuminate\Foundation\Http\FormRequest;
|
use Illuminate\Foundation\Http\FormRequest;
|
||||||
|
|
||||||
class StoreCreditRequest extends FormRequest
|
class StoreCreditRequest extends FormRequest
|
||||||
{
|
{
|
||||||
|
use MakesHash;
|
||||||
|
use CleanLineItems;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Determine if the user is authorized to make this request.
|
* Determine if the user is authorized to make this request.
|
||||||
*
|
*
|
||||||
@ -25,7 +30,19 @@ class StoreCreditRequest extends FormRequest
|
|||||||
public function rules()
|
public function rules()
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
//
|
'client_id' => 'required',
|
||||||
|
// 'invoice_type_id' => 'integer',
|
||||||
|
// 'documents' => 'mimes:png,ai,svg,jpeg,tiff,pdf,gif,psd,txt,doc,xls,ppt,xlsx,docx,pptx',
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected function prepareForValidation()
|
||||||
|
{
|
||||||
|
$input = $this->all();
|
||||||
|
|
||||||
|
$input['client_id'] = $this->decodePrimaryKey($input['client_id']);
|
||||||
|
$input['line_items'] = isset($input['line_items']) ? $this->cleanItems($input['line_items']) : [];
|
||||||
|
//$input['line_items'] = json_encode($input['line_items']);
|
||||||
|
$this->replace($input);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
16
app/Policies/CreditPolicy.php
Normal file
16
app/Policies/CreditPolicy.php
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Policies;
|
||||||
|
|
||||||
|
use App\Models\User;
|
||||||
|
use Illuminate\Auth\Access\HandlesAuthorization;
|
||||||
|
|
||||||
|
class CreditPolicy extends EntityPolicy
|
||||||
|
{
|
||||||
|
use HandlesAuthorization;
|
||||||
|
|
||||||
|
public function create(User $user) : bool
|
||||||
|
{
|
||||||
|
return $user->isAdmin() || $user->hasPermission('create_quote') || $user->hasPermission('create_all');
|
||||||
|
}
|
||||||
|
}
|
@ -15,6 +15,7 @@ use App\Models\Activity;
|
|||||||
use App\Models\Client;
|
use App\Models\Client;
|
||||||
use App\Models\Company;
|
use App\Models\Company;
|
||||||
use App\Models\CompanyGateway;
|
use App\Models\CompanyGateway;
|
||||||
|
use App\Models\Credit;
|
||||||
use App\Models\Expense;
|
use App\Models\Expense;
|
||||||
use App\Models\GroupSetting;
|
use App\Models\GroupSetting;
|
||||||
use App\Models\Invoice;
|
use App\Models\Invoice;
|
||||||
@ -30,6 +31,7 @@ use App\Policies\ActivityPolicy;
|
|||||||
use App\Policies\ClientPolicy;
|
use App\Policies\ClientPolicy;
|
||||||
use App\Policies\CompanyGatewayPolicy;
|
use App\Policies\CompanyGatewayPolicy;
|
||||||
use App\Policies\CompanyPolicy;
|
use App\Policies\CompanyPolicy;
|
||||||
|
use App\Policies\CreditPolicy;
|
||||||
use App\Policies\ExpensePolicy;
|
use App\Policies\ExpensePolicy;
|
||||||
use App\Policies\GroupSettingPolicy;
|
use App\Policies\GroupSettingPolicy;
|
||||||
use App\Policies\InvoicePolicy;
|
use App\Policies\InvoicePolicy;
|
||||||
@ -58,6 +60,7 @@ class AuthServiceProvider extends ServiceProvider
|
|||||||
Company::class => CompanyPolicy::class,
|
Company::class => CompanyPolicy::class,
|
||||||
Product::class => ProductPolicy::class,
|
Product::class => ProductPolicy::class,
|
||||||
Invoice::class => InvoicePolicy::class,
|
Invoice::class => InvoicePolicy::class,
|
||||||
|
Credit::class => CreditPolicy::class,
|
||||||
Payment::class => PaymentPolicy::class,
|
Payment::class => PaymentPolicy::class,
|
||||||
RecurringInvoice::class => RecurringInvoicePolicy::class,
|
RecurringInvoice::class => RecurringInvoicePolicy::class,
|
||||||
RecurringQuote::class => RecurringQuotePolicy::class,
|
RecurringQuote::class => RecurringQuotePolicy::class,
|
||||||
|
@ -46,7 +46,7 @@ Route::group(['middleware' => ['api_db', 'api_secret_check', 'token_auth', 'loca
|
|||||||
|
|
||||||
Route::post('invoices/bulk', 'InvoiceController@bulk')->name('invoices.bulk');
|
Route::post('invoices/bulk', 'InvoiceController@bulk')->name('invoices.bulk');
|
||||||
|
|
||||||
Route::resource('credits', 'CreditsController'); // name = (credits. index / create / show / update / destroy / edit
|
Route::resource('credits', 'CreditController'); // name = (credits. index / create / show / update / destroy / edit
|
||||||
|
|
||||||
Route::get('credits/{credit}/{action}', 'CreditController@action')->name('credits.action');
|
Route::get('credits/{credit}/{action}', 'CreditController@action')->name('credits.action');
|
||||||
|
|
||||||
|
158
tests/Feature/CreditTest.php
Normal file
158
tests/Feature/CreditTest.php
Normal file
@ -0,0 +1,158 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Tests\Feature;
|
||||||
|
|
||||||
|
use App\Models\Account;
|
||||||
|
use App\Models\Client;
|
||||||
|
use App\Models\Credit;
|
||||||
|
use App\Utils\Traits\MakesHash;
|
||||||
|
use Illuminate\Foundation\Testing\DatabaseTransactions;
|
||||||
|
use Tests\MockAccountData;
|
||||||
|
use Tests\TestCase;
|
||||||
|
use Illuminate\Support\Facades\Session;
|
||||||
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
|
||||||
|
class CreditTest extends TestCase
|
||||||
|
{
|
||||||
|
use MakesHash;
|
||||||
|
use DatabaseTransactions;
|
||||||
|
use MockAccountData;
|
||||||
|
|
||||||
|
public function setUp(): void
|
||||||
|
{
|
||||||
|
parent::setUp();
|
||||||
|
|
||||||
|
Session::start();
|
||||||
|
|
||||||
|
$this->faker = \Faker\Factory::create();
|
||||||
|
|
||||||
|
Model::reguard();
|
||||||
|
|
||||||
|
$this->makeTestData();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testCreditsList()
|
||||||
|
{
|
||||||
|
$data = [
|
||||||
|
'first_name' => $this->faker->firstName,
|
||||||
|
'last_name' => $this->faker->lastName,
|
||||||
|
'name' => $this->faker->company,
|
||||||
|
'email' => $this->faker->unique()->safeEmail,
|
||||||
|
'password' => 'ALongAndBrilliantPassword123',
|
||||||
|
'_token' => csrf_token(),
|
||||||
|
'privacy_policy' => 1,
|
||||||
|
'terms_of_service' => 1
|
||||||
|
];
|
||||||
|
|
||||||
|
$response = $this->withHeaders([
|
||||||
|
'X-API-SECRET' => config('ninja.api_secret'),
|
||||||
|
])->post('/api/v1/signup?include=account', $data);
|
||||||
|
|
||||||
|
$acc = $response->json();
|
||||||
|
|
||||||
|
$account = Account::find($this->decodePrimaryKey($acc['data'][0]['account']['id']));
|
||||||
|
|
||||||
|
$company_token = $account->default_company->tokens()->first();
|
||||||
|
$token = $company_token->token;
|
||||||
|
$company = $company_token->company;
|
||||||
|
|
||||||
|
$user = $company_token->user;
|
||||||
|
|
||||||
|
$this->assertNotNull($company_token);
|
||||||
|
$this->assertNotNull($token);
|
||||||
|
$this->assertNotNull($user);
|
||||||
|
$this->assertNotNull($company);
|
||||||
|
|
||||||
|
factory(Client::class, 1)->create(['user_id' => $user->id, 'company_id' => $company->id])->each(function ($c) use ($user, $company) {
|
||||||
|
|
||||||
|
factory(\App\Models\ClientContact::class, 1)->create([
|
||||||
|
'user_id' => $user->id,
|
||||||
|
'client_id' => $c->id,
|
||||||
|
'company_id' => $company->id,
|
||||||
|
'is_primary' => 1
|
||||||
|
]);
|
||||||
|
|
||||||
|
factory(\App\Models\ClientContact::class, 1)->create([
|
||||||
|
'user_id' => $user->id,
|
||||||
|
'client_id' => $c->id,
|
||||||
|
'company_id' => $company->id
|
||||||
|
]);
|
||||||
|
});
|
||||||
|
|
||||||
|
$client = Client::all()->first();
|
||||||
|
|
||||||
|
factory(Credit::class, 1)->create(['user_id' => $user->id, 'company_id' => $company->id, 'client_id' => $client->id]);
|
||||||
|
|
||||||
|
|
||||||
|
$response = $this->withHeaders([
|
||||||
|
'X-API-SECRET' => config('ninja.api_secret'),
|
||||||
|
'X-API-TOKEN' => $token,
|
||||||
|
])->get('/api/v1/credits');
|
||||||
|
|
||||||
|
$response->assertStatus(200);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testCreditRESTEndPoints()
|
||||||
|
{
|
||||||
|
$response = $this->withHeaders([
|
||||||
|
'X-API-SECRET' => config('ninja.api_secret'),
|
||||||
|
'X-API-TOKEN' => $this->token,
|
||||||
|
])->get('/api/v1/credits/' . $this->encodePrimaryKey($this->credit->id));
|
||||||
|
|
||||||
|
$response->assertStatus(200);
|
||||||
|
|
||||||
|
$response = $this->withHeaders([
|
||||||
|
'X-API-SECRET' => config('ninja.api_secret'),
|
||||||
|
'X-API-TOKEN' => $this->token,
|
||||||
|
])->get('/api/v1/credits/' . $this->encodePrimaryKey($this->credit->id) . '/edit');
|
||||||
|
|
||||||
|
$response->assertStatus(200);
|
||||||
|
|
||||||
|
$credit_update = [
|
||||||
|
'tax_name1' => 'dippy',
|
||||||
|
];
|
||||||
|
|
||||||
|
$this->assertNotNull($this->credit);
|
||||||
|
|
||||||
|
$response = $this->withHeaders([
|
||||||
|
'X-API-SECRET' => config('ninja.api_secret'),
|
||||||
|
'X-API-TOKEN' => $this->token,
|
||||||
|
])->put('/api/v1/credits/' . $this->encodePrimaryKey($this->credit->id), $credit_update)
|
||||||
|
->assertStatus(200);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testPostNewCredit()
|
||||||
|
{
|
||||||
|
$credit = [
|
||||||
|
'status_id' => 1,
|
||||||
|
'number' => 'dfdfd',
|
||||||
|
'discount' => 0,
|
||||||
|
'is_amount_discount' => 1,
|
||||||
|
'number' => '3434343',
|
||||||
|
'public_notes' => 'notes',
|
||||||
|
'is_deleted' => 0,
|
||||||
|
'custom_value1' => 0,
|
||||||
|
'custom_value2' => 0,
|
||||||
|
'custom_value3' => 0,
|
||||||
|
'custom_value4' => 0,
|
||||||
|
'status' => 1,
|
||||||
|
'client_id' => $this->encodePrimaryKey($this->client->id),
|
||||||
|
];
|
||||||
|
|
||||||
|
$response = $this->withHeaders([
|
||||||
|
'X-API-SECRET' => config('ninja.api_secret'),
|
||||||
|
'X-API-TOKEN' => $this->token,
|
||||||
|
])->post('/api/v1/credits/', $credit)
|
||||||
|
->assertStatus(200);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testDeleteCredit()
|
||||||
|
{
|
||||||
|
$response = $this->withHeaders([
|
||||||
|
'X-API-SECRET' => config('ninja.api_secret'),
|
||||||
|
'X-API-TOKEN' => $this->token,
|
||||||
|
])->delete('/api/v1/credits/'.$this->encodePrimaryKey($this->credit->id));
|
||||||
|
|
||||||
|
$response->assertStatus(200);
|
||||||
|
}
|
||||||
|
}
|
@ -16,6 +16,7 @@ use App\DataMapper\CompanySettings;
|
|||||||
use App\DataMapper\DefaultSettings;
|
use App\DataMapper\DefaultSettings;
|
||||||
use App\Factory\ClientFactory;
|
use App\Factory\ClientFactory;
|
||||||
use App\Factory\CompanyUserFactory;
|
use App\Factory\CompanyUserFactory;
|
||||||
|
use App\Factory\CreditFactory;
|
||||||
use App\Factory\InvoiceFactory;
|
use App\Factory\InvoiceFactory;
|
||||||
use App\Factory\InvoiceInvitationFactory;
|
use App\Factory\InvoiceInvitationFactory;
|
||||||
use App\Factory\InvoiceItemFactory;
|
use App\Factory\InvoiceItemFactory;
|
||||||
@ -179,6 +180,14 @@ trait MockAccountData
|
|||||||
$this->invoice->save();
|
$this->invoice->save();
|
||||||
|
|
||||||
$this->invoice->markSent();
|
$this->invoice->markSent();
|
||||||
|
|
||||||
|
$this->credit = CreditFactory::create($this->company->id,$this->user->id);
|
||||||
|
$this->credit->client_id = $this->client->id;
|
||||||
|
|
||||||
|
$this->credit->line_items = $this->buildLineItems();
|
||||||
|
$this->credit->uses_inclusive_Taxes = false;
|
||||||
|
|
||||||
|
$this->credit->save();
|
||||||
|
|
||||||
$contacts = $this->invoice->client->contacts;
|
$contacts = $this->invoice->client->contacts;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user