extend(TestCase::class) ->use(RefreshDatabase::class) ->beforeEach(function () { // PortalScope-Context zwischen Tests zurücksetzen, damit statischer // State aus vorherigen Requests nicht in Volt-Tests durchschlägt. CurrentPortalContext::clear(); }) ->in('Feature'); /* |-------------------------------------------------------------------------- | Expectations |-------------------------------------------------------------------------- | | When you're writing tests, you often need to check that values meet certain conditions. The | "expect()" function gives you access to a set of "expectations" methods that you can use | to assert different things. Of course, you may extend the Expectation API at any time. | */ expect()->extend('toBeOne', function () { return $this->toBe(1); }); /* |-------------------------------------------------------------------------- | Functions |-------------------------------------------------------------------------- | | While Pest is very powerful out-of-the-box, you may have some testing code specific to your | project that you don't want to repeat in every file. Here you can also expose helpers as | global functions to help you to reduce the number of lines of code in your test files. | */ function something() { // .. } /** * Legt offline eine aktive Cashier-Abo-Zeile für den User an (kein * Stripe-Aufruf) und verknüpft sie über die Preis-ID mit dem Tarif — * `User::currentPlan()` löst darüber auf. */ function subscribeUserToPlan(User $user, Plan $plan, string $interval = 'monthly'): void { $priceId = $interval === 'yearly' ? $plan->stripe_price_id_yearly : $plan->stripe_price_id_monthly; $user->subscriptions()->create([ 'type' => 'default', 'stripe_id' => 'sub_test_'.fake()->unique()->randomNumber(6), 'stripe_status' => 'active', 'stripe_price' => $priceId, 'quantity' => 1, ]); } /** * Seiten-Cache-Keys tragen seit der Entfernung mit 410 eine Generations-Nummer * (siehe WebPageCache::key): Ein Flush erhöht sie und verwirft damit alle * `web.`-Seiten-Caches auf einmal. Die Tests prüfen weiterhin die fachliche * Key-Struktur, nur eben generationsunabhängig. */ function webPageCacheKey(string $key): string { return 'web.g'.WebPageCache::generation().'.'.substr($key, strlen('web.')); } /** * Kunde (Rolle customer, Owner einer Presseecho-Firma) mit Kontakt, Kategorie * und einer Entwurfs-PM. Gemeinsam genutzt von den Phase-8a-/8i-Tests und dem * Widerrufsverzicht-Test — deshalb hier und nicht in einer einzelnen Testdatei, * sonst scheitern die Nutzer im Einzel- oder Parallellauf. * * @param array $prAttributes * @return array{customer: User, company: Company, contact: Contact, category: Category, pr: PressRelease} */ function makeCustomerForShowPhase8a(array $prAttributes = []): array { $customer = User::factory()->create(['is_active' => true]); $customer->assignRole('customer'); $company = Company::factory()->presseecho()->create(); $customer->companies()->attach($company->id, ['role' => 'owner']); $contact = Contact::factory()->for($company)->create([ 'portal' => $company->portal->value, ]); $category = Category::factory()->create(); $pr = PressRelease::factory()->create(array_merge([ 'user_id' => $customer->id, 'company_id' => $company->id, 'category_id' => $category->id, 'portal' => $company->portal->value, 'status' => 'draft', ], $prAttributes)); $pr->contacts()->sync([$contact->id]); return compact('customer', 'company', 'contact', 'category', 'pr'); }