From f22745d1318f6cf984098d539e316768372d08ab Mon Sep 17 00:00:00 2001 From: David Bomba Date: Sun, 30 May 2021 06:50:55 +1000 Subject: [PATCH] Remove delivery not from try/catch block --- app/Http/Controllers/InvoiceController.php | 8 +- app/Jobs/Company/CompanyExport.php | 6 +- app/Jobs/Company/CompanyImport.php | 4 +- app/Models/Quote.php | 4 - tests/Feature/Import/ImportCompanyTest.php | 225 ++++++++++++++++++++- tests/Feature/Import/backup.zip | Bin 12860 -> 13456 bytes tests/Feature/UserTest.php | 44 ++-- 7 files changed, 252 insertions(+), 39 deletions(-) diff --git a/app/Http/Controllers/InvoiceController.php b/app/Http/Controllers/InvoiceController.php index b2ea9da7cac3..263fa992f5f5 100644 --- a/app/Http/Controllers/InvoiceController.php +++ b/app/Http/Controllers/InvoiceController.php @@ -845,13 +845,11 @@ class InvoiceController extends BaseController */ public function deliveryNote(ShowInvoiceRequest $request, Invoice $invoice) { + $file = $invoice->service()->getInvoiceDeliveryNote($invoice, $invoice->invitations->first()->contact); - try { - return response()->download($file, basename($file), ['Cache-Control:' => 'no-cache'])->deleteFileAfterSend(true); - } catch (\Exception $e) { - return response(['message' => 'Oops, something went wrong. Make sure you have symlink to storage/ in public/ directory.'], 500); - } + return response()->download($file, basename($file), ['Cache-Control:' => 'no-cache'])->deleteFileAfterSend(true); + } /** diff --git a/app/Jobs/Company/CompanyExport.php b/app/Jobs/Company/CompanyExport.php index f79f4c2f7bd6..2a91fc01ec13 100644 --- a/app/Jobs/Company/CompanyExport.php +++ b/app/Jobs/Company/CompanyExport.php @@ -212,7 +212,7 @@ class CompanyExport implements ShouldQueue $this->export_data['credit_invitations'] = CreditInvitation::where('company_id', $this->company->id)->withTrashed()->cursor()->map(function ($credit){ - $credit = $this->transformArrayOfKeys($credit, ['company_id', 'user_id', 'client_contact_id', 'recurring_invoice_id']); + $credit = $this->transformArrayOfKeys($credit, ['company_id', 'user_id', 'client_contact_id', 'credit_id']); return $credit->makeVisible(['id']); @@ -271,7 +271,7 @@ class CompanyExport implements ShouldQueue $this->export_data['invoice_invitations'] = InvoiceInvitation::where('company_id', $this->company->id)->withTrashed()->cursor()->map(function ($invoice){ - $invoice = $this->transformArrayOfKeys($invoice, ['company_id', 'user_id', 'client_contact_id', 'recurring_invoice_id']); + $invoice = $this->transformArrayOfKeys($invoice, ['company_id', 'user_id', 'client_contact_id', 'invoice_id']); return $invoice->makeVisible(['id']); @@ -332,7 +332,7 @@ class CompanyExport implements ShouldQueue $this->export_data['quote_invitations'] = QuoteInvitation::where('company_id', $this->company->id)->withTrashed()->cursor()->map(function ($quote){ - $quote = $this->transformArrayOfKeys($quote, ['company_id', 'user_id', 'client_contact_id', 'recurring_invoice_id']); + $quote = $this->transformArrayOfKeys($quote, ['company_id', 'user_id', 'client_contact_id', 'quote_id']); return $quote->makeVisible(['id']); diff --git a/app/Jobs/Company/CompanyImport.php b/app/Jobs/Company/CompanyImport.php index 3a718e579024..ed6a456408ca 100644 --- a/app/Jobs/Company/CompanyImport.php +++ b/app/Jobs/Company/CompanyImport.php @@ -80,13 +80,13 @@ class CompanyImport implements ShouldQueue // 'recurring_invoices', // 'quotes', // 'payments', + // 'paymentables', + // 'subscriptions', // 'expenses', // 'tasks', // 'documents', - // 'subscriptions', // 'webhooks', // 'system_logs', - // 'paymentables', // 'company_ledger', // 'backups', ]; diff --git a/app/Models/Quote.php b/app/Models/Quote.php index 87f70d4a75c1..c7d3118dc76a 100644 --- a/app/Models/Quote.php +++ b/app/Models/Quote.php @@ -71,10 +71,6 @@ class Quote extends BaseModel 'custom_surcharge2', 'custom_surcharge3', 'custom_surcharge4', - // 'custom_surcharge_tax1', - // 'custom_surcharge_tax2', - // 'custom_surcharge_tax3', - // 'custom_surcharge_tax4', 'design_id', 'assigned_user_id', 'exchange_rate', diff --git a/tests/Feature/Import/ImportCompanyTest.php b/tests/Feature/Import/ImportCompanyTest.php index c87e90140f42..f096745820ea 100644 --- a/tests/Feature/Import/ImportCompanyTest.php +++ b/tests/Feature/Import/ImportCompanyTest.php @@ -19,17 +19,24 @@ use App\Models\Company; use App\Models\CompanyGateway; use App\Models\CompanyToken; use App\Models\CompanyUser; +use App\Models\Credit; +use App\Models\CreditInvitation; use App\Models\Expense; use App\Models\ExpenseCategory; use App\Models\GroupSetting; use App\Models\Invoice; +use App\Models\InvoiceInvitation; use App\Models\Payment; use App\Models\PaymentTerm; +use App\Models\Paymentable; use App\Models\Product; use App\Models\Project; +use App\Models\Quote; +use App\Models\QuoteInvitation; use App\Models\RecurringInvoice; use App\Models\RecurringInvoiceInvitation; use App\Models\Subscription; +use App\Models\Task; use App\Models\TaskStatus; use App\Models\TaxRate; use App\Models\User; @@ -545,7 +552,7 @@ class ImportCompanyTest extends TestCase // Recurring Invoice Invitations - +// Invoices $this->assertEquals(2, count($this->backup_json_object->invoices)); $this->genericImport(Invoice::class, @@ -564,13 +571,223 @@ class ImportCompanyTest extends TestCase $this->assertEquals(2, Invoice::count()); -// Invoices - - // Invoices + +// Invoice Invitations + + $this->assertEquals(2, count($this->backup_json_object->invoice_invitations)); + + $this->genericImport(InvoiceInvitation::class, + ['user_id', 'client_contact_id', 'company_id', 'id', 'hashed_id', 'invoice_id'], + [ + ['users' => 'user_id'], + ['invoices' => 'invoice_id'], + ['client_contacts' => 'client_contact_id'], + ], + 'invoice_invitations', + 'key'); + + $this->assertEquals(2, InvoiceInvitation::count()); + +// Invoice Invitations + + +// Quotes + $this->assertEquals(2, count($this->backup_json_object->quotes)); + + $this->genericImport(Quote::class, + ['user_id', 'client_id', 'company_id', 'id', 'hashed_id', 'recurring_id','status'], + [ + ['users' => 'user_id'], + ['users' => 'assigned_user_id'], + ['recurring_invoices' => 'recurring_id'], + ['clients' => 'client_id'], + ['subscriptions' => 'subscription_id'], + ['projects' => 'project_id'], + ['vendors' => 'vendor_id'], + ], + 'quotes', + 'number'); + + $this->assertEquals(2, Quote::count()); + + +// Quotes + +// Quotes Invitations + + $this->assertEquals(2, count($this->backup_json_object->quote_invitations)); + + $this->genericImport(QuoteInvitation::class, + ['user_id', 'client_contact_id', 'company_id', 'id', 'hashed_id', 'quote_id'], + [ + ['users' => 'user_id'], + ['quotes' => 'quote_id'], + ['client_contacts' => 'client_contact_id'], + ], + 'quote_invitations', + 'key'); + + $this->assertEquals(2, QuoteInvitation::count()); + +// Quotes Invitations + +// Credits + $this->assertEquals(2, count($this->backup_json_object->credits)); + + $this->genericImport(Credit::class, + ['user_id', 'client_id', 'company_id', 'id', 'hashed_id', 'recurring_id','status'], + [ + ['users' => 'user_id'], + ['users' => 'assigned_user_id'], + ['recurring_invoices' => 'recurring_id'], + ['clients' => 'client_id'], + ['subscriptions' => 'subscription_id'], + ['projects' => 'project_id'], + ['vendors' => 'vendor_id'], + ], + 'quotes', + 'number'); + + $this->assertEquals(2, Credit::count()); + + +// Credits + +// Credits Invitations + + $this->assertEquals(2, count($this->backup_json_object->credit_invitations)); + + $this->genericImport(CreditInvitation::class, + ['user_id', 'client_contact_id', 'company_id', 'id', 'hashed_id', 'credit_id'], + [ + ['users' => 'user_id'], + ['quotes' => 'credit_id'], + ['client_contacts' => 'client_contact_id'], + ], + 'credit_invitations', + 'key'); + + $this->assertEquals(2, CreditInvitation::count()); + +// Credits Invitations + + +// Expenses + + $this->assertEquals(2, count($this->backup_json_object->expenses)); + + $this->genericImport(Expense::class, + ['assigned_user_id', 'user_id', 'client_id', 'company_id', 'id', 'hashed_id', 'project_id','vendor_id'], + [ + ['users' => 'user_id'], + ['users' => 'assigned_user_id'], + ['clients' => 'client_id'], + ['projects' => 'project_id'], + ['vendors' => 'vendor_id'], + ], + 'expenses', + 'number'); + + $this->assertEquals(2, Expense::count()); + +// Expenses + + + +// Tasks + + $this->assertEquals(3, count($this->backup_json_object->tasks)); + + $this->genericImport(Task::class, + ['assigned_user_id', 'user_id', 'client_id', 'company_id', 'id', 'hashed_id', 'invoice_id','project_id'], + [ + ['users' => 'user_id'], + ['users' => 'assigned_user_id'], + ['clients' => 'client_id'], + ['projects' => 'project_id'], + ['invoices' => 'invoice_id'], + ], + 'tasks', + 'number'); + + $this->assertEquals(3, Task::count()); + +// Tasks + + +// Payments + + $this->assertEquals(2, count($this->backup_json_object->payments)); + + $this->genericImport(Payment::class, + ['assigned_user_id', 'user_id', 'client_id', 'company_id', 'id', 'hashed_id', 'client_contact_id','invitation_id','vendor_id','paymentables'], + [ + ['users' => 'user_id'], + ['users' => 'assigned_user_id'], + ['clients' => 'client_id'], + ['client_contacts' => 'client_contact_id'], + ['vendors' => 'vendor_id'], + ['invoice_invitations' => 'invitation_id'], + ['company_gateways' => 'company_gateway_id'], + ], + 'payments', + 'number'); + + $this->assertEquals(2, Payment::count()); + +// Payments + + +// Paymentables + + // $this->assertEquals(2, count($this->backup_json_object->paymentables)); + + // $this->paymentablesImport(); + + // $this->assertEquals(2, Paymentable::count()); + + +// Paymentables } + private function paymentablesImport() + { + + foreach($this->backup_json_object->paymentables as $paymentable) + { + $paymentable = new Paymentable(); + $paymentable->payment_id = $this->transformId('payments', $paymentable->payment_id); + $paymentable->paymentable_type = $paymentable->paymentable_type; + $paymentable->amount = $paymentable->amount; + $paymentable->refunded = $paymentable->refunded; + $paymentable->created_at = $paymentable->created_at; + $paymentable->deleted_at = $paymentable->deleted_at; + $paymentable->updated_at = $paymentable->updated_at; + $paymentable->paymentable_id = $this->convertPaymentableId($paymentable->paymentable_type, $paymentable->paymentable_id); + $paymentable->paymentable_type = $paymentable->paymentable_type; + $paymentable->save(['timestamps' => false]); + + } + } + + private function convertPaymentableId($type, $id) + { + switch ($type) { + case 'invoices': + return $this->transformId('invoices', $id); + break; + case Credit::class: + return $this->transformId('credits', $id); + break; + default: + # code... + break; + } + } + + private function genericNewClassImport($class, $unset, $transforms, $object_property) { diff --git a/tests/Feature/Import/backup.zip b/tests/Feature/Import/backup.zip index ca7d1808bc206dea162d0b842a09888f16f2bd1a..24c1145e7a487bef03ef1cdf8064575d29f8683c 100644 GIT binary patch literal 13456 zcmbum1#DbRvn^`Im??&s8Dow)W@ct)W`@Mf%*?T!F*7qWjhUI5?c6wDez;HPN$2V9 z(ezZ;UbR+rm!>u9*)1mt4uKBxez`lhDf}`1Hqao1AO`w|md2P(rHy2n9yPm(f06CN`G7;R104lqutFa`?)NCva?`2Q$YpjAfQAf=?D$3X z0epuY4|o4zqv_xXUHj9WU3n4^SM4>Fy3bjT&j@zNaO60+aVN#9PGe1OknN(4hO{7B zZvF0sbTRFwS0VFl&{2c3q))V-gp4Z}V=JkzU=pr;8`_Ea>njNC$|RdC&Zbf4k3vp* z<4#F8qVdeEP2lXi- zwUyy14{X+>NagDe{9$}DVXWTxRHcE6Q_h8Ul-`V+Vm$B$!(l^e0#YLCbmRiijDU!g z(NYbmfc7v09D<0nHj*3j8ShpwO%a{K40B}-H;q>*g}CDu*J49hcV&m4%EtPZx6DIj zJDa?G!gFKGiSeq8qB_DcK*6E1)`(UKjw|Zd;VTd1GFIR;jjYry9^+hbi1?8V@`5Xd z8mlOhO7US=IDdt^wn&4gH}b+K2ow4m+VZ{8%A;EByJI-1tz-PXB_>``Kpy6&Tz>?3 z48dDbcv{o)xuUT;U1`005^`_sOtpzv#aH}YQYSt!EA>!iXJ2pbg@8pjh`9Y`+ zjVQB7^`(dUuSL$gUyn?;ZNr@PHQB_&aKs!zR6 z6$aGbQ}$5fm0n!$$-_pzpmBJT&CM;*s1GeBU`F+}2}nu)EGjh?{4-~Cq~t?|jkb)t zZXUadS2sT8nFB3n5h;lVRYftXLcg4M5)pBEZnj)uzs+Ij2n%)aee-tLG1CAXZ~F0n zr2+~lR!=v>*;Sojs5r5oG%@D#Ij#2bJE=s&pkozR96yM{)qSTQPbtreU=U!Qp_OoW zeWNWhfKh5HQcvKX=BoaJamtn{ock2gr;sLWez%&~XD(K8NDDV7N}Kc>t~udqY>zW+ z&KWLnixQqVsQxI7KI6y3+;5=Z-D|))w&e^6hBCR(2hQ#Jj}# z?9`f%((K~(=JD$^$wghQ#moM2E3Z-bZHaezel6qEiDjX)HrF-4r&GU<)PDb>+V9%6 z$F7n;Yhe5Gsj>0wF>?gVv^beT#MplD)87HRHH%gx%%R$`WFRJ$5Tx>?eknV z{}=n%y#)pa_?v8&;2>Yz_Wi&mzLRe+^Yc*cGc_+m8Y7N8zJkwVl&JudMCznOjUuGV6LeyRnX+W9A`F<61x`WNq7Bzs4nF^m1EwBpADE#)Ob(xi+ zameWWVV=}XogS5GhTFPqzcC)cdS;-H2e?M)8X!Eji-=@PP*`3fAsvNbm4I=ADHYOZZ#~pD^c@a`D!~y8IlG3w&W%tzSlg3AoQ zr_vK+%=$|$yX!T`5^__c?6~pz=3w@|s7`z^3wX~f?^3f^93`f7Mw>O4YAmwL9VgJG z2u)LJ#`Mu2m+nGqK<3stD`U^5_k}6tajmv!RUJy|I6%j2XePr=)>3NZ%feh;Rj|>f zavhH=Xq<2o^uzb8XexJ}??P&u=9Ub&lS*@+^0+NMer7o=RgJ%yw6%$N+C(~am;ItW z?~(>QD*KF8)JFO&7&G};aBGT;V#XSZ2bvo>CRksJ+pzN>|W1i9mTj`XoVP$IQ0--g(Ou|;4@{&dboE7rEErY zJ3bvIu_-c;X)@p}#NY?FcO+lMJpf-FF?+La1RGAkI(&*T+&^IA<>+CFw1G1VUlmAf zA3)f9-N1Npu}<%!XqY&5&kL*jP>?_VjK~rFoRxqvcryF}{zWlv=D1gzhW>&cUSp#{ zr`k*qIT+V%vgZ7zg0`BlceV>Blx7>-;nCoW9nT0Ny>3dge1}&qZZgAKH5TF!yybJ_ zMxEl3Bf9e|)UO8K16MocB;2ji>D6*ZkpeckqEz=h?d+>3cn$a_o6nURZlAY}G6#uo zE`7DD1Q#`{9^A|3pL=xB9uZ23F2XZhPh;ZjgM(HB;kt!Wn$3S6Hrre@TxJJg>mGB~ zM?N(|_&a=&%>}QBHMn>o8wT1HMQ)nGiM}#dgZnnTh!_p5z7icbVdEDwu zi}_}_CaS7mw-WQPjKB7cT?b~fB5h(lqmU6H3F z@G9?nTH4%ZdZb(T0P^vDdMhsWf92uAb2*0mP)>xxs>`ay8eQ1PvSN z#sFKkgVDr&9x2-uudG;D$P(Y#mc;zvpg;jq$V{N8K2hjWo`Db~DbxWGQ5*CLHQQbgTa0ec%d&ONzWc0FTu;OcazMpt3y0yAh1#&#DnQHDFI@y0 zetfEi)2*@fAm85q=fXo8y#cR9-jJXfBwKx-1MtUmp22ST#NcD-8!8D1$2YPybB<~F z#)t3v@g;$S*WMGbGlAJY+HzE}1th%t*yHl{0DWYSHj&Ran%cC6M!i-;Co6zTXoKli zS@JPxgKD>IDNKTpp=oa>^|Ub~9r>$>FX_IVqa0XQIs|G_kpLEL!#qrnDF<&v z`d)*x@d)-0Rl_GWls_EQxuIzUh?qHI1K+4KWuLv3p08$ zg_YbCMW75>vAdRnR?DGSCF&Y8uvFi-ZQWfpNY3Puc_?2p8Pd>hvICYnML`)Ex{HE< zIB`FonvIvaNM547DLOG>9%Zww2tHXcI@X@6vsGtv1G9K%blOo#CRkcug|?tfJ>wcJ zcf`9U;~9>vC)TSpR*Pk+HUZMaxYp2*rPQP{T$C&NnxGXFwx^@V$1GkGj#enPDxQy5 zg+->4q#eKbe4A#Y${igm+GewmT^~Z57Z6T|;`w$8Y$qTDUcN$Ul6vwIFB-P%(Zib$ zX<=qH1bZKi^LXFMzU%>s&Tj4p`=YY;ZJX(R9QVjiZoCKf9c@f?Fthru5Omw02F&@$ z#%DWp+IuA{cx`&IUFNf1xAWu#8O$eagL2PVf{D7Z^GgIJU@J}ivyLW!VH0n1>?eo6 zy2~4TuAcc0aJ4slAJ=P~PY&EjNHNEiIO(638%!ruE6XrX;)@S67?(IIt66D3QX z$Oq>oS0G!$b~&^Qb#IJZq$^)fRVNs*F+3j`k|;8KO^>p~_*{lkUYFEg*Ic-~r#gfG zP?Ou>X9=lAv!MYBY*st{YtPkzmt)ug{(Ywu^k3a$i!BZ5&N{Gv_5TDu)qEr6H;R@q z`gZ_aqsqTQWPF`<79|Al3V+( zC|L{MC(w5yCZfN3nbZ`2X`7rsqrSt2ef~#H$QaTM4gUW*pTDF1lgr!pMitN+oJ|b` z9t5k?MrX@e!Ipj)KLCi;9LNG(rwT|t_2TXY3`jj#Wg;xfyB|{TScwC)664(-1Ng`O zf!%@Y(ST^4Ls-3X_6l+#Sn?3{Li*(!5Wxzal_N{5EXAqKD-pR0RaYyJW>6ldyT|5< zgWiYe8wW;Jdeq{&VSa%%y8+KN-w$Bpa~0rc_WK#mOl7FC-(L;K0B(UUm+yxIIeWkW z%MTID!x;xT{bkGt6-WvaBiKLYj1Y4isO zbR=WG2oAHx>U#Y^vGn!~*L#Q(_&?B6qht~!kar?-p}$m$yAc1-vNRxyfW5;Ok=_Ng z$wm*D*mM5M{grwO2S@&=`u`ID@0=h4f3v?iu`w&GKpya@Jy|6euRC88T0*n@V_H&2r2(H z86aQ1lt6@#7xU4u|1JH0r%kO&WdEN;X})6vc2}4+(%mQinXWz-lbffzg)Aii+WMb~ zV*RTm;lgnR@<&_XZwWY+W&X~)OruHiOM$RF-ccRhIvCt0Eq240ScDnCNRmezc5mrYo!}Z%em4zC&A@ ziT)FV@DH}^cO6nd-kE;a;UBK|I{e`UzSrR$_PY+h6`XG?%STq?{-gIt3xt9I%MMlO z?m!6Y---NpZohRLFi?yC?P?}g1A2_NmEWe`H^Y6N|9Gq+W2h~;-CXBx6pbkJ|06ZN z=eBZr1_0XvMny|ddo;ALzbV8D&4v!>JzS$|XB$`us$B&k({JO9HPSOun+c>H>;l8D z0>le)g9bzw^Z~9@brZT%^{<--+6%A`qI+E9R{>VU3e~PM-3g2?410abR|e>Uz6av` z4f?%~@q)g`{a(lZA^g3L{bhMy$KGMXKJPNeN1(dCcal1PwEiQHP6nduiyHff^uM!t zM95G=H@VY4e?CYH;N%H{(y&;sYbsR*2}r>NHV-Y*0+u z(r9;<8Ezjy^y#bp_0hvNDt8hBYjgl_rfBX{%78)Iz)`OLCo2uCHe)00@l@b$>b1su zQVDyPMzRe^GorNI9M$t2B$dlXM`f;0IZ-DDQsg$=BZt@&W$4J@LLE zzr*gpCwctNR6jV$A}?Cn?cN}XuGu1;cc%MQR`5Xu@c12pDk0@~fXsml;C{U&WcqFV z!2fy+QVK2iU-$mYMZoc6?I(ITD`X{Wo-A}dT*}oPIz_deHKCJH6Tt4r?g9c8Z6jX{;+*085o{jRt*LGIln z)WrlsLfq`J=Z5EgRh=RDIsq=Y1!aLi$h_H45mC-_Fbr+ISd~VTelQvI3F5^NjR5;2 zm=kMNGjrQas2}DIBHWwT8jFD`%FcV=+EsUPwiUElqe-oZh=;Tf_(G_ ze!zH$m7w*9)r=RLgN_FO>*d%fz?^KiEWw&i0D(++K5TQTO`vVs7%)D6bEo!!!>W0? zXJY&;7-`P_G_OXcci8JPb{8=gWdi1#S!swcMimR>m<}~{c?^5Fvp=4|MjQVj_M-kb zLxP_)BQbZ_1hEgoY+;Z1jtS7R!y?nNQ0_wwA~4U1+UvM3&5@QYxlZ3mc&k1i#=|M< z(udB{>owOnVW@+5FV_zIo9^%QDqM^RZts?L3Tv55B@~q=MrB`tsTop?NmZAz6cmh~ zyJuf~X3DHekyaCE_U==4p1fv`4JIvhlBZ5}vT;P)+Xfp@(3sUd@WDl^6{9+Y(E6eC zP0nGwmq?lE@eLG0-8W=8f}C!$dcin4ry;v< zUgfgj9PhjBI~}v1So8)i@vLxFI0q3_lyPZdo!|fBq(?rT6GSf{o-2I9mk{@637@X1 zk%V_#@|a)2i!5v`m{d_al!46+uKJW8I~uDjsc+f-;0 z)QOLb9L|&0{=O13hHZK#4e&a(>5l6t&&9pCe%6v$aXze?dASTEu{}TGDQ&G=Q2={r(At z-Fa#G#bBVlJ6;oFtiJgeW-f1Au@tJY%(;y5VeWWz!};cPOPrsj6{TlhmlJ{+@sLc2 z4H9LGVjE!?6Vhm_k$!@nT6`{%I?AjxM$CxfP0jHzRe%#EI*ZY9TgJO5XYX?vfU}{< zx9OO*y4SQZ-Dy#^Rw_T-jsZN{7Y8HYFBr=BEZb{;L(MKoGUo^4iYCDD^?Rf~d#MmS zXMI9lx-zdil+G0~TP4gJahMsUGVh}@CnNWY<^PVKt29f&FPd&-^?+IDXd-aBxk8_d zF=kPSGj%NydWg~;P`@r>ZFx`>(p72h=|+M&_Ic8l?&M`mL}| z*H*;~-mb3u5Jwq$Jj9V68mDSvdVdG`%p@Owp^6 zD+yyC^+QT%IOGKLPCgUAxzB?$chY@|TvV+mV8KxfnugqpJR@sTU!{Y&ma}`rDWHEo zmP$2?BkeG@%Ra;l4$d%*5%W;EB$W)KrT~>h*f3cvLI#Ob3Ti&U1#51amSpbdLUzAI zSP);To?9r7gIlw|P%O-?a7hpE?cxU+cuEKhzJE%&LfpQMf0YjV1oI;VD z@TW+SisDlNrRf{)slXF%AV{>vPJB)uUk6&@h4pFny1Vgub(1^XyrmIFLi;w4qLID? zeHCS>?V&T3uveh0#vGS}!b==B184$+xVV9|(}yx06tpd@$~h5s@RQk+<#-9SW9-e6 zjmP1J9nvb{T>ngT=kT3^2Qre>;L-*Kb7FtD?^?Mk9pcOVgtje zjV#kmab4(_8~OE)Xpt;dj(Ms$)&$<4$l+urj5gqV1(+Hh9zRnHa)zfbd<&&hkP2Pv z?I+~qC6YqtZ>UOw3;2SR{`PzO9U-9hv#Ie8`L)lmbo4M*BD}9Cze1&iJTX7Zn(cu{ zj~ITag=v;*g4u9rQG!|mT6nc`C%!u|t(A1;c>nj@@W{bIM$wMgqZ79eWE=(U(V`Q; z-0cB;F~N|5B8SR`nnNi7TDow*9#Wuo^u-9^lR8iwJ5CP{*9ScL=R;ng5P!j?Gafms zCLJU69sAX4xc#b+aXJmRbd9{f+)u~1Y%{lDLUU}nO`JkKUsa!pbVtb9G{4Z29VPAy1tT?6ntTRN1Y-W=NXBdmf(q>S@XHaq7 zHkw#&%JrnwUCHM%(lj#CN=td`4!g8%l7g^aom?|Lx3A3d3>6n;X~h>MX~oA1^Lmxi znok{4BYblicAbMJBaZ?MbOff|xj&_Usg8l~9d?3TREke^K+w<@nm0E;G(9juZ2L$> zJx=Dlu;>xcZyK^6Cg;!p=>x`;5=uCez26JwaO*@#QJlsOyxEeuI0N;G&x=U{N4N1o z7>f?4<~)<=^zlqSW|ip<%7R9?$NuH_z}*w|S0e3zz5NJ-qY}qXafsrstyM_ISs5%6 z`%x9QFic}wD~%BFu~~-@`vn11oQUAYjn|6S!!mcwtq#14waAMZWlf*;UavB;oAbi- zwFmYj+uaBV*+QjHjNrb_o3V<5DMM_o>xrIYz{a+q)16eQpGnbzgp22M$CNe2Z0D9;$LMUtI)m3^sMa@n6TgNsKoKYBM9eu z&E=I}7?=1YDeZ;D-Qsm-1uRjcA>&-pi(iEtyo6*)`%&aBy?wG|3O1bsA5!pQNJgjT zng_9oei|ZW>RAk0-f;9`7CyFu9|!_*pZMdnH@>5OfxlTVdEzOGM1#unXWN0S${8iX z`crgjgHWd4Z&yZ}p#<2LQ;MU31uT~}Ah!%&kC?&C?g&DvB1Iwv4a7)t}5EL|XN-xP)qK4ai7h1)v^1B;0SRDf-#a=(}FEt#*c*5NHb4ICl&GjgH z4-q``?gE|SkT9Kd>OXkqZIa?}Iw0e~li300oxzWn%J;R|gLoT` z@%;2}>0D7c0e-f3=$Kzu?LS)9mhczZS#)AlyyB2aJ=_K*O zBC3kqWM@r+OW-Wa6R$X_NwN5uld|<`FIom7!iY6O$uTx-fRm*ou}6`-1i6LOJqdVq zmw38hCOwbH*2QZy6q516A}^uWG%xZJatCIz*(@cSzybUgv7@WR#DIX$^A#QAUL`JU zOYHx)nL-X;6GgEr#LQ#H;D^ia3Bx&sb>h>$M8W zDvZ%|@ll?d!$e)hL_>Myrozy5SVb1Q91yQ6njjIbv!iZ)@?1-3Pq8b=f@C!AGomFT z7xZpHE%Z-O5s@-c{{7Fot}x>eI}f+aH#(9Eh4ETyI&OduIn~hZYRgPjKr1!Jd}(!M z-Baq0@|9h7cHYt6>F`il3P}a=;BoGbvW|!jhbt7yQw2>0bd`o9UE5V}0gR#WjTWQ$ zDlFJ@Iat}=LDvxr52cne9GIq--X7D)mc{soGMRM!j`GfFvsUB%|LubZ3C*wgr1cTK zrOlkJ{D=2sjF$qp*-RFc_FMxFi&_GDMINuhhh_P2stQtZ!k%V~B|WWkeLbxm87Wav z-aAPE*9uz#9Vubw+L&p6se9@o;t+FsM)5vhSKGYC2wE5>j>qaYehXVyE5?4eE;O99B*VGWaATFVvo! zu4Q*_pc&9yW@0`BeDo6d36hN*POyn)Z~@Es5U?PTLjK#WwFI4f*H!3kXHKBCR6Gp! zpU!VT*?H&RJIT`DB%g~4y8m|n6_YI%Ao;v8&D&UuM1Si4*F48+uZ{K*IMFm&C*m*u z==!x-C>_fRB3aUU#3D_l=6hI?dTsg-l~UG734lWBvGfQv%yXAK-qe-#yrX2n-cnWK>S57meadC3+VO=lalDB~`HMN4Ldq&lAobGGd=Z{9nG^LXu#x&3|Az zvh5u(YU;gHjPH|u$p{+?C1sYR9xfpDpimh7Q20?%W8QC!|W3zr^3SxSdVfF^>lu3q_Y#hxcA zNkuL?+z;m5J5#N*qQh%DzWrvnS zSFh#yCr=8lxp=`Do>d+IX7u_mXG?-bXsos+pNpnDn{^BAS}0o^q;)IXv*_hl|J4q- z%cc9ymOgJA?RLtF9J>Hgos>E*67(YB=ejy$UJc)aiT zPV{~??QsIdmW2V9=c)B`w{7^%Uh+WT?X5z|kBao5lD38=H+{^uAN8)rir$mor!jv2 zBr<{jqArLjca%deT**L#5Q-<>^Eq62=7H=<=?gg-qQ_4?&R)KZfpXd~h$#JO7V&0@ z5OdzMd{`I(vY(&7%XS#wsWLmysP%{!iM-$%S*qkf8ky_pNk=B}^MHc(8mgK8ja9*4UQOF8i)PH(ysX&hVqfrPM*K+_LO>`R<|C+{?oi zSe{w7p8!o+%|k)N8U09XdZ>dw3wjvO(KZ^GNbh3rfq2_!*qi%t$#_B8r1BT}ctwae z9Ck0I&Yf>=x{sUmf|vse@%kh=a)h6@N94gp&RIt!vG!uf)EaY=uUfXpHt+hy08-K_ z2{Jtig7ql%o_lhzP~EX`i7QSjcO8?DE4^@ar6I9+p5Gmum-b+rO6dD=Mcn;E?n z?iG%-P&048_g+*sayI=$wjsSd@N$%&30R0li1B__X)@p274vY*<}mY&fip!9L|E16DJALK`24D=p^|)+o}D+nko-2$F{JYE?Hvl z_2v}IU{cdbGSlCuFQ#luD(dPY3Rx3_GrgE>mCoaXK*z|VlykcQr!HfnY>0{^tRN=M zs7Nn9ardMsJJIqv=B)@DCqp*VaPMI;IaV=6auG#5;vjVUe$U!9|2Y}HXKw;;(dPr3 zE-|%`EqUg)K?ss~GPddAl+u$}|Ng-&16i87jIsjDVGNTG?m7L0(yWQId2vf2(h?4P zpU+cLudFO}kVWkxd<4pDzANjRkASOu`pK#0TzSN|R0?$X+3Wx`5e77We3bpnKJiAnXxevaK(N9ZjQZoj)tEnmK%D-^N9)VR$?}j*e>$}dTnV-2KczbeCvAVZE0qH{?3Q@%UecX)1!Gku*$tjAOBV_Pv?chC6c}bk2 zlTmc5f`nqJX8vs9pB}qlU_4|t>Seb7< zA!|Dhh%_x#?4-ZjXvtS^ zPPea5^t``f&vqX^gm4ngtv}Ly`^cCqJUpf!q0FrH+Jr0-jE%_rqMEt67dCN`z@J>< zX~3)IkRD=3wsap}k#xq~juTD})%aD;xe(kJSt&4w8bX=qhevXb1$v+sb%usYfZ)|R zt=FKPg@dt#7x7nJ>OpGkGfFMRFud0*S)*P3W2ZVg6gBtCE4|&W;a?ko8S`Kc{3bwh zR1j&sPGcK?U6V)h$b{)x>#i@azxl~qmb2IGrBTh1GuT#%hai)5Ym9s5N*Tk_3cK2)>oEIHxt7l%yhaC>XF?(wt=YCt{PB|$| zDX;iEV{=&lI9Ch(7WfOvO_?N|tkoV>TBpQfdyM5B z#dg2ARnmS^7dm1LDGQ>+wHnN1jl%$ZI6&|UgtRYv*ssm_a?<7wPQMoOvrl2UYi5vsP#`QSdA6WARe2x?eg-dJDT9{iRR{NV3C5`I z2z=Nh9~D=mNlq$hv?MFf^j1|HZM&NNouQAjs<)Jdt)kZ$b0baxKb&PxZz?Bby&GsO z+?-RfQkPEK0PSnIbK%)87FctDiQ=c@j?$jY?f6cFF`(}2*5iH!J2aQ>)Z*RX`lTd+ zM<#%Mb@{E=y^Zy$*;&TUJ^JP;PHR9Ods2ND*8&2ThW^K+hl5+~Ia~OfE|w36n<6LI zXWo=-SDSHdrF&QEEKhkl*>OwuW#3cm^k?gqR!tn-y(VA#t@=p#itBCC3`nV@P+eEo z*nRW(QU`z?68pSSd-t1mz6&$A2gi?lyOFC< zl-W<{vNnFk^H=-DI;BE)0VH-L=UQ!}Db?jo*>>6vBEt_+u`Q2uEsuVi?3E{ai>lSO zUDf`^9Rwpfb91IArOl{7*reB3O&2O3RCO1{ri5QUDBQwx98;|mqNW4I1e!rj-WWaz z&=hTJx2Nsw^_*Deqi1F(D>~T=%gf)YZZ~gUtVY(_Tr%EV7MOZgCxW4SXv%UjAmE!D zq6zUEsbgF4hN$!0yzhVd+?8D4HW#;WaRIK|aBp&Fy|G%|SFHmx$EJtu$7(cvj^{<+ z(l=a2md`kSPur3BeqnI76!(DF8C}n%U%_0;5-uwF$tb}feT$92V-EI$)|82()9CjR z8V>+oKR`zb4@(hb;Tbw;+pd_QgdaC6$ua`*nejJb39(79_^kv!K`p?WeLfua zg{%C8AOj;hgZDXx@SN~uhYf1B8G@3pYe2>!Ke)Txw2av)*0{!2(?^_wmB+JN=ZTG? zSIhaIgk$kmZt@ALz5S|pKhH~J*ivxHsGEvHr1 zXzm9^A{!=o+D!wk6)Bc51)89Z1z^Z|lw~)=tE0LdRB~YC$aj4eAY<8azwu_eKzeFl zvp!Dgc?`41UhBa1oFzC1FrArNf?88@N5F1w9b+|9$Kw<1`A0?10!RW>USJ1; zpN`4q@=(>Qm$tXh8|82JJw(#c37l#}fNge;y{oqRHJZ^p2|$(OrNW%=1itDbZ*H;C zTZ7tq1tufP1kSvy1KE*o^`rovKHeQ6c%HF4eEaY*NR5~Jip|vJt~KY25KS$uoW5lp z0-mj+q^tBNvQW~A)9d2eHiJb)g=fcvENk@hoz;8OP)syF&)B2B5Z%IJN4}GNultgM z1X$BwJw<~)&TZUS&n0S*%RBHU-U1~FXwy_wf}Hop^EJnFKMuJ_LyQ;MQUD?>SA(2wd}<$An~Bv#Pbgkj?g^PQ26U#co#jTQA(2WY81u%2Sr<%kK@F!}g4K4kK$MF8nPbvB-~ z_@s1VjgxLu?CSYe^mf^3mUzTvTt5&zm}4szScb8j0NX_peWDTg3tUbT8s_D|l#`Gd z1myjcjhrMX7&`d>`!SxsCwf3$`QNSo^`V}BNdI-L=f4HtkM;cPs{bbZAJYF1hkWED VA)($mz<$5#et-7;9t;S`{{cV|-2eap literal 12860 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 XAmg(P1mrsg*zZrn?_Woj_tF0Wb)A+8 diff --git a/tests/Feature/UserTest.php b/tests/Feature/UserTest.php index 02dd137db1e4..07db7e2034ac 100644 --- a/tests/Feature/UserTest.php +++ b/tests/Feature/UserTest.php @@ -55,9 +55,9 @@ class UserTest extends TestCase PasswordProtection::class ); - if (config('ninja.testvars.travis') !== false) { - $this->markTestSkipped('Skip test for Travis'); - } + // if (config('ninja.testvars.travis') !== false) { + // $this->markTestSkipped('Skip test for Travis'); + // } } public function testUserList() @@ -101,15 +101,14 @@ class UserTest extends TestCase public function testUserAttachAndDetach() { + $this->withoutMiddleware(PasswordProtection::class); - $user = UserFactory::create($this->account->id); - $user->first_name = 'Test'; - $user->last_name = 'Palloni'; - $user->email = $this->default_email; - $user->save(); - - $data = $user->toArray(); + $data = [ + 'first_name' => 'Test', + 'last_name' => 'Palloni', + 'email' => $this->default_email, + ]; $response = false; @@ -129,6 +128,8 @@ class UserTest extends TestCase $response->assertStatus(200); + $arr = $response->json(); + // $this->assertNotNull($user->company_user); // $this->assertEquals($user->company_user->company_id, $this->company->id); @@ -136,13 +137,16 @@ class UserTest extends TestCase 'X-API-SECRET' => config('ninja.api_secret'), 'X-API-TOKEN' => $this->token, 'X-API-PASSWORD' => 'ALongAndBriliantPassword', - ])->delete('/api/v1/users/'.$this->encodePrimaryKey($user->id).'/detach_from_company?include=company_user'); + ])->delete('/api/v1/users/'.$arr['data']['id'].'/detach_from_company?include=company_user'); $response->assertStatus(200); - $cu = CompanyUser::whereUserId($user->id)->whereCompanyId($this->company->id)->first(); - $ct = CompanyToken::whereUserId($user->id)->whereCompanyId($this->company->id)->first(); + $user_id = $this->decodePrimaryKey($arr['data']['id']); + $cu = CompanyUser::whereUserId($user_id)->whereCompanyId($this->company->id)->first(); + $ct = CompanyToken::whereUserId($user_id)->whereCompanyId($this->company->id)->first(); + $user = User::find($user_id); + $this->assertNull($cu); $this->assertNull($ct); $this->assertNotNull($user); @@ -172,14 +176,12 @@ class UserTest extends TestCase $cu->save(); /*Create New Blank User and Attach to Company 2*/ - $new_user = UserFactory::create($this->account->id); - $new_user->first_name = 'Test'; - $new_user->last_name = 'Palloni'; - $new_user->email = $this->default_email; - $new_user->save(); - - $data = $new_user->toArray(); - + $data = [ + 'first_name' => 'Test', + 'last_name' => 'Palloni', + 'email' => $this->default_email, + ]; + $response = $this->withHeaders([ 'X-API-SECRET' => config('ninja.api_secret'), 'X-API-TOKEN' => $company_token->token,