create(); $provider = Mockery::mock(SocialiteProvider::class); $provider->shouldReceive('scopes')->andReturnSelf(); $provider->shouldReceive('fields')->andReturnSelf(); $provider->shouldReceive('redirect')->once()->andReturn(redirect('/facebook/auth')); $this->mock(SocialiteFactory::class, function ($mock) use ($provider) { $mock->shouldReceive('driver')->with('facebook')->andReturn($provider); }); $response = $this->get('/checkout/auth/facebook?package_id='.$package->id.'&locale=de'); $response->assertRedirect('/facebook/auth'); $this->assertSame($package->id, session('checkout_facebook_payload.package_id')); } public function test_callback_logs_in_existing_user_and_attaches_tenant(): void { $package = Package::factory()->create(['price' => 0]); $existingUser = User::factory()->create([ 'email' => 'checkout-facebook@example.com', 'pending_purchase' => false, ]); $facebookUser = Mockery::mock(SocialiteUserContract::class); $facebookUser->shouldReceive('getEmail')->andReturn('checkout-facebook@example.com'); $facebookUser->shouldReceive('getName')->andReturn('Checkout Facebook'); $facebookUser->shouldReceive('getAvatar')->andReturn(null); $facebookUser->shouldReceive('getRaw')->andReturn([]); $provider = Mockery::mock(SocialiteProvider::class); $provider->shouldReceive('user')->andReturn($facebookUser); $this->mock(SocialiteFactory::class, function ($mock) use ($provider) { $mock->shouldReceive('driver')->with('facebook')->andReturn($provider); }); $response = $this ->withSession([ 'checkout_facebook_payload' => ['package_id' => $package->id, 'locale' => 'de'], ]) ->get('/checkout/auth/facebook/callback'); $response->assertRedirect(CheckoutRoutes::wizardUrl($package->id, 'de')); $this->assertAuthenticatedAs($existingUser); $user = auth()->user(); $this->assertSame('checkout-facebook@example.com', $user->email); $this->assertTrue($user->pending_purchase); $this->assertNotNull($user->tenant); $this->assertDatabaseHas('tenant_packages', [ 'tenant_id' => $user->tenant_id, 'package_id' => $package->id, ]); } public function test_callback_with_missing_email_flashes_error(): void { $package = Package::factory()->create(); $facebookUser = Mockery::mock(SocialiteUserContract::class); $facebookUser->shouldReceive('getEmail')->andReturn(null); $facebookUser->shouldReceive('getName')->andReturn('No Email'); $facebookUser->shouldReceive('getAvatar')->andReturn(null); $facebookUser->shouldReceive('getRaw')->andReturn([]); $provider = Mockery::mock(SocialiteProvider::class); $provider->shouldReceive('user')->andReturn($facebookUser); $this->mock(SocialiteFactory::class, function ($mock) use ($provider) { $mock->shouldReceive('driver')->with('facebook')->andReturn($provider); }); $response = $this ->withSession([ 'checkout_facebook_payload' => ['package_id' => $package->id, 'locale' => 'en'], ]) ->get('/checkout/auth/facebook/callback'); $response->assertRedirect(CheckoutRoutes::wizardUrl($package->id, 'en')); $response->assertSessionHas('checkout_facebook_error'); $this->assertGuest(); } }