headers->get('Location'); $location = $redirect ?? $response->headers->get('X-Inertia-Location'); return $location ?? ''; } public function test_registration_creates_user_and_tenant(): void { $freePackage = Package::factory()->create(['price' => 0]); $response = $this->post(route('register.store'), [ 'username' => 'testuser', 'email' => 'test@example.com', 'password' => 'Password123!', 'password_confirmation' => 'Password123!', 'first_name' => 'Test', 'last_name' => 'User', 'address' => 'Test Address', 'phone' => '123456789', 'privacy_consent' => true, 'package_id' => $freePackage->id, ]); $location = $this->captureLocation($response); $expected = route('verification.notice', absolute: false); $this->assertNotEmpty($location); $this->assertTrue($location === $expected || Str::endsWith($location, $expected)); $this->assertDatabaseHas('users', [ 'username' => 'testuser', 'email' => 'test@example.com', 'first_name' => 'Test', 'last_name' => 'User', 'address' => 'Test Address', 'phone' => '123456789', 'role' => 'tenant_admin', ]); $user = User::where('email', 'test@example.com')->first(); $this->assertNotNull($user->tenant); $this->assertDatabaseHas('tenants', [ 'user_id' => $user->id, 'name' => 'Test User', ]); $this->assertDatabaseHas('tenant_packages', [ 'tenant_id' => $user->tenant->id, 'package_id' => $freePackage->id, ]); } public function test_registration_without_package_assigns_tenant_only(): void { $response = $this->post(route('register.store'), [ 'username' => 'testuser2', 'email' => 'test2@example.com', 'password' => 'Password123!', 'password_confirmation' => 'Password123!', 'first_name' => 'Test', 'last_name' => 'User', 'address' => 'Test Address', 'phone' => '123456789', 'privacy_consent' => true, ]); $location = $this->captureLocation($response); $expected = route('verification.notice', absolute: false); $this->assertNotEmpty($location); $this->assertTrue($location === $expected || Str::endsWith($location, $expected)); $user = User::where('email', 'test2@example.com')->first(); $this->assertNotNull($user->tenant); $this->assertDatabaseHas('users', [ 'email' => 'test2@example.com', 'role' => 'user', ]); $this->assertDatabaseMissing('tenant_packages', [ 'tenant_id' => $user->tenant->id, ]); } public function test_registration_validation_fails(): void { $response = $this->post(route('register.store'), [ 'username' => '', 'email' => 'invalid', 'password' => 'short', 'password_confirmation' => 'different', 'first_name' => '', 'last_name' => '', 'address' => '', 'phone' => '', 'privacy_consent' => false, ]); $response->assertSessionHasErrors([ 'username', 'email', 'password', 'first_name', 'last_name', 'address', 'phone', 'privacy_consent', ]); } public function test_registration_with_paid_package_redirects_to_checkout_flow(): void { $paidPackage = Package::factory()->create(['price' => 10.00]); $response = $this->post(route('register.store'), [ 'username' => 'paiduser', 'email' => 'paid@example.com', 'password' => 'Password123!', 'password_confirmation' => 'Password123!', 'first_name' => 'Paid', 'last_name' => 'User', 'address' => 'Paid Address', 'phone' => '123456789', 'privacy_consent' => true, 'package_id' => $paidPackage->id, ]); $response->assertRedirect(route('buy.packages', [ 'locale' => 'de', 'packageId' => $paidPackage->id, ])); $this->assertDatabaseHas('users', [ 'username' => 'paiduser', 'email' => 'paid@example.com', 'role' => 'user', ]); } public function test_registered_event_sends_welcome_email(): void { Mail::fake(); $freePackage = Package::factory()->create(['price' => 0]); $this->post(route('register.store'), [ 'username' => 'testuser3', 'email' => 'test3@example.com', 'password' => 'Password123!', 'password_confirmation' => 'Password123!', 'first_name' => 'Test', 'last_name' => 'User', 'address' => 'Test Address', 'phone' => '123456789', 'privacy_consent' => true, 'package_id' => $freePackage->id, ]); Mail::assertSent(Welcome::class, function ($mail) { return $mail->hasTo('test3@example.com'); }); } }