php-tenant/tests/Feature/SettingsTest.php
Snider d0ad2737cb refactor: rename namespace from Core\Mod\Tenant to Core\Tenant
Simplifies the namespace hierarchy by removing the intermediate Mod
segment. Updates all 118 files including models, services, controllers,
middleware, tests, and composer.json autoload configuration.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-27 16:30:46 +00:00

215 lines
6.4 KiB
PHP

<?php
namespace Core\Tenant\Tests\Feature;
use Core\Mod\Hub\View\Modal\Admin\Settings;
use Core\Mod\Social\Models\Setting;
use Core\Tenant\Models\User;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Facades\Hash;
use Livewire\Livewire;
use Tests\TestCase;
class SettingsTest extends TestCase
{
use RefreshDatabase;
protected function createUser(array $attributes = []): User
{
return User::factory()->create($attributes);
}
public function test_settings_page_is_accessible_when_authenticated(): void
{
$user = $this->createUser();
$response = $this->actingAs($user)->get('/hub/settings');
$response->assertStatus(200);
$response->assertSee('Account Settings');
}
public function test_settings_page_redirects_guests_to_login(): void
{
$response = $this->get('/hub/settings');
$response->assertRedirect('/login');
}
public function test_user_can_update_profile_information(): void
{
$user = $this->createUser([
'name' => 'Original Name',
'email' => 'original@example.com',
]);
Livewire::actingAs($user)
->test(Settings::class)
->set('name', 'Updated Name')
->set('email', 'updated@example.com')
->call('updateProfile')
->assertHasNoErrors();
$user->refresh();
$this->assertEquals('Updated Name', $user->name);
$this->assertEquals('updated@example.com', $user->email);
}
public function test_profile_update_validates_required_fields(): void
{
$user = $this->createUser();
Livewire::actingAs($user)
->test(Settings::class)
->set('name', '')
->set('email', '')
->call('updateProfile')
->assertHasErrors(['name', 'email']);
}
public function test_profile_update_validates_email_format(): void
{
$user = $this->createUser();
Livewire::actingAs($user)
->test(Settings::class)
->set('email', 'not-an-email')
->call('updateProfile')
->assertHasErrors(['email']);
}
public function test_profile_update_validates_unique_email(): void
{
$existingUser = $this->createUser(['email' => 'existing@example.com']);
$user = $this->createUser(['email' => 'test@example.com']);
Livewire::actingAs($user)
->test(Settings::class)
->set('email', 'existing@example.com')
->call('updateProfile')
->assertHasErrors(['email']);
}
public function test_user_can_keep_same_email(): void
{
$user = $this->createUser(['email' => 'same@example.com']);
Livewire::actingAs($user)
->test(Settings::class)
->set('name', 'New Name')
->set('email', 'same@example.com')
->call('updateProfile')
->assertHasNoErrors();
$user->refresh();
$this->assertEquals('same@example.com', $user->email);
}
public function test_user_can_update_password(): void
{
$user = $this->createUser([
'password' => Hash::make('current-password'),
]);
Livewire::actingAs($user)
->test(Settings::class)
->set('current_password', 'current-password')
->set('new_password', 'new-secure-password')
->set('new_password_confirmation', 'new-secure-password')
->call('updatePassword')
->assertHasNoErrors();
$user->refresh();
$this->assertTrue(Hash::check('new-secure-password', $user->password));
}
public function test_password_update_requires_current_password(): void
{
$user = $this->createUser([
'password' => Hash::make('current-password'),
]);
Livewire::actingAs($user)
->test(Settings::class)
->set('current_password', 'wrong-password')
->set('new_password', 'new-secure-password')
->set('new_password_confirmation', 'new-secure-password')
->call('updatePassword')
->assertHasErrors(['current_password']);
}
public function test_password_update_requires_confirmation(): void
{
$user = $this->createUser([
'password' => Hash::make('current-password'),
]);
Livewire::actingAs($user)
->test(Settings::class)
->set('current_password', 'current-password')
->set('new_password', 'new-secure-password')
->set('new_password_confirmation', 'different-password')
->call('updatePassword')
->assertHasErrors(['new_password']);
}
public function test_user_can_update_preferences(): void
{
$user = $this->createUser();
Livewire::actingAs($user)
->test(Settings::class)
->set('timezone', 'America/New_York')
->set('time_format', 24)
->set('week_starts_on', 0)
->call('updatePreferences')
->assertHasNoErrors();
// Verify settings were saved
$timezoneSetting = Setting::where('user_id', $user->id)
->where('name', 'timezone')
->first();
$this->assertEquals('America/New_York', $timezoneSetting->payload);
}
public function test_preferences_validates_timezone(): void
{
$user = $this->createUser();
Livewire::actingAs($user)
->test(Settings::class)
->set('timezone', 'Invalid/Timezone')
->call('updatePreferences')
->assertHasErrors(['timezone']);
}
public function test_settings_loads_existing_preferences(): void
{
$user = $this->createUser();
// Set some preferences
Setting::create([
'user_id' => $user->id,
'name' => 'timezone',
'payload' => 'Europe/London',
]);
$component = Livewire::actingAs($user)->test(Settings::class);
$this->assertEquals('Europe/London', $component->get('timezone'));
}
public function test_settings_shows_user_name_and_email(): void
{
$user = $this->createUser([
'name' => 'Test User',
'email' => 'test@example.com',
]);
$component = Livewire::actingAs($user)->test(Settings::class);
$this->assertEquals('Test User', $component->get('name'));
$this->assertEquals('test@example.com', $component->get('email'));
}
}