mirror of
https://github.com/AnimeThemes/animethemes-server.git
synced 2026-10-14 14:50:44 +02:00
336 lines
8.8 KiB
PHP
336 lines
8.8 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace Tests\Feature\Http\Auth;
|
|
|
|
use App\Enums\Models\Auth\InvitationStatus;
|
|
use App\Models\Auth\Invitation;
|
|
use App\Models\Auth\User;
|
|
use Illuminate\Foundation\Testing\WithFaker;
|
|
use Illuminate\Support\Facades\URL;
|
|
use Tests\TestCase;
|
|
|
|
/**
|
|
* Class RegistrationTest.
|
|
*/
|
|
class RegistrationTest extends TestCase
|
|
{
|
|
use WithFaker;
|
|
|
|
/**
|
|
* If the show registration form request uses a closed invitation,
|
|
* the user shall receive a forbidden exception.
|
|
*
|
|
* @return void
|
|
*/
|
|
public function testHasClosedInvitationForRegistrationForm(): void
|
|
{
|
|
$invitation = Invitation::factory()->create([
|
|
Invitation::ATTRIBUTE_STATUS => InvitationStatus::CLOSED,
|
|
]);
|
|
|
|
$url = URL::temporarySignedRoute(
|
|
'register',
|
|
now()->addMinutes(30),
|
|
['invitation' => $invitation]
|
|
);
|
|
|
|
$response = $this->get($url);
|
|
|
|
$response->assertForbidden();
|
|
}
|
|
|
|
/**
|
|
* If the show registration form request uses a soft deleted invitation,
|
|
* the user shall receive a forbidden exception.
|
|
*
|
|
* @return void
|
|
*/
|
|
public function testHasSoftDeletedInvitationForRegistrationForm(): void
|
|
{
|
|
$invitation = Invitation::factory()->create();
|
|
|
|
$invitation->delete();
|
|
|
|
$url = URL::temporarySignedRoute(
|
|
'register',
|
|
now()->addMinutes(30),
|
|
['invitation' => $invitation]
|
|
);
|
|
|
|
$response = $this->get($url);
|
|
|
|
$response->assertForbidden();
|
|
}
|
|
|
|
/**
|
|
* If the show registration form request uses an open invitation,
|
|
* the application shall display the registration form.
|
|
*
|
|
* @return void
|
|
*/
|
|
public function testHasInvitationForRegistrationForm(): void
|
|
{
|
|
$invitation = Invitation::factory()->create();
|
|
|
|
$url = URL::temporarySignedRoute(
|
|
'register',
|
|
now()->addMinutes(30),
|
|
['invitation' => $invitation]
|
|
);
|
|
|
|
$response = $this->get($url);
|
|
|
|
$response->assertViewIs('auth.register');
|
|
}
|
|
|
|
/**
|
|
* If the registration request uses a closed invitation,
|
|
* the user shall receive a forbidden exception.
|
|
*
|
|
* @return void
|
|
*/
|
|
public function testHasClosedInvitationForRegistration(): void
|
|
{
|
|
$invitation = Invitation::factory()->create([
|
|
Invitation::ATTRIBUTE_STATUS => InvitationStatus::CLOSED,
|
|
]);
|
|
|
|
$url = URL::temporarySignedRoute(
|
|
'register',
|
|
now()->addMinutes(30),
|
|
['invitation' => $invitation]
|
|
);
|
|
|
|
$response = $this->post($url);
|
|
|
|
$response->assertForbidden();
|
|
}
|
|
|
|
/**
|
|
* If the registration request uses an open invitation,
|
|
* the application shall process the validation.
|
|
*
|
|
* @return void
|
|
*/
|
|
public function testHasInvitationForRegistration(): void
|
|
{
|
|
$invitation = Invitation::factory()->create();
|
|
|
|
$url = URL::temporarySignedRoute(
|
|
'register',
|
|
now()->addMinutes(30),
|
|
['invitation' => $invitation]
|
|
);
|
|
|
|
$response = $this->post($url);
|
|
|
|
$response->assertInvalid(['password']);
|
|
}
|
|
|
|
/**
|
|
* The password field shall be required for the registration request.
|
|
*
|
|
* @return void
|
|
*/
|
|
public function testPasswordRequiredValidationForRegistration(): void
|
|
{
|
|
$invitation = Invitation::factory()->create();
|
|
|
|
$url = URL::temporarySignedRoute(
|
|
'register',
|
|
now()->addMinutes(30),
|
|
['invitation' => $invitation]
|
|
);
|
|
|
|
$response = $this->post($url);
|
|
|
|
$response->assertInvalid(['password' => 'The password field is required.']);
|
|
}
|
|
|
|
/**
|
|
* The password field shall be at least 8 characters in length for the registration request.
|
|
*
|
|
* @return void
|
|
*/
|
|
public function testPasswordLengthValidationForRegistration(): void
|
|
{
|
|
$invitation = Invitation::factory()->create();
|
|
|
|
$url = URL::temporarySignedRoute(
|
|
'register',
|
|
now()->addMinutes(30),
|
|
['invitation' => $invitation, 'password' => $this->faker->password(6, 7)]
|
|
);
|
|
|
|
$response = $this->post($url);
|
|
|
|
$response->assertInvalid(['password' => 'The password must be at least 8 characters.']);
|
|
}
|
|
|
|
/**
|
|
* The password field shall be confirmed for the registration request.
|
|
*
|
|
* @return void
|
|
*/
|
|
public function testPasswordConfirmationValidationForRegistration(): void
|
|
{
|
|
$invitation = Invitation::factory()->create();
|
|
|
|
$url = URL::temporarySignedRoute(
|
|
'register',
|
|
now()->addMinutes(30),
|
|
[
|
|
'invitation' => $invitation,
|
|
'password' => $this->faker->password(6, 7),
|
|
'password_confirmation' => $this->faker->password(8, 9),
|
|
'terms' => 'terms',
|
|
]
|
|
);
|
|
|
|
$response = $this->post($url);
|
|
|
|
$response->assertInvalid(['password' => 'The password confirmation does not match.']);
|
|
}
|
|
|
|
/**
|
|
* The password field shall be scored at least a 3 by ZXCVBN for the registration request.
|
|
*
|
|
* @return void
|
|
*/
|
|
public function testPasswordStrengthValidationForRegistration(): void
|
|
{
|
|
$invitation = Invitation::factory()->create();
|
|
|
|
$weakPassword = $this->faker->password(8, 8);
|
|
|
|
$url = URL::temporarySignedRoute(
|
|
'register',
|
|
now()->addMinutes(30),
|
|
[
|
|
'invitation' => $invitation,
|
|
'password' => $weakPassword,
|
|
'password_confirmation' => $weakPassword,
|
|
'terms' => 'terms',
|
|
]
|
|
);
|
|
|
|
$response = $this->post($url);
|
|
|
|
$response->assertInvalid(['password' => 'The password is not strong enough.']);
|
|
}
|
|
|
|
/**
|
|
* The terms field shall be required.
|
|
*
|
|
* @return void
|
|
*/
|
|
public function testTermAcceptanceRequiredForRegistration(): void
|
|
{
|
|
$invitation = Invitation::factory()->create();
|
|
|
|
$strongPassword = $this->faker->password(64, 128);
|
|
|
|
$url = URL::temporarySignedRoute(
|
|
'register',
|
|
now()->addMinutes(30),
|
|
[
|
|
'invitation' => $invitation,
|
|
'password' => $strongPassword,
|
|
'password_confirmation' => $strongPassword,
|
|
]
|
|
);
|
|
|
|
$response = $this->post($url);
|
|
|
|
$response->assertInvalid(['terms' => 'The terms field is required.']);
|
|
}
|
|
|
|
/**
|
|
* When the registration request is valid, the user shall be directed to the dashboard.
|
|
*
|
|
* @return void
|
|
*/
|
|
public function testRedirectToDashboardForValidRegistration(): void
|
|
{
|
|
$invitation = Invitation::factory()->create();
|
|
|
|
$strongPassword = $this->faker->password(64, 128);
|
|
|
|
$url = URL::temporarySignedRoute(
|
|
'register',
|
|
now()->addMinutes(30),
|
|
[
|
|
'invitation' => $invitation,
|
|
'password' => $strongPassword,
|
|
'password_confirmation' => $strongPassword,
|
|
'terms' => 'terms',
|
|
]
|
|
);
|
|
|
|
$response = $this->post($url);
|
|
|
|
$response->assertRedirect(route('dashboard'));
|
|
}
|
|
|
|
/**
|
|
* When the registration request is valid, the user shall be created.
|
|
*
|
|
* @return void
|
|
*/
|
|
public function testUserCreatedForValidRegistration(): void
|
|
{
|
|
$invitation = Invitation::factory()->createOne();
|
|
|
|
$strongPassword = $this->faker->password(64, 128);
|
|
|
|
$url = URL::temporarySignedRoute(
|
|
'register',
|
|
now()->addMinutes(30),
|
|
[
|
|
'invitation' => $invitation,
|
|
'password' => $strongPassword,
|
|
'password_confirmation' => $strongPassword,
|
|
'terms' => 'terms',
|
|
]
|
|
);
|
|
|
|
$this->post($url);
|
|
|
|
$user = User::query()
|
|
->where(Invitation::ATTRIBUTE_NAME, $invitation->name)
|
|
->where(Invitation::ATTRIBUTE_EMAIL, $invitation->email)
|
|
->first();
|
|
|
|
static::assertNotNull($user);
|
|
}
|
|
|
|
/**
|
|
* When the registration request is valid, the guest shall be authenticated as the newly created user.
|
|
*
|
|
* @return void
|
|
*/
|
|
public function testUserAuthenticatedForValidRegistration(): void
|
|
{
|
|
$invitation = Invitation::factory()->createOne();
|
|
|
|
$strongPassword = $this->faker->password(64, 128);
|
|
|
|
$url = URL::temporarySignedRoute(
|
|
'register',
|
|
now()->addMinutes(30),
|
|
[
|
|
'invitation' => $invitation,
|
|
'password' => $strongPassword,
|
|
'password_confirmation' => $strongPassword,
|
|
'terms' => 'terms',
|
|
]
|
|
);
|
|
|
|
$this->post($url);
|
|
|
|
$this->assertAuthenticated();
|
|
}
|
|
}
|