diff --git a/app/Http/Controllers/Auth/RegisteredUserController.php b/app/Http/Controllers/Auth/RegisteredUserController.php index 746b0704..85284ffb 100644 --- a/app/Http/Controllers/Auth/RegisteredUserController.php +++ b/app/Http/Controllers/Auth/RegisteredUserController.php @@ -6,6 +6,7 @@ use App\Enums\User\Setup; use App\Http\Controllers\Controller; +use App\Rules\Timezone; use App\Models\Language; use App\Models\User; use App\Models\Workspace; @@ -40,7 +41,7 @@ public function store(Request $request): RedirectResponse 'name' => ['required', 'string', 'max:255'], 'email' => ['required', 'string', 'lowercase', 'email', 'max:255', 'unique:'.User::class], 'password' => ['required', Rules\Password::defaults()], - 'timezone' => ['nullable', 'string', 'timezone'], + 'timezone' => ['nullable', 'string', new Timezone], ]); // Check if registering via invite link (redirect contains /invites/) diff --git a/app/Http/Requests/UpdateWorkspaceRequest.php b/app/Http/Requests/UpdateWorkspaceRequest.php index fd7b2ff8..a96bf0fb 100644 --- a/app/Http/Requests/UpdateWorkspaceRequest.php +++ b/app/Http/Requests/UpdateWorkspaceRequest.php @@ -2,6 +2,7 @@ namespace App\Http\Requests; +use App\Rules\Timezone; use Illuminate\Foundation\Http\FormRequest; class UpdateWorkspaceRequest extends FormRequest @@ -15,7 +16,7 @@ public function rules(): array { return [ 'name' => ['required', 'string', 'max:255'], - 'timezone' => ['required', 'string', 'timezone:all'], + 'timezone' => ['required', 'string', new Timezone], ]; } diff --git a/app/Rules/Timezone.php b/app/Rules/Timezone.php new file mode 100644 index 00000000..90301db0 --- /dev/null +++ b/app/Rules/Timezone.php @@ -0,0 +1,23 @@ +email_verified_at)->toBeNull(); }); +test('new users can register with deprecated timezone Asia/Calcutta', function () { + $this->post(route('register.store'), [ + 'name' => 'Test User', + 'email' => 'test@example.com', + 'password' => 'Password123!', + 'timezone' => 'Asia/Calcutta', + ]); + + $user = User::where('email', 'test@example.com')->first(); + + expect($user)->not->toBeNull(); + expect($user->workspaces->first()->timezone)->toBe('Asia/Calcutta'); +}); + +test('new users can register with deprecated timezone US/Eastern', function () { + $this->post(route('register.store'), [ + 'name' => 'Test User', + 'email' => 'test@example.com', + 'password' => 'Password123!', + 'timezone' => 'US/Eastern', + ]); + + $user = User::where('email', 'test@example.com')->first(); + + expect($user)->not->toBeNull(); + expect($user->workspaces->first()->timezone)->toBe('US/Eastern'); +}); + +test('new users cannot register with invalid timezone', function () { + $response = $this->post(route('register.store'), [ + 'name' => 'Test User', + 'email' => 'test@example.com', + 'password' => 'Password123!', + 'timezone' => 'Invalid/Timezone', + ]); + + $response->assertSessionHasErrors('timezone'); + expect(User::where('email', 'test@example.com')->exists())->toBeFalse(); +}); + test('new users registering via invite have verified email automatically', function () { $this->post(route('register.store'), [ 'name' => 'Test User', diff --git a/tests/Unit/Rules/TimezoneRuleTest.php b/tests/Unit/Rules/TimezoneRuleTest.php new file mode 100644 index 00000000..2440bb39 --- /dev/null +++ b/tests/Unit/Rules/TimezoneRuleTest.php @@ -0,0 +1,46 @@ + 'America/Sao_Paulo'], ['tz' => new Timezone]); + + expect($validator->passes())->toBeTrue(); +}); + +test('accepts UTC', function () { + $validator = Validator::make(['tz' => 'UTC'], ['tz' => new Timezone]); + + expect($validator->passes())->toBeTrue(); +}); + +test('accepts deprecated timezone Asia/Calcutta', function () { + $validator = Validator::make(['tz' => 'Asia/Calcutta'], ['tz' => new Timezone]); + + expect($validator->passes())->toBeTrue(); +}); + +test('accepts deprecated timezone US/Eastern', function () { + $validator = Validator::make(['tz' => 'US/Eastern'], ['tz' => new Timezone]); + + expect($validator->passes())->toBeTrue(); +}); + +test('rejects invalid timezone', function () { + $validator = Validator::make(['tz' => 'Invalid/Timezone'], ['tz' => new Timezone]); + + expect($validator->passes())->toBeFalse(); +}); + +test('rejects random string', function () { + $validator = Validator::make(['tz' => 'blabla'], ['tz' => new Timezone]); + + expect($validator->passes())->toBeFalse(); +}); + +test('accepts Europe/London', function () { + $validator = Validator::make(['tz' => 'Europe/London'], ['tz' => new Timezone]); + + expect($validator->passes())->toBeTrue(); +});