Bug fix
- Surface the localized "network already connected" message on the
Facebook/Instagram/InstagramFacebook/LinkedInPage/Threads/YouTube OAuth
callbacks: catch NetworkAlreadyConnectedException before the generic catch
so the conflict no longer falls through to a generic error + Log::error.
Scope / dead code
- Remove the orphaned BillingController::checkout() + app.billing.checkout route
(onboarding starts checkout directly); delete the now-dead DiscordWidget and
useFeatureAccess composable; prune orphaned i18n keys left by removing the
plan picker / upgrade dialog / count limits (billing.subscribe.*,
accounts.limit_reached, workspaces.limit_reached, common.discord.*).
- Drop the unused `plan` prop from the usage page and the unused `label` from
the onboarding persona payload (labels come from i18n); remove
Persona::options()/label().
Conventions
- declare(strict_types=1) on the two new migrations.
- Extract autofill validation into AutofillBrandRequest (FormRequest).
- Drop the unused $plan param from AccountPolicy::swapPlan.
- CreateUser: drop the stale config('cashier.trial_days', 7) fallback (now 8).
- Rename LimitEnforcementTest to InvitePermissionTest; use Pest mock() helper in
WorkspaceQuantitySyncTest; move shared test helpers into Pest.php.
- Memoize BillingCycle window() + subscription lookup.
47 lines
1.7 KiB
PHP
47 lines
1.7 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
use App\Models\Account;
|
|
use Laravel\Cashier\Subscription;
|
|
|
|
test('syncWorkspaceQuantity does not touch Stripe in self-hosted mode', function () {
|
|
config()->set('trypost.self_hosted', true);
|
|
|
|
$subscription = mock(Subscription::class);
|
|
$subscription->shouldReceive('active')->andReturnTrue();
|
|
$subscription->shouldReceive('updateQuantity')->never();
|
|
|
|
$account = mock(Account::class)->makePartial();
|
|
$account->shouldReceive('subscription')->with(Account::SUBSCRIPTION_NAME)->andReturn($subscription);
|
|
$account->shouldReceive('workspaces->count')->andReturn(3);
|
|
|
|
$account->syncWorkspaceQuantity();
|
|
});
|
|
|
|
test('syncWorkspaceQuantity does not touch Stripe without an active subscription', function () {
|
|
config()->set('trypost.self_hosted', false);
|
|
|
|
$subscription = mock(Subscription::class);
|
|
$subscription->shouldReceive('active')->andReturnFalse();
|
|
$subscription->shouldReceive('updateQuantity')->never();
|
|
|
|
$account = mock(Account::class)->makePartial();
|
|
$account->shouldReceive('subscription')->with(Account::SUBSCRIPTION_NAME)->andReturn($subscription);
|
|
|
|
$account->syncWorkspaceQuantity();
|
|
});
|
|
|
|
test('syncWorkspaceQuantity updates the subscription quantity to the workspace count', function () {
|
|
config()->set('trypost.self_hosted', false);
|
|
|
|
$subscription = mock(Subscription::class);
|
|
$subscription->shouldReceive('active')->andReturnTrue();
|
|
$subscription->shouldReceive('updateQuantity')->once()->with(3);
|
|
|
|
$account = mock(Account::class)->makePartial();
|
|
$account->shouldReceive('subscription')->with(Account::SUBSCRIPTION_NAME)->andReturn($subscription);
|
|
$account->shouldReceive('workspaces->count')->andReturn(3);
|
|
|
|
$account->syncWorkspaceQuantity();
|
|
});
|