Jak otestovat Laravel Socialite

Úvod Přihlášení pomocí sociálních sítí je jedním z nejpohodlnějších způsobů, jak mohou uživatelé přistupovat k vaší aplikaci. Laravel to usnadňuje pomocí Laravel Socialite, balíče...

Světlý režim slouží jen pro ukázku funkcionality. Proto používejte tmavou verzi webu.

22. 07. 2025

Jak otestovat Laravel Socialite

Úvod

Přihlášení pomocí sociálních sítí je jedním z nejpohodlnějších způsobů, jak mohou uživatelé přistupovat k vaší aplikaci. Laravel to usnadňuje pomocí Laravel Socialite, balíček první strany, který abstrahuje od složitostí protokolu OAuth.

V tomto příspěvku si ukážeme skutečnou implementaci řadiče Socialite a hlavně, demystifikovat testy za ním. Testování ověřování třetí stranou se může zdát složité, ale s pomocí mockingu a chytrých tvrzení je naprosto proveditelné.

Společenský kontrolor: Přehled

Zde je aktuální SocialiteController třídy, kterou testujeme:

<?php
 
declare(strict_types=1);
 
namespace App\Http\Controllers\Auth;
 
use App\Models\User;
use Illuminate\Auth\Events\Verified;
use Illuminate\Database\UniqueConstraintViolationException;
use Illuminate\Http\RedirectResponse;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Str;
use Illuminate\Validation\ValidationException;
use Laravel\Socialite\Facades\Socialite;
 
class SocialiteController
{
// route: /auth/{provider}/redirect
public function redirect(string $provider): RedirectResponse
{
$this->validate(compact('provider'));
 
return Socialite::driver($provider)->redirect();
}
 
// route: /auth/{provider}/callback
public function handleCallback(string $provider): RedirectResponse
{
$this->validate(compact('provider'));
 
$user = Socialite::driver($provider)->user();
 
try {
$user = User::updateOrCreate([
'provider' => $provider,
'provider_id' => $user->id,
], [
'name' => $user->name ?? $user->nickname ?? 'N/A',
'email' => $user->email,
'password' => Str::random(),
'avatar_url' => $user->avatar,
]);
} catch (UniqueConstraintViolationException $exception) {
throw ValidationException::withMessages([
'email' => 'This email is already taken.',
]);
}
 
if (! $user->hasVerifiedEmail()) {
$user->markEmailAsVerified();
event(new Verified($user));
}
 
Auth::login($user, true);
 
return redirect()->intended(route('dashboard'));
}
 
protected function validate(array $data): void
{
Validator::make($data, [
'provider' => ['required', 'string', 'in:github,google'],
])->validate();
}
}

Tento ovladač:

  • Přesměruje uživatele na zprostředkovatele OAuth.
  • Zpracovává zpětné volání, aktualizuje nebo vytváří uživatele
  • V případě potřeby zpracovává ověření e-mailu
  • Přihlášení uživatele

Nyní se podívejme, jak tuto logiku důkladně otestovat.

Sada testů ověřování Laravel Socialite

Zde je celý testovací soubor s podrobným vysvětlením pro každý případ:

<?php
 
declare(strict_types=1);
 
use App\Models\User;
use Illuminate\Auth\Events\Verified;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\Event;
use Illuminate\Support\Str;
use Laravel\Socialite\Contracts\Provider;
use Laravel\Socialite\Contracts\User as SocialiteUser;
use Laravel\Socialite\Facades\Socialite;
use Mockery\MockInterface;
 
// Test: Redirects to provider
 
test('redirects to auth provider', function () {
$this
->get(route('socialite.redirect', 'github'))
->assertValid()
->assertRedirect();
});
 
// Test: Invalid provider name fails validation
 
test('provider is invalid', function () {
$this
->get(route('socialite.redirect', Str::random()))
->assertInvalid(['provider']);
});
 
// Test: Handles callback and creates a new user
 
test('handles callback from auth provider and creates a user', function () {
$provider = Arr::random(['github', 'google']);
$user = User::factory()->unverified()->make();
 
Event::fake();
 
$socialiteUser = $this->mock(SocialiteUser::class, function (MockInterface $mock) use ($user) {
$mock->id = fake()->randomNumber(3);
$mock->name = $user->name;
$mock->email = $user->email;
$mock->avatar = $user->avatar_url;
});
 
$socialiteProvider = $this->mock(Provider::class, function (MockInterface $mock) use ($socialiteUser) {
$mock->shouldReceive('user')->andReturn($socialiteUser);
});
 
Socialite::shouldReceive('driver')->with($provider)->andReturn($socialiteProvider);
 
$this->assertDatabaseCount('users', 0);
 
$this
->get(route('socialite.callback', $provider))
->assertRedirect(route('dashboard'));
 
Event::assertDispatched(Verified::class);
 
$this
->assertAuthenticated()
->assertDatabaseCount('users', 1)
->assertDatabaseHas('users', [
'provider' => $provider,
'provider_id' => $socialiteUser->id,
'name' => $socialiteUser->name,
'email' => $socialiteUser->email,
'avatar_url' => $socialiteUser->avatar,
])
->assertTrue(User::firstWhere('email', $user->email)->hasVerifiedEmail());
});
 
// Test: Email already exists
 
test('user will not be created if already exists', function () {
$provider = Arr::random(['github', 'google']);
$user = User::factory()->create();
$this->assertDatabaseCount('users', 1);
 
$socialiteUser = $this->mock(SocialiteUser::class, function (MockInterface $mock) use ($user) {
$mock->id = fake()->randomNumber(3);
$mock->name = $user->name;
$mock->email = $user->email;
$mock->avatar = $user->avatar_url;
});
 
$socialiteProvider = $this->mock(Provider::class, function (MockInterface $mock) use ($socialiteUser) {
$mock->shouldReceive('user')->andReturn($socialiteUser);
});
 
Socialite::shouldReceive('driver')->with($provider)->andReturn($socialiteProvider);
 
$this
->get(route('socialite.callback', $provider))
->assertInvalid([
'email' => 'This email is already taken.',
]);
 
$this->assertDatabaseCount('users', 1);
});
 
// Test: Log in user if registered with the same provider
 
test('user will login and will not be created again if already registered with the same provider', function () {
$user = User::factory()->viaSocialite()->create();
$newName = fake()->name();
 
$socialiteUser = $this->mock(SocialiteUser::class, function (MockInterface $mock) use ($user, $newName) {
$mock->id = $user->provider_id;
$mock->name = $newName;
$mock->email = $user->email;
$mock->avatar = $user->avatar_url;
});
 
$socialiteProvider = $this->mock(Provider::class, function (MockInterface $mock) use ($socialiteUser) {
$mock->shouldReceive('user')->andReturn($socialiteUser);
});
 
Socialite::shouldReceive('driver')->with($user->provider)->andReturn($socialiteProvider);
 
$this->assertDatabaseCount('users', 1);
 
$this
->get(route('socialite.callback', $user->provider))
->assertRedirect(route('dashboard'));
 
$this
->assertAuthenticated()
->assertDatabaseCount('users', 1)
->assertDatabaseHas('users', [
'provider' => $user->provider,
'provider_id' => $socialiteUser->id,
'name' => $newName,
'email' => $socialiteUser->email,
'avatar_url' => $socialiteUser->avatar,
]);
});
 
// Test: Same email but different provider
 
test('user will not be created if already registered with another provider', function () {
$user = User::factory()->viaSocialite()->create();
$provider = collect(['google', 'github'])->diff([$user->provider])->random();
$this->assertDatabaseCount('users', 1);
 
$socialiteUser = $this->mock(SocialiteUser::class, function (MockInterface $mock) use ($user) {
$mock->id = fake()->randomNumber(3);
$mock->name = $user->name;
$mock->email = $user->email;
$mock->avatar = $user->avatar_url;
});
 
$socialiteProvider = $this->mock(Provider::class, function (MockInterface $mock) use ($socialiteUser) {
$mock->shouldReceive('user')->andReturn($socialiteUser);
});
 
Socialite::shouldReceive('driver')->with($provider)->andReturn($socialiteProvider);
 
$this
->get(route('socialite.callback', $provider))
->assertInvalid([
'email' => 'This email is already taken.',
]);
 
$this->assertDatabaseCount('users', 1);
});

Každý z těchto testů zahrnuje reálný scénář:

  • ✅ Šťastné cesty (úspěšné vytvoření, úspěšné přihlášení)
  • ❌ Cesty selhání (duplicitní e-mail z formuláře nebo neshodní poskytovatelé)
  • ✨ Vylepšení uživatelského prostředí (např. aktualizované informace o profilu)

Závěrečné myšlenky

Socialite usnadňuje přihlašování do sociálních sítí, ale bez řádného testování hrozí konflikty účtů, chybějící ověření a obtížně odstranitelné problémy s přihlašováním. Pomocí několika dobře vytvořených maket a tvrzení můžete simulovat celý tok a spolehlivě pokrýt okrajové případy.

Tipy pro testování Socialite:

  • Pomocí funkce Laravel mocking a fasád můžete simulovat služby třetích stran.
  • Ověřte pozitivní i negativní scénáře.
  • Nezapomeňte otestovat duplicitu e-mailů a neshody poskytovatelů.

Původní článek publikoval Nabil Hassen.

Mohlo by vám pomoct

Praktické věci kolem webu

Než se pustíte do webu, hodí se mít jasno v podkladech, WordPressu, cookies a měření.

Google reference

Co říkají klienti

Ukázky skutečných recenzí, které klienti zanechali na mém Google profilu.

Přejít na recenze
★ ★ ★ ★ ★

„Člověk, který své práci a rozumí a ví co dělá. Velmi rychlá komunikace a profesionální přístup. Doporučuji.“

Jaroslav Kupča
Google
★ ★ ★ ★ ★

„Skvělá spolupráce, při dalších projektech určitě nebudu shánět někoho jiného.“

Roman Koňařík
Google
★ ★ ★ ★ ★

„S panem Vančurou jsem spolupracovala na tvorbě mých webových stránek a jsem maximálně spokojená. Oceňuji profesionální přístup, rychlou komunikaci a schopnost přesně pochopit moje představy. Web je moderní, přehledný, funkční a skvěle vypadá i na mobilu. Celý proces proběhl hladce, s jasným vysvětlením jednotlivých kroků a výborným výsledkem. Určitě doporučuji každému, kdo hledá spolehlivý a kvalitní přístup.“

Barbora Zemánková
Google
★ ★ ★ ★ ★

„Spolupráce při tvorbě konfigurátoru proběhla naprosto bez problémů. Oceňuji profesionální přístup, rychlou komunikaci a schopnost pochopit specifický projekt od A do Z. Konfigurátor je přehledný, funkční a přesně odpovídá mým požadavkům. Rozhodně doporučuji.“

mareksevcik_FPV
Google
★ ★ ★ ★ ★

„Velmi dobrá a rychlá spolupráce. Doporučuji!“

Leoš Kaucký
Google
★ ★ ★ ★ ★

„Přesně takto si představujeme profesionální práci. Dekujeme“

STAVILLI
Google
★ ★ ★ ★ ★

„Ať už se jedná o optimalizaci webu, nebo tvorbu na míru oceňuji kromě profesionální práce a znalostí problematiky také férový přístup a komunikaci.“

Aleš Illický
Google
★ ★ ★ ★ ★

„Děkuji za profesionální spolupráci, vše dle domluvy, naprostá spokojenost a mohu jen vřele doporučit.... Při dalších projektech určitě opět využiji Vašich služeb“

Peter Spilak
Google
★ ★ ★ ★ ★

„Profesionalita a velká ochota, nemohu jinak než doporučit“

Magdalena Vašková
Google
★ ★ ★ ★ ★

„Skvělá zkušenost při tvorbě webu, profesionální přístup, rychlost, ochota pomoci“

Jana Kono
Google
★ ★ ★ ★ ★

„Rychlá spolupráce a komunikace – mohu jen doporučit.“

Gawix
Google
★ ★ ★ ★ ★

„Moc mi pomohl, když jsem potřebovala pomoc s webem. A bylo to gratis :)). Jsem mu neskonale vděčná.“

Radka Arbesová
Google
★ ★ ★ ★ ★

„Děkuji Jiřímu za rychlou a kvalitní spolupráci na tvorbě webu. Srozumitelná a ochotná komunikace mě vždycky potěší a přináší důvěru.“

Jiří Mařík
Google
★ ★ ★ ★ ★

„Jsem maximálně spokojená. Rychlost, ochota a cenově dostupné. Děkuji“

Veronika Černá
Google
★ ★ ★ ★ ★

„Naprostá spokojenost. Rychlá komunikace, skvělá cena a odborná pomoc. Moc děkuji :)“

Patricie Kučerová
Google
★ ★ ★ ★ ★

„Velká spokojenost, rychlost a p. Vančura moc dobře ví co dělá. :)“

Ondřej Daniško
Google
★ ★ ★ ★ ★

„dobrá práce, rychlá odezva“

Zuzana Jírová
Google
★ ★ ★ ★ ★

„S programátory mám zkušeností hodně, ale tady musím opravdu pochválit. Pro mě a mé přátele vytvořil skvělý nástroj na evidenci sbírek a opravdu se to povedlo. Bylo to hotové rychle, kvalitně a za skvělou cenu. Komunikace funguje velmi rychle, což je super a ne úplně standard. Díky za super práci, za mě 100% spokojenost!“

Zdeněk
Google
★ ★ ★ ★ ★

„Vše bylo rychlé a hlavně to funguje. Dobrá práce.“

Lukáš Bartášek
Google
★ ★ ★ ★ ★

„Normálně recenze nepíši, ale zde rád doporučím kvalitní práci. Jiří pro mě vytvořil web pro dětské tábory. Kvalitní práce, rychlá komunikace a vlastní nápady, které Jiří sám přidá, jsou na velice vysoké úrovni. Nemohu hodnotit jinak než 5/5.“

Tomáš Loněk
Google
★ ★ ★ ★ ★

„Pan Jiri nam delal jiz 3 webove stranky a vzdy velka spokojenost, je mega rychly a vse hned kladne vyridi, mohu pouze doporucit. Poradi si bez problemu i s rezervacnimi kalendaremi, udrzbou socialnich siti, atd.“

Barbara Mašková
Google