Skip to content

Commit

Permalink
Merge pull request #13 from daniel-de-wit/test/register
Browse files Browse the repository at this point in the history
Add tests for register mutation
  • Loading branch information
daniel-de-wit committed Apr 22, 2021
2 parents 61d5a8d + e41d7cb commit 92ecdd4
Show file tree
Hide file tree
Showing 4 changed files with 388 additions and 3 deletions.
28 changes: 25 additions & 3 deletions src/GraphQL/Mutations/Register.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@
use Illuminate\Auth\EloquentUserProvider;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Contracts\Config\Repository as Config;
use Illuminate\Contracts\Hashing\Hasher;
use Illuminate\Support\Arr;
use Laravel\Sanctum\Contracts\HasApiTokens;

class Register
Expand All @@ -21,15 +23,18 @@ class Register

protected AuthManager $authManager;
protected Config $config;
protected Hasher $hash;
protected EmailVerificationServiceInterface $emailVerificationService;

public function __construct(
AuthManager $authManager,
Config $config,
Hasher $hash,
EmailVerificationServiceInterface $emailVerificationService
) {
$this->authManager = $authManager;
$this->config = $config;
$this->hash = $hash;
$this->emailVerificationService = $emailVerificationService;
}

Expand All @@ -45,18 +50,18 @@ public function __invoke($_, array $args): array
$userProvider = $this->createUserProvider();

$user = $userProvider->createModel();
$user->fill($args);
$user->fill($this->getPropertiesFromArgs($args));
$user->save();

if ($user instanceof MustVerifyEmail) {
if ($args['verification_url']) {
if (isset($args['verification_url'])) {
$this->emailVerificationService->setVerificationUrl($args['verification_url']['url']);
}

$user->sendEmailVerificationNotification();

return [
'tokens' => [],
'token' => null,
'status' => RegisterStatus::MUST_VERIFY_EMAIL(),
];
}
Expand All @@ -71,6 +76,23 @@ public function __invoke($_, array $args): array
];
}

/**
* @param array<string, mixed> $args
* @return array<string, string>
*/
protected function getPropertiesFromArgs(array $args): array
{
$properties = Arr::except($args, [
'directive',
'password_confirmation',
'verification_url',
]);

$properties['password'] = $this->hash->make($properties['password']);

return $properties;
}

protected function getAuthManager(): AuthManager
{
return $this->authManager;
Expand Down
85 changes: 85 additions & 0 deletions tests/Integration/GraphQL/Mutations/RegisterTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
<?php

declare(strict_types=1);

namespace DanielDeWit\LighthouseSanctum\Tests\Integration\GraphQL\Mutations;

use DanielDeWit\LighthouseSanctum\Enums\RegisterStatus;
use DanielDeWit\LighthouseSanctum\Tests\Integration\AbstractIntegrationTest;
use DanielDeWit\LighthouseSanctum\Tests\stubs\Users\UserMustVerifyEmail;
use Illuminate\Auth\Notifications\VerifyEmail;
use Illuminate\Support\Facades\Notification;
use Illuminate\Testing\TestResponse;

class RegisterTest extends AbstractIntegrationTest
{
/**
* @test
*/
public function it_registers_a_user(): void
{
$response = $this->makeRequest()->assertJsonStructure([
'data' => [
'register' => [
'token',
'status',
],
],
]);

static::assertTrue(RegisterStatus::SUCCESS()->is($response->json('data.register.status')));

$this->assertDatabaseHas('users', [
'name' => 'Foo Bar',
'email' => 'foo@bar.com',
]);
}

/**
* @test
*/
public function it_sends_an_email_verification_notification(): void
{
Notification::fake();

$this->app['config']->set('auth.providers.users.model', UserMustVerifyEmail::class);

$response = $this->makeRequest()->assertJsonStructure([
'data' => [
'register' => [
'token',
'status',
],
],
]);

static::assertNull($response->json('data.register.token'));
static::assertTrue(RegisterStatus::MUST_VERIFY_EMAIL()->is($response->json('data.register.status')));

$this->assertDatabaseHas('users', [
'name' => 'Foo Bar',
'email' => 'foo@bar.com',
]);

$user = UserMustVerifyEmail::first();

Notification::assertSentTo($user, VerifyEmail::class);
}

protected function makeRequest(): TestResponse
{
return $this->graphQL(/** @lang GraphQL */'
mutation {
register(input: {
name: "Foo Bar",
email: "foo@bar.com",
password: "supersecret",
password_confirmation: "supersecret",
}) {
token
status
}
}
');
}
}
Loading

0 comments on commit 92ecdd4

Please sign in to comment.