chore: update dependencies for Laravel 9 (#6098)

This commit is contained in:
Alexis Saettler
2022-08-12 18:42:35 +02:00
committed by GitHub
parent 6a7f49fd90
commit 78cd01b2b5
78 changed files with 1889 additions and 2286 deletions
+1 -1
View File
@@ -60,7 +60,7 @@ BROADCAST_DRIVER=log
# Default filesystem to store uploaded files.
# Possible values: public|s3
DEFAULT_FILESYSTEM=public
FILESYSTEM_DISK=public
# AWS keys for S3 when using this storage method
AWS_KEY=
+1 -1
View File
@@ -119,7 +119,7 @@ DEFAULT_MAX_STORAGE_SIZE=512
# Default filesystem to store uploaded files.
# Possible values: public|s3
DEFAULT_FILESYSTEM=public
FILESYSTEM_DISK=public
# AWS keys for S3 when using this storage method
AWS_KEY=
+1 -1
View File
@@ -13,7 +13,7 @@ on:
env:
php-version: '8.1'
node-version: 16
node-version: 18
jobs:
#############
+1 -1
View File
@@ -5,7 +5,7 @@ on:
types: [labeled, opened, synchronize, reopened]
env:
node-version: 16
node-version: 18
jobs:
+1 -1
View File
@@ -15,7 +15,7 @@ on:
env:
php-version: '8.1'
node-version: 16
node-version: 18
jobs:
#############
+1 -1
View File
@@ -7,7 +7,7 @@ on:
env:
php-version: '8.1'
node-version: 16
node-version: 18
jobs:
docker-run:
+2 -2
View File
@@ -14,8 +14,8 @@ on:
env:
php-version: '8.1'
build-node-version: 16
semantic-node-version: 16
build-node-version: 18
semantic-node-version: 18
jobs:
+4 -5
View File
@@ -15,7 +15,7 @@ on:
env:
default-php-version: '8.1'
node-version: 16
node-version: 18
jobs:
@@ -115,20 +115,19 @@ jobs:
# Test
- name: Run Unit test suite
if: matrix.php-version == env.default-php-version
run: phpdbg -dmemory_limit=4G -qrr vendor/bin/phpunit -c phpunit.xml --testsuite ${{ matrix.testsuite }} --log-junit ./results/junit/results${{ matrix.testsuite }}.xml --coverage-clover ./results/coverage/coverage${{ matrix.testsuite }}.xml
if: matrix.php-version == env.default-php-version && matrix.testsuite != 'Feature'
run: phpdbg -dmemory_limit=6G -qrr vendor/bin/phpunit -c phpunit.xml --testdox --testsuite ${{ matrix.testsuite }} --log-junit ./results/junit/results${{ matrix.testsuite }}.xml --coverage-clover ./results/coverage/coverage${{ matrix.testsuite }}.xml
env:
DB_CONNECTION: ${{ matrix.connection }}
STRIPE_SECRET: ${{ secrets.STRIPE_SECRET }}
- name: Run Unit test suite
if: matrix.php-version != env.default-php-version
if: matrix.php-version != env.default-php-version || matrix.testsuite == 'Feature'
run: vendor/bin/phpunit -c phpunit.xml --testsuite ${{ matrix.testsuite }} --log-junit ./results/junit/results${{ matrix.testsuite }}.xml
env:
DB_CONNECTION: ${{ matrix.connection }}
STRIPE_SECRET: ${{ secrets.STRIPE_SECRET }}
- name: Fix results files
if: matrix.php-version == env.default-php-version
run: sed -i -e "s%$GITHUB_WORKSPACE/%%g" **/*.xml
working-directory: results
@@ -2,6 +2,7 @@
namespace App\Console\Commands\Helpers;
use function Safe\exec;
use Illuminate\Console\Command;
use Illuminate\Console\Application;
use Symfony\Component\Console\Output\OutputInterface;
+1 -2
View File
@@ -7,7 +7,6 @@ use App\Models\User\User;
use function Safe\fclose;
use App\Helpers\DateHelper;
use App\Models\Contact\Gender;
use App\Models\Contact\Address;
use App\Models\Contact\Contact;
use Illuminate\Console\Command;
use App\Models\Contact\ContactField;
@@ -92,7 +91,7 @@ class ImportCSV extends Command
$imported = 0;
$handle = fopen($file, 'r');
try {
while (($data = fgetcsv($handle)) !== false) {
while (($data = fgetcsv($handle)) !== false) { /** @phpstan-ignore-line */
// don't import the columns
if ($first) {
$first = false;
+1
View File
@@ -2,6 +2,7 @@
namespace App\Console\Commands;
use function Safe\exec;
use function Safe\mkdir;
use Illuminate\Console\Command;
use function Safe\file_put_contents;
+1
View File
@@ -2,6 +2,7 @@
namespace App\Console\Commands;
use function Safe\exec;
use App\Models\User\User;
use App\Helpers\DateHelper;
use Illuminate\Support\Carbon;
+1 -1
View File
@@ -66,7 +66,7 @@ class InstanceHelper
if (is_null($stripeSubscription) || is_null($plan)) {
return [
'type' => $subscription->stripe_plan,
'type' => $subscription->stripe_price,
'name' => $subscription->name,
'id' => $subscription->stripe_id,
'price' => '?',
+5 -5
View File
@@ -34,7 +34,7 @@ class MoneyHelper
$currency = self::getCurrency($currency);
if (! $currency) {
if (! $currency || ! $currency->iso) {
$numberFormatter = new \NumberFormatter(App::getLocale(), \NumberFormatter::DECIMAL);
return $numberFormatter->format($amount);
@@ -60,7 +60,7 @@ class MoneyHelper
{
$currency = self::getCurrency($currency);
if (! $currency) {
if (! $currency || ! $currency->iso) {
return (string) ($amount / 100);
}
@@ -84,12 +84,12 @@ class MoneyHelper
{
$currency = self::getCurrency($currency);
if (! $currency) {
if (! $currency || ! $currency->iso) {
return (int) ((float) $exchange * 100);
}
$moneyParser = new DecimalMoneyParser(new ISOCurrencies());
$money = $moneyParser->parse((string) $exchange, $currency->iso);
$money = $moneyParser->parse((string) $exchange, new MoneyCurrency($currency->iso));
return (int) $money->getAmount();
}
@@ -107,7 +107,7 @@ class MoneyHelper
{
$currency = self::getCurrency($currency);
if (! $currency) {
if (! $currency || ! $currency->iso) {
return (string) ($amount / 100);
}
+1 -1
View File
@@ -57,7 +57,7 @@ class RequestHelper
$ipstack = new Ipstack(config('location.ipstack_apikey'));
$position = $ipstack->get($ip, true);
if (! is_null($position) && Arr::get($position, 'country_code')) {
if ($position !== null && Arr::get($position, 'country_code')) {
return [
'country' => Arr::get($position, 'country_code'),
'currency' => Arr::get($position, 'currency.code'),
-1
View File
@@ -3,7 +3,6 @@
namespace App\Helpers;
use DateTimeZone;
use function Safe\substr;
class TimezoneHelper
{
-23
View File
@@ -1,8 +1,6 @@
<?php
use App\Helpers\LocaleHelper;
use Illuminate\Support\Facades\Storage;
use League\Flysystem\Adapter\AbstractAdapter;
if (! function_exists('htmldir')) {
/**
@@ -17,24 +15,3 @@ if (! function_exists('htmldir')) {
return LocaleHelper::getDirection();
}
}
if (! function_exists('disk_adapter')) {
/**
* Get the adapter for a disk.
*
* @param string|null $disk
* @return \League\Flysystem\Adapter\AbstractAdapter|null
*/
function disk_adapter($disk = null): ?AbstractAdapter
{
$driver = Storage::disk($disk)->getDriver();
if ($driver instanceof \League\Flysystem\Filesystem) {
$adapter = $driver->getAdapter();
if ($adapter instanceof \League\Flysystem\Adapter\AbstractAdapter) {
return $adapter;
}
}
return null;
}
}
@@ -42,6 +42,7 @@ class AddressBookRoot extends BaseAddressBookRoot implements IACL
*
* @param array $principal
* @return \Sabre\DAV\INode
* @psalm-suppress ParamNameMismatch
*/
public function getChildForPrincipal(array $principal)
{
@@ -2,7 +2,6 @@
namespace App\Http\Controllers;
use App\Models\User\User;
use App\Helpers\DateHelper;
use App\Models\Contact\Debt;
use Illuminate\Http\Request;
@@ -16,7 +16,7 @@ class RecoveryCodesController extends Controller
* Generate recovery codes.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Support\Collection
* @return \Illuminate\Support\Collection<array-key, array{id: int, recovery: string, used: bool}>
*/
public function store(Request $request)
{
@@ -38,7 +38,7 @@ class RecoveryCodesController extends Controller
* Get list of recovery codes.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Support\Collection
* @return \Illuminate\Support\Collection<array-key, array{id: int, recovery: string, used: bool}>
*/
public function index(Request $request)
{
@@ -55,12 +55,12 @@ class RecoveryCodesController extends Controller
/**
* Format codes collection for response.
*
* @param \Illuminate\Database\Eloquent\Collection $codes
* @return \Illuminate\Support\Collection
* @param \Illuminate\Support\Collection<array-key, \App\Models\User\RecoveryCode> $codes
* @return \Illuminate\Support\Collection<array-key, array{id: int, recovery: string, used: bool}>
*/
private function response($codes)
{
return $codes->map(function ($code) {
return $codes->map(function (RecoveryCode $code): array {
return [
'id' => $code->id,
'recovery' => $code->recovery,
@@ -17,6 +17,8 @@ class StorageController extends Controller
{
$documents = Document::where('account_id', auth()->user()->account_id)->get();
$photos = Photo::where('account_id', auth()->user()->account_id)->get();
/** @var \Illuminate\Support\Collection<array-key, \Illuminate\Database\Eloquent\Model> */
$documents = collect($documents);
$elements = $documents->concat($photos)->sortByDesc('created_at');
// size is in bytes in the database
@@ -16,7 +16,6 @@ use App\Http\Controllers\Controller;
use Illuminate\Http\RedirectResponse;
use Illuminate\Contracts\View\Factory;
use Stripe\Exception\ApiErrorException;
use Stripe\PaymentIntent as StripePaymentIntent;
use Laravel\Cashier\Exceptions\IncompletePayment;
use App\Services\Account\Settings\ArchiveAllContacts;
@@ -51,7 +50,7 @@ class SubscriptionsController extends Controller
}
try {
$planInformation = $this->stripeCall(function () use ($subscription) {
$planInformation = $this->stripeCall(function () use ($subscription): ?array {
return InstanceHelper::getPlanInformationFromSubscription($subscription);
});
} catch (StripeException $e) {
@@ -183,8 +182,8 @@ class SubscriptionsController extends Controller
public function confirmPayment($id)
{
try {
$payment = $this->stripeCall(function () use ($id) {
return StripePaymentIntent::retrieve($id, Cashier::stripeOptions());
$payment = $this->stripeCall(function () use ($id): \Stripe\PaymentIntent {
return Cashier::stripe()->paymentIntents->retrieve($id);
});
} catch (StripeException $e) {
return back()->withErrors($e->getMessage());
+1 -1
View File
@@ -72,7 +72,7 @@ class SettingsController extends Controller
->withLocales(LocaleHelper::getLocaleList()->sortByCollator('name-orig'))
->withHours(DateHelper::getListOfHours())
->withSelectedTimezone(TimezoneHelper::adjustEquivalentTimezone(DateHelper::getTimezone()))
->withTimezones(collect(TimezoneHelper::getListOfTimezones())->map(function ($timezone) {
->withTimezones(collect(TimezoneHelper::getListOfTimezones())->map(function (array $timezone): array {
return ['id' => $timezone['timezone'], 'name'=>$timezone['name']];
}));
}
+2 -2
View File
@@ -10,7 +10,7 @@ use Illuminate\Support\Carbon;
use App\Models\Contact\Contact;
use App\Models\Contact\Document;
use Illuminate\Support\Facades\Response;
use League\Flysystem\FileNotFoundException;
use League\Flysystem\FilesystemException;
class StorageController extends Controller
{
@@ -45,7 +45,7 @@ class StorageController extends Controller
}
return $disk->response($file, $filename, $headers);
} catch (FileNotFoundException $e) {
} catch (FilesystemException $e) {
abort(404);
}
}
+1 -1
View File
@@ -63,7 +63,7 @@ class ExportAccount implements ShouldQueue
]);
// get the temp file that we just created
$tempFilePath = disk_adapter('local')->getPathPrefix().$tempFileName;
$tempFilePath = StorageHelper::disk('local')->path($tempFileName);
// move the file to the public storage
$file = StorageHelper::disk(config('filesystems.default'))
-3
View File
@@ -43,9 +43,6 @@ class ServiceQueue implements ShouldQueue
*/
public function __construct(QueuableService $service, array $data = null)
{
if (! $service instanceof QueuableService) {
throw new \Exception('Service is not queuable');
}
$this->service = $service;
$this->data = $data;
}
+10 -3
View File
@@ -8,13 +8,14 @@ use Illuminate\Support\Arr;
use App\Helpers\AccountHelper;
use Sabre\VObject\Component\VCard;
use App\Services\VCard\ImportVCard;
use League\Flysystem\UnableToReadFile;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Storage;
use League\Flysystem\UnableToDeleteFile;
use Illuminate\Validation\ValidationException;
use Sabre\VObject\Splitter\VCard as VCardReader;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Contracts\Filesystem\FileNotFoundException;
/**
* @property int $id
@@ -170,7 +171,7 @@ class ImportJob extends Model
{
try {
$this->physicalFile = Storage::disk(config('filesystems.default'))->readStream($this->filename);
} catch (FileNotFoundException $exception) {
} catch (UnableToReadFile $exception) {
$this->fail(trans('settings.import_vcard_file_not_found'));
return false;
@@ -186,7 +187,13 @@ class ImportJob extends Model
*/
private function deletePhysicalFile(): bool
{
if (! Storage::disk(config('filesystems.default'))->delete($this->filename)) {
try {
if (Storage::disk(config('filesystems.default'))->delete($this->filename) === false) {
$this->fail(trans('settings.import_vcard_file_not_found'));
return false;
}
} catch (UnableToDeleteFile $exception) {
$this->fail(trans('settings.import_vcard_file_not_found'));
return false;
+3 -5
View File
@@ -1225,7 +1225,7 @@ class Contact extends Model
*/
public function getTagsAsString()
{
return $this->tags->map(function ($tag) {
return $this->tags->map(function (Tag $tag): string {
return $tag->name;
})->join(',');
}
@@ -1251,9 +1251,7 @@ class Contact extends Model
->debts()
->inProgress()
->getResults()
->filter(function ($d) {
return Arr::has($d->attributes, 'amount');
})
->filter(fn ($d) => Arr::has($d->attributes, 'amount'))
->sum(function ($d) {
$amount = $d->attributes['amount'];
@@ -1374,7 +1372,7 @@ class Contact extends Model
{
$relationships = $this->relationships->filter(function ($item) {
return ! is_null($item->ofContact) &&
! is_null($item->ofContact->birthday_special_date_id);
$item->ofContact->birthday_special_date_id > 0;
});
$reminders = collect();
-1
View File
@@ -3,7 +3,6 @@
namespace App\Models\Contact;
use App\Traits\HasUuid;
use function Safe\sprintf;
use App\Helpers\StorageHelper;
use App\Models\Account\Account;
use App\Models\ModelBinding as Model;
+1
View File
@@ -17,6 +17,7 @@ abstract class ModelBindingWithContact extends Model
*/
public function resolveRouteBinding($value, $field = null): ?Model
{
/** @var \App\Models\Contact\Contact|null */
$contact = Route::current()->parameter('contact');
if (Auth::guest() || is_null($contact)) {
+7
View File
@@ -25,6 +25,13 @@ class User extends Authenticatable implements MustVerifyEmail, HasLocalePreferen
{
use Notifiable, HasApiTokens, HasUuid;
/**
* The attributes that aren't mass assignable.
*
* @var array<string>|bool
*/
protected $guarded = ['id'];
/**
* The attributes that are mass assignable.
*
+2
View File
@@ -89,6 +89,8 @@ class AppServiceProvider extends ServiceProvider
Schema::defaultStringLength(191);
}
Cashier::useCustomerModel(\App\Models\Account\Account::class);
VerifyEmail::toMailUsing(function ($user, $verificationUrl) {
return EmailMessaging::verifyEmailMail($user, $verificationUrl);
});
+2 -2
View File
@@ -11,10 +11,10 @@ class AuthServiceProvider extends ServiceProvider
/**
* The policy mappings for the application.
*
* @var array<string, string>
* @var array<class-string, class-string>
*/
protected $policies = [
'App\Model' => 'App\Policies\ModelPolicy',
// 'App\Models\Model' => 'App\Policies\ModelPolicy',
];
/**
@@ -108,7 +108,7 @@ class ActivityStatisticService
});
// calculate how many occurences of unique activity type id
$activities = $grouped->map(function ($item, $key) {
$activities = $grouped->map(function ($item) {
return collect($item)->count();
});
+4 -4
View File
@@ -2,13 +2,13 @@
namespace App\Services\Account\Photo;
use function Safe\substr;
use Illuminate\Support\Arr;
use Illuminate\Support\Str;
use App\Models\Account\Photo;
use App\Services\BaseService;
use function Safe\finfo_open;
use function Safe\preg_match;
use App\Helpers\StorageHelper;
use App\Models\Contact\Contact;
use function Safe\base64_decode;
use Intervention\Image\Facades\Image;
@@ -111,9 +111,9 @@ class UploadPhoto extends BaseService
$tempfile = $this->storeImage('local', $image, 'temp/'.$filename);
try {
$storagePath = disk_adapter('local')->getPathPrefix();
$storagePath = StorageHelper::disk('local')->path($tempfile);
// This sets the basePath to get the filesize later
$image = $image->setFileInfoFromPath($storagePath.$tempfile);
$image = $image->setFileInfoFromPath($storagePath);
$extension = (new \Mimey\MimeTypes)->getExtension($image->mime());
if (empty($extension)) {
$extension = str_replace(' ', '', Arr::get($data, 'extension'));
@@ -175,7 +175,7 @@ class UploadPhoto extends BaseService
*/
private function isBinary(string $data): bool
{
$mime = finfo_buffer(finfo_open(FILEINFO_MIME_TYPE), $data);
$mime = finfo_buffer(finfo_open(FILEINFO_MIME_TYPE), $data); // @phpstan-ignore-line
return substr($mime, 0, 4) != 'text' && $mime != 'application/x-empty';
}
@@ -105,12 +105,14 @@ class GenerateDefaultAvatar extends BaseService
*/
private function deleteExistingDefaultAvatar(Contact $contact)
{
try {
Storage::disk(config('filesystems.default'))
->delete($contact->avatar_default_url);
$contact->avatar_default_url = null;
} catch (FileNotFoundException $e) {
// ignore
if ($contact->avatar_default_url !== null) {
try {
Storage::disk(config('filesystems.default'))
->delete($contact->avatar_default_url);
$contact->avatar_default_url = null;
} catch (FileNotFoundException $e) {
// ignore
}
}
return $contact;
@@ -47,13 +47,10 @@ class AddressBookContactsPushMissed
{
$backend = $this->backend();
/** @var Collection<array-key, string> */
$distUuids = $distContacts->map(function (ContactDto $contact) use ($backend) {
$distUuids = $distContacts->map(function (ContactDto $contact) use ($backend): string {
return $backend->getUuid($contact->uri);
});
/** @var Collection<array-key, string> */
$addedUuids = collect($added)->map(function ($uri) use ($backend) {
$addedUuids = collect($added)->map(function (string $uri) use ($backend): string {
return $backend->getUuid($uri);
});
@@ -118,14 +118,14 @@ class AddressBookSynchronizer
$contacts = $etags->filter(function ($contact, $href): bool {
return $this->filterDistantContacts($contact, $href);
})
->map(function ($contact, $href): ContactDto {
->map(function (array $contact, string $href): ContactDto {
return new ContactDto($href, Arr::get($contact, 'properties.200.{DAV:}getetag'));
});
$deleted = $etags->filter(function ($contact): bool {
return is_array($contact) && $contact['status'] === '404';
})
->map(function ($contact, $href): ContactDto {
->map(function (array $contact, string $href): ContactDto {
return new ContactDeleteDto($href);
});
@@ -230,13 +230,13 @@ class AddressBookSynchronizer
$updated = $data->filter(function ($contact): bool {
return is_array($contact) && $contact['status'] === '200';
})
->map(function ($contact, $href): ContactDto {
->map(function (array $contact, string $href): ContactDto {
return new ContactDto($href, Arr::get($contact, 'properties.200.{DAV:}getetag'));
});
$deleted = $data->filter(function ($contact): bool {
return is_array($contact) && $contact['status'] === '404';
})
->map(function ($contact, $href): ContactDto {
->map(function (array $contact, string $href): ContactDto {
return new ContactDeleteDto($href);
});
+11 -9
View File
@@ -556,16 +556,18 @@ class DavClient
$result = [];
foreach ($multistatus->getResponses() as $response) {
$result[$response->getHref()] = [
'properties' => $response->getResponseProperties(),
'status' => $response->getHttpStatus() ?? '200',
];
}
if (is_object($multistatus)) {
foreach ($multistatus->getResponses() as $response) {
$result[$response->getHref()] = [
'properties' => $response->getResponseProperties(),
'status' => $response->getHttpStatus() ?? '200',
];
}
$synctoken = $multistatus->getSyncToken();
if (! empty($synctoken)) {
$result['synctoken'] = $synctoken;
$synctoken = $multistatus->getSyncToken();
if (! empty($synctoken)) {
$result['synctoken'] = $synctoken;
}
}
return $result;
+5 -6
View File
@@ -3,6 +3,7 @@
namespace App\Services\VCard;
use Sabre\VObject\Reader;
use App\Models\Contact\Tag;
use Illuminate\Support\Str;
use App\Services\BaseService;
use App\Models\Contact\Gender;
@@ -300,14 +301,12 @@ class ExportVCard extends BaseService
private function getContactFieldLabel(LabelInterface $labelProvider): ?array
{
$type = null;
/** @var \Illuminate\Support\Collection<array-key, \App\Models\Contact\ContactFieldLabel> */
$labels = $labelProvider->labels()->get();
if ($labels->count() > 0) {
$type = [];
$type['type'] = $labels->map(function ($label) {
/** @var ContactFieldLabel */
$cflabel = $label;
return mb_strtoupper($cflabel->label_i18n) ?: $cflabel->label;
$type['type'] = $labels->map(function (ContactFieldLabel $label): string {
return mb_strtoupper($label->label_i18n) ?: $label->label;
})->join(',');
}
@@ -333,7 +332,7 @@ class ExportVCard extends BaseService
$vcard->remove('CATEGORIES');
if ($contact->tags->count() > 0) {
$vcard->CATEGORIES = $contact->tags->map(function ($tag) {
$vcard->CATEGORIES = $contact->tags->map(function (Tag $tag): string {
return $tag->name;
})->toArray();
}
-1
View File
@@ -5,7 +5,6 @@ namespace App\Services\VCard;
use Ramsey\Uuid\Uuid;
use App\Models\User\User;
use App\Traits\DAVFormat;
use function Safe\substr;
use Sabre\VObject\Reader;
use App\Helpers\DateHelper;
use App\Helpers\FormHelper;
+4 -2
View File
@@ -10,8 +10,10 @@ trait StripeCall
/**
* Call stripe.
*
* @param callable $callback
* @return mixed
* @template TValue
*
* @param (callable(): TValue) $callback
* @return TValue
*/
private function stripeCall($callback)
{
+3 -3
View File
@@ -42,7 +42,7 @@ trait Subscription
*/
public function updateSubscription(string $planName, \Laravel\Cashier\Subscription $subscription)
{
$oldPlan = $subscription->stripe_plan;
$oldPlan = $subscription->stripe_price;
$plan = InstanceHelper::getPlanInformationFromConfig($planName);
if ($plan === null) {
abort(404);
@@ -57,7 +57,7 @@ trait Subscription
return $subscription->swap($plan['id']);
});
if ($subscription->stripe_plan !== $oldPlan && $subscription->stripe_plan === $plan['id']) {
if ($subscription->stripe_price !== $oldPlan && $subscription->stripe_price === $plan['id']) {
$subscription->forceFill([
'name' => $plan['name'],
])->save();
@@ -99,7 +99,7 @@ trait Subscription
{
$plan = $this->getSubscribedPlan();
return is_null($plan) ? '' : $plan->stripe_plan;
return is_null($plan) ? '' : $plan->stripe_price;
}
/**
+23 -21
View File
@@ -16,49 +16,50 @@
"ext-intl": "*",
"ext-redis": "*",
"asbiin/laravel-adorable": "^1.0",
"asbiin/laravel-webauthn": "^1.0",
"asbiin/laravel-webauthn": "^3.0",
"bacon/bacon-qr-code": "^2.0",
"creativeorange/gravatar": "^1.0",
"doctrine/dbal": "^3.0",
"erusev/parsedown": "^1.7",
"facade/ignition": "^2.0",
"giggsey/libphonenumber-for-php": "^8.9",
"guzzlehttp/guzzle": "^7.2",
"guzzlehttp/psr7": "^2.1",
"intervention/image": "^2.3",
"laravel/cashier": "^12.0",
"laravel/framework": "^8.0",
"laravel/cashier": "^13.0",
"laravel/framework": "^9.0",
"laravel/passport": "^10.0",
"laravel/socialite": "^5.0",
"laravel/ui": "^3.0",
"laravolt/avatar": "^4.0",
"league/flysystem-aws-s3-v3": "~1.0",
"league/flysystem-cached-adapter": "^1.0",
"league/flysystem-aws-s3-v3": "^3.0",
"mariuzzo/laravel-js-localization": "^1.7",
"matriphe/iso-639": "^1.0",
"moneyphp/money": "^3.1",
"moneyphp/money": "^4.0",
"monicahq/laravel-cloudflare": "^3.0",
"monicahq/laravel-sabre": "^1.2",
"ok/ipstack-client": "^1.2",
"ok/ipstack-client": "^2.0",
"phar-io/version": "^3.1",
"pragmarx/google2fa": "^8.0",
"pragmarx/google2fa-laravel": "^1.3",
"pragmarx/google2fa-laravel": "^2.0",
"pragmarx/random": "^0",
"predis/predis": "^1.1",
"rinvex/countries": "^8.1",
"sabre/dav": "^4.0",
"sentry/sentry-laravel": "^2.0",
"spatie/macroable": "^1.0",
"spatie/macroable": "^2.0",
"stevebauman/location": "^6.1",
"symfony/translation": "^5.0",
"thecodingmachine/safe": "^1.0",
"symfony/http-client": "^6.0",
"symfony/mailgun-mailer": "^6.0",
"symfony/translation": "^6.0",
"thecodingmachine/safe": "^2.0",
"vectorface/whip": "^0.4",
"vinkla/hashids": "^9.0",
"vinkla/hashids": "^10.0",
"vluzrmos/language-detector": "^2.2",
"web-token/jwt-key-mgmt": "^2.1",
"web-token/jwt-signature-algorithm-ecdsa": "^2.1",
"web-token/jwt-signature-algorithm-eddsa": "^2.1",
"web-token/jwt-signature-algorithm-rsa": "^2.1",
"werk365/etagconditionals": "^1.2",
"web-token/jwt-key-mgmt": "^3.0",
"web-token/jwt-signature-algorithm-ecdsa": "^3.0",
"web-token/jwt-signature-algorithm-eddsa": "^3.0",
"web-token/jwt-signature-algorithm-rsa": "^3.0",
"werk365/etagconditionals": "dev-master",
"xantios/mimey": "^2.0"
},
"require-dev": {
@@ -70,12 +71,13 @@
"laravel/tinker": "^2.6",
"matthiasnoback/live-code-coverage": "^1",
"mockery/mockery": "^1.0",
"nunomaduro/collision": "^5.0",
"nunomaduro/larastan": "^0",
"nunomaduro/collision": "^6.1",
"nunomaduro/larastan": "^2.0",
"phpunit/phpcov": "^8.0",
"phpunit/phpunit": "^9.0",
"psalm/plugin-laravel": "^1.0",
"psalm/plugin-laravel": "^2.0",
"roave/security-advisories": "dev-master",
"spatie/laravel-ignition": "^1.0",
"thecodingmachine/phpstan-safe-rule": "^1.0",
"vimeo/psalm": "^4.0"
},
Generated
+1604 -1851
View File
File diff suppressed because it is too large Load Diff
-13
View File
@@ -46,19 +46,6 @@ return [
'tolerance' => env('STRIPE_WEBHOOK_TOLERANCE', 300),
],
/*
|--------------------------------------------------------------------------
| Cashier Model
|--------------------------------------------------------------------------
|
| This is the model in your application that implements the Billable trait
| provided by Cashier. It will serve as the primary model you use while
| interacting with Cashier related methods, subscriptions, and so on.
|
*/
'model' => env('CASHIER_MODEL', App\Models\Account\Account::class),
/*
|--------------------------------------------------------------------------
| Currency
+6 -20
View File
@@ -15,20 +15,7 @@ return [
|
*/
'default' => env('DEFAULT_FILESYSTEM', 'public'),
/*
|--------------------------------------------------------------------------
| Default Cloud Filesystem Disk
|--------------------------------------------------------------------------
|
| Many applications store files both locally and in the cloud. For this
| reason, you may specify a default "cloud" driver here. This driver
| will be bound as the Cloud disk implementation in the container.
|
*/
'cloud' => env('FILESYSTEM_CLOUD', 's3'),
'default' => env('FILESYSTEM_DISK', env('DEFAULT_FILESYSTEM', 'public')),
/*
|--------------------------------------------------------------------------
@@ -46,12 +33,15 @@ return [
'local' => [
'driver' => 'local',
'root' => storage_path('app'),
'throw' => true,
],
'public' => [
'driver' => 'local',
'root' => storage_path('app/public'),
'url' => env('APP_URL').'/storage',
'visibility' => 'public',
'throw' => true,
],
's3' => [
@@ -62,12 +52,8 @@ return [
'bucket' => env('AWS_BUCKET'),
'url' => env('AWS_URL'),
'endpoint' => env('AWS_ENDPOINT', env('AWS_SERVER', '') ? 'https://'.env('AWS_SERVER') : null),
'cache' => [
'store' => env('S3_CACHE_STORE', env('CACHE_DRIVER', 'file')),
'expire' => env('S3_CACHE_EXPIRE', 600),
'prefix' => env('S3_CACHE_PREFIX', 's3'),
],
'use_path_style_endpoint' => env('S3_PATH_STYLE', false),
'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', env('S3_PATH_STYLE', false)),
'throw' => true,
],
],
+1 -1
View File
@@ -22,7 +22,7 @@ $factory->define(\Laravel\Cashier\Subscription::class, function (Faker\Generator
'account_id' => factory(App\Models\Account\Account::class)->create()->id,
'name' => $faker->word(),
'stripe_id' => $faker->word(),
'stripe_plan' => $faker->randomElement(['plan-1', 'plan-2', 'plan-3']),
'stripe_price' => $faker->randomElement(['plan-1', 'plan-2', 'plan-3']),
'quantity' => 1,
'created_at' => now(),
];
@@ -0,0 +1,57 @@
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
return new class extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('subscriptions', function (Blueprint $table) {
$table->renameColumn('stripe_plan', 'stripe_price');
});
Schema::table('subscription_items', function (Blueprint $table) {
$table->renameColumn('stripe_plan', 'stripe_price');
});
Schema::table('accounts', function (Blueprint $table) {
$table->renameColumn('card_brand', 'pm_type');
$table->renameColumn('card_last_four', 'pm_last_four');
});
Schema::table('subscription_items', function (Blueprint $table) {
$table->string('stripe_product')->nullable()->after('stripe_id');
$table->integer('quantity')->nullable()->change();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('subscription_items', function (Blueprint $table) {
$table->dropColumn('stripe_product');
});
Schema::table('accounts', function (Blueprint $table) {
$table->renameColumn('pm_type', 'card_brand');
$table->renameColumn('pm_last_four', 'card_last_four');
});
Schema::table('subscription_items', function (Blueprint $table) {
$table->renameColumn('stripe_price', 'stripe_plan');
});
Schema::table('subscriptions', function (Blueprint $table) {
$table->renameColumn('stripe_price', 'stripe_plan');
});
}
};
+3 -3
View File
@@ -21,7 +21,7 @@ We currently only support AWS S3 driver as external storage.
You need to define at least these environment variables:
```
DEFAULT_FILESYSTEM=s3
FILESYSTEM_DISK=s3
AWS_BUCKET=
AWS_DEFAULT_REGION=
AWS_ACCESS_KEY_ID=
@@ -85,9 +85,9 @@ Then save `AccessKeyId` and `SecretAccessKey` in `AWS_ACCESS_KEY_ID` and `AWS_SE
### 3. Set environment variables
Set the `DEFAULT_FILESYSTEM` variable to use S3 storage:
Set the `FILESYSTEM_DISK` variable to use S3 storage:
```
DEFAULT_FILESYSTEM=s3
FILESYSTEM_DISK=s3
```
+1 -1
View File
@@ -35,7 +35,7 @@
"composer update": "COMPOSER_MEMORY_LIMIT=-1 composer update"
},
"engines": {
"node": "16.x",
"node": "18.x",
"yarn": "1.22.x"
},
"devDependencies": {
+12 -2
View File
@@ -6,17 +6,18 @@ parameters:
paths:
- app
inferPrivatePropertyTypeFromConstructor: true
checkMissingIterableValueType: false
level: 5
ignoreErrors:
- '#Call to an undefined method Illuminate\\View\\View::with[a-zA-Z0-9\\_]+\(\)\.#'
- '#Access to an undefined property Sabre\\VObject\\Component\\[a-zA-Z0-9\\_]+::\$[a-zA-Z0-9_]+\.#'
- '#Unsafe call to private method .* through static::\.#'
- '#Unsafe access to private property .* through static::\.#'
- message: '#Access to an undefined property Illuminate\\Support\\Fluent::\$[a-zA-Z0-9_]+\.#'
path: */Http/Location/Drivers/CloudflareDriver.php
- message: '#Access to an undefined property App\\Interfaces\\IsJournalableInterface::\$account_id\.#'
path: */app/Models/Journal/JournalEntry.php
- message: '#Cannot assign offset ''VALUE'' to string\.#'
path: */Services/VCalendar/ExportVCalendar.php
- message: '#Property App\\Models\\Contact\\Contact::\$deceased_special_date_id \(int\) does not accept null\.#'
path: */Services/Contact/Contact/UpdateDeceasedInformation.php
- message: '#Parameter \#1 \$principalUri of method Sabre\\CardDAV\\Backend\\BackendInterface::getAddressBooksForUser\(\) expects string, array given\.#'
@@ -39,3 +40,12 @@ parameters:
path: */Traits/Subscription.php
- message: '#Function dns_get_record is unsafe to use\. It can return FALSE instead of throwing an exception\. Please add ''use function Safe\\dns_get_record;'' at the beginning of the file to use the variant provided by the ''thecodingmachine/safe'' library\.#'
path: */Services/DavClient/Utils/Dav/ServiceUrlQuery.php
- message: '#Access to an undefined property App\\Models\\Relationship\\Relationship::\$relationshipTypeLocalized\.#'
path: */Http/Controllers/ContactsController.php
- message: '#Call to an undefined method Traversable<int, App\\Models\\Contact\\Debt>::filter\(\)\.#'
path: */Models/Contact/Contact.php
excludePaths:
- */Http/Resources/**/*.php
- */ExportResources/**/*.php
- */ExportResources/*.php
+1 -1
View File
@@ -62,7 +62,7 @@
<env name="MAIL_MAILER" value="array"/>
<env name="QUEUE_CONNECTION" value="sync"/>
<env name="SESSION_DRIVER" value="array"/>
<env name="DEFAULT_FILESYSTEM" value="public"/>
<env name="FILESYSTEM_DISK" value="public"/>
<env name="DEBUGBAR_ENABLED" value="false"/>
<env name="APP_DEFAULT_LOCALE" value="en"/>
<env name="LOG_CHANNEL" value="testing"/>
+2 -151
View File
@@ -1,13 +1,13 @@
<?xml version="1.0"?>
<psalm
useDocblockTypes="true"
errorLevel="7"
resolveFromConfigFile="true"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="https://getpsalm.org/schema/config"
xsi:schemaLocation="https://getpsalm.org/schema/config vendor/vimeo/psalm/config.xsd"
>
<projectFiles>
<directory name="database/seeds" />
<directory name="database/migrations" />
<directory name="app" />
<directory name="routes" />
<ignoreFiles>
@@ -19,153 +19,4 @@
<plugins>
<pluginClass class="Psalm\LaravelPlugin\Plugin" />
</plugins>
<issueHandlers>
<LessSpecificReturnType errorLevel="info" />
<!-- level 3 issues - slightly lazy code writing, but provably low false-negatives -->
<DeprecatedMethod errorLevel="info" />
<MissingClosureReturnType errorLevel="info" />
<MissingReturnType errorLevel="info" />
<MissingPropertyType errorLevel="error" />
<InvalidDocblock errorLevel="error" />
<PropertyNotSetInConstructor errorLevel="info" />
<MissingConstructor errorLevel="info" />
<MissingParamType errorLevel="info" />
<MissingClosureParamType errorLevel="info" />
<DocblockTypeContradiction errorLevel="info" />
<RedundantConditionGivenDocblockType errorLevel="info" />
<!-- level 4 issues - points to possible deficiencies in logic, higher false-positives -->
<MismatchingDocblockReturnType errorLevel="info" />
<MismatchingDocblockParamType errorLevel="info" />
<MoreSpecificReturnType errorLevel="info" />
<LessSpecificReturnStatement errorLevel="info" />
<ArgumentTypeCoercion errorLevel="info" />
<RedundantCondition errorLevel="info" />
<PossiblyFalseArgument errorLevel="info" />
<PossiblyFalsePropertyAssignmentValue errorLevel="info" />
<PossiblyFalseReference errorLevel="info" />
<PossiblyInvalidArgument errorLevel="info" />
<PossiblyInvalidArrayAccess errorLevel="info" />
<PossiblyInvalidArrayAssignment errorLevel="info" />
<PossiblyInvalidMethodCall errorLevel="info" />
<PossiblyInvalidPropertyAssignment errorLevel="info" />
<PossiblyInvalidPropertyAssignmentValue errorLevel="info" />
<PossiblyInvalidPropertyFetch errorLevel="info" />
<PossiblyNullArgument errorLevel="info" />
<PossiblyNullArrayAccess errorLevel="info" />
<PossiblyNullArrayAssignment errorLevel="info" />
<PossiblyNullArrayOffset errorLevel="info" />
<PossiblyNullFunctionCall errorLevel="info" />
<PossiblyNullIterator errorLevel="info" />
<PossiblyNullOperand errorLevel="info" />
<PossiblyNullPropertyAssignment errorLevel="info" />
<PossiblyNullPropertyAssignmentValue errorLevel="info" />
<PossiblyNullPropertyFetch errorLevel="info" />
<PossiblyNullReference errorLevel="info" />
<!-- level 5 issues - should be avoided at mosts costs... -->
<ForbiddenCode errorLevel="info" />
<ImplicitToStringCast errorLevel="info" />
<InvalidScalarArgument errorLevel="info" />
<InvalidToString errorLevel="info" />
<MethodSignatureMismatch errorLevel="info" />
<NoInterfaceProperties errorLevel="info" />
<TooManyArguments errorLevel="info" />
<TypeDoesNotContainType errorLevel="info" />
<InvalidOperand errorLevel="info" />
<LessSpecificImplementedReturnType errorLevel="info" />
<MoreSpecificImplementedParamType errorLevel="info" />
<InternalMethod errorLevel="suppress" />
<!-- level 6 issues - bad stuff here -->
<InvalidNullableReturnType errorLevel="info" />
<NullableReturnStatement errorLevel="info" />
<ImplementedReturnTypeMismatch errorLevel="info" />
<UnresolvableInclude errorLevel="info" />
<InvalidReturnStatement errorLevel="info" />
<InvalidReturnType errorLevel="info" />
<InvalidArgument errorLevel="info" />
<PossiblyUndefinedMethod errorLevel="info" />
<ReservedWord errorLevel="info" />
<UndefinedInterfaceMethod errorLevel="info" />
<!-- Personal fixes -->
<UndefinedMagicPropertyFetch errorLevel="suppress" />
<InvalidPropertyAssignmentValue errorLevel="suppress" />
<UndefinedPropertyAssignment>
<errorLevel type="suppress">
<file name="database/migrations/2017_07_26_220021_change_contacts_table.php" />
</errorLevel>
</UndefinedPropertyAssignment>
<UndefinedMagicPropertyAssignment errorLevel="suppress" />
<UndefinedThisPropertyFetch errorLevel="suppress" />
<UndefinedThisPropertyAssignment errorLevel="suppress" />
<UndefinedPropertyFetch>
<errorLevel type="suppress">
<file name="app/Services/VCalendar/ImportTask.php" />
</errorLevel>
</UndefinedPropertyFetch>
<UndefinedMagicMethod>
<errorLevel type="suppress">
<file name="app/Traits/Searchable.php" />
<file name="app/Http/Controllers/SettingsController.php" />
<file name="app/Http/Controllers/Api/ApiContactController.php" />
<file name="app/Http/Controllers/Contacts/RelationshipsController.php" />
</errorLevel>
</UndefinedMagicMethod>
<InvalidReturnType>
<errorLevel type="suppress">
<file name="app/Http/Controllers/Auth/RegisterController.php" />
<file name="app/Services/Account/Activity/ActivityType/CreateActivityType.php" />
<file name="app/Services/Account/Activity/ActivityTypeCategory/CreateActivityTypeCategory.php" />
<file name="app/Services/Account/LifeEvent/LifeEventType/CreateLifeEventType.php" />
<file name="app/Services/Contact/LifeEvent/CreateLifeEvent.php" />
</errorLevel>
</InvalidReturnType>
<PossibleRawObjectIteration>
<errorLevel type="suppress">
<file name="app/Helpers/AuditLogHelper.php" />
</errorLevel>
</PossibleRawObjectIteration>
<RawObjectIteration>
<errorLevel type="suppress">
<file name="app/Http/Controllers/Contacts/ContactAuditLogController.php" />
</errorLevel>
</RawObjectIteration>
<TooManyTemplateParams errorLevel="info" />
<NonInvariantDocblockPropertyType errorLevel="info" />
<InvalidScope>
<errorLevel type="suppress">
<file name="routes/console.php" />
</errorLevel>
</InvalidScope>
<ParamNameMismatch>
<errorLevel type="suppress">
<file name="app/Http/Controllers/DAV/Backend/CardDAV/AddressBookRoot.php" />
</errorLevel>
</ParamNameMismatch>
</issueHandlers>
</psalm>
@@ -14,7 +14,7 @@
<notifications group="dav" position="top middle" :duration="5000" width="400" />
<div class="form-group">
<label for="dav_url_base">
{{ $t('settings.dav_url_base') }}
+1
View File
@@ -18,6 +18,7 @@ use Illuminate\Support\Facades\Artisan;
Artisan::command('memcached:stats', function () {
if (config('cache.default') === 'memcached') {
/** @var \Illuminate\Console\Command */
/** @psalm-suppress InvalidScope */
$command = $this;
$hostStats = Cache::getMemcached()->getStats();
foreach ($hostStats as $host => $stats) {
@@ -53,7 +53,7 @@ class ApiActivityTypeCategoryControllerTest extends ApiTestCase
$response->assertJsonFragment([
'total' => 10,
'current_page' => 1,
'per_page' => '1',
'per_page' => 1,
'last_page' => 10,
]);
@@ -62,7 +62,7 @@ class ApiActivityTypeCategoryControllerTest extends ApiTestCase
$response->assertJsonFragment([
'total' => 10,
'current_page' => 1,
'per_page' => '2',
'per_page' => 2,
'last_page' => 5,
]);
}
@@ -66,7 +66,7 @@ class ApiActivityTypeControllerTest extends ApiTestCase
$response->assertJsonFragment([
'total' => 10,
'current_page' => 1,
'per_page' => '1',
'per_page' => 1,
'last_page' => 10,
]);
@@ -75,7 +75,7 @@ class ApiActivityTypeControllerTest extends ApiTestCase
$response->assertJsonFragment([
'total' => 10,
'current_page' => 1,
'per_page' => '2',
'per_page' => 2,
'last_page' => 5,
]);
}
@@ -55,7 +55,7 @@ class ApiCompanyControllerTest extends ApiTestCase
$response->assertJsonFragment([
'total' => 10,
'current_page' => 1,
'per_page' => '1',
'per_page' => 1,
'last_page' => 10,
]);
@@ -64,7 +64,7 @@ class ApiCompanyControllerTest extends ApiTestCase
$response->assertJsonFragment([
'total' => 10,
'current_page' => 1,
'per_page' => '2',
'per_page' => 2,
'last_page' => 5,
]);
}
@@ -54,7 +54,7 @@ class ApiGenderControllerTest extends ApiTestCase
$response->assertJsonFragment([
'total' => 10,
'current_page' => 1,
'per_page' => '1',
'per_page' => 1,
'last_page' => 10,
]);
@@ -63,7 +63,7 @@ class ApiGenderControllerTest extends ApiTestCase
$response->assertJsonFragment([
'total' => 10,
'current_page' => 1,
'per_page' => '2',
'per_page' => 2,
'last_page' => 5,
]);
}
+2 -2
View File
@@ -57,7 +57,7 @@ class ApiPlaceControllerTest extends ApiTestCase
$response->assertJsonFragment([
'total' => 10,
'current_page' => 1,
'per_page' => '1',
'per_page' => 1,
'last_page' => 10,
]);
@@ -66,7 +66,7 @@ class ApiPlaceControllerTest extends ApiTestCase
$response->assertJsonFragment([
'total' => 10,
'current_page' => 1,
'per_page' => '2',
'per_page' => 2,
'last_page' => 5,
]);
}
+1 -1
View File
@@ -399,7 +399,7 @@ class ApiTagControllerTest extends ApiTestCase
$response->assertJsonFragment([
'total' => 3,
'current_page' => 1,
'per_page' => '1',
'per_page' => 1,
'last_page' => 3,
]);
}
@@ -80,7 +80,7 @@ class ApiAdressesControllerTest extends ApiTestCase
$response->assertJsonFragment([
'total' => 20,
'current_page' => 1,
'per_page' => '1',
'per_page' => 1,
'last_page' => 20,
]);
@@ -91,7 +91,7 @@ class ApiAdressesControllerTest extends ApiTestCase
$response->assertJsonFragment([
'total' => 20,
'current_page' => 1,
'per_page' => '2',
'per_page' => 2,
'last_page' => 10,
]);
}
@@ -305,7 +305,7 @@ class ApiContactControllerTest extends ApiTestCase
$response->assertJsonFragment([
'total' => 10,
'current_page' => 1,
'per_page' => '1',
'per_page' => 1,
'last_page' => 10,
]);
@@ -318,7 +318,7 @@ class ApiContactControllerTest extends ApiTestCase
$response->assertJsonFragment([
'total' => 10,
'current_page' => 1,
'per_page' => '2',
'per_page' => 2,
'last_page' => 5,
]);
}
@@ -380,7 +380,7 @@ class ApiContactControllerTest extends ApiTestCase
'first_name' => 'roger',
'total' => 2,
'query' => 'ro',
'per_page' => '1',
'per_page' => 1,
'current_page' => 1,
]);
}
@@ -412,7 +412,7 @@ class ApiContactControllerTest extends ApiTestCase
'first_name' => 'roger',
'total' => 2,
'query' => 'ro',
'per_page' => '1',
'per_page' => 1,
'current_page' => 2,
]);
}
@@ -94,7 +94,7 @@ class ApiConversationControllerTest extends ApiTestCase
$response->assertJsonFragment([
'total' => 10,
'current_page' => 1,
'per_page' => '1',
'per_page' => 1,
'last_page' => 10,
]);
@@ -103,7 +103,7 @@ class ApiConversationControllerTest extends ApiTestCase
$response->assertJsonFragment([
'total' => 10,
'current_page' => 1,
'per_page' => '2',
'per_page' => 2,
'last_page' => 5,
]);
}
@@ -92,7 +92,7 @@ class ApiDocumentControllerTest extends ApiTestCase
$response->assertJsonFragment([
'total' => 10,
'current_page' => 1,
'per_page' => '1',
'per_page' => 1,
'last_page' => 10,
]);
@@ -101,7 +101,7 @@ class ApiDocumentControllerTest extends ApiTestCase
$response->assertJsonFragment([
'total' => 10,
'current_page' => 1,
'per_page' => '2',
'per_page' => 2,
'last_page' => 5,
]);
}
@@ -98,7 +98,7 @@ class ApiLifeEventControllerTest extends ApiTestCase
$response->assertJsonFragment([
'total' => 10,
'current_page' => 1,
'per_page' => '1',
'per_page' => 1,
'last_page' => 10,
]);
@@ -107,7 +107,7 @@ class ApiLifeEventControllerTest extends ApiTestCase
$response->assertJsonFragment([
'total' => 10,
'current_page' => 1,
'per_page' => '2',
'per_page' => 2,
'last_page' => 5,
]);
}
@@ -62,7 +62,7 @@ class ApiOccupationControllerTest extends ApiTestCase
$response->assertJsonFragment([
'total' => 10,
'current_page' => 1,
'per_page' => '1',
'per_page' => 1,
'last_page' => 10,
]);
@@ -71,7 +71,7 @@ class ApiOccupationControllerTest extends ApiTestCase
$response->assertJsonFragment([
'total' => 10,
'current_page' => 1,
'per_page' => '2',
'per_page' => 2,
'last_page' => 5,
]);
}
+3 -2
View File
@@ -41,6 +41,7 @@ class ApiPhotoControllerTest extends ApiTestCase
$photo = factory(Photo::class)->create([
'account_id' => $user->account_id,
]);
UploadedFile::fake()->image('file.jpg')->storeAs('', 'file.jpg');
$contact->photos()->syncWithoutDetaching([$photo->id]);
@@ -91,7 +92,7 @@ class ApiPhotoControllerTest extends ApiTestCase
$response->assertJsonFragment([
'total' => 10,
'current_page' => 1,
'per_page' => '1',
'per_page' => 1,
'last_page' => 10,
]);
@@ -100,7 +101,7 @@ class ApiPhotoControllerTest extends ApiTestCase
$response->assertJsonFragment([
'total' => 10,
'current_page' => 1,
'per_page' => '2',
'per_page' => 2,
'last_page' => 5,
]);
}
+2 -2
View File
@@ -6,6 +6,7 @@ use Tests\ApiTestCase;
use Illuminate\Support\Str;
use App\Models\Account\Photo;
use App\Models\Contact\Contact;
use Illuminate\Http\UploadedFile;
use Sabre\VObject\PHPUnitAssertions;
use Intervention\Image\Facades\Image;
use Illuminate\Support\Facades\Storage;
@@ -97,12 +98,11 @@ class VCardContactTest extends ApiTestCase
*/
public function test_carddav_put_one_contact_with_photo_already_set()
{
Storage::fake();
$user = $this->signin();
$photo = factory(Photo::class)->create([
'account_id' => $user->account_id,
]);
UploadedFile::fake()->image('file.jpg')->storeAs('', 'file.jpg');
$contact = factory(Contact::class)->create([
'account_id' => $user->account_id,
'avatar_source' => 'photo',
@@ -68,7 +68,7 @@ class ApiAuditLogControllerTest extends ApiTestCase
$response->assertJsonFragment([
'total' => 10,
'per_page' => '1',
'per_page' => 1,
'current_page' => 2,
]);
}
+14 -14
View File
@@ -148,7 +148,7 @@ class AccountSubscriptionTest extends FeatureTestCase
factory(Subscription::class)->create([
'account_id' => $user->account_id,
'name' => 'Annual',
'stripe_plan' => 'annual',
'stripe_price' => 'annual',
'stripe_id' => 'test',
'quantity' => 1,
]);
@@ -163,7 +163,7 @@ class AccountSubscriptionTest extends FeatureTestCase
factory(Subscription::class)->create([
'account_id' => $user->account_id,
'name' => 'Annual',
'stripe_plan' => 'annual',
'stripe_price' => 'annual',
'stripe_id' => 'test',
'quantity' => 1,
]);
@@ -179,7 +179,7 @@ class AccountSubscriptionTest extends FeatureTestCase
factory(Subscription::class)->create([
'account_id' => $user->account_id,
'name' => 'Annual',
'stripe_plan' => 'annual',
'stripe_price' => 'annual',
'stripe_id' => 'sub_X',
'quantity' => 1,
]);
@@ -212,19 +212,19 @@ class AccountSubscriptionTest extends FeatureTestCase
$response->assertRedirect('/settings/subscriptions/upgrade/success');
}
public function test_it_subscribe_with_2nd_auth()
{
$user = $this->signin();
$user->email = 'test_it_subscribe_with_2nd_auth@monica-test.com';
$user->save();
// public function test_it_subscribe_with_2nd_auth()
// {
// $user = $this->signin();
// $user->email = 'test_it_subscribe_with_2nd_auth@monica-test.com';
// $user->save();
$response = $this->followingRedirects()->post('/settings/subscriptions/processPayment', [
'payment_method' => 'pm_card_threeDSecure2Required',
'plan' => 'annual',
]);
// $response = $this->followingRedirects()->post('/settings/subscriptions/processPayment', [
// 'payment_method' => 'pm_card_threeDSecure2Required',
// 'plan' => 'annual',
// ]);
$response->assertSee('Extra confirmation is needed to process your payment.');
}
// $response->assertSee('Extra confirmation is needed to process your payment.');
// }
public function test_it_subscribe_with_error()
{
-1
View File
@@ -245,7 +245,6 @@ class ActivityTest extends FeatureTestCase
$response->assertStatus(422);
$response->assertJson([
'message' => 'The given data was invalid.',
'errors' => [
'summary' => ['The summary field is required.'],
'happened_at' => ['The happened at field is required.'],
+2 -2
View File
@@ -508,8 +508,8 @@ class ContactTest extends FeatureTestCase
'number_of_views' => 0,
]);
$response = $this->get('/people/'.$contact->hashID());
$response = $this->get('/people/'.$contact->hashID());
$this->get('/people/'.$contact->hashID());
$this->get('/people/'.$contact->hashID());
$this->assertDatabaseHas('contacts', [
'number_of_views' => 2,
-1
View File
@@ -42,7 +42,6 @@ class MeTest extends FeatureTestCase
$response->assertStatus(422);
$response->assertJson([
'message' => 'The given data was invalid.',
'errors' => [
'contact_id' => ['The contact id field is required.'],
],
+17 -37
View File
@@ -5,6 +5,7 @@ namespace Tests\Feature;
use Carbon\Carbon;
use Tests\FeatureTestCase;
use App\Models\Account\Photo;
use App\Helpers\StorageHelper;
use App\Models\Contact\Contact;
use App\Models\Contact\Document;
use Illuminate\Http\Testing\File;
@@ -291,16 +292,12 @@ class StorageControllerTest extends FeatureTestCase
public function storeImage(Contact $contact)
{
$disk = Storage::fake('local', [
'cache' => [
'store' => 'file',
'expire' => 600,
'prefix' => 'local',
],
]);
Storage::fake('local');
$image = File::createWithContent('avatar.png', file_get_contents(base_path('public/img/favicon.png')));
$file = $disk->put('/photos', $image, 'private');
$file = Storage::putFile('/photos', $image, [
'disk' => 'local',
]);
$photo = factory(Photo::class)->create([
'account_id' => $contact->account_id,
@@ -312,63 +309,46 @@ class StorageControllerTest extends FeatureTestCase
$contact->photos()->syncWithoutDetaching([$photo->id]);
$adapter = $disk->getDriver()->getAdapter();
$adapter->getCache()->updateObject($file, [
'timestamp' => Carbon::create(2021, 6, 19, 7, 0, 0, 'UTC')->timestamp,
]);
touch(StorageHelper::disk('local')->path($file), Carbon::create(2021, 6, 19, 7, 0, 0, 'UTC')->timestamp);
return $file;
}
public function storeDocument(Contact $contact)
{
$disk = Storage::fake('local', [
'cache' => [
'store' => 'file',
'expire' => 600,
'prefix' => 'local',
],
]);
Storage::fake('local');
$image = File::createWithContent('file.png', file_get_contents(base_path('public/img/favicon.png')));
$file = $disk->put('/documents', $image, 'private');
$file = Storage::putFile('/documents', $image, [
'disk' => 'local',
]);
$document = factory(Document::class)->create([
factory(Document::class)->create([
'account_id' => $contact->account_id,
'contact_id' => $contact->id,
'original_filename' => 'file.png',
'new_filename' => $file,
]);
$adapter = $disk->getDriver()->getAdapter();
$adapter->getCache()->updateObject($file, [
'timestamp' => Carbon::create(2021, 6, 19, 7, 0, 0, 'UTC')->timestamp,
]);
touch(StorageHelper::disk('local')->path($file), Carbon::create(2021, 6, 19, 7, 0, 0, 'UTC')->timestamp);
return $file;
}
public function storeAvatar(Contact $contact)
{
$disk = Storage::fake('local', [
'cache' => [
'store' => 'file',
'expire' => 600,
'prefix' => 'local',
],
]);
$disk = Storage::fake('local');
$image = File::createWithContent('avatar.png', file_get_contents(base_path('public/img/favicon.png')));
$file = $disk->put('/avatars', $image, 'private');
$file = Storage::putFile('/avatars', $image, [
'disk' => 'local',
]);
$contact->avatar_source = 'default';
$contact->avatar_default_url = $file.'?123';
$contact->save();
$adapter = $disk->getDriver()->getAdapter();
$adapter->getCache()->updateObject($file, [
'timestamp' => Carbon::create(2021, 6, 19, 7, 0, 0, 'UTC')->timestamp,
]);
touch(StorageHelper::disk('local')->path($file), Carbon::create(2021, 6, 19, 7, 0, 0, 'UTC')->timestamp);
return $file;
}
+5 -5
View File
@@ -292,7 +292,7 @@ class AccountTest extends FeatureTestCase
$plan = factory(\Laravel\Cashier\Subscription::class)->create([
'account_id' => $account->id,
'stripe_plan' => 'chandler_5',
'stripe_price' => 'chandler_5',
'stripe_id' => 'sub_C0R444pbxddhW7',
'name' => 'fakePlan',
]);
@@ -312,7 +312,7 @@ class AccountTest extends FeatureTestCase
$plan = factory(\Laravel\Cashier\Subscription::class)->create([
'account_id' => $account->id,
'stripe_plan' => 'chandler_annual',
'stripe_price' => 'chandler_annual',
'stripe_id' => 'sub_C0R444pbxddhW7',
'name' => 'annualPlan',
]);
@@ -343,7 +343,7 @@ class AccountTest extends FeatureTestCase
$plan = factory(\Laravel\Cashier\Subscription::class)->create([
'account_id' => $account->id,
'stripe_plan' => 'chandler_5',
'stripe_price' => 'chandler_5',
'stripe_id' => 'sub_C0R444pbxddhW7',
'name' => 'fakePlan',
]);
@@ -373,7 +373,7 @@ class AccountTest extends FeatureTestCase
$plan = factory(\Laravel\Cashier\Subscription::class)->create([
'account_id' => $account->id,
'stripe_plan' => 'chandler_5',
'stripe_price' => 'chandler_5',
'stripe_id' => 'sub_C0R444pbxddhW7',
'name' => 'fakePlan',
]);
@@ -398,7 +398,7 @@ class AccountTest extends FeatureTestCase
$plan = factory(\Laravel\Cashier\Subscription::class)->create([
'account_id' => $account->id,
'stripe_plan' => 'chandler_5',
'stripe_price' => 'chandler_5',
'stripe_id' => 'sub_C0R444pbxddhW7',
'name' => 'fakePlan',
]);
+3 -16
View File
@@ -150,7 +150,9 @@ END:VCARD
/** @test */
public function it_throws_an_exception_if_file_doesnt_exist()
{
Storage::fake('public');
Storage::fake('public', [
'throw' => true,
]);
$importJob = factory(ImportJob::class)->create([
'filename' => 'testfile.vcf',
]);
@@ -181,21 +183,6 @@ END:VCARD
Storage::disk('public')->assertMissing($importJob->filename);
}
/** @test */
public function it_throws_an_exception_if_file_cant_be_deleted()
{
Storage::fake('public');
$importJob = factory(ImportJob::class)->create([
'filename' => 'testfile.vcf',
]);
$this->invokePrivateMethod($importJob, 'deletePhysicalFile');
$this->assertEquals(
trans('settings.import_vcard_file_not_found'),
$importJob->failed_reason
);
}
/** @test */
public function it_calculates_how_many_entries_there_are_and_populate_the_entries_array()
{