create(); $instance = Instance::factory()->create([ 'customer_id' => $customer->id, 'host_id' => Host::factory()->active()->create()->id, 'plan' => $plan, 'status' => 'active', ]); Subscription::factory()->plan($plan, $term)->create([ 'customer_id' => $customer->id, 'instance_id' => $instance->id, ]); return $customer; } /** The console row for one customer — the factories leave others lying around. */ function mrrOf(Customer $customer): string { $admin = User::factory()->operator()->create(); $rows = Livewire::actingAs($admin)->test(Customers::class)->viewData('rows'); return collect($rows)->firstWhere('uuid', $customer->uuid)['mrr']; } it('reports a yearly contract as what it costs per month', function () { $customer = customerOnPlan('team', 'yearly'); // The contract stores 12 × 179 €. Reporting that in a monthly column would // show this customer as worth twelve times what they are. expect(mrrOf($customer))->toContain('179') ->and(mrrOf($customer))->not->toContain('2.148'); }); it('reports what a grandfathered customer pays, not today\'s price', function () { $customer = customerOnPlan('team'); Subscription::query()->where('customer_id', $customer->id)->update(['price_cents' => 9900]); expect(mrrOf($customer))->toContain('99,00'); }); it('shows a yearly customer their monthly rate on the portal too', function () { $customer = customerOnPlan('team', 'yearly'); $user = User::factory()->create(['email' => $customer->email]); // Both pages label the figure per month, and the contract holds a year. $card = Livewire::actingAs($user)->test(App\Livewire\Billing::class)->viewData('current'); $cloud = Livewire::actingAs($user)->test(App\Livewire\Cloud::class)->viewData('instance'); expect($card['price_cents'])->toBe(17900) ->and($cloud['plan'])->toContain('179'); }); it('keeps customers on a withdrawn plan in the distribution', function () { customerOnPlan('team'); PlanFamily::query()->where('key', 'team')->update(['sales_enabled' => false]); $admin = User::factory()->operator()->create(); $chart = Livewire::actingAs($admin)->test(Customers::class)->viewData('plansChart'); // They are still running, still paying, and still ours to count. expect($chart['data']['labels'])->toContain(__('billing.plan.team')); });