123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266 |
- <?php
- namespace Tests\Feature\Http\Auth;
- use App\Facades\Settings;
- use App\Http\Controllers\Auth\RegisterController;
- use App\Http\Requests\UserStoreRequest;
- use App\Models\User;
- use Illuminate\Support\Facades\DB;
- use PHPUnit\Framework\Attributes\CoversClass;
- use Tests\FeatureTestCase;
- /**
- * RegisterControllerTest test class
- */
- #[CoversClass(RegisterController::class)]
- #[CoversClass(UserStoreRequest::class)]
- class RegisterControllerTest extends FeatureTestCase
- {
- private const USERNAME = 'john doe';
- private const EMAIL = 'johndoe@example.org';
- private const EMAIL_NOT_IN_FILTERING_LIST = 'jane@example.org';
- private const EMAIL_EXCLUDED_BY_FILTERING_RULE = 'johndoe@anywhere.org';
- private const PASSWORD = 'password';
- private const EMAIL_FILTERING_LIST = 'johndoe@example.org|johndoe@test.org|johndoe@anywhere.org';
- private const EMAIL_FILTERING_RULE = '^[A-Za-z0-9._%+-]+@example\.org';
- /**
- * @test
- */
- public function setUp() : void
- {
- parent::setUp();
- }
- /**
- * @test
- */
- public function test_register_returns_success()
- {
- DB::table('users')->delete();
- $response = $this->json('POST', '/user', [
- 'name' => self::USERNAME,
- 'email' => self::EMAIL,
- 'password' => self::PASSWORD,
- 'password_confirmation' => self::PASSWORD,
- ])
- ->assertCreated()
- ->assertJsonStructure([
- 'message',
- 'name',
- ])
- ->assertJsonFragment([
- 'name' => self::USERNAME,
- ]);
- $this->assertDatabaseHas('users', [
- 'name' => self::USERNAME,
- 'email' => self::EMAIL,
- ]);
- }
- /**
- * @test
- */
- public function test_register_with_uppercased_email_returns_success()
- {
- DB::table('users')->delete();
- $response = $this->json('POST', '/user', [
- 'name' => self::USERNAME,
- 'email' => strtoupper(self::EMAIL),
- 'password' => self::PASSWORD,
- 'password_confirmation' => self::PASSWORD,
- ])
- ->assertCreated()
- ->assertJsonStructure([
- 'message',
- 'name',
- ])
- ->assertJsonFragment([
- 'name' => self::USERNAME,
- ]);
- $this->assertDatabaseHas('users', [
- 'name' => self::USERNAME,
- 'email' => self::EMAIL,
- ]);
- }
- /**
- * @test
- */
- public function test_register_with_invalid_data_returns_validation_error()
- {
- $response = $this->json('POST', '/user', [
- 'name' => null,
- 'email' => self::EMAIL,
- 'password' => self::PASSWORD,
- 'password_confirmation' => self::PASSWORD,
- ])
- ->assertStatus(422);
- }
- /**
- * @test
- */
- public function test_register_first_user_only_as_admin()
- {
- $this->assertDatabaseCount('users', 0);
- $response = $this->json('POST', '/user', [
- 'name' => self::USERNAME,
- 'email' => self::EMAIL,
- 'password' => self::PASSWORD,
- 'password_confirmation' => self::PASSWORD,
- ]);
- $this->assertDatabaseCount('users', 1);
- $this->assertDatabaseHas('users', [
- 'name' => self::USERNAME,
- 'email' => self::EMAIL,
- 'is_admin' => true,
- ]);
- $response = $this->json('POST', '/user', [
- 'name' => 'jane',
- 'email' => 'jane@example.org',
- 'password' => self::PASSWORD,
- 'password_confirmation' => self::PASSWORD,
- ]);
- $this->assertEquals(1, User::admins()->count());
- }
- /**
- * @test
- */
- public function test_register_is_forbidden_when_registration_is_disabled()
- {
- Settings::set('disableRegistration', true);
- $this->json('POST', '/user', [
- 'name' => self::USERNAME,
- 'email' => self::EMAIL,
- 'password' => self::PASSWORD,
- 'password_confirmation' => self::PASSWORD,
- ])
- ->assertStatus(403);
- }
- /**
- * @test
- */
- public function test_register_succeeds_when_email_is_in_restricted_list()
- {
- Settings::set('restrictRegistration', true);
- Settings::set('restrictList', self::EMAIL_FILTERING_LIST);
- Settings::set('restrictRule', '');
- $this->json('POST', '/user', [
- 'name' => self::USERNAME,
- 'email' => self::EMAIL,
- 'password' => self::PASSWORD,
- 'password_confirmation' => self::PASSWORD,
- ])
- ->assertStatus(201);
- }
- /**
- * @test
- */
- public function test_register_fails_when_email_is_not_in_restricted_list()
- {
- Settings::set('restrictRegistration', true);
- Settings::set('restrictList', self::EMAIL_FILTERING_LIST);
- Settings::set('restrictRule', '');
- $this->json('POST', '/user', [
- 'name' => self::USERNAME,
- 'email' => self::EMAIL_NOT_IN_FILTERING_LIST,
- 'password' => self::PASSWORD,
- 'password_confirmation' => self::PASSWORD,
- ])
- ->assertStatus(422);
- }
- /**
- * @test
- */
- public function test_register_succeeds_when_email_matchs_filtering_rule()
- {
- Settings::set('restrictRegistration', true);
- Settings::set('restrictList', '');
- Settings::set('restrictRule', self::EMAIL_FILTERING_RULE);
- $this->json('POST', '/user', [
- 'name' => self::USERNAME,
- 'email' => self::EMAIL,
- 'password' => self::PASSWORD,
- 'password_confirmation' => self::PASSWORD,
- ])
- ->assertStatus(201);
- }
- /**
- * @test
- */
- public function test_register_fails_when_email_does_not_match_filtering_rule()
- {
- Settings::set('restrictRegistration', true);
- Settings::set('restrictList', '');
- Settings::set('restrictRule', self::EMAIL_FILTERING_RULE);
- $this->json('POST', '/user', [
- 'name' => self::USERNAME,
- 'email' => self::EMAIL_EXCLUDED_BY_FILTERING_RULE,
- 'password' => self::PASSWORD,
- 'password_confirmation' => self::PASSWORD,
- ])
- ->assertStatus(422);
- }
- /**
- * @test
- */
- public function test_register_succeeds_when_email_is_allowed_by_list_over_regex()
- {
- Settings::set('restrictRegistration', true);
- Settings::set('restrictList', self::EMAIL_FILTERING_LIST);
- Settings::set('restrictRule', self::EMAIL_FILTERING_RULE);
- $this->json('POST', '/user', [
- 'name' => self::USERNAME,
- 'email' => self::EMAIL_EXCLUDED_BY_FILTERING_RULE,
- 'password' => self::PASSWORD,
- 'password_confirmation' => self::PASSWORD,
- ])
- ->assertStatus(201);
- }
- /**
- * @test
- */
- public function test_register_succeeds_when_email_is_allowed_by_regex_over_list()
- {
- Settings::set('restrictRegistration', true);
- Settings::set('restrictList', self::EMAIL_FILTERING_LIST);
- Settings::set('restrictRule', self::EMAIL_FILTERING_RULE);
- $this->json('POST', '/user', [
- 'name' => self::USERNAME,
- 'email' => self::EMAIL_NOT_IN_FILTERING_LIST,
- 'password' => self::PASSWORD,
- 'password_confirmation' => self::PASSWORD,
- ])
- ->assertStatus(201);
- }
- }
|