diff --git a/tests/Feature/CreateAccountOnFirstLoginFeatureTest.php b/tests/Feature/CreateAccountOnFirstLoginFeatureTest.php new file mode 100644 index 00000000..c88bbbf3 --- /dev/null +++ b/tests/Feature/CreateAccountOnFirstLoginFeatureTest.php @@ -0,0 +1,56 @@ +assertDatabaseEmpty('users'); + $this->assertDatabaseEmpty('connected_accounts'); + + $user = (new SocialiteUser()) + ->map([ + 'id' => $githubId = fake()->numerify('########'), + 'nickname' => 'joel', + 'name' => 'Joel', + 'email' => 'joel@socialstream.dev', + 'avatar' => null, + 'avatar_original' => null, + ]) + ->setToken('user-token') + ->setRefreshToken('refresh-token') + ->setExpiresIn(3600); + + $provider = Mockery::mock(GithubProvider::class); + $provider->shouldReceive('user')->once()->andReturn($user); + + session()->put('socialstream.previous_url', route('login')); + + Socialite::shouldReceive('driver')->once()->with('github')->andReturn($provider); + + get('http://localhost/oauth/github/callback') + ->assertRedirect(RouteServiceProvider::HOME); + + $this->assertAuthenticated(); + $this->assertDatabaseHas('users', ['email' => 'joel@socialstream.dev']); + $this->assertDatabaseHas('connected_accounts', [ + 'provider' => 'github', + 'provider_id' => $githubId, + 'email' => 'joel@socialstream.dev', + ]); +}); \ No newline at end of file diff --git a/tests/Feature/GenerateMissingEmailsFeatureTest.php b/tests/Feature/GenerateMissingEmailsFeatureTest.php new file mode 100644 index 00000000..df5f182d --- /dev/null +++ b/tests/Feature/GenerateMissingEmailsFeatureTest.php @@ -0,0 +1,55 @@ +map([ + 'id' => $githubId = fake()->numerify('########'), + 'nickname' => 'joel', + 'name' => 'Joel', + 'avatar' => null, + 'avatar_original' => null, + ]) + ->setToken('user-token') + ->setRefreshToken('refresh-token') + ->setExpiresIn(3600); + + $provider = Mockery::mock(GithubProvider::class); + $provider->shouldReceive('user')->once()->andReturn($user); + + Socialite::shouldReceive('driver')->once()->with('github')->andReturn($provider); + + session()->put('socialstream.previous_url', route('register')); + + get('http://localhost/oauth/github/callback') + ->assertRedirect(RouteServiceProvider::HOME); + + $user = User::first(); + + $this->assertAuthenticated(); + $this->assertEquals("$githubId@github", $user->email); + $this->assertDatabaseHas('connected_accounts', [ + 'provider' => 'github', + 'provider_id' => $githubId, + 'email' => $user->email, + ]); +}); diff --git a/tests/Feature/LoginOnRegistrationFeatureTest.php b/tests/Feature/LoginOnRegistrationFeatureTest.php new file mode 100644 index 00000000..0d0f51f4 --- /dev/null +++ b/tests/Feature/LoginOnRegistrationFeatureTest.php @@ -0,0 +1,63 @@ + 'Joel Butcher', + 'email' => 'joel@socialstream.dev', + 'password' => Hash::make('password'), + ]); + + $this->assertDatabaseHas('users', ['email' => 'joel@socialstream.dev']); + $this->assertDatabaseEmpty('connected_accounts'); + + $user = (new SocialiteUser()) + ->map([ + 'id' => $githubId = fake()->numerify('########'), + 'nickname' => 'joel', + 'name' => 'Joel', + 'email' => 'joel@socialstream.dev', + 'avatar' => null, + 'avatar_original' => null, + ]) + ->setToken('user-token') + ->setRefreshToken('refresh-token') + ->setExpiresIn(3600); + + $provider = Mockery::mock(GithubProvider::class); + $provider->shouldReceive('user')->once()->andReturn($user); + + Socialite::shouldReceive('driver')->once()->with('github')->andReturn($provider); + + session()->put('socialstream.previous_url', route('register')); + + get('http://localhost/oauth/github/callback') + ->assertRedirect(RouteServiceProvider::HOME); + + $this->assertAuthenticated(); + $this->assertDatabaseHas('connected_accounts', [ + 'provider' => 'github', + 'provider_id' => $githubId, + 'email' => 'joel@socialstream.dev', + ]); +}); \ No newline at end of file diff --git a/tests/Feature/SocialstreamTest.php b/tests/Feature/SocialstreamTest.php index 226c60df..1ac7626d 100644 --- a/tests/Feature/SocialstreamTest.php +++ b/tests/Feature/SocialstreamTest.php @@ -188,123 +188,3 @@ public function generate(string $provider): RedirectResponse 'email' => 'joel@socialstream.dev', ]); }); - -test('new users can register from login page', function (): void { - Config::set('socialstream.features', [ - Features::createAccountOnFirstLogin(), - ]); - - $this->assertDatabaseEmpty('users'); - $this->assertDatabaseEmpty('connected_accounts'); - - $user = (new SocialiteUser()) - ->map([ - 'id' => $githubId = fake()->numerify('########'), - 'nickname' => 'joel', - 'name' => 'Joel', - 'email' => 'joel@socialstream.dev', - 'avatar' => null, - 'avatar_original' => null, - ]) - ->setToken('user-token') - ->setRefreshToken('refresh-token') - ->setExpiresIn(3600); - - $provider = Mockery::mock(GithubProvider::class); - $provider->shouldReceive('user')->once()->andReturn($user); - - Socialite::shouldReceive('driver')->once()->with('github')->andReturn($provider); - - get('http://localhost/oauth/github/callback') - ->assertRedirect(RouteServiceProvider::HOME); - - $this->assertAuthenticated(); - $this->assertDatabaseHas('connected_accounts', [ - 'provider' => 'github', - 'provider_id' => $githubId, - 'email' => 'joel@socialstream.dev', - ]); -}); - -test('users can login on registration', function (): void { - Config::set('socialstream.features', [ - Features::loginOnRegistration(), - ]); - - User::create([ - 'name' => 'Joel Butcher', - 'email' => 'joel@socialstream.dev', - 'password' => Hash::make('password'), - ]); - - $this->assertDatabaseHas('users', ['email' => 'joel@socialstream.dev']); - $this->assertDatabaseEmpty('connected_accounts'); - - $user = (new SocialiteUser()) - ->map([ - 'id' => $githubId = fake()->numerify('########'), - 'nickname' => 'joel', - 'name' => 'Joel', - 'email' => 'joel@socialstream.dev', - 'avatar' => null, - 'avatar_original' => null, - ]) - ->setToken('user-token') - ->setRefreshToken('refresh-token') - ->setExpiresIn(3600); - - $provider = Mockery::mock(GithubProvider::class); - $provider->shouldReceive('user')->once()->andReturn($user); - - Socialite::shouldReceive('driver')->once()->with('github')->andReturn($provider); - - session()->put('socialstream.previous_url', route('register')); - - get('http://localhost/oauth/github/callback') - ->assertRedirect(RouteServiceProvider::HOME); - - $this->assertAuthenticated(); - $this->assertDatabaseHas('connected_accounts', [ - 'provider' => 'github', - 'provider_id' => $githubId, - 'email' => 'joel@socialstream.dev', - ]); -}); - -it('generates missing emails', function (): void { - Config::set('socialstream.features', [ - Features::generateMissingEmails(), - ]); - - $user = (new SocialiteUser()) - ->map([ - 'id' => $githubId = fake()->numerify('########'), - 'nickname' => 'joel', - 'name' => 'Joel', - 'avatar' => null, - 'avatar_original' => null, - ]) - ->setToken('user-token') - ->setRefreshToken('refresh-token') - ->setExpiresIn(3600); - - $provider = Mockery::mock(GithubProvider::class); - $provider->shouldReceive('user')->once()->andReturn($user); - - Socialite::shouldReceive('driver')->once()->with('github')->andReturn($provider); - - session()->put('socialstream.previous_url', route('register')); - - get('http://localhost/oauth/github/callback') - ->assertRedirect(RouteServiceProvider::HOME); - - $user = User::first(); - - $this->assertAuthenticated(); - $this->assertEquals("$githubId@github", $user->email); - $this->assertDatabaseHas('connected_accounts', [ - 'provider' => 'github', - 'provider_id' => $githubId, - 'email' => $user->email, - ]); -});