feat: auth with google
This commit is contained in:
@@ -71,7 +71,6 @@ class AuthenticateSocialUser
|
|||||||
->first();
|
->first();
|
||||||
|
|
||||||
if (! $user) {
|
if (! $user) {
|
||||||
abort_if($data['intent'] !== 'register', 422, 'SOCIAL_ACCOUNT_NOT_FOUND');
|
|
||||||
abort_if(($data['termsAccepted'] ?? false) !== true, 422, 'TERMS_ACCEPTANCE_REQUIRED');
|
abort_if(($data['termsAccepted'] ?? false) !== true, 422, 'TERMS_ACCEPTANCE_REQUIRED');
|
||||||
|
|
||||||
$user = User::create([
|
$user = User::create([
|
||||||
|
|||||||
@@ -215,20 +215,31 @@ it('requires an authorization code for Apple authentication', function () {
|
|||||||
->assertJsonValidationErrors('authorizationCode');
|
->assertJsonValidationErrors('authorizationCode');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('does not create an unknown account from the login intent', function () {
|
it('creates an unknown account from the login intent', function () {
|
||||||
bindResolvedSocialIdentity([
|
bindResolvedSocialIdentity([
|
||||||
'id' => 'unknown-google-user',
|
'id' => 'unknown-google-user',
|
||||||
|
'name' => 'Unknown Google User',
|
||||||
'email' => 'unknown@example.com',
|
'email' => 'unknown@example.com',
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$this->postJson('/api/auth/mobile/social', socialLoginPayload([
|
$this->postJson('/api/auth/mobile/social', socialLoginPayload([
|
||||||
'intent' => 'login',
|
'intent' => 'login',
|
||||||
'termsAccepted' => false,
|
'termsAccepted' => true,
|
||||||
]))
|
]))
|
||||||
->assertUnprocessable()
|
->assertOk()
|
||||||
->assertJsonPath('code', 'SOCIAL_ACCOUNT_NOT_FOUND');
|
->assertJsonPath('user.name', 'unknown.google.user')
|
||||||
|
->assertJsonStructure(['token']);
|
||||||
|
|
||||||
expect(User::count())->toBe(0);
|
$user = User::query()->where('email', 'unknown@example.com')->firstOrFail();
|
||||||
|
|
||||||
|
expect($user->terms_accepted_at)->not->toBeNull()
|
||||||
|
->and($user->socialAccounts)->toHaveCount(1);
|
||||||
|
|
||||||
|
$this->assertDatabaseHas('social_accounts', [
|
||||||
|
'provider' => SocialProvider::Google->value,
|
||||||
|
'provider_user_id' => 'unknown-google-user',
|
||||||
|
'user_id' => $user->getKey(),
|
||||||
|
]);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('requires terms acceptance before creating a social account', function () {
|
it('requires terms acceptance before creating a social account', function () {
|
||||||
@@ -238,6 +249,7 @@ it('requires terms acceptance before creating a social account', function () {
|
|||||||
]);
|
]);
|
||||||
|
|
||||||
$this->postJson('/api/auth/mobile/social', socialLoginPayload([
|
$this->postJson('/api/auth/mobile/social', socialLoginPayload([
|
||||||
|
'intent' => 'login',
|
||||||
'termsAccepted' => false,
|
'termsAccepted' => false,
|
||||||
]))
|
]))
|
||||||
->assertUnprocessable()
|
->assertUnprocessable()
|
||||||
@@ -246,6 +258,32 @@ it('requires terms acceptance before creating a social account', function () {
|
|||||||
expect(User::count())->toBe(0);
|
expect(User::count())->toBe(0);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('generates a unique username when the Google name is already taken', function () {
|
||||||
|
User::factory()->create([
|
||||||
|
'name' => 'camille.martin',
|
||||||
|
'email' => 'existing-name@example.com',
|
||||||
|
]);
|
||||||
|
|
||||||
|
bindResolvedSocialIdentity([
|
||||||
|
'id' => 'google-duplicate-name',
|
||||||
|
'name' => 'Camille Martin',
|
||||||
|
'email' => 'new-camille@example.com',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$response = $this->postJson('/api/auth/mobile/social', socialLoginPayload([
|
||||||
|
'intent' => 'login',
|
||||||
|
'termsAccepted' => true,
|
||||||
|
]));
|
||||||
|
|
||||||
|
$response->assertOk();
|
||||||
|
|
||||||
|
$generatedName = $response->json('user.name');
|
||||||
|
|
||||||
|
expect($generatedName)
|
||||||
|
->not->toBe('camille.martin')
|
||||||
|
->toStartWith('camille.martin-');
|
||||||
|
});
|
||||||
|
|
||||||
it('rejects an identity whose provider email is not verified', function () {
|
it('rejects an identity whose provider email is not verified', function () {
|
||||||
bindResolvedSocialIdentity([
|
bindResolvedSocialIdentity([
|
||||||
'id' => 'unverified-google-user',
|
'id' => 'unverified-google-user',
|
||||||
|
|||||||
Reference in New Issue
Block a user